rtm 0.1.6 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. data/DISCLAIMER +10 -33
  2. data/LICENSE +201 -0
  3. data/README +3 -3
  4. data/lib/rtm.rb +148 -74
  5. data/lib/rtm/axes.rb +295 -0
  6. data/lib/rtm/axes/association.rb +76 -0
  7. data/lib/rtm/axes/associations.rb +96 -0
  8. data/lib/rtm/axes/assocs_names_occs.rb +56 -0
  9. data/lib/rtm/axes/characteristic.rb +68 -0
  10. data/lib/rtm/axes/characteristics.rb +93 -0
  11. data/lib/rtm/axes/string.rb +76 -0
  12. data/lib/rtm/axes/strings.rb +87 -0
  13. data/lib/rtm/axes/topic.rb +233 -0
  14. data/lib/rtm/axes/topics.rb +280 -0
  15. data/lib/rtm/{backward_compatibility.rb → deprecated/index_property_set.rb} +3 -0
  16. data/lib/rtm/engine.rb +58 -0
  17. data/lib/rtm/extensions.rb +11 -1
  18. data/lib/rtm/{locator_helpers.rb → helpers/locator.rb} +15 -4
  19. data/lib/rtm/{helpers.rb → helpers/no_output.rb} +3 -0
  20. data/lib/rtm/helpers/uri.rb +13 -0
  21. data/lib/rtm/io.rb +18 -0
  22. data/lib/rtm/io/from_xtm2_libxml.rb +2 -1
  23. data/lib/rtm/io/ontopia_io.rb +25 -0
  24. data/lib/rtm/io/tmapix.rb +234 -0
  25. data/lib/rtm/io/to_hash.rb +116 -0
  26. data/lib/rtm/io/to_jtm.rb +53 -103
  27. data/lib/rtm/io/to_rdf.rb +30 -0
  28. data/lib/rtm/io/to_string.rb +8 -6
  29. data/lib/rtm/io/to_xtm1.rb +6 -4
  30. data/lib/rtm/io/to_xtm2.rb +10 -8
  31. data/lib/rtm/io/to_yaml.rb +29 -98
  32. data/lib/rtm/navigation.rb +37 -0
  33. data/lib/rtm/navigation/association/players.rb +25 -0
  34. data/lib/rtm/navigation/name/atomify.rb +19 -0
  35. data/lib/rtm/navigation/name/characteristics.rb +33 -0
  36. data/lib/rtm/navigation/occurrence/atomify.rb +19 -0
  37. data/lib/rtm/navigation/occurrence/characteristics.rb +33 -0
  38. data/lib/rtm/navigation/topic/characteristics.rb +33 -0
  39. data/lib/rtm/navigation/topic/indicators.rb +31 -0
  40. data/lib/rtm/navigation/topic/items.rb +31 -0
  41. data/lib/rtm/navigation/topic/locators.rb +31 -0
  42. data/lib/rtm/navigation/topic/players.rb +27 -0
  43. data/lib/rtm/navigation/topic/supertypes.rb +162 -0
  44. data/lib/rtm/navigation/topic/traverse.rb +51 -0
  45. data/lib/rtm/navigation/topic/types.rb +107 -0
  46. data/lib/rtm/psi.rb +33 -2
  47. data/lib/rtm/sugar.rb +34 -0
  48. data/lib/rtm/sugar/association/hash_access.rb +46 -0
  49. data/lib/rtm/sugar/occurrence/dynamic_value.rb +75 -0
  50. data/lib/rtm/{pimp_my_api.rb → sugar/occurrence/externalize.rb} +3 -0
  51. data/lib/rtm/sugar/role/counterparts.rb +133 -46
  52. data/lib/rtm/sugar/topic/characteristics.rb +126 -12
  53. data/lib/rtm/sugar/topic/counterparts.rb +130 -7
  54. data/lib/rtm/sugar/topic/hash_access.rb +140 -30
  55. data/lib/rtm/sugar/topic/scoped.rb +65 -0
  56. data/lib/rtm/sugar/topic/topic_ref.rb +35 -0
  57. data/lib/rtm/sugar/topic/typed.rb +159 -0
  58. data/lib/rtm/sugar/typed/types.rb +38 -0
  59. data/lib/rtm/validation.rb +8 -5
  60. data/lib/rtm/version.rb +18 -0
  61. data/spec/helpers/spec_exampleexamplegroup.rb +14 -0
  62. data/spec/rtm/axes/association_spec.rb +88 -0
  63. data/spec/rtm/axes/associations_spec.rb +60 -0
  64. data/spec/rtm/axes/assocs_names_occs_spec.rb +9 -0
  65. data/spec/rtm/axes/characteristic_spec.rb +90 -0
  66. data/spec/rtm/axes/characteristics_spec.rb +85 -0
  67. data/spec/rtm/axes/string_spec.rb +145 -0
  68. data/spec/rtm/axes/strings_spec.rb +168 -0
  69. data/spec/rtm/axes/topic_spec.rb +124 -0
  70. data/spec/rtm/axes/topics_spec.rb +103 -0
  71. data/spec/rtm/base_spec.rb +32 -0
  72. data/spec/rtm/io/tmapix_spec.rb +85 -0
  73. data/spec/rtm/navigation/association/players_spec.rb +58 -0
  74. data/spec/rtm/navigation/association_spec.rb +52 -0
  75. data/spec/rtm/navigation/name/atomify_spec.rb +27 -0
  76. data/spec/rtm/navigation/name/characteristics_spec.rb +34 -0
  77. data/spec/rtm/navigation/name_spec.rb +52 -0
  78. data/spec/rtm/navigation/occurrence/atomify_spec.rb +27 -0
  79. data/spec/rtm/navigation/occurrence/characteristics_spec.rb +34 -0
  80. data/spec/rtm/navigation/occurrence_spec.rb +52 -0
  81. data/spec/rtm/navigation/string_spec.rb +51 -0
  82. data/spec/rtm/navigation/topic/characteristics_spec.rb +55 -0
  83. data/spec/rtm/navigation/topic/indicators_spec.rb +43 -0
  84. data/spec/rtm/navigation/topic/items_spec.rb +44 -0
  85. data/spec/rtm/navigation/topic/locators_spec.rb +44 -0
  86. data/spec/rtm/navigation/topic/players_spec.rb +48 -0
  87. data/spec/rtm/navigation/topic/scope_spec.rb +41 -0
  88. data/spec/rtm/navigation/topic/supertypes_spec.rb +376 -0
  89. data/spec/rtm/navigation/topic/traverse_spec.rb +64 -0
  90. data/spec/rtm/navigation/topic/types_spec.rb +195 -0
  91. data/spec/rtm/navigation/topic_spec.rb +153 -0
  92. data/spec/rtm/sugar/association/hash_access_spec.rb +55 -0
  93. data/spec/rtm/sugar/occurrence/dynamic_value_spec.rb +16 -0
  94. data/spec/rtm/sugar/role/counterparts_spec.rb +191 -0
  95. data/spec/rtm/sugar/topic/characteristics_spec.rb +318 -0
  96. data/spec/rtm/sugar/topic/counterparts_spec.rb +184 -0
  97. data/spec/rtm/sugar/topic/hash_access_spec.rb +234 -0
  98. data/spec/rtm/sugar/topic/scoped_spec.rb +131 -0
  99. data/spec/rtm/sugar/topic/topic_ref_spec.rb +44 -0
  100. data/spec/rtm/sugar/topic/typed_spec.rb +155 -0
  101. data/spec/rtm/sugar/typed/types_spec.rb +24 -0
  102. data/spec/rtm/tmapi/core/association_spec.rb +169 -0
  103. data/spec/rtm/tmapi/core/construct_spec.rb +25 -0
  104. data/spec/rtm/tmapi/core/name_spec.rb +85 -0
  105. data/spec/rtm/tmapi/core/occurrence_spec.rb +96 -0
  106. data/spec/rtm/tmapi/core/reifiable_spec.rb +168 -0
  107. data/spec/rtm/tmapi/core/role_spec.rb +73 -0
  108. data/spec/rtm/tmapi/core/scoped_spec.rb +403 -0
  109. data/spec/rtm/tmapi/core/topic_map_spec.rb +648 -0
  110. data/spec/rtm/tmapi/core/topic_spec.rb +992 -0
  111. data/spec/rtm/tmapi/core/typed_spec.rb +112 -0
  112. data/spec/rtm/tmapi/core/variant_spec.rb +52 -0
  113. data/spec/rtm/tmapi/ext/java_util_set_spec.rb +34 -0
  114. data/spec/rtm/tmapi_spec.rb +44 -0
  115. data/spec/rtm/utils/sparql_spec.rb +26 -0
  116. data/spec/rtm_spec.rb +94 -0
  117. data/spec/spec_helper.rb +23 -0
  118. data/test/base_unit_test.rb +161 -0
  119. data/test/{base_test.rb → base_unit_test_tmapi.rb} +46 -43
  120. metadata +122 -66
  121. data/COPYRIGHT +0 -4
  122. data/lib/Rakefile.rb +0 -42
  123. data/lib/activetopicmaps.rb +0 -278
  124. data/lib/rtm/backend/active_record.rb +0 -58
  125. data/lib/rtm/backend/active_record/001_initial_schema.rb +0 -116
  126. data/lib/rtm/backend/active_record/association_and_role.rb +0 -33
  127. data/lib/rtm/backend/active_record/locators.rb +0 -55
  128. data/lib/rtm/backend/active_record/name_variant_occurrence.rb +0 -45
  129. data/lib/rtm/backend/active_record/quaaxtm2rtm.rb +0 -113
  130. data/lib/rtm/backend/active_record/quaaxtm2rtmviews.rb +0 -134
  131. data/lib/rtm/backend/active_record/set_wrapper.rb +0 -98
  132. data/lib/rtm/backend/active_record/tm_construct.rb +0 -62
  133. data/lib/rtm/backend/active_record/tm_delegator.rb +0 -345
  134. data/lib/rtm/backend/active_record/tm_set_delegator.rb +0 -195
  135. data/lib/rtm/backend/active_record/tmdm.rb +0 -298
  136. data/lib/rtm/backend/active_record/topic.rb +0 -87
  137. data/lib/rtm/backend/active_record/topic_map.rb +0 -314
  138. data/lib/rtm/backend/active_record/traverse_associations.rb +0 -87
  139. data/lib/rtm/base.rb +0 -92
  140. data/lib/rtm/connect.rb +0 -92
  141. data/lib/rtm/core_ext.rb +0 -6
  142. data/lib/rtm/io/from_xtm2.rb +0 -263
  143. data/lib/rtm/merging/merging.rb +0 -307
  144. data/lib/rtm/sugar/topic/identifier_direct.rb +0 -11
  145. data/lib/rtm/sugar/topic/predefined_associations.rb +0 -42
  146. data/lib/run_main_project.rb +0 -16
@@ -1,87 +0,0 @@
1
- module RTM::AR
2
- module TraverseAssociations
3
- # defines methods to traverse a specific assocation for all topics
4
- def define_association(prop, options={})
5
- r = options[:rule]
6
- module_eval(<<-EOS, "(__AR_DELEGATOR_DEFINE_ASSOCIATION__)", 1)
7
- def direct_#{prop}_roles
8
- # prefetch typing topics
9
- rtype = @ips_#{prop}_rtype ||= self.topic_map.get("#{r[:role_type]}")
10
- atype = @ips_#{prop}_atype ||= self.topic_map.get("#{r[:association_type]}")
11
- otype = @ips_#{prop}_otype ||= self.topic_map.get("#{r[:other_role_type]}")
12
- # return nothing if any of the typing topics does not exist
13
- return [] unless rtype && atype && otype
14
- # we do that only here and not earlier because some might me nil
15
- rtype = rtype.id
16
- atype = atype.id
17
- otype = otype.id
18
- self.__getobj__.roles.map{|r|
19
- r.ttype_id != nil &&
20
- r.ttype_id == rtype &&
21
- r.parent.roles.size == #{r[:association_arity]} &&
22
- r.parent != nil &&
23
- r.parent.ttype_id == atype &&
24
- (r2 = r.parent.roles.select{|r2| r2.ttype_id != nil &&
25
- r2.ttype_id == otype}.first) &&
26
- r2}.select{|r2| r2}.map{|r2| AssociationRole.wrap(r2)}
27
- end
28
- def direct_#{prop}
29
- direct_#{prop}_roles.map{|r2| r2.player}.uniq
30
- end
31
- EOS
32
-
33
- if r[:transitive]
34
- module_eval(<<-EOS, "(__AR_DELEGATOR_DEFINE_ASSOCIATION2__)", 1)
35
- def #{prop}
36
- d = todo = self.direct_#{prop}
37
- while todo.size > 0
38
- todo = todo.map{|dt| dt.direct_#{prop}}.flatten.uniq - d
39
- d += todo
40
- end
41
- d
42
- #d2 = self.direct_#{prop}.map {|dt| dt.#{prop}}.flatten
43
- #(d+d2).uniq
44
- end
45
- EOS
46
- else
47
- if r[:infer] && r[:infer_other] # this part is not testet at all!
48
- module_eval(<<-EOS, "(__AR_DELEGATOR_DEFINE_ASSOCIATION3a__)", 1)
49
- def #{prop}
50
- dps = (self + self.#{r[:infer]}).flatten.uniq
51
- dcps = dps.map{|d2| d2.direct_#{prop}}
52
- (dcps + dcps.map{|d2| d2.#{r[:infer_other]}}).flatten.uniq
53
- end
54
- EOS
55
- elsif r[:infer]
56
- module_eval(<<-EOS, "(__AR_DELEGATOR_DEFINE_ASSOCIATION3__)", 1)
57
- def #{prop}
58
- (self.direct_#{prop} + self.#{r[:infer]}.map{|d2| d2.direct_#{prop}}).flatten.uniq
59
- end
60
- EOS
61
- elsif r[:infer_other]
62
- module_eval(<<-EOS, "(__AR_DELEGATOR_DEFINE_ASSOCIATION4__)", 1)
63
- def #{prop}
64
- d = self.direct_#{prop}
65
- (d + d.map{|d2| d2.#{r[:infer_other]}}).flatten.uniq
66
- end
67
- EOS
68
- end
69
- end
70
- if r[:add]
71
- module_eval(<<-EOS, "(__AR_DELEGATOR_DEFINE_ASSOCIATION_ADD_REMOVE__)", 1)
72
- def add_#{r[:add]}(t)
73
- a = self.topic_map.create_association("#{r[:association_type]}")
74
- a.create_role self, "#{r[:role_type]}"
75
- a.create_role t, "#{r[:other_role_type]}"
76
- a
77
- # TODO add_x in define_association needs to trigger reload of the topics somewhere
78
- end
79
- def remove_#{r[:add]}(t)
80
- direct_#{prop}_roles.select{|r| r.player == t}.each{|r| r.parent.remove}
81
- # TODO remove_x in define_association needs to trigger reload of the topics somewhere
82
- end
83
- EOS
84
- end
85
- end
86
- end
87
- end
data/lib/rtm/base.rb DELETED
@@ -1,92 +0,0 @@
1
- module RTM
2
- def self.create(base_locator)
3
- AR::TopicMap.create(base_locator)
4
- end
5
-
6
- def self.topic_maps
7
- AR::TopicMap.topic_maps
8
- end
9
-
10
- def self.[](*args)
11
- if args.size == 0
12
- return AR::TopicMap.topic_maps
13
- end
14
- AR::TopicMap.topic_maps[*args]
15
- end
16
- module TopicMapConstruct
17
- def find(*args)
18
- RTM::AR.const_get(name.split("::").last).find(*args)
19
- end
20
- end
21
- module Reifiable
22
- end
23
-
24
- module TopicMap
25
- extend TopicMapConstruct
26
- end
27
-
28
- module Topic
29
- extend TopicMapConstruct
30
-
31
- end
32
-
33
- module Association
34
- extend TopicMapConstruct
35
-
36
- end
37
-
38
- module AssociationRole
39
- extend TopicMapConstruct
40
-
41
- end
42
-
43
- module TopicName
44
- extend TopicMapConstruct
45
-
46
- end
47
-
48
- module Variant
49
- extend TopicMapConstruct
50
-
51
- end
52
-
53
- module Occurrence
54
- extend TopicMapConstruct
55
-
56
- end
57
-
58
- module Locator
59
-
60
- end
61
-
62
- module ItemIdentifier
63
- extend Locator
64
- end
65
-
66
- module SubjectIdentifier
67
- extend Locator
68
- end
69
-
70
- module SubjectLocator
71
- extend Locator
72
- end
73
-
74
- # module Topics
75
- # end
76
- # module Associations
77
- # end
78
- # module TopicNames
79
- # end
80
- # module Occurrences
81
- # end
82
- # module AssociationRoles
83
- # end
84
- # module Reifiables
85
- # end
86
- # module Variants
87
- # end
88
- # module TopicMaps
89
- # end
90
- # module Locators
91
- # end
92
- end
data/lib/rtm/connect.rb DELETED
@@ -1,92 +0,0 @@
1
- require 'active_record'
2
- require 'rtm/backend/active_record/001_initial_schema'
3
- module RTM
4
-
5
- # Assignes a logger to active record (or STDOUT as default) which outputs
6
- # the sql statements.
7
- def self.log(to=STDOUT)
8
- ActiveRecord::Base.logger = Logger.new(to)
9
- ActiveRecord::Base.colorize_logging = false if PLATFORM =~ /mswin/
10
- end
11
- # This function generates the database schema using the default
12
- # ActiveRecord connection.
13
- def self.generate_database
14
- RTM::AR::TMDM::InitialSchema.migrate(:up)
15
- end
16
-
17
- # Connects to the sqlite3 database given in the path or to
18
- # a default database if no path is given.
19
- def self.connect_sqlite3(dbname="tmdm.sqlite3")
20
- ActiveRecord::Base.establish_connection(
21
- :adapter => platform_specific_adapter("sqlite3"),
22
- :database => dbname
23
- )
24
- end
25
-
26
- # Connects to the sqlite2 database given in the path or to
27
- # a default database if no path is given.
28
- def self.connect_sqlite(dbname="tmdm.sqlite2")
29
- ActiveRecord::Base.establish_connection(
30
- :adapter => platform_specific_adapter("sqlite"),
31
- :database => dbname
32
- )
33
- end
34
- # Connects to a mysql database. Parameters are
35
- # either
36
- # database, username, password, host
37
- # or
38
- # only a keyword hash with these parameters.
39
- def self.connect_mysql(database="rtm_development", username=nil, password=nil, host="localhost")
40
- if database.is_a? Hash
41
- return ActiveRecord::Base.establish_connection(database)
42
- end
43
- ActiveRecord::Base.establish_connection(
44
- :adapter => platform_specific_adapter("mysql"),
45
- :database => database,
46
- :username => username,
47
- :password => password,
48
- :host => host
49
- )
50
- end
51
-
52
- # Connects to a in-memory database. No parameters required.
53
- # Schema will automatically be generated.
54
- def self.connect_memory
55
- ActiveRecord::Base.establish_connection(
56
- :adapter => platform_specific_adapter("sqlite3"),
57
- :database => ":memory:"
58
- )
59
- no_output do
60
- generate_database
61
- end
62
- true
63
- end
64
-
65
- # Connects to a in-memory sqlite2 database, as connect_memory does with sqlite3
66
- def self.connect_memory2
67
- ActiveRecord::Base.establish_connection(
68
- :adapter => platform_specific_adapter("sqlite"),
69
- :database => ":memory:"
70
- )
71
- no_output do
72
- generate_database
73
- end
74
- true
75
- end
76
-
77
- # Connects Active Record to a database or in Memory database if no parameters given.
78
- def self.connect(*args)
79
- if args.size == 0
80
- return connect_memory
81
- end
82
- ActiveRecord::Base.establish_connection(*args)
83
- end
84
-
85
- private
86
- def self.platform_specific_adapter(adapter)
87
- if PLATFORM && PLATFORM =~ /java/
88
- return "jdbc#{adapter}"
89
- end
90
- return adapter
91
- end
92
- end
data/lib/rtm/core_ext.rb DELETED
@@ -1,6 +0,0 @@
1
- # already defined in active support
2
- #class Symbol
3
- # def to_proc
4
- # Proc.new { |obj, *args| obj.send(self, *args) }
5
- # end
6
- #end
@@ -1,263 +0,0 @@
1
- # Ruby Topic Maps (RTM) http://rtm.rubyforge.org/
2
-
3
- module RTM
4
- def self.from_xtm2(*args)
5
- RTM::IO::FROMXTM2.from_xtm2(*args)
6
- end
7
- end
8
- module RTM::IO
9
- # XTM2 Export.
10
- # Each Topic Maps Construct gets a to_xtm2 method.
11
- # The result is a REXML::Element except for TopicMap where it is a REXML::Document.
12
- module FROMXTM2
13
- require 'rexml/document'
14
- require 'rexml/parsers/sax2parser'
15
- require 'rexml/sax2listener'
16
- #require 'jrexml'
17
- XTM2DEBUG = false
18
-
19
- # Reads XTM2 from source (io object).
20
- # Example: RTM::IO::FROMXTM2.from_xtm2(File.open(file_name),"http://rtm.rubyforge.org/topicmaps/tm1/")
21
- # supported options:
22
- # :strip_whitespace (defaults to false, may be set to true),
23
- # :deprefix (defaults to nil, may be set to a string (or regex) which will be removed from the beginning of an (unresolved) item_identifier if it is there.
24
- def self.from_xtm2(source, base_locator, target=nil,options={})
25
- tm = RTM.create(base_locator) unless target
26
- list = XTM2Listener.new(base_locator, target || tm, options)
27
- parser = REXML::Parsers::SAX2Parser.new(source)
28
- parser.listen(list)
29
- parser.parse
30
- true
31
- end
32
-
33
- class XTM2Listener
34
- include REXML::SAX2Listener
35
- def initialize(base_locator, target,options={})
36
- @base_locator = base_locator
37
- @target = target
38
- @targets = []
39
- @path = []
40
- @options=options
41
- end
42
-
43
- private
44
- def resolve(iri)
45
- warn("resolving nil iri can have unexpected results") unless iri
46
- # TODO handle %HH sequences, here or in backend/active_record.rb
47
- if @options[:deprefix]
48
- iri = iri.gsub(/^#{@options[:deprefix]}/,'')
49
- end
50
- @target.resolve(iri, @base_locator)
51
- end
52
-
53
- public
54
- def start_element(uri, name, qname, attrs)
55
- return unless uri == "http://www.topicmaps.org/xtm/"
56
- a = attrs #Hash[* attrs.flatten]
57
- #puts "Start of tag #{name} - attrs: #{a.inspect}"
58
-
59
- case name
60
- when "topic"
61
- @topic = @targets.last.topic_by_item_identifier! resolve(a["id"])
62
- @targets.push @topic
63
- when "association"
64
- assoc = nil
65
- if a["reifier"]
66
- ref = @targets.last.topic_map.topic_by_item_identifier! resolve(a["reifier"])
67
- raise "The topic reifiing this association already reifies something else: #{ref}." if ref.reified && !ref.reified.is_a?(RTM::Association)
68
- if ref.reified
69
- assoc = ref.reified
70
- else
71
- assoc = @targets.last.create_association
72
- assoc.reifier = ref
73
- end
74
- end
75
- assoc ||= @targets.last.create_association
76
- @targets.push assoc
77
- when "role"
78
- if a["reifier"]
79
- ref = @targets.last.topic_map.topic_by_item_identifier! resolve(a["reifier"])
80
- raise "The topic reifiing this association role already reifies something else: #{ref}." if ref.reified && !ref.reified.is_a?(RTM::AssociationRole)
81
- if ref.reified
82
- role = ref.reified
83
- else
84
- role = @targets.last.create_role
85
- role.reifier = ref
86
- end
87
- end
88
- role ||= @targets.last.create_role
89
- @targets.push role
90
- when "name"
91
- if a["reifier"]
92
- ref = @targets.last.topic_map.topic_by_item_identifier! resolve(a["reifier"])
93
- raise "The topic reifiing this topic name already reifies something else: #{ref}." if ref.reified && !ref.reified.is_a?(RTM::TopicName)
94
- if ref.reified
95
- tname = ref.reified
96
- else
97
- tname = @targets.last.create_name
98
- tname.reifier = ref
99
- end
100
- end
101
- tname ||= @targets.last.create_name
102
- @targets.push tname
103
- when "value"
104
- # this is handled in text()
105
- when "variant"
106
- if a["reifier"]
107
- ref = @targets.last.topic_map.topic_by_item_identifier! resolve(a["reifier"])
108
- raise "The topic reifiing this topic variant already reifies something else: #{ref}." if ref.reified && !ref.reified.is_a?(RTM::Variant)
109
- if ref.reified
110
- variant = ref.reified
111
- else
112
- variant = @targets.last.create_variant
113
- variant.reifier = ref
114
- end
115
- end
116
- variant ||= @targets.last.create_variant
117
- @targets.push variant
118
- when "scope"
119
- # nothing to be done here :)
120
- when "instanceOf"
121
- # nothing to be done here :)
122
- when "type"
123
- # nothing to be done here :)
124
- when "occurrence"
125
- if a["reifier"]
126
- ref = @targets.last.topic_map.topic_by_item_identifier! resolve(a["reifier"])
127
- raise "The topic reifiing this topic occurrence already reifies something else: #{ref}." if ref.reified && !ref.reified.is_a?(RTM::Occurrence)
128
- if ref.reified
129
- occur = ref.reified
130
- else
131
- occur = @targets.last.create_occurrence
132
- occur.reifier = ref
133
- end
134
- end
135
- occur ||= @targets.last.create_occurrence
136
- @targets.push occur
137
- when "resourceData"
138
- occur_or_variant = @targets.last
139
- if a["datatype"]
140
- occur_or_variant.datatype = a["datatype"]
141
- # special handling is done in tag_end
142
- else
143
- occur_or_variant.datatype = RTM::PSI[:String]
144
- end
145
- when "topicRef"
146
- case @path.last
147
- when "scope"
148
- @targets.last.scope << a["href"]
149
- when "instanceOf"
150
- assoc = @targets.last.topic_map.create_association :type => RTM::PSI[:type_instance]
151
- assoc.create_role @targets.last, RTM::PSI[:instance]
152
- assoc.create_role a["href"], RTM::PSI[:type]
153
- when "type"
154
- @targets.last.type = a["href"]
155
- when "role"
156
- @targets.last.player = a["href"]
157
- end
158
- when "resourceRef"
159
- occurrence = @targets.last
160
- occurrence.datatype = RTM::PSI[:IRI]
161
- occurrence.value = a["href"]
162
- when "subjectLocator"
163
- @targets.last.subject_locators << a["href"]
164
- when "subjectIdentifier"
165
- @targets.last.subject_identifiers << a["href"]
166
- when "itemIdentity"
167
- @targets.last.item_identifiers << resolve(a["href"])
168
- when "topicMap"
169
- # check where we are
170
- raise "unexpected element topicMap" unless @path.empty?
171
- # check version
172
- raise "Sorry, only XTM 2.0 is supported" if a["version"] != "2.0"
173
-
174
- # reifier. if target topic map is already reified we have to merge, if not create topic
175
- if a["reifier"]
176
- if @target.reifier # TODO this might be no topic here. In this case something should be raised!
177
- @target.reifier.item_identifiers << resolve(a["reifier"])
178
- else
179
- @target.topic_by_item_identifier! resolve(a["reifier"])
180
- end
181
- end
182
- @targets.push @target
183
- when "mergeMap"
184
- # TODO mergeMap
185
- warn "mergeMap is not supported yet!"
186
- else
187
- warn "Unhandled element: #{name}"
188
- end
189
-
190
- @path.push name
191
- end
192
-
193
- # Called when the end tag is reached. In the case of <tag/>, tag_end
194
- # will be called immidiately after tag_start
195
- # @p the name of the tag
196
- def end_element(uri, name, qname)
197
- return unless uri == "http://www.topicmaps.org/xtm/"
198
- #puts "end of tag: #{name}"
199
-
200
- old_name = @path.pop
201
- raise "Tag_end did not match: expected: #{old_name}, got: #{name}." unless old_name == name
202
- case name
203
- when "topicMap", "topic", "association", "role", "name", "variant", "occurrence"
204
- @targets.pop
205
- when "resourceData"
206
- occur = @targets.last
207
- # puts "finalizing occurrence #{occur.inspect}"
208
- if occur.datatype == RTM::PSI[:IRI]
209
- occur.value = resolve(occur.value)
210
- elsif occur.datatype == RTM::PSI[:anyType]
211
- # TODO Content must be canonicalized according to http://www.isotopicmaps.org/sam/sam-xtm/#sect-xml-canonicalization
212
- warn("Content canonicalization is not yet implemented!")
213
- end
214
- # puts "leaving finalizing occurrence"
215
- end
216
- # puts "after case"
217
- end
218
- # Called when text is encountered in the document
219
- # @p text the text content.
220
- def characters(text)
221
- if @options[:strip_whitespace]
222
- text.strip!
223
- return if text.empty?
224
- end
225
- case @path.last
226
- when "value", "resourceData"
227
- if @targets.last.value
228
- @targets.last.value += text
229
- else
230
- @targets.last.value = text
231
- end
232
- else
233
- puts "Found text but don't know that to do: #{text}" unless text.strip.empty?
234
- end
235
- end
236
-
237
- def cdata content
238
- if @options[:strip_whitespace]
239
- content.strip!
240
- return if content.empty?
241
- end
242
- case @path.last
243
- when "value", "resourceData"
244
- if @targets.last.value
245
- @targets.last.value += content
246
- else
247
- @targets.last.value = content
248
- end
249
- else
250
- puts "Found cdata but don't know that to do: #{content}" unless content.strip.empty?
251
- end
252
- end
253
-
254
- def xmldecl version, encoding, standalone
255
- warn "XML Version 1.0 expected. Not sure if we can handle this, but we will try." unless version == "1.0"
256
- warn "Be aware there is no encoding manipulation done, everything gets in as-is." if encoding
257
- # what about standalone?
258
- end
259
-
260
- end
261
-
262
- end
263
- end