From f774aba58024290d0e1b622b3ba8ea667a64b245 Mon Sep 17 00:00:00 2001 From: Andreas Schmitz Date: Wed, 22 Jan 2025 09:54:02 +0100 Subject: [PATCH] feat: initial setup to write service metadata --- .../mde_importer/importer/ImportService.java | 4 +- .../mde_backend/model/json/Constraint.java | 1 + .../mde/mde_backend/model/json/Contact.java | 2 + .../model/json/ContentDescription.java | 1 + .../model/json/JsonIsoMetadata.java | 3 +- .../mde/mde_backend/model/json/Thesaurus.java | 1 + .../json/{ => codelists}/CI_DateTypeCode.java | 2 +- .../CI_OnLineFunctionCode.java | 2 +- .../codelists/CI_PresentationFormCode.java | 18 ++ .../json/{ => codelists}/CI_RoleCode.java | 2 +- .../json/codelists/MD_CharacterSetCode.java | 21 ++ .../MD_MaintenanceFrequencyCode.java | 2 +- .../{ => codelists}/MD_RestrictionCode.java | 2 +- .../model/json/codelists/MD_ScopeCode.java | 20 ++ .../service/DatasetIsoGenerator.java | 193 +++--------------- .../mde_backend/service/GeneratorUtils.java | 147 +++++++++++++ .../service/ServiceIsoGenerator.java | 86 ++++++++ .../mde/mde_backend/utils/NamespaceUtils.java | 4 + 18 files changed, 334 insertions(+), 177 deletions(-) rename mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/{ => codelists}/CI_DateTypeCode.java (54%) rename mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/{ => codelists}/CI_OnLineFunctionCode.java (62%) create mode 100644 mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/CI_PresentationFormCode.java rename mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/{ => codelists}/CI_RoleCode.java (75%) create mode 100644 mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/MD_CharacterSetCode.java rename mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/{ => codelists}/MD_MaintenanceFrequencyCode.java (77%) rename mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/{ => codelists}/MD_RestrictionCode.java (73%) create mode 100644 mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/MD_ScopeCode.java create mode 100644 mde-services/src/main/java/de/terrestris/mde/mde_backend/service/GeneratorUtils.java create mode 100644 mde-services/src/main/java/de/terrestris/mde/mde_backend/service/ServiceIsoGenerator.java diff --git a/mde-importer/src/main/java/de/terrestris/mde/mde_importer/importer/ImportService.java b/mde-importer/src/main/java/de/terrestris/mde/mde_importer/importer/ImportService.java index 7cf7301..f461d9b 100644 --- a/mde-importer/src/main/java/de/terrestris/mde/mde_importer/importer/ImportService.java +++ b/mde-importer/src/main/java/de/terrestris/mde/mde_importer/importer/ImportService.java @@ -11,6 +11,7 @@ import de.terrestris.mde.mde_backend.model.json.ColumnInfo.ColumnType; import de.terrestris.mde.mde_backend.model.json.ColumnInfo.FilterType; import de.terrestris.mde.mde_backend.model.json.Service.ServiceType; +import de.terrestris.mde.mde_backend.model.json.codelists.*; import lombok.extern.log4j.Log4j2; import org.apache.http.client.utils.URIBuilder; import org.springframework.beans.factory.annotation.Autowired; @@ -224,6 +225,7 @@ private static void extractFromIso(XMLStreamReader reader, IsoMetadata metadata, metadata.setMetadataId(reader.getAttributeValue(null, "uuid")); client.setMetadataId(metadata.getMetadataId()); technical.setMetadataId(metadata.getMetadataId()); + json.setPointsOfContact(new ArrayList<>()); while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName().equals("MD_Metadata"))) { reader.next(); if (!reader.isStartElement()) { @@ -239,7 +241,7 @@ private static void extractFromIso(XMLStreamReader reader, IsoMetadata metadata, } if (reader.isStartElement() && reader.getLocalName().equals("pointOfContact")) { var contact = parseContact(reader, "pointOfContact"); - json.setPointOfContact(contact); + json.getPointsOfContact().add(contact); } if (reader.isStartElement() && reader.getLocalName().equals("topicCategory")) { skipToElement(reader, "MD_TopicCategoryCode"); diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Constraint.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Constraint.java index eedaa20..114da3f 100644 --- a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Constraint.java +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Constraint.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import de.terrestris.mde.mde_backend.model.json.codelists.MD_RestrictionCode; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Contact.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Contact.java index 01122ae..65922a3 100644 --- a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Contact.java +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Contact.java @@ -2,6 +2,8 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import de.terrestris.mde.mde_backend.model.json.codelists.CI_OnLineFunctionCode; +import de.terrestris.mde.mde_backend.model.json.codelists.CI_RoleCode; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/ContentDescription.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/ContentDescription.java index 56db251..def8ff3 100644 --- a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/ContentDescription.java +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/ContentDescription.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import de.terrestris.mde.mde_backend.model.json.codelists.CI_OnLineFunctionCode; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/JsonIsoMetadata.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/JsonIsoMetadata.java index a556207..3f77e33 100644 --- a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/JsonIsoMetadata.java +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/JsonIsoMetadata.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import de.terrestris.mde.mde_backend.enumeration.MetadataProfile; +import de.terrestris.mde.mde_backend.model.json.codelists.MD_MaintenanceFrequencyCode; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -90,7 +91,7 @@ public enum InspireTheme { private List contacts; - private Contact pointOfContact; + private List pointsOfContact; private Integer scale; diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Thesaurus.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Thesaurus.java index 96ce685..b9a8e46 100644 --- a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Thesaurus.java +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Thesaurus.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import de.terrestris.mde.mde_backend.model.json.codelists.CI_DateTypeCode; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/CI_DateTypeCode.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/CI_DateTypeCode.java similarity index 54% rename from mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/CI_DateTypeCode.java rename to mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/CI_DateTypeCode.java index 7946a34..f2885b6 100644 --- a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/CI_DateTypeCode.java +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/CI_DateTypeCode.java @@ -1,4 +1,4 @@ -package de.terrestris.mde.mde_backend.model.json; +package de.terrestris.mde.mde_backend.model.json.codelists; public enum CI_DateTypeCode { creation, diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/CI_OnLineFunctionCode.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/CI_OnLineFunctionCode.java similarity index 62% rename from mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/CI_OnLineFunctionCode.java rename to mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/CI_OnLineFunctionCode.java index cbda973..6bfde2e 100644 --- a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/CI_OnLineFunctionCode.java +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/CI_OnLineFunctionCode.java @@ -1,4 +1,4 @@ -package de.terrestris.mde.mde_backend.model.json; +package de.terrestris.mde.mde_backend.model.json.codelists; public enum CI_OnLineFunctionCode { download, diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/CI_PresentationFormCode.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/CI_PresentationFormCode.java new file mode 100644 index 0000000..a7756da --- /dev/null +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/CI_PresentationFormCode.java @@ -0,0 +1,18 @@ +package de.terrestris.mde.mde_backend.model.json.codelists; + +public enum CI_PresentationFormCode { + documentDigital, + imageDigital, + documentHardcopy, + imageHardcopy, + mapDigital, + mapHardcopy, + modelDigital, + modelHardcopy, + profileDigital, + profileHardcopy, + tableDigital, + tableHardcopy, + videoDigital, + videoHardcopy +} diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/CI_RoleCode.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/CI_RoleCode.java similarity index 75% rename from mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/CI_RoleCode.java rename to mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/CI_RoleCode.java index 9c8b718..e99b0f5 100644 --- a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/CI_RoleCode.java +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/CI_RoleCode.java @@ -1,4 +1,4 @@ -package de.terrestris.mde.mde_backend.model.json; +package de.terrestris.mde.mde_backend.model.json.codelists; public enum CI_RoleCode { resourceProvider, diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/MD_CharacterSetCode.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/MD_CharacterSetCode.java new file mode 100644 index 0000000..8285c63 --- /dev/null +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/MD_CharacterSetCode.java @@ -0,0 +1,21 @@ +package de.terrestris.mde.mde_backend.model.json.codelists; + +public enum MD_CharacterSetCode { + ucs2, + ucs4, + utf7, + utf8, + utf16 + // omitted because identifiers are not legal in java (and not used anyway) + //8859part1, + //8859part2, + //8859part3, + //8859part4, + //8859part5, + //8859part6, + //8859part7, + //8859part8, + //8859part9, + //8859part10, + //8859part11 +} diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/MD_MaintenanceFrequencyCode.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/MD_MaintenanceFrequencyCode.java similarity index 77% rename from mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/MD_MaintenanceFrequencyCode.java rename to mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/MD_MaintenanceFrequencyCode.java index 230059d..8310524 100644 --- a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/MD_MaintenanceFrequencyCode.java +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/MD_MaintenanceFrequencyCode.java @@ -1,4 +1,4 @@ -package de.terrestris.mde.mde_backend.model.json; +package de.terrestris.mde.mde_backend.model.json.codelists; public enum MD_MaintenanceFrequencyCode { continual, diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/MD_RestrictionCode.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/MD_RestrictionCode.java similarity index 73% rename from mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/MD_RestrictionCode.java rename to mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/MD_RestrictionCode.java index e74ac82..db7d06d 100644 --- a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/MD_RestrictionCode.java +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/MD_RestrictionCode.java @@ -1,4 +1,4 @@ -package de.terrestris.mde.mde_backend.model.json; +package de.terrestris.mde.mde_backend.model.json.codelists; public enum MD_RestrictionCode { diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/MD_ScopeCode.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/MD_ScopeCode.java new file mode 100644 index 0000000..13dab39 --- /dev/null +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/codelists/MD_ScopeCode.java @@ -0,0 +1,20 @@ +package de.terrestris.mde.mde_backend.model.json.codelists; + +public enum MD_ScopeCode { + attribute, + attributeType, + collectionHardware, + collectionSession, + dataset, + series, + nonGeographicDataset, + dimensionGroup, + feature, + featureType, + propertyType, + fieldSession, + software, + service, + model, + tile +} diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/service/DatasetIsoGenerator.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/service/DatasetIsoGenerator.java index 97dfc47..38f1539 100644 --- a/mde-services/src/main/java/de/terrestris/mde/mde_backend/service/DatasetIsoGenerator.java +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/service/DatasetIsoGenerator.java @@ -2,6 +2,7 @@ import de.terrestris.mde.mde_backend.enumeration.MetadataProfile; import de.terrestris.mde.mde_backend.model.json.*; +import de.terrestris.mde.mde_backend.model.json.codelists.MD_MaintenanceFrequencyCode; import lombok.extern.log4j.Log4j2; import org.springframework.stereotype.Component; @@ -10,11 +11,13 @@ import javax.xml.stream.XMLStreamWriter; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.time.Instant; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.util.List; +import static de.terrestris.mde.mde_backend.model.json.codelists.CI_DateTypeCode.*; +import static de.terrestris.mde.mde_backend.model.json.codelists.MD_ScopeCode.dataset; +import static de.terrestris.mde.mde_backend.service.GeneratorUtils.*; import static de.terrestris.mde.mde_backend.service.IsoGenerator.replaceValues; import static de.terrestris.mde.mde_backend.utils.NamespaceUtils.*; import static de.terrestris.utils.xml.XmlUtils.writeSimpleElement; @@ -26,135 +29,6 @@ public class DatasetIsoGenerator { private static final XMLOutputFactory FACTORY = XMLOutputFactory.newFactory(); - private static void writeLanguage(XMLStreamWriter writer) throws XMLStreamException { - writer.writeStartElement(GMD, "language"); - writer.writeStartElement(GMD, "LanguageCode"); - writer.writeAttribute("codeList", "http://www.loc.gov/standards/iso639-2/"); - writer.writeAttribute("codeListValue", "ger"); - writer.writeEndElement(); - writer.writeEndElement(); - } - - private static void writeFileIdentifier(XMLStreamWriter writer, JsonIsoMetadata metadata) throws XMLStreamException { - writer.writeStartElement(GMD, "fileIdentifier"); - writeSimpleElement(writer, GCO, "CharacterString", metadata.getFileIdentifier()); - writer.writeEndElement(); - } - - private static void writeCharacterSet(XMLStreamWriter writer) throws XMLStreamException { - writer.writeStartElement(GMD, "characterSet"); - writer.writeStartElement(GMD, "MD_CharacterSetCode"); - writer.writeAttribute("codeList", "http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_CharacterSetCode"); - writer.writeAttribute("codeListValue", "utf8"); - writer.writeEndElement(); - writer.writeEndElement(); - } - - private static void writeHierarchyLevel(XMLStreamWriter writer) throws XMLStreamException { - writer.writeStartElement(GMD, "hierarchyLevel"); - writer.writeStartElement(GMD, "MD_ScopeCode"); - writer.writeAttribute("codeList", "http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_ScopeCode"); - writer.writeAttribute("codeListValue", "dataset"); - writer.writeEndElement(); - writer.writeEndElement(); - } - - private static void writeContact(XMLStreamWriter writer, Contact contact, String localName) throws XMLStreamException { - writer.writeStartElement(GMD, localName); - writer.writeStartElement(GMD, "CI_ResponsibleParty"); - writer.writeStartElement(GMD, "organisationName"); - writeSimpleElement(writer, GCO, "CharacterString", contact.getOrganisation()); - writer.writeEndElement(); // organisationName - writer.writeStartElement(GMD, "contactInfo"); - writer.writeStartElement(GMD, "CI_Contact"); - if (contact.getPhone() != null) { - writer.writeStartElement(GMD, "phone"); - writer.writeStartElement(GMD, "CI_Telephone"); - writer.writeStartElement(GMD, "voice"); - writeSimpleElement(writer, GCO, "CharacterString", contact.getPhone()); - writer.writeEndElement(); // voice - writer.writeEndElement(); // CI_Telephone - writer.writeEndElement(); // phone - } - writer.writeStartElement(GMD, "address"); - writer.writeStartElement(GMD, "CI_Address"); - writer.writeStartElement(GMD, "electronicMailAddress"); - writeSimpleElement(writer, GCO, "CharacterString", contact.getEmail()); - writer.writeEndElement(); // electronicMailAddress - writer.writeEndElement(); // CI_Address - writer.writeEndElement(); // address - if (contact.getUrl() != null) { - writer.writeStartElement(GMD, "onlineResource"); - writer.writeStartElement(GMD, "CI_OnlineResource"); - writer.writeStartElement(GMD, "linkage"); - writeSimpleElement(writer, GMD, "URL", replaceValues(contact.getUrl())); - writer.writeEndElement(); // linkage - writer.writeStartElement(GMD, "function"); - writer.writeStartElement(GMD, "CI_OnLineFunctionCode"); - writer.writeAttribute("codeList", "http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_OnLineFunctionCode"); - writer.writeAttribute("codeListValue", "information"); - writer.writeEndElement(); // CI_OnLineFunctionCode - writer.writeEndElement(); // function - writer.writeEndElement(); // CI_OnlineResource - writer.writeEndElement(); // onlineResource - } - writer.writeEndElement(); // CI_Contact - writer.writeEndElement(); // contactInfo - writer.writeStartElement(GMD, "role"); - writer.writeStartElement(GMD, "CI_RoleCode"); - writer.writeAttribute("codeList", "http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_RoleCode"); - writer.writeAttribute("codeListValue", contact.getRoleCode().toString()); - writer.writeEndElement(); // CI_RoleCode - writer.writeEndElement(); // role - writer.writeEndElement(); // CI_ResponsibleParty - writer.writeEndElement(); // contact - } - - private static void writeDateStamp(XMLStreamWriter writer, JsonIsoMetadata metadata) throws XMLStreamException { - writer.writeStartElement(GMD, "dateStamp"); - writeSimpleElement(writer, GCO, "DateTime", metadata.getDateTime().toString()); - writer.writeEndElement(); // dateStamp - } - - private static void writeMetadataInfo(XMLStreamWriter writer) throws XMLStreamException { - writer.writeStartElement(GMD, "metadataStandardName"); - writeSimpleElement(writer, GCO, "CharacterString", "ISO 19115/19119 ? BE"); - writer.writeEndElement(); // metadataStandardName - writer.writeStartElement(GMD, "metadataStandardVersion"); - writeSimpleElement(writer, GCO, "CharacterString", "1.0.0"); - writer.writeEndElement(); // metadataStandardVersion - } - - private static void writeCrs(XMLStreamWriter writer, JsonIsoMetadata metadata) throws XMLStreamException { - writer.writeStartElement(GMD, "referenceSystemInfo"); - writer.writeStartElement(GMD, "MD_ReferenceSystem"); - writer.writeStartElement(GMD, "referenceSystemIdentifier"); - writer.writeStartElement(GMD, "RS_Identifier"); - writer.writeStartElement(GMD, "code"); - writeSimpleElement(writer, GCO, "CharacterString", metadata.getCrs()); - writer.writeEndElement(); // code - writer.writeEndElement(); // RS_Identifier - writer.writeEndElement(); // referenceSystemIdentifier - writer.writeEndElement(); // MD_ReferenceSystem - writer.writeEndElement(); // referenceSystemInfo - } - - private static void writeDate(XMLStreamWriter writer, Instant date, String type) throws XMLStreamException { - writer.writeStartElement(GMD, "date"); - writer.writeStartElement(GMD, "CI_Date"); - writer.writeStartElement(GMD, "date"); - writeSimpleElement(writer, GCO, "Date", DateTimeFormatter.ISO_DATE.format(date.atOffset(ZoneOffset.UTC))); - writer.writeEndElement(); // Date - writer.writeStartElement(GMD, "dateType"); - writer.writeStartElement(GMD, "CI_DateTypeCode"); - writer.writeAttribute("codeList", "http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_DateTypeCode"); - writer.writeAttribute("codeListValue", type); - writer.writeEndElement(); // CI_DateTypeCode - writer.writeEndElement(); // dateType - writer.writeEndElement(); // CI_Date - writer.writeEndElement(); // date - } - private static void writeIdentifier(XMLStreamWriter writer, String identifier) throws XMLStreamException { writer.writeStartElement(GMD, "identifier"); writer.writeStartElement(GMD, "MD_Identifier"); @@ -169,10 +43,7 @@ private static void writeMaintenanceInfo(XMLStreamWriter writer, MD_MaintenanceF writer.writeStartElement(GMD, "resourceMaintenance"); writer.writeStartElement(GMD, "MD_MaintenanceInformation"); writer.writeStartElement(GMD, "maintenanceAndUpdateFrequency"); - writer.writeStartElement(GMD, "MD_MaintenanceFrequencyCode"); - writer.writeAttribute("codeList", "http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_MaintenanceFrequencyCode"); - writer.writeAttribute("codeListValue", code.toString()); - writer.writeEndElement(); // MD_MaintenanceFrequencyCode + writeCodelistValue(writer, code); writer.writeEndElement(); // maintenanceAndUpdateFrequency writer.writeEndElement(); // MD_MaintenanceInformation writer.writeEndElement(); // resourceMaintenance @@ -197,10 +68,7 @@ private static void writeResourceConstraints(XMLStreamWriter writer, List void writeCodelistValue(XMLStreamWriter writer, T codeListValue) throws XMLStreamException { + writer.writeStartElement(GMD, codeListValue.getClass().getSimpleName()); + writer.writeAttribute("codeList", String.format("http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#%s", codeListValue.getClass().getSimpleName())); + writer.writeAttribute("codeListValue", codeListValue.toString()); + writer.writeEndElement(); + } + +} diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/service/ServiceIsoGenerator.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/service/ServiceIsoGenerator.java new file mode 100644 index 0000000..911f564 --- /dev/null +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/service/ServiceIsoGenerator.java @@ -0,0 +1,86 @@ +package de.terrestris.mde.mde_backend.service; + +import de.terrestris.mde.mde_backend.model.json.JsonIsoMetadata; +import de.terrestris.mde.mde_backend.model.json.codelists.MD_ScopeCode; +import de.terrestris.mde.mde_backend.model.json.Service; + +import javax.xml.stream.XMLOutputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamWriter; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import static de.terrestris.mde.mde_backend.model.json.codelists.CI_DateTypeCode.*; +import static de.terrestris.mde.mde_backend.model.json.codelists.CI_PresentationFormCode.mapDigital; +import static de.terrestris.mde.mde_backend.service.GeneratorUtils.*; +import static de.terrestris.mde.mde_backend.utils.NamespaceUtils.*; +import static de.terrestris.utils.xml.XmlUtils.writeSimpleElement; +import static java.nio.charset.StandardCharsets.UTF_8; + +public class ServiceIsoGenerator { + + private static final XMLOutputFactory FACTORY = XMLOutputFactory.newFactory(); + + private static void writeServiceIdentification(XMLStreamWriter writer, Service service, JsonIsoMetadata metadata) throws XMLStreamException { + writer.writeStartElement(GMD, "gmd:identificationInfo"); + writer.writeStartElement(SRV, "SV_ServiceIdentification"); + writer.writeAttribute("uuid", service.getServiceIdentification()); + writer.writeStartElement(GMD, "citation"); + writer.writeStartElement(GMD, "CI_Citation"); + writer.writeStartElement(GMD, "title"); + writeSimpleElement(writer, GCO, "CharacterString", service.getTitle()); + writer.writeEndElement(); // title + writeDate(writer, service.getCreated(), creation); + writeDate(writer, service.getPublished(), publication); + writeDate(writer, service.getUpdated(), revision); + writer.writeStartElement(GMD, "identifier"); + writer.writeStartElement(GMD, "MD_Identifier"); + writer.writeStartElement(GMD, "code"); + writeSimpleElement(writer, GCO, "CharacterString", String.format("https://registry.gdi-de.org/id/de.be.csw/%s", service.getServiceIdentification())); + writer.writeEndElement(); // code + writer.writeEndElement(); // MD_Identifier + writer.writeEndElement(); // identifier + writer.writeStartElement(GMD, "presentationForm"); + writeCodelistValue(writer, mapDigital); + writer.writeEndElement(); // presentationForm + writer.writeEndElement(); // CI_Citation + writer.writeEndElement(); // citation + writer.writeStartElement(GMD, "abstract"); + writeSimpleElement(writer, GCO, "CharacterString", service.getShortDescription()); + writer.writeEndElement(); // abstract + for (var contact : metadata.getPointsOfContact()) { + writeContact(writer, contact, "pointOfContact"); + } + // TODO continue here + writer.writeEndElement(); // SV_ServiceIdentification + writer.writeEndElement(); // identificationInfo + } + + public String generateServiceMetadata(JsonIsoMetadata metadata, Service service) throws IOException, XMLStreamException { + try (var out = new ByteArrayOutputStream()) { + var writer = FACTORY.createXMLStreamWriter(out); + setNamespaceBindings(writer); + writer.writeStartDocument(); + writer.writeStartElement(GMD, "MD_Metadata"); + writeNamespaceBindings(writer); + writeFileIdentifier(writer, service.getFileIdentifier()); + writeLanguage(writer); + writeCharacterSet(writer); + writeHierarchyLevel(writer, MD_ScopeCode.service); + for (var contact : metadata.getContacts()) { + writeContact(writer, contact, "contact"); + } + writeDateStamp(writer, metadata); + writeMetadataInfo(writer); + writeCrs(writer, metadata); + writeServiceIdentification(writer, service, metadata); + // TODO continue here + writer.writeEndElement(); // MD_Metadata + writer.writeEndDocument(); + writer.close(); + out.close(); + return out.toString(UTF_8); + } + } + +} diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/utils/NamespaceUtils.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/utils/NamespaceUtils.java index a6d767e..ad30585 100644 --- a/mde-services/src/main/java/de/terrestris/mde/mde_backend/utils/NamespaceUtils.java +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/utils/NamespaceUtils.java @@ -15,12 +15,15 @@ public class NamespaceUtils { public static final String GML = "http://www.opengis.net/gml/3.2"; + public static final String SRV = "http://www.isotc211.org/2005/srv"; + public static void setNamespaceBindings(XMLStreamWriter writer) throws XMLStreamException { writer.setPrefix("gmd", GMD); writer.setPrefix("gco", GCO); writer.setPrefix("gmx", GMX); writer.setPrefix("xlink", XLINK); writer.setPrefix("gml", GML); + writer.setPrefix("srv", SRV); } public static void writeNamespaceBindings(XMLStreamWriter writer) throws XMLStreamException { @@ -29,6 +32,7 @@ public static void writeNamespaceBindings(XMLStreamWriter writer) throws XMLStre writer.writeNamespace("gmx", GMX); writer.writeNamespace("xlink", XLINK); writer.writeNamespace("gml", GML); + writer.writeNamespace("srv", SRV); } }