diff --git a/examples/demo/demo-safe.ecf b/examples/demo/demo-safe.ecf index c760a4f..3c64fa1 100644 --- a/examples/demo/demo-safe.ecf +++ b/examples/demo/demo-safe.ecf @@ -1,58 +1,81 @@ - Example/demo for Eiffel ROC CMS library - - - /EIFGENs$ - /CVS$ - /.svn$ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Example/demo for Eiffel ROC CMS library + + + /EIFGENs$ + /CVS$ + /.svn$ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/demo/launcher/any/application_launcher.e b/examples/demo/launcher/any/application_launcher.e index 0ef505c..bb184d0 100644 --- a/examples/demo/launcher/any/application_launcher.e +++ b/examples/demo/launcher/any/application_launcher.e @@ -8,10 +8,10 @@ note revision: "$Revision: 36 $" class - APPLICATION_LAUNCHER + APPLICATION_LAUNCHER [G -> WSF_EXECUTION create make end] inherit - APPLICATION_LAUNCHER_I + APPLICATION_LAUNCHER_I [G] feature -- Custom diff --git a/examples/demo/launcher/any/application_launcher_i.e b/examples/demo/launcher/any/application_launcher_i.e index 0744c80..026d12f 100644 --- a/examples/demo/launcher/any/application_launcher_i.e +++ b/examples/demo/launcher/any/application_launcher_i.e @@ -10,24 +10,28 @@ note revision: "$Revision: 36 $" deferred class - APPLICATION_LAUNCHER_I + APPLICATION_LAUNCHER_I [G -> WSF_EXECUTION create make end] inherit SHARED_EXECUTION_ENVIRONMENT feature -- Execution - launch (a_service: WSF_SERVICE; opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS) + launch (opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS) local nature: like launcher_nature do nature := launcher_nature - if nature = Void or else nature = nature_nino then - launch_nino (a_service, opts) + if nature = Void then + launch_standalone (opts) + elseif nature = nature_standalone then + launch_standalone (opts) + elseif nature = nature_nino then + launch_nino (opts) elseif nature = nature_cgi then - launch_cgi (a_service, opts) + launch_cgi (opts) elseif nature = nature_libfcgi then - launch_libfcgi (a_service, opts) + launch_libfcgi (opts) else -- bye bye (create {EXCEPTIONS}).die (-1) @@ -43,14 +47,16 @@ feature {NONE} -- Access --| and we could use WSF_DEFAULT_SERVICE_LAUNCHER to configure this at compilation time. local p: PATH - l_entry_name: READABLE_STRING_32 ext: detachable READABLE_STRING_32 do create p.make_from_string (execution_environment.arguments.command_name) if attached p.entry as l_entry then - ext := l_entry.extension + ext := l_entry.extension end if ext /= Void then + if ext.same_string (nature_standalone) then + Result := nature_standalone + end if ext.same_string (nature_nino) then Result := nature_nino end @@ -61,39 +67,58 @@ feature {NONE} -- Access Result := nature_libfcgi end end + Result := default_nature + end + +feature {NONE} -- standalone + + nature_standalone: STRING = "standalone" + + launch_standalone (opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS) + local + launcher: WSF_STANDALONE_SERVICE_LAUNCHER [G] + do + create launcher.make_and_launch (opts) end feature {NONE} -- nino nature_nino: STRING = "nino" - launch_nino (a_service: WSF_SERVICE; opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS) + launch_nino (opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS) local - launcher: WSF_NINO_SERVICE_LAUNCHER + launcher: WSF_NINO_SERVICE_LAUNCHER [G] do - create launcher.make_and_launch (a_service, opts) + create launcher.make_and_launch (opts) end feature {NONE} -- cgi nature_cgi: STRING = "cgi" - launch_cgi (a_service: WSF_SERVICE; opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS) + launch_cgi (opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS) local - launcher: WSF_CGI_SERVICE_LAUNCHER + launcher: WSF_CGI_SERVICE_LAUNCHER [G] do - create launcher.make_and_launch (a_service, opts) + create launcher.make_and_launch (opts) end feature {NONE} -- libfcgi nature_libfcgi: STRING = "libfcgi" - launch_libfcgi (a_service: WSF_SERVICE; opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS) + launch_libfcgi (opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS) local - launcher: WSF_LIBFCGI_SERVICE_LAUNCHER + launcher: WSF_LIBFCGI_SERVICE_LAUNCHER [G] do - create launcher.make_and_launch (a_service, opts) + create launcher.make_and_launch (opts) + end + +feature -- Default + + default_nature: STRING + do + Result := nature_standalone end diff --git a/examples/demo/launcher/default/application_launcher.e b/examples/demo/launcher/default/application_launcher.e index 0ef505c..bb184d0 100644 --- a/examples/demo/launcher/default/application_launcher.e +++ b/examples/demo/launcher/default/application_launcher.e @@ -8,10 +8,10 @@ note revision: "$Revision: 36 $" class - APPLICATION_LAUNCHER + APPLICATION_LAUNCHER [G -> WSF_EXECUTION create make end] inherit - APPLICATION_LAUNCHER_I + APPLICATION_LAUNCHER_I [G] feature -- Custom diff --git a/examples/demo/launcher/default/application_launcher_i.e b/examples/demo/launcher/default/application_launcher_i.e index e665189..4d91129 100644 --- a/examples/demo/launcher/default/application_launcher_i.e +++ b/examples/demo/launcher/default/application_launcher_i.e @@ -10,15 +10,15 @@ note revision: "$Revision: 96596 $" deferred class - APPLICATION_LAUNCHER_I + APPLICATION_LAUNCHER_I [G -> WSF_EXECUTION create make end] feature -- Execution - launch (a_service: WSF_SERVICE; opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS) + launch (opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS) local - launcher: WSF_DEFAULT_SERVICE_LAUNCHER + launcher: WSF_DEFAULT_SERVICE_LAUNCHER [G] do - create {WSF_DEFAULT_SERVICE_LAUNCHER} launcher.make_and_launch (a_service, opts) + create launcher.make_and_launch (opts) end end diff --git a/examples/demo/site/config/application_configuration.json b/examples/demo/site/config/application_configuration.json index 52dbb4b..0ccf9d5 100644 --- a/examples/demo/site/config/application_configuration.json +++ b/examples/demo/site/config/application_configuration.json @@ -23,7 +23,8 @@ "server": "localhost" }, "logger": { - "level":"debug", + "level":"error", + "type":"stderr", "backup_count":"4" }, "server": { diff --git a/examples/demo/site/themes/bootstrap/assets/favicon.ico b/examples/demo/site/themes/bootstrap/assets/favicon.ico new file mode 100644 index 0000000..a41a159 Binary files /dev/null and b/examples/demo/site/themes/bootstrap/assets/favicon.ico differ diff --git a/examples/demo/site/themes/bootstrap/page.tpl b/examples/demo/site/themes/bootstrap/page.tpl index 9bf0155..f56846b 100644 --- a/examples/demo/site/themes/bootstrap/page.tpl +++ b/examples/demo/site/themes/bootstrap/page.tpl @@ -4,10 +4,10 @@ - - - - + + + + diff --git a/examples/demo/src/ewf_roc_server.e b/examples/demo/src/ewf_roc_server.e index d284825..1bfdcab 100644 --- a/examples/demo/src/ewf_roc_server.e +++ b/examples/demo/src/ewf_roc_server.e @@ -16,11 +16,6 @@ inherit initialize end - WSF_SERVICE - redefine - execute - end - REFACTORING_HELPER SHARED_EXECUTION_ENVIRONMENT @@ -40,37 +35,26 @@ feature {NONE} -- Initialization initialize -- Initialize current service. + local + env: CMS_ENVIRONMENT do - -- Launcher Precursor create {WSF_SERVICE_LAUNCHER_OPTIONS_FROM_INI} service_options.make_from_file ("demo.ini") - - -- CMS - initialize_cms - end - -feature -- Service - - cms_service: CMS_SERVICE - -- cms service. - - execute (req: WSF_REQUEST; res: WSF_RESPONSE) - do - cms_service.execute (req, res) + create env.make_default + initialize_logger (env) end feature {NONE} -- Launch operation - launcher: APPLICATION_LAUNCHER + launcher: APPLICATION_LAUNCHER [EWF_ROC_SERVER_EXECUTION] - launch (a_service: WSF_SERVICE; opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS) + launch (opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS) local l_retry: BOOLEAN l_message: STRING do if not l_retry then - write_debug_log (generator + ".launch") - launcher.launch (a_service, opts) + launcher.launch (opts) else -- error hanling. create l_message.make (1024) @@ -89,77 +73,12 @@ feature {NONE} -- Launch operation l_message.append ("The application crash without available information") l_message.append ("%N%N") end - -- notify shutdown - write_debug_log (generator + ".launch shutdown") + -- send email shutdown end rescue l_retry := True retry end -feature -- CMS Initialization - - initialize_cms - local - l_setup: CMS_DEFAULT_SETUP - utf: UTF_CONVERTER - cms_env: CMS_ENVIRONMENT - do - -- Application Environment initialization - if attached execution_environment.arguments.separate_character_option_value ('d') as l_dir then - create cms_env.make_with_directory_name (l_dir) - else - create cms_env.make_default - end - initialize_logger (cms_env) - - -- CMS Setup - write_debug_log (generator + ".initialize_cms / SETUP based directory=%"" + utf.escaped_utf_32_string_to_utf_8_string_8 (cms_env.path.name) + "%"") - create l_setup.make (cms_env) - - -- CMS - write_debug_log (generator + ".initialize_cms / CMS") - setup_storage (l_setup) - setup_modules (l_setup) - create cms_service.make (l_setup) - end - -feature -- CMS setup - - setup_modules (a_setup: CMS_SETUP) - -- Setup additional modules. - local - m: CMS_MODULE - do - create {NODE_MODULE} m.make (a_setup) - m.enable - a_setup.register_module (m) - - create {BASIC_AUTH_MODULE} m.make - if not a_setup.module_with_same_type_registered (m) then - m.enable - a_setup.register_module (m) - end - - create {CMS_DEBUG_MODULE} m.make - m.enable - a_setup.register_module (m) - - create {CMS_DEMO_MODULE} m.make - m.enable - a_setup.register_module (m) - - create {CMS_BLOG_MODULE} m.make - m.enable - a_setup.register_module (m) - end - - setup_storage (a_setup: CMS_SETUP) - -- Setup storage by declaring storage builder. - do --- a_setup.storage_drivers.force (create {CMS_STORAGE_MYSQL_BUILDER}.make, "mysql") - a_setup.storage_drivers.force (create {CMS_STORAGE_SQLITE_BUILDER}.make, "sqlite") - end - end diff --git a/examples/demo/src/ewf_roc_server_execution.e b/examples/demo/src/ewf_roc_server_execution.e new file mode 100644 index 0000000..4256ef5 --- /dev/null +++ b/examples/demo/src/ewf_roc_server_execution.e @@ -0,0 +1,81 @@ +note + description: "Summary description for {EWF_ROC_SERVER_EXECUTION}." + date: "$Date$" + revision: "$Revision$" + +class + EWF_ROC_SERVER_EXECUTION + +inherit + CMS_EXECUTION + redefine + initialize + end + + REFACTORING_HELPER + + SHARED_LOGGER + +create + make + +feature {NONE} -- Initialization + + initialize + do + Precursor + end + + initial_cms_setup: CMS_DEFAULT_SETUP + -- CMS setup. + local + l_env: CMS_ENVIRONMENT + do + if attached execution_environment.arguments.separate_character_option_value ('d') as l_dir then + create l_env.make_with_directory_name (l_dir) + else + create l_env.make_default + end + create Result.make (l_env) + end + +feature -- CMS setup + + setup_storage (a_setup: CMS_SETUP) + do + debug ("refactor_fixme") + to_implement ("To implement custom storage") + end +-- a_setup.storage_drivers.force (create {CMS_STORAGE_MYSQL_BUILDER}.make, "mysql") + a_setup.storage_drivers.force (create {CMS_STORAGE_SQLITE_BUILDER}.make, "sqlite") + end + + setup_modules (a_setup: CMS_SETUP) + -- Setup additional modules. + local + m: CMS_MODULE + do + create {NODE_MODULE} m.make (a_setup) + m.enable + a_setup.register_module (m) + + create {BASIC_AUTH_MODULE} m.make + if not a_setup.module_with_same_type_registered (m) then + m.enable + a_setup.register_module (m) + end + + create {CMS_DEBUG_MODULE} m.make + m.enable + a_setup.register_module (m) + + create {CMS_DEMO_MODULE} m.make + m.enable + a_setup.register_module (m) + + create {CMS_BLOG_MODULE} m.make + m.enable + a_setup.register_module (m) + end + +end diff --git a/library/app_env/src/configuration/logger_configuration.e b/library/app_env/src/configuration/logger_configuration.e index ad41aa4..d66e89c 100644 --- a/library/app_env/src/configuration/logger_configuration.e +++ b/library/app_env/src/configuration/logger_configuration.e @@ -30,6 +30,7 @@ feature -- Initialization backup_count := 4 level := Log_debug location := Void + type := {STRING_32} "null" ensure then backup_count_set: backup_count = 4 level_set: level = Log_debug @@ -48,6 +49,9 @@ feature -- Access level: INTEGER -- Logger level. + type: IMMUTABLE_STRING_32 + -- Type of logging. + feature -- Element Change set_location (a_location: detachable PATH) @@ -65,6 +69,15 @@ feature -- Element Change set_location (create {PATH}.make_from_string (a_location)) end + set_type_with_string (a_type: detachable READABLE_STRING_GENERAL) + do + if a_type /= Void and then not a_type.is_whitespace then + create type.make_from_string_general (a_type) + else + create type.make_from_string_general ("null") + end + end + set_backup_count (a_backup: NATURAL) -- Set backup_count to `a_backup'. do diff --git a/library/app_env/src/logger/logger.e b/library/app_env/src/logger/logger.e index 2a77068..2fc0857 100644 --- a/library/app_env/src/logger/logger.e +++ b/library/app_env/src/logger/logger.e @@ -32,7 +32,7 @@ feature {NONE} -- Initialization create log.make end - make_with_environment (app: APPLICATION_ENVIRONMENT) + make_with_environment (app: separate APPLICATION_ENVIRONMENT) -- Initialize a logger object with an application environment `app'. do make @@ -49,7 +49,7 @@ feature {NONE} -- Initialization feature -- Change - apply_environment (app: APPLICATION_ENVIRONMENT) + apply_environment (app: separate APPLICATION_ENVIRONMENT) do initialize_logger (app, log) end @@ -58,75 +58,107 @@ feature {NONE} -- Internal log: LOGGING_FACILITY +feature -- Settings + + level: INTEGER + feature -- Logging + put_debug (a_message: separate READABLE_STRING_8) + -- Put message `a_message' to the log at debug level. + do + if level >= log_debug then + log.write_debug (create {STRING}.make_from_separate (a_message)) + end + end + put_information (a_message: separate READABLE_STRING_8) -- Put message `a_message' to the log at information level. do - log.write_information (create {STRING}.make_from_separate (a_message)) - end - - put_error (a_message: separate READABLE_STRING_8) - -- Put message `a_message' to the log at error level. - do - log.write_error (create {STRING}.make_from_separate (a_message)) + if level >= log_information then + log.write_information (create {STRING}.make_from_separate (a_message)) + end end put_warning (a_message: separate READABLE_STRING_8) -- Put message `a_message' to the log at warning level. do - log.write_warning (create {STRING}.make_from_separate (a_message)) + if level >= log_warning then + log.write_warning (create {STRING}.make_from_separate (a_message)) + end + end + + put_error (a_message: separate READABLE_STRING_8) + -- Put message `a_message' to the log at error level. + do + if level >= log_error then + log.write_error (create {STRING}.make_from_separate (a_message)) + end end put_critical (a_message: separate READABLE_STRING_8) -- Put message `a_message' to the log at critical level. do - log.write_critical (create {STRING}.make_from_separate (a_message)) + if level >= log_critical then + log.write_critical (create {STRING}.make_from_separate (a_message)) + end end put_alert (a_message: separate READABLE_STRING_8) -- Put message `a_message' to the log at alert level. do - log.write_alert (create {STRING}.make_from_separate (a_message)) - end - - put_debug (a_message: separate READABLE_STRING_8) - -- Put message `a_message' to the log at debug level. - do - log.write_debug (create {STRING}.make_from_separate (a_message)) + if level >= log_alert then + log.write_alert (create {STRING}.make_from_separate (a_message)) + end end feature {NONE} -- Implementation - initialize_logger (app: APPLICATION_ENVIRONMENT; a_log: like log) + initialize_logger (app: separate APPLICATION_ENVIRONMENT; a_log: like log) local l_log_writer_file: LOG_ROLLING_WRITER_FILE - l_log_writer: LOG_WRITER + l_log_writer: detachable LOG_WRITER l_logs_path: detachable PATH l_logger_config: LOGGER_CONFIGURATION ut: FILE_UTILITIES + p: PATH + l_name: IMMUTABLE_STRING_32 do - l_logger_config := new_logger_level_configuration (app.application_config_path) - l_logs_path := l_logger_config.location - if l_logs_path = Void then - l_logs_path := app.logs_path + create l_name.make_from_separate (app.name) + create p.make_from_separate (app.application_config_path) +-- l_name := app.name +-- p := app.application_config_path + + l_logger_config := new_logger_level_configuration (p) + if l_logger_config.type.is_case_insensitive_equal_general ("file") then + l_logs_path := l_logger_config.location + if l_logs_path = Void then + create l_logs_path.make_from_separate (app.logs_path) + end + if ut.directory_path_exists (l_logs_path) then + create l_log_writer_file.make_at_location (l_logs_path.extended (l_name).appended_with_extension ("log")) + l_log_writer_file.set_max_file_size ({NATURAL_64} 1024 * 1204) + l_log_writer_file.set_max_backup_count (l_logger_config.backup_count) + l_log_writer := l_log_writer_file + else + -- Should we create the directory anyway ? + end + elseif l_logger_config.type.is_case_insensitive_equal_general ("stderr") then + create {LOG_WRITER_STDERR} l_log_writer end - if ut.directory_path_exists (l_logs_path) then - create l_log_writer_file.make_at_location (l_logs_path.extended (app.name).appended_with_extension ("log")) - l_log_writer_file.set_max_file_size ({NATURAL_64} 1024 * 1204) - l_log_writer_file.set_max_backup_count (l_logger_config.backup_count) - l_log_writer := l_log_writer_file - else - -- Should we create the directory anyway ? + if l_log_writer = Void then create {LOG_WRITER_NULL} l_log_writer + set_logger_level (l_log_writer, log_notice) + else + set_logger_level (l_log_writer, 0) -- None end - set_logger_level (l_log_writer, l_logger_config.level) a_log.register_log_writer (l_log_writer) end set_logger_level (a_log_writer: LOG_WRITER; a_priority: INTEGER) -- Setup the logger level based on `a_priority' do + level := a_priority if a_priority = log_debug then a_log_writer.enable_debug_log_level elseif a_priority = Log_emergency then @@ -167,6 +199,9 @@ feature {NONE} -- Implementation attached l_parser.parsed_json_object as jv and then attached {JSON_OBJECT} jv.item ("logger") as l_logger then + if attached {JSON_STRING} l_logger.item ("type") as l_type then + Result.set_type_with_string (l_type.item) + end if attached {JSON_STRING} l_logger.item ("location") as l_location then Result.set_location_with_string (l_location.item) end diff --git a/library/app_env/src/logger/shared_logger.e b/library/app_env/src/logger/shared_logger.e index 1c05aba..625f07d 100644 --- a/library/app_env/src/logger/shared_logger.e +++ b/library/app_env/src/logger/shared_logger.e @@ -35,72 +35,113 @@ feature -- Logging write_debug_log (m: READABLE_STRING_8) do - write_debug_log_to (m, logger) +-- write_debug_log_to (m, logger) end write_information_log (m: READABLE_STRING_8) do - write_information_log_to (m, logger) +-- write_information_log_to (m, logger) end write_warning_log (m: READABLE_STRING_8) do - write_warning_log_to (m, logger) +-- write_warning_log_to (m, logger) end write_error_log (m: READABLE_STRING_8) do - write_error_log_to (m, logger) +-- write_error_log_to (m, logger) end write_critical_log (m: READABLE_STRING_8) do - write_critical_log_to (m, logger) +-- write_critical_log_to (m, logger) end write_alert_log (m: READABLE_STRING_8) do - write_alert_log_to (m, logger) +-- write_alert_log_to (m, logger) end feature {NONE} -- Logger: separate implementation write_debug_log_to (m: READABLE_STRING_8; a_log: like logger) + local + retried: BOOLEAN do - a_log.put_debug (m) + if not retried then + a_log.put_debug (m) + end + rescue + retried := True + retry end write_information_log_to (m: READABLE_STRING_8; a_log: like logger) + local + retried: BOOLEAN do - a_log.put_information (m) + if not retried then + a_log.put_information (m) + end + rescue + retried := True + retry end write_warning_log_to (m: READABLE_STRING_8; a_log: like logger) + local + retried: BOOLEAN do - a_log.put_warning (m) + if not retried then + a_log.put_warning (m) + end + rescue + retried := True + retry end write_error_log_to (m: READABLE_STRING_8; a_log: like logger) + local + retried: BOOLEAN do - a_log.put_error (m) + if not retried then + a_log.put_error (m) + end + rescue + retried := True + retry end write_critical_log_to (m: READABLE_STRING_8; a_log: like logger) + local + retried: BOOLEAN do - a_log.put_critical (m) + if not retried then + a_log.put_critical (m) + end + rescue + retried := True + retry end write_alert_log_to (m: READABLE_STRING_8; a_log: like logger) + local + retried: BOOLEAN do - a_log.put_alert (m) + if not retried then + a_log.put_alert (m) + end + rescue + retried := True + retry end - feature {NONE} -- Implementation initialize_logger (app: APPLICATION_ENVIRONMENT) local - l_logger: LOGGER + l_logger: separate LOGGER do create l_logger.make_with_environment (app) set_logger_to (l_logger, logger_cell) diff --git a/library/persistence/implementation/store/cms_storage_store_sql.e b/library/persistence/implementation/store/cms_storage_store_sql.e index acfec12..0a36c52 100644 --- a/library/persistence/implementation/store/cms_storage_store_sql.e +++ b/library/persistence/implementation/store/cms_storage_store_sql.e @@ -32,6 +32,15 @@ feature -- Status report Result := connection.is_connected end +feature -- Basic operation + + close + -- + -- Disconnect from SQL database. + do + connection.disconnect + end + feature {NONE} -- Implementation db_handler: DATABASE_HANDLER diff --git a/library/persistence/sqlite/src/cms_storage_sqlite_builder.e b/library/persistence/sqlite/src/cms_storage_sqlite_builder.e index f59beee..f48a77f 100644 --- a/library/persistence/sqlite/src/cms_storage_sqlite_builder.e +++ b/library/persistence/sqlite/src/cms_storage_sqlite_builder.e @@ -29,15 +29,25 @@ feature -- Factory storage (a_setup: CMS_SETUP): detachable CMS_STORAGE_SQLITE local s: STRING - conn: DATABASE_CONNECTION + conn: detachable DATABASE_CONNECTION do - if attached (create {APPLICATION_JSON_CONFIGURATION_HELPER}).new_database_configuration (a_setup.environment.application_config_path) as l_database_config then + if + attached (create {APPLICATION_JSON_CONFIGURATION_HELPER}).new_database_configuration (a_setup.environment.application_config_path) as l_database_config + then s := "Driver=SQLite3 ODBC Driver;Database=" if attached l_database_config.database_name as db_name then s.append (db_name) end s.append (";LongNames=0;Timeout=1000;NoTXN=0;SyncPragma=NORMAL;StepAPI=0;") - create {DATABASE_CONNECTION_ODBC} conn.login_with_connection_string (s) + if attached reuseable_connection.item as d then + if s.same_string (d.name) then + conn := d.connection + end + end + if conn = Void or else not conn.is_connected then + create {DATABASE_CONNECTION_ODBC} conn.login_with_connection_string (s) + reuseable_connection.replace ([s, conn]) + end if conn.is_connected then create Result.make (conn) set_map_zero_null_value (False) --| This way we map 0 to 0, instead of Null as default. @@ -50,4 +60,9 @@ feature -- Factory end end + reuseable_connection: CELL [detachable TUPLE [name: STRING; connection: DATABASE_CONNECTION]] + once + create Result.put (Void) + end + end diff --git a/modules/basic_auth/filter/basic_auth_filter.e b/modules/basic_auth/filter/basic_auth_filter.e index 0154d04..f2b3b40 100644 --- a/modules/basic_auth/filter/basic_auth_filter.e +++ b/modules/basic_auth/filter/basic_auth_filter.e @@ -22,12 +22,13 @@ feature -- Basic operations -- Execute the filter. local l_auth: HTTP_AUTHORIZATION - utf: UTF_CONVERTER do api.logger.put_debug (generator + ".execute ", Void) create l_auth.make (req.http_authorization) - if attached req.raw_header_data as l_raw_data then - api.logger.put_debug (generator + ".execute " + utf.escaped_utf_32_string_to_utf_8_string_8 (l_raw_data), Void) + debug + if attached req.raw_header_data as l_raw_data then + api.logger.put_debug (generator + ".execute " + (create {UTF_CONVERTER}).escaped_utf_32_string_to_utf_8_string_8 (l_raw_data), Void) + end end -- A valid user if diff --git a/modules/node/handler/nodes_handler.e b/modules/node/handler/nodes_handler.e index 289514b..e6f317c 100644 --- a/modules/node/handler/nodes_handler.e +++ b/modules/node/handler/nodes_handler.e @@ -63,7 +63,7 @@ feature -- HTTP Methods create s_pager.make_empty create l_page_helper.make ("nodes/?page={page}&size={size}", node_api.nodes_count, 25) -- FIXME: Make this default page size a global CMS settings l_page_helper.get_setting_from_request (req) - if l_page_helper.pages_count > 1 then + if l_page_helper.has_upper_limit and then l_page_helper.pages_count > 1 then l_page_helper.append_to_html (l_response, s_pager) if l_page_helper.page_size > 25 then s.append (s_pager) diff --git a/modules/node/handler/trash_handler.e b/modules/node/handler/trash_handler.e index 5f12770..36af87d 100644 --- a/modules/node/handler/trash_handler.e +++ b/modules/node/handler/trash_handler.e @@ -47,9 +47,8 @@ feature -- HTTP Methods -- get them from the configuration file and load them into -- the setup class. - create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api) - if attached current_user (req) as l_user then + create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api) l_page.add_variable (node_api.trashed_nodes (l_user), "nodes") @@ -72,6 +71,9 @@ feature -- HTTP Methods l_page.set_main_content (s) -- l_page.add_block (create {CMS_CONTENT_BLOCK}.make ("nodes_warning", Void, "/nodes/ is not yet fully implemented
", Void), "highlighted") l_page.execute + else + create {FORBIDDEN_ERROR_CMS_RESPONSE} l_page.make (req, res, api) + l_page.execute end end diff --git a/src/persistence/cms_storage.e b/src/persistence/cms_storage.e index e3e880e..c45d9c1 100644 --- a/src/persistence/cms_storage.e +++ b/src/persistence/cms_storage.e @@ -39,6 +39,13 @@ feature -- Status report deferred end +feature -- Basic operation + + close + -- Close/disconnect current storage. + deferred + end + feature -- Error Handling error_handler: ERROR_HANDLER diff --git a/src/persistence/cms_storage_null.e b/src/persistence/cms_storage_null.e index 17028e6..1b12b3b 100644 --- a/src/persistence/cms_storage_null.e +++ b/src/persistence/cms_storage_null.e @@ -45,6 +45,13 @@ feature -- Status report Result := True end +feature -- Basic operation + + close + -- + do + end + feature -- URL aliases set_path_alias (a_source: READABLE_STRING_8; a_alias: READABLE_STRING_8) diff --git a/src/service/cms_execution.e b/src/service/cms_execution.e new file mode 100644 index 0000000..823ec8e --- /dev/null +++ b/src/service/cms_execution.e @@ -0,0 +1,286 @@ +note + description: "[ + This class implements the CMS service + + It could be used to implement the main EWF service, or + even for a specific handler. + ]" + +deferred class + CMS_EXECUTION + +inherit + WSF_FILTERED_ROUTED_SKELETON_EXECUTION + undefine + requires_proxy + redefine + create_router, router, + execute_default, + filter_execute, + initialize + end + + WSF_NO_PROXY_POLICY + + WSF_URI_HELPER_FOR_ROUTED_EXECUTION + + WSF_URI_TEMPLATE_HELPER_FOR_ROUTED_EXECUTION + + REFACTORING_HELPER + + SHARED_LOGGER + +--create +-- make + +feature {NONE} -- Initialization + + initialize + -- Build a CMS service with `a_api' + local + l_setup: CMS_SETUP + do + l_setup := initial_cms_setup + setup_storage (l_setup) + setup_modules (l_setup) + create api.make (l_setup) + modules := setup.enabled_modules + + initialize_cms + Precursor + end + + initialize_cms + do + write_debug_log (generator + ".initialize_cms") + + -- CMS Initialization + + -- initialize_router + -- initialize_filter: expanded here, for void-safety concern. + create_filter + initialize_router + setup_filter + end + + initialize_modules + -- Intialize modules and keep only enabled modules. + do + modules := setup.enabled_modules + ensure + only_enabled_modules: across modules as ic all ic.item.is_enabled end + end + +feature -- Factory + + initial_cms_setup: CMS_SETUP + deferred + end + +feature -- Access + + api: CMS_API + -- API service. + + setup: CMS_SETUP + -- CMS Setup. + do + Result := api.setup + end + + modules: CMS_MODULE_COLLECTION + -- Configurator of possible modules. + +feature -- CMS setup + + setup_modules (a_setup: CMS_SETUP) + -- Setup additional modules. + deferred + end + + setup_storage (a_setup: CMS_SETUP) + deferred + end + +feature -- Settings: router + + router: CMS_ROUTER + -- + + create_router + -- Create `router'. + do + create router.make (api, 30) + end + + setup_router + -- + local + l_api: like api + l_router: like router + do + api.logger.put_debug (generator + ".setup_router", Void) + -- Configure root of api handler. + + l_router := router + configure_api_root (l_router) + + -- Include routes from modules. + l_api := api + across + modules as ic + loop + ic.item.setup_router (l_router, l_api) + end + -- Configure files handler. + configure_api_file_handler (l_router) + end + + configure_api_root (a_router: WSF_ROUTER) + local + l_root_handler: CMS_ROOT_HANDLER + l_methods: WSF_REQUEST_METHODS + do + api.logger.put_debug (generator + ".configure_api_root", Void) + create l_root_handler.make (api) + create l_methods + l_methods.enable_get + a_router.handle_with_request_methods ("/", l_root_handler, l_methods) + a_router.handle_with_request_methods ("", l_root_handler, l_methods) + map_uri_agent_with_request_methods ("/favicon.ico", agent handle_favicon, a_router.methods_head_get) + end + + configure_api_file_handler (a_router: WSF_ROUTER) + local + fhdl: WSF_FILE_SYSTEM_HANDLER + do + api.logger.put_information (generator + ".configure_api_file_handler", Void) + + create fhdl.make_hidden_with_path (setup.theme_assets_location) + fhdl.disable_index + fhdl.set_not_found_handler (agent (ia_uri: READABLE_STRING_8; ia_req: WSF_REQUEST; ia_res: WSF_RESPONSE) + do + execute_default (ia_req, ia_res) + end) + a_router.handle_with_request_methods ("/theme/", fhdl, router.methods_GET) + + + create fhdl.make_hidden_with_path (setup.environment.www_path) + fhdl.disable_index + fhdl.set_not_found_handler (agent (ia_uri: READABLE_STRING_8; ia_req: WSF_REQUEST; ia_res: WSF_RESPONSE) + do + execute_default (ia_req, ia_res) + end) + a_router.handle_with_request_methods ("/", fhdl, router.methods_GET) + end + +feature -- Execute Filter + + filter_execute (req: WSF_REQUEST; res: WSF_RESPONSE) + -- Execute the filter. + do + res.put_header_line ("Date: " + (create {HTTP_DATE}.make_now_utc).string) + res.put_header_line ("X-EWF-Server: CMS_v1.0") + Precursor (req, res) + end + +feature -- Filters + + create_filter + -- Create `filter'. + local + f, l_filter: detachable WSF_FILTER + l_module: CMS_MODULE + l_api: like api + do + api.logger.put_debug (generator + ".create_filter", Void) + l_filter := Void + + -- Maintenance + create {WSF_MAINTENANCE_FILTER} f + f.set_next (l_filter) + l_filter := f + +-- -- Error Filter +-- create {CMS_ERROR_FILTER} f.make (api) +-- f.set_next (l_filter) +-- l_filter := f + + -- Include filters from modules + l_api := api + across + modules as ic + loop + l_module := ic.item + if + l_module.is_enabled and then + attached l_module.filters (l_api) as l_m_filters + then + across l_m_filters as f_ic loop + f := f_ic.item + f.set_next (l_filter) + l_filter := f + end + end + end + + filter := l_filter + end + + setup_filter + -- Setup `filter'. + local + f: WSF_FILTER + do + api.logger.put_debug (generator + ".setup_filter", Void) + + from + f := filter + until + not attached f.next as l_next + loop + f := l_next + end + f.set_next (Current) + end + +feature -- Execution + + handle_favicon (req: WSF_REQUEST; res: WSF_RESPONSE) + local + ut: FILE_UTILITIES + p: PATH + r: NOT_FOUND_ERROR_CMS_RESPONSE + f: WSF_FILE_RESPONSE + do + p := api.setup.theme_assets_location.extended ("favicon.ico") + if ut.file_path_exists (p) then + create f.make_with_path (p) + res.send (f) + else + create r.make (req, res, api) + r.execute + end + end + + execute_default (req: WSF_REQUEST; res: WSF_RESPONSE) + -- Default request handler if no other are relevant + local + r: NOT_FOUND_ERROR_CMS_RESPONSE + do + to_implement ("Default response for CMS_SERVICE") + create r.make (req, res, api) + r.execute + end + +note + copyright: "2011-2014, Jocelyn Fiat, Eiffel Software and others" + license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" + source: "[ + Eiffel Software + 5949 Hollister Ave., Goleta, CA 93117 USA + Telephone 805-685-1006, Fax 805-685-6869 + Website http://www.eiffel.com + Customer support http://support.eiffel.com + ]" +end diff --git a/src/service/filter/cms_error_filter.e b/src/service/filter/cms_error_filter.e index 0e5f457..ce85041 100644 --- a/src/service/filter/cms_error_filter.e +++ b/src/service/filter/cms_error_filter.e @@ -22,7 +22,9 @@ feature -- Basic operations local utf: UTF_CONVERTER do - fixme ("Check if it's ok to add new fetures CMS_API.has_error:BOOLEAN and CMS_API.error_description.") + debug ("refactor_fixme") + fixme ("Check if it's ok to add new features CMS_API.has_error:BOOLEAN and CMS_API.error_description.") + end if not api.has_error then api.logger.put_information (generator + ".execute with req: " + req.debug_output, Void) if attached req.raw_header_data as l_header_data then diff --git a/tools/install.bat b/tools/install.bat new file mode 100644 index 0000000..88a7c22 --- /dev/null +++ b/tools/install.bat @@ -0,0 +1,71 @@ +@echo off +setlocal +set TMP_EXCLUDE=%~dp0.install_ROC-copydir-exclude +set COPYCMD= xcopy /EXCLUDE:%TMP_EXCLUDE% /I /E /Y +set TMP_DIR=%~dp0.. +set SAFE_RMDIR=rd /q/s + +echo EIFGENs > %TMP_EXCLUDE% +echo .git >> %TMP_EXCLUDE% +echo .svn >> %TMP_EXCLUDE% + +set TMP_TARGET_DIR=%1 +if -%TMP_TARGET_DIR%- == -- goto ask_target_dir +goto start + +:ask_target_dir +echo Please provide a installation directory (target library) +if -%ISE_LIBRARY%- == -- set ISE_LIBRARY=%EIFFEL_LIBRARY% +if -%ISE_LIBRARY%- == -- set ISE_LIBRARY=%ISE_EIFFEL% +if -%EIFFEL_LIBRARY%- == -- set EIFFEL_LIBRARY=%ISE_LIBRARY% +echo 1: using $EIFFEL_LIBRARY=%EIFFEL_LIBRARY% +echo 2: using $ISE_LIBRARY=%ISE_LIBRARY% +echo 3: using current directory=%CD%\ewf +CHOICE /C 123q /M " > selection:" +if .%ERRORLEVEL%. == .1. goto use_eiffel_library +if .%ERRORLEVEL%. == .2. goto use_ise_library +if .%ERRORLEVEL%. == .3. goto use_current_dir +echo No target directory were specified, you can pass it using the command line +echo Usage: install_ewf {target_directory} +echo Bye ... +goto end + +:use_eiffel_library +if -%EIFFEL_LIBRARY%- == -- goto use_ise_library +set TMP_TARGET_DIR=%EIFFEL_LIBRARY% +goto start + +:use_ise_library +if -%ISE_LIBRARY%- == -- goto use_current_dir +set TMP_TARGET_DIR=%ISE_LIBRARY% +goto start + +:use_current_dir +set TMP_TARGET_DIR=%CD%\ewf +goto start + +:start +set TMP_CONTRIB_DIR=%TMP_TARGET_DIR%\contrib +set TMP_UNSTABLE_DIR=%TMP_TARGET_DIR%\unstable + +echo Install ROC as CMS ewf +%SAFE_RMDIR% %TMP_UNSTABLE_DIR%\library\cms\library +%SAFE_RMDIR% %TMP_UNSTABLE_DIR%\library\cms\src +%SAFE_RMDIR% %TMP_UNSTABLE_DIR%\library\cms\doc +%SAFE_RMDIR% %TMP_UNSTABLE_DIR%\library\cms\modules +%SAFE_RMDIR% %TMP_UNSTABLE_DIR%\library\cms\examples + +%COPYCMD% %TMP_DIR%\library %TMP_UNSTABLE_DIR%\library\web\cms\library +%COPYCMD% %TMP_DIR%\src %TMP_UNSTABLE_DIR%\library\web\cms\src +%COPYCMD% %TMP_DIR%\doc %TMP_UNSTABLE_DIR%\library\web\cms\doc +%COPYCMD% %TMP_DIR%\modules %TMP_UNSTABLE_DIR%\library\web\cms\modules +%COPYCMD% %TMP_DIR%\examples %TMP_UNSTABLE_DIR%\library\web\cms\examples + +copy %TMP_DIR%\cms.ecf %TMP_UNSTABLE_DIR%\cms.ecf +copy %TMP_DIR%\cms-safe.ecf %TMP_UNSTABLE_DIR%\cms-safe.ecf +copy %TMP_DIR%\README.md %TMP_UNSTABLE_DIR%\README.md +copy %TMP_DIR%\package.iron %TMP_UNSTABLE_DIR%\package.iron + +:end +del %TMP_EXCLUDE% +