adiwg-mdtranslator 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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