#% text_encoding = iso8859_1 ##------------------------------------------------------------------------------ ## Module : check_for_conflict_methods.magik ## ## Description : Script to check an image for existing ## conflict methods ## ## ## Class/Filename : ## ## Author : Gerhard Höger-Hansen, friendlyGIS GmbH ## ## Date (dd.mm.yyyy): 19.02.2016 ## ## Copyright (C) 2016 by friendlyGIS GmbH, Gütersloh, Germany ##------------------------------------------------------------------------------ _package sw $ _pragma(classify_level=basic, usage={external}, topic={friendlygis}) ## ## Description: ## Use this small class to check an image for contained ## conflict methods. Usage: ## c << conflict_method_checker.new() ## c.check() ## c.report_on( a_stream ) ## def_slotted_exemplar(:conflict_method_checker, { { :classes, _unset } }, {}) $ conflict_method_checker.define_slot_access(:classes, ## This slot holds the conlict methods found. It is a ## property list keyed by class_name (with package). ## equality_hash_table[class_name] ## holds: ## property_list[method_name] ## holds: ## rope(causing-methods as string) :writable, :private) $ _pragma(classify_level=basic, usage={external}, topic={friendlygis}) _method conflict_method_checker.new() ## ## Description: ## ## Prerequisites: ## ## Parameters: ## ## Further side-effects: ## ## Return values: ## ## Raised conditions: ## _return _clone.init() _endmethod $ _pragma(classify_level=basic, usage={external}, topic={friendlygis}) _method conflict_method_checker.check( _optional a_package ) ## ## Description: ## Check the current image for conflict methods. ## ## Prerequisites: ## ## Parameters: ## ## Further side-effects: ## Fills the slot .classes ## ## Return values: ## ## Raised conditions: ## _for p_name, pkg _over package.all_packages.fast_keys_and_elements() _loop _if a_package _is _unset _orif a_package = p_name _then # Loop all objects in package _for o _over pkg.elements() _loop # limit to _self's methods _for m _over o.method_table.elements() _loop _if m.owner _is o.method_table _then _if m.conflict? _is _true _then # Store the information in _self.classes _local class_key << write_string( p_name, %:, o.class_name ) _local class_info _if ( class_info << _self.classes[class_key] ) _is _unset _then class_info << _self.classes[class_key] << property_list.new() _endif _local causes_rope << rope.new() _for pmt _over o.method_table.parents() _loop _for pm _over pmt.elements() _loop _if pm.name = m.name _then causes_rope.add_last( write_string( p_name, %:, pm.name, " in ", pm.owner.meta_at(:class_name) ) ) _endif _endloop _endloop class_info[m.name] << causes_rope _endif _endif _endloop _endloop _endif _endloop _return _self.classes _endmethod $ _pragma(classify_level=basic, usage={external}, topic={friendlygis}) _method conflict_method_checker.report_on( _optional a_stream ) ## ## Description: ## ## Prerequisites: ## ## Parameters: ## ## Further side-effects: ## ## Return values: ## ## Raised conditions: ## _local s << a_stream.default( !output! ) _local t << tab_char _local nl << newline_char _local sorted_classes << _self.classes.keys.as_sorted_collection() _for class_key _over sorted_classes.fast_elements() _loop _local methods << _self.classes[class_key] s.write( "Konfliktmethoden in Klasse ", class_key, nl ) _for conf_meth, causes _over methods.fast_keys_and_elements() _loop s.write( t, conf_meth, nl ) s.write( t * 2, "verursacht durch:", nl ) _for cause _over causes.fast_elements() _loop s.write( tab_char * 2, cause, nl ) _endloop _endloop _endloop _endmethod $ _pragma(classify_level=advanced, usage={internal}, topic={friendlygis}) _private _method conflict_method_checker.init() ## ## Description: ## Returns an initialized object ## ## Prerequisites: ## ## Parameters: ## ## Further side-effects: ## Set slot .classes to a hash_table ## ## Return values: ## ## Raised conditions: ## .classes << equality_hash_table.new() _return _self _endmethod $ _pragma(classify_level=advanced, topic={friendlygis,development}) _global show_conflict_methods << _proc @show_conflict_methods( _optional a_package ) ## ## _for p_name, pkg _over package.all_packages.fast_keys_and_elements() _loop _if a_package _is _unset _orif a_package = p_name _then # Loop all objects in package _for o _over pkg.elements() _loop # limit to _self's methods _for m _over o.method_table.elements() _loop _if m.owner _is o.method_table _then _if m.conflict? _is _true _then write( m ) _endif _endif _endloop _endloop _endif _endloop _endproc $ # Example: _block _local c << conflict_method_checker.new() c.check() c.report_on() _endblock $