Class: Ddr::Models::PermanentId

Inherits:
Object
  • Object
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 (protected)



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

Returns:

  • (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

Returns:

  • (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

#identifierObject



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_idObject



159
160
161
# File 'lib/ddr/models/permanent_id.rb', line 159

def identifier_id
  @identifier_id ||= @identifier && @identifier.id
end

#identifier_repo_idObject



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_idObject



104
105
106
# File 'lib/ddr/models/permanent_id.rb', line 104

def repo_id
  @repo_id ||= @repo_object && @repo_object.id
end

#repo_objectObject



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_idObject



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

#set_metadataObject



173
174
175
176
177
# File 'lib/ddr/models/permanent_id.rb', line 173

def 
  set_target
  set_status
  set_identifier_repo_id
end

#set_metadata!Object



167
168
169
170
171
# File 'lib/ddr/models/permanent_id.rb', line 167

def set_metadata!
  
  save
  self
end

#set_permanent_urlObject



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_statusObject



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_targetObject



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