Automatic generation produced by ISE Eiffel

ClassesClustersCluster hierarchyChartRelationsTextFlatContractsFlat contracts
indexing description: "read the website configuration file, initialize handler-mapping, actual session class name and expiration time information." author: "Peizhu Li, <lip@student.ethz.ch>" date: "20.12.2008" revision: "$0.6$" class CONFIG_READER create make feature {NONE} -- Initialization default_create -- Process instances of classes with no creation clause. -- (Default: do nothing.) -- (from ANY) do end feature -- Access generating_type: STRING_8 -- Name of current object's generating type -- (type of which it is a direct instance) -- (from ANY) external "built_in" ensure -- from ANY generating_type_not_void: Result /= Void generating_type_not_empty: not Result.is_empty end generator: STRING_8 -- Name of current object's generating class -- (base class of the type of which it is a direct instance) -- (from ANY) external "built_in" ensure -- from ANY generator_not_void: Result /= Void generator_not_empty: not Result.is_empty end feature -- Comparison frozen deep_equal (some: ANY; other: like arg #1): BOOLEAN -- Are `some' and `other' either both void -- or attached to isomorphic object structures? -- (from ANY) do if some = Void then Result := other = Void else Result := other /= Void and then some.is_deep_equal (other) end ensure -- from ANY shallow_implies_deep: standard_equal (some, other) implies Result both_or_none_void: (some = Void) implies (Result = (other = Void)) same_type: (Result and (some /= Void)) implies some.same_type (other) symmetric: Result implies deep_equal (other, some) end frozen equal (some: ANY; other: like arg #1): BOOLEAN -- Are `some' and `other' either both void or attached -- to objects considered equal? -- (from ANY) do if some = Void then Result := other = Void else Result := other /= Void and then some.is_equal (other) end ensure -- from ANY definition: Result = (some = Void and other = Void) or else ((some /= Void and other /= Void) and then some.is_equal (other)) end frozen is_deep_equal (other: like Current): BOOLEAN -- Are `Current' and `other' attached to isomorphic object structures? -- (from ANY) require -- from ANY other_not_void: other /= Void external "built_in" ensure -- from ANY shallow_implies_deep: standard_is_equal (other) implies Result same_type: Result implies same_type (other) symmetric: Result implies other.is_deep_equal (Current) end is_equal (other: like Current): BOOLEAN -- Is `other' attached to an object considered -- equal to current object? -- (from ANY) require -- from ANY other_not_void: other /= Void do Result := standard_is_equal (other) ensure -- from ANY symmetric: Result implies other.is_equal (Current) consistent: standard_is_equal (other) implies Result end frozen standard_equal (some: ANY; other: like arg #1): BOOLEAN -- Are `some' and `other' either both void or attached to -- field-by-field identical objects of the same type? -- Always uses default object comparison criterion. -- (from ANY) do if some = Void then Result := other = Void else Result := other /= Void and then some.standard_is_equal (other) end ensure -- from ANY definition: Result = (some = Void and other = Void) or else ((some /= Void and other /= Void) and then some.standard_is_equal (other)) end frozen standard_is_equal (other: like Current): BOOLEAN -- Is `other' attached to an object of the same type -- as current object, and field-by-field identical to it? -- (from ANY) require -- from ANY other_not_void: other /= Void external "built_in" ensure -- from ANY same_type: Result implies same_type (other) symmetric: Result implies other.standard_is_equal (Current) end feature -- Status report conforms_to (other: ANY): BOOLEAN -- Does type of current object conform to type -- of `other' (as per Eiffel: The Language, chapter 13)? -- (from ANY) require -- from ANY other_not_void: other /= Void external "built_in" end same_type (other: ANY): BOOLEAN -- Is type of current object identical to type of `other'? -- (from ANY) require -- from ANY other_not_void: other /= Void external "built_in" ensure -- from ANY definition: Result = (conforms_to (other) and other.conforms_to (Current)) end feature -- Duplication frozen clone (other: ANY): like other obsolete "Use `twin' instead." -- Void if `other' is void; otherwise new object -- equal to `other' -- -- For non-void `other', clone calls copy; -- to change copying/cloning semantics, redefine copy. -- (from ANY) do if other /= Void then Result := other.twin end ensure -- from ANY equal: equal (Result, other) end copy (other: like Current) -- Update current object using fields of object attached -- to `other', so as to yield equal objects. -- (from ANY) require -- from ANY other_not_void: other /= Void type_identity: same_type (other) external "built_in" ensure -- from ANY is_equal: is_equal (other) end frozen deep_clone (other: ANY): like other obsolete "Use `deep_twin' instead." -- Void if `other' is void: otherwise, new object structure -- recursively duplicated from the one attached to `other' -- (from ANY) do if other /= Void then Result := other.deep_twin end ensure -- from ANY deep_equal: deep_equal (other, Result) end frozen deep_copy (other: like Current) -- Effect equivalent to that of: -- copy (`other' . deep_twin) -- (from ANY) require -- from ANY other_not_void: other /= Void do copy (other.deep_twin) ensure -- from ANY deep_equal: deep_equal (Current, other) end frozen deep_twin: like Current -- New object structure recursively duplicated from Current. -- (from ANY) external "built_in" ensure -- from ANY deep_twin_not_void: Result /= Void deep_equal: deep_equal (Current, Result) end frozen standard_clone (other: ANY): like other obsolete "Use `standard_twin' instead." -- Void if `other' is void; otherwise new object -- field-by-field identical to `other'. -- Always uses default copying semantics. -- (from ANY) do if other /= Void then Result := other.standard_twin end ensure -- from ANY equal: standard_equal (Result, other) end frozen standard_copy (other: like Current) -- Copy every field of `other' onto corresponding field -- of current object. -- (from ANY) require -- from ANY other_not_void: other /= Void type_identity: same_type (other) external "built_in" ensure -- from ANY is_standard_equal: standard_is_equal (other) end frozen standard_twin: like Current -- New object field-by-field identical to `other'. -- Always uses default copying semantics. -- (from ANY) local l_temp: BOOLEAN do l_temp := {ISE_RUNTIME}.check_assert (False) Result ?= {ISE_RUNTIME}.c_standard_clone ($Current) Result.standard_copy (Current) l_temp := {ISE_RUNTIME}.check_assert (l_temp) ensure -- from ANY standard_twin_not_void: Result /= Void equal: standard_equal (Result, Current) end frozen twin: like Current -- New object equal to `Current' -- twin calls copy; to change copying/twining semantics, redefine copy. -- (from ANY) local l_temp: BOOLEAN do l_temp := {ISE_RUNTIME}.check_assert (False) Result ?= {ISE_RUNTIME}.c_standard_clone ($Current) Result.copy (Current) l_temp := {ISE_RUNTIME}.check_assert (l_temp) ensure -- from ANY twin_not_void: Result /= Void is_equal: Result.is_equal (Current) end feature -- Basic operations frozen default: like Current -- Default value of object's type -- (from ANY) do end frozen default_pointer: POINTER -- Default value of type `POINTER' -- (Avoid the need to write `p'.default for -- some `p' of type `POINTER'.) -- (from ANY) do end default_rescue -- Process exception for routines with no Rescue clause. -- (Default: do nothing.) -- (from ANY) do end frozen do_nothing -- Execute a null action. -- (from ANY) do end feature -- Output io: STD_FILES -- Handle to standard file setup -- (from ANY) once create Result Result.set_output_default ensure -- from ANY io_not_void: Result /= Void end out: STRING_8 -- New string containing terse printable representation -- of current object -- (from ANY) do Result := tagged_out ensure -- from ANY out_not_void: Result /= Void end print (some: ANY) -- Write terse external representation of `some' -- on standard output. -- (from ANY) do if some /= Void then io.put_string (some.out) end end frozen tagged_out: STRING_8 -- New string containing terse printable representation -- of current object -- (from ANY) external "built_in" ensure -- from ANY tagged_out_not_void: Result /= Void end feature -- Platform operating_environment: OPERATING_ENVIRONMENT -- Objects available from the operating system -- (from ANY) once create Result ensure -- from ANY operating_environment_not_void: Result /= Void end feature {NONE} -- Retrieval frozen internal_correct_mismatch -- Called from runtime to perform a proper dynamic dispatch on `correct_mismatch' -- from MISMATCH_CORRECTOR. -- (from ANY) local l_corrector: MISMATCH_CORRECTOR l_msg: STRING_8 l_exc: EXCEPTIONS do l_corrector ?= Current if l_corrector /= Void then l_corrector.correct_mismatch else create l_msg.make_from_string ("Mismatch: ") create l_exc l_msg.append (generating_type) l_exc.raise_retrieval_exception (l_msg) end end feature -- access get_constant (name: STRING_8): STRING_8 -- retrieve a constant string defined in configuration file, return "" if not exists require valid_name_is_given: name /= Void and not name.is_empty do if variables.has (name) then Result := variables.item (name) else Result := "" end end get_handler_type (request: STRING_8): STRING_8 -- parse config file to get the handler id string for specified request/command require config_file_name /= Void local configfile: PLAIN_TEXT_FILE do create Result.make_empty create configfile.make_open_read (config_file_name) from configfile.start until configfile.after loop configfile.read_line if not configfile.last_string.is_empty and then configfile.last_string.item (1) /= '#' and then Result.is_empty then if (not request.is_empty or not default_request.is_empty) and then configfile.last_string.has_substring ("[RequestHandler]") then Result := lookup_handler_type (configfile, request) end end end configfile.close end get_template_file (request, command: STRING_8): STRING_8 -- parse config file to get template file for specified request/command require config_file_name /= Void local configfile: PLAIN_TEXT_FILE do create Result.make_empty create configfile.make_open_read (config_file_name) from configfile.start until configfile.after loop configfile.read_line if not configfile.last_string.is_empty and then configfile.last_string.item (1) /= '#' and then Result.is_empty then if (not request.is_empty or not default_request.is_empty) and then configfile.last_string.has_substring ("[RequestHandler]") then Result := lookup_template_file (configfile, request, command) end end end configfile.close end has_constant (name: STRING_8): BOOLEAN -- check whether a specified constant is defined in config file require valid_name_is_given: name /= Void and not name.is_empty do Result := variables.has (name) end read_configuration (request, command: STRING_8) -- parse config file to get configurations for sepcified request/command require config_file_name /= Void local configfile: PLAIN_TEXT_FILE do create configfile.make_open_read (config_file_name) from configfile.start until configfile.after loop configfile.read_line if not configfile.last_string.is_empty and then configfile.last_string.item (1) /= '#' then if configfile.last_string.has_substring ("[general]") then parse_general_section (configfile) end if configfile.last_string.has_substring ("[database]") then parse_database_section (configfile) end if configfile.last_string.has_substring ("[session]") then parse_session_section (configfile) end if configfile.last_string.has_substring ("[constants]") then parse_constants_section (configfile) end if (not request.is_empty or not default_request.is_empty) and then configfile.last_string.has_substring ("[RequestHandler]") then parse_requesthandler_section (configfile, request, command) end end end configfile.close end feature -- attribute application_path: STRING_8 -- path to eiffel application config_file_name: STRING_8 -- full path to the config file database_name: STRING_8 database_password: STRING_8 database_port: INTEGER_32 database_server: STRING_8 database_socket_file: STRING_8 database_username: STRING_8 default_command: STRING_8 -- default request and command string in case client hasn't specified a request default_request: STRING_8 error_template_page: STRING_8 -- a template page will be used for HTML error pages (4xx errors) handler: STRING_8 -- handler class name for given request/action image_path: STRING_8 -- path to image files javascript: STRING_8 -- javascript path notfound_command: STRING_8 -- in case of an unknown request, request/command string used to identify a handler notfound_request: STRING_8 session_expiration: INTEGER_32 -- session expirated (in hours) session_files_folder: STRING_8 -- folder that all session files will be saved in session_id_length: INTEGER_32 -- length of generated session id stylesheet: STRING_8 -- stylesheet path template: STRING_8 -- html template file for given request/action variables: HASH_TABLE [STRING_8, STRING_8] -- application constants as strings feature {NONE} -- creation make (file_name: STRING_8) -- initialize objects / default values do create config_file_name.make_from_string (file_name) create application_path.make_empty create default_request.make_empty create default_command.make_empty create stylesheet.make_empty create javascript.make_empty create image_path.make_empty create error_template_page.make_empty create database_server.make_empty database_port := 3306 create database_socket_file.make_empty create database_name.make_empty create database_username.make_empty create database_password.make_empty create session_files_folder.make_from_string ("") session_expiration := 600 session_id_length := 12 create variables.make (100) create handler.make_empty create template.make_empty end feature {NONE} -- implementation lookup_handler_type (configfile: PLAIN_TEXT_FILE; request: STRING_8): STRING_8 -- parsing [requesthandler] section for handler id string for specified request/command require not request.is_empty or not default_request.is_empty local right_section: BOOLEAN value: STRING_8 do Result := "" right_section := False from configfile.read_line until configfile.last_string.is_empty or configfile.last_string.item (1) = '[' or not Result.is_empty loop if configfile.last_string.item (1) /= '#' then if configfile.last_string.has ('=') then value := configfile.last_string.split ('=').i_th (2) if value /= Void then value.left_adjust value.right_adjust end end if configfile.last_string.has_substring ("request") and then value /= Void and then value.is_equal (request) then right_section := True end if right_section then if configfile.last_string.has_substring ("handler") and then value /= Void then Result := value end end end configfile.read_line end end lookup_template_file (configfile: PLAIN_TEXT_FILE; request, command: STRING_8): STRING_8 -- parsing [requesthandler] section for template file for specified request/command require not request.is_empty or not default_request.is_empty local right_section: BOOLEAN command_template: STRING_8 value: STRING_8 do Result := "" right_section := False if command.is_empty then create command_template.make_empty else create command_template.make_from_string (command + "_template") end from configfile.read_line until configfile.last_string.is_empty or configfile.last_string.item (1) = '[' loop if configfile.last_string.item (1) /= '#' then if configfile.last_string.has ('=') then value := configfile.last_string.split ('=').i_th (2) if value /= Void then value.left_adjust value.right_adjust end end if configfile.last_string.has_substring ("request") and then value /= Void and then value.is_equal (request) then right_section := True end if right_section then if configfile.last_string.has_substring ("default_template") and then value /= Void then Result := value end if not command_template.is_empty and then configfile.last_string.has_substring (command_template) and then value /= Void then Result := value end end end configfile.read_line end end parse_constants_section (configfile: PLAIN_TEXT_FILE) -- parsing [constants] section local name: STRING_8 value: STRING_8 do from configfile.read_line until configfile.last_string.is_empty or configfile.last_string.item (1) = '[' loop if configfile.last_string.item (1) /= '#' then if configfile.last_string.has ('=') then name := configfile.last_string.split ('=').i_th (1) value := configfile.last_string.split ('=').i_th (2) if value /= Void then name.left_adjust name.right_adjust value.left_adjust value.right_adjust end end if not name.is_empty and then not value.is_empty then variables.extend (value, name) end end configfile.read_line end end parse_database_section (configfile: PLAIN_TEXT_FILE) -- parsing [database] section local value: STRING_8 do from configfile.read_line until configfile.last_string.is_empty or configfile.last_string.item (1) = '[' loop if configfile.last_string.item (1) /= '#' then if configfile.last_string.has ('=') then value := configfile.last_string.split ('=').i_th (2) if value /= Void then value.left_adjust value.right_adjust end end if configfile.last_string.has_substring ("host") and then value /= Void then database_server := value elseif configfile.last_string.has_substring ("port") and then value /= Void and then not value.is_empty then database_port := value.to_integer elseif configfile.last_string.has_substring ("socketfile") and then value /= Void then database_socket_file := value elseif configfile.last_string.has_substring ("database") and then value /= Void then database_name := value elseif configfile.last_string.has_substring ("username") and then value /= Void then database_username := value elseif configfile.last_string.has_substring ("password") and then value /= Void then database_password := value end end configfile.read_line end end parse_general_section (configfile: PLAIN_TEXT_FILE) -- parsing [general] section local value: STRING_8 do from configfile.read_line until configfile.last_string.is_empty or configfile.last_string.item (1) = '[' loop if configfile.last_string.item (1) /= '#' then if configfile.last_string.has ('=') then value := configfile.last_string.split ('=').i_th (2) if value /= Void then value.left_adjust value.right_adjust end end if configfile.last_string.has_substring ("app_path") and then value /= Void then application_path := value elseif configfile.last_string.has_substring ("default_request") and then value /= Void then default_request := value elseif configfile.last_string.has_substring ("default_command") and then value /= Void then default_command := value elseif configfile.last_string.has_substring ("notfound_request") and then value /= Void then notfound_request := value elseif configfile.last_string.has_substring ("notfound_command") and then value /= Void then notfound_command := value elseif configfile.last_string.has_substring ("stylesheet") and then value /= Void then stylesheet := value elseif configfile.last_string.has_substring ("javascript") and then value /= Void then javascript := value elseif configfile.last_string.has_substring ("image_path") and then value /= Void then image_path := value elseif configfile.last_string.has_substring ("error_template_page") and then value /= Void then error_template_page := value end end configfile.read_line end end parse_requesthandler_section (configfile: PLAIN_TEXT_FILE; request, command: STRING_8) -- parsing [requesthandler] section require not request.is_empty or not default_request.is_empty local right_section: BOOLEAN actual_request: STRING_8 command_template: STRING_8 value: STRING_8 do right_section := False if request.is_empty then create actual_request.make_from_string (default_request) else create actual_request.make_from_string (request) end if command.is_empty then create command_template.make_from_string (default_command + "_template") else create command_template.make_from_string (command + "_template") end from configfile.read_line until configfile.last_string.is_empty or configfile.last_string.item (1) = '[' loop if configfile.last_string.item (1) /= '#' then if configfile.last_string.has ('=') then value := configfile.last_string.split ('=').i_th (2) if value /= Void then value.left_adjust value.right_adjust end end if configfile.last_string.has_substring ("request") and then value /= Void and then value.is_equal (actual_request) then right_section := True end if right_section then if configfile.last_string.has_substring ("handler") and then value /= Void then handler := value end if configfile.last_string.has_substring ("default_template") and then value /= Void then template := value end if (not command.is_empty or not default_command.is_empty) and then configfile.last_string.has_substring (command_template) and then value /= Void then template := value end end end configfile.read_line end end parse_session_section (configfile: PLAIN_TEXT_FILE) -- parsing [session] section local value: STRING_8 do from configfile.read_line until configfile.last_string.is_empty or configfile.last_string.item (1) = '[' loop if configfile.last_string.item (1) /= '#' then if configfile.last_string.has ('=') then value := configfile.last_string.split ('=').i_th (2) if value /= Void then value.left_adjust value.right_adjust end end if configfile.last_string.has_substring ("session_files_folder") and then value /= Void then session_files_folder := value if session_files_folder.item (session_files_folder.count) /= '/' then session_files_folder.extend ('/') end elseif configfile.last_string.has_substring ("expiration") and then value /= Void and then not value.is_empty then session_expiration := value.to_integer elseif configfile.last_string.has_substring ("session_id_length") and then value /= Void and then not value.is_empty then session_id_length := value.to_integer end end configfile.read_line end end invariant invariant_clause: True -- from ANY reflexive_equality: standard_is_equal (Current) reflexive_conformance: conforms_to (Current) end -- class CONFIG_READER
ClassesClustersCluster hierarchyChartRelationsTextFlatContractsFlat contracts

-- Generated by ISE Eiffel --

For more details: www.eiffel.com