Module: Ddr::Datastreams::DatastreamBehavior

Extended by:
ActiveSupport::Concern
Defined in:
lib/ddr/datastreams/datastream_behavior.rb

Constant Summary collapse

DEFAULT_FILE_EXTENSION =
"bin"
STRFTIME_FORMAT =
"%Y-%m-%dT%H:%M:%S.%LZ"

Instance Method Summary collapse

Instance Method Details

#content_digest(algorithm) ⇒ Object



50
51
52
# File 'lib/ddr/datastreams/datastream_behavior.rb', line 50

def content_digest algorithm
  Ddr::Utils.digest(self.content, algorithm)
end

#create_date_stringObject



46
47
48
# File 'lib/ddr/datastreams/datastream_behavior.rb', line 46

def create_date_string
  dsCreateDate.strftime(STRFTIME_FORMAT) if dsCreateDate
end

#default_file_extensionObject

Return default file extension for datastream based on MIME type



86
87
88
89
90
91
92
93
94
95
# File 'lib/ddr/datastreams/datastream_behavior.rb', line 86

def default_file_extension
  mimetypes = MIME::Types[mimeType]
  return mimetypes.first.extensions.first unless mimetypes.empty?
  case mimeType
  when 'application/n-triples'
    'txt'
  else
    DEFAULT_FILE_EXTENSION
  end
end

#default_file_nameObject

Return default file name



103
104
105
# File 'lib/ddr/datastreams/datastream_behavior.rb', line 103

def default_file_name
  [default_file_prefix, default_file_extension].join(".")
end

#default_file_prefixObject

Return default file name prefix based on object PID



98
99
100
# File 'lib/ddr/datastreams/datastream_behavior.rb', line 98

def default_file_prefix
  [pid.sub(/:/, '_'), dsid].join("_")
end

#file_nameObject



68
69
70
71
72
# File 'lib/ddr/datastreams/datastream_behavior.rb', line 68

def file_name
  if path = file_path
    File.basename(path)
  end
end

#file_pathObject



62
63
64
65
66
# File 'lib/ddr/datastreams/datastream_behavior.rb', line 62

def file_path
  if external? && dsLocation.present? && dsLocation.start_with?("file:")
    Ddr::Utils.path_from_uri(dsLocation)
  end
end

#file_pathsObject



54
55
56
57
58
59
60
# File 'lib/ddr/datastreams/datastream_behavior.rb', line 54

def file_paths
  if new?
    return Array(file_path)
  else
    versions.map(&:file_path).compact
  end
end

#file_sizeObject

Returns the size of the external file for the datastream.



75
76
77
78
79
80
81
82
83
# File 'lib/ddr/datastreams/datastream_behavior.rb', line 75

def file_size
  if external?
    if path = file_path
      File.size(path)
    end
  else
    dsSize
  end
end

#tempfile(prefix: nil, suffix: nil) ⇒ Object



107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/ddr/datastreams/datastream_behavior.rb', line 107

def tempfile(prefix: nil, suffix: nil)
  if empty?
    raise Ddr::Models::Error, "Refusing to create tempfile for empty datastream!"
  end
  prefix ||= default_file_prefix + "--"
  suffix ||= "." + default_file_extension
  Tempfile.open [prefix, suffix], encoding: Encoding::ASCII_8BIT do |f|
    f.write(content)
    f.close
    yield f
  end
end

#validate_checksum!(checksum, checksum_type = nil) ⇒ Object

Raises:



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/ddr/datastreams/datastream_behavior.rb', line 15

def validate_checksum! checksum, checksum_type=nil
  raise Ddr::Models::Error, "Checksum cannot be validated on new datastream." if new?
  raise Ddr::Models::Error, "Checksum cannot be validated on unpersisted content." if content_changed?
  raise Ddr::Models::ChecksumInvalid, "The repository internal checksum validation failed." unless dsChecksumValid
  algorithm = checksum_type || self.checksumType
  ds_checksum = if !external? && algorithm == self.checksumType
                  self.checksum
                else
                  content_digest(algorithm)
                end
  if checksum == ds_checksum
    "The checksum [#{algorithm}]#{checksum} is valid for datastream #{version_info}."
  else
    raise Ddr::Models::ChecksumInvalid, "The checksum [#{algorithm}]#{checksum} is not valid for datastream #{version_info}."
  end
end

#version_historyObject



32
33
34
# File 'lib/ddr/datastreams/datastream_behavior.rb', line 32

def version_history
  versions.map(&:profile)
end

#version_infoObject



41
42
43
44
# File 'lib/ddr/datastreams/datastream_behavior.rb', line 41

def version_info
  # E.g., info:fedora/duke:1/content/content.0 [2013-09-26T20:00:03.357Z]
  "#{version_uri} [#{Ddr::Utils.ds_as_of_date_time(self)}]" unless new?
end

#version_uriObject



36
37
38
39
# File 'lib/ddr/datastreams/datastream_behavior.rb', line 36

def version_uri
  # E.g., info:fedora/duke:1/content/content.0
  ["info:fedora", pid, dsid, dsVersionID].join("/") unless new?
end