caruby-tissue 1.3.4 → 1.3.5
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +11 -7
- data/lib/catissue/annotation/annotatable_class.rb +18 -1
- data/lib/catissue/annotation/annotation.rb +5 -0
- data/lib/catissue/annotation/annotation_class.rb +15 -3
- data/lib/catissue/annotation/proxy_class.rb +2 -1
- data/lib/catissue/database/annotation/annotation_service.rb +13 -6
- data/lib/catissue/database/annotation/annotator.rb +3 -1
- data/lib/catissue/database/annotation/entity_facade.rb +21 -29
- data/lib/catissue/database/annotation/integration_service.rb +6 -4
- data/lib/catissue/database.rb +2 -2
- data/lib/catissue/domain/abstract_domain_object.rb +1 -1
- data/lib/catissue/domain/abstract_position.rb +1 -1
- data/lib/catissue/domain/abstract_specimen.rb +1 -1
- data/lib/catissue/domain/abstract_specimen_collection_group.rb +1 -1
- data/lib/catissue/domain/address.rb +1 -1
- data/lib/catissue/domain/cancer_research_group.rb +1 -1
- data/lib/catissue/domain/capacity.rb +1 -1
- data/lib/catissue/domain/check_in_check_out_event_parameter.rb +1 -1
- data/lib/catissue/domain/collection_event_parameters.rb +1 -1
- data/lib/catissue/domain/collection_protocol.rb +1 -1
- data/lib/catissue/domain/collection_protocol_event.rb +1 -1
- data/lib/catissue/domain/collection_protocol_registration.rb +1 -1
- data/lib/catissue/domain/consent_tier_response.rb +1 -1
- data/lib/catissue/domain/consent_tier_status.rb +1 -1
- data/lib/catissue/domain/container.rb +1 -1
- data/lib/catissue/domain/container_position.rb +4 -2
- data/lib/catissue/domain/container_type.rb +1 -1
- data/lib/catissue/domain/department.rb +1 -1
- data/lib/catissue/domain/disposal_event_parameters.rb +1 -1
- data/lib/catissue/domain/embedded_event_parameters.rb +1 -1
- data/lib/catissue/domain/external_identifier.rb +1 -1
- data/lib/catissue/domain/frozen_event_parameters.rb +1 -1
- data/lib/catissue/domain/institution.rb +1 -1
- data/lib/catissue/domain/new_specimen_array_order_item.rb +1 -1
- data/lib/catissue/domain/order_details.rb +1 -1
- data/lib/catissue/domain/participant.rb +2 -2
- data/lib/catissue/domain/participant_medical_identifier.rb +1 -1
- data/lib/catissue/domain/password.rb +1 -1
- data/lib/catissue/domain/race.rb +1 -1
- data/lib/catissue/domain/received_event_parameters.rb +1 -1
- data/lib/catissue/domain/site.rb +1 -1
- data/lib/catissue/domain/specimen.rb +49 -40
- data/lib/catissue/domain/specimen_array.rb +1 -1
- data/lib/catissue/domain/specimen_array_content.rb +1 -1
- data/lib/catissue/domain/specimen_array_type.rb +1 -1
- data/lib/catissue/domain/specimen_characteristics.rb +1 -1
- data/lib/catissue/domain/specimen_collection_group.rb +7 -7
- data/lib/catissue/domain/specimen_event_parameters.rb +6 -6
- data/lib/catissue/domain/specimen_position.rb +1 -1
- data/lib/catissue/domain/specimen_protocol.rb +1 -1
- data/lib/catissue/domain/specimen_requirement.rb +13 -13
- data/lib/catissue/domain/storage_container.rb +1 -1
- data/lib/catissue/domain/storage_type.rb +1 -1
- data/lib/catissue/domain/transfer_event_parameters.rb +1 -1
- data/lib/catissue/domain/user.rb +1 -1
- data/lib/catissue/migration/migrator.rb +2 -2
- data/lib/catissue/version.rb +1 -1
- data/test/lib/catissue/domain/specimen_test.rb +241 -242
- data/test/lib/catissue/test_case.rb +11 -7
- metadata +3 -4
- data/examples/galena/lib/galena/cli/seed.rb +0 -22
data/History.txt
CHANGED
@@ -1,28 +1,32 @@
|
|
1
1
|
=== 1.2.1 / 2010-11-23
|
2
2
|
|
3
|
-
* Initial public release
|
3
|
+
* Initial public release.
|
4
4
|
|
5
5
|
=== 1.2.2 / 2010-11-30
|
6
6
|
|
7
|
-
* Enable Galena example
|
7
|
+
* Enable Galena example.
|
8
8
|
|
9
9
|
=== 1.2.3 / 2011-02-18
|
10
10
|
|
11
|
-
* Support Dynamic Extensions
|
11
|
+
* Support Dynamic Extensions.
|
12
12
|
|
13
13
|
=== 1.3.1 / 2011-02-18
|
14
14
|
|
15
|
-
* Full PCBIN DE support
|
15
|
+
* Full PCBIN DE support.
|
16
16
|
|
17
17
|
=== 1.3.2 / 2011-02-25
|
18
18
|
|
19
|
-
* Minor migration bug fixes
|
19
|
+
* Minor migration bug fixes.
|
20
20
|
|
21
21
|
=== 1.3.3 / 2011-02-26
|
22
22
|
|
23
|
-
* JRuby 1.5 upgrade
|
23
|
+
* JRuby 1.5 upgrade.
|
24
24
|
|
25
25
|
=== 1.3.4 / 2011-02-26
|
26
26
|
|
27
|
-
* Use caruby-core JRuby 1.5 bug work-around
|
27
|
+
* Use caruby-core JRuby 1.5 bug work-around.
|
28
|
+
|
29
|
+
=== 1.3.5 / 2011-03-04
|
30
|
+
|
31
|
+
* Support annotation migration.
|
28
32
|
|
@@ -13,7 +13,11 @@ module CaTissue
|
|
13
13
|
def self.extended(klass)
|
14
14
|
super
|
15
15
|
# the annotation name => spec hash
|
16
|
-
klass.class_eval
|
16
|
+
klass.class_eval do
|
17
|
+
extend Forwardable
|
18
|
+
@ann_spec_hash = {}
|
19
|
+
@local_ann_attrs = []
|
20
|
+
end
|
17
21
|
end
|
18
22
|
|
19
23
|
# @return [Integer, nil] this class's entity id, if it exists, otherwise the superclass effective entity id
|
@@ -79,6 +83,16 @@ module CaTissue
|
|
79
83
|
end
|
80
84
|
end
|
81
85
|
|
86
|
+
def printable_attributes
|
87
|
+
@prbl_attrs ||= super.union(annotation_attributes)
|
88
|
+
end
|
89
|
+
|
90
|
+
def annotation_attributes
|
91
|
+
@ann_attrs ||= append_ancestor_enum(@local_ann_attrs) do |sc|
|
92
|
+
sc.annotation_attributes if sc < Annotatable
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
82
96
|
protected
|
83
97
|
|
84
98
|
# @return [<AnnotationModule>] the annotation modules in the class hierarchy
|
@@ -250,6 +264,9 @@ module CaTissue
|
|
250
264
|
|
251
265
|
# the annotation is a dependent
|
252
266
|
add_dependent_attribute(attribute, :logical)
|
267
|
+
|
268
|
+
# add the attribute to the local collection
|
269
|
+
@local_ann_attrs << attribute
|
253
270
|
end
|
254
271
|
end
|
255
272
|
end
|
@@ -31,6 +31,11 @@ module CaTissue
|
|
31
31
|
|
32
32
|
# If there is no conventional owner, then try the hook.
|
33
33
|
#
|
34
|
+
# caTissue alert - DE annotations have a physical dependency ownership model that is at odds
|
35
|
+
# with the logical model. An annotation does not directly reference its static hook owner
|
36
|
+
# instance. Rather, it references the hook proxy which stands in for the hook entity in the
|
37
|
+
# annotation package.
|
38
|
+
#
|
34
39
|
# @return the {CaRuby::Resource#owner} or the {#hook}
|
35
40
|
def owner
|
36
41
|
super or hook
|
@@ -49,6 +49,16 @@ module CaTissue
|
|
49
49
|
dependent_attributes.each { |attr| save_dependent_attribute(annotation, attr) }
|
50
50
|
end
|
51
51
|
|
52
|
+
# @return [Boolean] whether this annotation refers to a {#primary?} annotation
|
53
|
+
def secondary?
|
54
|
+
not @proxy_attribute.nil?
|
55
|
+
end
|
56
|
+
|
57
|
+
# @return [Boolean] whether this annotation is neither a {#primary?} nor a #{secondary} annotation
|
58
|
+
def tertiary_annotation
|
59
|
+
not (primary? or secondary?)
|
60
|
+
end
|
61
|
+
|
52
62
|
# Detects or creates the proxy attribute that references the given proxy class.
|
53
63
|
# if this is a primary_entity annotation class which does not
|
54
64
|
# have a caTissue proxy property.
|
@@ -62,7 +72,9 @@ module CaTissue
|
|
62
72
|
# set the hook
|
63
73
|
self.hook = proxy.hook
|
64
74
|
# primary superclass gets a proxy as well
|
65
|
-
if superclass < Annotation
|
75
|
+
if superclass < Annotation then
|
76
|
+
superclass.ensure_primary_has_proxy(proxy)
|
77
|
+
end
|
66
78
|
end
|
67
79
|
|
68
80
|
# @param [Class] klass the hook class for this primary annotation
|
@@ -184,7 +196,7 @@ module CaTissue
|
|
184
196
|
|
185
197
|
def obtain_proxy_attribute(proxy)
|
186
198
|
# parent proxy is reserved for RadiationTherapy use case described in ParticipantTest.
|
187
|
-
# TODO - either support this use case
|
199
|
+
# TODO - either support this use case or delete the parent proxy call
|
188
200
|
detect_proxy_attribute(proxy) or create_proxy_attribute(proxy) or parent_proxy_attribute
|
189
201
|
end
|
190
202
|
|
@@ -213,7 +225,7 @@ module CaTissue
|
|
213
225
|
def create_proxy_attribute(proxy)
|
214
226
|
# the proxy attribute symbol
|
215
227
|
attr = proxy.name.demodulize.underscore.to_sym
|
216
|
-
logger.debug { "Creating primary annotation #{qp} proxy attribute #{attr}..." }
|
228
|
+
logger.debug { "Creating primary annotation #{qp} proxy #{proxy} attribute #{attr}..." }
|
217
229
|
# make the attribute
|
218
230
|
attr_accessor(attr)
|
219
231
|
# Add the attribute. Setting the saved flag ensures that the save template passed to
|
@@ -37,10 +37,11 @@ module CaTissue
|
|
37
37
|
|
38
38
|
# Adds each proxy => annotation reference as a dependent attribute.
|
39
39
|
def add_annotation_dependents
|
40
|
+
# first add the direct dependents
|
40
41
|
annotation_attributes.each_metadata do |attr_md|
|
41
42
|
attr_md.type.add_dependent_attributes
|
42
|
-
attr_md.type.proxy = self
|
43
43
|
end
|
44
|
+
# now add the recursive indirect dependents
|
44
45
|
annotation_attributes.each_metadata do |attr_md|
|
45
46
|
attr_md.type.add_dependent_attribute_closure
|
46
47
|
end
|
@@ -37,21 +37,28 @@ module CaTissue
|
|
37
37
|
# @return [Annotation] the annotation
|
38
38
|
def create(annotation)
|
39
39
|
logger.debug { "Creating annotation #{annotation.qp}..." }
|
40
|
-
|
40
|
+
time { create_annotation(annotation) }
|
41
|
+
logger.debug { "Created annotation #{annotation}." }
|
42
|
+
annotation
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
# @param [Annotation] (see #create)
|
48
|
+
def create_annotation(annotation)
|
49
|
+
# get the hook
|
41
50
|
hook = annotation.hook
|
42
51
|
# If no hook, then this is not a primary annotation. In that case, find a referenced
|
43
52
|
# primary annotation.
|
53
|
+
# If no hook, then this is not a primary annotation. In that case, find a referenced
|
54
|
+
# primary annotation.
|
44
55
|
if hook then
|
45
|
-
|
56
|
+
create_primary_annotation(annotation, hook)
|
46
57
|
else
|
47
58
|
create_secondary_annotation(annotation)
|
48
59
|
end
|
49
|
-
logger.debug { "Created annotation #{annotation}." }
|
50
|
-
annotation
|
51
60
|
end
|
52
61
|
|
53
|
-
private
|
54
|
-
|
55
62
|
# @param annotation (see #create)
|
56
63
|
# @param [Annotable] the annotatable object referenced by this annotation
|
57
64
|
def create_primary_annotation(annotation, hook)
|
@@ -19,7 +19,9 @@ module CaTissue
|
|
19
19
|
# @param [String] name the service name
|
20
20
|
# @return [Annotation::AnnotationService] the annotation service
|
21
21
|
def create_annotation_service(name)
|
22
|
-
|
22
|
+
host = CaTissue.access_properties[:host]
|
23
|
+
port = CaTissue.access_properties[:port]
|
24
|
+
Annotation::AnnotationService.new(@database, name, :host => host, :port => port, :integration_service => @integration_service)
|
23
25
|
end
|
24
26
|
end
|
25
27
|
end
|
@@ -5,25 +5,16 @@ require 'catissue/database/annotation/id_generator'
|
|
5
5
|
|
6
6
|
module CaTissue
|
7
7
|
module Annotation
|
8
|
-
#
|
9
|
-
java_import('edu.wustl.common.security.exceptions.UserNotAuthorizedException')
|
10
|
-
|
11
|
-
# Import the caTissue Java EntityManager.
|
12
|
-
java_import('edu.common.dynamicextensions.entitymanager.EntityManager')
|
13
|
-
|
14
|
-
# EntityFacade is the caRuby interface to the caTissue EntityManager. EntityManager is
|
8
|
+
# EntityFacade is the caRuby substitue for the broken caTissue EntityManager. EntityManager is
|
15
9
|
# the caTissue singleton Winnebago object for doing lots of things with dynamic extensions.
|
16
10
|
class EntityFacade
|
17
11
|
include Singleton
|
18
12
|
|
19
13
|
private
|
20
14
|
|
21
|
-
# Initializes the
|
22
|
-
#
|
23
|
-
# method docs and {IdGenerator}.
|
15
|
+
# Initializes the id generator and a SQL executor. The id generator and executor are
|
16
|
+
# used for the caTissue bug work-arounds described in the method docs and {IdGenerator}.
|
24
17
|
def initialize
|
25
|
-
# the encapsulated caTissue singleton
|
26
|
-
@emgr = EntityManager.instance
|
27
18
|
# the work-around id generator
|
28
19
|
@idgen = IdGenerator.new
|
29
20
|
# a general-purpose SQL executor for calling the work-arounds
|
@@ -72,7 +63,11 @@ module CaTissue
|
|
72
63
|
# @param [Class] klass the {Annotatable} class
|
73
64
|
# @return [Integer] the class entity id
|
74
65
|
def hook_entity_id(klass)
|
75
|
-
|
66
|
+
result = @executor.execute { |dbh| dbh.select_one(HOOK_ENTITY_ID_SQL, klass.java_class.name) }
|
67
|
+
if result.nil? then raise AnnotationError.new("Entity id not found for static hook class #{klass.qp}") end
|
68
|
+
eid = result[0].to_i
|
69
|
+
logger.debug { "Static hook class #{klass.qp} has entity id #{eid}." }
|
70
|
+
eid
|
76
71
|
end
|
77
72
|
|
78
73
|
# caTissue alert - call into caTissue to get entity id doesn't work for non-primary object.
|
@@ -116,7 +111,7 @@ module CaTissue
|
|
116
111
|
# @return [Integer, nil] the parent entity id, if any
|
117
112
|
def parent_entity_id(eid)
|
118
113
|
result = @executor.execute { |dbh| dbh.select_one(PARENT_ENTITY_ID_SQL, eid) }
|
119
|
-
result[0] if result
|
114
|
+
result[0].to_i if result and result[0]
|
120
115
|
end
|
121
116
|
|
122
117
|
# Obtains the undocumented caTisue container id for the given primary entity id.
|
@@ -138,10 +133,10 @@ module CaTissue
|
|
138
133
|
# EntityManager.instance.get_container_id_for_entity(eid)
|
139
134
|
# Work-around caTissue bug with direct query.
|
140
135
|
result = @executor.execute { |dbh| dbh.select_one(CTR_ID_SQL, eid) }
|
141
|
-
|
142
|
-
if cid.nil? then
|
136
|
+
if result.nil? then
|
143
137
|
raise AnnotationError.new("Dynamic extension container id not found for annotation #{annotation} with entity id #{eid}")
|
144
138
|
end
|
139
|
+
cid = result[0].to_i
|
145
140
|
logger.debug { "Annotation with entity id #{eid} has container id #{cid}." }
|
146
141
|
cid
|
147
142
|
end
|
@@ -163,7 +158,7 @@ module CaTissue
|
|
163
158
|
pkg, cls_nm = klass.java_class.name.split('.')
|
164
159
|
# Dive into some obscure SQL
|
165
160
|
result = @executor.execute { |dbh| dbh.select_one(CTR_ENTITY_ID_SQL, pkg, cls_nm) }
|
166
|
-
result[0] if result
|
161
|
+
result[0].to_i if result
|
167
162
|
end
|
168
163
|
|
169
164
|
# @param (see #primary_entity_id)
|
@@ -213,20 +208,17 @@ module CaTissue
|
|
213
208
|
logger.debug { "Attempting to find entity id #{eid} #{role} associated entity id using variant #{alt}..." }
|
214
209
|
result = @executor.execute { |dbh| dbh.select_one(ASSN_ENTITY_ID_SQL, eid, alt) }
|
215
210
|
end
|
216
|
-
if result.nil? then
|
217
|
-
|
218
|
-
end
|
219
|
-
result[0] if result
|
220
|
-
end
|
221
|
-
|
222
|
-
# @param [String] designator the class name, demodulized in the case of an annotation entity
|
223
|
-
# @return [Integer] the caTissue entity id for the given class name
|
224
|
-
# @raise [CaRuby::DatabaseError] if the DE entity id is not found for the given designator
|
225
|
-
def entity_id_for_class_designator(designator)
|
226
|
-
@emgr.getEntityId(designator) or
|
227
|
-
raise CaRuby::DatabaseError.new("Dynamic extension entity id not found for #{designator}")
|
211
|
+
if result.nil? then logger.debug { "Entity id #{eid} is not directly associated with #{role}." } end
|
212
|
+
result[0].to_i if result
|
228
213
|
end
|
229
214
|
|
215
|
+
# The SQL to find an entity id for a primary entity.
|
216
|
+
HOOK_ENTITY_ID_SQL = <<EOS
|
217
|
+
select IDENTIFIER
|
218
|
+
from DYEXTN_ABSTRACT_METADATA
|
219
|
+
where NAME = ?
|
220
|
+
EOS
|
221
|
+
|
230
222
|
# The SQL to find an entity id for a primary entity.
|
231
223
|
CTR_ENTITY_ID_SQL = <<EOS
|
232
224
|
select ctr.ABSTRACT_ENTITY_ID
|
@@ -6,15 +6,17 @@ module CaTissue
|
|
6
6
|
class IntegrationService < CaRuby::PersistenceService
|
7
7
|
SERVICE_NAME = 'deintegration'
|
8
8
|
|
9
|
-
java_import
|
9
|
+
java_import 'deintegration.EntityMap'
|
10
10
|
|
11
|
-
java_import
|
11
|
+
java_import 'deintegration.EntityMapRecord'
|
12
12
|
|
13
|
-
java_import
|
13
|
+
java_import 'deintegration.FormContext'
|
14
14
|
|
15
15
|
# @param [EntityFacade] the global entity manager
|
16
16
|
def initialize
|
17
|
-
|
17
|
+
host = CaTissue.access_properties[:host]
|
18
|
+
port = CaTissue.access_properties[:port]
|
19
|
+
super(SERVICE_NAME, :host => host, :port => port)
|
18
20
|
# SQL executor to handle caTissue DE API bug work-around
|
19
21
|
@executor = CaRuby::SQLExecutor.new(CaTissue.access_properties)
|
20
22
|
end
|
data/lib/catissue/database.rb
CHANGED
@@ -313,7 +313,7 @@ module CaTissue
|
|
313
313
|
end
|
314
314
|
logger.debug { "Work around caTissue Bug #164 by setting the #{obj.qp} update template #{template.qp} external_identifiers to nil." }
|
315
315
|
template.external_identifiers = nil
|
316
|
-
elsif Annotation === obj and obj.class.
|
316
|
+
elsif Annotation === obj and obj.class.secondary? then
|
317
317
|
copy_annotation_proxy_owner_to_template(obj, template)
|
318
318
|
end
|
319
319
|
super
|
@@ -395,7 +395,7 @@ module CaTissue
|
|
395
395
|
specimen.is_available = true
|
396
396
|
oiqty = specimen.initial_quantity
|
397
397
|
oaqty = specimen.available_quantity
|
398
|
-
ostatus =
|
398
|
+
ostatus = specimen.activity_status
|
399
399
|
specimen.initial_quantity = 1.0
|
400
400
|
specimen.available_quantity = 1.0
|
401
401
|
specimen.activity_status = 'Active'
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module CaTissue
|
2
2
|
# explicitly import AbstractDomainObject, since it is not in the default CaTissue package and therefore can't be auto-imported
|
3
|
-
java_import
|
3
|
+
java_import Java::edu.wustl.common.domain.AbstractDomainObject
|
4
4
|
|
5
5
|
class AbstractDomainObject
|
6
6
|
include Resource
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'catissue/util/position'
|
2
2
|
|
3
3
|
module CaTissue
|
4
|
-
java_import
|
4
|
+
java_import Java::edu.wustl.catissuecore.domain.AbstractPosition
|
5
5
|
|
6
6
|
# The +caTissue+ AbstractPosition class is augmented with a comparison operator and the
|
7
7
|
# zero-based +row+ and +column+ methods wrapping the corresponding one-based dimension
|
@@ -2,7 +2,7 @@ require 'catissue/domain/scg_event_parameters'
|
|
2
2
|
|
3
3
|
module CaTissue
|
4
4
|
# import the Java class
|
5
|
-
java_import
|
5
|
+
java_import Java::edu.wustl.catissuecore.domain.CollectionEventParameters
|
6
6
|
|
7
7
|
class CollectionEventParameters
|
8
8
|
include Resource, SCGEventParameters
|
@@ -3,7 +3,7 @@ require 'catissue/domain/hash_code'
|
|
3
3
|
|
4
4
|
module CaTissue
|
5
5
|
# import the Java class
|
6
|
-
java_import
|
6
|
+
java_import Java::edu.wustl.catissuecore.domain.CollectionProtocol
|
7
7
|
|
8
8
|
# The CollectionProtocol domain class.
|
9
9
|
class CollectionProtocol
|
@@ -3,7 +3,7 @@ require 'catissue/domain/hash_code'
|
|
3
3
|
|
4
4
|
module CaTissue
|
5
5
|
# import the Java class
|
6
|
-
java_import
|
6
|
+
java_import Java::edu.wustl.catissuecore.domain.CollectionProtocolEvent
|
7
7
|
|
8
8
|
# The CollectionProtocolRegistration domain class.
|
9
9
|
class CollectionProtocolEvent
|