From e822544ae5f9a037a5c3031a2f5709a87646ac30 Mon Sep 17 00:00:00 2001 From: Andreas Schmitz Date: Wed, 11 Dec 2024 09:27:39 +0100 Subject: [PATCH] feat: update importer --- .editorconfig | 16 +- .../mde_importer/importer/ImportService.java | 429 +++++++++++++----- .../mde/mde_backend/model/ClientMetadata.java | 8 +- .../mde/mde_backend/model/IsoMetadata.java | 11 +- .../mde_backend/model/TechnicalMetadata.java | 4 +- .../mde/mde_backend/model/json/Citation.java | 28 ++ .../mde_backend/model/json/ColumnInfo.java | 16 +- .../model/json/DistributionVersion.java | 22 + .../model/json/JsonClientMetadata.java | 2 +- .../model/json/JsonIsoMetadata.java | 10 + .../model/json/JsonTechnicalMetadata.java | 2 + .../mde/mde_backend/model/json/Layer.java | 12 +- .../mde/mde_backend/model/json/LayerInfo.java | 2 + .../mde/mde_backend/model/json/Service.java | 2 + 14 files changed, 426 insertions(+), 138 deletions(-) create mode 100644 mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Citation.java create mode 100644 mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/DistributionVersion.java diff --git a/.editorconfig b/.editorconfig index 7524627..90c01fe 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,14 +1,10 @@ root = true -[*.java] -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true +[*] indent_style = space -indent_size = 4 +indent_size = 2 +end_of_line = lf charset = utf-8 - -# XML config files -[*.xml] -indent_style = space -indent_size = 2 \ No newline at end of file +trim_trailing_whitespace = true +insert_final_newline = true +tab_width = 2 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 c748bcf..2c62961 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 @@ -7,6 +7,8 @@ import de.terrestris.mde.mde_backend.model.IsoMetadata; import de.terrestris.mde.mde_backend.model.TechnicalMetadata; import de.terrestris.mde.mde_backend.model.json.*; +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 lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; @@ -31,8 +33,7 @@ import java.util.regex.Pattern; import java.util.stream.Stream; -import static de.terrestris.mde.mde_backend.model.json.JsonIsoMetadata.MetadataProfile.INSPIRE_IDENTIFIED; -import static de.terrestris.mde.mde_backend.model.json.JsonIsoMetadata.MetadataProfile.ISO; +import static de.terrestris.mde.mde_backend.model.json.JsonIsoMetadata.MetadataProfile.*; import static de.terrestris.utils.xml.XmlUtils.nextElement; import static de.terrestris.utils.xml.XmlUtils.skipToElement; @@ -138,16 +139,12 @@ private void scanServiceFile(XMLStreamReader reader, Path file) throws XMLStream private void parseDatasetMetadata(XMLStreamReader reader) throws XMLStreamException, ParseException { var metadata = new IsoMetadata(); - ArrayList data = new ArrayList<>(); var json = new JsonIsoMetadata(); var client = new ClientMetadata(); var technical = new TechnicalMetadata(); - technical.setData(new ArrayList<>()); - technical.getData().add(new JsonTechnicalMetadata()); - client.setData(new ArrayList<>()); - client.getData().add(new JsonClientMetadata()); - data.add(json); - metadata.setData(data); + technical.setData(new JsonTechnicalMetadata()); + client.setData(new JsonClientMetadata()); + metadata.setData(json); json.setContacts(new ArrayList<>()); skipToElement(reader, "Metadaten"); var type = reader.getAttributeValue(null, "metadatenTyp"); @@ -169,36 +166,36 @@ private void parseDatasetMetadata(XMLStreamReader reader) throws XMLStreamExcept parseContact(reader, json, "contact"); skipToElement(reader, "dateStamp"); skipToElement(reader, "DateTime"); - // TODO or use local time zone? json.setDateTime(Instant.parse(reader.getElementText() + "Z")); - extractIdentificationInfo(reader, metadata, json, client, technical); + extractFromIso(reader, metadata, json, client, technical); var list = servicesMap.get(metadata.getMetadataId()); if (list != null) { - list.forEach(file -> addService(file, json)); + list.forEach(file -> addService(file, json, client.getData(), technical.getData())); } isoMetadataRepository.save(metadata); clientMetadataRepository.save(client); technicalMetadataRepository.save(technical); } - private static void extractIdentificationInfo(XMLStreamReader reader, IsoMetadata metadata, JsonIsoMetadata json, ClientMetadata client, TechnicalMetadata technical) throws XMLStreamException, ParseException { + private static void extractFromIso(XMLStreamReader reader, IsoMetadata metadata, JsonIsoMetadata json, ClientMetadata client, TechnicalMetadata technical) throws XMLStreamException, ParseException { + json.setResourceConstraints(new ArrayList<>()); skipToElement(reader, "MD_DataIdentification"); metadata.setMetadataId(reader.getAttributeValue(null, "uuid")); client.setMetadataId(metadata.getMetadataId()); technical.setMetadataId(metadata.getMetadataId()); - while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName().equals("MD_DataIdentification"))) { + while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName().equals("MD_Metadata"))) { reader.next(); if (!reader.isStartElement()) { continue; } - if (reader.getLocalName().equals("abstract")) { + if (reader.isStartElement() && reader.getLocalName().equals("abstract")) { skipToElement(reader, "CharacterString"); json.setDescription(reader.getElementText()); } - if (reader.getLocalName().equals("pointOfContact")) { + if (reader.isStartElement() && reader.getLocalName().equals("pointOfContact")) { parseContact(reader, json, "pointOfContact"); } - if (reader.getLocalName().equals("graphicOverview")) { + if (reader.isStartElement() && reader.getLocalName().equals("graphicOverview")) { skipToElement(reader, "CharacterString"); if (json.getPreviews() == null) { json.setPreviews(new ArrayList<>()); @@ -206,114 +203,218 @@ private static void extractIdentificationInfo(XMLStreamReader reader, IsoMetadat var source = new Source(null, reader.getElementText()); json.getPreviews().add(source); } - if (reader.getLocalName().equals("keyword")) { - do { - reader.next(); - } while (!reader.isStartElement()); - if (json.getKeywords() == null) { - json.setKeywords(new ArrayList<>()); + extractConformanceResult(reader, json); + extractKeyword(reader, json); + if (reader.isStartElement() && reader.getLocalName().equals("resourceMaintenance")) { + skipToElement(reader, "MD_MaintenanceFrequencyCode"); + json.setMaintenanceFrequency(MD_MaintenanceFrequencyCode.valueOf(reader.getAttributeValue(null, "codeListValue"))); + } + extractSpatialResolution(reader, json); + extractGraphicOverview(reader, json); + extractCitation(reader, json); + extractTransferOptions(reader, json); + extractResourceConstraints(reader, json); + extractDistributionFormat(reader, json); + if (reader.isStartElement() && reader.getLocalName().equals("statement")) { + skipToElement(reader, "CharacterString"); + json.setLineage(reader.getElementText()); + } + extractDate(reader, json); + } + } + + private static void extractDistributionFormat(XMLStreamReader reader, JsonIsoMetadata json) throws XMLStreamException { + if (reader.isStartElement() && reader.getLocalName().equals("distributionFormat")) { + if (json.getDistributionVersions() == null) { + json.setDistributionVersions(new ArrayList<>()); + } + var version = new DistributionVersion(); + json.getDistributionVersions().add(version); + while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName().equals("distributionFormat"))) { + reader.next(); + if (!reader.isStartElement()) { + continue; } - var keyword = new Keyword(); - if (reader.getLocalName().equals("CharacterString")) { - keyword.setKeyword(reader.getElementText()); - } else { - keyword.setNamespace(reader.getAttributeValue(XLINK, "href")); - keyword.setKeyword(reader.getElementText()); + switch (reader.getLocalName()) { + case "name": + skipToElement(reader, "CharacterString"); + version.setName(reader.getElementText()); + break; + case "version": + skipToElement(reader, "CharacterString"); + version.setVersion(reader.getElementText()); + break; + case "specification": + skipToElement(reader, "CharacterString"); + version.setSpecification(reader.getElementText()); + break; } - json.getKeywords().add(keyword); } - if (reader.getLocalName().equals("resourceMaintenance")) { - skipToElement(reader, "MD_MaintenanceFrequencyCode"); - json.setMaintenanceFrequency(MD_MaintenanceFrequencyCode.valueOf(reader.getAttributeValue(null, "codeListValue"))); + } + } + + private static void extractDate(XMLStreamReader reader, JsonIsoMetadata json) throws XMLStreamException, ParseException { + if (reader.isStartElement() && reader.getLocalName().equals("date")) { + skipToElement(reader, "Date"); + var date = FORMAT.parse(reader.getElementText()).toInstant(); + skipToElement(reader, "CI_DateTypeCode"); + switch (reader.getAttributeValue(null, "codeListValue")) { + case "creation": + json.setCreated(date); + break; + case "publication": + json.setPublished(date); + break; + case "revision": + json.setModified(date); + break; } - if (reader.getLocalName().equals("spatialResolution")) { - while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName().equals("spatialResolution"))) { - reader.next(); - if (!reader.isStartElement()) { - continue; - } - if (reader.getLocalName().equals("Distance")) { - json.setResolution(Double.parseDouble(reader.getElementText())); - } - if (reader.getLocalName().equals("denominator")) { - skipToElement(reader, "Integer"); - json.setScale(Integer.parseInt(reader.getElementText())); + } + } + + private static void extractGraphicOverview(XMLStreamReader reader, JsonIsoMetadata json) throws XMLStreamException { + if (reader.isStartElement() && reader.getLocalName().equals("graphicOverview")) { + if (json.getPreviews() == null) { + json.setPreviews(new ArrayList<>()); + } + skipToElement(reader, "CharacterString"); + json.getPreviews().add(new Source("url", reader.getElementText())); + } + } + + private static void extractConformanceResult(XMLStreamReader reader, JsonIsoMetadata json) throws XMLStreamException { + if (reader.isStartElement() && reader.getLocalName().equals("DQ_ConformanceResult")) { + while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName().equals("DQ_ConformanceResult"))) { + reader.next(); + if (!reader.isStartElement()) { + continue; + } + if (reader.getLocalName().equals("Boolean")) { + json.setValid(Boolean.parseBoolean(reader.getElementText())); + if (json.isValid() && json.getMetadataProfile().equals(INSPIRE_IDENTIFIED)) { + json.setMetadataProfile(INSPIRE_HARMONISED); } } } - if (reader.getLocalName().equals("graphicOverview")) { - if (json.getPreviews() == null) { - json.setPreviews(new ArrayList<>()); + } + } + + private static void extractCitation(XMLStreamReader reader, JsonIsoMetadata json) throws XMLStreamException, ParseException { + if (reader.isStartElement() && reader.getLocalName().equals("citation")) { + while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName().equals("citation"))) { + var citation = new Citation(); + json.setCitation(citation); + reader.next(); + if (!reader.isStartElement()) { + continue; + } + if (reader.getLocalName().equals("title")) { + skipToElement(reader, "CharacterString"); + citation.setTitle(reader.getElementText()); + } + if (reader.getLocalName().equals("Date")) { + var date = FORMAT.parse(reader.getElementText()).toInstant(); + citation.setDate(date); + } + if (reader.getLocalName().equals("code")) { + skipToElement(reader, "CharacterString"); + citation.setUrl(reader.getElementText()); } - skipToElement(reader, "CharacterString"); - json.getPreviews().add(new Source("url", reader.getElementText())); } - if (reader.getLocalName().equals("transferOptions")) { - if (json.getContentDescriptions() == null) { - json.setContentDescriptions(new ArrayList<>()); + } + } + + private static void extractSpatialResolution(XMLStreamReader reader, JsonIsoMetadata json) throws XMLStreamException { + if (reader.isStartElement() && reader.getLocalName().equals("spatialResolution")) { + while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName().equals("spatialResolution"))) { + reader.next(); + if (!reader.isStartElement()) { + continue; } - while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName().equals("transferOptions"))) { - reader.next(); - if (!reader.isStartElement()) { - continue; - } - if (reader.getLocalName().equals("CI_OnlineResource")) { - skipToElement(reader, "URL"); - String url = reader.getElementText(); - skipToElement(reader, "CharacterString"); - String text = reader.getElementText(); - json.getContentDescriptions().add(new ContentDescription(url, text)); - } + if (reader.getLocalName().equals("Distance")) { + json.setResolution(Double.parseDouble(reader.getElementText())); + } + if (reader.getLocalName().equals("denominator")) { + skipToElement(reader, "Integer"); + json.setScale(Integer.parseInt(reader.getElementText())); } } - if (reader.getLocalName().equals("resourceConstraints")) { - ResourceConstraints resourceConstraints = new ResourceConstraints(); - resourceConstraints.setConstraints(new ArrayList<>()); - while (!(reader.isEndElement() && reader.getLocalName().equals("resourceConstraints"))) { - reader.next(); - if (!reader.isStartElement()) { - continue; - } - switch (reader.getLocalName()) { - case "accessConstraints": - case "otherConstraints": - case "useConstraints": - do { - reader.next(); - } while (!reader.isStartElement()); - Constraint constraint = new Constraint(); - resourceConstraints.getConstraints().add(constraint); - switch (reader.getLocalName()) { - case "MD_RestrictionCode": - constraint.setRestrictionCode(MD_RestrictionCode.valueOf(reader.getAttributeValue(null, "codeListValue"))); - break; - case "Anchor": - constraint.setUrl(reader.getAttributeValue(XLINK, "href")); - constraint.setText(reader.getElementText()); - break; - case "CharacterString": - constraint.setText(reader.getElementText()); - break; - } - } + } + } + + private static void extractTransferOptions(XMLStreamReader reader, JsonIsoMetadata json) throws XMLStreamException { + if (reader.isStartElement() && reader.getLocalName().equals("transferOptions")) { + if (json.getContentDescriptions() == null) { + json.setContentDescriptions(new ArrayList<>()); + } + while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName().equals("transferOptions"))) { + reader.next(); + if (!reader.isStartElement()) { + continue; + } + if (reader.getLocalName().equals("CI_OnlineResource")) { + skipToElement(reader, "URL"); + String url = reader.getElementText(); + skipToElement(reader, "CharacterString"); + String text = reader.getElementText(); + json.getContentDescriptions().add(new ContentDescription(url, text)); } } - if (reader.getLocalName().equals("date")) { - skipToElement(reader, "Date"); - var date = FORMAT.parse(reader.getElementText()).toInstant(); - skipToElement(reader, "CI_DateTypeCode"); - switch (reader.getAttributeValue(null, "codeListValue")) { - case "creation": - json.setCreated(date); - break; - case "publication": - json.setPublished(date); - break; - case "revision": - json.setModified(date); - break; + } + } + + private static void extractResourceConstraints(XMLStreamReader reader, JsonIsoMetadata json) throws XMLStreamException { + if (reader.isStartElement() && reader.getLocalName().equals("resourceConstraints")) { + ResourceConstraints resourceConstraints = new ResourceConstraints(); + resourceConstraints.setConstraints(new ArrayList<>()); + while (!(reader.isEndElement() && reader.getLocalName().equals("resourceConstraints"))) { + reader.next(); + if (!reader.isStartElement()) { + continue; + } + switch (reader.getLocalName()) { + case "accessConstraints": + case "otherConstraints": + case "useConstraints": + do { + reader.next(); + } while (!reader.isStartElement()); + Constraint constraint = new Constraint(); + resourceConstraints.getConstraints().add(constraint); + switch (reader.getLocalName()) { + case "MD_RestrictionCode": + constraint.setRestrictionCode(MD_RestrictionCode.valueOf(reader.getAttributeValue(null, "codeListValue"))); + break; + case "Anchor": + constraint.setUrl(reader.getAttributeValue(XLINK, "href")); + constraint.setText(reader.getElementText()); + break; + case "CharacterString": + constraint.setText(reader.getElementText()); + break; + } } } + json.getResourceConstraints().add(resourceConstraints); + } + } + + private static void extractKeyword(XMLStreamReader reader, JsonIsoMetadata json) throws XMLStreamException { + if (reader.isStartElement() && reader.getLocalName().equals("keyword")) { + do { + reader.next(); + } while (!reader.isStartElement()); + if (json.getKeywords() == null) { + json.setKeywords(new ArrayList<>()); + } + var keyword = new Keyword(); + if (reader.getLocalName().equals("CharacterString")) { + keyword.setKeyword(reader.getElementText()); + } else { + keyword.setNamespace(reader.getAttributeValue(XLINK, "href")); + keyword.setKeyword(reader.getElementText()); + } + json.getKeywords().add(keyword); } } @@ -351,7 +452,7 @@ private static void parseContact(XMLStreamReader reader, JsonIsoMetadata json, S json.getContacts().add(contact); } - private void addService(Path file, JsonIsoMetadata json) { + private void addService(Path file, JsonIsoMetadata json, JsonClientMetadata clientMetadata, JsonTechnicalMetadata technical) { log.info("Adding service from {}", file.toString()); try { var service = new Service(); @@ -367,7 +468,7 @@ private void addService(Path file, JsonIsoMetadata json) { var reader = FACTORY.createXMLStreamReader(Files.newInputStream(file)); nextElement(reader); while (reader.hasNext() && !reader.getLocalName().equals("IsoMetadata") && !reader.getLocalName().equals("IsoMetadataWMTS")) { - extractMetadataFields(reader, service); + extractMetadataFields(reader, service, clientMetadata, technical); } extractIsoFields(reader, service); @@ -409,7 +510,14 @@ private static void extractIsoFields(XMLStreamReader reader, Service service) th service.setUrl(url); } - private static void extractMetadataFields(XMLStreamReader reader, Service service) throws XMLStreamException, ParseException { + private static void extractMetadataFields(XMLStreamReader reader, Service service, JsonClientMetadata client, JsonTechnicalMetadata technical) throws XMLStreamException, ParseException { + client.setLayers(new ArrayList<>()); + if (service.getColumns() == null) { + service.setColumns(new ArrayList<>()); + } + if (technical.getCategories() == null) { + technical.setCategories(new ArrayList<>()); + } switch (reader.getLocalName()) { case "Dienstebeschreibung": var desc = new ServiceDescription( @@ -469,6 +577,103 @@ private static void extractMetadataFields(XMLStreamReader reader, Service servic preview.setContent(reader.getElementText()); service.getPreviews().add(preview); break; + case "Kategorie": + var category = new Category(); + technical.getCategories().add(category); + while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName().equals("Kategorie"))) { + reader.next(); + if (!reader.isStartElement()) { + continue; + } + if (reader.getLocalName().equals("Link")) { + category.setLink(new Link( + reader.getAttributeValue(null, "title"), + reader.getAttributeValue(null, "type"), + reader.getElementText() + )); + } + } + break; + case "SelectColumn": + var columnInfo = new ColumnInfo(); + service.getColumns().add(columnInfo); + while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName().equals("SelectColumn"))) { + reader.next(); + if (!reader.isStartElement()) { + continue; + } + switch (reader.getLocalName()) { + case "ColumnName": + columnInfo.setName(reader.getElementText()); + break; + case "ColumnAlias": + columnInfo.setTitle(reader.getElementText()); + break; + case "ColumnDescription": + columnInfo.setDescription(reader.getElementText()); + break; + case "ColumnType": + String tp = reader.getElementText(); + if (tp.equals("T")) { + tp = "Text"; + } + if (tp.equals("N")) { + tp = "Long"; + } + columnInfo.setType(ColumnType.valueOf(tp)); + break; + case "ColumnFilter": + while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName().equals("ColumnFilter"))) { + reader.next(); + if (!reader.isStartElement()) { + continue; + } + if (reader.getLocalName().equals("FilterType")) { + String value = reader.getElementText().trim(); + if (value.equals("Catalogbox")) { + columnInfo.setFilterType(FilterType.CatalogBox); + } else if (!value.isBlank()) { + columnInfo.setFilterType(FilterType.valueOf(value)); + } + } + } + break; + } + } + break; + case "Kartenebene": + var layer = new Layer(); + client.getLayers().add(layer); + layer.setRelatedTopic(reader.getAttributeValue(null, "mt_klasse")); + layer.setName(reader.getAttributeValue(null, "name")); + while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName().equals("Kartenebene"))) { + reader.next(); + if (!reader.isStartElement()) { + continue; + } + switch (reader.getLocalName()) { + case "Titel": + layer.setTitle(reader.getElementText()); + break; + case "Kurzbeschreibung": + layer.setShortDescription(reader.getElementText()); + break; + case "Style": + layer.setStyleName(reader.getAttributeValue(null, "name")); + layer.setStyleTitle(reader.getAttributeValue(null, "title")); + break; + case "LegendImage": + var image = new LegendImage( + reader.getAttributeValue(null, "format"), + reader.getAttributeValue(null, "url"), + Integer.parseInt(reader.getAttributeValue(null, "width")), + Integer.parseInt(reader.getAttributeValue(null, "height")) + ); + layer.setLegendImage(image); + break; + } + } + break; } nextElement(reader); } diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/ClientMetadata.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/ClientMetadata.java index 67bd97b..3e71c73 100644 --- a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/ClientMetadata.java +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/ClientMetadata.java @@ -2,14 +2,14 @@ import de.terrestris.mde.mde_backend.model.json.JsonClientMetadata; import io.hypersistence.utils.hibernate.type.json.JsonBinaryType; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; import org.hibernate.annotations.Type; -import java.util.List; - @EqualsAndHashCode(callSuper = true) @Entity @Table(name = "client_metadata") @@ -19,6 +19,6 @@ public class ClientMetadata extends BaseMetadata { @Column @Type(JsonBinaryType.class) @ToString.Exclude - private List data; + private JsonClientMetadata data; } diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/IsoMetadata.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/IsoMetadata.java index 462dc4d..fca2f57 100644 --- a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/IsoMetadata.java +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/IsoMetadata.java @@ -2,15 +2,16 @@ import de.terrestris.mde.mde_backend.model.json.JsonIsoMetadata; import io.hypersistence.utils.hibernate.type.json.JsonBinaryType; -import jakarta.persistence.*; +import jakarta.persistence.Cacheable; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; import lombok.*; -import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.DynamicUpdate; import org.hibernate.annotations.Type; -import java.util.List; - @EqualsAndHashCode(callSuper = true) @DynamicUpdate @Entity @@ -27,6 +28,6 @@ public class IsoMetadata extends BaseMetadata { @Column @Type(JsonBinaryType.class) @ToString.Exclude - private List data; + private JsonIsoMetadata data; } diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/TechnicalMetadata.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/TechnicalMetadata.java index 2a24e3a..c0562dc 100644 --- a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/TechnicalMetadata.java +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/TechnicalMetadata.java @@ -10,8 +10,6 @@ import lombok.ToString; import org.hibernate.annotations.Type; -import java.util.List; - @EqualsAndHashCode(callSuper = true) @Entity @Table(name = "technical_metadata") @@ -21,6 +19,6 @@ public class TechnicalMetadata extends BaseMetadata { @Column @Type(JsonBinaryType.class) @ToString.Exclude - private List data; + private JsonTechnicalMetadata data; } diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Citation.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Citation.java new file mode 100644 index 0000000..e3ce366 --- /dev/null +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Citation.java @@ -0,0 +1,28 @@ +package de.terrestris.mde.mde_backend.model.json; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.Instant; + +import static com.fasterxml.jackson.annotation.JsonFormat.Shape.STRING; + +@Data +@JsonDeserialize(as = Citation.class) +@JsonInclude(JsonInclude.Include.NON_NULL) +@NoArgsConstructor(force = true) +@AllArgsConstructor +public class Citation { + + private String title; + + @JsonFormat(shape = STRING) + private Instant date; + + private String url; + +} diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/ColumnInfo.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/ColumnInfo.java index 4c77fe7..51d7a9d 100644 --- a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/ColumnInfo.java +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/ColumnInfo.java @@ -21,13 +21,27 @@ public enum FilterType { EditOrderField } + public enum ColumnType { + BigDecimal, + Date, + Double, + Float, + Geometry, + Integer, + Link, + Long, + Text, + Short, + Timestamp + } + private String name; private String title; private String description; - private String impressum; + private ColumnType type; private boolean listView; diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/DistributionVersion.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/DistributionVersion.java new file mode 100644 index 0000000..d11df4d --- /dev/null +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/DistributionVersion.java @@ -0,0 +1,22 @@ +package de.terrestris.mde.mde_backend.model.json; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@JsonDeserialize(as = DistributionVersion.class) +@JsonInclude(JsonInclude.Include.NON_NULL) +@NoArgsConstructor(force = true) +@AllArgsConstructor +public class DistributionVersion { + + private String name; + + private String version; + + private String specification; + +} diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/JsonClientMetadata.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/JsonClientMetadata.java index 8cbdee3..9031890 100644 --- a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/JsonClientMetadata.java +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/JsonClientMetadata.java @@ -23,6 +23,6 @@ public class JsonClientMetadata { private Extent initialExtent; - private List columns; + private List layers; } 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 60d17fc..7f0ad31 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 @@ -48,6 +48,8 @@ public enum InspireTheme { private InspireTheme inspireTheme; + private List distributionVersions; + private String fileIdentifier; private DataIdentificator dataIdentificator; @@ -102,4 +104,12 @@ public enum InspireTheme { private List contentDescriptions; + private List resourceConstraints; + + private String lineage; + + private Citation citation; + + private boolean valid; + } diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/JsonTechnicalMetadata.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/JsonTechnicalMetadata.java index e2c0f1f..af8624d 100644 --- a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/JsonTechnicalMetadata.java +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/JsonTechnicalMetadata.java @@ -23,4 +23,6 @@ public class JsonTechnicalMetadata { private String deliveredCrs; + private List descriptions; + } diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Layer.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Layer.java index 80c529e..c3b7817 100644 --- a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Layer.java +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Layer.java @@ -13,11 +13,17 @@ @AllArgsConstructor public class Layer { + private String relatedTopic; + + private String name; + private String title; - private String shortDescription; + private String styleName; - private String description; + private String styleTitle; + + private String shortDescription; private LegendImage legendImage; @@ -25,4 +31,6 @@ public class Layer { private double maxScale; + private String datasource; + } diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/LayerInfo.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/LayerInfo.java index 338b636..a0f4edb 100644 --- a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/LayerInfo.java +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/LayerInfo.java @@ -15,4 +15,6 @@ public class LayerInfo { private String accessInfo; + private String workspace; + } diff --git a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Service.java b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Service.java index 80bb4eb..ece456b 100644 --- a/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Service.java +++ b/mde-services/src/main/java/de/terrestris/mde/mde_backend/model/json/Service.java @@ -61,4 +61,6 @@ public enum ServiceType { private List previews; + private List columns; + }