1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
|
# defaults to stderr, may be changed to file output (e.g in opentox-service)
$logger = OTLogger.new(STDERR)
$logger.level = Logger::DEBUG
Mongo::Logger.logger = $logger
Mongo::Logger.logger.level = Logger::WARN
$mongo = Mongo::Client.new($mongodb[:uri])
module OpenTox
# Ruby interface
attr_accessor :data
# Create a new OpenTox object
# @param id [optional,String] ID
# @return [OpenTox] OpenTox object
def initialize
@data = {}
@data["type"] = type
end
def created_at
@data["_id"].generation_time
end
# Object metadata (lazy loading)
# @return [Hash] Object metadata
def metadata
get if exists?
@data
end
# Metadata values
# @param predicate [String] Predicate URI
# @return [Array, String] Predicate value(s)
def [](predicate)
predicate = predicate.to_s
return nil if @data[predicate].nil?
@data[predicate].size == 1 ? @data[predicate].first : @data[predicate]
end
# Set a metadata entry
# @param predicate [String] Predicate URI
# @param values [Array, String] Predicate value(s)
def []=(predicate,values)
predicate = predicate.to_s
values.is_a?(Array) ? @data[predicate] = [values].flatten : @data[predicate] = values
end
def id
@data["_id"]
end
def exists?
nr_items = $mongo[collection].find(:_id => @data["_id"]).count
nr_items > 0 ? true : false
end
# Get object from webservice
# @param [String,optional] mime_type
def get
resource_not_found_error("#{@data[:type]} with ID #{@data["_id"]} not found.") unless exists?
@data = $mongo[collection].find(:_id => @data["_id"]).first
end
def save
@data["_id"] = $mongo[collection].insert_one(@data).inserted_id
end
# partial update
def update metadata
$mongo[collection].find(:_id => @data["_id"]).find_one_and_replace('$set' => metadata)
end
# Save object at webservice (replace or create object)
def put
#@data.delete("_id") # to enable updates
$mongo[collection].find(:_id => @data["_id"]).find_one_and_replace(@data, :upsert => true)
end
# Delete object at webservice
def delete
$mongo[collection].find(:_id => @data["_id"]).find_one_and_delete
end
# @return [String] converts OpenTox object into html document (by first converting it to a string)
def to_html
@data.to_json.to_html
end
def type
self.class.to_s.split('::').last
end
def collection
type.downcase
end
# short access for metadata keys title, description and type
[ :title , :description ].each do |method|
send :define_method, method do
self[method]
end
send :define_method, "#{method}=" do |value|
self[method] = value
end
end
# define class methods within module
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def subjectid
RestClientWrapper.subjectid
end
def subjectid=(subjectid)
RestClientWrapper.subjectid = subjectid
end
end
# create default OpenTox classes with class methods
# (defined in opentox-client.rb)
CLASSES.each do |klass|
c = Class.new do
include OpenTox
def self.all
$mongo[collection].find.collect do |data|
f = self.new
f.data = data
f
end
end
def self.find_id id
self.find(:_id => id)
end
#@example fetching a model
# OpenTox::Model.find(<model-id>) -> model-object
def self.find metadata
f = self.new
items = $mongo[collection].find metadata
items.count > 0 ? f.data = items.first : f = nil
f
end
def self.create metadata
object = self.new
object.data = metadata
object.save
object.get
object
end
def self.find_or_create metadata
search = metadata
search.delete("_id")
ids = $mongo[collection].find(search).distinct(:_id)
ids.empty? ? self.create(metadata) : self.find_id(ids.first)
end
private
def self.collection
self.to_s.split('::').last.downcase
end
end
OpenTox.const_set klass,c
end
end
|