SHARE
TWEET

Untitled

a guest Feb 16th, 2018 110 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. note
  2.     description: "A default business model."
  3.     author: "Jackie Wang"
  4.     date: "$Date$"
  5.     revision: "$Revision$"
  6.  
  7. class
  8.     ETF_MODEL
  9.  
  10. inherit
  11.     ANY
  12.         redefine
  13.             out
  14.         end
  15.  
  16. create {ETF_MODEL_ACCESS}
  17.     make
  18.  
  19. feature {NONE} -- Initialization
  20.     make
  21.         do
  22.             create s.make_empty
  23.             i := 0
  24.             create {SORTED_TWO_WAY_LIST [ETF_PERSON]} persons.make
  25.             create person.make(1000)
  26.             model_error_status := "EMPTY"
  27.         end
  28.  
  29. feature -- model attributes
  30.     s : STRING
  31.     i : INTEGER
  32.  
  33.     persons : LIST[ETF_PERSON]
  34.     person : HASH_TABLE[ETF_PERSON, INTEGER]
  35.  
  36.     model_error_status : STRING assign update_model_error
  37.  
  38. feature -- model operations
  39.  
  40.     update_model_error (error_msg : STRING)
  41.         do
  42.             model_error_status := error_msg
  43.         end
  44.  
  45.     put (id: INTEGER_64; name: STRING; dob: TUPLE[d: INTEGER_64; m: INTEGER_64; y: INTEGER_64])
  46.         require
  47.  
  48.             id_is_positive: id > 0
  49.             id_is_not_taken: id_invalid (id) = false
  50.             valid_name_start: char_start_proper (name)
  51.             valid_date: date_is_valid (dob)
  52.         local
  53.             new_person : ETF_PERSON
  54.         do
  55.             create new_person.make(id, name, dob, "Canada")
  56.  
  57.             persons.extend (new_person)
  58.             person.put (new_person, new_person.person_id)
  59.         end
  60.  
  61.     put_alien (id: INTEGER_64; name: STRING; dob: TUPLE[d: INTEGER_64; m: INTEGER_64; y: INTEGER_64]; country: STRING)
  62.  
  63.         require
  64.             id_positive: id > 0
  65.             id_is_not_taken: id_invalid (id) = false
  66.             valid_name_start: char_start_proper (name)
  67.             valid_date: date_is_valid (dob)
  68.             valid_country_start: char_start_proper (country)
  69.         local
  70.             new_person: ETF_PERSON
  71.         do
  72.             create new_person.make (id, name, dob, country)
  73.             persons.extend (new_person)
  74.             person.put (new_person, new_person.person_id)
  75.         end
  76.  
  77.     marry (id1: INTEGER_64 ; id2: INTEGER_64 ; date: TUPLE[d: INTEGER_64; m: INTEGER_64; y: INTEGER_64])
  78.         require
  79.             ids_are_different : (id1 ~ id2) = false
  80.             ids_are_greate_than_zero : id1 > 0 and id2 > 0
  81.             ids_are_unused : (id_invalid (id1) or id_invalid (id2)) = true
  82.             is_valid_marriage : marriage_valid (id1, id2, date)
  83.         do
  84.             if attached person.at (id1.as_integer_32) as person_one then
  85.                 if attached person.at (id2.as_integer_32) as person_two then
  86.                     person_one.person_spouse := person_two.person_id
  87.                     person_two.person_spouse := person_one.person_id
  88.                     person_one.person_status := "Married"
  89.                     person_two.person_status := "Married"
  90.                     person_one.set_date_of_marriage(date)
  91.                     person_two.set_date_of_marriage (date)
  92.                 end
  93.             end
  94.         end
  95.  
  96.     divorce (id1: INTEGER_64 ;id2: INTEGER_64)
  97.         require
  98.             ids_are_different : (id1 ~ id2) = false
  99.             ids_are_greate_than_zero : id1 > 0 and id2 > 0
  100.             ids_are_unused : (id_invalid (id1) or id_invalid (id2)) = true
  101.             is_valid_divorce : divorce_valid (id1, id2)
  102.         do
  103.             if attached person.at (id1.as_integer_32) as person_one then
  104.                 if attached person.at (id2.as_integer_32) as person_two then
  105.                     person_one.person_spouse := person_one.person_id
  106.                     person_two.person_spouse := person_two.person_id
  107.                     person_one.person_status := "Single"
  108.                     person_two.person_status := "Single"
  109.                 end
  110.             end
  111.         end
  112.  
  113.     die (id: INTEGER_64)
  114.         require
  115.             id_is_greater_than_zero: id > 0
  116.             id_is_unused: id_invalid (id) = true
  117.             not_dead_already: is_dead (id) = false
  118.         do
  119.             if attached person.at (id.as_integer_32) as person_obj then
  120.                 if (person_obj.person_status ~ "Married") then
  121.                     if attached person.at (person_obj.person_spouse) as obj_spouse then
  122.                     obj_spouse.person_status := "Single"
  123.                     obj_spouse.person_spouse := obj_spouse.person_id
  124.                     end
  125.                 end
  126.                 person_obj.person_spouse := person_obj.person_id
  127.                 person_obj.person_status := "Deceased"
  128.             end
  129.         end
  130.  
  131.     default_update
  132.         do
  133.             i := i + 1
  134.         end
  135.  
  136.     reset
  137.         do
  138.             make
  139.         end
  140.  
  141.     id_invalid (new_id : INTEGER_64) : BOOLEAN
  142.         do
  143.             Result := false
  144.             from persons.start
  145.             until persons.after or Result
  146.             loop
  147.                 if persons[persons.index].person_id ~ new_id then
  148.                     Result := true
  149.                 end
  150.                 persons.forth
  151.             end
  152.         end
  153.  
  154.     char_start_proper (test_name : STRING) : BOOLEAN
  155.         do
  156.             Result := false
  157.             if (test_name ~ "%U") then
  158.                 Result := false
  159.             elseif (test_name.is_empty) then
  160.                 Result := false
  161.             elseif ((test_name[1] >= 'A' and test_name[1] <= 'Z') or (test_name[1] >= 'a' and test_name[1] <= 'z')) then
  162.                 Result := true
  163.             end
  164.         end
  165.  
  166.     date_is_valid (test_date : TUPLE[d : INTEGER_64; m : INTEGER_64; y : INTEGER_64]) : BOOLEAN
  167.         do
  168.             Result := false
  169.             if (test_date.y >= 1900 and test_date.y <= 3000) then
  170.                 if (test_date.m ~ 1 or test_date.m ~ 3 or test_date.m ~ 5 or test_date.m ~ 7 or test_date.m ~ 8 or test_date.m ~ 10 or test_date.m ~ 12) then
  171.                     if (test_date.d >= 1 and test_date.d <= 31) then
  172.                         Result := true
  173.                     end
  174.                 elseif (test_date.m ~ 2) then
  175.                     if (is_leap_year (test_date.y)) then
  176.                         if (test_date.d >= 1 and test_date.d <= 29) then
  177.                             Result := true
  178.                         end
  179.                     elseif (test_date.d >= 1 and test_date.d <= 28) then
  180.                             Result := true
  181.                     end
  182.                 elseif (test_date.m ~ 4 or test_date.m ~ 6 or test_date.m ~ 9 or test_date.m ~ 11) then
  183.                     if (test_date.d >= 1 and test_date.d <= 30) then
  184.                         Result := true
  185.                     end
  186.                 end
  187.             end
  188.         end
  189.  
  190.     is_leap_year (test_year : INTEGER_64) : BOOLEAN
  191.         do
  192.             Result := false
  193.             if ((test_year \\ 4 ~ 0) and (test_year \\ 100 /= 0) or (test_year \\ 400 ~ 0)) then
  194.                 Result := true
  195.             end
  196.         end
  197.  
  198.     is_dead (id : INTEGER_64): BOOLEAN
  199.         require
  200.             --
  201.         do
  202.             Result := true
  203.             if attached person.at (id.as_integer_32) as person_dead then
  204.                 if ((person_dead.person_status ~ "Single") or (person_dead.person_status ~ "Married")) then
  205.                     Result := false
  206.                 end
  207.             end
  208.         end
  209.  
  210.     marriage_valid (id1: INTEGER_64 ; id2: INTEGER_64; date: TUPLE[d: INTEGER_64; m: INTEGER_64; y: INTEGER_64]) : BOOLEAN
  211.         require
  212.         local
  213.             at_least_18 : BOOLEAN
  214.             not_married : BOOLEAN
  215.             spouse_list_themselves : BOOLEAN
  216.             dob1_18 : DATE
  217.             dob2_18 : DATE
  218.             day_of_marriage : DATE
  219.         do
  220.             Result := false
  221.             if attached person.at (id1.as_integer_32) as person_one then
  222.                 if attached person.at (id2.as_integer_32) as person_two then
  223.                     create dob1_18.make (person_one.person_dob.y.as_integer_32 + 18, person_one.person_dob.m.as_integer_32, person_one.person_dob.d.as_integer_32)
  224.                     create dob2_18.make (person_two.person_dob.y.as_integer_32 + 18, person_two.person_dob.m.as_integer_32, person_two.person_dob.d.as_integer_32)
  225.                     create day_of_marriage.make (date.y.as_integer_32, date.m.as_integer_32, date.d.as_integer_32)
  226.                     if ((day_of_marriage >= dob1_18) and (day_of_marriage >= dob2_18)) then
  227.                         at_least_18 := true
  228.                     end
  229.                     if ((person_one.person_status ~ "Single") and (person_two.person_status ~ "Single")) then
  230.                         not_married := true
  231.                     end
  232.                     if ((person_one.person_spouse ~ person_one.person_id) and (person_two.person_spouse ~ person_two.person_id)) then
  233.                         spouse_list_themselves := true
  234.                     end
  235.                     if (at_least_18 and not_married and spouse_list_themselves) then
  236.                         Result := true
  237.                     end
  238.                 end
  239.             end
  240.         end
  241.  
  242.     divorce_valid (id1: INTEGER_64 ; id2: INTEGER_64) : BOOLEAN
  243.         require
  244.         local
  245.             married : BOOLEAN
  246.             spouse_list_other : BOOLEAN
  247.         do
  248.             Result := false
  249.             if attached person.at (id1.as_integer_32) as person_one then
  250.                 if attached person.at (id2.as_integer_32) as person_two then
  251.                     if ((person_one.person_status ~ "Married") and (person_two.person_status ~ "Married")) then
  252.                         married := true
  253.                     end
  254.                     if ((person_one.person_spouse ~ person_two.person_id) and (person_two.person_spouse ~ person_one.person_id)) then
  255.                         spouse_list_other := true
  256.                     end
  257.                     if (married and spouse_list_other) then
  258.                         Result := true
  259.                     end
  260.                 end
  261.             end
  262.         end
  263.  
  264. feature -- queries
  265.     out : STRING
  266.         do
  267.             create Result.make_from_string ("")
  268.  
  269.             if (model_error_status ~ "EMPTY") then
  270.                 Result.append("  ok%N")
  271.             end
  272.  
  273.             if not (model_error_status ~ "EMPTY") then
  274.                 Result.append("  " + model_error_status + "%N")
  275.                 model_error_status := "EMPTY"
  276.             end
  277.  
  278.             from persons.start
  279.             until persons.after
  280.             loop
  281.  
  282.                 Result.append("  " + persons[persons.index].person_name + "; ID: " + persons[persons.index].person_id.out + "; Born: ")
  283.                 Result.append(persons[persons.index].person_dob.y.out + "-")
  284.                 if (persons[persons.index].person_dob.m < 10) then
  285.                     Result.append("0")
  286.                 end
  287.                 Result.append(persons[persons.index].person_dob.m.out + "-")
  288.                 if (persons[persons.index].person_dob.d < 10) then
  289.                     Result.append("0")
  290.                 end
  291.                 Result.append(persons[persons.index].person_dob.d.out + "; ")
  292.                 Result.append("Citizen: " + persons[persons.index].person_country + "; ")
  293.                 if (persons[persons.index].person_status ~ "Single") then
  294.                     Result.append("Single%N")
  295.                 elseif (persons[persons.index].person_status ~ "Deceased") then
  296.                     Result.append("Deceased%N")
  297.                 elseif (persons[persons.index].person_status ~ "Married") then
  298.                     if attached person.at (persons[persons.index].person_spouse.as_integer_32) as spouse then
  299.                         Result.append("Spouse: " + spouse.person_name + "," + spouse.person_id.out + ",[" + spouse.person_date_of_marriage.y.out + "-")
  300.                         if (spouse.person_date_of_marriage.m < 10) then
  301.                             Result.append("0")
  302.                         end
  303.                         Result.append(spouse.person_date_of_marriage.m.out + "-")
  304.                         if (spouse.person_date_of_marriage.d < 10) then
  305.                             Result.append("0")
  306.                         end
  307.                         Result.append(spouse.person_date_of_marriage.d.out + "]%N")
  308.                     end
  309.                 end
  310.                 persons.forth
  311.             end
  312.  
  313.         end
  314.  
  315. end
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top