rtm 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. data/README +38 -3
  2. data/lib/rtm.rb +25 -47
  3. data/lib/rtm/axes.rb +7 -4
  4. data/lib/rtm/axes/association.rb +1 -1
  5. data/lib/rtm/axes/associations.rb +1 -1
  6. data/lib/rtm/axes/characteristic.rb +1 -1
  7. data/lib/rtm/axes/characteristics.rb +1 -1
  8. data/lib/rtm/axes/topic.rb +3 -3
  9. data/lib/rtm/axes/topics.rb +3 -3
  10. data/lib/rtm/engine.rb +48 -5
  11. data/lib/rtm/extensions.rb +58 -8
  12. data/lib/rtm/io.rb +2 -1
  13. data/lib/rtm/io/tmapix_from.rb +155 -0
  14. data/lib/rtm/io/tmapix_to.rb +223 -0
  15. data/lib/rtm/io/to_hash.rb +79 -41
  16. data/lib/rtm/io/to_jtm.rb +1 -1
  17. data/lib/rtm/io/to_rdf.rb +20 -5
  18. data/lib/rtm/io/to_string.rb +13 -2
  19. data/lib/rtm/io/to_yaml.rb +39 -11
  20. data/lib/rtm/navigation.rb +1 -15
  21. data/lib/rtm/navigation/association/players.rb +1 -1
  22. data/lib/rtm/navigation/name/characteristics.rb +1 -1
  23. data/lib/rtm/navigation/occurrence/characteristics.rb +1 -1
  24. data/lib/rtm/navigation/topic/characteristics.rb +1 -1
  25. data/lib/rtm/navigation/topic/players.rb +1 -1
  26. data/lib/rtm/navigation/topic/supertypes.rb +21 -17
  27. data/lib/rtm/navigation/topic/traverse.rb +1 -1
  28. data/lib/rtm/navigation/topic/types.rb +6 -4
  29. data/lib/rtm/psi.rb +6 -0
  30. data/lib/rtm/sugar.rb +42 -29
  31. data/lib/rtm/sugar/association/hash_access.rb +3 -3
  32. data/lib/rtm/sugar/occurrence/dynamic_value.rb +39 -56
  33. data/lib/rtm/sugar/occurrence/external.rb +53 -0
  34. data/lib/rtm/sugar/reifiable/reifier.rb +21 -0
  35. data/lib/rtm/sugar/role/counterparts.rb +12 -6
  36. data/lib/rtm/sugar/topic/best_name.rb +74 -0
  37. data/lib/rtm/sugar/topic/characteristics.rb +10 -10
  38. data/lib/rtm/sugar/topic/counterparts.rb +131 -119
  39. data/lib/rtm/sugar/topic/scoped.rb +102 -53
  40. data/lib/rtm/sugar/topic/topic_ref.rb +63 -12
  41. data/lib/rtm/sugar/topic/typed.rb +50 -2
  42. data/lib/rtm/sugar/topic_map/query_cache.rb +66 -0
  43. data/lib/rtm/sugar/topic_map/themes.rb +53 -0
  44. data/lib/rtm/sugar/typed/types.rb +1 -1
  45. data/lib/rtm/validation.rb +2 -2
  46. data/lib/rtm/version.rb +18 -6
  47. data/spec/rtm/axes/string_spec.rb +7 -7
  48. data/spec/rtm/axes/strings_spec.rb +10 -10
  49. data/spec/rtm/io/tmapix_from_spec.rb +76 -0
  50. data/spec/rtm/io/tmapix_to_spec.rb +159 -0
  51. data/spec/rtm/io/to_hash_spec.rb +90 -0
  52. data/spec/rtm/io/to_rdf_spec.rb +37 -0
  53. data/spec/rtm/io/to_string_spec.rb +122 -0
  54. data/spec/rtm/io/to_yaml_spec.rb +89 -0
  55. data/spec/rtm/sugar/occurrence/dynamic_value_spec.rb +156 -1
  56. data/spec/rtm/sugar/occurrence/external_spec.rb +129 -0
  57. data/spec/rtm/sugar/reifiable/reifier_spec.rb +41 -0
  58. data/spec/rtm/sugar/role/counterparts_spec.rb +174 -172
  59. data/spec/rtm/sugar/topic/best_name_spec.rb +25 -0
  60. data/spec/rtm/sugar/topic/characteristics_spec.rb +20 -5
  61. data/spec/rtm/sugar/topic/counterparts_spec.rb +41 -1
  62. data/spec/rtm/sugar/topic/hash_access_spec.rb +1 -1
  63. data/spec/rtm/sugar/topic/scoped_spec.rb +178 -114
  64. data/spec/rtm/sugar/topic/topic_ref_spec.rb +10 -10
  65. data/spec/rtm/sugar/topic/typed_spec.rb +196 -134
  66. data/spec/rtm/sugar/topic_map/themes_spec.rb +67 -0
  67. data/spec/rtm/sugar/typed/types_spec.rb +1 -1
  68. data/spec/rtm/tmapi/core/association_spec.rb +2 -2
  69. data/spec/rtm/tmapi/core/datatype_aware_spec.rb +236 -0
  70. data/spec/rtm/tmapi/core/name_spec.rb +186 -1
  71. data/spec/rtm/tmapi/core/occurrence_spec.rb +24 -67
  72. data/spec/rtm/tmapi/core/reifiable_spec.rb +2 -2
  73. data/spec/rtm/tmapi/core/scoped_spec.rb +40 -2
  74. data/spec/rtm/tmapi/core/topic_map_spec.rb +98 -30
  75. data/spec/rtm/tmapi/core/topic_spec.rb +558 -82
  76. data/spec/rtm/tmapi/core/variant_spec.rb +3 -3
  77. data/spec/rtm_spec.rb +0 -1
  78. data/spec/spec_helper.rb +7 -2
  79. data/test/javalibs/junit-4.5.jar +0 -0
  80. data/test/javalibs/tmapi-2.0-tests.jar +0 -0
  81. data/test/tmapi_tests.rb +25 -0
  82. metadata +66 -11
  83. data/lib/rtm/io/ontopia_io.rb +0 -25
  84. data/lib/rtm/io/tmapix.rb +0 -234
  85. data/lib/rtm/sugar/occurrence/externalize.rb +0 -31
  86. data/spec/rtm/io/tmapix_spec.rb +0 -85
  87. data/test/base_unit_test.rb +0 -161
  88. data/test/base_unit_test_tmapi.rb +0 -165
@@ -1,65 +1,114 @@
1
1
  # Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
2
2
  # License: Apache License, Version 2.0
3
3
 
4
- module Sugar
5
- module Topic
6
- module Scoped
4
+ module RTM::Sugar::Topic
5
+ module Scoped
7
6
 
8
- # Returns the Associations, Names, Occurrences and Variants
9
- # whose scope contains this Topic. Beware: The scope of a Variant includes
10
- # the themes of the Name this Variant belongs to.
11
- #
12
- # :call-seq:
13
- # scoped -> Array of Associations, Names, Occurrences and Variants
14
- #
15
- def scoped
16
- _index = topic_map.scoped_index
17
- _index.get_associations(self).to_a + _index.get_names(self).to_a + _index.get_occurrences(self).to_a + _index.get_variants(self).to_a
18
- end
7
+ # Returns the Associations, Names, Occurrences and Variants
8
+ # whose scope contains this Topic. Beware: The scope of a Variant includes
9
+ # the themes of the Name this Variant belongs to.
10
+ #
11
+ # :call-seq:
12
+ # scoped -> Array of Associations, Names, Occurrences and Variants
13
+ #
14
+ def scoped
15
+ _index = scoped_index
16
+ _index.get_associations(self).to_a + _index.get_names(self).to_a + _index.get_occurrences(self).to_a + _index.get_variants(self).to_a
17
+ end
18
+
19
+ # Returns the Associations whose scope contains this Topic.
20
+ #
21
+ # The result may be empty.
22
+ #
23
+ # :call-seq:
24
+ # scoped_associations -> Array of Associations
25
+ #
26
+ def scoped_associations
27
+ scoped_index.get_associations(self).to_a
28
+ end
29
+
30
+ # Returns the Names whose scope contains this Topic.
31
+ #
32
+ # The result may be empty.
33
+ #
34
+ # :call-seq:
35
+ # scoped_names -> Array of Names
36
+ #
37
+ def scoped_names
38
+ scoped_index.get_names(self).to_a
39
+ end
40
+
41
+ # Returns the Occurrences whose scope contains this Topic.
42
+ #
43
+ # :call-seq:
44
+ # scoped_occurrences -> Array of Occurrences
45
+ #
46
+ def scoped_occurrences
47
+ scoped_index.get_occurrences(self).to_a
48
+ end
19
49
 
20
- # Returns the Associations whose scope contains this Topic.
21
- #
22
- # The result may be empty.
23
- #
24
- # :call-seq:
25
- # scoped_associations -> Array of Associations
26
- #
27
- def scoped_associations
28
- topic_map.scoped_index.get_associations(self).to_a
29
- end
50
+ # Returns the Variants whose scope (including the scope of the parent Name)
51
+ # contains this Topic.
52
+ #
53
+ # The result may be empty.
54
+ #
55
+ # :call-seq:
56
+ # scoped_variants -> Array of Variants
57
+ #
58
+ def scoped_variants
59
+ scoped_index.get_variants(self).to_a
60
+ end
30
61
 
31
- # Returns the Names whose scope contains this Topic.
32
- #
33
- # The result may be empty.
34
- #
35
- # :call-seq:
36
- # scoped_names -> Array of Names
37
- #
38
- def scoped_names
39
- topic_map.scoped_index.get_names(self).to_a
40
- end
62
+ # States if this topic occurs as theme in the scope of a scoped Construct.
63
+ #
64
+ # :call-seq:
65
+ # used_as_theme? -> true or false
66
+ #
67
+ def used_as_theme?
68
+ used_as_name_theme? || used_as_occurrence_theme? || used_as_association_theme? || used_as_variant_theme?
69
+ end
41
70
 
42
- # Returns the Occurrences whose scope contains this Topic.
43
- #
44
- # :call-seq:
45
- # scoped_occurrences -> Array of Occurrences
46
- #
47
- def scoped_occurrences
48
- topic_map.scoped_index.get_occurrences(self).to_a
49
- end
71
+ # States if this topic occurs as theme in the scope of an Association.
72
+ #
73
+ # :call-seq:
74
+ # used_as_association_theme? -> true or false
75
+ #
76
+ def used_as_association_theme?
77
+ not self.scoped_associations.empty?
78
+ end
79
+
80
+ # States if this topic occurs as theme in the scope of a Name.
81
+ #
82
+ # :call-seq:
83
+ # used_as_name_theme? -> true or false
84
+ #
85
+ def used_as_name_theme?
86
+ not self.scoped_names.empty?
87
+ end
88
+
89
+ # States if this topic occurs as theme in the scope of an Occurrence.
90
+ #
91
+ # :call-seq:
92
+ # used_as_occurrence_theme? -> true or false
93
+ #
94
+ def used_as_occurrence_theme?
95
+ not self.scoped_occurrences.empty?
96
+ end
50
97
 
51
- # Returns the Variants whose scope (including the scope of the parent Name)
52
- # contains this Topic.
53
- #
54
- # The result may be empty.
55
- #
56
- # :call-seq:
57
- # scoped_variants -> Array of Variants
58
- #
59
- def scoped_variants
60
- topic_map.scoped_index.get_variants(self).to_a
61
- end
98
+ # States if this topic occurs as theme in the scope of a Variant.
99
+ #
100
+ # :call-seq:
101
+ # used_as_variant_theme? -> true or false
102
+ #
103
+ def used_as_variant_theme?
104
+ not self.scoped_variants.empty?
105
+ end
62
106
 
107
+ private
108
+ def scoped_index
109
+ @scoped_index ||= topic_map.scoped_index
63
110
  end
111
+
64
112
  end
65
113
  end
114
+
@@ -1,32 +1,83 @@
1
1
  # Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
2
2
  # License: Apache License, Version 2.0
3
3
 
4
- module Sugar
4
+ module RTM::Sugar
5
5
  module Topic
6
6
  module TopicRef
7
7
 
8
8
  # Returns an Array including all identifiers of this Topic.
9
- # Item identifiers start with a "^", subject locators start
10
- # with a "=", subject identifiers contain no prefix.
9
+ #
10
+ # This method takes a Hash as argument.
11
+ #
12
+ # The key :ouputstyle defines if the ctm style (value :ctm, this is
13
+ # the default), the YAML
14
+ # style (value :yaml) or no style (value :blank) is supported.
15
+ #
16
+ # In ctm style an item identifier starts with a "^",
17
+ # a subject locator starts with a "=" and
18
+ # a subject identifiers contains no prefix.
19
+ #
20
+ # In yaml style an item identifiers start with a "ii:",
21
+ # a subject locator starts with a "sl:" and
22
+ # a subject identifier start with a "si:".
11
23
  #
12
24
  # :call-seq:
13
- # topic_references -> Array of Strings
25
+ # references -> Array of Strings
26
+ # references(params = {}) -> Array of Strings
14
27
  #
15
- def topic_references
16
- #def identifiers
17
- subject_identifiers.map{|si| si.reference} +
18
- subject_locators.map{|sl| "=#{sl.reference}"} +
19
- item_identifiers.map{|ii| "^#{ii.reference}"}
28
+ def references(params = {})
29
+ default_hash = {:outputstyle => :ctm, :resolve_qnames => :false}
30
+ params = default_hash.merge(params) if params.is_a? Hash
31
+
32
+ case params[:outputstyle]
33
+ when :yaml
34
+ identifiers = subject_identifiers.map{|si| "si:#{si.reference}"} +
35
+ subject_locators.map{ |sl| "sl:#{sl.reference}"} +
36
+ item_identifiers.map{ |ii| "ii:#{ii.reference}"}
37
+ when :blank
38
+ identifiers = subject_identifiers.map{|si| si.reference} +
39
+ subject_locators.map{ |sl| sl.reference} +
40
+ item_identifiers.map{ |ii| ii.reference}
41
+ else #:ctm default
42
+ identifiers = subject_identifiers.map{|si| si.reference} +
43
+ subject_locators.map{ |sl| "=#{sl.reference}"} +
44
+ item_identifiers.map{ |ii| "^#{ii.reference}"}
45
+ end
46
+ return identifiers
20
47
  end
21
48
 
49
+ # Returns one identifier of this topic. If several exist, the shortest one
50
+ # is returned.
51
+ #
52
+ # This method takes a Hash as argument.
53
+ #
54
+ # The key :ouputstyle defines if the ctm style (value :ctm, this is
55
+ # the default), the YAML
56
+ # style (value :yaml) or no style (value :blank) is supported.
57
+ #
58
+ # In ctm style an item identifier starts with a "^",
59
+ # a subject locator starts with a "=" and
60
+ # a subject identifiers contains no prefix.
61
+ #
62
+ # In yaml style an item identifiers start with a "ii:",
63
+ # a subject locator starts with a "sl:" and
64
+ # a subject identifier start with a "si:".
65
+ #
66
+ #
67
+ # :call-seq:
68
+ # reference -> String
69
+ # reference(params = {}) -> String
70
+ #
71
+ def reference(params = {})
72
+ return references(params).sort_by{|identifier| identifier.size}.reverse.first
73
+ end
22
74
 
23
75
  # Returns all identifiers of this Topic as Array of Locators.
24
76
  #
25
77
  # :call-seq:
26
- # topic_references_as_locators -> Array of Locators
78
+ # references_as_locators -> Array of Locators
27
79
  #
28
- def topic_references_as_locators
29
- # TODO Spec
80
+ def references_as_locators
30
81
  subject_identifiers.to_a + subject_locators.to_a + item_identifiers.to_a
31
82
  end
32
83
 
@@ -1,7 +1,7 @@
1
1
  # Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
2
2
  # License: Apache License, Version 2.0
3
3
 
4
- module Sugar
4
+ module RTM::Sugar
5
5
  module Topic
6
6
  module Typed
7
7
 
@@ -152,8 +152,56 @@ module Sugar
152
152
  # topic_is_a?(type)
153
153
  #
154
154
  def topic_is_a?(type)
155
- self.transitive_types.include?(topic_map.get(type))
155
+ topic_map.cached self, :is_a?, type do
156
+ self.transitive_types.include?(topic_map.get(type))
157
+ end
158
+ end
159
+
160
+ # States if this topic is used as type of a typed Construct.
161
+ #
162
+ # :call-seq:
163
+ # used_as_type? -> true or false
164
+ #
165
+ def used_as_type?
166
+ used_as_name_type? || used_as_occurrence_type? || used_as_association_type? || used_as_role_type?
167
+ end
168
+
169
+ # States if this topic is used as type of an Association.
170
+ #
171
+ # :call-seq:
172
+ # used_as_association_type? -> true or false
173
+ #
174
+ def used_as_association_type?
175
+ not self.typed_associations.empty?
156
176
  end
177
+
178
+ # States if this topic is used as type of a Name.
179
+ #
180
+ # :call-seq:
181
+ # used_as_name_type? -> true or false
182
+ #
183
+ def used_as_name_type?
184
+ not self.typed_names.empty?
185
+ end
186
+
187
+ # States if this topic is used as type of an Occurrence.
188
+ #
189
+ # :call-seq:
190
+ # used_as_occurrence_type -> true or false
191
+ #
192
+ def used_as_occurrence_type?
193
+ not self.typed_occurrences.empty?
194
+ end
195
+
196
+ # States if this topic is used as type of a Role.
197
+ #
198
+ # :call-seq:
199
+ # used_as_role_type? -> true or false
200
+ #
201
+ def used_as_role_type?
202
+ not self.typed_roles.empty?
203
+ end
204
+
157
205
  end
158
206
  end
159
207
  end
@@ -0,0 +1,66 @@
1
+ # Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
2
+ # License: Apache License, Version 2.0
3
+
4
+ module RTM::Sugar
5
+ module TopicMap
6
+ module QueryCache
7
+
8
+ # The query cache is disabled by default. Enables the query cache.
9
+ # Does not erase the cache if it was already enabled.
10
+ #
11
+ # :call-seq:
12
+ # enable_query_cache -> nil
13
+ #
14
+ def enable_query_cache
15
+ @query_cache ||= {}
16
+ return
17
+ end
18
+
19
+ # The query cache is disabled by default. Disables the query cache.
20
+ #
21
+ # :call-seq:
22
+ # disable_query_cache -> nil
23
+ #
24
+ def disable_query_cache
25
+ @query_cache = nil # FIXME: This method is unsafe in multithreaded environments: Setting "@query_cache = nil" while @query_cache is being accessed in method "cached" may cause exceptions to be raised.
26
+ return
27
+ end
28
+
29
+ # Erases the query cache. This needs to be invoked every time there
30
+ # is a write access to the topic map.
31
+ #
32
+ # :call-seq:
33
+ # reset_query_cache -> nil
34
+ #
35
+ def reset_query_cache
36
+ @query_cache = @query_cache? {} : nil
37
+ return
38
+ end
39
+
40
+ # If query caching is enabled, looks up the result of
41
+ # module_name.method_name(parameters) in the cache and if present,
42
+ # returns it. If
43
+ # the result has not yet been stored, executes module_name.method_name(parameters),
44
+ # stores the result and returns it.
45
+ #
46
+ # If query caching is disabled, executes module_name.method_name(parameters)
47
+ # and returns the result.
48
+ #
49
+ # :call-seq:
50
+ # cached(module_name, method_name, parameters) {method_body} -> result
51
+ #
52
+ def cached(*args)
53
+ if @query_cache # Maybe we can optimize this simple if statement away by making enable_query_cache extend the particular TopicMap instance's metaclass. But maybe then the cached version is slower.
54
+ result = @query_cache.fetch(args,:not_found) # :not_found if not cached, if result is nil, we want to cache nil as well.
55
+ if result==:not_found
56
+ result = yield
57
+ @query_cache[args] = result
58
+ end
59
+ return result
60
+ else
61
+ yield #execute without caching
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,53 @@
1
+ # Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
2
+ # License: Apache License, Version 2.0
3
+
4
+
5
+ module RTM::Sugar
6
+ module TopicMap
7
+ module Themes
8
+
9
+ # Returns all topics in the topic map used
10
+ # in the scope property of Associations.
11
+ #
12
+ # The result may be empty.
13
+ #
14
+ # :call-seq:
15
+ # association_themes -> Array of Topics
16
+ #
17
+ def association_themes
18
+ scoped_index.get_association_themes.to_a
19
+ end
20
+
21
+ # Returns all topics in the topic map used
22
+ # in the scope property of Names.
23
+ #
24
+ # :call-seq:
25
+ # name_themes -> Array of Topics
26
+ #
27
+ def name_themes
28
+ scoped_index.get_name_themes.to_a
29
+ end
30
+
31
+ # Returns all topics in the topic map used
32
+ # in the scope property of Occurrences.
33
+ #
34
+ # :call-seq:
35
+ # occurrence_themes -> Array of Topics
36
+ #
37
+ def occurrence_themes
38
+ scoped_index.get_occurrence_themes.to_a
39
+ end
40
+
41
+ # Returns all topics in the topic map used
42
+ # in the scope property of Variants.
43
+ #
44
+ # :call-seq:
45
+ # variant_themes -> Array of Topics
46
+ #
47
+ def variant_themes
48
+ scoped_index.get_variant_themes.to_a
49
+ end
50
+
51
+ end
52
+ end
53
+ end