note

	description:

		"Geant project laoders"

	library: "Gobo Eiffel Ant"
	copyright: "Copyright (c) 2002-2018, Sven Ehrke and others"
	license: "MIT License"
	date: "$Date$"
	revision: "$Revision$"

class GEANT_PROJECT_LOADER

inherit

	ANY

	GEANT_SHARED_PROPERTIES
		export {NONE} all end

	KL_SHARED_FILE_SYSTEM
		export {NONE} all end

create

	make

feature {NONE} -- Initialization

	make (a_build_filename: STRING)
			-- Initialize project loader.
		require
			a_build_filename_not_void: a_build_filename /= Void
			a_build_filename_not_empty: a_build_filename.count > 0
		local
			a_absolute_pathname: STRING
			l_gobo_misc: STRING
			l_library_common_config: STRING
			l_new_build_filename: STRING
		do
			build_filename := a_build_filename
			if not file_system.is_file_readable (build_filename) then
					-- Try to see whether the file is one which was in ${GOBO}/misc
					-- and which has been moved to ${GOBO}/library/common/config.
				l_gobo_misc := Execution_environment.interpreted_string ("${GOBO}/misc/")
				if a_build_filename.starts_with (l_gobo_misc) then
					l_library_common_config := Execution_environment.interpreted_string ("${GOBO}/library/common/config/")
					l_new_build_filename := a_build_filename.twin
					l_new_build_filename.remove_head (l_gobo_misc.count)
					l_new_build_filename := l_library_common_config + l_new_build_filename
					if file_system.is_file_readable (l_new_build_filename) then
						build_filename := l_new_build_filename
					end
				end
				if build_filename = a_build_filename then
					a_absolute_pathname := file_system.absolute_pathname (
						file_system.pathname_from_file_system (build_filename, unix_file_system))
					exit_application (1, <<"cannot read build file '", a_absolute_pathname, "'">>)
				end
			end
		ensure
			build_filename_set: build_filename = a_build_filename
		end

feature -- Access

	build_filename: STRING
			-- Name of the file containing the configuration
			-- information to build a project

	project_element: detachable GEANT_PROJECT_ELEMENT
			-- Project element of build script

feature -- Processing

	load (a_variables: GEANT_PROJECT_VARIABLES; a_options: GEANT_PROJECT_OPTIONS)
			-- Read current project's configuration from `build_filename'
			-- and convert it into a 'GEANT_DOM'.
		require
			a_variables_not_void: a_variables /= Void
			a_options_not_void: a_options /= Void
		local
			a_file: KL_TEXT_INPUT_FILE
			a_project_parser: GEANT_PROJECT_PARSER
			s: STRING
	    do
			project_element := Void
			create a_file.make (build_filename.out)
			a_file.open_read
			if a_file.is_open_read then
				create a_project_parser.make (a_variables, a_options, build_filename)
				a_project_parser.parse_file (a_file)
				a_file.close
				project_element := a_project_parser.last_project_element
			else
				std.error.put_string ("cannot read file: '")
				std.error.put_string (build_filename)
				std.error.put_character ('%'')
				std.error.put_new_line
			end
			if project_element = Void then
				s := file_system.absolute_pathname (file_system.pathname_from_file_system (
					build_filename, unix_file_system))
				exit_application (1, <<"Parsing error in file '", s, "%'">>)
			end
	    end

invariant

	build_filename_not_void: build_filename /= Void
	build_filename_not_empty: build_filename.count > 0

end