Class: Ddr::Models::PermanentId
- Inherits:
-
Object
- Object
- Ddr::Models::PermanentId
show all
- Defined in:
- lib/ddr/models/permanent_id.rb
Defined Under Namespace
Classes: AlreadyAssigned, AssignmentFailed, Error, IdentifierNotAssigned, IdentifierNotFound, RepoObjectNotPersisted
Constant Summary
collapse
- PERMANENT_URL_BASE =
"https://idn.duke.edu/".freeze
- DEFAULT_STATUS =
Ezid::Status::RESERVED
- DEFAULT_EXPORT =
"no".freeze
- DEFAULT_PROFILE =
"dc".freeze
- DEFAULT_TARGET =
"https://repository.duke.edu/id/%s"
- FCREPO3_PID =
"fcrepo3.pid".freeze
- DELETED =
"deleted".freeze
- DEACCESSIONED =
"deaccessioned".freeze
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(repo_object_or_id, identifier_or_id = nil) ⇒ PermanentId
Returns a new instance of PermanentId.
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
# File 'lib/ddr/models/permanent_id.rb', line 79
def initialize(repo_object_or_id, identifier_or_id = nil)
case repo_object_or_id
when ActiveFedora::Base
raise RepoObjectNotPersisted, "Repository object must be persisted." if repo_object_or_id.new_record?
@repo_object = repo_object_or_id
when String, nil
@repo_id = repo_object_or_id
else
raise TypeError, "#{repo_object_or_id.class} is not expected as the first argument."
end
case identifier_or_id
when identifier_class
@identifier = identifier_or_id
when String, nil
@identifier_id = identifier_or_id
else
raise TypeError, "#{identifier_or_id.class} is not expected as the second argument."
end
end
|
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args, &block) ⇒ Object
212
213
214
|
# File 'lib/ddr/models/permanent_id.rb', line 212
def method_missing(name, *args, &block)
identifier.send(name, *args, &block)
end
|
Class Method Details
.assign!(repo_object_or_id, identifier_or_id = nil) ⇒ Object
70
71
72
|
# File 'lib/ddr/models/permanent_id.rb', line 70
def self.assign!(repo_object_or_id, identifier_or_id = nil)
new(repo_object_or_id, identifier_or_id).assign!
end
|
.assigned(repo_object_or_id) ⇒ Object
74
75
76
77
|
# File 'lib/ddr/models/permanent_id.rb', line 74
def self.assigned(repo_object_or_id)
perm_id = new(repo_object_or_id)
perm_id.assigned? ? perm_id : nil
end
|
.auto_update? ⇒ Boolean
53
54
55
|
# File 'lib/ddr/models/permanent_id.rb', line 53
def self.auto_update?
Ddr::Models.auto_update_permanent_id
end
|
.call(*args) ⇒ Object
ActiveSupport::Notifications event handler
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
# File 'lib/ddr/models/permanent_id.rb', line 34
def self.call(*args)
event = ActiveSupport::Notifications::Event.new(*args)
repo_id, identifier_id, reason = event.payload.values_at(:pid, :permanent_id, :reason)
case event.name
when Base::UPDATE
if auto_update? && event.payload[:attributes_changed].include?("workflow_state")
update!(repo_id)
end
when Base::DEACCESSION
if auto_update? && identifier_id
deaccession!(repo_id, identifier_id, reason)
end
when Base::DELETE
if auto_update? && identifier_id
delete!(repo_id, identifier_id, reason)
end
end
end
|
.deaccession!(repo_object_or_id, identifier_or_id, reason = nil) ⇒ Object
57
58
59
|
# File 'lib/ddr/models/permanent_id.rb', line 57
def self.deaccession!(repo_object_or_id, identifier_or_id, reason = nil)
new(repo_object_or_id, identifier_or_id).deaccession!(reason)
end
|
.delete!(repo_object_or_id, identifier_or_id, reason = nil) ⇒ Object
61
62
63
|
# File 'lib/ddr/models/permanent_id.rb', line 61
def self.delete!(repo_object_or_id, identifier_or_id, reason = nil)
new(repo_object_or_id, identifier_or_id).delete!(reason)
end
|
.update!(repo_object_or_id) ⇒ Object
65
66
67
68
|
# File 'lib/ddr/models/permanent_id.rb', line 65
def self.update!(repo_object_or_id)
perm_id = new(repo_object_or_id)
perm_id.update! if perm_id.assigned?
end
|
Instance Method Details
#assign!(id = nil) ⇒ Object
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
# File 'lib/ddr/models/permanent_id.rb', line 108
def assign!(id = nil)
if assigned?
raise AlreadyAssigned,
"Repository object \"#{repo_object.id}\" has already been assigned permanent id \"#{repo_object.permanent_id}\"."
end
@identifier = case id
when identifier_class
id
when String
find_identifier(id)
when nil
mint_identifier
end
repo_object.reload
repo_object.permanent_id = identifier.id
repo_object.permanent_url = PERMANENT_URL_BASE + identifier.id
repo_object.save!
set_metadata!
end
|
#assigned? ⇒ Boolean
128
129
130
|
# File 'lib/ddr/models/permanent_id.rb', line 128
def assigned?
repo_object.permanent_id
end
|
#deaccession!(reason = nil) ⇒ Object
140
141
142
|
# File 'lib/ddr/models/permanent_id.rb', line 140
def deaccession!(reason = nil)
delete_or_make_unavailable(reason || DEACCESSIONED)
end
|
#delete!(reason = nil) ⇒ Object
144
145
146
|
# File 'lib/ddr/models/permanent_id.rb', line 144
def delete!(reason = nil)
delete_or_make_unavailable(reason || DELETED)
end
|
#identifier ⇒ Object
148
149
150
151
152
153
154
155
156
157
|
# File 'lib/ddr/models/permanent_id.rb', line 148
def identifier
if @identifier.nil?
if identifier_id
@identifier = find_identifier(identifier_id)
elsif assigned?
@identifier = find_identifier(repo_object.permanent_id)
end
end
@identifier
end
|
#identifier_id ⇒ Object
159
160
161
|
# File 'lib/ddr/models/permanent_id.rb', line 159
def identifier_id
@identifier_id ||= @identifier && @identifier.id
end
|
#identifier_repo_id ⇒ Object
194
195
196
|
# File 'lib/ddr/models/permanent_id.rb', line 194
def identifier_repo_id
self[identifier_repo_id_field]
end
|
#identifier_repo_id=(val) ⇒ Object
187
188
189
190
191
192
|
# File 'lib/ddr/models/permanent_id.rb', line 187
def identifier_repo_id=(val)
if identifier_repo_id
raise Error, "Identifier repository id already set to \"#{identifier_repo_id}\"; cannot change."
end
self[identifier_repo_id_field] = val
end
|
#repo_id ⇒ Object
104
105
106
|
# File 'lib/ddr/models/permanent_id.rb', line 104
def repo_id
@repo_id ||= @repo_object && @repo_object.id
end
|
#repo_object ⇒ Object
100
101
102
|
# File 'lib/ddr/models/permanent_id.rb', line 100
def repo_object
@repo_object ||= ActiveFedora::Base.find(repo_id)
end
|
#set_identifier_repo_id ⇒ Object
183
184
185
|
# File 'lib/ddr/models/permanent_id.rb', line 183
def set_identifier_repo_id
self.identifier_repo_id = repo_object.id
end
|
173
174
175
176
177
|
# File 'lib/ddr/models/permanent_id.rb', line 173
def set_metadata
set_target
set_status
set_identifier_repo_id
end
|
167
168
169
170
171
|
# File 'lib/ddr/models/permanent_id.rb', line 167
def set_metadata!
set_metadata
save
self
end
|
#set_permanent_url ⇒ Object
163
164
165
|
# File 'lib/ddr/models/permanent_id.rb', line 163
def set_permanent_url
repo_object.permanent_url = PERMANENT_URL_BASE + identifier.id
end
|
#set_status ⇒ Object
202
203
204
205
206
207
208
|
# File 'lib/ddr/models/permanent_id.rb', line 202
def set_status
if repo_object.published? && !public?
public!
elsif repo_object.unpublished? && public?
unavailable!("not published")
end
end
|
#set_status! ⇒ Object
198
199
200
|
# File 'lib/ddr/models/permanent_id.rb', line 198
def set_status!
save if set_status
end
|
#set_target ⇒ Object
179
180
181
|
# File 'lib/ddr/models/permanent_id.rb', line 179
def set_target
self.target = DEFAULT_TARGET % id
end
|
#update! ⇒ Object
132
133
134
135
136
137
138
|
# File 'lib/ddr/models/permanent_id.rb', line 132
def update!
if !assigned?
raise IdentifierNotAssigned,
"Cannot update identifier for repository object \"#{repo_object.id}\"; not assigned."
end
set_status!
end
|