adiwg-mdtranslator 0.8.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 (135) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/.travis.yml +7 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +24 -0
  6. data/README.md +31 -0
  7. data/Rakefile +13 -0
  8. data/adiwg-mdtranslator.gemspec +31 -0
  9. data/bin/mdtranslator +164 -0
  10. data/lib/adiwg/mdtranslator/internal/internal_metadata_obj.rb +499 -0
  11. data/lib/adiwg/mdtranslator/internal/module_dateTimeFun.rb +98 -0
  12. data/lib/adiwg/mdtranslator/readers/adiwgJson/adiwgJson_reader.rb +80 -0
  13. data/lib/adiwg/mdtranslator/readers/adiwgJson/adiwgJson_validator.rb +115 -0
  14. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_address.rb +71 -0
  15. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_associatedResource.rb +57 -0
  16. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_boundingBox.rb +51 -0
  17. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_browseGraphic.rb +52 -0
  18. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_citation.rb +104 -0
  19. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_contacts.rb +121 -0
  20. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_coordinates.rb +52 -0
  21. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_dataQuality.rb +40 -0
  22. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_dateTime.rb +27 -0
  23. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_descriptiveKeyword.rb +49 -0
  24. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_distributionInfo.rb +150 -0
  25. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_extent.rb +62 -0
  26. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_geoCoordSystem.rb +46 -0
  27. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_geoProperties.rb +89 -0
  28. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_geographicElement.rb +168 -0
  29. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_legalConstraint.rb +45 -0
  30. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_lineString.rb +25 -0
  31. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_lineage.rb +50 -0
  32. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_metadata.rb +76 -0
  33. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_metadataExtension.rb +40 -0
  34. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_metadataInfo.rb +119 -0
  35. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_onlineResource.rb +62 -0
  36. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_phone.rb +59 -0
  37. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_point.rb +25 -0
  38. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_polygon.rb +55 -0
  39. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_processStep.rb +64 -0
  40. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_resolution.rb +42 -0
  41. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_resourceFormat.rb +35 -0
  42. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_resourceIdentifier.rb +49 -0
  43. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_resourceInfo.rb +298 -0
  44. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_resourceMaintenance.rb +50 -0
  45. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_resourceSpecificUsage.rb +50 -0
  46. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_responsibleParty.rb +37 -0
  47. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_securityConstraint.rb +52 -0
  48. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_source.rb +48 -0
  49. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_spatialReference.rb +48 -0
  50. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_taxonClass.rb +43 -0
  51. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_taxonomy.rb +83 -0
  52. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_temporalElement.rb +71 -0
  53. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_timeInstant.rb +45 -0
  54. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_timePeriod.rb +53 -0
  55. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_verticalElement.rb +53 -0
  56. data/lib/adiwg/mdtranslator/readers/adiwgJson/modules_0.8.0/module_voucher.rb +38 -0
  57. data/lib/adiwg/mdtranslator/validator.rb +43 -0
  58. data/lib/adiwg/mdtranslator/version.rb +7 -0
  59. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_address.rb +91 -0
  60. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_aggregateInformation.rb +68 -0
  61. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_boundingPolygon.rb +75 -0
  62. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_browseGraphic.rb +51 -0
  63. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_citation.rb +157 -0
  64. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_contact.rb +85 -0
  65. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_dataIdentification.rb +338 -0
  66. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_dataQuality.rb +55 -0
  67. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_date.rb +60 -0
  68. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_digitalTransferOptions.rb +51 -0
  69. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_distribution.rb +36 -0
  70. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_distributor.rb +80 -0
  71. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_extent.rb +94 -0
  72. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_format.rb +40 -0
  73. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_genericMetaData.rb +65 -0
  74. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_geographicBoundingBox.rb +74 -0
  75. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_geographicDescription.rb +29 -0
  76. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_geographicElement.rb +36 -0
  77. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_identifier.rb +51 -0
  78. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_keyword.rb +63 -0
  79. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_legalConstraints.rb +63 -0
  80. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_lineString.rb +74 -0
  81. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_lineage.rb +63 -0
  82. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_maintenanceInformation.rb +64 -0
  83. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_medium.rb +59 -0
  84. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_metadata.rb +277 -0
  85. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_metadataExtension.rb +156 -0
  86. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_multiGeometry.rb +140 -0
  87. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_onlineResource.rb +78 -0
  88. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_point.rb +74 -0
  89. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_polygon.rb +94 -0
  90. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_processStep.rb +81 -0
  91. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_referenceIdentifier.rb +42 -0
  92. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_referenceSystem.rb +29 -0
  93. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_resolution.rb +46 -0
  94. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_responsibleParty.rb +90 -0
  95. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_securityConstraints.rb +68 -0
  96. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_source.rb +59 -0
  97. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_standardOrderProcess.rb +74 -0
  98. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_taxonClassification.rb +65 -0
  99. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_taxonSystem.rb +100 -0
  100. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_telephone.rb +77 -0
  101. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_temporalExtent.rb +58 -0
  102. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_timeInstant.rb +47 -0
  103. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_timePeriod.rb +54 -0
  104. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_usage.rb +59 -0
  105. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_useConstraints.rb +30 -0
  106. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_verticalExtent.rb +59 -0
  107. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_vouchers.rb +48 -0
  108. data/lib/adiwg/mdtranslator/writers/iso19115_2/codelists/code_associationType.rb +35 -0
  109. data/lib/adiwg/mdtranslator/writers/iso19115_2/codelists/code_characterSet.rb +58 -0
  110. data/lib/adiwg/mdtranslator/writers/iso19115_2/codelists/code_classification.rb +35 -0
  111. data/lib/adiwg/mdtranslator/writers/iso19115_2/codelists/code_datatype.rb +45 -0
  112. data/lib/adiwg/mdtranslator/writers/iso19115_2/codelists/code_dateType.rb +29 -0
  113. data/lib/adiwg/mdtranslator/writers/iso19115_2/codelists/code_initiativeType.rb +35 -0
  114. data/lib/adiwg/mdtranslator/writers/iso19115_2/codelists/code_keywordType.rb +33 -0
  115. data/lib/adiwg/mdtranslator/writers/iso19115_2/codelists/code_maintenanceFrequency.rb +42 -0
  116. data/lib/adiwg/mdtranslator/writers/iso19115_2/codelists/code_mediumFormat.rb +32 -0
  117. data/lib/adiwg/mdtranslator/writers/iso19115_2/codelists/code_mediumName.rb +44 -0
  118. data/lib/adiwg/mdtranslator/writers/iso19115_2/codelists/code_obligation.rb +32 -0
  119. data/lib/adiwg/mdtranslator/writers/iso19115_2/codelists/code_onlineFunction.rb +31 -0
  120. data/lib/adiwg/mdtranslator/writers/iso19115_2/codelists/code_presentationForm.rb +44 -0
  121. data/lib/adiwg/mdtranslator/writers/iso19115_2/codelists/code_progress.rb +33 -0
  122. data/lib/adiwg/mdtranslator/writers/iso19115_2/codelists/code_restriction.rb +38 -0
  123. data/lib/adiwg/mdtranslator/writers/iso19115_2/codelists/code_role.rb +37 -0
  124. data/lib/adiwg/mdtranslator/writers/iso19115_2/codelists/code_scope.rb +46 -0
  125. data/lib/adiwg/mdtranslator/writers/iso19115_2/codelists/code_spatialRepresentationType.rb +36 -0
  126. data/lib/adiwg/mdtranslator/writers/iso19115_2/codelists/code_topicCategory.rb +50 -0
  127. data/lib/adiwg/mdtranslator/writers/iso19115_2/iso19115_2_writer.rb +131 -0
  128. data/lib/adiwg/mdtranslator.rb +97 -0
  129. data/lib/adiwg-mdtranslator.rb +1 -0
  130. data/mdtranslator.rb +178 -0
  131. data/test/adiwgJson_full_test_example.json +1717 -0
  132. data/test/adiwgJson_template.json +977 -0
  133. data/test/dev.rb +32 -0
  134. data/test/tc_translation.rb +31 -0
  135. metadata +317 -0
@@ -0,0 +1,74 @@
1
+ # ISO <<Class>> LineString
2
+ # writer output in XML
3
+
4
+ # History:
5
+ # Stan Smith 2013-11-13 original script
6
+ # Stan Smith 2014-05-30 modified for version 0.5.0
7
+ # Stan Smith 2014-07-08 modify require statements to function in RubyGem structure
8
+
9
+ require ADIWG::Mdtranslator.reader_module('module_coordinates', $response[:readerVersionUsed])
10
+
11
+ class LineString
12
+
13
+ def initialize(xml)
14
+ @xml = xml
15
+ end
16
+
17
+ def writeXML(hGeoElement)
18
+
19
+ # gml:LineString attributes
20
+ attributes = {}
21
+
22
+ # gml:LineString attributes - gml:id - required
23
+ lineID = hGeoElement[:elementId]
24
+ if lineID.nil?
25
+ $idCount = $idCount.succ
26
+ lineID = 'line' + $idCount
27
+ end
28
+ attributes['gml:id'] = lineID
29
+
30
+ # gml:LineString attributes - srsDimension
31
+ s = hGeoElement[:elementGeometry][:dimension]
32
+ if !s.nil?
33
+ attributes[:srsDimension] = s
34
+ end
35
+
36
+ # gml:LineString attributes - srsName
37
+ s = hGeoElement[:elementSrs][:srsName]
38
+ if !s.nil?
39
+ attributes[:srsName] = s
40
+ end
41
+
42
+ @xml.tag!('gml:LineString',attributes) do
43
+
44
+ # lineString - description
45
+ s = hGeoElement[:elementDescription]
46
+ if !s.nil?
47
+ @xml.tag!('gml:description',s)
48
+ elsif $showAllTags
49
+ @xml.tag!('gml:description')
50
+ end
51
+
52
+ # lineString - name
53
+ s = hGeoElement[:elementName]
54
+ if !s.nil?
55
+ @xml.tag!('gml:name',s)
56
+ elsif $showAllTags
57
+ @xml.tag!('gml:name')
58
+ end
59
+
60
+ # lineString - coordinates - required
61
+ # gml does not support nilReason for coordinates
62
+ # convert coordinate string from geoJSON to gml
63
+ s = hGeoElement[:elementGeometry][:geometry]
64
+ if !s.nil?
65
+ s = Adiwg_Coordinates.unpack(s)
66
+ @xml.tag!('gml:coordinates',s)
67
+ else
68
+ @xml.tag!('gml:coordinates')
69
+ end
70
+ end
71
+
72
+ end
73
+
74
+ end
@@ -0,0 +1,63 @@
1
+ # ISO <<Class>> LI_Lineage
2
+ # writer output in XML
3
+
4
+ # History:
5
+ # Stan Smith 2013-11-20 original script
6
+ # Stan Smith 2014-07-09 modify require statements to function in RubyGem structure
7
+
8
+ require 'class_processStep'
9
+ require 'class_source'
10
+
11
+ class LI_Lineage
12
+
13
+ def initialize(xml)
14
+ @xml = xml
15
+ end
16
+
17
+ def writeXML(hLineage)
18
+
19
+ # classes used
20
+ sourceClass = LI_Source.new(@xml)
21
+ pStepClass = LI_ProcessStep.new(@xml)
22
+
23
+ @xml.tag!('gmd:LI_Lineage') do
24
+
25
+ # lineage - statement
26
+ s = hLineage[:statement]
27
+ if !s.nil?
28
+ @xml.tag!('gmd:statement') do
29
+ @xml.tag!('gco:CharacterString',s)
30
+ end
31
+ elsif $showAllTags
32
+ @xml.tag!('gmd:statement')
33
+ end
34
+
35
+ # lineage - processing steps
36
+ aProcSteps = hLineage[:processSteps]
37
+ if !aProcSteps.empty?
38
+ aProcSteps.each do |pStep|
39
+ @xml.tag!('gmd:processStep') do
40
+ pStepClass.writeXML(pStep)
41
+ end
42
+ end
43
+ elsif $showAllTags
44
+ @xml.tag!('gmd:processStep')
45
+ end
46
+
47
+ # lineage - data sources
48
+ aSources = hLineage[:dataSources]
49
+ if !aSources.empty?
50
+ aSources.each do |hSource|
51
+ @xml.tag!('gmd:source') do
52
+ sourceClass.writeXML(hSource)
53
+ end
54
+ end
55
+ elsif $showAllTags
56
+ @xml.tag!('gmd:source')
57
+ end
58
+
59
+ end
60
+
61
+ end
62
+
63
+ end
@@ -0,0 +1,64 @@
1
+ # ISO <<Class>> MD_MaintenanceInformation
2
+ # writer output in XML
3
+
4
+ # History:
5
+ # Stan Smith 2013-10-31 original script
6
+ # Stan Smith 2013-12-18 added contact
7
+ # Stan Smith 2014-07-08 modify require statements to function in RubyGem structure
8
+
9
+ require 'code_maintenanceFrequency'
10
+ require 'class_responsibleParty'
11
+
12
+ class MD_MaintenanceInformation
13
+
14
+ def initialize(xml)
15
+ @xml = xml
16
+ end
17
+
18
+ def writeXML(hMaintInfo)
19
+
20
+ # classes used
21
+ maintFreqCode = MD_MaintenanceFrequencyCode.new(@xml)
22
+ rPartyClass = CI_ResponsibleParty.new(@xml)
23
+
24
+ @xml.tag! 'gmd:MD_MaintenanceInformation' do
25
+
26
+ # maintenance information - frequency code - required
27
+ s = hMaintInfo[:maintFreq]
28
+ if s.nil?
29
+ @xml.tag!('gmd:maintenanceAndUpdateFrequency', {'gco:nilReason'=>'unknown'})
30
+ else
31
+ @xml.tag!('gmd:maintenanceAndUpdateFrequency') do
32
+ maintFreqCode.writeXML(s)
33
+ end
34
+ end
35
+
36
+ # maintenance information - note
37
+ aNotes = hMaintInfo[:maintNotes]
38
+ if !aNotes.empty?
39
+ aNotes.each do |note|
40
+ @xml.tag!('gmd:maintenanceNote') do
41
+ @xml.tag!('gco:CharacterString',note)
42
+ end
43
+ end
44
+ elsif $showAllTags
45
+ @xml.tag!('gmd:maintenanceNote')
46
+ end
47
+
48
+ # maintenance information - contact - CI_ResponsibleParty
49
+ aContacts = hMaintInfo[:maintContacts]
50
+ if aContacts.empty? && $shoeEmpty
51
+ @xml.tag!('gmd:contact')
52
+ else
53
+ aContacts.each do |hContact|
54
+ @xml.tag!('gmd:contact') do
55
+ rPartyClass.writeXML(hContact)
56
+ end
57
+ end
58
+ end
59
+
60
+ end
61
+
62
+ end
63
+
64
+ end
@@ -0,0 +1,59 @@
1
+ # ISO <<Class>> MD_Medium
2
+ # writer output in XML
3
+
4
+ # History:
5
+ # Stan Smith 2013-09-26 original script
6
+ # Stan Smith 2014-07-08 modify require statements to function in RubyGem structure
7
+
8
+ require 'code_mediumName'
9
+ require 'code_mediumFormat'
10
+
11
+ class MD_Medium
12
+
13
+ def initialize(xml)
14
+ @xml = xml
15
+ end
16
+
17
+ def writeXML(medium)
18
+
19
+ # classes used
20
+ medFormatCode = MD_MediumFormatCode.new(@xml)
21
+ medNameCode = MD_MediumNameCode.new(@xml)
22
+
23
+ @xml.tag!('gmd:MD_Medium') do
24
+
25
+ # medium - name - MD_MediumNameCode
26
+ s = medium[:mediumName]
27
+ if !s.nil?
28
+ @xml.tag!('gmd:name') do
29
+ medNameCode.writeXML(s)
30
+ end
31
+ elsif $showAllTags
32
+ @xml.tag!('gmd:name')
33
+ end
34
+
35
+ # medium - medium format - MD_MediumFormatCode
36
+ s = medium[:mediumFormat]
37
+ if !s.nil?
38
+ @xml.tag!('gmd:mediumFormat') do
39
+ medFormatCode.writeXML(s)
40
+ end
41
+ elsif $showAllTags
42
+ @xml.tag!('gmd:mediumFormat')
43
+ end
44
+
45
+ # medium - medium note
46
+ s = medium[:mediumNote]
47
+ if !s.nil?
48
+ @xml.tag!('gmd:mediumNote') do
49
+ @xml.tag!('gco:CharacterString',s)
50
+ end
51
+ elsif $showAllTags
52
+ @xml.tag!('gmd:mediumNote')
53
+ end
54
+
55
+ end
56
+
57
+ end
58
+
59
+ end
@@ -0,0 +1,277 @@
1
+ # ISO <<Class>> MI_Metadata
2
+ # writer output in XML
3
+
4
+ # History:
5
+ # Stan Smith 2013-08-09 original script
6
+ # Stan Smith 2013-09-25 added distribution
7
+ # Stan Smith 2013-09-25 added data quality
8
+ # Stan Smith 2013-09-25 added metadata maintenance
9
+ # Stan Smith 2013-09-25 added reference system info
10
+ # Stan Smith 2013-12-27 added parent identifier
11
+ # Stan Smith 2014-05-14 modify for JSON schema 0.4.0
12
+ # Stan Smith 2014-05-14 refactored method calls to be consistent w/ other classes
13
+ # Stan Smith 2014-05-28 added resource URI
14
+ # Stan Smith 2014-07-08 modify require statements to function in RubyGem structure
15
+ # Stan Smith 2014-08-18 add dataSetURI
16
+ # Stan Smith 2014-09-03 replaced spatial reference system code with named, epsg, and
17
+ # ... wkt reference system descriptions using RS_Identifier for 0.7.0
18
+ # Stan Smith 2014-09-19 changed file identifier to read from internal storage as
19
+ # ... an MD_Identifier class. To support version 0.8.0 json.
20
+
21
+ require 'code_characterSet'
22
+ require 'code_scope'
23
+ require 'class_responsibleParty'
24
+ require 'class_metadataExtension'
25
+ require 'class_dataIdentification'
26
+ require 'class_distribution'
27
+ require 'class_dataQuality'
28
+ require 'class_maintenanceInformation'
29
+ require 'class_referenceSystem'
30
+ require 'module_dateTimeFun'
31
+
32
+ class MI_Metadata
33
+
34
+ def initialize(xml)
35
+ @xml = xml
36
+ end
37
+
38
+ def writeXML(internalObj)
39
+
40
+ # # classes used in MD_Metadata
41
+ charCode = MD_CharacterSetCode.new(@xml)
42
+ scopeCode = MD_ScopeCode.new(@xml)
43
+ rPartyClass = CI_ResponsibleParty.new(@xml)
44
+ mdExtClass = MD_MetadataExtensionInformation.new(@xml)
45
+ dataIdClass = MD_DataIdentification.new(@xml)
46
+ distClass = MD_Distribution.new(@xml)
47
+ dqClass = DQ_DataQuality.new(@xml)
48
+ metaMaintClass = MD_MaintenanceInformation.new(@xml)
49
+ refSysClass = MD_ReferenceSystem.new(@xml)
50
+
51
+ intMetadata = internalObj[:metadata]
52
+ hMetaInfo = intMetadata[:metadataInfo]
53
+ hResInfo = intMetadata[:resourceInfo]
54
+ aAssocRes = intMetadata[:associatedResources]
55
+ $intContactList = internalObj[:contacts]
56
+
57
+ # document head
58
+ @xml.instruct! :xml, encoding: 'UTF-8'
59
+ @xml.comment!('core gmi based instance document ISO 19115-2')
60
+ @xml.tag!('gmi:MI_Metadata',{'xmlns:gmi' => 'http://www.isotc211.org/2005/gmi',
61
+ 'xmlns:gmd' => 'http://www.isotc211.org/2005/gmd',
62
+ 'xmlns:gco' => 'http://www.isotc211.org/2005/gco',
63
+ 'xmlns:gml' => 'http://www.opengis.net/gml/3.2',
64
+ 'xmlns:gsr' => 'http://www.isotc211.org/2005/gsr',
65
+ 'xmlns:gss' => 'http://www.isotc211.org/2005/gss',
66
+ 'xmlns:gst' => 'http://www.isotc211.org/2005/gst',
67
+ 'xmlns:gmx' => 'http://www.isotc211.org/2005/gmx',
68
+ 'xmlns:gfc' => 'http://www.isotc211.org/2005/gfc',
69
+ 'xmlns:srv' => 'http://www.isotc211.org/2005/srv',
70
+ 'xmlns:xlink' => 'http://www.w3.org/1999/xlink',
71
+ 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
72
+ 'xsi:schemaLocation' => 'http://www.isotc211.org/2005/gmi ftp://ftp.ncddc.noaa.gov/pub/Metadata/Online_ISO_Training/Intro_to_ISO/schemas/ISObio/schema.xsd'}) do
73
+
74
+ # metadata information - file identifier - default
75
+ # the internal object stores the file identifier as a MD_Identifier to support 19115-1
76
+ # ISO 19115-2 only support the file identifier as a character string
77
+ @xml.tag!('gmd:fileIdentifier') do
78
+ hMetadataId = hMetaInfo[:metadataId]
79
+ if hMetadataId[:identifier].nil?
80
+ # generate fileIdentifier if one not provided
81
+ @xml.tag!('gco:CharacterString',UUIDTools::UUID.random_create.to_s)
82
+ else
83
+ @xml.tag!('gco:CharacterString',hMetadataId[:identifier])
84
+ end
85
+ end
86
+
87
+ # metadata information - file language - default
88
+ @xml.tag!('gmd:language') do
89
+ # all xml is written in US English
90
+ @xml.tag!('gco:CharacterString','eng; USA')
91
+ end
92
+
93
+ # metadata information - character set - default
94
+ @xml.tag!('gmd:characterSet') do
95
+ # all out put is in utf8
96
+ charCode.writeXML('utf8')
97
+ end
98
+
99
+ # metadata information - parent identifier
100
+ # the internal object stores the parent identifier as a CI_Citation to support 19115-1
101
+ # ISO 19115-2 only support the parent identifier as a character string
102
+ hParent = hMetaInfo[:parentMetadata]
103
+ if !hParent.empty?
104
+ @xml.tag!('gmd:parentIdentifier') do
105
+ s = hParent[:citTitle]
106
+ aResIds = hParent[:citResourceIDs]
107
+ if aResIds.length > 0
108
+ s += ' ids: | '
109
+ aResIds.each do |resource|
110
+ s += resource[:identifierType] + ': ' + resource[:identifier] + ' | '
111
+ end
112
+ end
113
+ @xml.tag!('gco:CharacterString',s)
114
+ end
115
+ elsif $showAllTags
116
+ @xml.tag!('gmd:parentIdentifier')
117
+ end
118
+
119
+ # metadata information - file hierarchy - default dataset
120
+ aHierarchy = hMetaInfo[:metadataScope]
121
+ if aHierarchy.empty?
122
+ @xml.tag!('gmd:hierarchyLevel') do
123
+ scopeCode.writeXML('dataset')
124
+ end
125
+ else
126
+ aHierarchy.each do |hierarchy|
127
+ @xml.tag!('gmd:hierarchyLevel') do
128
+ scopeCode.writeXML(hierarchy)
129
+ end
130
+ end
131
+ end
132
+
133
+ # metadata information - metadata custodian - required
134
+ aCustodians = hMetaInfo[:metadataCustodians]
135
+ if aCustodians.empty?
136
+ @xml.tag!('gmd:contact', {'gco:nilReason' => 'missing'})
137
+ else
138
+ aCustodians.each do |hCustodian|
139
+ @xml.tag!('gmd:contact') do
140
+ rPartyClass.writeXML(hCustodian)
141
+ end
142
+ end
143
+ end
144
+
145
+ # metadata information - date stamp - required - default to now()
146
+ @xml.tag!('gmd:dateStamp') do
147
+
148
+ # if date not supplied, fill with today's date
149
+ hDate = hMetaInfo[:metadataCreateDate]
150
+ if hDate.empty?
151
+ mDate = AdiwgDateTimeFun.stringDateFromDateTime(DateTime.now, 'YMD')
152
+ else
153
+ mDateTime = hDate[:dateTime]
154
+ mDateRes = hDate[:dateResolution]
155
+ if mDateTime.nil?
156
+ mDate = AdiwgDateTimeFun.stringDateFromDateTime(DateTime.now, 'YMD')
157
+ else
158
+ mDate = AdiwgDateTimeFun.stringDateFromDateTime(mDateTime, mDateRes)
159
+ end
160
+ end
161
+
162
+ @xml.tag!('gco:Date',mDate)
163
+ end
164
+
165
+ # metadata information - metadata standard name - default
166
+ @xml.tag!('gmd:metadataStandardName') do
167
+ @xml.tag!('gco:CharacterString','ISO 19115-2')
168
+ end
169
+
170
+ # metadata information - metadata standard version - default
171
+ @xml.tag!('gmd:metadataStandardVersion') do
172
+ @xml.tag!('gco:CharacterString','ISO 19115-2:2009(E)')
173
+ end
174
+
175
+ # metadata information - dataset URI
176
+ s = hMetaInfo[:metadataURI]
177
+ if !s.nil?
178
+ @xml.tag!('gmd:dataSetURI') do
179
+ @xml.tag!('gco:CharacterString',s)
180
+ end
181
+ elsif $showAllTags
182
+ @xml.tag!('gmd:dataSetURI')
183
+ end
184
+
185
+ # metadata information - reference system
186
+ hRefSystems = hResInfo[:spatialReferenceSystem]
187
+ if !hRefSystems.empty?
188
+
189
+ # named reference systems
190
+ aRefNames = hRefSystems[:sRNames]
191
+ aRefNames.each do |refName|
192
+ @xml.tag!('gmd:referenceSystemInfo') do
193
+ refSysClass.writeXML(refName, 'name')
194
+ end
195
+ end
196
+
197
+ # epsg reference systems
198
+ aRefNames = hRefSystems[:sREPSGs]
199
+ aRefNames.each do |refName|
200
+ @xml.tag!('gmd:referenceSystemInfo') do
201
+ refSysClass.writeXML(refName, 'epsg')
202
+ end
203
+ end
204
+
205
+ # wkt reference systems
206
+ aRefNames = hRefSystems[:sRWKTs]
207
+ aRefNames.each do |refName|
208
+ @xml.tag!('gmd:referenceSystemInfo') do
209
+ refSysClass.writeXML(refName, 'wkt')
210
+ end
211
+ end
212
+
213
+ elsif $showAllTags
214
+ @xml.tag!('gmd:referenceSystemInfo')
215
+ end
216
+
217
+ # metadata information - metadata extension info
218
+ aExtensions = hMetaInfo[:extensions]
219
+ if !aExtensions.empty?
220
+ aExtensions.each do |hExtension|
221
+ @xml.tag!('gmd:metadataExtensionInfo') do
222
+ mdExtClass.writeXML(hExtension)
223
+ end
224
+ end
225
+ elsif $showAllTags
226
+ @xml.tag!('gmd:metadataExtensionInfo')
227
+ end
228
+
229
+ # metadata information - identification info - required
230
+ if hResInfo.empty?
231
+ @xml.tag!('gmd:identificationInfo', {'gco:nilReason' => 'missing'})
232
+ else
233
+ @xml.tag!('gmd:identificationInfo') do
234
+ dataIdClass.writeXML(hResInfo, aAssocRes)
235
+ end
236
+ end
237
+
238
+ # metadata information - content info
239
+ # ... information about data and link to 19110
240
+ # ... on hold until 19115-1 release
241
+
242
+ # metadata information - distribution info []
243
+ aDistInfo = intMetadata[:distributorInfo]
244
+ if !aDistInfo.empty?
245
+ @xml.tag!('gmd:distributionInfo') do
246
+ distClass.writeXML(aDistInfo)
247
+ end
248
+ elsif $showAllTags
249
+ @xml.tag!('gmd:distributionInfo')
250
+ end
251
+
252
+ # metadata information - data quality info
253
+ aDQInfo = hResInfo[:dataQualityInfo]
254
+ if !aDQInfo.empty?
255
+ aDQInfo.each do |hDQInfo|
256
+ @xml.tag!('gmd:dataQualityInfo') do
257
+ dqClass.writeXML(hDQInfo)
258
+ end
259
+ end
260
+ elsif $showAllTags
261
+ xml.tag!('gmd:dataQualityInfo')
262
+ end
263
+
264
+ # metadata information - metadata maintenance
265
+ hMetaMaint = hMetaInfo[:maintInfo]
266
+ if !hMetaMaint.empty?
267
+ @xml.tag!('gmd:metadataMaintenance') do
268
+ metaMaintClass.writeXML(hMetaMaint)
269
+ end
270
+ elsif $showAllTags
271
+ xml.tag!('gmd:metadataMaintenance')
272
+ end
273
+
274
+ end
275
+ end
276
+
277
+ end
@@ -0,0 +1,156 @@
1
+ # ISO <<Class>> MD_MetadataExtensionInformation
2
+ # writer output in XML
3
+
4
+ # History:
5
+ # Stan Smith 2013-11-22 original script
6
+ # Stan Smith 2014-07-08 modify require statements to function in RubyGem structure
7
+
8
+ require 'code_obligation'
9
+ require 'code_datatype'
10
+ require 'class_onlineResource'
11
+ require 'class_responsibleParty'
12
+
13
+ class MD_MetadataExtensionInformation
14
+
15
+ def initialize(xml)
16
+ @xml = xml
17
+ end
18
+
19
+ def writeXML(hExtension)
20
+
21
+ # classes used
22
+ olResClass = CI_OnlineResource.new(@xml)
23
+ rPartyClass = CI_ResponsibleParty.new(@xml)
24
+ obCode = MD_ObligationCode.new(@xml)
25
+ dataTCode = MD_DatatypeCode.new(@xml)
26
+
27
+ @xml.tag!('gmd:MD_MetadataExtensionInformation') do
28
+
29
+ # metadata extension - online resource - CI_OnLineResource
30
+ hOLResource = hExtension[:onLineResource]
31
+ if !hOLResource.empty?
32
+ @xml.tag!('gmd:extensionOnLineResource') do
33
+ olResClass.writeXML(hOLResource)
34
+ end
35
+ elsif $showAllTags
36
+ @xml.tag!('gmd:extensionOnLineResource')
37
+ end
38
+
39
+ # metadata extension = extended element information
40
+ @xml.tag!('gmd:extendedElementInformation') do
41
+ @xml.tag!('gmd:MD_ExtendedElementInformation') do
42
+
43
+ # extended element info - name - required
44
+ s = hExtension[:extName]
45
+ if s.nil?
46
+ @xml.tag!('gmd:name',{'gco:nilReason'=>'missing'})
47
+ else
48
+ @xml.tag!('gmd:name') do
49
+ @xml.tag!('gco:CharacterString',s)
50
+ end
51
+ end
52
+
53
+ # extended element info - short name
54
+ s = hExtension[:extShortName]
55
+ if !s.nil?
56
+ @xml.tag!('gmd:shortName') do
57
+ @xml.tag!('gco:CharacterString',s)
58
+ end
59
+ elsif $showAllTags
60
+ @xml.tag!('gmd:shortName')
61
+ end
62
+
63
+ # extended element info - definition - required
64
+ s = hExtension[:extDefinition]
65
+ if s.nil?
66
+ @xml.tag!('gmd:definition',{'gco:nilReason'=>'missing'})
67
+ else
68
+ @xml.tag!('gmd:definition') do
69
+ @xml.tag!('gco:CharacterString',s)
70
+ end
71
+ end
72
+
73
+ # extended element info - obligation
74
+ s = hExtension[:obligation]
75
+ if !s.nil?
76
+ @xml.tag!('gmd:obligation') do
77
+ obCode.writeXML(s)
78
+ end
79
+ elsif $showAllTags
80
+ @xml.tag!('gmd:obligation')
81
+ end
82
+
83
+ # extended element info - data type - required
84
+ s = hExtension[:dataType]
85
+ if s.nil?
86
+ @xml.tag!('gmd:dataType',{'gco:nilReason'=>'missing'})
87
+ else
88
+ @xml.tag!('gmd:dataType') do
89
+ dataTCode.writeXML(s)
90
+ end
91
+ end
92
+
93
+ # extended element info - maximum occurrence
94
+ s = hExtension[:maxOccurrence]
95
+ if !s.nil?
96
+ @xml.tag!('gmd:maximumOccurrence') do
97
+ @xml.tag!('gco:CharacterString',s)
98
+ end
99
+ elsif $showAllTags
100
+ @xml.tag!('gmd:maximumOccurrence')
101
+ end
102
+
103
+ # extended element info - parent entity - required
104
+ aParents = hExtension[:parentEntities]
105
+ if aParents.empty?
106
+ @xml.tag!('gmd:parentEntity',{'gco:nilReason'=>'missing'})
107
+ else
108
+ aParents.each do |parent|
109
+ @xml.tag!('gmd:parentEntity') do
110
+ @xml.tag!('gco:CharacterString',parent)
111
+ end
112
+ end
113
+ end
114
+
115
+ # extended element info - rule
116
+ s = hExtension[:rule]
117
+ if s.nil?
118
+ @xml.tag!('gmd:rule',{'gco:nilReason'=>'missing'})
119
+ else
120
+ @xml.tag!('gmd:rule') do
121
+ @xml.tag!('gco:CharacterString',s)
122
+ end
123
+ end
124
+
125
+ # extended element info - rationale
126
+ aRations = hExtension[:rationales]
127
+ if aRations.empty?
128
+ @xml.tag!('gmd:rationale')
129
+ else
130
+ aRations.each do |ration|
131
+ @xml.tag!('gmd:rationale') do
132
+ @xml.tag!('gco:CharacterString', ration)
133
+ end
134
+ end
135
+ end
136
+
137
+ # extended element info - source - CI_ResponsibleParty
138
+ aSources = hExtension[:extSources]
139
+ if aSources.empty?
140
+ @xml.tag!('gmd:source',{'gco:nilReason'=>'missing'})
141
+ else
142
+ aSources.each do |hSource|
143
+ @xml.tag!('gmd:source') do
144
+ rPartyClass.writeXML(hSource)
145
+ end
146
+ end
147
+ end
148
+
149
+ end
150
+ end
151
+
152
+ end
153
+
154
+ end
155
+
156
+ end