adiwg-mdtranslator 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
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,37 @@
1
+ # ISO <<CodeLists>> gmd:CI_RoleCode
2
+
3
+ # from http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml
4
+ # History:
5
+ # Stan Smith 2013-08-09 original script
6
+
7
+ class CI_RoleCode
8
+ def initialize(xml)
9
+ @xml = xml
10
+ end
11
+
12
+ def writeXML(codeName)
13
+
14
+ case(codeName)
15
+ when 'resourceProvider' then codeID = '001'
16
+ when 'custodian' then codeID = '002'
17
+ when 'owner' then codeID = '003'
18
+ when 'user' then codeID = '004'
19
+ when 'distributor' then codeID = '005'
20
+ when 'originator' then codeID = '006'
21
+ when 'pointOfContact' then codeID = '007'
22
+ when 'principalInvestigator' then codeID = '008'
23
+ when 'processor' then codeID = '009'
24
+ when 'publisher' then codeID = '010'
25
+ when 'author' then codeID = '011'
26
+ else
27
+ codeName = 'INVALID ROLE CODE'
28
+ codeID = '999'
29
+ end
30
+
31
+ # write xml
32
+ @xml.tag!('gmd:CI_RoleCode',{:codeList=>'http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_RoleCode',
33
+ :codeListValue=>"#{codeName}",
34
+ :codeSpace=>"#{codeID}"})
35
+ end
36
+
37
+ end
@@ -0,0 +1,46 @@
1
+ # ISO <<CodeLists>> gmd:MD_ScopeCode
2
+
3
+ # from http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml
4
+ # History:
5
+ # Stan Smith 2013-08-09 original script
6
+
7
+ class MD_ScopeCode
8
+ def initialize(xml)
9
+ @xml = xml
10
+ end
11
+
12
+ def writeXML(codeName)
13
+ case(codeName)
14
+ when 'attribute' then codeID = '001'
15
+ when 'attributeType' then codeID = '002'
16
+ when 'collectionHardware' then codeID = '003'
17
+ when 'collectionSession' then codeID = '004'
18
+ when 'dataset' then codeID = '005'
19
+ when 'series' then codeID = '006'
20
+ when 'nonGeographicDataset' then codeID = '007'
21
+ when 'dimensionGroup' then codeID = '008'
22
+ when 'feature' then codeID = '009'
23
+ when 'featureType' then codeID = '010'
24
+ when 'propertyType' then codeID = '011'
25
+ when 'fieldSession' then codeID = '012'
26
+ when 'software' then codeID = '013'
27
+ when 'service' then codeID = '014'
28
+ when 'model' then codeID = '015'
29
+ when 'tile' then codeID = '016'
30
+ else
31
+ codeName = 'INVALID SCOPE CODE'
32
+ codeID = '999'
33
+ end
34
+
35
+ # write xml
36
+ @xml.tag!('gmd:MD_ScopeCode',{:codeList=>'http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode',
37
+ :codeListValue=>"#{codeName}",
38
+ :codeSpace=>"#{codeID}"})
39
+ end
40
+
41
+ end
42
+
43
+
44
+
45
+
46
+
@@ -0,0 +1,36 @@
1
+ # ISO <<CodeLists>> gmd:MD_SpatialRepresentationTypeCode
2
+
3
+ # from http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml
4
+ # History:
5
+ # Stan Smith 2013-10-21 original script
6
+
7
+ class MD_SpatialRepresentationTypeCode
8
+ def initialize(xml)
9
+ @xml = xml
10
+ end
11
+
12
+ def writeXML(codeName)
13
+ case(codeName)
14
+ when 'vector' then codeID = '001'
15
+ when 'grid' then codeID = '002'
16
+ when 'textTable' then codeID = '003'
17
+ when 'tin' then codeID = '004'
18
+ when 'stereoModel' then codeID = '005'
19
+ when 'video' then codeID = '006'
20
+ else
21
+ codeName = 'INVALID SPATIAL REPRESENTATION TYPE'
22
+ codeID = '999'
23
+ end
24
+
25
+ # write xml
26
+ @xml.tag!('gmd:MD_SpatialRepresentationTypeCode',{:codeList=>'http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_SpatialRepresentationTypeCode',
27
+ :codeListValue=>"#{codeName}",
28
+ :codeSpace=>"#{codeID}"})
29
+ end
30
+
31
+ end
32
+
33
+
34
+
35
+
36
+
@@ -0,0 +1,50 @@
1
+ # ISO <<CodeLists>> gmd:MD_TopicCategoryCode
2
+ # Enumeration
3
+
4
+ # from http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml
5
+ # History:
6
+ # Stan Smith 2013-10-21 original script
7
+
8
+ class MD_TopicCategoryCode
9
+ def initialize(xml)
10
+ @xml = xml
11
+ end
12
+
13
+ def writeXML(codeName)
14
+ case(codeName)
15
+ when 'farming',
16
+ 'biota',
17
+ 'boundaries',
18
+ 'climatologyMeteorologyAtmosphere',
19
+ 'economy',
20
+ 'elevation',
21
+ 'environment',
22
+ 'geoscientificInformation',
23
+ 'health',
24
+ 'imageryBaseMapsEarthCover',
25
+ 'intelligenceMilitary',
26
+ 'inlandWaters',
27
+ 'location',
28
+ 'oceans',
29
+ 'planningCadastre',
30
+ 'society',
31
+ 'structure',
32
+ 'transportation',
33
+ 'utilitiesCommunication'
34
+ else
35
+ # topics not in the standard ISO list will not pass validation
36
+ # the domain is validated by the XSD
37
+ # this codelist cannot be extended
38
+ return
39
+ end
40
+
41
+ # write xml
42
+ @xml.tag!('gmd:MD_TopicCategoryCode',codeName)
43
+ end
44
+
45
+ end
46
+
47
+
48
+
49
+
50
+
@@ -0,0 +1,131 @@
1
+ # Writer - internal data structure to ISO 19115-2:2009
2
+
3
+ # History:
4
+ # Stan Smith 2013-08-10 original script
5
+ # Stan Smith 2014-06-04 add internal object pre-scan to create extents
6
+ # ... for geometry supplemental information
7
+ # Stan Smith 2014-07-08 modify require statements to function in RubyGem structure
8
+
9
+ require 'builder'
10
+ require 'date'
11
+ require 'uuidtools'
12
+ require 'class_metadata'
13
+
14
+ $idCount = '_000'
15
+
16
+ class Iso191152Writer
17
+
18
+ def initialize
19
+ end
20
+
21
+ def writeXML(internalObj)
22
+
23
+ # pre-scan the internal object to create a new extents for each geometry
24
+ # ... that has supplemental information (temporal, vertical, identity)
25
+ # ... new extents will be added to internalObj as needed
26
+ prescanGeoElements(internalObj)
27
+
28
+ # create new XML document
29
+ xml = Builder::XmlMarkup.new(indent: 3)
30
+ metadataWriter = MI_Metadata.new(xml)
31
+ metadata = metadataWriter.writeXML(internalObj)
32
+
33
+ return metadata
34
+ end
35
+
36
+ def prescanGeoElements(internalObj)
37
+ # supplemental information for the geographic element is carried in the
38
+ # ... internal structure in the temporalElements:, verticalElements:,
39
+ # ... and elementIdentifiers: attributes of the extGeoElements:
40
+ # ... of the extent.
41
+ # since temporal, vertical, and identify information in ISO is a property
42
+ # ... of EX_Extent and not of the geographicElement,
43
+ # ... this code creates a new extent for each geographicElement
44
+ # ... that has supplemental information and
45
+ # ... moves the supplemental information from the geometry to the new extent.
46
+ # In this implementation, supplemental information is only allowed for
47
+ # ... geometry types of Point, LineString, and Polygon
48
+ aExtents = internalObj[:metadata][:resourceInfo][:extents]
49
+ unless aExtents.empty?
50
+ aExtents.each do |hExtent|
51
+ aGeoElements = hExtent[:extGeoElements]
52
+ unless aGeoElements.empty?
53
+ aGeoElements.each do |hGeoElement|
54
+ hGeometry = hGeoElement[:elementGeometry]
55
+ unless hGeometry.empty?
56
+ geoType = hGeometry[:geoType]
57
+ case geoType
58
+ when 'Point', 'LineString', 'Polygon'
59
+ newExtent = extentFromGeoElement(hGeoElement, geoType)
60
+ if !newExtent.nil?
61
+ aExtents << newExtent
62
+ end
63
+
64
+ when 'MultiGeometry'
65
+ aGeoMembers = hGeometry[:geometry]
66
+ unless aGeoMembers.empty?
67
+ aGeoMembers.each do |hGeoMemberElement|
68
+ hGeometry = hGeoMemberElement[:elementGeometry]
69
+ unless hGeometry.empty?
70
+ geoType = hGeometry[:geoType]
71
+ case geoType
72
+ when 'Point', 'LineString', 'Polygon'
73
+ newExtent = extentFromGeoElement(hGeoMemberElement, geoType)
74
+ if !newExtent.nil?
75
+ aExtents << newExtent
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+
89
+ def extentFromGeoElement(hGeoElement, geoType)
90
+ # build new extent to portray supplemental information
91
+ # from elementGeometry
92
+ if !hGeoElement[:temporalElements].empty? ||
93
+ !hGeoElement[:verticalElements].empty? ||
94
+ !hGeoElement[:elementIdentifiers].empty?
95
+
96
+ # get unique id for geometry
97
+ # if geometry id was missing, set it at this time so
98
+ # ... it will match the supplemental information extent description
99
+ geoID = hGeoElement[:elementId]
100
+ if geoID.nil?
101
+ $idCount = $idCount.succ
102
+ geoID = geoType + $idCount
103
+ hGeoElement[:elementId] = geoID
104
+ end
105
+
106
+ # build unique id for extent geometry
107
+ $idCount = $idCount.succ
108
+ extGeoID = geoType + $idCount
109
+
110
+ intMetadataClass = InternalMetadata.new
111
+ intExtent = intMetadataClass.newExtent
112
+ intGeoEle = intMetadataClass.newGeoElement
113
+
114
+ intGeoEle[:elementId] = extGeoID
115
+ intGeoEle[:elementGeometry] = hGeoElement[:elementGeometry]
116
+
117
+ intExtent[:extDesc] = 'Supplemental information for ' + geoID
118
+ intExtent[:extGeoElements] << intGeoEle
119
+ intExtent[:extIdElements] = hGeoElement[:elementIdentifiers]
120
+ intExtent[:extTempElements] = hGeoElement[:temporalElements]
121
+ intExtent[:extVertElements] = hGeoElement[:verticalElements]
122
+
123
+ return intExtent
124
+
125
+ else
126
+ return nil
127
+ end
128
+
129
+ end
130
+
131
+ end
@@ -0,0 +1,97 @@
1
+ # MdTranslator - ADIwg MdTranslator RubyGem entry point
2
+ # ... pass input file to appropriate reader and writer;
3
+ # ... assign module path names for require statements
4
+
5
+ # History:
6
+ # Stan Smith 2014-07-02 original script
7
+ # Stan Smith 2014-07-21 added ADIWG namespace
8
+ # Stan Smith 2014-07-21 added validation of json structure
9
+ # Stan Smith 2014-07-23 moved all validations to readers/adiwg/adiwg_validator.rb
10
+ # ... each reader will have it's own validator
11
+ # Stan Smith 2014-09-26 added processing of minor release numbers
12
+
13
+ # add main directories to load_path
14
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__),'mdtranslator'))
15
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__),'mdtranslator/internal'))
16
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__),'mdtranslator/readers'))
17
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__),'mdtranslator/writers'))
18
+
19
+ require 'version'
20
+ require 'internal_metadata_obj'
21
+
22
+ module ADIWG
23
+
24
+ module Mdtranslator
25
+
26
+ def self.translate(file, reader, writer, validate, showAllTags)
27
+
28
+ $showAllTags = showAllTags
29
+ $response = {
30
+ readerFormat: nil,
31
+ readerStructurePass: nil,
32
+ readerStructureMessages: [],
33
+ readerName: reader,
34
+ readerNameFound: nil,
35
+ readerVersionFound: nil,
36
+ readerVersionUsed: nil,
37
+ readerValidationLevel: validate,
38
+ readerValidationPass: nil,
39
+ readerValidationMessages: [],
40
+ writerName: writer,
41
+ writerFormat: nil,
42
+ writerPass: nil,
43
+ writerMessages: [],
44
+ writerOutput: nil
45
+ }
46
+
47
+ # the mdtranslator gem loads and returns the above hash
48
+
49
+ case reader
50
+ when 'adiwgJson'
51
+ require 'adiwgJson/adiwgJson_validator'
52
+
53
+ # validate adiwgJson file
54
+ AdiwgJsonValidation.validate(file)
55
+ if $response[:readerStructurePass] && $response[:readerValidationPass]
56
+ # initiate the reader
57
+ require 'adiwgJson/adiwgJson_reader'
58
+ readerClass = AdiwgJsonReader.new
59
+ internalObj = readerClass.unpack(file)
60
+ else
61
+ return $response
62
+ end
63
+ end
64
+
65
+ case writer
66
+ when 'iso19115_2'
67
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__),'mdtranslator/writers/iso19115_2/codelists'))
68
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__),'mdtranslator/writers/iso19115_2/classes'))
69
+ require 'iso19115_2/iso19115_2_writer'
70
+
71
+ # set the format of the output file based on the writer specified
72
+ $response[:writerFormat] = 'xml'
73
+
74
+ writerClass = Iso191152Writer.new
75
+
76
+ # initiate the writer
77
+ $response[:writerOutput] = writerClass.writeXML(internalObj)
78
+ if $response[:writerMessages].length > 0
79
+ $response[:writerPass] = false
80
+ else
81
+ $response[:writerPass] = true
82
+ end
83
+ end
84
+
85
+ return $response
86
+
87
+ end
88
+
89
+ def self.reader_module(moduleName, version)
90
+ dir = File.join($response[:readerName], 'modules_' + version)
91
+ file = File.join(dir, moduleName)
92
+ return file
93
+ end
94
+
95
+ end
96
+
97
+ end
@@ -0,0 +1 @@
1
+ require 'adiwg/mdtranslator'
data/mdtranslator.rb ADDED
@@ -0,0 +1,178 @@
1
+ #!/usr/bin/env ruby
2
+ # ADIwg mdTranslator - Thor CLI for mdtranslator
3
+
4
+ # History:
5
+ # Stan Smith 2014-07-15 original script
6
+ # Stan Smith 2014-09-02 changed name to mdtranslator
7
+ # Stan Smith 2014-09-21 coded cli to 0.8.0 api
8
+
9
+ # uncomment next 2 lines during development to run from code (not gem) ....
10
+ lib = File.expand_path('lib')
11
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
12
+
13
+ require 'thor'
14
+ require 'adiwg-mdtranslator'
15
+
16
+ class Mdtranslator < Thor
17
+
18
+ # exit_on_failure added to exit with code 1 if thor cannot complete task
19
+ # such as if required parameters are missing
20
+ def self.exit_on_failure?
21
+ true
22
+ end
23
+
24
+ # basic cli description
25
+ desc 'translate [FILE]', %q{Pass JSON string or filename plus parameters to mdtranslator translate}
26
+ long_desc <<-LONGDESC
27
+ 'mdtranslator translate' provides command line access to the ADIWG metadata translator
28
+ with options to select the input file reader, select writer output format, show empty tags
29
+ in XML outputs, and choose level of validation for JSON inputs.
30
+ LONGDESC
31
+ # define cli options
32
+ method_option :reader, :aliases => '-r', :desc => 'Name of reader to read your input', :default => 'adiwgJson'
33
+ method_option :writer, :aliases => '-w', :desc => 'Name of writer to create your metadata, or leave blank to validate input only'
34
+ method_option :validate, :aliases => '-v', :desc => 'Specify level of validation to be performed', :enum => %w{none normal strict}, :default => 'normal'
35
+ method_option :showAllTags, :aliases => '-s', :desc => 'Include tags for unused attributes', :type => :boolean, :default => false
36
+ method_option :messages, :aliases => '-m', :desc => 'On error return messages as formatted text or json object', :enum => %w{json text}, :default => 'text'
37
+ method_option :returnObject, :aliases => '-o', :desc => 'Return full JSON object generated by translator', :type => :boolean, :default => false
38
+
39
+ # accept command and options
40
+ def translate(file)
41
+
42
+ # test to see if file parameter is a local file
43
+ # if not ... it is assumed to be a json string
44
+ if File.exist?(file)
45
+ # read file
46
+ my_file = File.open(file, 'r')
47
+ fileObj = my_file.read
48
+ my_file.close
49
+ else
50
+ fileObj = file
51
+ end
52
+
53
+ # for testing parameters
54
+ # puts 'reader: ' + options[:reader]
55
+ # puts 'writer: ' + options[:writer]
56
+ # puts 'validation level: ' + options[:validate]
57
+ # puts 'showAllTags: ' + options[:showAllTags].to_s
58
+ # puts 'message format: ' + options[:messages]
59
+ # puts 'return object format: ' + options[:returnObject]
60
+ # require 'pp'
61
+ # pp fileObj
62
+
63
+ # call mdtranslator
64
+ mdReturn = ADIWG::Mdtranslator.translate(fileObj, options[:reader], options[:writer],
65
+ options[:validate], options[:showAllTags])
66
+
67
+ # determine return content and type of return ...
68
+ if mdReturn[:readerStructurePass] && mdReturn[:readerValidationPass]
69
+
70
+ # no problem was found with the input file
71
+ if options[:writer].nil?
72
+ # if no writer was specified the input was being validated only,
73
+ # ...no writer output will have been generated,
74
+ # ...and the return will be a string unless json was requested
75
+ if options[:messages] == 'json'
76
+ $stdout.write mdReturn.to_json
77
+ return
78
+ else
79
+ $stdout.write 'Success'
80
+ return
81
+ end
82
+ else
83
+ # a writer was specified,
84
+ # output is expected from the translator's writer
85
+ if mdReturn[:writerPass]
86
+ # writer output was generated
87
+ # ...return the writer output in its native format unless json was requested
88
+ if options[:returnObject]
89
+ $stdout.write mdReturn.to_json
90
+ return
91
+ else
92
+ $stdout.write mdReturn[:writerOutput].to_s
93
+ return
94
+ end
95
+ else
96
+ # the writer failed or generated warnings to be reported
97
+ # ...return the messages as a string unless json was requested
98
+ if options[:messages] == 'json'
99
+ $stdout.write mdReturn.to_json
100
+ return
101
+ else
102
+ # build a string with messages issues from parser and validator
103
+ s = ''
104
+ s += "Failed\n"
105
+ s += "Writer failed to generate output or issued significant warnings\n"
106
+ s += "See following messages for further information\n"
107
+
108
+ # post structure messages
109
+ i = 0
110
+ mdReturn[:writerMessages].each do |message|
111
+ i += 1
112
+ s += "\nMessage: #{i}\n"
113
+ s += message + "\n"
114
+ end
115
+
116
+ $stdout.write s
117
+ return
118
+
119
+ end
120
+ end
121
+ end
122
+
123
+ else
124
+
125
+ # problems were found with the input file
126
+
127
+ # if no writer was specified the input was being validated only,
128
+ # ...no writer output will have been generated,
129
+ # ...and return is always expected to be a string
130
+ if options[:messages] == 'json'
131
+ $stdout.write mdReturn.to_json
132
+ return
133
+ else
134
+ # build a string with messages issues from parser and validator
135
+ s = ''
136
+ s += "Failed\n"
137
+ s += "Input failed to pass either file structure validation or content does not match schema\n"
138
+ s += "See following messages for further information\n"
139
+
140
+ # post structure messages
141
+ if mdReturn[:readerStructurePass]
142
+ s += "Success - Input structure is valid\n"
143
+ else
144
+ s += "Fail - Structure of input file is invalid - see following message(s):\n"
145
+ i = 0
146
+ mdReturn[:readerStructureMessages].each do |message|
147
+ i += 1
148
+ s += "\nMessage: #{i}\n"
149
+ s += message.to_s + "\n"
150
+ end
151
+ end
152
+
153
+ # post validator messages
154
+ unless mdReturn[:readerValidationPass].nil?
155
+ if mdReturn[:readerValidationPass]
156
+ s += "Success - Input content passes schema definition\n"
157
+ else
158
+ s += "Fail - Input content did not pass schema validation - see following message(s):\n"
159
+ i = 0
160
+ mdReturn[:readerValidationMessages].each do |message|
161
+ i += 1
162
+ s += "\nMessage: #{i}\n"
163
+ s += message.to_s + "\n"
164
+ end
165
+ end
166
+ end
167
+
168
+ $stdout.write s
169
+ return
170
+
171
+ end
172
+ end
173
+
174
+ end
175
+
176
+ Mdtranslator.start(ARGV)
177
+
178
+ end