note
	description: "[
				Reusable ROC CMS launcher.
			]"
	date: "$Date: 2015-02-09 22:29:56 +0100 (lun., 09 févr. 2015) $"
	revision: "$Revision: 96596 $"

class
	ROC_CMS_LAUNCHER [G -> CMS_EXECUTION create make end]

inherit
	WSF_LAUNCHABLE_SERVICE
		rename
			make_and_launch as make_and_launch_service
		redefine
			initialize
		end

	REFACTORING_HELPER

	SHARED_EXECUTION_ENVIRONMENT

	SHARED_LOGGER

create
	make_and_launch

feature {NONE} -- Initialization

	make_and_launch
		do
			create launcher
			make_and_launch_service
		end

	initialize
			-- Initialize current service.
		local
			env: CMS_ENVIRONMENT
			l_app_name: detachable READABLE_STRING_32
		do
			Precursor
			create env.make_default
			l_app_name := optional_application_name
			if l_app_name = Void then
				l_app_name := env.name
			end
			create {WSF_SERVICE_LAUNCHER_OPTIONS_FROM_INI} service_options.make_from_file (l_app_name + ".ini")
			initialize_logger (env)
		end

	optional_application_name: detachable READABLE_STRING_32
			-- Optional application name.
			--| Redefine if needed.
		do
		end

feature {NONE} -- Launch operation

	launcher: APPLICATION_LAUNCHER [G]

	launch (opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS)
		local
			l_retry: BOOLEAN
			l_message: STRING
		do
			if not l_retry then
				launcher.launch (opts)
			else
					-- error hanling.
				create l_message.make (1024)
				if attached ((create {EXCEPTION_MANAGER}).last_exception) as l_exception then
					if attached l_exception.description as l_description then
						l_message.append (l_description.as_string_32)
						l_message.append ("%N%N")
					elseif attached l_exception.trace as l_trace then
						l_message.append (l_trace)
						l_message.append ("%N%N")
					else
						l_message.append (l_exception.out)
						l_message.append ("%N%N")
					end
				else
					l_message.append ("The application crashed without information.")
					l_message.append ("%N%N")
				end
				-- send email shutdown
			end
		rescue
			l_retry :=  True
			retry
		end

end

