Guest User

Untitled

a guest
Feb 16th, 2018
118
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