From 52ac2709aa68e55d30c7dc70f69e2446afa52851 Mon Sep 17 00:00:00 2001 From: Matthias Betz Date: Tue, 21 Mar 2023 15:01:36 +0100 Subject: [PATCH] update quality ade to 1.0.0 --- citygml4j-quality-ade/pom.xml | 2 +- .../stuttgart/quality/QualityADEContext.java | 2 +- .../stuttgart/quality/QualityADEModule.java | 4 +- .../SemanticAttributeInvalidErrorAdapter.java | 79 ++ .../SemanticAttributeMissingErrorAdapter.java | 5 - ...manticAttributeWrongValueErrorAdapter.java | 5 - .../adapter/types/ValidationAdapter.java | 10 +- .../adapter/types/ValidationPlanAdapter.java | 7 +- .../types/ValidationResultAdapter.java | 6 +- .../quality/model/enums/ErrorId.java | 2 +- .../quality/model/enums/RequirementId.java | 2 +- .../types/SemanticAttributeInvalidError.java | 49 ++ .../types/SemanticAttributeMissingError.java | 9 - .../SemanticAttributeWrongValueError.java | 9 - .../quality/model/types/Validation.java | 8 +- .../quality/model/types/ValidationPlan.java | 4 +- .../quality/model/types/ValidationResult.java | 8 +- .../model/walker/ValidationErrorVisitor.java | 5 + .../src/main/resources/qualityAde.xsd | 48 +- .../stuttgart/quality/QualityAdeTests.java | 30 +- .../SimpleSolid_Error_QualityADE.gml | 424 ++++++----- public/1.0.0/qualityAde.xsd | 682 ++++++++++++++++++ 22 files changed, 1109 insertions(+), 291 deletions(-) create mode 100644 citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeInvalidErrorAdapter.java create mode 100644 citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeInvalidError.java create mode 100644 public/1.0.0/qualityAde.xsd diff --git a/citygml4j-quality-ade/pom.xml b/citygml4j-quality-ade/pom.xml index 64d7909..6908ae1 100644 --- a/citygml4j-quality-ade/pom.xml +++ b/citygml4j-quality-ade/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.hft.stuttgart citygml4j-quality-ade - 3.1.4 + 3.2.0 UTF-8 diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/QualityADEContext.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/QualityADEContext.java index f7b70ba..ac59d43 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/QualityADEContext.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/QualityADEContext.java @@ -25,7 +25,7 @@ import org.citygml4j.xml.module.ade.ADEModule; public class QualityADEContext implements CityGMLADE { - private final List modules = Collections.singletonList(QualityADEModule.V0_1_4); + private final List modules = Collections.singletonList(QualityADEModule.V1_0_0); @Override public List getADEModules() { diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/QualityADEModule.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/QualityADEModule.java index 58d389b..c76a18c 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/QualityADEModule.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/QualityADEModule.java @@ -22,9 +22,9 @@ import org.citygml4j.xml.module.ade.ADEModule; public class QualityADEModule extends ADEModule { - public static final String NAMESPACE_URI = "https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.4"; + public static final String NAMESPACE_URI = "https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/1.0.0"; - public static final QualityADEModule V0_1_4 = new QualityADEModule(); + public static final QualityADEModule V1_0_0 = new QualityADEModule(); public QualityADEModule() { super(NAMESPACE_URI, "qual", CityGMLVersion.v2_0); diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeInvalidErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeInvalidErrorAdapter.java new file mode 100644 index 0000000..fe13e01 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeInvalidErrorAdapter.java @@ -0,0 +1,79 @@ +/*- + * Copyright 2023 Hochschule für Technik Stuttgart + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package de.hft.stuttgart.quality.adapter.types; + +import javax.xml.namespace.QName; + +import org.xmlobjects.annotation.XMLElement; +import org.xmlobjects.builder.ObjectBuildException; +import org.xmlobjects.serializer.ObjectSerializeException; +import org.xmlobjects.stream.XMLReadException; +import org.xmlobjects.stream.XMLReader; +import org.xmlobjects.stream.XMLWriteException; +import org.xmlobjects.stream.XMLWriter; +import org.xmlobjects.xml.Attributes; +import org.xmlobjects.xml.Element; +import org.xmlobjects.xml.Namespaces; + +import de.hft.stuttgart.quality.QualityADEModule; +import de.hft.stuttgart.quality.model.types.SemanticAttributeInvalidError; + +@XMLElement(name = "SE_ATTRIBUTE_INVALID", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class SemanticAttributeInvalidErrorAdapter extends AbstractSemanticErrorAdapter { + + @Override + public SemanticAttributeInvalidError createObject(QName name, Object parent) throws ObjectBuildException { + return new SemanticAttributeInvalidError(); + } + + @Override + public void buildChildObject(SemanticAttributeInvalidError object, QName name, Attributes attributes, + XMLReader reader) throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "childId": + reader.getTextContent().ifPresent(object::setChildId); + break; + case "attributeName": + reader.getTextContent().ifPresent(object::setAttributeName); + break; + default: + throw new IllegalStateException( + "Cannot handle name " + name + " when building SemanticAttributeInvalidError element"); + } + } + + @Override + public Element createElement(SemanticAttributeInvalidError object, Namespaces namespaces) + throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "SE_ATTRIBUTE_INVALID"); + } + + @Override + public void writeChildElements(SemanticAttributeInvalidError object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + if (object.getChildId() != null) { + writer.writeElement( + Element.of(QualityADEModule.NAMESPACE_URI, "childId").addTextContent(object.getChildId())); + } + if (object.getAttributeName() != null) { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "attributeName") + .addTextContent(object.getAttributeName())); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeMissingErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeMissingErrorAdapter.java index c47bcfc..4763591 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeMissingErrorAdapter.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeMissingErrorAdapter.java @@ -37,9 +37,6 @@ public class SemanticAttributeMissingErrorAdapter extends AbstractSemanticErrorA case "attributeName": reader.getTextContent().ifPresent(object::setAttributeName); break; - case "generic": - reader.getTextContent().ifPresent(s -> object.setGeneric(Boolean.parseBoolean(s))); - break; default: throw new IllegalStateException( "Cannot handle name " + name + " when building SemanticAttributeMissingError element"); @@ -63,7 +60,5 @@ public class SemanticAttributeMissingErrorAdapter extends AbstractSemanticErrorA writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "attributeName") .addTextContent(object.getAttributeName())); } - writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "generic") - .addTextContent(Boolean.toString(object.isGeneric()))); } } diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeWrongValueErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeWrongValueErrorAdapter.java index 923bf5e..60c118f 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeWrongValueErrorAdapter.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeWrongValueErrorAdapter.java @@ -38,9 +38,6 @@ public class SemanticAttributeWrongValueErrorAdapter case "attributeName": reader.getTextContent().ifPresent(object::setAttributeName); break; - case "generic": - reader.getTextContent().ifPresent(s -> object.setGeneric(Boolean.parseBoolean(s))); - break; default: throw new IllegalStateException( "Cannot handle name " + name + " when building SemanticAttributeWrongValueError element"); @@ -65,7 +62,5 @@ public class SemanticAttributeWrongValueErrorAdapter writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "attributeName") .addTextContent(object.getAttributeName())); } - writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "generic") - .addTextContent(Boolean.toString(object.isGeneric()))); } } diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationAdapter.java index bd347f0..3d0f27a 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationAdapter.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationAdapter.java @@ -5,6 +5,7 @@ import javax.xml.namespace.QName; import org.citygml4j.xml.adapter.core.AbstractFeatureAdapter; import org.xmlobjects.annotation.XMLElement; import org.xmlobjects.builder.ObjectBuildException; +import org.xmlobjects.gml.adapter.base.ReferenceAdapter; import org.xmlobjects.serializer.ObjectSerializeException; import org.xmlobjects.stream.XMLReadException; import org.xmlobjects.stream.XMLReader; @@ -16,7 +17,6 @@ import org.xmlobjects.xml.Namespaces; import de.hft.stuttgart.quality.QualityADEModule; import de.hft.stuttgart.quality.adapter.properties.StatisticsPropertyAdapter; -import de.hft.stuttgart.quality.adapter.properties.ValidationPlanPropertyAdapter; import de.hft.stuttgart.quality.model.types.Validation; @XMLElement(name = "Validation", namespaceURI = QualityADEModule.NAMESPACE_URI) @@ -45,8 +45,8 @@ public class ValidationAdapter extends AbstractFeatureAdapter { case "statistics": object.setStatistics(reader.getObjectUsingBuilder(StatisticsPropertyAdapter.class)); break; - case "validationPlan": - object.setValidationPlan(reader.getObjectUsingBuilder(ValidationPlanPropertyAdapter.class)); + case "validationPlanID": + object.setValidationPlan(reader.getObjectUsingBuilder(ReferenceAdapter.class)); break; default: super.buildChildObject(object, name, attributes, reader); @@ -75,8 +75,8 @@ public class ValidationAdapter extends AbstractFeatureAdapter { object.getStatistics(), StatisticsPropertyAdapter.class, namespaces); } if (object.getValidationPlan() != null) { - writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "validationPlan"), - object.getValidationPlan(), ValidationPlanPropertyAdapter.class, namespaces); + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "validationPlanID"), + object.getValidationPlan(), ReferenceAdapter.class, namespaces); } } } diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationPlanAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationPlanAdapter.java index b84f85e..f278aff 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationPlanAdapter.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationPlanAdapter.java @@ -2,11 +2,10 @@ package de.hft.stuttgart.quality.adapter.types; import javax.xml.namespace.QName; +import org.citygml4j.xml.adapter.core.AbstractFeatureAdapter; import org.xmlobjects.annotation.XMLElement; import org.xmlobjects.builder.ObjectBuildException; -import org.xmlobjects.builder.ObjectBuilder; import org.xmlobjects.serializer.ObjectSerializeException; -import org.xmlobjects.serializer.ObjectSerializer; import org.xmlobjects.stream.XMLReadException; import org.xmlobjects.stream.XMLReader; import org.xmlobjects.stream.XMLWriteException; @@ -23,7 +22,7 @@ import de.hft.stuttgart.quality.model.properties.RequirementProperty; import de.hft.stuttgart.quality.model.types.ValidationPlan; @XMLElement(name = "ValidationPlan", namespaceURI = QualityADEModule.NAMESPACE_URI) -public class ValidationPlanAdapter implements ObjectBuilder, ObjectSerializer { +public class ValidationPlanAdapter extends AbstractFeatureAdapter { @Override public ValidationPlan createObject(QName name, Object parent) throws ObjectBuildException { @@ -47,7 +46,7 @@ public class ValidationPlanAdapter implements ObjectBuilder, Obj object.getRequirements().add(reader.getObjectUsingBuilder(RequirementPropertyAdapter.class)); break; default: - throw new IllegalStateException("Cannot handle name " + name + " when building ValidationPlan element"); + super.buildChildObject(object, name, attributes, reader); } } diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationResultAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationResultAdapter.java index 6e65ca9..1904cd8 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationResultAdapter.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationResultAdapter.java @@ -37,8 +37,8 @@ public class ValidationResultAdapter implements ObjectBuilder, return; } switch (name.getLocalPart()) { - case "validationPlanID": - object.setValidationPlanID(reader.getObjectUsingBuilder(ReferenceAdapter.class)); + case "validationID": + object.setValidationID(reader.getObjectUsingBuilder(ReferenceAdapter.class)); break; case "error": object.getErrors().add(reader.getObjectUsingBuilder(AbstractErrorPropertyAdapter.class)); @@ -60,7 +60,7 @@ public class ValidationResultAdapter implements ObjectBuilder, public void writeChildElements(ValidationResult object, Namespaces namespaces, XMLWriter writer) throws ObjectSerializeException, XMLWriteException { if (object.getValidationPlanID() != null) { - writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "validationPlanID"), + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "validationID"), object.getValidationPlanID(), ReferenceAdapter.class, namespaces); } for (AbstractErrorProperty err : object.getErrors()) { diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/enums/ErrorId.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/enums/ErrorId.java index 3154031..d65e76c 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/enums/ErrorId.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/enums/ErrorId.java @@ -22,6 +22,6 @@ public enum ErrorId { GE_P_INTERSECTING_RINGS, GE_P_HOLE_OUTSIDE, GE_P_ORIENTATION_RINGS_SAME, GE_P_INNER_RINGS_NESTED, GE_S_TOO_FEW_POLYGONS, GE_S_NOT_CLOSED, GE_S_NON_MANIFOLD_EDGE, GE_S_POLYGON_WRONG_ORIENTATION, GE_S_ALL_POLYGONS_WRONG_ORIENTATION, GE_S_NON_MANIFOLD_VERTEX, GE_S_SELF_INTERSECTION, - GE_S_MULTIPLE_CONNECTED_COMPONENTS, SE_ATTRIBUTE_WRONG_VALUE, SE_ATTRIBUTE_MISSING + GE_S_MULTIPLE_CONNECTED_COMPONENTS, SE_ATTRIBUTE_WRONG_VALUE, SE_ATTRIBUTE_MISSING, SE_ATTRIBUTE_INVALID } diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/enums/RequirementId.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/enums/RequirementId.java index 19a065b..0564e83 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/enums/RequirementId.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/enums/RequirementId.java @@ -23,6 +23,6 @@ public enum RequirementId { R_GE_P_ORIENTATION_RINGS_SAME, R_GE_P_INNER_RINGS_NESTED, R_GE_S_TOO_FEW_POLYGONS, R_GE_S_NOT_CLOSED, R_GE_S_NON_MANIFOLD_EDGE, R_GE_S_POLYGON_WRONG_ORIENTATION, R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION, R_GE_S_NON_MANIFOLD_VERTEX, R_GE_S_SELF_INTERSECTION, R_GE_S_MULTIPLE_CONNECTED_COMPONENTS, - R_SE_ATTRIBUTES_EXISTING, R_SE_ATTRIBUTES_CORRECT + R_SE_ATTRIBUTES_EXISTING, R_SE_ATTRIBUTES_CORRECT, R_SE_ATTRIBUTES_VALID } diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeInvalidError.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeInvalidError.java new file mode 100644 index 0000000..5f154d3 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeInvalidError.java @@ -0,0 +1,49 @@ +/*- + * Copyright 2023 Hochschule für Technik Stuttgart + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package de.hft.stuttgart.quality.model.types; + +import de.hft.stuttgart.quality.model.walker.ValidationErrorVisitor; + +public class SemanticAttributeInvalidError extends AbstractSemanticError { + + private static final long serialVersionUID = 6528329813293026972L; + + private String childId; + private String attributeName; + + public String getChildId() { + return childId; + } + + public void setChildId(String childId) { + this.childId = childId; + } + + public String getAttributeName() { + return attributeName; + } + + public void setAttributeName(String attributeName) { + this.attributeName = attributeName; + } + + @Override + public void accept(ValidationErrorVisitor visitor) { + super.accept(visitor); + visitor.visit(this); + } + +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeMissingError.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeMissingError.java index 8d613e7..da83a95 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeMissingError.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeMissingError.java @@ -23,7 +23,6 @@ public class SemanticAttributeMissingError extends AbstractSemanticError { private String childId; private String attributeName; - private boolean generic; public String getChildId() { return childId; @@ -41,14 +40,6 @@ public class SemanticAttributeMissingError extends AbstractSemanticError { this.attributeName = attributeName; } - public boolean isGeneric() { - return generic; - } - - public void setGeneric(boolean generic) { - this.generic = generic; - } - @Override public void accept(ValidationErrorVisitor visitor) { super.accept(visitor); diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeWrongValueError.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeWrongValueError.java index f880417..03fb0bf 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeWrongValueError.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SemanticAttributeWrongValueError.java @@ -23,7 +23,6 @@ public class SemanticAttributeWrongValueError extends AbstractSemanticError { private String childId; private String attributeName; - private boolean generic; public String getChildId() { return childId; @@ -41,14 +40,6 @@ public class SemanticAttributeWrongValueError extends AbstractSemanticError { this.attributeName = attributeName; } - public boolean isGeneric() { - return generic; - } - - public void setGeneric(boolean generic) { - this.generic = generic; - } - @Override public void accept(ValidationErrorVisitor visitor) { super.accept(visitor); diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/Validation.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/Validation.java index 2f26c40..57c0213 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/Validation.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/Validation.java @@ -19,9 +19,9 @@ import java.time.ZonedDateTime; import org.citygml4j.core.model.ade.ADEObject; import org.citygml4j.core.model.core.AbstractFeature; +import org.xmlobjects.gml.model.base.Reference; import de.hft.stuttgart.quality.model.properties.StatisticsProperty; -import de.hft.stuttgart.quality.model.properties.ValidationPlanProperty; public class Validation extends AbstractFeature implements ADEObject { @@ -30,7 +30,7 @@ public class Validation extends AbstractFeature implements ADEObject { private ZonedDateTime validationDate; private String validationSoftware; private StatisticsProperty statistics; - private ValidationPlanProperty validationPlan; + private Reference validationPlan; public ZonedDateTime getValidationDate() { return validationDate; @@ -56,11 +56,11 @@ public class Validation extends AbstractFeature implements ADEObject { this.statistics = asChild(statistics); } - public ValidationPlanProperty getValidationPlan() { + public Reference getValidationPlan() { return validationPlan; } - public void setValidationPlan(ValidationPlanProperty validationPlan) { + public void setValidationPlan(Reference validationPlan) { this.validationPlan = asChild(validationPlan); } diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/ValidationPlan.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/ValidationPlan.java index 3310549..c8356f9 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/ValidationPlan.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/ValidationPlan.java @@ -18,14 +18,14 @@ package de.hft.stuttgart.quality.model.types; import java.util.List; import org.citygml4j.core.model.ade.ADEObject; -import org.xmlobjects.gml.model.GMLObject; +import org.citygml4j.core.model.core.AbstractFeature; import org.xmlobjects.model.ChildList; import de.hft.stuttgart.quality.model.properties.FilterProperty; import de.hft.stuttgart.quality.model.properties.GlobalParametersProperty; import de.hft.stuttgart.quality.model.properties.RequirementProperty; -public class ValidationPlan extends GMLObject implements ADEObject { +public class ValidationPlan extends AbstractFeature implements ADEObject { private static final long serialVersionUID = 434443226848485642L; diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/ValidationResult.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/ValidationResult.java index 8f0446c..5f51c03 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/ValidationResult.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/ValidationResult.java @@ -30,16 +30,16 @@ public class ValidationResult extends GMLObject implements ADEObject { private static final long serialVersionUID = 4867627296196445082L; - private Reference validationPlanID; + private Reference validationID; private List errors; private ResultType resultType; public Reference getValidationPlanID() { - return validationPlanID; + return validationID; } - public void setValidationPlanID(Reference validationPlanID) { - this.validationPlanID = asChild(validationPlanID); + public void setValidationID(Reference validationPlanID) { + this.validationID = asChild(validationPlanID); } public List getErrors() { diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/walker/ValidationErrorVisitor.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/walker/ValidationErrorVisitor.java index e125575..a7a9ed7 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/walker/ValidationErrorVisitor.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/walker/ValidationErrorVisitor.java @@ -37,6 +37,7 @@ import de.hft.stuttgart.quality.model.types.PolygonWrongOrientationError; import de.hft.stuttgart.quality.model.types.RingNotClosedError; import de.hft.stuttgart.quality.model.types.RingSelfIntersectionError; import de.hft.stuttgart.quality.model.types.RingTooFewPointsError; +import de.hft.stuttgart.quality.model.types.SemanticAttributeInvalidError; import de.hft.stuttgart.quality.model.types.SemanticAttributeMissingError; import de.hft.stuttgart.quality.model.types.SemanticAttributeWrongValueError; import de.hft.stuttgart.quality.model.types.SolidNotClosedError; @@ -65,6 +66,10 @@ public interface ValidationErrorVisitor { } + default void visit(SemanticAttributeInvalidError err) { + + } + default void visit(AbstractSolidError err) { } diff --git a/citygml4j-quality-ade/src/main/resources/qualityAde.xsd b/citygml4j-quality-ade/src/main/resources/qualityAde.xsd index 0362e46..8dbcb75 100644 --- a/citygml4j-quality-ade/src/main/resources/qualityAde.xsd +++ b/citygml4j-quality-ade/src/main/resources/qualityAde.xsd @@ -1,4 +1,4 @@ - + @@ -117,6 +117,9 @@ + + + @@ -152,6 +155,7 @@ + @@ -541,6 +545,7 @@ + @@ -558,6 +563,22 @@ + + + + + + + + + + + + + + + + @@ -565,7 +586,6 @@ - @@ -582,7 +602,6 @@ - @@ -617,7 +636,7 @@ - + @@ -628,23 +647,28 @@ - + - - - - - + + + + + + + + + - + + - + diff --git a/citygml4j-quality-ade/src/test/java/de/hft/stuttgart/quality/QualityAdeTests.java b/citygml4j-quality-ade/src/test/java/de/hft/stuttgart/quality/QualityAdeTests.java index 51696a9..24c916b 100644 --- a/citygml4j-quality-ade/src/test/java/de/hft/stuttgart/quality/QualityAdeTests.java +++ b/citygml4j-quality-ade/src/test/java/de/hft/stuttgart/quality/QualityAdeTests.java @@ -78,7 +78,6 @@ import de.hft.stuttgart.quality.model.properties.ParameterProperty; import de.hft.stuttgart.quality.model.properties.PolygonIdListProperty; import de.hft.stuttgart.quality.model.properties.RequirementProperty; import de.hft.stuttgart.quality.model.properties.StatisticsProperty; -import de.hft.stuttgart.quality.model.properties.ValidationPlanProperty; import de.hft.stuttgart.quality.model.properties.ValidationResultProperty; import de.hft.stuttgart.quality.model.types.AllPolygonsOrientedWrongError; import de.hft.stuttgart.quality.model.types.Checking; @@ -106,6 +105,7 @@ import de.hft.stuttgart.quality.model.types.Requirement; import de.hft.stuttgart.quality.model.types.RingNotClosedError; import de.hft.stuttgart.quality.model.types.RingSelfIntersectionError; import de.hft.stuttgart.quality.model.types.RingTooFewPointsError; +import de.hft.stuttgart.quality.model.types.SemanticAttributeInvalidError; import de.hft.stuttgart.quality.model.types.SemanticAttributeMissingError; import de.hft.stuttgart.quality.model.types.SemanticAttributeWrongValueError; import de.hft.stuttgart.quality.model.types.SolidNotClosedError; @@ -418,7 +418,6 @@ class QualityAdeTests { SemanticAttributeMissingError err = new SemanticAttributeMissingError(); err.setAttributeName("attribute"); err.setChildId("child"); - err.setGeneric(true); res.getErrors().add(new AbstractErrorProperty(err)); byte[] buf = writeModel(model); @@ -434,12 +433,26 @@ class QualityAdeTests { SemanticAttributeWrongValueError err = new SemanticAttributeWrongValueError(); err.setAttributeName("attribute"); err.setChildId("child"); - err.setGeneric(true); res.getErrors().add(new AbstractErrorProperty(err)); byte[] buf = writeModel(model); assertTrue(validate(new ByteArrayInputStream(buf))); } + + @Test + void testSemanticAttributeInvalidError() throws ADEException, CityGMLContextException, CityGMLWriteException, + SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + SemanticAttributeInvalidError err = new SemanticAttributeInvalidError(); + err.setAttributeName("attribute"); + err.setChildId("child"); + res.getErrors().add(new AbstractErrorProperty(err)); + + byte[] buf = writeModel(model); + assertTrue(validate(new ByteArrayInputStream(buf))); + } @Test void testSolidNotClosedError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, @@ -547,11 +560,12 @@ class QualityAdeTests { private ValidationResult fillCityModel(CityModel model) { Validation v = new Validation(); - v.setId("planId"); + v.setId("validationId"); model.getFeatureMembers().add(new AbstractFeatureProperty(v)); v.setValidationSoftware("testSoftware"); v.setValidationDate(ZonedDateTime.now()); ValidationPlan plan = new ValidationPlan(); + plan.setId("validationPlanId"); Statistics stats = new Statistics(); FeatureStatistics fStats = new FeatureStatistics(); @@ -561,7 +575,7 @@ class QualityAdeTests { v.setStatistics(new StatisticsProperty(stats)); de.hft.stuttgart.quality.model.types.Error err = new de.hft.stuttgart.quality.model.types.Error(); - err.setName(ErrorId.GE_P_HOLE_OUTSIDE); + err.setName(ErrorId.SE_ATTRIBUTE_INVALID); err.setOccurrences(1); stats.getErrors().add(new ErrorProperty(err)); @@ -584,8 +598,10 @@ class QualityAdeTests { GlobalParameters globalParams = new GlobalParameters(); globalParams.getParameters().add(new ParameterProperty(param)); plan.setGlobalParameters(new GlobalParametersProperty(globalParams)); + + model.getFeatureMembers().add(new AbstractFeatureProperty(plan)); - v.setValidationPlan(new ValidationPlanProperty(plan)); + v.setValidationPlan(new Reference(plan)); Building b = new Building(); b.setId("testId"); @@ -596,7 +612,7 @@ class QualityAdeTests { ValidationResult res = new ValidationResult(); props.setValidationResult(new ValidationResultProperty(res)); res.setResultType(ResultType.ERROR); - res.setValidationPlanID(new Reference(v)); + res.setValidationID(new Reference(v)); return res; } } diff --git a/citygml4j-quality-ade/src/test/resources/SimpleSolid_Error_QualityADE.gml b/citygml4j-quality-ade/src/test/resources/SimpleSolid_Error_QualityADE.gml index c62b369..4d47e98 100644 --- a/citygml4j-quality-ade/src/test/resources/SimpleSolid_Error_QualityADE.gml +++ b/citygml4j-quality-ade/src/test/resources/SimpleSolid_Error_QualityADE.gml @@ -1,30 +1,21 @@  - - + - - Building-Unit-House - - - 457841 5439082 111 - 457854 5439093 121 - - - + Building-Unit-House + + + 457841 5439082 111 + 457854 5439093 121 + + - + _Simple_BD.1_PG.6_LR.1 @@ -39,13 +30,13 @@ - - - - - - - + + + + + + + @@ -212,7 +203,7 @@ - + 2002-05-30T09:00:00 CityDoctor2 @@ -262,195 +253,196 @@ - - - - - - - numberOfRoundingPlaces - 8 - - - - - minVertexDistance - m - 0.0001 - - - - - schematronFile - - - - - - - - - - BUILDING - - - - - TRANSPORTATION - - - - - VEGETATION - - - - - BRIDGE - - - - - WATER - - - - - LAND - - - - - - - true - R_GE_R_TOO_FEW_POINTS - - - - - true - R_GE_R_NOT_CLOSED - - - - - true - R_GE_R_CONSECUTIVE_POINTS_SAME - - - - - true - R_GE_R_SELF_INTERSECTION - - - - - true - R_GE_P_NON_PLANAR - - - type - distance - - - - - distanceTolerance - m - 0.01 - - - - - angleTolerance - deg - 1 - - - - - - - true - R_GE_P_INTERIOR_DISCONNECTED - - - - - true - R_GE_P_INTERSECTING_RINGS - - - - - true - R_GE_P_HOLE_OUTSIDE - - - - - true - R_GE_P_ORIENTATION_RINGS_SAME - - - - - true - R_GE_P_INNER_RINGS_NESTED - - - - - true - R_GE_S_TOO_FEW_POLYGONS - - - - - true - R_GE_S_NOT_CLOSED - - - - - true - R_GE_S_NON_MANIFOLD_EDGE - - - - - true - R_GE_S_POLYGON_WRONG_ORIENTATION - - - - - true - R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION - - - - - true - R_GE_S_NON_MANIFOLD_VERTEX - - - - - true - R_GE_S_SELF_INTERSECTION - - - - - true - R_GE_S_MULTIPLE_CONNECTED_COMPONENTS - - - - + - + + + + + + + + numberOfRoundingPlaces + 8 + + + + + minVertexDistance + m + 0.0001 + + + + + schematronFile + + + + + + + + + + BUILDING + + + + + TRANSPORTATION + + + + + VEGETATION + + + + + BRIDGE + + + + + WATER + + + + + LAND + + + + + + + true + R_GE_R_TOO_FEW_POINTS + + + + + true + R_GE_R_NOT_CLOSED + + + + + true + R_GE_R_CONSECUTIVE_POINTS_SAME + + + + + true + R_GE_R_SELF_INTERSECTION + + + + + true + R_GE_P_NON_PLANAR + + + type + distance + + + + + distanceTolerance + m + 0.01 + + + + + angleTolerance + deg + 1 + + + + + + + true + R_GE_P_INTERIOR_DISCONNECTED + + + + + true + R_GE_P_INTERSECTING_RINGS + + + + + true + R_GE_P_HOLE_OUTSIDE + + + + + true + R_GE_P_ORIENTATION_RINGS_SAME + + + + + true + R_GE_P_INNER_RINGS_NESTED + + + + + true + R_GE_S_TOO_FEW_POLYGONS + + + + + true + R_GE_S_NOT_CLOSED + + + + + true + R_GE_S_NON_MANIFOLD_EDGE + + + + + true + R_GE_S_POLYGON_WRONG_ORIENTATION + + + + + true + R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION + + + + + true + R_GE_S_NON_MANIFOLD_VERTEX + + + + + true + R_GE_S_SELF_INTERSECTION + + + + + true + R_GE_S_MULTIPLE_CONNECTED_COMPONENTS + + + + \ No newline at end of file diff --git a/public/1.0.0/qualityAde.xsd b/public/1.0.0/qualityAde.xsd new file mode 100644 index 0000000..8dbcb75 --- /dev/null +++ b/public/1.0.0/qualityAde.xsd @@ -0,0 +1,682 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- GitLab