adiwg-mdtranslator 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (25) hide show
  1. checksums.yaml +4 -4
  2. data/adiwg-mdtranslator.gemspec +2 -2
  3. data/lib/adiwg/mdtranslator/readers/fgcd/version.rb +14 -0
  4. data/lib/adiwg/mdtranslator/readers/sbJson/modules/module_browseCategory.rb +2 -4
  5. data/lib/adiwg/mdtranslator/readers/sbJson/modules/module_codelists.rb +196 -0
  6. data/lib/adiwg/mdtranslator/readers/sbJson/modules/module_date.rb +4 -5
  7. data/lib/adiwg/mdtranslator/readers/sbJson/modules/module_extent.rb +2 -2
  8. data/lib/adiwg/mdtranslator/readers/sbJson/modules/module_project.rb +2 -4
  9. data/lib/adiwg/mdtranslator/readers/sbJson/modules/module_publication.rb +3 -5
  10. data/lib/adiwg/mdtranslator/readers/sbJson/modules/module_relatedItem.rb +178 -0
  11. data/lib/adiwg/mdtranslator/readers/sbJson/modules/module_sbJson.rb +6 -0
  12. data/lib/adiwg/mdtranslator/readers/sbJson/modules/module_tag.rb +0 -2
  13. data/lib/adiwg/mdtranslator/version.rb +2 -1
  14. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_browseCategory.rb +1 -1
  15. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_citation.rb +2 -2
  16. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_codelists.rb +160 -212
  17. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_contact.rb +1 -1
  18. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_date.rb +1 -1
  19. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_materialRequest.rb +1 -1
  20. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_project.rb +1 -1
  21. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_sbJson.rb +2 -4
  22. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_tag.rb +20 -3
  23. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_webLink.rb +9 -2
  24. metadata +8 -6
  25. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_metadataRepository.rb +0 -45
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eaa279b686cbbf45cc0066e9aef52a6c72604444
4
- data.tar.gz: a88be00a70a91aae1cfb0d77ac333b758731c5e7
3
+ metadata.gz: 424da312bdcfc7617f563857a6e8767ebb3b3c4c
4
+ data.tar.gz: f35fdf24c6a34dd418bab443b39d4050a748cdbc
5
5
  SHA512:
6
- metadata.gz: e755033a24e274d7af87523e5209a65d8b9b046a9e4967be02d407657475c8983c45fa1fb97260f9422ea39530f8e10e7f5456ff4afc4183800006ba813af0ff
7
- data.tar.gz: a23c434be20d0309294c36133f2bcb2099883198c46c3fde5701361dfba854798ba156dbc2a5cb9916b7ae3aa213d58fb84126fbb88a70634698043c2132cdfc
6
+ metadata.gz: 4fb9075e39f5f0406ca5196353a7dd75a19735b0a72870f0d7a7814a3361a0390feec8080a6fa6fbf458fb7d46dd382f816e42db3fe955d1462e2248b0d51b38
7
+ data.tar.gz: 8db4fd7f94bac35cf98473c353dde6513e9dfc56347ca71218bf719d5919e28c533a47e532620d19ae52305c71c424a18e6d9055f1b8eb520cad16e016c24aad
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.test_files = spec.files.grep(%r{^(tc|test|spec|features)/})
23
23
  spec.require_paths = ["lib"]
24
24
 
25
- spec.required_ruby_version = '>= 2.1'
25
+ spec.required_ruby_version = '>= 2.2'
26
26
 
27
27
  spec.add_development_dependency "bundler", "~> 1"
28
28
  spec.add_development_dependency "rake", "~> 10"
@@ -34,7 +34,7 @@ Gem::Specification.new do |spec|
34
34
  spec.add_runtime_dependency "uuidtools", "~> 2.1"
35
35
  spec.add_runtime_dependency "json-schema", "~> 2.7"
36
36
  spec.add_runtime_dependency "adiwg-mdjson_schemas", ">= 2.2"
37
- spec.add_runtime_dependency "adiwg-mdcodes", "~> 2.1"
37
+ spec.add_runtime_dependency "adiwg-mdcodes", "~> 2.3"
38
38
  spec.add_runtime_dependency "jbuilder", "~> 2.5"
39
39
  spec.add_runtime_dependency "kramdown", "~> 1.13"
40
40
  spec.add_runtime_dependency "coderay", "~> 1.1"
@@ -0,0 +1,14 @@
1
+ # adiwg mdTranslator / readers / fgdc
2
+
3
+ # version 1 history
4
+ # 1.0.0 2017-07-11 version 1 FGDC CSDGM
5
+
6
+ module ADIWG
7
+ module Mdtranslator
8
+ module Readers
9
+ module Fgdc
10
+ VERSION = "1.0.0"
11
+ end
12
+ end
13
+ end
14
+ end
@@ -5,7 +5,7 @@
5
5
  # Stan Smith 2016-06-22 original script
6
6
 
7
7
  require 'adiwg/mdtranslator/internal/internal_metadata_obj'
8
- require 'adiwg/mdtranslator/writers/sbJson/sections/sbJson_codelists'
8
+ require_relative 'module_codelists'
9
9
 
10
10
  module ADIWG
11
11
  module Mdtranslator
@@ -14,8 +14,6 @@ module ADIWG
14
14
 
15
15
  module BrowseCategory
16
16
 
17
- @Namespace = ADIWG::Mdtranslator::Writers::SbJson
18
-
19
17
  def self.unpack(hSbJson, hResourceInfo, hResponseObj)
20
18
 
21
19
  # instance classes needed in script
@@ -24,7 +22,7 @@ module ADIWG
24
22
  if hSbJson.has_key?('browseCategories')
25
23
  hSbJson['browseCategories'].each do |category|
26
24
  hResType = intMetadataClass.newResourceType
27
- scope = @Namespace::Codelists.codelist_iso_to_sb('iso_sb_scope', :sbCode => category)
25
+ scope = Codelists.codelist_sb2adiwg('scope_sb2adiwg', category)
28
26
  if scope.nil?
29
27
  hResType[:type] = 'dataset'
30
28
  hResType[:name] = category
@@ -0,0 +1,196 @@
1
+ # sbJson 1.0 reader
2
+
3
+ # History:
4
+ # Stan Smith 2017-08-03 refactored - separated forward and reverse translations
5
+ # Stan Smith 2017-05-26 original script
6
+
7
+ require 'adiwg-mdcodes'
8
+
9
+ module ADIWG
10
+ module Mdtranslator
11
+ module Readers
12
+ module SbJson
13
+
14
+ module Codelists
15
+
16
+ @role_sb2adiwg = [
17
+ {sb: 'administrator', adiwg: 'administrator'},
18
+ {sb: 'Associate Project Chief', adiwg: nil},
19
+ {sb: 'Author', adiwg: 'author'},
20
+ {sb: 'client', adiwg: 'client'},
21
+ {sb: 'Co-Investigator', adiwg: 'coPrincipalInvestigator'},
22
+ {sb: 'Contact', adiwg: 'pointOfContact'},
23
+ {sb: 'Cooperator/Partner', adiwg: 'collaborator'},
24
+ {sb: 'Custodian', adiwg: 'custodian'},
25
+ {sb: 'Data Owner', adiwg: 'owner'},
26
+ {sb: 'Data Provider', adiwg: nil},
27
+ {sb: 'Distributor', adiwg: 'distributor'},
28
+ {sb: 'Editor', adiwg: 'editor'},
29
+ {sb: 'funder', adiwg: 'funder'},
30
+ {sb: 'Funding Agency', adiwg: nil},
31
+ {sb: 'Lead Organization', adiwg: nil},
32
+ {sb: 'logistics', adiwg: 'logistics'},
33
+ {sb: 'Material Request Contact', adiwg: nil},
34
+ {sb: 'mediator', adiwg: 'mediator'},
35
+ {sb: 'Metadata Contact', adiwg: nil},
36
+ {sb: 'Originator', adiwg: 'originator'},
37
+ {sb: 'Participant', adiwg: nil},
38
+ {sb: 'Photographer', adiwg: nil},
39
+ {sb: 'Point of Contact', adiwg: 'pointOfContact'},
40
+ {sb: 'Principal Investigator', adiwg: 'principalInvestigator'},
41
+ {sb: 'Process Contact', adiwg: nil},
42
+ {sb: 'Processor', adiwg: 'processor'},
43
+ {sb: 'Project Chief', adiwg: nil},
44
+ {sb: 'Project Team', adiwg: nil},
45
+ {sb: 'publisher', adiwg: 'publisher'},
46
+ {sb: 'Referred By', adiwg: nil},
47
+ {sb: 'Report Prepared By', adiwg: nil},
48
+ {sb: 'Resource Provider', adiwg: 'resourceProvider'},
49
+ {sb: 'SoftwareEngineer', adiwg: nil},
50
+ {sb: 'sponsor', adiwg: 'sponsor'},
51
+ {sb: 'stakeholder', adiwg: 'stakeholder'},
52
+ {sb: 'Subtask Leader', adiwg: nil},
53
+ {sb: 'Supporter', adiwg: nil},
54
+ {sb: 'Task Leader', adiwg: nil},
55
+ {sb: 'Transmitted', adiwg: nil},
56
+ {sb: 'User', adiwg: 'use'},
57
+ {sb: 'USGS Mission Area', adiwg: nil},
58
+ {sb: 'USGS Program', adiwg: nil},
59
+ ]
60
+
61
+ @onlineFunction_sb2adiwg = [
62
+ {sb: 'arcgis', adiwg: nil},
63
+ {sb: 'browseImage', adiwg: 'browseGraphic'},
64
+ {sb: 'browsing', adiwg: 'browsing'},
65
+ {sb: 'citation', adiwg: nil},
66
+ {sb: 'configFile', adiwg: nil},
67
+ {sb: 'download',adiwg: 'download' },
68
+ {sb: 'emailService', adiwg: 'emailService'},
69
+ {sb: 'fileAccess', adiwg: 'fileAccess'},
70
+ {sb: 'kml', adiwg: nil},
71
+ {sb: 'mapapp', adiwg: nil},
72
+ {sb: 'method', adiwg: nil},
73
+ {sb: 'oai-pmh', adiwg: nil},
74
+ {sb: 'offlineAccess', adiwg: 'offlineAccess'},
75
+ {sb: 'order', adiwg: 'order'},
76
+ {sb: 'originalMetadata', adiwg: 'completeMetadata'},
77
+ {sb: 'pdf', adiwg: nil},
78
+ {sb: 'publicationReferenceSource', adiwg: nil},
79
+ {sb: 'repo', adiwg: nil},
80
+ {sb: 'search', adiwg: 'search'},
81
+ {sb: 'serviceCapabilitiesUrl', adiwg: nil},
82
+ {sb: 'serviceFeatureInfoUrl', adiwg: nil},
83
+ {sb: 'serviceLegendUrl', adiwg: nil},
84
+ {sb: 'serviceLink', adiwg: nil},
85
+ {sb: 'serviceMapUrl', adiwg: nil},
86
+ {sb: 'serviceWfsBackingUrl', adiwg: nil},
87
+ {sb: 'sitemap', adiwg: nil},
88
+ {sb: 'sourceCode', adiwg: nil},
89
+ {sb: 'txt', adiwg: nil},
90
+ {sb: 'upload', adiwg: 'upload'},
91
+ {sb: 'WAF', adiwg: nil},
92
+ {sb: 'webapp', adiwg: 'webApplication'},
93
+ {sb: 'webLink', adiwg: 'information'},
94
+ {sb: 'xls', adiwg: nil},
95
+ {sb: 'zip', adiwg: nil}
96
+ ]
97
+
98
+ @scope_sb2adiwg = [
99
+ {sb: 'Collection', adiwg: 'collection'},
100
+ {sb: 'Data', adiwg: 'dataset'},
101
+ {sb: 'Data Release - In Progress', adiwg: nil},
102
+ {sb: 'Image', adiwg: 'photographicImage'},
103
+ {sb: 'Map', adiwg: 'map'},
104
+ {sb: 'Physical Item', adiwg: 'sample'},
105
+ {sb: 'Project', adiwg: 'project'},
106
+ {sb: 'Publication', adiwg: 'publication'},
107
+ {sb: 'Software', adiwg: 'software'},
108
+ {sb: 'Web Site', adiwg: 'website'}
109
+ ]
110
+
111
+ @date_sb2adiwg = [
112
+ {sb: 'Acquisition', adiwg: 'acquisition'},
113
+ {sb: 'adopted', adiwg: 'adopted'},
114
+ {sb: 'AssessmentDate', adiwg: 'assessment'},
115
+ {sb: 'Award', adiwg: 'award'},
116
+ {sb: 'beginPosition', adiwg: nil},
117
+ {sb: 'Collected', adiwg: 'collected'},
118
+ {sb: 'creation', adiwg: 'creation'},
119
+ {sb: 'deprecated', adiwg: 'deprecated'},
120
+ {sb: 'distribution', adiwg: 'distribution'},
121
+ {sb: 'Due', adiwg: 'due'},
122
+ {sb: 'End', adiwg: 'end'},
123
+ {sb: 'endPosition', adiwg: nil},
124
+ {sb: 'firstProcessed', adiwg: nil},
125
+ {sb: 'info', adiwg: nil},
126
+ {sb: 'inForce', adiwg: 'inForce'},
127
+ {sb: 'lastProcessed', adiwg: nil},
128
+ {sb: 'lastRevision', adiwg: 'lastRevision'},
129
+ {sb: 'lastUpdate', adiwg: 'lastUpdate'},
130
+ {sb: 'nextUpdate', adiwg: 'nextUpdate'},
131
+ {sb: 'Publication', adiwg: 'publication'},
132
+ {sb: 'Received', adiwg: 'received'},
133
+ {sb: 'Release', adiwg: 'released'},
134
+ {sb: 'Reported', adiwg: 'reported'},
135
+ {sb: 'Repository Created', adiwg: nil},
136
+ {sb: 'Repository Updated', adiwg: nil},
137
+ {sb: 'revision', adiwg: 'revision'},
138
+ {sb: 'Start', adiwg: 'start'},
139
+ {sb: 'suspended', adiwg: 'suspended'},
140
+ {sb: 'Transmitted', adiwg: 'transmitted'},
141
+ {sb: 'unavailable', adiwg: 'unavailable'},
142
+ {sb: 'validityBegins', adiwg: 'validityBegins'},
143
+ {sb: 'validityExpires', adiwg: 'validityExpires'}
144
+ ]
145
+
146
+ @progress_sb2adiwg = [
147
+ {sb: 'Active', adiwg: 'onGoing'},
148
+ {sb: 'Approved', adiwg: 'accepted'},
149
+ {sb: 'Completed', adiwg: 'completed'},
150
+ {sb: 'In Progress', adiwg: 'onGoing'},
151
+ {sb: 'Proposed', adiwg: 'proposed'}
152
+ ]
153
+
154
+ @association_sb2adiwg = [
155
+ {sb: 'alternate', adiwg: 'alternate', reverse: 'alternate'},
156
+ {sb: 'constituentOf', adiwg: 'isComposedOf', reverse: 'constituent'},
157
+ {sb: 'copiedFrom', adiwg: nil, reverse: 'copiedInto'},
158
+ {sb: 'derivativeOf', adiwg: 'derivativeProduct', reverse: 'derived'},
159
+ {sb: 'precededBy', adiwg: nil, reverse: 'succeededBy'},
160
+ {sb: 'productOf', adiwg: 'parentProject', reverse: 'produced'},
161
+ {sb: 'related', adiwg: 'crossReference', reverse: 'related'},
162
+ {sb: 'subprojectOf', adiwg: 'subProject', reverse: 'mainprojectOf'}
163
+ ]
164
+
165
+ # translate iso/adiwg code to sb
166
+ def self.codelist_sb2adiwg(codelist, sbCode)
167
+ codeList = instance_variable_get("@#{codelist}")
168
+ unless sbCode.nil?
169
+ codeList.each do |obj|
170
+ if obj[:sb] == sbCode
171
+ return obj[:adiwg]
172
+ end
173
+ end
174
+ end
175
+ return nil
176
+ end
177
+
178
+ # test if provided code is a valid sb code
179
+ def self.is_sb_code(codelist, sbCode)
180
+ codeList = instance_variable_get("@#{codelist}")
181
+ unless sbCode.nil?
182
+ codeList.each do |obj|
183
+ if obj[:sb] == sbCode
184
+ return true
185
+ end
186
+ end
187
+ end
188
+ return false
189
+ end
190
+
191
+ end
192
+
193
+ end
194
+ end
195
+ end
196
+ end
@@ -5,7 +5,7 @@
5
5
  # Stan Smith 2016-06-25 original script
6
6
 
7
7
  require 'adiwg/mdtranslator/internal/internal_metadata_obj'
8
- require 'adiwg/mdtranslator/writers/sbJson/sections/sbJson_codelists'
8
+ require_relative 'module_codelists'
9
9
 
10
10
  module ADIWG
11
11
  module Mdtranslator
@@ -14,8 +14,6 @@ module ADIWG
14
14
 
15
15
  module Date
16
16
 
17
- @Namespace = ADIWG::Mdtranslator::Writers::SbJson
18
-
19
17
  def self.unpack(hSbJson, hCitation, hResponseObj)
20
18
 
21
19
  # instance classes needed in script
@@ -29,8 +27,9 @@ module ADIWG
29
27
  hDate[:date] = aReturn[0]
30
28
  hDate[:dateResolution] = aReturn[1]
31
29
  hDate[:description] = hSbDate['label']
32
- type = @Namespace::Codelists.codelist_iso_to_sb('iso_sb_date', :sbCode => hSbDate['type'])
33
- type = type.nil? ? hSbDate['type'] : type
30
+ sbType = hSbDate['type']
31
+ adiwgType = Codelists.codelist_sb2adiwg('date_sb2adiwg', sbType)
32
+ type = adiwgType.nil? ? sbType : adiwgType
34
33
  hDate[:dateType] = type
35
34
  hCitation[:dates] << hDate
36
35
  end
@@ -21,7 +21,7 @@ module ADIWG
21
21
  extentAdd = "http://www.sciencebase.gov/catalog/extent/#{extentId}?format=geojson"
22
22
  web_contents = open(extentAdd, :read_timeout => 30) { |f| f.read }
23
23
  rescue => readErr
24
- hResponseObj[:readerExecutionMessages] << 'ScienceBase read failed - see following message(s):\n'
24
+ hResponseObj[:readerExecutionMessages] << 'Failed reading ScienceBase extent - see following message(s):\n'
25
25
  hResponseObj[:readerExecutionMessages] << readErr.to_s.slice(0, 300)
26
26
  return {}
27
27
  else
@@ -29,7 +29,7 @@ module ADIWG
29
29
  begin
30
30
  hGeoJson = JSON.parse(web_contents)
31
31
  rescue JSON::JSONError => parseErr
32
- hResponseObj[:readerExecutionMessages] << 'Parsing sbJson failed - see following message(s):\n'
32
+ hResponseObj[:readerExecutionMessages] << 'Parsing extent failed - see following message(s):\n'
33
33
  hResponseObj[:readerExecutionMessages] << parseErr.to_s.slice(0, 300)
34
34
  return {}
35
35
  end
@@ -4,7 +4,7 @@
4
4
  # History:
5
5
  # Stan Smith 2016-06-27 original script
6
6
 
7
- require 'adiwg/mdtranslator/writers/sbJson/sections/sbJson_codelists'
7
+ require_relative 'module_codelists'
8
8
 
9
9
  module ADIWG
10
10
  module Mdtranslator
@@ -13,15 +13,13 @@ module ADIWG
13
13
 
14
14
  module Project
15
15
 
16
- @Namespace = ADIWG::Mdtranslator::Writers::SbJson
17
-
18
16
  def self.unpack(hFacet, hResourceInfo, hResponseObj)
19
17
 
20
18
  # project status
21
19
  if hFacet.has_key?('projectStatus')
22
20
  unless hFacet['projectStatus'].nil? || ['projectStatus'] == ''
23
21
  sbStatus = hFacet['projectStatus']
24
- status = @Namespace::Codelists.codelist_iso_to_sb('iso_sb_progress', :sbCode => sbStatus)
22
+ status = Codelists.codelist_sb2adiwg('progress_sb2adiwg', sbStatus)
25
23
  status = status.nil? ? sbStatus : status
26
24
  hResourceInfo[:status] << status
27
25
  end
@@ -5,7 +5,7 @@
5
5
  # Stan Smith 2016-06-25 original script
6
6
 
7
7
  require 'adiwg/mdtranslator/internal/internal_metadata_obj'
8
- require 'adiwg/mdtranslator/writers/sbJson/sections/sbJson_codelists'
8
+ require_relative 'module_codelists'
9
9
 
10
10
  module ADIWG
11
11
  module Mdtranslator
@@ -16,8 +16,6 @@ module ADIWG
16
16
 
17
17
  def self.unpack(hFacet, hResourceInfo, hCitation, hResponseObj)
18
18
 
19
- @Namespace = ADIWG::Mdtranslator::Writers::SbJson
20
-
21
19
  # instance classes needed in script
22
20
  intMetadataClass = InternalMetadata.new
23
21
 
@@ -26,8 +24,8 @@ module ADIWG
26
24
  unless hFacet['citationType'].nil? || hFacet['citationType'] == ''
27
25
  hResType = intMetadataClass.newResourceType
28
26
  sbType = hFacet['citationType']
29
- type = @Namespace::Codelists.codelist_iso_to_sb('iso_sb_scope', :sbCode => sbType)
30
- type = type.nil? ? sbType : type
27
+ adiwgType = Codelists.codelist_sb2adiwg('scope_sb2adiwg', sbType)
28
+ type = adiwgType.nil? ? sbType : adiwgType
31
29
  hResType[:type] = type
32
30
  hResType[:name] = sbType
33
31
  hResourceInfo[:resourceTypes] << hResType
@@ -0,0 +1,178 @@
1
+ # unpack related items
2
+ # Reader - ScienceBase JSON to internal data structure
3
+
4
+ # History:
5
+ # Stan Smith 2016-08-03 original script
6
+
7
+ require 'json'
8
+ require 'open-uri'
9
+ require 'adiwg/mdtranslator/internal/internal_metadata_obj'
10
+ require_relative 'module_codelists'
11
+
12
+ module ADIWG
13
+ module Mdtranslator
14
+ module Readers
15
+ module SbJson
16
+
17
+ module RelatedItem
18
+
19
+ def self.unpack(hSbJson, hMetadata, hResponseObj)
20
+
21
+ # instance classes needed in script
22
+ intMetadataClass = InternalMetadata.new
23
+
24
+ # relationship direction of related items depends on the main record id
25
+ sbId = nil
26
+ if hSbJson.has_key?('id')
27
+ sbId = hSbJson['id']
28
+ end
29
+ if sbId.nil? || sbId == ''
30
+ hResponseObj[:readerExecutionMessages] << 'ScienceBase id missing'
31
+ return hMetadata
32
+ end
33
+
34
+ # get the link to the related items array
35
+ hRelatedItems = hSbJson['relatedItems']
36
+ itemsLink = nil
37
+ if hRelatedItems.has_key?('link')
38
+ hLink = hRelatedItems['link']
39
+ unless hLink.empty?
40
+ itemsLink = hLink['url']
41
+ end
42
+ end
43
+ return hMetadata if itemsLink.nil?
44
+
45
+ # fetch the related items array in json format
46
+ itemsLink = itemsLink + '&format=json'
47
+ begin
48
+ web_contents = open(itemsLink, :read_timeout => 30) { |f| f.read }
49
+ rescue => readErr
50
+ hResponseObj[:readerExecutionMessages] << "Failed reading ScienceBase relatedItems #{itemsLink} - see following message(s):\n"
51
+ hResponseObj[:readerExecutionMessages] << readErr.to_s.slice(0, 300)
52
+ return hMetadata
53
+ else
54
+ # parse related items array
55
+ aItems = []
56
+ begin
57
+ aItems = JSON.parse(web_contents)
58
+ rescue JSON::JSONError => parseErr
59
+ hResponseObj[:readerExecutionMessages] << 'Parsing related links failed - see following message(s):\n'
60
+ hResponseObj[:readerExecutionMessages] << parseErr.to_s.slice(0, 300)
61
+ return hMetadata
62
+ end
63
+
64
+ # process each returned related item as a separate associated resource
65
+ aItems.each do |hItem|
66
+ unless hItem.empty?
67
+
68
+ # determine relationship direction
69
+ forward = nil
70
+ if hItem.has_key?('itemId')
71
+ forward = true if sbId == hItem['itemId']
72
+ end
73
+ if hItem.has_key?('relatedItemId')
74
+ forward = false if sbId == hItem['relatedItemId']
75
+ end
76
+ if forward.nil?
77
+ hResponseObj[:readerExecutionMessages] << 'Main ScienceBase id was not referenced in related item'
78
+ return hMetadata
79
+ end
80
+
81
+ # fetch resourceTypes from related item
82
+ if forward
83
+ resourceId = hItem['relatedItemId']
84
+ else
85
+ resourceId = hItem['itemId']
86
+ end
87
+ resourceLink = "https://www.sciencebase.gov/catalog/item/#{resourceId}?format=json"
88
+ begin
89
+ web_contents = open(resourceLink, :read_timeout => 30) { |f| f.read }
90
+ rescue => readErr
91
+ hResponseObj[:readerExecutionMessages] << "Failed reading ScienceBase relatedItem #{resourceId} - see following message(s)"
92
+ hResponseObj[:readerExecutionMessages] << readErr.to_s.slice(0, 300)
93
+ hResponseObj[:readerExecutionMessages] << 'Either the item does not exist or the item is secured and requires authentication to access.'
94
+ break
95
+ else
96
+ # parse related item
97
+ begin
98
+ hRelatedItem = JSON.parse(web_contents)
99
+ rescue JSON::JSONError => parseErr
100
+ hResponseObj[:readerExecutionMessages] << 'Parsing related item failed - see following message(s):\n'
101
+ hResponseObj[:readerExecutionMessages] << parseErr.to_s.slice(0, 300)
102
+ break
103
+ end
104
+
105
+ # create mew associated resource
106
+ hResource = intMetadataClass.newAssociatedResource
107
+
108
+ if hRelatedItem.has_key?('browseCategories')
109
+ aBrowse = hRelatedItem['browseCategories']
110
+ aBrowse.each do |category|
111
+ resourceType = Codelists.codelist_sb2adiwg('scope_sb2adiwg', category)
112
+ resourceType = resourceType.nil? ? category : resourceType
113
+ hResource[:resourceTypes] << resourceType
114
+ end
115
+ else
116
+ hResponseObj[:readerExecutionMessages] << "Related item #{resourceId} did not have browseCategories"
117
+ end
118
+
119
+ # fill in associated resource citation
120
+ hCitation = intMetadataClass.newCitation
121
+ citationTitle = nil
122
+ if hItem.has_key?('relatedItemTitle')
123
+ citationTitle = hItem['relatedItemTitle'] if forward
124
+ end
125
+ if hItem.has_key?('title')
126
+ citationTitle = hItem['title'] unless forward
127
+ end
128
+ hCitation[:title] = citationTitle
129
+
130
+ # create an identifier for each related item id
131
+ if hItem.has_key?('id')
132
+ hIdentifier = intMetadataClass.newIdentifier
133
+ hIdentifier[:identifier] = hItem['id']
134
+ hIdentifier[:namespace] = 'gov.sciencebase.catalog'
135
+ hIdentifier[:description] = 'id'
136
+ hCitation[:identifiers] << hIdentifier
137
+ end
138
+ if hItem.has_key?('itemId')
139
+ hIdentifier = intMetadataClass.newIdentifier
140
+ hIdentifier[:identifier] = hItem['itemId']
141
+ hIdentifier[:namespace] = 'gov.sciencebase.catalog'
142
+ hIdentifier[:description] = 'itemId'
143
+ hCitation[:identifiers] << hIdentifier
144
+ end
145
+ if hItem.has_key?('relatedItemId')
146
+ hIdentifier = intMetadataClass.newIdentifier
147
+ hIdentifier[:identifier] = hItem['relatedItemId']
148
+ hIdentifier[:namespace] = 'gov.sciencebase.catalog'
149
+ hIdentifier[:description] = 'relatedItemId'
150
+ hCitation[:identifiers] << hIdentifier
151
+ end
152
+ if hItem.has_key?('itemLinkTypeId')
153
+ hIdentifier = intMetadataClass.newIdentifier
154
+ hIdentifier[:identifier] = hItem['itemLinkTypeId']
155
+ hIdentifier[:namespace] = 'gov.sciencebase.catalog'
156
+ hIdentifier[:description] = 'itemLinkTypeId'
157
+ hCitation[:identifiers] << hIdentifier
158
+ end
159
+
160
+ hResource[:resourceCitation] = hCitation
161
+ hMetadata[:associatedResources] << hResource
162
+
163
+ end
164
+
165
+ end
166
+ end
167
+
168
+ return hMetadata
169
+ end
170
+
171
+ end
172
+
173
+ end
174
+
175
+ end
176
+ end
177
+ end
178
+ end
@@ -27,6 +27,7 @@ require_relative 'module_budget'
27
27
  require_relative 'module_publication'
28
28
  require_relative 'module_project'
29
29
  require_relative 'module_extent'
30
+ require_relative 'module_relatedItem'
30
31
 
31
32
  module ADIWG
32
33
  module Mdtranslator
@@ -146,6 +147,11 @@ module ADIWG
146
147
  end
147
148
  end
148
149
 
150
+ # related items
151
+ if hSbJson.has_key?('relatedItems')
152
+ RelatedItem.unpack(hSbJson, hMetadata, hResponseObj)
153
+ end
154
+
149
155
  hResourceInfo[:citation] = hCitation
150
156
  hMetadata[:metadataInfo] = hMetadataInfo
151
157
  hMetadata[:resourceInfo] = hResourceInfo
@@ -14,8 +14,6 @@ module ADIWG
14
14
 
15
15
  module Tag
16
16
 
17
- @Namespace = ADIWG::Mdtranslator::Writers::SbJson
18
-
19
17
  def self.unpack(hSbJson, hResourceInfo, hResponseObj)
20
18
 
21
19
  # instance classes needed in script
@@ -1,6 +1,7 @@
1
1
  # adiwg mdTranslator
2
2
 
3
3
  # version 2 history
4
+ # 2.1.0 2017-08-10 revisions to sbJson reader
4
5
  # 2.0.0 2017-06-28 added sbJson reader
5
6
  # 2.0.0rc13 2017-06-16 apply changes to sbJson writer after fourth review session
6
7
  # 2.0.0rc12 2017-06-14 apply changes to sbJson writer after third review session
@@ -21,7 +22,7 @@
21
22
  module ADIWG
22
23
  module Mdtranslator
23
24
  # current mdtranslator version
24
- VERSION = "2.0.0"
25
+ VERSION = "2.1.0"
25
26
  end
26
27
  end
27
28
 
@@ -22,7 +22,7 @@ module ADIWG
22
22
 
23
23
  aTypes.each do |hType|
24
24
  type = hType[:type]
25
- sbType = Codelists.codelist_iso_to_sb('iso_sb_scope', :isoCode => type)
25
+ sbType = Codelists.codelist_adiwg2sb('scope_adiwg2sb', type)
26
26
  aCategories << sbType unless sbType.nil?
27
27
  end
28
28
 
@@ -44,7 +44,7 @@ module ADIWG
44
44
  hContact = ADIWG::Mdtranslator::Writers::SbJson.get_contact_by_index(hIndex[:index])
45
45
  unless hContact.empty?
46
46
  unless hContact[:name].nil?
47
- sbRole = Codelists.codelist_iso_to_sb('iso_sb_role', :isoCode => hIndex[:role])
47
+ sbRole = Codelists.codelist_adiwg2sb('role_adiwg2sb', hIndex[:role])
48
48
  sbRole = sbRole.nil? ? hIndex[:role] : sbRole
49
49
  citation += hContact[:name] + '(' + sbRole + '), '
50
50
  end
@@ -54,7 +54,7 @@ module ADIWG
54
54
  # dates
55
55
  hCitation[:dates].each do |hDate|
56
56
  dateStr = AdiwgDateTimeFun.stringDateFromDateObject(hDate)
57
- dateType = Codelists.codelist_iso_to_sb('iso_sb_date', :isoCode => hDate[:dateType])
57
+ dateType = Codelists.codelist_adiwg2sb('date_adiwg2sb', hDate[:dateType])
58
58
  unless dateType.nil?
59
59
  citation += dateStr + '(' + dateType + '), '
60
60
  end