rtm-javatmapi 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. data/DISCLAIMER +13 -0
  2. data/LICENSE +201 -0
  3. data/README +4 -0
  4. data/lib/rtm/javatmapi.rb +189 -0
  5. data/lib/rtm/javatmapi/aliases.rb +43 -0
  6. data/lib/rtm/javatmapi/base.rb +30 -0
  7. data/lib/rtm/javatmapi/core.rb +16 -0
  8. data/lib/rtm/javatmapi/core/association.rb +71 -0
  9. data/lib/rtm/javatmapi/core/construct.rb +68 -0
  10. data/lib/rtm/javatmapi/core/locator.rb +24 -0
  11. data/lib/rtm/javatmapi/core/name.rb +101 -0
  12. data/lib/rtm/javatmapi/core/occurrence.rb +56 -0
  13. data/lib/rtm/javatmapi/core/reifiable.rb +48 -0
  14. data/lib/rtm/javatmapi/core/role.rb +49 -0
  15. data/lib/rtm/javatmapi/core/scoped.rb +99 -0
  16. data/lib/rtm/javatmapi/core/topic.rb +454 -0
  17. data/lib/rtm/javatmapi/core/topic_map.rb +632 -0
  18. data/lib/rtm/javatmapi/core/topic_map_system.rb +6 -0
  19. data/lib/rtm/javatmapi/core/typed.rb +31 -0
  20. data/lib/rtm/javatmapi/core/variant.rb +19 -0
  21. data/lib/rtm/javatmapi/ext.rb +4 -0
  22. data/lib/rtm/javatmapi/ext/java_util_set.rb +10 -0
  23. data/lib/rtm/javatmapi/inclusion.rb +46 -0
  24. data/lib/rtm/javatmapi/java_implementations.rb +40 -0
  25. data/lib/rtm/javatmapi/javalibs/asm-2.2.3.jar +0 -0
  26. data/lib/rtm/javatmapi/javalibs/asm-commons-2.2.3.jar +0 -0
  27. data/lib/rtm/javatmapi/javalibs/ctm-writer-1.0.0a.jar +0 -0
  28. data/lib/rtm/javatmapi/javalibs/jing.jar +0 -0
  29. data/lib/rtm/javatmapi/javalibs/json_simple.jar +0 -0
  30. data/lib/rtm/javatmapi/javalibs/log4j-1.2.14.jar +0 -0
  31. data/lib/rtm/javatmapi/javalibs/ocutil-2.4.2.jar +0 -0
  32. data/lib/rtm/javatmapi/javalibs/openrdf-sesame-2.2.1-onejar.jar +0 -0
  33. data/lib/rtm/javatmapi/javalibs/poi-3.2-FINAL.jar +0 -0
  34. data/lib/rtm/javatmapi/javalibs/poi-3.5-beta6-20090622.jar +0 -0
  35. data/lib/rtm/javatmapi/javalibs/poi-contrib-3.5-beta6-20090622.jar +0 -0
  36. data/lib/rtm/javatmapi/javalibs/poi-ooxml-3.5-beta6-20090622.jar +0 -0
  37. data/lib/rtm/javatmapi/javalibs/poi-scratchpad-3.2-FINAL.jar +0 -0
  38. data/lib/rtm/javatmapi/javalibs/poi-scratchpad-3.5-beta6-20090622.jar +0 -0
  39. data/lib/rtm/javatmapi/javalibs/semagia-mio-0.9.5.jar +0 -0
  40. data/lib/rtm/javatmapi/javalibs/semagia-mio-ctm-0.9.3-working-draft-2009-02-18.jar +0 -0
  41. data/lib/rtm/javatmapi/javalibs/semagia-mio-jtm-0.9.4.jar +0 -0
  42. data/lib/rtm/javatmapi/javalibs/semagia-mio-ltm-0.9.5.jar +0 -0
  43. data/lib/rtm/javatmapi/javalibs/semagia-mio-snello-0.9.3.jar +0 -0
  44. data/lib/rtm/javatmapi/javalibs/semagia-mio-tmxml-0.9.5.jar +0 -0
  45. data/lib/rtm/javatmapi/javalibs/semagia-mio-xtm-0.9.5.jar +0 -0
  46. data/lib/rtm/javatmapi/javalibs/slf4j-api-1.5.8.jar +0 -0
  47. data/lib/rtm/javatmapi/javalibs/slf4j-log4j12-1.5.8.jar +0 -0
  48. data/lib/rtm/javatmapi/javalibs/tinytim-mio-2.0.0a5.jar +0 -0
  49. data/lib/rtm/javatmapi/javalibs/tmapi-2.0a2.jar +0 -0
  50. data/lib/rtm/javatmapi/javalibs/tmapix-io-0.3.0-snapshot-200910281502.jar +0 -0
  51. data/lib/rtm/javatmapi/javalibs/trove-2.0.4.jar +0 -0
  52. data/lib/rtm/javatmapi/superiseable.rb +74 -0
  53. metadata +118 -0
@@ -0,0 +1,632 @@
1
+ # Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
2
+ # License: Apache License, Version 2.0
3
+
4
+ module Java::OrgTmapiCore::TopicMap
5
+
6
+ URI_PATTERN = ":"
7
+
8
+ extend Superiseable
9
+ #include RTM::TopicMap
10
+
11
+ attr_accessor :prefixes #hash
12
+
13
+ attr_accessor :base_iri
14
+
15
+ alias :base_locator :base_iri
16
+
17
+ # Adds the identifier (key) and reference (value) to the prefixes-Hash and
18
+ # returns all prefixes. Qnames consisting of "identifier:localpart"
19
+ # will be converted to "referencelocalpart".
20
+ #
21
+ # The identifier and reference must be Strings.
22
+ #
23
+ # Example:
24
+ # add_prefix("tml","http://www.topicmapslab.de/")
25
+ #
26
+ # :call-seq:
27
+ # add_prefix(identifier,reference) -> Hash
28
+ #
29
+ def add_prefix(identifier,reference)
30
+ unless identifier.is_a?(String) && reference.is_a?(String)
31
+ raise("add_prefix: identifier and reference must be Strings")
32
+ end
33
+ #if (identifier == "sl") || (identifier == "si") || (identifier == "ii")
34
+ # warn("prefixes: identifier is either sl, si or ii")
35
+ #end
36
+ prefixes[identifier]= reference
37
+ prefixes
38
+ end
39
+
40
+ # Deletes a prefix (given the identifier) from the prefixes-Hash and
41
+ # returnes the remaining prefixes.
42
+ #
43
+ # If reference is given, it must match the value of the identifier (key)
44
+ # in the prefixes-Hash -
45
+ # if not, the prefix is not deleted.
46
+ #
47
+ # The result may be empty.
48
+ #
49
+ # :call-seq:
50
+ # delete_prefix(identifier) -> Hash
51
+ # delete_prefix(identifier,reference) -> Hash
52
+ #
53
+ def delete_prefix(identifier,reference = :any)
54
+ #warn("delete_prefix: identifier not found") unless prefixes.has_key?(identifier)
55
+ #warn("delete_prefix: reference does not match") unless reference == :any || reference == prefixes[identifier]
56
+ if reference == :any
57
+ prefixes.delete(identifier)
58
+ else
59
+ prefixes.delete_if{|k,v| k == identifier && v == reference}
60
+ end
61
+ prefixes
62
+ end
63
+ alias :del_prefix :delete_prefix
64
+
65
+ # Returns the prefixes that match the given the
66
+ # identifier and/or reference.
67
+ #
68
+ # :call-seq:
69
+ # find_prefix -> Hash
70
+ # find_prefix({:identifier => String}) -> Hash
71
+ # find_prefix({:reference => String}) -> Hash
72
+ # find_prefix({:identifier => String, :reference => String}) -> Hash
73
+ #
74
+ def find_prefix(filter = {})
75
+ #TODO Specs
76
+ identifier = filter[:identifier]
77
+ reference = filter[:reference]
78
+ if identifier && reference
79
+ return prefixes.select{|k,v| k == identifier && v == reference}
80
+ end
81
+ if identifier
82
+ return prefixes.select{|k,v| k == identifier}
83
+ elsif reference
84
+ return prefixes.select{|k,v| v == reference}
85
+ else
86
+ prefixes
87
+ end
88
+ end
89
+
90
+ private
91
+ def show_prefixes
92
+ #TODO to be implemented?
93
+ prefixes
94
+ end
95
+ public
96
+
97
+ superised
98
+ # Returns nil.
99
+ #
100
+ # :call-seq:
101
+ # parent -> nil
102
+ #
103
+ def parent
104
+ getParent
105
+ end
106
+ alias :reverse_children :parent
107
+
108
+ # Returns all Associations and Topics contained in this TopicMap.
109
+ #
110
+ # :call-seq:
111
+ # children -> Array of Associations and/or Topics
112
+ #
113
+ def children
114
+ getAssociations.to_a + getTopics.to_a
115
+ end
116
+ alias :reverse_parent :children
117
+
118
+ superised
119
+ # Creates an Association in this TopicMap.
120
+ #
121
+ # Type specifies the Association type.
122
+ #
123
+ # If given, scope specifies the association scope;
124
+ # else the Association is in the unconstrained scope.
125
+ # Scope must be an Array of identifiers.
126
+ #
127
+ # The last argument - a roles-Hash - is optional. If given,
128
+ # all specified roles will be created additionally. A role is
129
+ # specified by the role type: the key in the Hash and
130
+ # the role player: the corresponding value in the Hash.
131
+ #
132
+ # Each identifier (type, scope-identifier, roletype-identifier and
133
+ # player-identifier) may be a Topic or Topic-Reference.
134
+ #
135
+ # :call-seq:
136
+ # create_association(type) -> Association
137
+ # create_association(type, scope-Array) -> Association
138
+ # create_association(type, roletype-identifier => player-identifier, ...) -> Association
139
+ # create_association(type, scope-Array, roletype-identifier => player-identifier, ...) -> Association
140
+ #
141
+ def create_association(type, *args)
142
+ roles = {}
143
+ if args.size == 0
144
+ # no args -> no scope and no roles given
145
+ scope = :ucs
146
+ elsif args.size == 1
147
+ # args may be an array (scope) or hash (roles)
148
+ argument = args[0]
149
+ if argument.is_a?(Array)
150
+ scope = argument
151
+ elsif argument.is_a?(Hash)
152
+ scope = :ucs
153
+ roles = argument
154
+ else
155
+ raise("create_association: arguments after type may be an Array or Hash")
156
+ end
157
+ else
158
+ # several arguments after type
159
+ argument1 = args[0]
160
+ argument2 = args[1]
161
+ if argument1.is_a?(Array)
162
+ scope = argument1
163
+ roles = argument2
164
+ elsif argument1.is_a?(Hash)
165
+ scope = :ucs
166
+ roles = argument1
167
+ else
168
+ raise("create_association: arguments after type may be an Array or Hash")
169
+ end
170
+ end
171
+ raise("create_association: type must be a Topic or Topic-Reference") unless type.is_a?(Java::OrgTmapiCore::Topic) || type.is_a?(String) || type.is_a?(Java::OrgTmapiCore::Locator)
172
+ if scope == :ucs
173
+ assoc = createAssociation(get!(type),[].to_java(org.tmapi.core.Topic))
174
+ else
175
+ raise("create_association: scope must be an Array") unless scope.is_a?(Array)
176
+ assoc = scope.empty? ? createAssociation(get!(type),[].to_java(org.tmapi.core.Topic)) : createAssociation(get!(type),get!(scope))
177
+ end
178
+ raise("create_association: roles must be a Hash") unless roles.is_a?(Hash)
179
+ roles.each do |k,v|
180
+ if v.is_a?(Array)
181
+ v.each{|player| assoc.create_role(k,player)}
182
+ else
183
+ assoc.create_role(k,v)
184
+ end
185
+ end
186
+ yield assoc if block_given?
187
+ return assoc
188
+ end
189
+
190
+ # Calls TMAPI TopicMap.getIndex which
191
+ # returns the index for the TypeInstanceIndex.
192
+ #
193
+ # :call-seq:
194
+ # type_instance_index -> TypeInstanceIndex
195
+ #
196
+ def type_instance_index
197
+ # Equals _index(:TypeInstanceIndex), which doesn't work yet
198
+ getIndex(org.tmapi.index.TypeInstanceIndex.java_class)
199
+ end
200
+
201
+ # Calls TMAPI TopicMap.getIndex which
202
+ # returns the index for the LiteralIndex.
203
+ #
204
+ # :call-seq:
205
+ # literal_index -> LiteralIndex
206
+ #
207
+ def literal_index
208
+ # Equals _index(:LiteralIndex), which doesn't work yet
209
+ getIndex(org.tmapi.index.LiteralIndex.java_class)
210
+ end
211
+
212
+ # Calls TMAPI TopicMap.getIndex which
213
+ # returns the index for the ScopedIndex.
214
+ #
215
+ # :call-seq:
216
+ # scoped_index -> ScopedIndex
217
+ #
218
+ def scoped_index
219
+ # Equals _index(:ScopedIndex), which doesn't work yet
220
+ getIndex(org.tmapi.index.ScopedIndex.java_class)
221
+ end
222
+
223
+ # Returns all topics in the topic map that are used as instance
224
+ # in an "type-instance"-relationship.
225
+ #
226
+ # The optional argument specifies the type the instances should have.
227
+ # Type may be a topic reference. This method equals topics(type).
228
+ #
229
+ # The result may be empty.
230
+ #
231
+ # :call-seq:
232
+ # instances -> Array of Topics
233
+ # instances(type) -> Array of Topics
234
+ #
235
+ def instances(type = :any)
236
+ return types.map{|t| t.instances.to_a}.flatten.uniq if type == :any
237
+ type = topic_map.get(type) unless type.is_a?(RTM::Topic)
238
+ return type ? type_instance_index.getTopics(type).to_a : Array.new
239
+ end
240
+
241
+
242
+
243
+ # Returns all topics in the topic map that are used as type
244
+ # in an "type-instance"-relationship.
245
+ #
246
+ # :call-seq:
247
+ # types -> Set of Topics
248
+ #
249
+ def types
250
+ type_instance_index.getTopicTypes
251
+ end
252
+
253
+ # Returns all topics in this topic map that are used
254
+ # as types of associations.
255
+ #
256
+ # :call-seq:
257
+ # association_types -> Set of Topics
258
+ #
259
+ def association_types
260
+ type_instance_index.getAssociationTypes
261
+ end
262
+
263
+ # Returns the all Topics in this TopicMap that are used
264
+ # as types of Roles.
265
+ #
266
+ # :call-seq:
267
+ # role_types -> Set of Topics
268
+ #
269
+ def role_types
270
+ type_instance_index.getRoleTypes
271
+ end
272
+
273
+ # Returns all Topics in this TopicMap that are used
274
+ # as types of Names.
275
+ #
276
+ # :call-seq:
277
+ # name_types -> Set of Topics
278
+ #
279
+ def name_types
280
+ type_instance_index.getNameTypes
281
+ end
282
+
283
+ # Returns all Topics in this TopicMap that are used
284
+ # as types of Occurrences.
285
+ #
286
+ # :call-seq:
287
+ # occurrence_types -> Set of Topics
288
+ #
289
+ def occurrence_types
290
+ type_instance_index.getOccurrenceTypes
291
+ end
292
+
293
+ superised
294
+ # Returns all topics contained in this topic map.
295
+ #
296
+ # The optional argument specifies the type of the topics should have,
297
+ # i.e. all instances of the specified type are returned. Type may be a
298
+ # topic reference. This method equals instances (type).
299
+ #
300
+ # The return value may be empty.
301
+ #
302
+ # :call_spec:
303
+ # topics -> Set of Topics
304
+ # topics(type) -> Array of Topics
305
+ #
306
+ def topics(type = :any)
307
+ return getTopics if type == :any
308
+ return instances(type)
309
+ end
310
+
311
+ superised
312
+ # Returns a Locator representing the identifier.
313
+ # Identifier may be a String (IRI).
314
+ #
315
+ # :call-seq:
316
+ # create_locator(identifier) -> Locator
317
+ #
318
+ def create_locator(identifier)
319
+ return identifier if identifier.is_a?(Java::OrgTmapiCore::Locator)
320
+ identifier = check_for_qname(identifier) unless prefixes.empty?
321
+ identifier = proper_base_iri + identifier if identifier.is_a?(String) && !identifier.include?(URI_PATTERN)
322
+ createLocator(identifier)
323
+ end
324
+
325
+ superised
326
+ # Assumes identifier is an item identifier (Locator or String)
327
+ # or an Array of item identifiers (Locators and/or Strings)
328
+ # and returns a Construct or an Array of Constructs
329
+ # by its/their item identifier/s.
330
+ #
331
+ # :call-seq:
332
+ # get_construct_by_item_identifier(identifier) -> Construct
333
+ # get_construct_by_item_identifier(identifier-Array) -> Array of Constructs
334
+ #
335
+ def get_construct_by_item_identifier(identifier)
336
+ identifier = create_locator(identifier) if identifier.is_a?(String)
337
+ return getConstructByItemIdentifier(identifier) if identifier.is_a?(Java::OrgTmapiCore::Locator)
338
+ return identifier.map{|i| get_topic_by_subject_locator(i)} if identifier.is_a?(Array)
339
+ return nil
340
+ end
341
+
342
+ superised
343
+ # Assumes identifier is a subject identifier (Locator or String)
344
+ # or an Array of subject identifiers (Locators and/or Strings)
345
+ # and returns a Topic or an Array of Topics
346
+ # by its/their subject identifier/s.
347
+ #
348
+ # :call-seq:
349
+ # get_topic_by_subject_identifier(identifier) -> Topic
350
+ # get_topic_by_subject_identifier(identifier-Array) -> Array of Topics
351
+ #
352
+ def get_topic_by_subject_identifier(identifier)
353
+ identifier = create_locator(identifier) if identifier.is_a?(String)
354
+ return getTopicBySubjectIdentifier(identifier) if identifier.is_a?(Java::OrgTmapiCore::Locator)
355
+ return identifier.map{|i| get_topic_by_subject_locator(i)} if identifier.is_a?(Array)
356
+ return nil
357
+ end
358
+
359
+ superised
360
+ # Assumes identifier is a subject locator (Locator or String)
361
+ # or an Array of subject locators (Locators and/or Strings)
362
+ # and returns a Topic or an Array of Topics
363
+ # by its/their subject locator/s.
364
+ #
365
+ # :call-seq:
366
+ # get_topic_by_subject_locator(identifier) -> Topic
367
+ # get_topic_by_subject_locator(identifier-Array) -> Array of Topics
368
+ #
369
+ def get_topic_by_subject_locator(identifier)
370
+ identifier = create_locator(identifier) if identifier.is_a?(String)
371
+ return getTopicBySubjectLocator(identifier) if identifier.is_a?(Java::OrgTmapiCore::Locator)
372
+ return identifier.map{|i| get_topic_by_subject_locator(i)} if identifier.is_a?(Array)
373
+ return nil
374
+ end
375
+
376
+ superised
377
+ # Assumes identifier is a subject identifier (Locator or String)
378
+ # or an Array of subject identifiers (Locators and/or Strings).
379
+ # Either returns an existing Topic (or Array of Topics) or creates a/
380
+ # new Topic instance/s with the specified subject identifier/s.
381
+ #
382
+ # :call-seq:
383
+ # create_topic_by_subject_identifier(identifier) -> Topic
384
+ # create_topic_by_subject_identifier(identifier-Array) -> Array of Topics
385
+ #
386
+ # If a topic with the specified subject identifier exists in the topic map,
387
+ # that topic is returned. If a topic with an item identifier equals to the
388
+ # specified subject identifier exists, the specified subject identifier is
389
+ # added to that topic and the topic is returned. If neither a topic with
390
+ # the specified subject identifier nor with an item identifier equals to
391
+ # the subject identifier exists, a topic with the subject identifier is
392
+ # created.
393
+ def create_topic_by_subject_identifier(identifier)
394
+ get_stuff(identifier){|x| createTopicBySubjectIdentifier(x)}
395
+ end
396
+
397
+ superised
398
+ # Assumes identifier is a subject locator (Locator or String)
399
+ # or an Array of subject locators (Locators and/or Strings).
400
+ # Either returns an existing Topic (or Array of Topics) or creates a/
401
+ # new Topic instance/s with the specified subject locators/s.
402
+ #
403
+ # :call-seq:
404
+ # create_topic_by_subject_locator(identifier) -> Topic
405
+ # create_topic_by_subject_locator(identifier-Array) -> Array of Topics
406
+ #
407
+ def create_topic_by_subject_locator(identifier)
408
+ get_stuff(identifier){|x| createTopicBySubjectLocator(x)}
409
+ end
410
+
411
+ superised
412
+ # Assumes identifier is a item identifier (Locator or String)
413
+ # or an Array of item identifiers (Locators and/or Strings).
414
+ # Either returns an existing Topic (or Array of Topics) or creates a/
415
+ # new Topic instance/s with the specified item identifier/s.
416
+ #
417
+ # :call-seq:
418
+ # create_topic_by_item_identifier(identifier) -> Topic
419
+ # create_topic_by_item_identifier(identifier-Array) -> Array of Topics
420
+ #
421
+ # If a topic with the specified item identifier exists in the topic map,
422
+ # that topic is returned. If a topic with a subject identifier equals to
423
+ # the specified item identifier exists, the specified item identifier is
424
+ # added to that topic and the topic is returned. If neither a topic with
425
+ # the specified item identifier nor with a subject identifier equals to
426
+ # the subject identifier exists, a topic with the item identifier is created.
427
+ def create_topic_by_item_identifier(identifier)
428
+ get_stuff(identifier){|x| createTopicByItemIdentifier(x)}
429
+ end
430
+
431
+ # Assumes identifier is an IRI (Locator or String) or an Array of IRIs.
432
+ # Returns an existing or created Topic or an Array of Topics according
433
+ # to the nature of the IRI.
434
+ #
435
+ # :call-seq:
436
+ # create_topic_by(identifier) -> Topic
437
+ # create_topic_by(identifier-Array) -> Array of Topics
438
+ #
439
+ def create_topic_by(identifier)
440
+ case identifier
441
+ when Java::OrgTmapiCore::Locator
442
+ return create_topic_by_subject_identifier(identifier)
443
+ when String
444
+ reroute_for_create(identifier)
445
+ when Array
446
+ return identifier.map{|i| create_topic_by(i)}
447
+ else
448
+ return nil
449
+ end
450
+ end
451
+
452
+ # If identifier is a Topic, returns this Topic.
453
+ #
454
+ # If identifier is a Locator, returns the Topic specified by the Locator (as item
455
+ # identifier or subject identifier).
456
+ #
457
+ # If identifier is a String, returnes the Topic which has this
458
+ # String as subject identifier (by default or if the String starts with "si:")
459
+ # or as subject locator (if the String starts with a "=" or "sl:")
460
+ # or as item identifier (if the String starts with a "^" or "ii:").
461
+ #
462
+ # Returns an Array of Topics if an Array of identifiers is given according to the
463
+ # rules above.
464
+ #
465
+ # Given one identifier, if no Topic is found, returns nil.
466
+ #
467
+ # Given an Array of identifiers, if no Topics are found, returnes an empty Array.
468
+ #
469
+ # :call-seq:
470
+ # get(identifier) -> Topic or nil
471
+ # get(identifier-Array) -> Array of Topics or empty Array
472
+ #
473
+ def get(identifier)
474
+ case identifier
475
+ when nil
476
+ return nil
477
+ when Java::OrgTmapiCore::Topic
478
+ return identifier
479
+ when Java::OrgTmapiCore::Locator
480
+ return get_construct_by_item_identifier(identifier) if get_construct_by_item_identifier(identifier).is_a?(Java::OrgTmapiCore::Topic)
481
+ return get_topic_by_subject_identifier(identifier) if get_topic_by_subject_identifier(identifier)
482
+ #return get_topic_by_subject_locator(identifier) if get_topic_by_subject_locator(identifier) #not allowed because Topics with equals si and ii are merged but sl not
483
+ return nil
484
+ when String
485
+ reroute_for_get(identifier)
486
+ when Array
487
+ # in: multi array -> out: multi array
488
+ return identifier.map{|i| get(i)}
489
+ #when Hash
490
+ #TODO: use case for getting Topics if argument is a hash
491
+ else
492
+ raise("get(#{identifier.inspect}): arguments do not match")
493
+ end
494
+ end
495
+
496
+ # Calls get(identifier) and returns the Topic or Array of Topics according
497
+ # to the nature of the identifier (Topic/Topic-References or
498
+ # Array of those types).
499
+ #
500
+ # Calls create_topic_by(identifier) if a Topic specified by identifier does
501
+ # not exist in the TopicMap. Returns the created and/our found Topic/s.
502
+ #
503
+ # If identifier is a String, returnes/creates the Topic which has this
504
+ # String as subject identifier (by default or if the String starts with "si:")
505
+ # or as subject locator (if the String starts with a "=" or "sl:")
506
+ # or as item identifier (if the String starts with a "^" or "ii:").
507
+ #
508
+ # :call-seq:
509
+ # get!(identifier) -> Topic
510
+ # get!(identifier-Array) -> Array of Topics
511
+ #
512
+ def get!(identifier)
513
+ return nil unless identifier
514
+ if identifier.is_a?(Array)
515
+ return identifier.map{|i| get!(i)}
516
+ end
517
+ found = get(identifier)
518
+ return found ? found : create_topic_by(identifier)
519
+ end
520
+
521
+ def construct_by_id(id)
522
+ getConstructById(id)
523
+ end
524
+
525
+ private
526
+
527
+ # If the identifier is a qname (= "prefix_identifier" + ":" + "localpart"),
528
+ # substitutes the prefix_identifier with the reference
529
+ # (=> "reference" + "localpart") if the prefix_identifier is
530
+ # found in the prefixes-Hash.
531
+ #
532
+ # Returnes the enhanced identifier if successfull.
533
+ # Returns the original identifier if no substitution
534
+ # occured.
535
+ #
536
+ # :call-seq:
537
+ # check_for_qname(identifier) -> String
538
+ #
539
+ def check_for_qname(identifier)
540
+ sections = identifier.split(":")
541
+ key = sections[0]
542
+ if (sections.size > 1) && (prefixes.has_key?(key))
543
+ identifier = identifier.sub(key + ":", prefixes[key])
544
+ # TODO check NOW if identifier is a valid URI ? or may the identifier still be relative?
545
+ end
546
+ return identifier
547
+ end
548
+
549
+ # Calls TMAPI TopicMap.getIndex which
550
+ # returns the specified index for the
551
+ # indexInterface i.
552
+ #
553
+ # :call-seq:
554
+ # _index(i) -> extended index
555
+ #
556
+ # doesn't work;
557
+ # JRuby doesn't seem to like "send" there;
558
+ # solution: use getIndex directly
559
+ def _index(i)
560
+ getIndex(org.tmapi.index.send(i).java_class)
561
+ end
562
+
563
+ # If identifier is not a String or Locator -> assumes it is an Array.
564
+ # If Array entries are not locators -> create_locator(entry).
565
+ # Calls yield on each Array entry and returns Array.
566
+ #
567
+ # If identifier is not a Locator -> assumes it is a String and
568
+ # calls create_locator(idenifier).
569
+ # Executes yield on locator and returns the result.
570
+ def get_stuff(identifier)
571
+ unless (identifier.is_a?(String)) || (identifier.is_a?(Java::OrgTmapiCore::Locator))
572
+ identifier_in_use = identifier.map{|x|(x.is_a? Java::OrgTmapiCore::Locator)? x : create_locator(x)}
573
+ return identifier_in_use.map{|y| yield y}
574
+ else
575
+ unless identifier.is_a? Java::OrgTmapiCore::Locator
576
+ identifier = create_locator(identifier)
577
+ end
578
+ return (yield identifier)
579
+ end
580
+ end
581
+
582
+ # Identifies the identifier as item identifier, subject locator or
583
+ # subject identifier and calls create_topic_by_.. accordingly. Creates
584
+ # new topic if topic does not exist yet. Returns the topic.
585
+ #
586
+ # :call-seq:
587
+ # reroute_for_create(identifier) -> Topic
588
+ #
589
+ def reroute_for_create(identifier)
590
+ case identifier
591
+ when /^(\^|ii:)\s*(.*)/ #identifiers starts with ^ or ii:
592
+ create_topic_by_item_identifier(create_locator($2))
593
+ when /^(=|sl:)\s*(.*)/ #identifier starts with = or sl:
594
+ create_topic_by_subject_locator(create_locator($2))
595
+ when /^(si:)\s*(.*)/ #identifier starts with si:
596
+ create_topic_by_subject_identifier(create_locator($2))
597
+ else #identifier does not start with a special character
598
+ create_topic_by_subject_identifier(create_locator(identifier.lstrip))#lstrip: leading whitespace chars removed
599
+ end
600
+ end
601
+
602
+ # Identifies the identifier as item identifier, subject locator or
603
+ # subject identifier and calls get_construct/topic_by_.. accordingly.
604
+ # Returns the topic.
605
+ #
606
+ # :call-seq:
607
+ # reroute_for_get(identifier) -> Topic
608
+ #
609
+ def reroute_for_get(identifier)
610
+ case identifier
611
+ when /^(si:|sl:|ii:|=|^)$/
612
+ return nil
613
+ when /^(\^|ii:)\s*(.*)/ #identifiers starts with ^ or ii:
614
+ get_construct_by_item_identifier(create_locator($2))
615
+ when /^(=|sl:)\s*(.+)/ #identifier starts with = or sl:
616
+ get_topic_by_subject_locator(create_locator($2))
617
+ when /^(si:)\s*(.+)/ #identifier starts with si:
618
+ get_topic_by_subject_identifier(create_locator($2))
619
+ else #identifier does not start with a special character
620
+ get_topic_by_subject_identifier(create_locator(identifier.lstrip)) #lstrip: leading whitespace chars removed
621
+ end
622
+ end
623
+
624
+ def proper_base_iri
625
+ if base_iri[-1] == '/'[-1]
626
+ return base_iri
627
+ else
628
+ return base_iri + '#'
629
+ end
630
+ end
631
+
632
+ end