rtm 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +1 -1
- data/lib/rtm.rb +23 -95
- data/lib/rtm/connection.rb +51 -0
- data/lib/rtm/engine.rb +29 -18
- data/lib/rtm/extensions.rb +2 -5
- data/lib/rtm/helpers/uri.rb +1 -1
- data/lib/rtm/io/tmapix_from.rb +8 -8
- data/lib/rtm/io/tmapix_to.rb +6 -6
- data/lib/rtm/io/to_rdf.rb +1 -1
- data/lib/rtm/io/to_string.rb +22 -14
- data/lib/rtm/navigation/topic/supertypes.rb +2 -2
- data/lib/rtm/navigation/topic/types.rb +1 -1
- data/lib/rtm/psi.rb +3 -1
- data/lib/rtm/sugar.rb +8 -3
- data/lib/rtm/sugar/topic/best_name.rb +31 -50
- data/lib/rtm/sugar/topic/scoped.rb +9 -9
- data/lib/rtm/sugar/topic/topic_ref.rb +115 -72
- data/lib/rtm/sugar/topic_map/remove.rb +49 -0
- data/lib/rtm/sugar/topic_map/{themes.rb → scoped.rb} +9 -10
- data/lib/rtm/sugar/topic_map/types.rb +50 -0
- data/lib/rtm/sugar/variant/topic.rb +17 -0
- data/lib/rtm/topology.rb +134 -0
- data/lib/rtm/version.rb +13 -8
- data/spec/rtm/engine_spec.rb +45 -0
- data/spec/rtm/io/tmapix_from_spec.rb +8 -8
- data/spec/rtm/io/tmapix_to_spec.rb +38 -38
- data/spec/rtm/io/to_yaml_spec.rb +7 -0
- data/spec/rtm/javatmapi_spec.rb +64 -0
- data/spec/rtm/navigation/topic/scope_spec.rb +1 -1
- data/spec/rtm/sugar/topic/best_name_spec.rb +54 -2
- data/spec/rtm/sugar/topic/topic_ref_spec.rb +59 -35
- data/spec/rtm/sugar/topic_map/remove_spec.rb +50 -0
- data/spec/rtm/sugar/topic_map/{themes_spec.rb → scoped_spec.rb} +1 -1
- data/spec/rtm/sugar/topic_map/types_spec.rb +34 -0
- data/spec/rtm/sugar/variant/topic_spec.rb +28 -0
- data/spec/rtm/tmapi/core/name_spec.rb +1 -7
- data/spec/rtm/tmapi/core/topic_map_spec.rb +103 -51
- data/spec/rtm/tmapi/core/topic_spec.rb +3 -0
- data/spec/rtm_spec.rb +3 -12
- data/test/javalibs/tmapi-2.0-tests.jar +0 -0
- metadata +26 -9
data/README
CHANGED
@@ -34,6 +34,6 @@ The Topic Maps Data Model which is used in this implementation can be found on h
|
|
34
34
|
* rtm-tmql: Adds support for the Topic Maps Query Language (TMQL), http://isotopicmaps.org/tmql/
|
35
35
|
* rtm-tmcl: Adds support for the Topic Maps Constraint Language (TMCL), http://isotopicmaps.org/tmcl/
|
36
36
|
|
37
|
-
==== License
|
37
|
+
==== License
|
38
38
|
Copyright 2009 Topic Maps Lab, University of Leipzig.
|
39
39
|
Apache License, Version 2.0
|
data/lib/rtm.rb
CHANGED
@@ -12,123 +12,51 @@
|
|
12
12
|
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__))
|
13
13
|
|
14
14
|
module RTM
|
15
|
-
module Topic
|
16
|
-
end
|
15
|
+
module Topic; end
|
17
16
|
|
18
|
-
module Association
|
19
|
-
end
|
17
|
+
module Association; end
|
20
18
|
|
21
|
-
module Occurrence
|
22
|
-
end
|
19
|
+
module Occurrence; end
|
23
20
|
|
24
|
-
module Reifiable
|
25
|
-
end
|
21
|
+
module Reifiable; end
|
26
22
|
|
27
|
-
module Name
|
28
|
-
end
|
23
|
+
module Name; end
|
29
24
|
|
30
|
-
module Role
|
31
|
-
end
|
25
|
+
module Role; end
|
32
26
|
|
33
|
-
module Scoped
|
34
|
-
end
|
27
|
+
module Scoped; end
|
35
28
|
|
36
|
-
module Typed
|
37
|
-
end
|
29
|
+
module Typed; end
|
38
30
|
|
39
|
-
module Variant
|
40
|
-
end
|
31
|
+
module Variant; end
|
41
32
|
|
42
|
-
module Locator
|
43
|
-
end
|
33
|
+
module Locator; end
|
44
34
|
|
45
|
-
module Construct
|
46
|
-
end
|
35
|
+
module Construct; end
|
47
36
|
|
48
|
-
module Reifiable
|
49
|
-
end
|
37
|
+
module Reifiable; end
|
50
38
|
|
51
39
|
module TopicMap
|
52
40
|
attr_accessor :engine
|
53
41
|
end
|
54
42
|
|
55
|
-
module TopicMapSystem
|
56
|
-
end
|
43
|
+
module TopicMapSystem; end
|
57
44
|
|
58
|
-
module ItemIdentifier
|
59
|
-
end
|
45
|
+
module ItemIdentifier; end
|
60
46
|
|
61
|
-
module SubjectIdentifier
|
62
|
-
end
|
47
|
+
module SubjectIdentifier; end
|
63
48
|
|
64
|
-
module SubjectLocator
|
65
|
-
end
|
49
|
+
module SubjectLocator; end
|
66
50
|
|
67
|
-
module DatatypeAware
|
68
|
-
end
|
51
|
+
module DatatypeAware; end
|
69
52
|
end
|
70
53
|
|
71
54
|
require 'rtm/version'
|
72
55
|
require 'rtm/extensions'
|
73
|
-
require
|
56
|
+
require 'rtm/engine'
|
57
|
+
require 'rtm/connection'
|
74
58
|
require 'rtm/psi'
|
75
|
-
require
|
76
|
-
require
|
77
|
-
require
|
78
|
-
require
|
79
|
-
|
80
|
-
module RTM
|
81
|
-
# Connects to a topic map engine.
|
82
|
-
# The optional parameter can be used to
|
83
|
-
# select the backend.
|
84
|
-
#
|
85
|
-
# :call-seq:
|
86
|
-
# RTM.connect(:implementation => :ontopia) -> Ontopia backend
|
87
|
-
# RTM.connect(:implementation => :tinytim) -> tinyTim backend
|
88
|
-
# RTM.connect(:implementation => :activerecord) -> Active Record backend
|
89
|
-
# RTM.connect(:implementation => :sesametm) -> SesameTM backend
|
90
|
-
# RTM.connect(:implementation => :merged) -> Merged TMAPI backend
|
91
|
-
#
|
92
|
-
def self.connect(params = {}, *args)
|
93
|
-
engine = Engine.load!(params[:implementation])
|
94
|
-
connection = engine.new(params)
|
95
|
-
add_connection(connection)
|
96
|
-
connection
|
97
|
-
end
|
98
|
-
|
99
|
-
# Returns all connections grouped by their backend
|
100
|
-
#
|
101
|
-
# :call-seq:
|
102
|
-
# connections -> Hash
|
103
|
-
#
|
104
|
-
def self.connections
|
105
|
-
@connections ||= Hash.new{|h,k| h[k] = []}
|
106
|
-
@connections
|
107
|
-
end
|
108
|
-
|
109
|
-
# Returns all connections. The optional argument may specify the backend
|
110
|
-
# the connections should use.
|
111
|
-
#
|
112
|
-
# :call-seq:
|
113
|
-
# [] -> all connections as Hash
|
114
|
-
# [:tinytim] -> all connections using TinyTiM
|
115
|
-
# [:ontopia] -> all connections using Ontopia
|
116
|
-
# [:sesame] -> all connections using SesameTM
|
117
|
-
# [:activerecord] -> all connectioms using RTM AR
|
118
|
-
#
|
119
|
-
def self.[](args = nil)
|
120
|
-
return @connections[args] if args
|
121
|
-
connections
|
122
|
-
end
|
123
|
-
|
124
|
-
def self.included(klass)
|
125
|
-
@@meine_implementierungen ||= []
|
126
|
-
@@meine_implementierungen << klass
|
127
|
-
self.included_modules.each {|im| klass.extend(im)}
|
128
|
-
end
|
129
|
-
|
130
|
-
private
|
131
|
-
def self.add_connection(connection)
|
132
|
-
self.connections[connection.class.identifier] << connection
|
133
|
-
end
|
134
|
-
end
|
59
|
+
require 'rtm/navigation'
|
60
|
+
require 'rtm/axes'
|
61
|
+
require 'rtm/sugar'
|
62
|
+
require 'rtm/io'
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# Copyright: Copyright 2009 Topic Maps Lab, University of Leipzig.
|
2
|
+
# License: Apache License, Version 2.0
|
3
|
+
|
4
|
+
module RTM
|
5
|
+
module Connections
|
6
|
+
# Connects to a topic map engine using the specificed backend and configuration
|
7
|
+
#
|
8
|
+
# @example Connect to Ontopia backend (in memory)
|
9
|
+
# RTM.connect(:backend => :ontopia)
|
10
|
+
# @example Connect to Ontopia backend (relational database), here: using the H2 adapter
|
11
|
+
# RTM.connect(:backend => :ontopia_rdbms, :config => { :adapter => 'jdbch2', :database => "db-rtm-ontopia"})
|
12
|
+
# @example Connect to tinyTim backend (in memory)
|
13
|
+
# RTM.connect(:backend => :tinytim)
|
14
|
+
# @example Connect to Active Record backend (relational database)
|
15
|
+
# RTM.connect(:backend => :activerecord)
|
16
|
+
# @example Connect to SesameTM backend
|
17
|
+
# RTM.connect(:backend => :sesametm)
|
18
|
+
# @example Connect to Hatana backend (in memory, with different stores)
|
19
|
+
# RTM.connect(:backend => :hatana)
|
20
|
+
# @param [Hash] params the options to create the connection with.
|
21
|
+
# @option params [Symbol] :backend (:ontopia) the backend
|
22
|
+
# @option params [Symbol] :implementation @deprecated use :backend instead
|
23
|
+
# @option params [Hash] :config (nil) the backend-specific configuration
|
24
|
+
# @return [Engine] The connection object
|
25
|
+
def connect(params = {}, *args)
|
26
|
+
params ||= {} # this is needed to handle passing nil
|
27
|
+
engine = Engine.load!(params[:backend] || params[:implementation])
|
28
|
+
connection = engine.connect(params)
|
29
|
+
connections[params[:identifier]] = connection if params[:identifier]
|
30
|
+
connection
|
31
|
+
end
|
32
|
+
|
33
|
+
# Return all connections or a particular connection.
|
34
|
+
# @overload connections
|
35
|
+
# Returns all registered connections, keyed by their identifiers.
|
36
|
+
# @return [Hash]
|
37
|
+
# @overload connections(identifier)
|
38
|
+
# @param [Symbol] identifier of the registered connection
|
39
|
+
# @return [Engine] the connection object
|
40
|
+
def connections(*args)
|
41
|
+
@connections ||= {}
|
42
|
+
if args.size > 0
|
43
|
+
@connections[*args]
|
44
|
+
else
|
45
|
+
@connections
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
RTM.extend(self)
|
50
|
+
end
|
51
|
+
end
|
data/lib/rtm/engine.rb
CHANGED
@@ -9,12 +9,12 @@ module RTM
|
|
9
9
|
def self.inherited(subclass)
|
10
10
|
Engine.add(subclass) # this MUST be Engine and not self! Otherwise every intermediate class in the inheritance chain will have it's own list
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
def self.add(engine)
|
14
14
|
@engines ||= []
|
15
15
|
@engines << engine
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
def self.identifier(i=nil)
|
19
19
|
if i
|
20
20
|
# setter / declaration
|
@@ -24,31 +24,29 @@ module RTM
|
|
24
24
|
@identifier
|
25
25
|
end
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
def self.all
|
29
29
|
@engines ||= []
|
30
30
|
@engines.reject!{|e| e.abstract?} # this needs to be done here because in the inherited hook the method is not yet available.
|
31
31
|
@engines
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
def self.list
|
35
35
|
all.map{|e| e.identifier}
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
def self.[](identifier)
|
39
39
|
all.find {|e| e.identifier == identifier}
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
def self.load(engine_name)
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
engine_path = File.expand_path(File.join(File.dirname(__FILE__), "../../../rtm-#{
|
47
|
-
if File.directory?(engine_path)
|
48
|
-
$LOAD_PATH.unshift engine_path
|
49
|
-
require "rtm/#{engine_name}"
|
50
|
-
end
|
43
|
+
engine_gem_name = engine_name
|
44
|
+
engine_gem_name = engine_name.to_s.split("_").first if engine_gem_name.to_s =~ /_/
|
45
|
+
unless Object.const_defined?("Gem") && rtmgem = Gem.loaded_specs["rtm"]
|
46
|
+
engine_path = File.expand_path(File.join(File.dirname(__FILE__), "../../../rtm-#{engine_gem_name}/lib"))
|
47
|
+
$LOAD_PATH.unshift engine_path if File.directory?(engine_path)
|
51
48
|
end
|
49
|
+
require "rtm/#{engine_gem_name}"
|
52
50
|
self[engine_name]
|
53
51
|
end
|
54
52
|
|
@@ -65,13 +63,11 @@ module RTM
|
|
65
63
|
end
|
66
64
|
engine || load(engine_name)
|
67
65
|
end
|
68
|
-
|
66
|
+
|
69
67
|
def self.detect(preferred=nil)
|
70
68
|
if preferred # return the users preference, if given
|
71
69
|
implementation = preferred
|
72
|
-
elsif engine_name = ENV['RTM_IMPLEMENTATION'] # inspect system environment
|
73
|
-
implementation = engine_name.to_sym
|
74
|
-
elsif engine_name = ENV['RTM_ENGINE'] # inspect system environment (alternative)
|
70
|
+
elsif engine_name = ENV['RTM_BACKEND'] || ENV['RTM_IMPLEMENTATION'] || ENV['RTM_ENGINE'] # inspect system environment (several alternatives)
|
75
71
|
implementation = engine_name.to_sym
|
76
72
|
elsif implementation = self.list.first # check if one is already loaded
|
77
73
|
warn("No engine implementation was specified for RTM.connect. Using the first already loaded engine (#{implementation.inspect}).")
|
@@ -91,11 +87,26 @@ module RTM
|
|
91
87
|
end
|
92
88
|
end
|
93
89
|
|
90
|
+
def self.connect(*args)
|
91
|
+
self.new(*args)
|
92
|
+
end
|
93
|
+
|
94
94
|
attr_reader :connections
|
95
95
|
|
96
96
|
def initialize(params={})
|
97
97
|
@params = params
|
98
98
|
end
|
99
99
|
|
100
|
+
# returns an identifier of the engine, e.g. :ontopia or :ontopia_rdbms
|
101
|
+
def identifier
|
102
|
+
self.class.identifier
|
103
|
+
end
|
104
|
+
|
105
|
+
# Check if everything is set up. This should be overwritten by backends
|
106
|
+
# which need special setup, like a database schema migration.
|
107
|
+
def check
|
108
|
+
true
|
109
|
+
end
|
110
|
+
|
100
111
|
end
|
101
112
|
end
|
data/lib/rtm/extensions.rb
CHANGED
@@ -50,13 +50,11 @@ module RTM
|
|
50
50
|
# super
|
51
51
|
# puts "[RTMEXT] including #{self} into #{klass} in #{caller(1).first}"
|
52
52
|
register_implementation(klass)
|
53
|
-
klass.class_eval
|
53
|
+
klass.class_eval <<-EOS
|
54
54
|
def self.included(klass2)
|
55
|
-
# puts "[RTMIMPLEXT] #{self} was included into #{klass2} in #{caller(1).first}"
|
56
|
-
# self.ancestors.select {|anc| anc.respond_to?(:register_implementation)}.each{|anc| anc.register_implementation(klass2) }
|
57
55
|
self.ancestors.find {|anc| anc.respond_to?(:register_implementation)}.register_implementation(klass2)
|
58
56
|
end
|
59
|
-
|
57
|
+
EOS
|
60
58
|
end
|
61
59
|
|
62
60
|
# Register an implementation to this module.
|
@@ -65,7 +63,6 @@ module RTM
|
|
65
63
|
# Due to Ruby's restrictions on calling protected methods from other modules extending the very same module Extendable,
|
66
64
|
# this method must be public.
|
67
65
|
def register_implementation(klass)
|
68
|
-
# super if self.class.superclass.respond_to?(:register_implementation)
|
69
66
|
@implementations ||= []
|
70
67
|
@implementations << klass
|
71
68
|
end
|
data/lib/rtm/helpers/uri.rb
CHANGED
data/lib/rtm/io/tmapix_from.rb
CHANGED
@@ -49,7 +49,7 @@ module RTM::IO
|
|
49
49
|
# from_ltm(filename)
|
50
50
|
#
|
51
51
|
def from_ltm(*args)
|
52
|
-
from_anything(
|
52
|
+
from_anything(Java::OrgTmapixIo::LTMTopicMapReader, *args)
|
53
53
|
end
|
54
54
|
|
55
55
|
# Reads a Topic Map from an CTM File
|
@@ -59,7 +59,7 @@ module RTM::IO
|
|
59
59
|
# from_ctm(filename)
|
60
60
|
#
|
61
61
|
def from_ctm(*args)
|
62
|
-
from_anything(
|
62
|
+
from_anything(Java::OrgTmapixIo::CTMTopicMapReader, *args)
|
63
63
|
end
|
64
64
|
|
65
65
|
# Reads a JSON Topic Maps (JTM) File
|
@@ -70,7 +70,7 @@ module RTM::IO
|
|
70
70
|
#
|
71
71
|
def from_jtm(*args)
|
72
72
|
# seems not to acceped all files that are found to be valid by the JTM validator
|
73
|
-
from_anything(
|
73
|
+
from_anything(Java::OrgTmapixIo::JTMTopicMapReader, *args)
|
74
74
|
end
|
75
75
|
|
76
76
|
# Reads a Friendly Topic Maps XML (TM/XML) File
|
@@ -81,7 +81,7 @@ module RTM::IO
|
|
81
81
|
# from_tmxml(filename)
|
82
82
|
#
|
83
83
|
def from_tmxml(*args)
|
84
|
-
from_anything(
|
84
|
+
from_anything(Java::OrgTmapixIo::TMXMLTopicMapReader, *args)
|
85
85
|
end
|
86
86
|
|
87
87
|
# Reads a XML Topic Maps (XTM) 1.0 File
|
@@ -91,7 +91,7 @@ module RTM::IO
|
|
91
91
|
# from_xtm10(filename)
|
92
92
|
#
|
93
93
|
def from_xtm10(*args)
|
94
|
-
from_anything(
|
94
|
+
from_anything(Java::OrgTmapixIo::XTM10TopicMapReader, *args)
|
95
95
|
end
|
96
96
|
alias :from_xtm1 :from_xtm10
|
97
97
|
|
@@ -114,7 +114,7 @@ module RTM::IO
|
|
114
114
|
# from_xtm(filename)
|
115
115
|
#
|
116
116
|
def from_xtm(*args)
|
117
|
-
from_anything(
|
117
|
+
from_anything(Java::OrgTmapixIo::XTMTopicMapReader, *args)
|
118
118
|
end
|
119
119
|
|
120
120
|
# Reads a Notation3 (N3) File
|
@@ -128,7 +128,7 @@ module RTM::IO
|
|
128
128
|
#
|
129
129
|
def from_n3(filename, vocab)
|
130
130
|
raise "Only supported for TMAPI backends!!" unless self.kind_of? Java::OrgTmapiCore::TopicMap
|
131
|
-
reader =
|
131
|
+
reader = Java::OrgTmapixIo::N3TopicMapReader.new self, java.io.File.new(filename)
|
132
132
|
reader.setMappingSource(java.io.File.new(vocab))
|
133
133
|
reader.read
|
134
134
|
end
|
@@ -144,7 +144,7 @@ module RTM::IO
|
|
144
144
|
#
|
145
145
|
def from_rdfxml(filename, vocab)
|
146
146
|
raise "Only supported for TMAPI backends!!" unless self.kind_of? Java::OrgTmapiCore::TopicMap
|
147
|
-
reader =
|
147
|
+
reader = Java::OrgTmapixIo::RDFXMLTopicMapReader.new self, java.io.File.new(filename)
|
148
148
|
reader.setMappingSource(java.io.File.new(vocab))
|
149
149
|
reader.read
|
150
150
|
end
|
data/lib/rtm/io/tmapix_to.rb
CHANGED
@@ -99,7 +99,7 @@ module RTM::IO
|
|
99
99
|
# to_xtm20(file, base_iri)
|
100
100
|
#
|
101
101
|
def to_xtm20(*args)
|
102
|
-
to_anything(
|
102
|
+
to_anything(Java::OrgTmapixIo::XTM20TopicMapWriter, *args)
|
103
103
|
end
|
104
104
|
alias :to_xtm :to_xtm20
|
105
105
|
alias :to_xtm2 :to_xtm20
|
@@ -120,7 +120,7 @@ module RTM::IO
|
|
120
120
|
# to_xtm10(file, base_iri)
|
121
121
|
#
|
122
122
|
def to_xtm10(*args)
|
123
|
-
to_anything(
|
123
|
+
to_anything(Java::OrgTmapixIo::XTM10TopicMapWriter, *args)
|
124
124
|
end
|
125
125
|
alias :to_xtm1 :to_xtm10
|
126
126
|
|
@@ -140,7 +140,7 @@ module RTM::IO
|
|
140
140
|
# to_jtm(file, base_iri)
|
141
141
|
#
|
142
142
|
def to_jtm(*args)
|
143
|
-
to_anything(
|
143
|
+
to_anything(Java::OrgTmapixIo::JTMTopicMapWriter, *args)
|
144
144
|
end
|
145
145
|
alias :to_json :to_jtm
|
146
146
|
|
@@ -160,7 +160,7 @@ module RTM::IO
|
|
160
160
|
# to_ltm(file, base_iri)
|
161
161
|
#
|
162
162
|
def to_ltm(*args)
|
163
|
-
to_anything(
|
163
|
+
to_anything(Java::OrgTmapixIo::LTMTopicMapWriter, *args)
|
164
164
|
end
|
165
165
|
|
166
166
|
# Serializes an RTM::TopicMap to TM/XML.
|
@@ -179,7 +179,7 @@ module RTM::IO
|
|
179
179
|
# to_tmxml(file, base_iri)
|
180
180
|
#
|
181
181
|
def to_tmxml(*args)
|
182
|
-
to_anything(
|
182
|
+
to_anything(Java::OrgTmapixIo::TMXMLTopicMapWriter, *args)
|
183
183
|
end
|
184
184
|
|
185
185
|
# Serializes an RTM::TopicMap to CTM.
|
@@ -215,7 +215,7 @@ module RTM::IO
|
|
215
215
|
else
|
216
216
|
args.push(default_params)
|
217
217
|
end
|
218
|
-
to_anything(
|
218
|
+
to_anything(Java::DeTopicmapslabCtmWriterCore::CTMTopicMapWriter, *args)
|
219
219
|
end
|
220
220
|
end
|
221
221
|
RTM.register_extension(self)
|