diff --git a/citygml4j-quality-ade/pom.xml b/citygml4j-quality-ade/pom.xml index 4e268329d6049368020c0fc924d9bb9d07de6e8c..7d9e4b1e1da260128be6b9800d196ef63af7c660 100644 --- a/citygml4j-quality-ade/pom.xml +++ b/citygml4j-quality-ade/pom.xml @@ -4,7 +4,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>de.hft.stuttgart</groupId> <artifactId>citygml4j-quality-ade</artifactId> - <version>0.1.3</version> + <version>3.1.4</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/EdgeAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/EdgeAdapter.java deleted file mode 100644 index 57530d55c89f12d54e53859e0f876af6e9ad4da7..0000000000000000000000000000000000000000 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/EdgeAdapter.java +++ /dev/null @@ -1,69 +0,0 @@ -/*- - * Copyright 2022 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; - -import javax.xml.namespace.QName; - -import org.xmlobjects.builder.ObjectBuildException; -import org.xmlobjects.builder.ObjectBuilder; -import org.xmlobjects.gml.adapter.geometry.DirectPositionAdapter; -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; -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.Edge; - -public class EdgeAdapter implements ObjectBuilder<Edge>, ObjectSerializer<Edge> { - - @Override - public Edge createObject(QName name, Object parent) throws ObjectBuildException { - return new Edge(); - } - - @Override - public void buildChildObject(Edge object, QName name, Attributes attributes, XMLReader reader) - throws ObjectBuildException, XMLReadException { - if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { - return; - } - switch (name.getLocalPart()) { - case "from" -> object.setFrom(reader.getObjectUsingBuilder(DirectPositionAdapter.class)); - case "to" -> object.setTo(reader.getObjectUsingBuilder(DirectPositionAdapter.class)); - default -> throw new IllegalStateException("Cannot handle name " + name + " when building edge element"); - } - } - - @Override - public void writeChildElements(Edge object, Namespaces namespaces, XMLWriter writer) - throws ObjectSerializeException, XMLWriteException { - if (object.getFrom() != null) { - writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "from"), object.getFrom(), - DirectPositionAdapter.class, namespaces); - } - if (object.getTo() != null) { - writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "to"), object.getTo(), - DirectPositionAdapter.class, namespaces); - } - } - -} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/properties/ValidationResultPropertyAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/properties/ValidationResultPropertyAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..4eae3e65d3cab2c8552c259bf6eb6ed1cca16ad6 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/properties/ValidationResultPropertyAdapter.java @@ -0,0 +1,33 @@ +/*- + * Copyright 2022 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.properties; + +import javax.xml.namespace.QName; + +import org.xmlobjects.builder.ObjectBuildException; +import org.xmlobjects.gml.adapter.base.AbstractInlineOrByReferencePropertyAdapter; + +import de.hft.stuttgart.quality.model.properties.ValidationResultProperty; + +public class ValidationResultPropertyAdapter + extends AbstractInlineOrByReferencePropertyAdapter<ValidationResultProperty> { + + @Override + public ValidationResultProperty createObject(QName name, Object parent) throws ObjectBuildException { + return new ValidationResultProperty(); + } + +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/AbstractErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/AbstractErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..ba552871fd5750188529c50984c3848730ca5ce9 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/AbstractErrorAdapter.java @@ -0,0 +1,10 @@ +package de.hft.stuttgart.quality.adapter.types; + +import org.xmlobjects.builder.ObjectBuilder; +import org.xmlobjects.serializer.ObjectSerializer; + +import de.hft.stuttgart.quality.model.types.AbstractError; + +public abstract class AbstractErrorAdapter<T extends AbstractError> implements ObjectBuilder<T>, ObjectSerializer<T> { + +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/AbstractGeometryErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/AbstractGeometryErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..aa33625961584d26239cf494056efea368453df5 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/AbstractGeometryErrorAdapter.java @@ -0,0 +1,7 @@ +package de.hft.stuttgart.quality.adapter.types; + +import de.hft.stuttgart.quality.model.types.AbstractGeometryError; + +public abstract class AbstractGeometryErrorAdapter<T extends AbstractGeometryError> extends AbstractErrorAdapter<T> { + +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/AbstractPolygonErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/AbstractPolygonErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..de1d806dcb2556d7ad677ce9ccd55d4c5cfae3fe --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/AbstractPolygonErrorAdapter.java @@ -0,0 +1,37 @@ +package de.hft.stuttgart.quality.adapter.types; + +import javax.xml.namespace.QName; + +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.AbstractPolygonError; + +public abstract class AbstractPolygonErrorAdapter<T extends AbstractPolygonError> extends AbstractGeometryErrorAdapter<T> { + + @Override + public void buildChildObject(AbstractPolygonError object, QName name, Attributes attributes, XMLReader reader) throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "polygonId" -> reader.getTextContent().ifPresent(object::setPolygonId); + default -> throw new IllegalStateException("Cannot handle name " + name + " when building AbstractPolygonError element"); + } + } + + @Override + public void writeChildElements(AbstractPolygonError object, Namespaces namespaces, XMLWriter writer) throws ObjectSerializeException, XMLWriteException { + if (object.getPolygonId() != null) { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "polygonId").addTextContent(object.getPolygonId())); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/AbstractRingErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/AbstractRingErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..a72c6263206f8a66cb780dd6aa8691dae28cd890 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/AbstractRingErrorAdapter.java @@ -0,0 +1,36 @@ +package de.hft.stuttgart.quality.adapter.types; + +import javax.xml.namespace.QName; + +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.AbstractRingError; + +public abstract class AbstractRingErrorAdapter<T extends AbstractRingError> extends AbstractGeometryErrorAdapter<T> { + + @Override + public void buildChildObject(AbstractRingError object, QName name, Attributes attributes, XMLReader reader) throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "linearRingId" -> reader.getTextContent().ifPresent(object::setLinearRingId); + } + } + + @Override + public void writeChildElements(AbstractRingError object, Namespaces namespaces, XMLWriter writer) throws ObjectSerializeException, XMLWriteException { + if (object.getLinearRingId() != null) { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "linearRingId").addTextContent(object.getLinearRingId())); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/AbstractSemanticErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/AbstractSemanticErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..c429b9788441b89a07dad51ca4a771cd93a0f8b3 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/AbstractSemanticErrorAdapter.java @@ -0,0 +1,7 @@ +package de.hft.stuttgart.quality.adapter.types; + +import de.hft.stuttgart.quality.model.types.AbstractSemanticError; + +public abstract class AbstractSemanticErrorAdapter<T extends AbstractSemanticError> extends AbstractErrorAdapter<T> { + +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/AbstractSolidErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/AbstractSolidErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..e7255e859c2b9c0c5f6b5be4b33505524a53aa7f --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/AbstractSolidErrorAdapter.java @@ -0,0 +1,37 @@ +package de.hft.stuttgart.quality.adapter.types; + +import javax.xml.namespace.QName; + +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.AbstractSolidError; + +public abstract class AbstractSolidErrorAdapter<T extends AbstractSolidError> extends AbstractGeometryErrorAdapter<T> { + + @Override + public void buildChildObject(AbstractSolidError object, QName name, Attributes attributes, XMLReader reader) throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "geometryId" -> reader.getTextContent().ifPresent(object::setGeometryId); + default -> throw new IllegalStateException("Cannot handle name " + name + " when building AbstractSolidError element"); + } + } + + @Override + public void writeChildElements(AbstractSolidError object, Namespaces namespaces, XMLWriter writer) throws ObjectSerializeException, XMLWriteException { + if (object.getGeometryId() != null) { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "geometryId").addTextContent(object.getGeometryId())); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/AllPolygonsOrientedWrongErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/AllPolygonsOrientedWrongErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..496231a7d63b316f3f9264313f0205e78aa9557c --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/AllPolygonsOrientedWrongErrorAdapter.java @@ -0,0 +1,28 @@ +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.xml.Element; +import org.xmlobjects.xml.Namespaces; + +import de.hft.stuttgart.quality.QualityADEModule; +import de.hft.stuttgart.quality.model.types.AllPolygonsOrientedWrongError; + +@XMLElement(name = "GE_S_ALL_POLYGONS_WRONG_ORIENTATION", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class AllPolygonsOrientedWrongErrorAdapter extends AbstractSolidErrorAdapter<AllPolygonsOrientedWrongError> { + + @Override + public AllPolygonsOrientedWrongError createObject(QName name, Object parent) throws ObjectBuildException { + return new AllPolygonsOrientedWrongError(); + } + + @Override + public Element createElement(AllPolygonsOrientedWrongError object, Namespaces namespaces) + throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "GE_S_ALL_POLYGONS_WRONG_ORIENTATION"); + } + +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/CheckingAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/CheckingAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..79261319c1fce1121b21f571bd0eb02016141aca --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/CheckingAdapter.java @@ -0,0 +1,57 @@ +package de.hft.stuttgart.quality.adapter.types; + +import de.hft.stuttgart.quality.model.enums.TopLevelFeatureType; +import de.hft.stuttgart.quality.model.types.Checking; + +import de.hft.stuttgart.quality.QualityADEModule; + +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; +import org.xmlobjects.stream.XMLWriter; +import org.xmlobjects.xml.Attributes; +import org.xmlobjects.xml.Element; +import org.xmlobjects.xml.Namespaces; + +import javax.xml.namespace.QName; + +@XMLElement(name = "Checking", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class CheckingAdapter implements ObjectBuilder<Checking>, ObjectSerializer<Checking> { + + @Override + public Checking createObject(QName name, Object parent) throws ObjectBuildException { + return new Checking(); + } + + @Override + public void buildChildObject(Checking object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "featureType" -> reader.getTextContent() + .ifPresent(s -> object.setFeatureType(TopLevelFeatureType.valueOf(s))); + default -> throw new IllegalStateException("Cannot handle name " + name + " when building Checking element"); + } + } + + @Override + public Element createElement(Checking object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "Checking"); + } + + @Override + public void writeChildElements(Checking object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + if (object.getFeatureType() != null) { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "featureType") + .addTextContent(object.getFeatureType().toString())); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/CityObjectPropertiesAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/CityObjectPropertiesAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..1bf882537a020a4c0a1290a61028b1b12d1a2884 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/CityObjectPropertiesAdapter.java @@ -0,0 +1,47 @@ +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.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; +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.adapter.properties.ValidationResultPropertyAdapter; +import de.hft.stuttgart.quality.model.types.CityObjectProperties; + +@XMLElement(name = "validationResult", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class CityObjectPropertiesAdapter implements ObjectBuilder<CityObjectProperties>, ObjectSerializer<CityObjectProperties> { + + @Override + public CityObjectProperties createObject(QName name, Object parent) throws ObjectBuildException { + return new CityObjectProperties(); + } + + @Override + public void buildChildObject(CityObjectProperties object, QName name, Attributes attributes, XMLReader reader) throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "validationResult" -> object.setValidationResult(reader.getObjectUsingBuilder(ValidationResultPropertyAdapter.class)); + default -> throw new IllegalStateException("Cannot handle name " + name + " when building CityObjectProperties element"); + } + } + + @Override + public void writeChildElements(CityObjectProperties object, Namespaces namespaces, XMLWriter writer) throws ObjectSerializeException, XMLWriteException { + if (object.getValidationResult() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "validationResult"), object.getValidationResult(), ValidationResultPropertyAdapter.class, namespaces); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ComponentListAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ComponentListAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..017314eaafe083159aa860823ae9a6d1b554dac6 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ComponentListAdapter.java @@ -0,0 +1,58 @@ +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.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; +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.adapter.properties.PolygonIdListPropertyAdapter; +import de.hft.stuttgart.quality.model.properties.PolygonIdListProperty; +import de.hft.stuttgart.quality.model.types.ComponentList; + +@XMLElement(name = "ComponentList", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class ComponentListAdapter implements ObjectBuilder<ComponentList>, ObjectSerializer<ComponentList> { + + @Override + public ComponentList createObject(QName name, Object parent) throws ObjectBuildException { + return new ComponentList(); + } + + @Override + public void buildChildObject(ComponentList object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "component" -> object.getComponents() + .add(reader.getObjectUsingBuilder(PolygonIdListPropertyAdapter.class)); + default -> throw new IllegalStateException( + "Cannot handle name " + name + " when building ComponentList element"); + } + } + + @Override + public Element createElement(ComponentList object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "ComponentList"); + } + + @Override + public void writeChildElements(ComponentList object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + for (PolygonIdListProperty listProperty : object.getComponents()) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "component"), listProperty, + PolygonIdListPropertyAdapter.class, namespaces); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ConsecutivePointsSameErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ConsecutivePointsSameErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..36c407a08b9060450d6804324d84b52671e120ea --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ConsecutivePointsSameErrorAdapter.java @@ -0,0 +1,61 @@ +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.gml.adapter.geometry.DirectPositionAdapter; +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.ConsecutivePointsSameError; + +@XMLElement(name = "GE_R_CONSECUTIVE_POINTS_SAME", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class ConsecutivePointsSameErrorAdapter extends AbstractRingErrorAdapter<ConsecutivePointsSameError> { + + @Override + public ConsecutivePointsSameError createObject(QName name, Object parent) throws ObjectBuildException { + return new ConsecutivePointsSameError(); + } + + @Override + public void buildChildObject(ConsecutivePointsSameError object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "vertex1" -> object.setVertex1(reader.getObjectUsingBuilder(DirectPositionAdapter.class)); + case "vertex2" -> object.setVertex2(reader.getObjectUsingBuilder(DirectPositionAdapter.class)); + default -> super.buildChildObject(object, name, attributes, reader); + } + } + + @Override + public Element createElement(ConsecutivePointsSameError object, Namespaces namespaces) + throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "GE_R_CONSECUTIVE_POINTS_SAME"); + } + + @Override + public void writeChildElements(ConsecutivePointsSameError object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + super.writeChildElements(object, namespaces, writer); + + if (object.getVertex1() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "vertex1"), + object.getVertex1(), DirectPositionAdapter.class, namespaces); + } + if (object.getVertex2() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "vertex2"), + object.getVertex2(), DirectPositionAdapter.class, namespaces); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/EdgeAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/EdgeAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..0558c40fdc2d902344c48be1eb56f753b8285c2c --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/EdgeAdapter.java @@ -0,0 +1,56 @@ +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.builder.ObjectBuilder; +import org.xmlobjects.gml.adapter.geometry.DirectPositionAdapter; +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; +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.Edge; + +@XMLElement(name = "Edge", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class EdgeAdapter implements ObjectBuilder<Edge>, ObjectSerializer<Edge> { + + @Override + public Edge createObject(QName name, Object parent) throws ObjectBuildException { + return new Edge(); + } + + @Override + public void buildChildObject(Edge object, QName name, Attributes attributes, XMLReader reader) throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "from" -> object.setFrom(reader.getObjectUsingBuilder(DirectPositionAdapter.class)); + case "to" -> object.setTo(reader.getObjectUsingBuilder(DirectPositionAdapter.class)); + default -> throw new IllegalStateException("Cannot handle name " + name + " when building Edge element"); + } + } + + @Override + public Element createElement(Edge object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "Edge"); + } + + @Override + public void writeChildElements(Edge object, Namespaces namespaces, XMLWriter writer) throws ObjectSerializeException, XMLWriteException { + if (object.getFrom() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "from"), object.getFrom(), DirectPositionAdapter.class, namespaces); + } + if (object.getTo() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "to"), object.getTo(), DirectPositionAdapter.class, namespaces); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/EdgeListAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/EdgeListAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..60e23c8cf595da6cce91f2408b00025fe9f49ef8 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/EdgeListAdapter.java @@ -0,0 +1,55 @@ +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.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; +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.adapter.properties.EdgePropertyAdapter; +import de.hft.stuttgart.quality.model.properties.EdgeProperty; +import de.hft.stuttgart.quality.model.types.EdgeList; + +@XMLElement(name = "EdgeList", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class EdgeListAdapter implements ObjectBuilder<EdgeList>, ObjectSerializer<EdgeList> { + + @Override + public EdgeList createObject(QName name, Object parent) throws ObjectBuildException { + return new EdgeList(); + } + + @Override + public void buildChildObject(EdgeList object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "edge" -> object.getEdges().add(reader.getObjectUsingBuilder(EdgePropertyAdapter.class)); + default -> throw new IllegalStateException("Cannot handle name " + name + " when building EdgeList element"); + } + } + + @Override + public Element createElement(EdgeList object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "EdgeList"); + } + + @Override + public void writeChildElements(EdgeList object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + for (EdgeProperty edgeProp : object.getEdges()) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "edge"), edgeProp, EdgePropertyAdapter.class, namespaces); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..b2e6786aba9b351f2ef1e2dd46f4eb136a223fe5 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ErrorAdapter.java @@ -0,0 +1,51 @@ +package de.hft.stuttgart.quality.adapter.types; + +import de.hft.stuttgart.quality.model.enums.ErrorId; +import de.hft.stuttgart.quality.model.types.Error; + +import de.hft.stuttgart.quality.QualityADEModule; +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; +import org.xmlobjects.stream.XMLWriter; +import org.xmlobjects.xml.Attributes; +import org.xmlobjects.xml.Element; +import org.xmlobjects.xml.Namespaces; + +import javax.xml.namespace.QName; + +public class ErrorAdapter implements ObjectBuilder<Error>, ObjectSerializer<Error> { + + @Override + public Error createObject(QName name, Object parent) throws ObjectBuildException { + return new Error(); + } + + @Override + public void buildChildObject(Error object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "occurrences" -> reader.getTextContent().ifPresent(s -> object.setOccurrences(Integer.parseInt(s))); + case "name" -> reader.getTextContent().ifPresent(s -> object.setName(ErrorId.valueOf(s))); + default -> throw new IllegalStateException("Cannot handle name " + name + " when building Error element"); + } + } + + @Override + public void writeChildElements(Error object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "occurrences") + .addTextContent(Integer.toString(object.getOccurrences()))); + if (object.getName() != null) { + writer.writeElement( + Element.of(QualityADEModule.NAMESPACE_URI, "name").addTextContent(object.getName().toString())); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/FeatureStatisticsAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/FeatureStatisticsAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..2041159f82c563946c2324691b1077313f42db7a --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/FeatureStatisticsAdapter.java @@ -0,0 +1,57 @@ +package de.hft.stuttgart.quality.adapter.types; + +import de.hft.stuttgart.quality.model.types.FeatureStatistics; + +import de.hft.stuttgart.quality.QualityADEModule; + +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; +import org.xmlobjects.stream.XMLWriter; +import org.xmlobjects.xml.Attributes; +import org.xmlobjects.xml.Element; +import org.xmlobjects.xml.Namespaces; + +import javax.xml.namespace.QName; + +@XMLElement(name = "FeatureStatistics", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class FeatureStatisticsAdapter implements ObjectBuilder<FeatureStatistics>, ObjectSerializer<FeatureStatistics> { + + @Override + public FeatureStatistics createObject(QName name, Object parent) throws ObjectBuildException { + return new FeatureStatistics(); + } + + @Override + public void buildChildObject(FeatureStatistics object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "numChecked" -> reader.getTextContent().ifPresent(s -> object.setNumChecked(Integer.parseInt(s))); + case "numErrors" -> reader.getTextContent().ifPresent(s -> object.setNumErrors(Integer.parseInt(s))); + default -> throw new IllegalStateException( + "Cannot handle name " + name + " when building FeatureStatistics element"); + } + } + + @Override + public Element createElement(FeatureStatistics object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "FeatureStatistics"); + } + + @Override + public void writeChildElements(FeatureStatistics object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "numChecked") + .addTextContent(Integer.toString(object.getNumChecked()))); + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "numErrors") + .addTextContent(Integer.toString(object.getNumErrors()))); + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/FilterAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/FilterAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..dd38819c81d6e7d220f4c773b644a81f69661f7c --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/FilterAdapter.java @@ -0,0 +1,56 @@ +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.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; +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.adapter.properties.CheckingPropertyAdapter; +import de.hft.stuttgart.quality.model.properties.CheckingProperty; +import de.hft.stuttgart.quality.model.types.Filter; + +@XMLElement(name = "Filter", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class FilterAdapter implements ObjectBuilder<Filter>, ObjectSerializer<Filter> { + + @Override + public Filter createObject(QName name, Object parent) throws ObjectBuildException { + return new Filter(); + } + + @Override + public void buildChildObject(Filter object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "checking" -> object.getChecking().add(reader.getObjectUsingBuilder(CheckingPropertyAdapter.class)); + default -> throw new IllegalStateException("Cannot handle name " + name + " when building Filter element"); + } + } + + @Override + public Element createElement(Filter object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "Filter"); + } + + @Override + public void writeChildElements(Filter object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + for (CheckingProperty checkProp : object.getChecking()) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "checking"), checkProp, + CheckingPropertyAdapter.class, namespaces); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/GlobalParametersAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/GlobalParametersAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..2eb7fe3fb1cf14f7a55b9db7631ba6d2072aaf6f --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/GlobalParametersAdapter.java @@ -0,0 +1,57 @@ +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.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; +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.adapter.properties.ParameterPropertyAdapter; +import de.hft.stuttgart.quality.model.properties.ParameterProperty; +import de.hft.stuttgart.quality.model.types.GlobalParameters; + +@XMLElement(name = "GlobalParameters", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class GlobalParametersAdapter implements ObjectBuilder<GlobalParameters>, ObjectSerializer<GlobalParameters> { + + @Override + public GlobalParameters createObject(QName name, Object parent) throws ObjectBuildException { + return new GlobalParameters(); + } + + @Override + public void buildChildObject(GlobalParameters object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "parameter" -> object.getParameters().add(reader.getObjectUsingBuilder(ParameterPropertyAdapter.class)); + default -> throw new IllegalStateException( + "Cannot handle name " + name + " when building GlobalParameters element"); + } + } + + @Override + public Element createElement(GlobalParameters object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "GlobalParameters"); + } + + @Override + public void writeChildElements(GlobalParameters object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + for (ParameterProperty gpp : object.getParameters()) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "parameter"), gpp, + ParameterPropertyAdapter.class, namespaces); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/HoleOutsideErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/HoleOutsideErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..03cc18f2bb32224ef50ac05665348a6c64ea9543 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/HoleOutsideErrorAdapter.java @@ -0,0 +1,54 @@ +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.HoleOutsideError; + +@XMLElement(name = "GE_P_HOLE_OUTSIDE", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class HoleOutsideErrorAdapter extends AbstractPolygonErrorAdapter<HoleOutsideError> { + + @Override + public HoleOutsideError createObject(QName name, Object parent) throws ObjectBuildException { + return new HoleOutsideError(); + } + + @Override + public void buildChildObject(HoleOutsideError object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "linearRingId" -> reader.getTextContent().ifPresent(object::setLinearRingId); + default -> super.buildChildObject(object, name, attributes, reader); + } + } + + @Override + public Element createElement(HoleOutsideError object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "GE_P_HOLE_OUTSIDE"); + } + + @Override + public void writeChildElements(HoleOutsideError object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + super.writeChildElements(object, namespaces, writer); + + if (object.getLinearRingId() != null) { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "linearRingId") + .addTextContent(object.getLinearRingId())); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/InnerRingsNestedErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/InnerRingsNestedErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..5553025d9943fd8433ae575c5ebd4f644bd76374 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/InnerRingsNestedErrorAdapter.java @@ -0,0 +1,58 @@ +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.InnerRingsNestedError; + +@XMLElement(name = "GE_P_INNER_RINGS_NESTED", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class InnerRingsNestedErrorAdapter extends AbstractPolygonErrorAdapter<InnerRingsNestedError> { + + @Override + public InnerRingsNestedError createObject(QName name, Object parent) throws ObjectBuildException { + return new InnerRingsNestedError(); + } + + @Override + public void buildChildObject(InnerRingsNestedError object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "linearRingId1" -> reader.getTextContent().ifPresent(object::setLinearRingId1); + case "linearRingId2" -> reader.getTextContent().ifPresent(object::setLinearRingId2); + default -> super.buildChildObject(object, name, attributes, reader); + } + } + + @Override + public Element createElement(InnerRingsNestedError object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "GE_P_INNER_RINGS_NESTED"); + } + + @Override + public void writeChildElements(InnerRingsNestedError object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + super.writeChildElements(object, namespaces, writer); + if (object.getLinearRingId1() != null) { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "linearRingId1") + .addTextContent(object.getLinearRingId1())); + } + if (object.getLinearRingId2() != null) { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "linearRingId2") + .addTextContent(object.getLinearRingId2())); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/InteriorDisconnectedErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/InteriorDisconnectedErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..c530f04c5eaa5b519b4c45cbc9a42c6326b19f6f --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/InteriorDisconnectedErrorAdapter.java @@ -0,0 +1,28 @@ +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.xml.Element; +import org.xmlobjects.xml.Namespaces; + +import de.hft.stuttgart.quality.QualityADEModule; +import de.hft.stuttgart.quality.model.types.InteriorDisconnectedError; + +@XMLElement(name = "GE_P_INTERIOR_DISCONNECTED", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class InteriorDisconnectedErrorAdapter extends AbstractPolygonErrorAdapter<InteriorDisconnectedError> { + + @Override + public InteriorDisconnectedError createObject(QName name, Object parent) throws ObjectBuildException { + return new InteriorDisconnectedError(); + } + + @Override + public Element createElement(InteriorDisconnectedError object, Namespaces namespaces) + throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "GE_P_INTERIOR_DISCONNECTED"); + } + +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/IntersectingRingsErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/IntersectingRingsErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..e99c910a9648a989511ec37d6c20e087a866e2b5 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/IntersectingRingsErrorAdapter.java @@ -0,0 +1,59 @@ +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.IntersectingRingsError; + +@XMLElement(name = "GE_P_INTERSECTING_RINGS", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class IntersectingRingsErrorAdapter extends AbstractPolygonErrorAdapter<IntersectingRingsError> { + + @Override + public IntersectingRingsError createObject(QName name, Object parent) throws ObjectBuildException { + return new IntersectingRingsError(); + } + + @Override + public void buildChildObject(IntersectingRingsError object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "linearRingId1" -> reader.getTextContent().ifPresent(object::setLinearRingId1); + case "linearRingId2" -> reader.getTextContent().ifPresent(object::setLinearRingId2); + default -> super.buildChildObject(object, name, attributes, reader); + } + } + + @Override + public Element createElement(IntersectingRingsError object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "GE_P_INTERSECTING_RINGS"); + } + + @Override + public void writeChildElements(IntersectingRingsError object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + super.writeChildElements(object, namespaces, writer); + + if (object.getLinearRingId1() != null) { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "linearRingId1") + .addTextContent(object.getLinearRingId1())); + } + if (object.getLinearRingId2() != null) { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "linearRingId2") + .addTextContent(object.getLinearRingId2())); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/MultipleComponentsErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/MultipleComponentsErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..b5baafb9457c1aa55cb506e253cee69bd1d4a51e --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/MultipleComponentsErrorAdapter.java @@ -0,0 +1,56 @@ +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.adapter.properties.ComponentListPropertyAdapter; +import de.hft.stuttgart.quality.model.properties.ComponentListProperty; +import de.hft.stuttgart.quality.model.types.MultipleComponentsError; + +@XMLElement(name = "GE_S_MULTIPLE_CONNECTED_COMPONENTS", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class MultipleComponentsErrorAdapter extends AbstractSolidErrorAdapter<MultipleComponentsError> { + + @Override + public MultipleComponentsError createObject(QName name, Object parent) throws ObjectBuildException { + return new MultipleComponentsError(); + } + + @Override + public void buildChildObject(MultipleComponentsError object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "components" -> object.getComponents().add(reader.getObjectUsingBuilder(ComponentListPropertyAdapter.class)); + default -> super.buildChildObject(object, name, attributes, reader); + } + } + + @Override + public Element createElement(MultipleComponentsError object, Namespaces namespaces) + throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "GE_S_MULTIPLE_CONNECTED_COMPONENTS"); + } + + @Override + public void writeChildElements(MultipleComponentsError object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + super.writeChildElements(object, namespaces, writer); + for (ComponentListProperty clp : object.getComponents()) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "components"), clp, + ComponentListPropertyAdapter.class, namespaces); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/NonManifoldEdgeErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/NonManifoldEdgeErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..3ed6e7b5c74c30b493877e2b48a514deef645602 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/NonManifoldEdgeErrorAdapter.java @@ -0,0 +1,54 @@ +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.adapter.properties.EdgeListPropertyAdapter; +import de.hft.stuttgart.quality.model.types.NonManifoldEdgeError; + +@XMLElement(name = "GE_S_NON_MANIFOLD_EDGE", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class NonManifoldEdgeErrorAdapter extends AbstractSolidErrorAdapter<NonManifoldEdgeError> { + + @Override + public NonManifoldEdgeError createObject(QName name, Object parent) throws ObjectBuildException { + return new NonManifoldEdgeError(); + } + + @Override + public void buildChildObject(NonManifoldEdgeError object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "edges" -> object.setEdges(reader.getObjectUsingBuilder(EdgeListPropertyAdapter.class)); + default -> super.buildChildObject(object, name, attributes, reader); + } + } + + @Override + public Element createElement(NonManifoldEdgeError object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "GE_S_NON_MANIFOLD_EDGE"); + } + + @Override + public void writeChildElements(NonManifoldEdgeError object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + super.writeChildElements(object, namespaces, writer); + if (object.getEdges() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "edges"), object.getEdges(), + EdgeListPropertyAdapter.class, namespaces); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/NonManifoldVertexErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/NonManifoldVertexErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..79dfb5a7ed88959c068b115878ca9be65084ae2b --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/NonManifoldVertexErrorAdapter.java @@ -0,0 +1,51 @@ +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.gml.adapter.geometry.DirectPositionAdapter; +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.NonManifoldVertexError; + +@XMLElement(name = "GE_S_NON_MANIFOLD_VERTEX", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class NonManifoldVertexErrorAdapter extends AbstractSolidErrorAdapter<NonManifoldVertexError> { + + @Override + public NonManifoldVertexError createObject(QName name, Object parent) throws ObjectBuildException { + return new NonManifoldVertexError(); + } + + @Override + public void buildChildObject(NonManifoldVertexError object, QName name, Attributes attributes, XMLReader reader) throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "vertex" -> object.setVertex(reader.getObjectUsingBuilder(DirectPositionAdapter.class)); + default -> super.buildChildObject(object, name, attributes, reader); + } + } + + @Override + public Element createElement(NonManifoldVertexError object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "GE_S_NON_MANIFOLD_VERTEX"); + } + + @Override + public void writeChildElements(NonManifoldVertexError object, Namespaces namespaces, XMLWriter writer) throws ObjectSerializeException, XMLWriteException { + super.writeChildElements(object, namespaces, writer); + if (object.getVertex() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "vertex"), object.getVertex(), DirectPositionAdapter.class, namespaces); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/OrientationRingsSameErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/OrientationRingsSameErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..ad8263c97d6c5bd1b93c5138e6bd8cfb37119107 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/OrientationRingsSameErrorAdapter.java @@ -0,0 +1,54 @@ +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.OrientationRingsSameError; + +@XMLElement(name = "GE_P_ORIENTATION_RINGS_SAME", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class OrientationRingsSameErrorAdapter extends AbstractPolygonErrorAdapter<OrientationRingsSameError> { + + @Override + public OrientationRingsSameError createObject(QName name, Object parent) throws ObjectBuildException { + return new OrientationRingsSameError(); + } + + @Override + public void buildChildObject(OrientationRingsSameError object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "linearRingId" -> reader.getTextContent().ifPresent(object::setLinearRing); + default -> super.buildChildObject(object, name, attributes, reader); + } + } + + @Override + public Element createElement(OrientationRingsSameError object, Namespaces namespaces) + throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "GE_P_ORIENTATION_RINGS_SAME"); + } + + @Override + public void writeChildElements(OrientationRingsSameError object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + super.writeChildElements(object, namespaces, writer); + if (object.getLinearRing() != null) { + writer.writeElement( + Element.of(QualityADEModule.NAMESPACE_URI, "linearRingId").addTextContent(object.getLinearRing())); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ParameterAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ParameterAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..3f3123192c6e3c6e43ec33e86ee4cd27718915c2 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ParameterAdapter.java @@ -0,0 +1,60 @@ +package de.hft.stuttgart.quality.adapter.types; + +import de.hft.stuttgart.quality.model.types.Parameter; + +import de.hft.stuttgart.quality.QualityADEModule; + +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; +import org.xmlobjects.stream.XMLWriter; +import org.xmlobjects.xml.Attributes; +import org.xmlobjects.xml.Element; +import org.xmlobjects.xml.Namespaces; + +import javax.xml.namespace.QName; + +@XMLElement(name = "Parameter", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class ParameterAdapter implements ObjectBuilder<Parameter>, ObjectSerializer<Parameter> { + + @Override + public Parameter createObject(QName name, Object parent) throws ObjectBuildException { + return new Parameter(); + } + + @Override + public void buildChildObject(Parameter object, QName name, Attributes attributes, XMLReader reader) throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "name" -> reader.getTextContent().ifPresent(object::setName); + case "uom" -> reader.getTextContent().ifPresent(object::setUom); + case "value" -> reader.getTextContent().ifPresent(object::setValue); + default -> throw new IllegalStateException("Cannot handle name " + name + " when building Parameter element"); + } + } + + @Override + public Element createElement(Parameter object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "Parameter"); + } + + @Override + public void writeChildElements(Parameter object, Namespaces namespaces, XMLWriter writer) throws ObjectSerializeException, XMLWriteException { + if (object.getName() != null) { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "name").addTextContent(object.getName())); + } + if (object.getUom() != null) { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "uom").addTextContent(object.getUom())); + } + if (object.getValue() != null) { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "value").addTextContent(object.getValue())); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/PlanarDistancePlaneErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/PlanarDistancePlaneErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..acbd568db6849fe48249b88b1854c1bdcac410f2 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/PlanarDistancePlaneErrorAdapter.java @@ -0,0 +1,62 @@ +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.gml.adapter.geometry.DirectPositionAdapter; +import org.xmlobjects.gml.adapter.measures.LengthAdapter; +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.PlanarDistancePlaneError; + +@XMLElement(name = "GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class PlanarDistancePlaneErrorAdapter extends AbstractPolygonErrorAdapter<PlanarDistancePlaneError> { + + @Override + public PlanarDistancePlaneError createObject(QName name, Object parent) throws ObjectBuildException { + return new PlanarDistancePlaneError(); + } + + @Override + public void buildChildObject(PlanarDistancePlaneError object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "vertex" -> object.setVertex(reader.getObjectUsingBuilder(DirectPositionAdapter.class)); + case "distance" -> object.setDistance(reader.getObjectUsingBuilder(LengthAdapter.class)); + default -> super.buildChildObject(object, name, attributes, reader); + } + } + + @Override + public Element createElement(PlanarDistancePlaneError object, Namespaces namespaces) + throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE"); + } + + @Override + public void writeChildElements(PlanarDistancePlaneError object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + super.writeChildElements(object, namespaces, writer); + if (object.getDistance() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "distance"), + object.getDistance(), LengthAdapter.class, namespaces); + } + if (object.getVertex() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "vertex"), object.getVertex(), + DirectPositionAdapter.class, namespaces); + } + + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/PlanarNormalsDeviationErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/PlanarNormalsDeviationErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..647f331d157149ffdb9aeaa39119c40e59d2dfb7 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/PlanarNormalsDeviationErrorAdapter.java @@ -0,0 +1,55 @@ +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.gml.adapter.measures.AngleAdapter; +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.PlanarNormalsDeviationError; + +@XMLElement(name = "GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class PlanarNormalsDeviationErrorAdapter extends AbstractPolygonErrorAdapter<PlanarNormalsDeviationError> { + + @Override + public PlanarNormalsDeviationError createObject(QName name, Object parent) throws ObjectBuildException { + return new PlanarNormalsDeviationError(); + } + + @Override + public void buildChildObject(PlanarNormalsDeviationError object, QName name, Attributes attributes, + XMLReader reader) throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "deviation" -> object.setDeviation(reader.getObjectUsingBuilder(AngleAdapter.class)); + default -> super.buildChildObject(object, name, attributes, reader); + } + } + + @Override + public Element createElement(PlanarNormalsDeviationError object, Namespaces namespaces) + throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION"); + } + + @Override + public void writeChildElements(PlanarNormalsDeviationError object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + super.writeChildElements(object, namespaces, writer); + if (object.getDeviation() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "deviation"), + object.getDeviation(), AngleAdapter.class, namespaces); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/PolygonIdListAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/PolygonIdListAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..e481d709997a4ada329accf2ea555f7614200fd9 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/PolygonIdListAdapter.java @@ -0,0 +1,55 @@ +package de.hft.stuttgart.quality.adapter.types; + +import de.hft.stuttgart.quality.model.types.PolygonIdList; + +import de.hft.stuttgart.quality.QualityADEModule; + +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; +import org.xmlobjects.stream.XMLWriter; +import org.xmlobjects.xml.Attributes; +import org.xmlobjects.xml.Element; +import org.xmlobjects.xml.Namespaces; + +import javax.xml.namespace.QName; + +@XMLElement(name = "PolygonIdList", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class PolygonIdListAdapter implements ObjectBuilder<PolygonIdList>, ObjectSerializer<PolygonIdList> { + + @Override + public PolygonIdList createObject(QName name, Object parent) throws ObjectBuildException { + return new PolygonIdList(); + } + + @Override + public void buildChildObject(PolygonIdList object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "polygonId" -> object.getPolygonIds().add(reader.getTextContent().get()); + default -> throw new IllegalStateException( + "Cannot handle name " + name + " when building PolygonIdList element"); + } + } + + @Override + public Element createElement(PolygonIdList object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "PolygonIdList"); + } + + @Override + public void writeChildElements(PolygonIdList object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + for (String polygonId : object.getPolygonIds()) { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "polygonId").addTextContent(polygonId)); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/PolygonWrongOrientationErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/PolygonWrongOrientationErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..1bf61a211f6829023e4330661cfc35358a6aeeed --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/PolygonWrongOrientationErrorAdapter.java @@ -0,0 +1,55 @@ +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.adapter.properties.EdgeListPropertyAdapter; +import de.hft.stuttgart.quality.model.types.PolygonWrongOrientationError; + +@XMLElement(name = "GE_S_POLYGON_WRONG_ORIENTATION", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class PolygonWrongOrientationErrorAdapter extends AbstractSolidErrorAdapter<PolygonWrongOrientationError> { + + @Override + public PolygonWrongOrientationError createObject(QName name, Object parent) throws ObjectBuildException { + return new PolygonWrongOrientationError(); + } + + @Override + public void buildChildObject(PolygonWrongOrientationError object, QName name, Attributes attributes, + XMLReader reader) throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "edges" -> object.setEdges(reader.getObjectUsingBuilder(EdgeListPropertyAdapter.class)); + default -> super.buildChildObject(object, name, attributes, reader); + } + } + + @Override + public Element createElement(PolygonWrongOrientationError object, Namespaces namespaces) + throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "GE_S_POLYGON_WRONG_ORIENTATION"); + } + + @Override + public void writeChildElements(PolygonWrongOrientationError object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + super.writeChildElements(object, namespaces, writer); + if (object.getEdges() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "edges"), object.getEdges(), + EdgeListPropertyAdapter.class, namespaces); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/RequirementAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/RequirementAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..4d28b45f3d906e913593ebcb1d8db26d62981b0c --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/RequirementAdapter.java @@ -0,0 +1,66 @@ +package de.hft.stuttgart.quality.adapter.types; + +import de.hft.stuttgart.quality.model.enums.RequirementId; +import de.hft.stuttgart.quality.model.properties.ParameterProperty; +import de.hft.stuttgart.quality.model.types.Requirement; + +import de.hft.stuttgart.quality.QualityADEModule; +import de.hft.stuttgart.quality.adapter.properties.ParameterPropertyAdapter; + +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; +import org.xmlobjects.stream.XMLWriter; +import org.xmlobjects.xml.Attributes; +import org.xmlobjects.xml.Element; +import org.xmlobjects.xml.Namespaces; + +import javax.xml.namespace.QName; + +@XMLElement(name = "Requirement", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class RequirementAdapter implements ObjectBuilder<Requirement>, ObjectSerializer<Requirement> { + + @Override + public Requirement createObject(QName name, Object parent) throws ObjectBuildException { + return new Requirement(); + } + + @Override + public void buildChildObject(Requirement object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "enabled" -> reader.getTextContent().ifPresent(s -> object.setEnabled(Boolean.parseBoolean(s))); + case "requirementType" -> object.setRequirementType(RequirementId.valueOf(reader.getTextContent().get())); + case "parameter" -> object.getParameters().add(reader.getObjectUsingBuilder(ParameterPropertyAdapter.class)); + default -> throw new IllegalStateException("Cannot handle name " + name + " when building Requirement element"); + } + } + + @Override + public Element createElement(Requirement object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "Requirement"); + } + + @Override + public void writeChildElements(Requirement object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "enabled") + .addTextContent(Boolean.toString(object.isEnabled()))); + if (object.getRequirementType() != null) { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "requirementType") + .addTextContent(object.getRequirementType().toString())); + } + for (ParameterProperty params : object.getParameters()) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "parameter"), params, + ParameterPropertyAdapter.class, namespaces); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/RingNotClosedErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/RingNotClosedErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..a34143eb4c59176b0c3f4e95819eef2c1f81637b --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/RingNotClosedErrorAdapter.java @@ -0,0 +1,26 @@ +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.xml.Element; +import org.xmlobjects.xml.Namespaces; + +import de.hft.stuttgart.quality.QualityADEModule; +import de.hft.stuttgart.quality.model.types.RingNotClosedError; + +@XMLElement(name = "GE_R_NOT_CLOSED", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class RingNotClosedErrorAdapter extends AbstractRingErrorAdapter<RingNotClosedError> { + + @Override + public RingNotClosedError createObject(QName name, Object parent) throws ObjectBuildException { + return new RingNotClosedError(); + } + + @Override + public Element createElement(RingNotClosedError object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "GE_R_NOT_CLOSED"); + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/RingSelfIntersectionErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/RingSelfIntersectionErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..0c6121819b9cd491caaad4fb5854d3d6307ff251 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/RingSelfIntersectionErrorAdapter.java @@ -0,0 +1,77 @@ +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.gml.adapter.geometry.DirectPositionAdapter; +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.adapter.properties.EdgePropertyAdapter; +import de.hft.stuttgart.quality.model.enums.RingSelfIntType; +import de.hft.stuttgart.quality.model.types.RingSelfIntersectionError; + +@XMLElement(name = "GE_R_SELF_INTERSECTION", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class RingSelfIntersectionErrorAdapter extends AbstractRingErrorAdapter<RingSelfIntersectionError> { + + @Override + public RingSelfIntersectionError createObject(QName name, Object parent) throws ObjectBuildException { + return new RingSelfIntersectionError(); + } + + @Override + public void buildChildObject(RingSelfIntersectionError object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "type" -> reader.getTextContent().ifPresent(s -> object.setType(RingSelfIntType.valueOf(s))); + case "edge1" -> object.setEdge1(reader.getObjectUsingBuilder(EdgePropertyAdapter.class)); + case "edge2" -> object.setEdge2(reader.getObjectUsingBuilder(EdgePropertyAdapter.class)); + case "vertex1" -> object.setVertex1(reader.getObjectUsingBuilder(DirectPositionAdapter.class)); + case "vertex2" -> object.setVertex2(reader.getObjectUsingBuilder(DirectPositionAdapter.class)); + default -> super.buildChildObject(object, name, attributes, reader); + } + } + + @Override + public Element createElement(RingSelfIntersectionError object, Namespaces namespaces) + throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "GE_R_SELF_INTERSECTION"); + } + + @Override + public void writeChildElements(RingSelfIntersectionError object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + super.writeChildElements(object, namespaces, writer); + if (object.getType() != null) { + writer.writeElement( + Element.of(QualityADEModule.NAMESPACE_URI, "type").addTextContent(object.getType().toString())); + } + if (object.getEdge1() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "edge1"), object.getEdge1(), + EdgePropertyAdapter.class, namespaces); + } + if (object.getEdge2() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "edge2"), object.getEdge2(), + EdgePropertyAdapter.class, namespaces); + } + if (object.getVertex1() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "vertex1"), + object.getVertex1(), DirectPositionAdapter.class, namespaces); + } + if (object.getVertex2() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "vertex2"), + object.getVertex2(), DirectPositionAdapter.class, namespaces); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/RingTooFewPointsErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/RingTooFewPointsErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..a325d9d5e060485f2c749afe60de3cd50656af46 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/RingTooFewPointsErrorAdapter.java @@ -0,0 +1,27 @@ +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.xml.Element; +import org.xmlobjects.xml.Namespaces; + +import de.hft.stuttgart.quality.QualityADEModule; +import de.hft.stuttgart.quality.model.types.RingTooFewPointsError; + +@XMLElement(name = "GE_R_TOO_FEW_POINTS", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class RingTooFewPointsErrorAdapter extends AbstractRingErrorAdapter<RingTooFewPointsError> { + + @Override + public RingTooFewPointsError createObject(QName name, Object parent) throws ObjectBuildException { + return new RingTooFewPointsError(); + } + + @Override + public Element createElement(RingTooFewPointsError object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "GE_R_TOO_FEW_POINTS"); + } + +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..9694a09772337d8a2804a7473a14cc48141985ac --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeMissingErrorAdapter.java @@ -0,0 +1,62 @@ +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.SemanticAttributeMissingError; + +@XMLElement(name = "SE_ATTRIBUTE_MISSING", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class SemanticAttributeMissingErrorAdapter extends AbstractSemanticErrorAdapter<SemanticAttributeMissingError> { + + @Override + public SemanticAttributeMissingError createObject(QName name, Object parent) throws ObjectBuildException { + return new SemanticAttributeMissingError(); + } + + @Override + public void buildChildObject(SemanticAttributeMissingError 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); + case "attributeName" -> reader.getTextContent().ifPresent(object::setAttributeName); + case "generic" -> reader.getTextContent().ifPresent(s -> object.setGeneric(Boolean.parseBoolean(s))); + default -> throw new IllegalStateException( + "Cannot handle name " + name + " when building SemanticAttributeMissingError element"); + } + } + + @Override + public Element createElement(SemanticAttributeMissingError object, Namespaces namespaces) + throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "SE_ATTRIBUTE_MISSING"); + } + + @Override + public void writeChildElements(SemanticAttributeMissingError 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())); + } + 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 new file mode 100644 index 0000000000000000000000000000000000000000..6ccbb2b20f6825073bc61f03fd44b70894c116ae --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SemanticAttributeWrongValueErrorAdapter.java @@ -0,0 +1,64 @@ +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.SemanticAttributeWrongValueError; + +@XMLElement(name = "SE_ATTRIBUTE_WRONG_VALUE", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class SemanticAttributeWrongValueErrorAdapter + extends AbstractSemanticErrorAdapter<SemanticAttributeWrongValueError> { + + @Override + public SemanticAttributeWrongValueError createObject(QName name, Object parent) throws ObjectBuildException { + return new SemanticAttributeWrongValueError(); + } + + @Override + public void buildChildObject(SemanticAttributeWrongValueError 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); + case "attributeName" -> reader.getTextContent().ifPresent(object::setAttributeName); + case "generic" -> reader.getTextContent().ifPresent(s -> object.setGeneric(Boolean.parseBoolean(s))); + default -> throw new IllegalStateException( + "Cannot handle name " + name + " when building SemanticAttributeWrongValueError element"); + } + } + + @Override + public Element createElement(SemanticAttributeWrongValueError object, Namespaces namespaces) + throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "SE_ATTRIBUTE_WRONG_VALUE"); + } + + @Override + public void writeChildElements(SemanticAttributeWrongValueError object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + super.writeChildElements(object, namespaces, writer); + 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())); + } + 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/SolidNotClosedErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SolidNotClosedErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..7f03206e60e19a2ed98eab173fde99117f7a5564 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SolidNotClosedErrorAdapter.java @@ -0,0 +1,54 @@ +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.adapter.properties.EdgeListPropertyAdapter; +import de.hft.stuttgart.quality.model.types.SolidNotClosedError; + +@XMLElement(name = "GE_S_NOT_CLOSED", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class SolidNotClosedErrorAdapter extends AbstractSolidErrorAdapter<SolidNotClosedError> { + + @Override + public SolidNotClosedError createObject(QName name, Object parent) throws ObjectBuildException { + return new SolidNotClosedError(); + } + + @Override + public void buildChildObject(SolidNotClosedError object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "edges" -> object.setEdges(reader.getObjectUsingBuilder(EdgeListPropertyAdapter.class)); + default -> super.buildChildObject(object, name, attributes, reader); + } + } + + @Override + public Element createElement(SolidNotClosedError object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "GE_S_NOT_CLOSED"); + } + + @Override + public void writeChildElements(SolidNotClosedError object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + super.writeChildElements(object, namespaces, writer); + if (object.getEdges() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "edges"), object.getEdges(), + EdgeListPropertyAdapter.class, namespaces); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SolidSelfIntersectionErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SolidSelfIntersectionErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..e719ecab99866b870460ad9b760700f208dbbebf --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SolidSelfIntersectionErrorAdapter.java @@ -0,0 +1,60 @@ +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.SolidSelfIntersectionError; + +@XMLElement(name = "GE_S_SELF_INTERSECTION", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class SolidSelfIntersectionErrorAdapter extends AbstractSolidErrorAdapter<SolidSelfIntersectionError> { + + @Override + public SolidSelfIntersectionError createObject(QName name, Object parent) throws ObjectBuildException { + return new SolidSelfIntersectionError(); + } + + @Override + public void buildChildObject(SolidSelfIntersectionError object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "polygonId1" -> reader.getTextContent().ifPresent(object::setPolygonId1); + case "polygonId2" -> reader.getTextContent().ifPresent(object::setPolygonId2); + + default -> super.buildChildObject(object, name, attributes, reader); + } + } + + @Override + public Element createElement(SolidSelfIntersectionError object, Namespaces namespaces) + throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "GE_S_SELF_INTERSECTION"); + } + + @Override + public void writeChildElements(SolidSelfIntersectionError object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + super.writeChildElements(object, namespaces, writer); + if (object.getPolygonId1() != null) { + writer.writeElement( + Element.of(QualityADEModule.NAMESPACE_URI, "polygonId1").addTextContent(object.getPolygonId1())); + } + if (object.getPolygonId2() != null) { + writer.writeElement( + Element.of(QualityADEModule.NAMESPACE_URI, "polygonId2").addTextContent(object.getPolygonId2())); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SolidTooFewPolygonsErrorAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SolidTooFewPolygonsErrorAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..7588b418b24e9e4415f826d0852078faedb47376 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/SolidTooFewPolygonsErrorAdapter.java @@ -0,0 +1,28 @@ +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.xml.Element; +import org.xmlobjects.xml.Namespaces; + +import de.hft.stuttgart.quality.QualityADEModule; +import de.hft.stuttgart.quality.model.types.SolidTooFewPolygonsError; + +@XMLElement(name = "GE_S_TOO_FEW_POLYGONS", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class SolidTooFewPolygonsErrorAdapter extends AbstractSolidErrorAdapter<SolidTooFewPolygonsError> { + + @Override + public SolidTooFewPolygonsError createObject(QName name, Object parent) throws ObjectBuildException { + return new SolidTooFewPolygonsError(); + } + + @Override + public Element createElement(SolidTooFewPolygonsError object, Namespaces namespaces) + throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "GE_S_TOO_FEW_POLYGONS"); + } + +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/StatisticsAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/StatisticsAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..c6ec15756da5089432bc9e60cf74f09530ca7cf9 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/StatisticsAdapter.java @@ -0,0 +1,86 @@ +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.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; +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.adapter.properties.FeatureStatisticsPropertyAdapter; +import de.hft.stuttgart.quality.model.types.Statistics; + +@XMLElement(name = "Statistics", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class StatisticsAdapter implements ObjectBuilder<Statistics>, ObjectSerializer<Statistics> { + + @Override + public Statistics createObject(QName name, Object parent) throws ObjectBuildException { + return new Statistics(); + } + + @Override + public void buildChildObject(Statistics object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "numErrorBuildings" -> object + .setNumErrorBuildings(reader.getObjectUsingBuilder(FeatureStatisticsPropertyAdapter.class)); + case "numErrorVegetation" -> object + .setNumErrorVegetation(reader.getObjectUsingBuilder(FeatureStatisticsPropertyAdapter.class)); + case "numErrorLandObjects" -> object + .setNumErrorLandObjects(reader.getObjectUsingBuilder(FeatureStatisticsPropertyAdapter.class)); + case "numErrorBridgeObjects" -> object + .setNumErrorBridgeObjects(reader.getObjectUsingBuilder(FeatureStatisticsPropertyAdapter.class)); + case "numErrorWaterObjects" -> object + .setNumErrorWaterObjects(reader.getObjectUsingBuilder(FeatureStatisticsPropertyAdapter.class)); + case "numErrorTransportation" -> object + .setNumErrorTransportation(reader.getObjectUsingBuilder(FeatureStatisticsPropertyAdapter.class)); + default -> throw new IllegalStateException("Cannot handle name " + name + " when building Statistics element"); + } + } + + @Override + public Element createElement(Statistics object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "Statistics"); + } + + @Override + public void writeChildElements(Statistics object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + if (object.getNumErrorBuildings() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "numErrorBuildings"), + object.getNumErrorBuildings(), FeatureStatisticsPropertyAdapter.class, namespaces); + } + if (object.getNumErrorVegetation() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "numErrorVegetation"), + object.getNumErrorVegetation(), FeatureStatisticsPropertyAdapter.class, namespaces); + } + if (object.getNumErrorLandObjects() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "numErrorLandObjects"), + object.getNumErrorLandObjects(), FeatureStatisticsPropertyAdapter.class, namespaces); + } + if (object.getNumErrorBridgeObjects() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "numErrorBridgeObjects"), + object.getNumErrorBridgeObjects(), FeatureStatisticsPropertyAdapter.class, namespaces); + } + if (object.getNumErrorWaterObjects() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "numErrorWaterObjects"), + object.getNumErrorWaterObjects(), FeatureStatisticsPropertyAdapter.class, namespaces); + } + if (object.getNumErrorTransportation() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "numErrorTransportation"), + object.getNumErrorTransportation(), FeatureStatisticsPropertyAdapter.class, namespaces); + } + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..77ece23251ddafc12b23052f9c8fd95d97403ccd --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationAdapter.java @@ -0,0 +1,75 @@ +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.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.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) +public class ValidationAdapter extends AbstractFeatureAdapter<Validation> { + + private static final ZonedDateTimeAdapter DATE_TIME_ADAPTER = new ZonedDateTimeAdapter(); + + @Override + public Validation createObject(QName name, Object parent) throws ObjectBuildException { + return new Validation(); + } + + @Override + public void buildChildObject(Validation object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "validationDate" -> reader.getTextContent() + .ifPresent(s -> object.setValidationDate(DATE_TIME_ADAPTER.fromString(s))); + case "validationSoftware" -> reader.getTextContent().ifPresent(object::setValidationSoftware); + case "statistics" -> object.setStatistics(reader.getObjectUsingBuilder(StatisticsPropertyAdapter.class)); + case "validationPlan" -> object + .setValidationPlan(reader.getObjectUsingBuilder(ValidationPlanPropertyAdapter.class)); + default -> super.buildChildObject(object, name, attributes, reader); + } + } + + @Override + public Element createElement(Validation object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "Validation"); + } + + @Override + public void writeChildElements(Validation object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + super.writeChildElements(object, namespaces, writer); + if (object.getValidationDate() != null) { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "validationDate") + .addTextContent(DATE_TIME_ADAPTER.toString(object.getValidationDate()))); + } + if (object.getValidationSoftware() != null) { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "validationSoftware") + .addTextContent(object.getValidationSoftware())); + } + if (object.getStatistics() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "statistics"), + object.getStatistics(), StatisticsPropertyAdapter.class, namespaces); + } + if (object.getValidationPlan() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "validationPlan"), + object.getValidationPlan(), ValidationPlanPropertyAdapter.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 new file mode 100644 index 0000000000000000000000000000000000000000..245bc018af9dd889c7bf05eb06e98595b89034fd --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationPlanAdapter.java @@ -0,0 +1,71 @@ +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.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; +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.adapter.properties.FilterPropertyAdapter; +import de.hft.stuttgart.quality.adapter.properties.GlobalParametersPropertyAdapter; +import de.hft.stuttgart.quality.adapter.properties.RequirementPropertyAdapter; +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<ValidationPlan>, ObjectSerializer<ValidationPlan> { + + @Override + public ValidationPlan createObject(QName name, Object parent) throws ObjectBuildException { + return new ValidationPlan(); + } + + @Override + public void buildChildObject(ValidationPlan object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "globalParameters" -> object + .setGlobalParameters(reader.getObjectUsingBuilder(GlobalParametersPropertyAdapter.class)); + case "filter" -> object.setFilter(reader.getObjectUsingBuilder(FilterPropertyAdapter.class)); + case "requirement" -> object.getRequirements() + .add(reader.getObjectUsingBuilder(RequirementPropertyAdapter.class)); + default -> throw new IllegalStateException( + "Cannot handle name " + name + " when building ValidationPlan element"); + } + } + + @Override + public Element createElement(ValidationPlan object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "ValidationPlan"); + } + + @Override + public void writeChildElements(ValidationPlan object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + if (object.getGlobalParameters() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "globalParameters"), + object.getGlobalParameters(), GlobalParametersPropertyAdapter.class, namespaces); + } + if (object.getFilter() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "filter"), object.getFilter(), + FilterPropertyAdapter.class, namespaces); + } + for (RequirementProperty req : object.getRequirements()) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "requirement"), req, + RequirementPropertyAdapter.class, namespaces); + } + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..68f5b8d079de28f2309c92a246885d9580275693 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ValidationResultAdapter.java @@ -0,0 +1,69 @@ +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.builder.ObjectBuilder; +import org.xmlobjects.gml.adapter.base.ReferenceAdapter; +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; +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.adapter.properties.AbstractErrorPropertyAdapter; +import de.hft.stuttgart.quality.model.enums.ResultType; +import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty; +import de.hft.stuttgart.quality.model.types.ValidationResult; + +@XMLElement(name = "ValidationResult", namespaceURI = QualityADEModule.NAMESPACE_URI) +public class ValidationResultAdapter implements ObjectBuilder<ValidationResult>, ObjectSerializer<ValidationResult> { + + @Override + public ValidationResult createObject(QName name, Object parent) throws ObjectBuildException { + return new ValidationResult(); + } + + @Override + public void buildChildObject(ValidationResult object, QName name, Attributes attributes, XMLReader reader) + throws ObjectBuildException, XMLReadException { + if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) { + return; + } + switch (name.getLocalPart()) { + case "validationPlanID" -> object.setValidationPlanID(reader.getObjectUsingBuilder(ReferenceAdapter.class)); + case "error" -> object.getErrors().add(reader.getObjectUsingBuilder(AbstractErrorPropertyAdapter.class)); + case "resultType" -> reader.getTextContent().ifPresent(s -> object.setResultType(ResultType.valueOf(s))); + default -> throw new IllegalStateException( + "Cannot handle name " + name + " when building ValidationResult element"); + } + } + + @Override + public Element createElement(ValidationResult object, Namespaces namespaces) throws ObjectSerializeException { + return Element.of(QualityADEModule.NAMESPACE_URI, "ValidationResult"); + } + + @Override + public void writeChildElements(ValidationResult object, Namespaces namespaces, XMLWriter writer) + throws ObjectSerializeException, XMLWriteException { + if (object.getValidationPlanID() != null) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "validationPlanID"), + object.getValidationPlanID(), ReferenceAdapter.class, namespaces); + } + for (AbstractErrorProperty err : object.getErrors()) { + writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "error"), err, + AbstractErrorPropertyAdapter.class, namespaces); + } + if (object.getResultType() != null) { + writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "resultType") + .addTextContent(object.getResultType().toString())); + } + } +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ZonedDateTimeAdapter.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ZonedDateTimeAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..5a66e344a0aaa5b679ce36188caa840c28900a06 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/adapter/types/ZonedDateTimeAdapter.java @@ -0,0 +1,37 @@ +/*- + * Copyright 2022 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 java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; + +public class ZonedDateTimeAdapter { + + public ZonedDateTime fromString(String v) { + try { + return ZonedDateTime.from(DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(v)); + } catch (Exception e) { + return LocalDateTime.parse(v).atZone(ZoneId.systemDefault()); + } + } + + public String toString(ZonedDateTime v) { + return DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(v); + } + +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/properties/ValidationResultProperty.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/properties/ValidationResultProperty.java new file mode 100644 index 0000000000000000000000000000000000000000..db6f38c5bab2e4b928dc76b431c14c76e51e4364 --- /dev/null +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/properties/ValidationResultProperty.java @@ -0,0 +1,48 @@ +/*- + * Copyright 2022 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.properties; + +import java.io.Serial; + +import org.citygml4j.core.model.ade.ADEObject; +import org.xmlobjects.gml.model.base.AbstractInlineOrByReferenceProperty; + +import de.hft.stuttgart.quality.model.types.ValidationResult; + +public class ValidationResultProperty extends AbstractInlineOrByReferenceProperty<ValidationResult> implements ADEObject { + + + @Serial + private static final long serialVersionUID = 480940868730913996L; + + public ValidationResultProperty() { + super(); + } + + public ValidationResultProperty(ValidationResult object) { + super(object); + } + + public ValidationResultProperty(String href) { + super(href); + } + + @Override + public Class<ValidationResult> getTargetType() { + return ValidationResult.class; + } + +} diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/CityObjectProperties.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/CityObjectProperties.java index e9c058d9dbbc824fe4a242535ada380fcf24bf5a..98eabb60dd88e6715004c83d58dda8b787be2b2b 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/CityObjectProperties.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/CityObjectProperties.java @@ -4,18 +4,20 @@ import java.io.Serial; import org.citygml4j.core.model.core.ADEOfAbstractCityObject; +import de.hft.stuttgart.quality.model.properties.ValidationResultProperty; + public class CityObjectProperties extends ADEOfAbstractCityObject { @Serial private static final long serialVersionUID = 1273072314736964714L; - private ValidationResult validationResult; + private ValidationResultProperty validationResult; - public ValidationResult getValidationResult() { + public ValidationResultProperty getValidationResult() { return validationResult; } - public void setValidationResult(ValidationResult validationResult) { + public void setValidationResult(ValidationResultProperty validationResult) { this.validationResult = asChild(validationResult); } } diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/MultipleComponentsError.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/MultipleComponentsError.java index 02eb8530443bbfd2153467eaea4c28d2e8f5e2cb..9bb38d69ce5410c097b76674783ad3864d8beb13 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/MultipleComponentsError.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/MultipleComponentsError.java @@ -27,17 +27,17 @@ public class MultipleComponentsError extends AbstractSolidError { @Serial private static final long serialVersionUID = 4322219502819024437L; - private List<ComponentListProperty> edges; + private List<ComponentListProperty> components; - public List<ComponentListProperty> getEdges() { - if (edges == null) { - edges = new ChildList<>(this); + public List<ComponentListProperty> getComponents() { + if (components == null) { + components = new ChildList<>(this); } - return edges; + return components; } - public void setEdges(List<ComponentListProperty> edges) { - this.edges = asChild(edges); + public void setComponents(List<ComponentListProperty> edges) { + this.components = asChild(edges); } } diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/PolygonWrongOrientationError.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/PolygonWrongOrientationError.java index 786914b1fa7c9046069c4f675d36f2c466e6e852..6df9ef17f23af6d9086aa51b5bcbee905024c864 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/PolygonWrongOrientationError.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/PolygonWrongOrientationError.java @@ -17,28 +17,21 @@ package de.hft.stuttgart.quality.model.types; import java.io.Serial; +import de.hft.stuttgart.quality.model.properties.EdgeListProperty; + public class PolygonWrongOrientationError extends AbstractSolidError { @Serial private static final long serialVersionUID = 4975827693656963892L; - private String polygonId1; - private String polygonId2; - - public String getPolygonId1() { - return polygonId1; - } - - public void setPolygonId1(String polygonId1) { - this.polygonId1 = polygonId1; - } + private EdgeListProperty edges; - public String getPolygonId2() { - return polygonId2; + public EdgeListProperty getEdges() { + return edges; } - public void setPolygonId2(String polygonId2) { - this.polygonId2 = polygonId2; + public void setEdges(EdgeListProperty edges) { + this.edges = edges; } } diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SolidSelfIntersectionError.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SolidSelfIntersectionError.java index 2bbe224fb669f564012867413bdc5d4acd639bde..8ab15387e77b811ea64d233aa2ed60b955381afb 100644 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SolidSelfIntersectionError.java +++ b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/model/types/SolidSelfIntersectionError.java @@ -19,7 +19,26 @@ import java.io.Serial; public class SolidSelfIntersectionError extends AbstractSolidError { - @Serial - private static final long serialVersionUID = 5070991901664859830L; + @Serial + private static final long serialVersionUID = 5070991901664859830L; + + private String polygonId1; + private String polygonId2; + + public String getPolygonId1() { + return polygonId1; + } + + public void setPolygonId1(String polygonId1) { + this.polygonId1 = polygonId1; + } + + public String getPolygonId2() { + return polygonId2; + } + + public void setPolygonId2(String polygonId2) { + this.polygonId2 = polygonId2; + } } 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 32af5a4811431b655f84c5691da8a3eff6685373..4b331445b4036d401b1b3bda22d27e80f0682629 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 @@ -51,14 +51,14 @@ public class ValidationPlan extends GMLObject implements ADEObject { this.filter = asChild(filter); } - public List<RequirementProperty> getRequirement() { + public List<RequirementProperty> getRequirements() { if (requirement == null) { requirement = new ChildList<>(this); } return requirement; } - public void setRequirement(List<RequirementProperty> requirement) { + public void setRequirements(List<RequirementProperty> requirement) { this.requirement = asChild(requirement); } diff --git a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/util/UncheckedMissingADESchemaException.java b/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/util/UncheckedMissingADESchemaException.java deleted file mode 100644 index f0a31acbdd2cdd508a68da182cc66988f4373d59..0000000000000000000000000000000000000000 --- a/citygml4j-quality-ade/src/main/java/de/hft/stuttgart/quality/util/UncheckedMissingADESchemaException.java +++ /dev/null @@ -1,37 +0,0 @@ -/*- - * Copyright 2020 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.util; - - -import org.citygml4j.xml.reader.MissingADESchemaException; - -public class UncheckedMissingADESchemaException extends RuntimeException { - - private static final long serialVersionUID = -5684499826072882203L; - - private MissingADESchemaException cause; - - public UncheckedMissingADESchemaException(MissingADESchemaException e) { - super(e); - this.cause = e; - } - - @Override - public synchronized MissingADESchemaException getCause() { - return cause; - } - -} diff --git a/citygml4j-quality-ade/src/main/resources/META-INF/services/org.citygml4j.model.citygml.ade.binding.ADEContext b/citygml4j-quality-ade/src/main/resources/META-INF/services/org.citygml4j.model.citygml.ade.binding.ADEContext deleted file mode 100644 index 7d74a7239692a199814fe7e69dde6cd771ba8761..0000000000000000000000000000000000000000 --- a/citygml4j-quality-ade/src/main/resources/META-INF/services/org.citygml4j.model.citygml.ade.binding.ADEContext +++ /dev/null @@ -1 +0,0 @@ -de.hft.stuttgart.quality.QualityADEContext \ No newline at end of file diff --git a/citygml4j-quality-ade/src/main/resources/qualityAde.xsd b/citygml4j-quality-ade/src/main/resources/qualityAde.xsd index f3d06ae7ff5712b1f8af8e210674b9d650f8366e..6bfd61a443e83c0cb51b68fffa868de961001a7a 100644 --- a/citygml4j-quality-ade/src/main/resources/qualityAde.xsd +++ b/citygml4j-quality-ade/src/main/resources/qualityAde.xsd @@ -561,8 +561,8 @@ <enumeration value="NOT_CHECKED"/> </restriction> </simpleType> - <element name="SEM_ATTRIBUTE_MISSING" substitutionGroup="qual:AbstractSemanticError" type="qual:SEM_ATTRIBUTE_MISSINGType"/> - <complexType name="SEM_ATTRIBUTE_MISSINGType"> + <element name="SE_ATTRIBUTE_MISSING" substitutionGroup="qual:AbstractSemanticError" type="qual:SE_ATTRIBUTE_MISSINGType"/> + <complexType name="SE_ATTRIBUTE_MISSINGType"> <complexContent> <extension base="qual:AbstractSemanticErrorType"> <sequence> @@ -573,13 +573,13 @@ </extension> </complexContent> </complexType> - <complexType name="SEM_ATTRIBUTE_MISSINGPropertyType"> + <complexType name="SE_ATTRIBUTE_MISSINGPropertyType"> <sequence> - <element ref="qual:SEM_ATTRIBUTE_MISSING"/> + <element ref="qual:SE_ATTRIBUTE_MISSING"/> </sequence> </complexType> - <element name="SEM_ATTRIBUTE_WRONG_VALUE" substitutionGroup="qual:AbstractSemanticError" type="qual:SEM_ATTRIBUTE_WRONG_VALUEType"/> - <complexType name="SEM_ATTRIBUTE_WRONG_VALUEType"> + <element name="SE_ATTRIBUTE_WRONG_VALUE" substitutionGroup="qual:AbstractSemanticError" type="qual:SE_ATTRIBUTE_WRONG_VALUEType"/> + <complexType name="SE_ATTRIBUTE_WRONG_VALUEType"> <complexContent> <extension base="qual:AbstractSemanticErrorType"> <sequence> @@ -590,20 +590,20 @@ </extension> </complexContent> </complexType> - <complexType name="SEM_ATTRIBUTE_WRONG_VALUEPropertyType"> + <complexType name="SE_ATTRIBUTE_WRONG_VALUEPropertyType"> <sequence> - <element ref="qual:SEM_ATTRIBUTE_WRONG_VALUE"/> + <element ref="qual:SE_ATTRIBUTE_WRONG_VALUE"/> </sequence> </complexType> <element name="Statistics" substitutionGroup="gml:_Object" type="qual:StatisticsType"/> <complexType name="StatisticsType"> <sequence> - <element name="numErrorBuildings" type="qual:FeatureStatisticsPropertyType"/> - <element name="numErrorVegetation" type="qual:FeatureStatisticsPropertyType"/> - <element name="numErrorLandObjects" type="qual:FeatureStatisticsPropertyType"/> - <element name="numErrorBridgeObjects" type="qual:FeatureStatisticsPropertyType"/> - <element name="numErrorWaterObjects" type="qual:FeatureStatisticsPropertyType"/> - <element name="numErrorTransportation" type="qual:FeatureStatisticsPropertyType"/> + <element minOccurs="0" name="numErrorBuildings" type="qual:FeatureStatisticsPropertyType"/> + <element minOccurs="0" name="numErrorVegetation" type="qual:FeatureStatisticsPropertyType"/> + <element minOccurs="0" name="numErrorLandObjects" type="qual:FeatureStatisticsPropertyType"/> + <element minOccurs="0" name="numErrorBridgeObjects" type="qual:FeatureStatisticsPropertyType"/> + <element minOccurs="0" name="numErrorWaterObjects" type="qual:FeatureStatisticsPropertyType"/> + <element minOccurs="0" name="numErrorTransportation" type="qual:FeatureStatisticsPropertyType"/> <element maxOccurs="unbounded" minOccurs="0" name="error" type="qual:ErrorPropertyType"/> </sequence> </complexType> 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 62a4b8779282b2f3c573707bae5be501f67044e6..2198bec42bc88712a9835aea7458c7d60a81567e 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 @@ -15,1368 +15,546 @@ */ package de.hft.stuttgart.quality; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.ZonedDateTime; +import java.util.Locale; + +import javax.xml.XMLConstants; +import javax.xml.transform.Source; +import javax.xml.transform.stream.StreamSource; +import javax.xml.validation.Schema; +import javax.xml.validation.SchemaFactory; +import javax.xml.validation.Validator; + +import org.citygml4j.core.ade.ADEException; +import org.citygml4j.core.ade.ADERegistry; +import org.citygml4j.core.model.CityGMLVersion; +import org.citygml4j.core.model.building.Building; +import org.citygml4j.core.model.core.AbstractCityObjectProperty; +import org.citygml4j.core.model.core.AbstractFeatureProperty; +import org.citygml4j.core.model.core.CityModel; +import org.citygml4j.xml.CityGMLContext; +import org.citygml4j.xml.CityGMLContextException; +import org.citygml4j.xml.module.citygml.CoreModule; +import org.citygml4j.xml.schema.CityGMLSchemaHandler; +import org.citygml4j.xml.writer.CityGMLOutputFactory; +import org.citygml4j.xml.writer.CityGMLWriteException; +import org.citygml4j.xml.writer.CityGMLWriter; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xmlobjects.gml.model.base.Reference; +import org.xmlobjects.gml.model.geometry.DirectPosition; +import org.xmlobjects.gml.model.measures.Angle; +import org.xmlobjects.gml.model.measures.Length; +import org.xmlobjects.schema.SchemaHandlerException; + +import de.hft.stuttgart.quality.model.enums.RequirementId; +import de.hft.stuttgart.quality.model.enums.ResultType; +import de.hft.stuttgart.quality.model.enums.RingSelfIntType; +import de.hft.stuttgart.quality.model.enums.TopLevelFeatureType; +import de.hft.stuttgart.quality.model.properties.AbstractErrorProperty; +import de.hft.stuttgart.quality.model.properties.CheckingProperty; +import de.hft.stuttgart.quality.model.properties.ComponentListProperty; +import de.hft.stuttgart.quality.model.properties.EdgeListProperty; +import de.hft.stuttgart.quality.model.properties.EdgeProperty; +import de.hft.stuttgart.quality.model.properties.FeatureStatisticsProperty; +import de.hft.stuttgart.quality.model.properties.FilterProperty; +import de.hft.stuttgart.quality.model.properties.GlobalParametersProperty; +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; +import de.hft.stuttgart.quality.model.types.CityObjectProperties; +import de.hft.stuttgart.quality.model.types.ComponentList; +import de.hft.stuttgart.quality.model.types.ConsecutivePointsSameError; +import de.hft.stuttgart.quality.model.types.Edge; +import de.hft.stuttgart.quality.model.types.EdgeList; +import de.hft.stuttgart.quality.model.types.FeatureStatistics; +import de.hft.stuttgart.quality.model.types.Filter; +import de.hft.stuttgart.quality.model.types.GlobalParameters; +import de.hft.stuttgart.quality.model.types.HoleOutsideError; +import de.hft.stuttgart.quality.model.types.InnerRingsNestedError; +import de.hft.stuttgart.quality.model.types.InteriorDisconnectedError; +import de.hft.stuttgart.quality.model.types.IntersectingRingsError; +import de.hft.stuttgart.quality.model.types.MultipleComponentsError; +import de.hft.stuttgart.quality.model.types.NonManifoldEdgeError; +import de.hft.stuttgart.quality.model.types.NonManifoldVertexError; +import de.hft.stuttgart.quality.model.types.OrientationRingsSameError; +import de.hft.stuttgart.quality.model.types.Parameter; +import de.hft.stuttgart.quality.model.types.PlanarDistancePlaneError; +import de.hft.stuttgart.quality.model.types.PlanarNormalsDeviationError; +import de.hft.stuttgart.quality.model.types.PolygonIdList; +import de.hft.stuttgart.quality.model.types.PolygonWrongOrientationError; +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.SemanticAttributeMissingError; +import de.hft.stuttgart.quality.model.types.SemanticAttributeWrongValueError; +import de.hft.stuttgart.quality.model.types.SolidNotClosedError; +import de.hft.stuttgart.quality.model.types.SolidSelfIntersectionError; +import de.hft.stuttgart.quality.model.types.SolidTooFewPolygonsError; +import de.hft.stuttgart.quality.model.types.Statistics; +import de.hft.stuttgart.quality.model.types.Validation; +import de.hft.stuttgart.quality.model.types.ValidationPlan; +import de.hft.stuttgart.quality.model.types.ValidationResult; + class QualityAdeTests { - /* + @BeforeAll + static void setUsLocale() throws ADEException { + Locale.setDefault(Locale.US); + ADERegistry.getInstance().loadADE(new QualityADEContext()); + } + + @Test - void testValidationPlan() throws ADEException, CityGMLContextException, CityGMLWriteException { + void testAllPolygonsOrientedWrong() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, IOException, SchemaHandlerException { CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); - Validation v = new Validation(); - model.getFeatureMembers().add(new AbstractFeatureProperty(v)); - v.setValidationSoftware("testSoftware"); - v.setValidationDate(ZonedDateTime.now()); - ValidationPlan plan = new ValidationPlan(); - Requirement req = new Requirement(); - req.setEnabled(true); - req.setName(RequirementId.R_GE_P_HOLE_OUTSIDE); - plan.getRequirements().add(req); - - Checking checking = new Checking(); - checking.setFeatureType(TopLevelFeatureType.BRIDGE); - plan.getFilter().add(checking); - - Parameter param = new Parameter(); - param.setName("test"); - param.setUom("uom"); - param.setValue("5"); - plan.getGlobalParameters().add(param); - - v.setValidationPlan(plan); - - - ADERegistry.getInstance().loadADE(new QualityADEContext()); - - CityGMLContext context = CityGMLContext.newInstance(); - CityGMLVersion version = CityGMLVersion.v2_0; - CityGMLOutputFactory out = context.createCityGMLOutputFactory(version); + AllPolygonsOrientedWrongError err = new AllPolygonsOrientedWrongError(); + err.setGeometryId("geomId"); + res.getErrors().add(new AbstractErrorProperty(err)); - - try (CityGMLChunkWriter writer = out.createCityGMLChunkWriter(Paths.get("test.gml"), StandardCharsets.UTF_8.name())) { - writer.withIndent(" ") - .withSchemaLocation(QualityADEModule.NAMESPACE_URI, getClass().getResource("/qualityAde.xsd").toString()) - .withDefaultPrefixes() - .withDefaultNamespace(CoreModule.of(version).getNamespaceURI()) - .writeMember(v); - } - + byte[] buf = writeModel(model); + assertTrue(validate(new ByteArrayInputStream(buf))); } - - - - @Test - void testReadingConsecutiveSameError() - throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { - CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_Error_QualityADE.gml"); - testValidationPlan(cityModel); - - List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember(); - assertEquals(1, cityObjectMember.size()); - CityObjectMember com = cityObjectMember.get(0); - AbstractCityObject aco = com.getCityObject(); - assertNotNull(aco); - assertTrue(aco instanceof Building); - Building b = (Building) aco; - - List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject(); - ADEComponent resultComp = gen.get(0); - assertTrue(resultComp instanceof ValidationResult); - ValidationResult result = (ValidationResult) resultComp; - assertEquals(ResultType.ERROR, result.getResult()); - assertFalse(result.getErrors().isEmpty()); - List<ValidationError> errors = result.getErrors(); - assertEquals(1, errors.size()); - ValidationError validationError = errors.get(0); - assertTrue(validationError instanceof ConsecutivePointsSame); - ConsecutivePointsSame err = (ConsecutivePointsSame) validationError; - assertEquals("_Simple_BD.1_PG.6_LR.1", err.getLinearRingId()); - Double x1 = err.getVertex1().getValue().get(0); - assertEquals(11.5, x1, 0.0000001); - Double x2 = err.getVertex2().getValue().get(0); - assertEquals(11.5, x2, 0.0000001); - } - - @Test - void testReadingTooFewPointsError() - throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { - CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_TooFewPoints.gml"); - - List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember(); - CityObjectMember com = cityObjectMember.get(0); - AbstractCityObject aco = com.getCityObject(); - Building b = (Building) aco; - - List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject(); - ADEComponent resultComp = gen.get(0); - ValidationResult result = (ValidationResult) resultComp; - assertEquals(ResultType.ERROR, result.getResult()); - assertFalse(result.getErrors().isEmpty()); - List<ValidationError> errors = result.getErrors(); - ValidationError validationError = errors.get(0); - assertTrue(validationError instanceof TooFewPoints); - TooFewPoints err = (TooFewPoints) validationError; - assertEquals("_Simple_BD.1_PG.6_LR.1", err.getLinearRingId()); - } - - @Test - void testReadingRingSelfIntersectionError() - throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { - CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_RingSelfIntersection.gml"); - - List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember(); - CityObjectMember com = cityObjectMember.get(0); - AbstractCityObject aco = com.getCityObject(); - Building b = (Building) aco; - - List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject(); - ADEComponent resultComp = gen.get(0); - ValidationResult result = (ValidationResult) resultComp; - assertEquals(ResultType.ERROR, result.getResult()); - assertFalse(result.getErrors().isEmpty()); - List<ValidationError> errors = result.getErrors(); - ValidationError validationError = errors.get(0); - assertTrue(validationError instanceof RingSelfIntersection); - RingSelfIntersection err = (RingSelfIntersection) validationError; - assertEquals("_Simple_BD.1_PG.6_LR.1", err.getLinearRingId()); - assertEquals(RingSelfIntType.POINT_TOUCHES_EDGE, err.getType()); - assertNull(err.getEdge2()); - Edge edge1 = err.getEdge1(); - assertEquals(10.0, edge1.getFrom().getValue().get(0), 0.000001); - assertEquals(11.0, edge1.getTo().getValue().get(0), 0.000001); - assertEquals(5.0, err.getVertex1().getValue().get(0)); - assertNull(err.getVertex2()); - } - - @Test - void testReadingRingNotClosedError() - throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { - CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_RingNotClosed.gml"); - - List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember(); - CityObjectMember com = cityObjectMember.get(0); - AbstractCityObject aco = com.getCityObject(); - Building b = (Building) aco; - - List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject(); - ADEComponent resultComp = gen.get(0); - ValidationResult result = (ValidationResult) resultComp; - assertEquals(ResultType.ERROR, result.getResult()); - assertFalse(result.getErrors().isEmpty()); - List<ValidationError> errors = result.getErrors(); - ValidationError validationError = errors.get(0); - assertTrue(validationError instanceof RingNotClosed); - RingNotClosed err = (RingNotClosed) validationError; - assertEquals("_Simple_BD.1_PG.6_LR.1", err.getLinearRingId()); - } - - @Test - void testReadingInteriorDisconnectedError() - throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { - CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_InteriorDisconnected.gml"); - - List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember(); - CityObjectMember com = cityObjectMember.get(0); - AbstractCityObject aco = com.getCityObject(); - Building b = (Building) aco; - - List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject(); - ADEComponent resultComp = gen.get(0); - ValidationResult result = (ValidationResult) resultComp; - assertEquals(ResultType.ERROR, result.getResult()); - assertFalse(result.getErrors().isEmpty()); - List<ValidationError> errors = result.getErrors(); - ValidationError validationError = errors.get(0); - - assertTrue(validationError instanceof InteriorDisconnected); - InteriorDisconnected err = (InteriorDisconnected) validationError; - assertEquals("_Simple_BD.1_PG.1", err.getPolygonId()); - } - - @Test - void testReadingIntersectingRingsError() - throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { - CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_IntersectingRings.gml"); - - List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember(); - CityObjectMember com = cityObjectMember.get(0); - AbstractCityObject aco = com.getCityObject(); - Building b = (Building) aco; - - List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject(); - ADEComponent resultComp = gen.get(0); - ValidationResult result = (ValidationResult) resultComp; - assertEquals(ResultType.ERROR, result.getResult()); - assertFalse(result.getErrors().isEmpty()); - List<ValidationError> errors = result.getErrors(); - ValidationError validationError = errors.get(0); - - assertTrue(validationError instanceof IntersectingRings); - IntersectingRings err = (IntersectingRings) validationError; - assertEquals("_Simple_BD.1_PG.1", err.getPolygonId()); - assertEquals("_Simple_BD.1_PG.1_Ring1", err.getLinearRingId1()); - assertEquals("_Simple_BD.1_PG.1_Ring2", err.getLinearRingId2()); - } - - @Test - void testReadingNonPlanarPolygonDistancePlaneError() - throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { - CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_NonPlanarPolygonDistancePlane.gml"); - - List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember(); - CityObjectMember com = cityObjectMember.get(0); - AbstractCityObject aco = com.getCityObject(); - Building b = (Building) aco; - - List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject(); - ADEComponent resultComp = gen.get(0); - ValidationResult result = (ValidationResult) resultComp; - assertEquals(ResultType.ERROR, result.getResult()); - assertFalse(result.getErrors().isEmpty()); - List<ValidationError> errors = result.getErrors(); - ValidationError validationError = errors.get(0); - - assertTrue(validationError instanceof NonPlanarDistancePlane); - NonPlanarDistancePlane err = (NonPlanarDistancePlane) validationError; - assertEquals("_Simple_BD.1_PG.1", err.getPolygonId()); - assertEquals(1.0, err.getVertex().getValue().get(0), 0.000001); - assertEquals(0.001, err.getDistance().getValue(), 0.000001); - assertEquals("m", err.getDistance().getUom()); - } - - @Test - void testReadingInnerRingsNestedError() - throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { - CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_InnerRingNested.gml"); - - List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember(); - CityObjectMember com = cityObjectMember.get(0); - AbstractCityObject aco = com.getCityObject(); - Building b = (Building) aco; - - List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject(); - ADEComponent resultComp = gen.get(0); - ValidationResult result = (ValidationResult) resultComp; - assertEquals(ResultType.ERROR, result.getResult()); - assertFalse(result.getErrors().isEmpty()); - List<ValidationError> errors = result.getErrors(); - ValidationError validationError = errors.get(0); - - assertTrue(validationError instanceof InnerRingsNested); - InnerRingsNested err = (InnerRingsNested) validationError; - assertEquals("_Simple_BD.1_PG.1", err.getPolygonId()); - assertEquals("_Simple_BD.1_PG.1_Ring1", err.getLinearRingId1()); - assertEquals("_Simple_BD.1_PG.1_Ring2", err.getLinearRingId2()); - } - - @Test - void testReadingHoleOutsideError() - throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { - CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_HoleOutside.gml"); - - List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember(); - CityObjectMember com = cityObjectMember.get(0); - AbstractCityObject aco = com.getCityObject(); - Building b = (Building) aco; - - List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject(); - ADEComponent resultComp = gen.get(0); - ValidationResult result = (ValidationResult) resultComp; - assertEquals(ResultType.ERROR, result.getResult()); - assertFalse(result.getErrors().isEmpty()); - List<ValidationError> errors = result.getErrors(); - ValidationError validationError = errors.get(0); - - assertTrue(validationError instanceof HoleOutside); - HoleOutside err = (HoleOutside) validationError; - assertEquals("_Simple_BD.1_PG.1", err.getPolygonId()); - assertEquals("_Simple_BD.1_PG.1_Ring1", err.getLinearRingId()); - } - - @Test - void testReadingNonPlanarNormalsDeviationError() - throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { - CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_NonPlanarPolygonNormalsDeviation.gml"); - - List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember(); - CityObjectMember com = cityObjectMember.get(0); - AbstractCityObject aco = com.getCityObject(); - Building b = (Building) aco; - - List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject(); - ADEComponent resultComp = gen.get(0); - ValidationResult result = (ValidationResult) resultComp; - assertEquals(ResultType.ERROR, result.getResult()); - assertFalse(result.getErrors().isEmpty()); - List<ValidationError> errors = result.getErrors(); - ValidationError validationError = errors.get(0); - - assertTrue(validationError instanceof NonPlanarNormalsDeviation); - NonPlanarNormalsDeviation err = (NonPlanarNormalsDeviation) validationError; - assertEquals("_Simple_BD.1_PG.1", err.getPolygonId()); - assertEquals(1.0, err.getDeviation().getValue()); - assertEquals("deg", err.getDeviation().getUom()); - } - - @Test - void testReadingOrientationRingsSameError() - throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { - CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_OrientationRingsSame.gml"); - - List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember(); - CityObjectMember com = cityObjectMember.get(0); - AbstractCityObject aco = com.getCityObject(); - Building b = (Building) aco; - - List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject(); - ADEComponent resultComp = gen.get(0); - ValidationResult result = (ValidationResult) resultComp; - assertEquals(ResultType.ERROR, result.getResult()); - assertFalse(result.getErrors().isEmpty()); - List<ValidationError> errors = result.getErrors(); - ValidationError validationError = errors.get(0); - - assertTrue(validationError instanceof OrientationRingsSame); - OrientationRingsSame err = (OrientationRingsSame) validationError; - assertEquals("_Simple_BD.1_PG.1", err.getPolygonId()); - assertEquals("_Simple_BD.1_PG.1_Ring1", err.getLinearRingId()); - } - - @Test - void testReadingAllPolygonsWrongOrientationError() - throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { - CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_AllPolygonsWrongOrientation.gml"); - - List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember(); - CityObjectMember com = cityObjectMember.get(0); - AbstractCityObject aco = com.getCityObject(); - Building b = (Building) aco; - - List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject(); - ADEComponent resultComp = gen.get(0); - ValidationResult result = (ValidationResult) resultComp; - assertEquals(ResultType.ERROR, result.getResult()); - assertFalse(result.getErrors().isEmpty()); - List<ValidationError> errors = result.getErrors(); - ValidationError validationError = errors.get(0); - - assertTrue(validationError instanceof AllPolygonsWrongOrientation); - AllPolygonsWrongOrientation err = (AllPolygonsWrongOrientation) validationError; - assertEquals("_Simple_BD.1_Geom1", err.getGeometryId()); - } - - @Test - void testReadingPolygonWrongOrientationError() - throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { - CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_PolygonWrongOrientation.gml"); - - List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember(); - CityObjectMember com = cityObjectMember.get(0); - AbstractCityObject aco = com.getCityObject(); - Building b = (Building) aco; - - List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject(); - ADEComponent resultComp = gen.get(0); - ValidationResult result = (ValidationResult) resultComp; - assertEquals(ResultType.ERROR, result.getResult()); - assertFalse(result.getErrors().isEmpty()); - List<ValidationError> errors = result.getErrors(); - ValidationError validationError = errors.get(0); - - assertTrue(validationError instanceof PolygonWrongOrientation); - PolygonWrongOrientation err = (PolygonWrongOrientation) validationError; - assertEquals("_Simple_BD.1_Geom1", err.getGeometryId()); - assertFalse(err.getEdges().isEmpty()); - List<Edge> edges = err.getEdges(); - Edge edge = edges.get(0); - DirectPosition from = edge.getFrom(); - assertEquals(10.0, from.getValue().get(0), 0.000001); - assertEquals(11.0, edge.getTo().getValue().get(0), 0.000001); - } - - @Test - void testReadingNonManifoldVertexError() - throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { - CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_NonManifoldVertex.gml"); - - List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember(); - CityObjectMember com = cityObjectMember.get(0); - AbstractCityObject aco = com.getCityObject(); - Building b = (Building) aco; - - List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject(); - ADEComponent resultComp = gen.get(0); - ValidationResult result = (ValidationResult) resultComp; - assertEquals(ResultType.ERROR, result.getResult()); - assertFalse(result.getErrors().isEmpty()); - List<ValidationError> errors = result.getErrors(); - ValidationError validationError = errors.get(0); - - assertTrue(validationError instanceof NonManifoldVertex); - NonManifoldVertex err = (NonManifoldVertex) validationError; - assertEquals("_Simple_BD.1_Geom1", err.getGeometryId()); - DirectPosition vertex = err.getVertex(); - assertEquals(1.0, vertex.getValue().get(0), 0.000001); - } - - @Test - void testReadingNonManifoldEdgeError() - throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { - CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_NonManifoldEdge.gml"); - - List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember(); - CityObjectMember com = cityObjectMember.get(0); - AbstractCityObject aco = com.getCityObject(); - Building b = (Building) aco; - - List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject(); - ADEComponent resultComp = gen.get(0); - ValidationResult result = (ValidationResult) resultComp; - assertEquals(ResultType.ERROR, result.getResult()); - assertFalse(result.getErrors().isEmpty()); - List<ValidationError> errors = result.getErrors(); - ValidationError validationError = errors.get(0); - - assertTrue(validationError instanceof NonManifoldEdge); - NonManifoldEdge err = (NonManifoldEdge) validationError; - assertEquals("_Simple_BD.1_Geom1", err.getGeometryId()); - assertFalse(err.getEdges().isEmpty()); - List<Edge> edges = err.getEdges(); - Edge edge = edges.get(0); - DirectPosition from = edge.getFrom(); - assertEquals(10.0, from.getValue().get(0), 0.000001); - assertEquals(11.0, edge.getTo().getValue().get(0), 0.000001); - } - - @Test - void testReadingSolidNotClosedError() - throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { - CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_SolidNotClosed.gml"); - - List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember(); - CityObjectMember com = cityObjectMember.get(0); - AbstractCityObject aco = com.getCityObject(); - Building b = (Building) aco; - - List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject(); - ADEComponent resultComp = gen.get(0); - ValidationResult result = (ValidationResult) resultComp; - assertEquals(ResultType.ERROR, result.getResult()); - assertFalse(result.getErrors().isEmpty()); - List<ValidationError> errors = result.getErrors(); - ValidationError validationError = errors.get(0); - - assertTrue(validationError instanceof SolidNotClosed); - SolidNotClosed err = (SolidNotClosed) validationError; - assertEquals("_Simple_BD.1_Geom1", err.getGeometryId()); - assertFalse(err.getEdges().isEmpty()); - List<Edge> edges = err.getEdges(); - Edge edge = edges.get(0); - DirectPosition from = edge.getFrom(); - assertEquals(10.0, from.getValue().get(0), 0.000001); - assertEquals(11.0, edge.getTo().getValue().get(0), 0.000001); - } - @Test - void testReadingTooFewPolygonsError() - throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { - CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_TooFewPolygons.gml"); - - List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember(); - CityObjectMember com = cityObjectMember.get(0); - AbstractCityObject aco = com.getCityObject(); - Building b = (Building) aco; - - List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject(); - ADEComponent resultComp = gen.get(0); - ValidationResult result = (ValidationResult) resultComp; - assertEquals(ResultType.ERROR, result.getResult()); - assertFalse(result.getErrors().isEmpty()); - List<ValidationError> errors = result.getErrors(); - ValidationError validationError = errors.get(0); - - assertTrue(validationError instanceof TooFewPolygons); - TooFewPolygons err = (TooFewPolygons) validationError; - assertEquals("_Simple_BD.1_Geom1", err.getGeometryId()); - } - - @Test - void testReadingMultipleConnectedComponentsError() - throws ADEException, CityGMLBuilderException, CityGMLReadException, FileNotFoundException { - CityModel cityModel = readCityGml("src/test/resources/SimpleSolid_MultipleConnectedComponents.gml"); - - List<CityObjectMember> cityObjectMember = cityModel.getCityObjectMember(); - CityObjectMember com = cityObjectMember.get(0); - AbstractCityObject aco = com.getCityObject(); - Building b = (Building) aco; - - List<ADEComponent> gen = b.getGenericApplicationPropertyOfCityObject(); - ADEComponent resultComp = gen.get(0); - ValidationResult result = (ValidationResult) resultComp; - assertEquals(ResultType.ERROR, result.getResult()); - assertFalse(result.getErrors().isEmpty()); - List<ValidationError> errors = result.getErrors(); - ValidationError validationError = errors.get(0); - - assertTrue(validationError instanceof MultipleConnectedComponents); - MultipleConnectedComponents err = (MultipleConnectedComponents) validationError; - assertEquals("_Simple_BD.1_Geom1", err.getGeometryId()); - assertEquals("_Simple_BD.1_PG.1", err.getComponents().get(0).getPolygonIds().get(0)); - assertEquals("_Simple_BD.1_PG.2", err.getComponents().get(0).getPolygonIds().get(1)); - assertEquals("_Simple_BD.1_PG.3", err.getComponents().get(1).getPolygonIds().get(0)); - assertEquals("_Simple_BD.1_PG.4", err.getComponents().get(1).getPolygonIds().get(1)); - } - - @Test - void testWritingAttributeMissingError() - throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { - CityModel model = new CityModel(); - Building b = new Building(); - model.getCityObjectMember().add(new CityObjectMember(b)); - - ValidationResult result = new ValidationResult(); - result.setResult(ResultType.ERROR); - b.addGenericApplicationPropertyOfCityObject(result); - AttributeMissing error = new AttributeMissing(); - error.setAttributeName("TestName"); - error.setChildId("TestId"); - error.setGeneric(true); - result.getErrors().add(error); - byte[] gml = writeCityGml(model); - model = readCityGml(gml); - - AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject(); - List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject(); - ADEComponent adeComponent = ades.get(0); - ValidationResult valRes = (ValidationResult) adeComponent; - assertEquals(ResultType.ERROR, valRes.getResult()); - - ValidationError valError = valRes.getErrors().get(0); - AttributeMissing error2 = (AttributeMissing) valError; - assertEquals(error.getAttributeName(), error2.getAttributeName()); - assertEquals(error.getChildId(), error2.getChildId()); - assertEquals(error.isGeneric(), error2.isGeneric()); + void testConsecutivePointsSameError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + ConsecutivePointsSameError err = new ConsecutivePointsSameError(); + err.setLinearRingId("ringId"); + err.setVertex1(new DirectPosition(1, 2, 3)); + err.setVertex2(new DirectPosition(5, 6, 7)); + res.getErrors().add(new AbstractErrorProperty(err)); + + byte[] buf = writeModel(model); + assertTrue(validate(new ByteArrayInputStream(buf))); } - + @Test - void testWritingAttributeWrongValueError() - throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { - CityModel model = new CityModel(); - Building b = new Building(); - model.getCityObjectMember().add(new CityObjectMember(b)); - - ValidationResult result = new ValidationResult(); - result.setResult(ResultType.ERROR); - b.addGenericApplicationPropertyOfCityObject(result); - AttributeWrongValue error = new AttributeWrongValue(); - error.setAttributeName("TestName"); - error.setChildId("TestId"); - error.setGeneric(true); - result.getErrors().add(error); - byte[] gml = writeCityGml(model); - model = readCityGml(gml); - - AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject(); - List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject(); - ADEComponent adeComponent = ades.get(0); - ValidationResult valRes = (ValidationResult) adeComponent; - assertEquals(ResultType.ERROR, valRes.getResult()); - - ValidationError valError = valRes.getErrors().get(0); - AttributeWrongValue error2 = (AttributeWrongValue) valError; - assertEquals(error.getAttributeName(), error2.getAttributeName()); - assertEquals(error.getChildId(), error2.getChildId()); - assertEquals(error.isGeneric(), error2.isGeneric()); + void testHoleOutsideError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + HoleOutsideError err = new HoleOutsideError(); + err.setLinearRingId("ringId"); + err.setPolygonId("polyId"); + res.getErrors().add(new AbstractErrorProperty(err)); + + byte[] buf = writeModel(model); + assertTrue(validate(new ByteArrayInputStream(buf))); } - + @Test - void testWritingMultipleConnectedComponentsError() - throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { - CityModel model = new CityModel(); - Building b = new Building(); - model.getCityObjectMember().add(new CityObjectMember(b)); - - ValidationResult result = new ValidationResult(); - result.setResult(ResultType.ERROR); - b.addGenericApplicationPropertyOfCityObject(result); - MultipleConnectedComponents error = new MultipleConnectedComponents(); - error.setGeometryId("TestGeometry"); - Component c1 = new Component(); - c1.getPolygonIds().add("TestPoly"); - error.getComponents().add(c1); - result.getErrors().add(error); - - byte[] gml = writeCityGml(model); - model = readCityGml(gml); - - AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject(); - List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject(); - ADEComponent adeComponent = ades.get(0); - ValidationResult valRes = (ValidationResult) adeComponent; - assertEquals(ResultType.ERROR, valRes.getResult()); - - ValidationError valError = valRes.getErrors().get(0); - MultipleConnectedComponents error2 = (MultipleConnectedComponents) valError; - assertEquals(error.getGeometryId(), error2.getGeometryId()); - assertEquals(error.getComponents().get(0).getPolygonIds().get(0), - error2.getComponents().get(0).getPolygonIds().get(0)); + void testInnerRingsNestedError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + InnerRingsNestedError err = new InnerRingsNestedError(); + err.setLinearRingId1("ringId1"); + err.setLinearRingId2("ringId2"); + err.setPolygonId("polyId"); + res.getErrors().add(new AbstractErrorProperty(err)); + + byte[] buf = writeModel(model); + assertTrue(validate(new ByteArrayInputStream(buf))); } - + @Test - void testWritingTooFewPolygonsError() - throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { - CityModel model = new CityModel(); - Building b = new Building(); - model.getCityObjectMember().add(new CityObjectMember(b)); - - ValidationResult result = new ValidationResult(); - result.setResult(ResultType.ERROR); - b.addGenericApplicationPropertyOfCityObject(result); - TooFewPolygons error = new TooFewPolygons(); - error.setGeometryId("TestGeometry"); - result.getErrors().add(error); - - byte[] gml = writeCityGml(model); - model = readCityGml(gml); - - AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject(); - List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject(); - ADEComponent adeComponent = ades.get(0); - ValidationResult valRes = (ValidationResult) adeComponent; - assertEquals(ResultType.ERROR, valRes.getResult()); - - ValidationError valError = valRes.getErrors().get(0); - TooFewPolygons error2 = (TooFewPolygons) valError; - assertEquals(error.getGeometryId(), error2.getGeometryId()); + void testInteriorDisconnectedError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + InteriorDisconnectedError err = new InteriorDisconnectedError(); + err.setPolygonId("polyId"); + res.getErrors().add(new AbstractErrorProperty(err)); + + byte[] buf = writeModel(model); + assertTrue(validate(new ByteArrayInputStream(buf))); } - + @Test - void testWritingSolidNotClosedError() - throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { - CityModel model = new CityModel(); - Building b = new Building(); - model.getCityObjectMember().add(new CityObjectMember(b)); - - ValidationResult result = new ValidationResult(); - result.setResult(ResultType.ERROR); - b.addGenericApplicationPropertyOfCityObject(result); - SolidNotClosed error = new SolidNotClosed(); - error.setGeometryId("TestGeometry"); - DirectPosition from = new DirectPosition(); - from.getValue().add(10.0); - DirectPosition to = new DirectPosition(); - to.getValue().add(11.0); - Edge e = new Edge(); - e.setFrom(from); - e.setTo(to); - error.getEdges().add(e); - result.getErrors().add(error); - - byte[] gml = writeCityGml(model); - model = readCityGml(gml); - - AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject(); - List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject(); - ADEComponent adeComponent = ades.get(0); - ValidationResult valRes = (ValidationResult) adeComponent; - assertEquals(ResultType.ERROR, valRes.getResult()); - - ValidationError valError = valRes.getErrors().get(0); - SolidNotClosed error2 = (SolidNotClosed) valError; - assertEquals(error.getGeometryId(), error2.getGeometryId()); - Edge edge = error.getEdges().get(0); - assertEquals(edge.getFrom().getValue().get(0), e.getFrom().getValue().get(0), 0.00001); - assertEquals(edge.getTo().getValue().get(0), e.getTo().getValue().get(0), 0.00001); + void testIntersectingRingsError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + IntersectingRingsError err = new IntersectingRingsError(); + err.setLinearRingId1("ringId1"); + err.setLinearRingId2("ringId2"); + err.setPolygonId("polyId"); + res.getErrors().add(new AbstractErrorProperty(err)); + + byte[] buf = writeModel(model); + assertTrue(validate(new ByteArrayInputStream(buf))); } - + @Test - void testWritingNonManifoldEdgeError() - throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { - CityModel model = new CityModel(); - Building b = new Building(); - model.getCityObjectMember().add(new CityObjectMember(b)); - - ValidationResult result = new ValidationResult(); - result.setResult(ResultType.ERROR); - b.addGenericApplicationPropertyOfCityObject(result); - NonManifoldEdge error = new NonManifoldEdge(); - error.setGeometryId("TestGeometry"); - DirectPosition from = new DirectPosition(); - from.getValue().add(10.0); - DirectPosition to = new DirectPosition(); - to.getValue().add(11.0); - Edge e = new Edge(); - e.setFrom(from); - e.setTo(to); - error.getEdges().add(e); - result.getErrors().add(error); - - byte[] gml = writeCityGml(model); - model = readCityGml(gml); - - AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject(); - List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject(); - ADEComponent adeComponent = ades.get(0); - ValidationResult valRes = (ValidationResult) adeComponent; - assertEquals(ResultType.ERROR, valRes.getResult()); - - ValidationError valError = valRes.getErrors().get(0); - NonManifoldEdge error2 = (NonManifoldEdge) valError; - assertEquals(error.getGeometryId(), error2.getGeometryId()); - Edge edge = error.getEdges().get(0); - assertEquals(edge.getFrom().getValue().get(0), e.getFrom().getValue().get(0), 0.00001); - assertEquals(edge.getTo().getValue().get(0), e.getTo().getValue().get(0), 0.00001); + void testMultipleComponentsError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + MultipleComponentsError err = new MultipleComponentsError(); + err.setGeometryId("geomId"); + ComponentList comp = new ComponentList(); + PolygonIdList polygons = new PolygonIdList(); + polygons.getPolygonIds().add("test1"); + polygons.getPolygonIds().add("test2"); + comp.getComponents().add(new PolygonIdListProperty(polygons)); + + err.getComponents().add(new ComponentListProperty(comp)); + + res.getErrors().add(new AbstractErrorProperty(err)); + + byte[] buf = writeModel(model); + assertTrue(validate(new ByteArrayInputStream(buf))); } - + @Test - void testWritingNonManifoldVertexError() - throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { - CityModel model = new CityModel(); - Building b = new Building(); - model.getCityObjectMember().add(new CityObjectMember(b)); - - ValidationResult result = new ValidationResult(); - result.setResult(ResultType.ERROR); - b.addGenericApplicationPropertyOfCityObject(result); - NonManifoldVertex error = new NonManifoldVertex(); - error.setGeometryId("TestGeometry"); - DirectPosition vertex = new DirectPosition(); - vertex.getValue().add(10.0); - error.setVertex(vertex); - result.getErrors().add(error); - - byte[] gml = writeCityGml(model); - model = readCityGml(gml); - - AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject(); - List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject(); - ADEComponent adeComponent = ades.get(0); - ValidationResult valRes = (ValidationResult) adeComponent; - assertEquals(ResultType.ERROR, valRes.getResult()); - - ValidationError valError = valRes.getErrors().get(0); - NonManifoldVertex error2 = (NonManifoldVertex) valError; - assertEquals(error.getGeometryId(), error2.getGeometryId()); - assertEquals(error.getVertex().getValue().get(0), error2.getVertex().getValue().get(0)); + void testNonManifoldEdgeError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + NonManifoldEdgeError err = new NonManifoldEdgeError(); + err.setGeometryId("geomId"); + EdgeList edges = new EdgeList(); + Edge edge = new Edge(); + edge.setFrom(new DirectPosition(1, 2, 3)); + edge.setTo(new DirectPosition(5, 6, 7)); + edges.getEdges().add(new EdgeProperty(edge)); + err.setEdges(new EdgeListProperty(edges)); + + res.getErrors().add(new AbstractErrorProperty(err)); + + byte[] buf = writeModel(model); + assertTrue(validate(new ByteArrayInputStream(buf))); } - + @Test - void testWritingPolygonWrongOrientationError() - throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { - CityModel model = new CityModel(); - Building b = new Building(); - model.getCityObjectMember().add(new CityObjectMember(b)); - - ValidationResult result = new ValidationResult(); - result.setResult(ResultType.ERROR); - b.addGenericApplicationPropertyOfCityObject(result); - PolygonWrongOrientation error = new PolygonWrongOrientation(); - error.setGeometryId("TestGeometry"); - DirectPosition from = new DirectPosition(); - from.getValue().add(10.0); - DirectPosition to = new DirectPosition(); - to.getValue().add(11.0); - Edge e = new Edge(); - e.setFrom(from); - e.setTo(to); - error.getEdges().add(e); - result.getErrors().add(error); - - byte[] gml = writeCityGml(model); - model = readCityGml(gml); - - AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject(); - List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject(); - ADEComponent adeComponent = ades.get(0); - ValidationResult valRes = (ValidationResult) adeComponent; - assertEquals(ResultType.ERROR, valRes.getResult()); - - ValidationError valError = valRes.getErrors().get(0); - PolygonWrongOrientation error2 = (PolygonWrongOrientation) valError; - assertEquals(error.getGeometryId(), error2.getGeometryId()); - Edge edge = error.getEdges().get(0); - assertEquals(edge.getFrom().getValue().get(0), e.getFrom().getValue().get(0), 0.00001); - assertEquals(edge.getTo().getValue().get(0), e.getTo().getValue().get(0), 0.00001); + void testNonManifoldVertexError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + NonManifoldVertexError err = new NonManifoldVertexError(); + err.setGeometryId("geomId"); + err.setVertex(new DirectPosition(1, 2, 3)); + res.getErrors().add(new AbstractErrorProperty(err)); + + byte[] buf = writeModel(model); + assertTrue(validate(new ByteArrayInputStream(buf))); } - + @Test - void testWritingAllPolygonsWrongOrientationError() - throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { - CityModel model = new CityModel(); - Building b = new Building(); - model.getCityObjectMember().add(new CityObjectMember(b)); - - ValidationResult result = new ValidationResult(); - result.setResult(ResultType.ERROR); - b.addGenericApplicationPropertyOfCityObject(result); - AllPolygonsWrongOrientation error = new AllPolygonsWrongOrientation(); - error.setGeometryId("TestGeometry"); - result.getErrors().add(error); - - byte[] gml = writeCityGml(model); - model = readCityGml(gml); - - AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject(); - List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject(); - ADEComponent adeComponent = ades.get(0); - ValidationResult valRes = (ValidationResult) adeComponent; - assertEquals(ResultType.ERROR, valRes.getResult()); - - ValidationError valError = valRes.getErrors().get(0); - AllPolygonsWrongOrientation error2 = (AllPolygonsWrongOrientation) valError; - assertEquals(error.getGeometryId(), error2.getGeometryId()); + void testOrientationRingsSameError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + OrientationRingsSameError err = new OrientationRingsSameError(); + err.setLinearRing("ring1"); + err.setPolygonId("polyId"); + res.getErrors().add(new AbstractErrorProperty(err)); + + byte[] buf = writeModel(model); + assertTrue(validate(new ByteArrayInputStream(buf))); } - + @Test - void testWritingOrientationRingsSameError() - throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { - CityModel model = new CityModel(); - Building b = new Building(); - model.getCityObjectMember().add(new CityObjectMember(b)); - - ValidationResult result = new ValidationResult(); - result.setResult(ResultType.ERROR); - b.addGenericApplicationPropertyOfCityObject(result); - OrientationRingsSame error = new OrientationRingsSame(); - error.setPolygonId("TestPolygon"); - error.setLinearRingId("TestRing"); - result.getErrors().add(error); - - byte[] gml = writeCityGml(model); - model = readCityGml(gml); - - AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject(); - List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject(); - ADEComponent adeComponent = ades.get(0); - ValidationResult valRes = (ValidationResult) adeComponent; - assertEquals(ResultType.ERROR, valRes.getResult()); - - ValidationError valError = valRes.getErrors().get(0); - OrientationRingsSame error2 = (OrientationRingsSame) valError; - assertEquals(error.getPolygonId(), error2.getPolygonId()); - assertEquals(error.getLinearRingId(), error2.getLinearRingId()); + void testPlanarDistancePlaneError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + PlanarDistancePlaneError err = new PlanarDistancePlaneError(); + err.setPolygonId("polyId"); + err.setDistance(new Length(5d, "m")); + err.setVertex(new DirectPosition(1, 2, 3)); + res.getErrors().add(new AbstractErrorProperty(err)); + + byte[] buf = writeModel(model); + assertTrue(validate(new ByteArrayInputStream(buf))); } - + @Test - void testWritingNonPlanarNormalsDeviationError() - throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { - CityModel model = new CityModel(); - Building b = new Building(); - model.getCityObjectMember().add(new CityObjectMember(b)); - - ValidationResult result = new ValidationResult(); - result.setResult(ResultType.ERROR); - b.addGenericApplicationPropertyOfCityObject(result); - NonPlanarNormalsDeviation error = new NonPlanarNormalsDeviation(); - error.setPolygonId("TestPolygon"); - Angle deviation = new Angle(); - deviation.setValue(1.0); - deviation.setUom("deg"); - error.setDeviation(deviation); - result.getErrors().add(error); - - byte[] gml = writeCityGml(model); - model = readCityGml(gml); - - AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject(); - List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject(); - ADEComponent adeComponent = ades.get(0); - ValidationResult valRes = (ValidationResult) adeComponent; - assertEquals(ResultType.ERROR, valRes.getResult()); - - ValidationError valError = valRes.getErrors().get(0); - NonPlanarNormalsDeviation error2 = (NonPlanarNormalsDeviation) valError; - assertEquals(error.getPolygonId(), error2.getPolygonId()); - assertEquals(error.getDeviation().getValue(), error2.getDeviation().getValue()); - assertEquals(error.getDeviation().getUom(), error2.getDeviation().getUom()); + void testPlanarNormalsDeviationError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + PlanarNormalsDeviationError err = new PlanarNormalsDeviationError(); + err.setPolygonId("polyId"); + err.setDeviation(new Angle(5d, "deg")); + res.getErrors().add(new AbstractErrorProperty(err)); + + byte[] buf = writeModel(model); + assertTrue(validate(new ByteArrayInputStream(buf))); } - + @Test - void testWritingHoleOutsideError() - throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { - CityModel model = new CityModel(); - Building b = new Building(); - model.getCityObjectMember().add(new CityObjectMember(b)); - - ValidationResult result = new ValidationResult(); - result.setResult(ResultType.ERROR); - b.addGenericApplicationPropertyOfCityObject(result); - HoleOutside error = new HoleOutside(); - error.setPolygonId("TestPolygon"); - error.setLinearRingId("TestRing1"); - result.getErrors().add(error); - - byte[] gml = writeCityGml(model); - model = readCityGml(gml); - - AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject(); - List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject(); - ADEComponent adeComponent = ades.get(0); - ValidationResult valRes = (ValidationResult) adeComponent; - assertEquals(ResultType.ERROR, valRes.getResult()); - - ValidationError valError = valRes.getErrors().get(0); - HoleOutside error2 = (HoleOutside) valError; - assertEquals(error.getPolygonId(), error2.getPolygonId()); - assertEquals(error.getLinearRingId(), error2.getLinearRingId()); + void testPolygonWrongOrientationError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + PolygonWrongOrientationError err = new PolygonWrongOrientationError(); + err.setGeometryId("geomId"); + EdgeList edges = new EdgeList(); + Edge edge = new Edge(); + edge.setFrom(new DirectPosition(1, 2, 3)); + edge.setTo(new DirectPosition(5, 6, 7)); + edges.getEdges().add(new EdgeProperty(edge)); + err.setEdges(new EdgeListProperty(edges)); + res.getErrors().add(new AbstractErrorProperty(err)); + + byte[] buf = writeModel(model); + assertTrue(validate(new ByteArrayInputStream(buf))); } - + @Test - void testWritingInnerRingsNestedError() - throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { - CityModel model = new CityModel(); - Building b = new Building(); - model.getCityObjectMember().add(new CityObjectMember(b)); - - ValidationResult result = new ValidationResult(); - result.setResult(ResultType.ERROR); - b.addGenericApplicationPropertyOfCityObject(result); - InnerRingsNested error = new InnerRingsNested(); - error.setPolygonId("TestPolygon"); - error.setLinearRingId1("TestRing1"); - error.setLinearRingId2("TestRing2"); - result.getErrors().add(error); - - byte[] gml = writeCityGml(model); - model = readCityGml(gml); - - AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject(); - List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject(); - ADEComponent adeComponent = ades.get(0); - ValidationResult valRes = (ValidationResult) adeComponent; - assertEquals(ResultType.ERROR, valRes.getResult()); - - ValidationError valError = valRes.getErrors().get(0); - InnerRingsNested error2 = (InnerRingsNested) valError; - assertEquals(error.getPolygonId(), error2.getPolygonId()); - assertEquals(error.getLinearRingId1(), error2.getLinearRingId1()); - assertEquals(error.getLinearRingId2(), error2.getLinearRingId2()); + void testRingNotClosedError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + RingNotClosedError err = new RingNotClosedError(); + err.setLinearRingId("ringId"); + res.getErrors().add(new AbstractErrorProperty(err)); + + byte[] buf = writeModel(model); + assertTrue(validate(new ByteArrayInputStream(buf))); } - + @Test - void testWritingNonPlanarDistancePlaneError() - throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { - CityModel model = new CityModel(); - Building b = new Building(); - model.getCityObjectMember().add(new CityObjectMember(b)); - - ValidationResult result = new ValidationResult(); - result.setResult(ResultType.ERROR); - b.addGenericApplicationPropertyOfCityObject(result); - NonPlanarDistancePlane error = new NonPlanarDistancePlane(); - error.setPolygonId("TestPolygon"); - DirectPosition vertex = new DirectPosition(); - vertex.getValue().add(1.0); - error.setVertex(vertex); - Length distance = new Length(0.1); - distance.setUom("m"); - error.setDistance(distance); - result.getErrors().add(error); - - byte[] gml = writeCityGml(model); - model = readCityGml(gml); - - AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject(); - List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject(); - ADEComponent adeComponent = ades.get(0); - ValidationResult valRes = (ValidationResult) adeComponent; - assertEquals(ResultType.ERROR, valRes.getResult()); - - ValidationError valError = valRes.getErrors().get(0); - NonPlanarDistancePlane error2 = (NonPlanarDistancePlane) valError; - assertEquals(error.getPolygonId(), error2.getPolygonId()); - assertEquals(error.getVertex().getValue().get(0), error2.getVertex().getValue().get(0), 0.00001); - assertEquals(error.getDistance().getValue(), error2.getDistance().getValue(), 0.00001); + void testRingSelfIntersectionError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + RingSelfIntersectionError err = new RingSelfIntersectionError(); + err.setLinearRingId("ringId"); + Edge edge = new Edge(); + edge.setFrom(new DirectPosition(1, 2, 3)); + edge.setTo(new DirectPosition(5, 6, 7)); + err.setEdge1(new EdgeProperty(edge)); + err.setEdge2(new EdgeProperty(edge)); + err.setType(RingSelfIntType.EDGE_INTERSECTS_EDGE); + err.setVertex1(new DirectPosition(1, 2, 3)); + res.getErrors().add(new AbstractErrorProperty(err)); + + byte[] buf = writeModel(model); + assertTrue(validate(new ByteArrayInputStream(buf))); } - + @Test - void testWritingIntersectingRingsError() - throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { - CityModel model = new CityModel(); - Building b = new Building(); - model.getCityObjectMember().add(new CityObjectMember(b)); - - ValidationResult result = new ValidationResult(); - result.setResult(ResultType.ERROR); - b.addGenericApplicationPropertyOfCityObject(result); - IntersectingRings error = new IntersectingRings(); - error.setPolygonId("TestPolygon"); - error.setLinearRingId1("TestRing1"); - error.setLinearRingId2("TestRing2"); - result.getErrors().add(error); - - byte[] gml = writeCityGml(model); - model = readCityGml(gml); - - AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject(); - List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject(); - ADEComponent adeComponent = ades.get(0); - ValidationResult valRes = (ValidationResult) adeComponent; - assertEquals(ResultType.ERROR, valRes.getResult()); - - ValidationError valError = valRes.getErrors().get(0); - IntersectingRings error2 = (IntersectingRings) valError; - assertEquals(error.getPolygonId(), error2.getPolygonId()); - assertEquals(error.getLinearRingId1(), error2.getLinearRingId1()); - assertEquals(error.getLinearRingId2(), error2.getLinearRingId2()); + void testRingTooFewPointsError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + RingTooFewPointsError err = new RingTooFewPointsError(); + err.setLinearRingId("ringId"); + res.getErrors().add(new AbstractErrorProperty(err)); + + byte[] buf = writeModel(model); + assertTrue(validate(new ByteArrayInputStream(buf))); } - + @Test - void testWritingInteriorDisconnectedError() - throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { - CityModel model = new CityModel(); - Building b = new Building(); - model.getCityObjectMember().add(new CityObjectMember(b)); - - ValidationResult result = new ValidationResult(); - result.setResult(ResultType.ERROR); - b.addGenericApplicationPropertyOfCityObject(result); - InteriorDisconnected error = new InteriorDisconnected(); - error.setPolygonId("TestPolygon"); - result.getErrors().add(error); - - byte[] gml = writeCityGml(model); - model = readCityGml(gml); - - AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject(); - List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject(); - ADEComponent adeComponent = ades.get(0); - ValidationResult valRes = (ValidationResult) adeComponent; - assertEquals(ResultType.ERROR, valRes.getResult()); - - ValidationError valError = valRes.getErrors().get(0); - InteriorDisconnected error2 = (InteriorDisconnected) valError; - assertEquals(error.getPolygonId(), error2.getPolygonId()); + void testSemanticAttributeMissingError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + SemanticAttributeMissingError err = new SemanticAttributeMissingError(); + 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 testWritingRingNotClosedError() - throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { - CityModel model = new CityModel(); - Building b = new Building(); - model.getCityObjectMember().add(new CityObjectMember(b)); - - ValidationResult result = new ValidationResult(); - result.setResult(ResultType.ERROR); - b.addGenericApplicationPropertyOfCityObject(result); - RingNotClosed error = new RingNotClosed(); - error.setLinearRingId("TestRing"); - result.getErrors().add(error); - - byte[] gml = writeCityGml(model); - model = readCityGml(gml); - - AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject(); - List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject(); - ADEComponent adeComponent = ades.get(0); - ValidationResult valRes = (ValidationResult) adeComponent; - assertEquals(ResultType.ERROR, valRes.getResult()); - - ValidationError valError = valRes.getErrors().get(0); - RingNotClosed error2 = (RingNotClosed) valError; - assertEquals(error.getLinearRingId(), error2.getLinearRingId()); + void testSemanticAttributeWrongValueError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + 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 testWritingTooFewPointsError() - throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { - CityModel model = new CityModel(); - Building b = new Building(); - model.getCityObjectMember().add(new CityObjectMember(b)); - - ValidationResult result = new ValidationResult(); - result.setResult(ResultType.ERROR); - b.addGenericApplicationPropertyOfCityObject(result); - TooFewPoints error = new TooFewPoints(); - error.setLinearRingId("TestRing"); - result.getErrors().add(error); - - byte[] gml = writeCityGml(model); - model = readCityGml(gml); - - AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject(); - List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject(); - ADEComponent adeComponent = ades.get(0); - ValidationResult valRes = (ValidationResult) adeComponent; - assertEquals(ResultType.ERROR, valRes.getResult()); - - ValidationError valError = valRes.getErrors().get(0); - TooFewPoints error2 = (TooFewPoints) valError; - assertEquals(error.getLinearRingId(), error2.getLinearRingId()); + void testSolidNotClosedError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + SolidNotClosedError err = new SolidNotClosedError(); + err.setGeometryId("geomId"); + EdgeList edges = new EdgeList(); + Edge edge = new Edge(); + edge.setFrom(new DirectPosition(1, 2, 3)); + edge.setTo(new DirectPosition(5, 6, 7)); + edges.getEdges().add(new EdgeProperty(edge)); + err.setEdges(new EdgeListProperty(edges)); + res.getErrors().add(new AbstractErrorProperty(err)); + + byte[] buf = writeModel(model); + assertTrue(validate(new ByteArrayInputStream(buf))); } - + @Test - void testWritingConsecutiveSameError() - throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { - CityModel model = new CityModel(); - Building b = new Building(); - model.getCityObjectMember().add(new CityObjectMember(b)); - - ValidationResult result = new ValidationResult(); - result.setResult(ResultType.ERROR); - b.addGenericApplicationPropertyOfCityObject(result); - - ConsecutivePointsSame error = new ConsecutivePointsSame(); - error.setLinearRingId("TestRing"); - DirectPosition vertex1 = new DirectPosition(); - vertex1.getValue().add(10.0); - vertex1.getValue().add(5.0); - vertex1.getValue().add(7.0); - error.setVertex1(vertex1); - DirectPosition vertex2 = new DirectPosition(); - vertex2.getValue().add(15.0); - vertex2.getValue().add(55.0); - vertex2.getValue().add(71.0); - error.setVertex2(vertex2); - result.getErrors().add(error); - - byte[] gml = writeCityGml(model); - model = readCityGml(gml); - - AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject(); - List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject(); - ADEComponent adeComponent = ades.get(0); - ValidationResult valRes = (ValidationResult) adeComponent; - assertEquals(ResultType.ERROR, valRes.getResult()); - - ValidationError valError = valRes.getErrors().get(0); - ConsecutivePointsSame error2 = (ConsecutivePointsSame) valError; - assertEquals(error.getLinearRingId(), error2.getLinearRingId()); - assertEquals(error.getVertex1().getValue().get(0), error2.getVertex1().getValue().get(0)); - assertEquals(error.getVertex2().getValue().get(0), error2.getVertex2().getValue().get(0)); + void testSolidSelfIntersectionError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + SolidSelfIntersectionError err = new SolidSelfIntersectionError(); + err.setGeometryId("geomId"); + err.setPolygonId1("poly1"); + err.setPolygonId2("poly2"); + res.getErrors().add(new AbstractErrorProperty(err)); + + byte[] buf = writeModel(model); + assertTrue(validate(new ByteArrayInputStream(buf))); } - + @Test - void testWritingRingSelfIntersection() - throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { - CityModel model = new CityModel(); - Building b = new Building(); - model.getCityObjectMember().add(new CityObjectMember(b)); - - ValidationResult result = new ValidationResult(); - result.setResult(ResultType.ERROR); - b.addGenericApplicationPropertyOfCityObject(result); - - RingSelfIntersection error = new RingSelfIntersection(); - error.setType(RingSelfIntType.DUPLICATE_POINT); - error.setLinearRingId("TestRing"); - DirectPosition vertex1 = new DirectPosition(); - vertex1.getValue().add(10.0); - vertex1.getValue().add(5.0); - vertex1.getValue().add(7.0); - error.setVertex1(vertex1); - DirectPosition vertex2 = new DirectPosition(); - vertex2.getValue().add(15.0); - vertex2.getValue().add(55.0); - vertex2.getValue().add(71.0); - error.setVertex2(vertex2); - result.getErrors().add(error); - - byte[] gml = writeCityGml(model); - model = readCityGml(gml); - - AbstractCityObject co = model.getCityObjectMember().get(0).getCityObject(); - List<ADEComponent> ades = co.getGenericApplicationPropertyOfCityObject(); - ADEComponent adeComponent = ades.get(0); - ValidationResult valRes = (ValidationResult) adeComponent; - assertEquals(ResultType.ERROR, valRes.getResult()); - - ValidationError valError = valRes.getErrors().get(0); - RingSelfIntersection error2 = (RingSelfIntersection) valError; - assertEquals(error.getLinearRingId(), error2.getLinearRingId()); - assertEquals(error.getVertex1().getValue().get(0), error2.getVertex1().getValue().get(0)); - assertEquals(error.getVertex2().getValue().get(0), error2.getVertex2().getValue().get(0)); + void testSolidTooFewPolygonsError() throws ADEException, CityGMLContextException, CityGMLWriteException, SAXException, IOException, SchemaHandlerException { + CityModel model = new CityModel(); + ValidationResult res = fillCityModel(model); + + SolidTooFewPolygonsError err = new SolidTooFewPolygonsError(); + err.setGeometryId("geomId"); + res.getErrors().add(new AbstractErrorProperty(err)); + + byte[] buf = writeModel(model); + assertTrue(validate(new ByteArrayInputStream(buf))); } + + + + private boolean validate(InputStream stream) throws SAXException, IOException, CityGMLContextException, SchemaHandlerException { - @Test - void testWritingValidationPlan() - throws ADEException, CityGMLBuilderException, CityGMLWriteException, CityGMLReadException { - CityModel model = new CityModel(); - Validation val = new Validation(); - model.addGenericApplicationPropertyOfCityModel(val); - - ZonedDateTime expectedDate = LocalDateTime.of(2002, 5, 30, 9, 0).atZone(ZoneId.systemDefault()); - - val.setValidationDate(expectedDate); - val.setValidationSoftware("CityDoctor2"); - ValidationPlan plan = new ValidationPlan(); - val.setValidationPlan(plan); - - Parameter roundingParameter = new Parameter(); - roundingParameter.setName("numberOfRoundingPlaces"); - roundingParameter.setValue("8"); - plan.getGlobalParameters().add(roundingParameter); - - Parameter minVertexDistance = new Parameter(); - minVertexDistance.setName("minVertexDistance"); - minVertexDistance.setValue("0.0001"); - minVertexDistance.setUom("m"); - plan.getGlobalParameters().add(minVertexDistance); - - Requirement rTooFewPoints = new Requirement(); - rTooFewPoints.setEnabled(true); - rTooFewPoints.setName(RequirementId.R_GE_R_TOO_FEW_POINTS); - plan.getRequirements().add(rTooFewPoints); - - Checking buildingChecking = new Checking(); - buildingChecking.setValue(TopLevelFeatureType.BUILDING); - plan.getFilter().add(buildingChecking); - - Statistics statistics = new Statistics(); - val.setStatistics(statistics); - - FeatureStatistics numErrorBridgeObjects = new FeatureStatistics(); - numErrorBridgeObjects.setNumChecked(0); - numErrorBridgeObjects.setNumErrors(0); - statistics.setNumErrorBridgeObjects(numErrorBridgeObjects); - - FeatureStatistics numErrorBuildings = new FeatureStatistics(); - numErrorBuildings.setNumChecked(1); - numErrorBuildings.setNumErrors(1); - statistics.setNumErrorBuildings(numErrorBuildings); - - FeatureStatistics numErrors = new FeatureStatistics(); - statistics.setNumErrorLandObjects(numErrors); - statistics.setNumErrorTransportation(numErrors); - statistics.setNumErrorVegetation(numErrors); - statistics.setNumErrorWaterObjects(numErrors); + CityGMLContext context = CityGMLContext.newInstance(); - ErrorStatistics stats1 = new ErrorStatistics(); - stats1.setAmount(1); - stats1.setName(ErrorId.GE_R_CONSECUTIVE_POINTS_SAME); - statistics.getErrorStatistics().add(stats1); + CityGMLSchemaHandler schemaHandler = context.getDefaultSchemaHandler(); + Source[] schemas = schemaHandler.getSchemas(); - byte[] gml = writeCityGml(model); - model = readCityGml(gml); + SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + Schema schema = schemaFactory.newSchema(schemas); - testValidationPlan(model); - } + Validator validator = schema.newValidator(); + boolean[] foundErrors = new boolean[1]; + foundErrors[0] = false; - private CityModel readCityGml(InputStream input) - throws ADEException, CityGMLBuilderException, CityGMLReadException { - CityGMLContext context = CityGMLContext.getInstance(); - List<ADEContext> adeContexts = context.getADEContexts(); - if (adeContexts.isEmpty()) { - for (ADEContext adeContext : ServiceLoader.load(ADEContext.class)) { - context.registerADEContext(adeContext); - } + validator.setErrorHandler(new ErrorHandler() { + @Override + public void error(SAXParseException exception) { + String message = "[" + exception.getLineNumber() + ", " + exception.getColumnNumber() + "] " + + exception.getMessage(); + System.out.println(message); + foundErrors[0] = true; } - CityGMLBuilder builder = context.createCityGMLBuilder(); - CityGMLInputFactory in = builder.createCityGMLInputFactory(); - in.setProperty(CityGMLInputFactory.USE_VALIDATION, true); - in.setProperty(CityGMLInputFactory.FEATURE_READ_MODE, FeatureReadMode.NO_SPLIT); - in.setValidationEventHandler(event -> { - System.out.print( - "[" + event.getLocator().getLineNumber() + "," + event.getLocator().getColumnNumber() + "] "); - System.out.println(event.getMessage()); - throw new IllegalStateException(event.getLinkedException()); - }); - try (CityGMLReader reader = in.createCityGMLReader("?", input)) { - while (reader.hasNext()) { - CityGML nextFeature = reader.nextFeature(); - if (nextFeature instanceof CityModel) { - return (CityModel) nextFeature; - } + @Override + public void warning(SAXParseException exception) { + error(exception); } - } - throw new IllegalStateException("No CityModel found in GML file"); - } - private CityModel readCityGml(File f) - throws FileNotFoundException, ADEException, CityGMLBuilderException, CityGMLReadException { - return readCityGml(new FileInputStream(f)); - } + @Override + public void fatalError(SAXParseException exception) { + error(exception); + } + }); - private CityModel readCityGml(String fileName) - throws FileNotFoundException, ADEException, CityGMLBuilderException, CityGMLReadException { - return readCityGml(new File(fileName)); - } + Path file = Paths.get("test.gml"); - private CityModel readCityGml(byte[] bytes) throws ADEException, CityGMLBuilderException, CityGMLReadException { - return readCityGml(new ByteArrayInputStream(bytes)); + validator.validate(new StreamSource(file.toFile())); + return !foundErrors[0]; } + - private void testValidationPlan(CityModel cityModel) { - assertFalse(cityModel.getGenericApplicationPropertyOfCityModel().isEmpty()); - List<ADEComponent> ades = cityModel.getGenericApplicationPropertyOfCityModel(); - ADEComponent adeComponent = ades.get(0); - assertTrue(adeComponent instanceof Validation); - Validation val = (Validation) adeComponent; - ZonedDateTime expectedDate = LocalDateTime.of(2002, 5, 30, 9, 0).atZone(ZoneId.systemDefault()); - assertTrue(expectedDate.isEqual(val.getValidationDate())); - assertEquals("CityDoctor2", val.getValidationSoftware()); - assertNotNull(val.getValidationPlan()); - ValidationPlan plan = val.getValidationPlan(); - assertNotNull(plan.getGlobalParameters()); - assertFalse(plan.getGlobalParameters().isEmpty()); - List<Parameter> globalParameters = plan.getGlobalParameters(); - Parameter roundingParameter = globalParameters.get(0); - assertEquals("numberOfRoundingPlaces", roundingParameter.getName()); - assertEquals("8", roundingParameter.getValue()); - assertNull(roundingParameter.getUom()); - Parameter minVertexDistance = globalParameters.get(1); - assertEquals("minVertexDistance", minVertexDistance.getName()); - assertEquals("0.0001", minVertexDistance.getValue()); - assertEquals("m", minVertexDistance.getUom()); - - assertNotNull(plan.getRequirements()); - assertFalse(plan.getRequirements().isEmpty()); - - List<Requirement> requirements = plan.getRequirements(); - Requirement rTooFewPoints = requirements.get(0); - assertEquals(RequirementId.R_GE_R_TOO_FEW_POINTS, rTooFewPoints.getName()); - assertTrue(rTooFewPoints.isEnabled()); - - assertNotNull(plan.getFilter()); - assertFalse(plan.getFilter().isEmpty()); - - List<Checking> filter = plan.getFilter(); - Checking buildingChecking = filter.get(0); - assertEquals(TopLevelFeatureType.BUILDING, buildingChecking.getValue()); - - Statistics statistics = val.getStatistics(); - assertNotNull(statistics); - FeatureStatistics numErrorBridgeObjects = statistics.getNumErrorBridgeObjects(); - assertNotNull(numErrorBridgeObjects); - assertEquals(0, numErrorBridgeObjects.getNumChecked()); - assertEquals(0, numErrorBridgeObjects.getNumErrors()); - - FeatureStatistics numErrorBuildings = statistics.getNumErrorBuildings(); - assertEquals(1, numErrorBuildings.getNumChecked()); - assertEquals(1, numErrorBuildings.getNumErrors()); + private byte[] writeModel(CityModel model) throws ADEException, CityGMLContextException, CityGMLWriteException { - List<ErrorStatistics> errorStatistics = statistics.getErrorStatistics(); - assertNotNull(errorStatistics); - assertFalse(errorStatistics.isEmpty()); - ErrorStatistics stats1 = errorStatistics.get(0); - assertEquals(ErrorId.GE_R_CONSECUTIVE_POINTS_SAME, stats1.getName()); - assertEquals(1, stats1.getAmount()); + CityGMLContext context = CityGMLContext.newInstance(); + CityGMLVersion version = CityGMLVersion.v2_0; + CityGMLOutputFactory out = context.createCityGMLOutputFactory(version); + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + try (CityGMLWriter writer = out.createCityGMLWriter(outStream, StandardCharsets.UTF_8.name())) { + writer.withIndent(" ") + .withSchemaLocation(QualityADEModule.NAMESPACE_URI, getClass().getResource("/qualityAde.xsd").toString()) + .withDefaultPrefixes() + .withDefaultNamespace(CoreModule.of(version).getNamespaceURI()) + .write(model); + } + return outStream.toByteArray(); } - private byte[] writeCityGml(CityModel model) throws ADEException, CityGMLBuilderException, CityGMLWriteException { - CityGMLContext context = CityGMLContext.getInstance(); - List<ADEContext> adeContexts = context.getADEContexts(); - if (adeContexts == null || adeContexts.isEmpty()) { - for (ADEContext adeContext : ServiceLoader.load(ADEContext.class)) { - context.registerADEContext(adeContext); - } - } + private ValidationResult fillCityModel(CityModel model) { + Validation v = new Validation(); + v.setId("planId"); + model.getFeatureMembers().add(new AbstractFeatureProperty(v)); + v.setValidationSoftware("testSoftware"); + v.setValidationDate(ZonedDateTime.now()); + ValidationPlan plan = new ValidationPlan(); + + Statistics stats = new Statistics(); + FeatureStatistics fStats = new FeatureStatistics(); + fStats.setNumChecked(5); + fStats.setNumErrors(2); + stats.setNumErrorBridgeObjects(new FeatureStatisticsProperty(fStats)); + v.setStatistics(new StatisticsProperty(stats)); + + Requirement req = new Requirement(); + req.setEnabled(true); + req.setRequirementType(RequirementId.R_GE_P_HOLE_OUTSIDE); + plan.getRequirements().add(new RequirementProperty(req)); - CityGMLBuilder builder = context.createCityGMLBuilder(); + Checking checking = new Checking(); + checking.setFeatureType(TopLevelFeatureType.BRIDGE); + + Filter filter = new Filter(); + filter.getChecking().add(new CheckingProperty(checking)); + plan.setFilter(new FilterProperty(filter)); - CityGMLOutputFactory outputFactory = builder.createCityGMLOutputFactory(CityGMLVersion.DEFAULT); - ByteArrayOutputStream out = new ByteArrayOutputStream(); - try (CityGMLWriter writer = outputFactory.createCityGMLWriter(out)) { - writer.setIndentString(" "); - writer.setPrefixes(CityGMLVersion.DEFAULT); - writer.setPrefix("qual", QualityADEModule.NAMESPACE_URI); - writer.setSchemaLocation(QualityADEModule.NAMESPACE_URI, - QualityADEModule.NAMESPACE_URI + "/qualityAdeOld.xsd"); - writer.setSchemaLocations(CityGMLVersion.DEFAULT); - writer.write(model); - return out.toByteArray(); - } - } */ + Parameter param = new Parameter(); + param.setName("test"); + param.setUom("uom"); + param.setValue("5"); + GlobalParameters globalParams = new GlobalParameters(); + globalParams.getParameters().add(new ParameterProperty(param)); + plan.setGlobalParameters(new GlobalParametersProperty(globalParams)); + v.setValidationPlan(new ValidationPlanProperty(plan)); + + + Building b = new Building(); + b.setId("testId"); + model.getCityObjectMembers().add(new AbstractCityObjectProperty(b)); + + CityObjectProperties props = new CityObjectProperties(); + b.addADEProperty(props); + ValidationResult res = new ValidationResult(); + props.setValidationResult(new ValidationResultProperty(res)); + res.setResultType(ResultType.ERROR); + res.setValidationPlanID(new Reference(v)); + return res; + } } diff --git a/citygml4j-quality-ade/src/test/resources/SimpleSolid_AllPolygonsWrongOrientation.gml b/citygml4j-quality-ade/src/test/resources/SimpleSolid_AllPolygonsWrongOrientation.gml deleted file mode 100644 index 0ef3a62b964b1cb63ee7ea7282c04e17591a93c7..0000000000000000000000000000000000000000 --- a/citygml4j-quality-ade/src/test/resources/SimpleSolid_AllPolygonsWrongOrientation.gml +++ /dev/null @@ -1,255 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3 https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3/qualityAde.xsd"> - -<!-- -Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m -Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), -die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert - -CityGML 2.0 - - -linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind. - -10.5.2017 -Author: V. Coors, HFT Stuttgart -Lizenz: ---> - - <core:cityObjectMember> - <bldg:Building gml:id="_Simple_BD.1"> - <qual:validationResult result="ERROR"> - <qual:GE_S_ALL_POLYGONS_WRONG_ORIENTATION> - <qual:geometryId>_Simple_BD.1_Geom1</qual:geometryId> - </qual:GE_S_ALL_POLYGONS_WRONG_ORIENTATION> - </qual:validationResult> - <bldg:lod2Solid> - <gml:Solid gml:id="_Simple_BD.1_Geom1"> - <gml:exterior> - <gml:CompositeSurface> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/> - </gml:CompositeSurface> - </gml:exterior> - </gml:Solid> - </bldg:lod2Solid> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.2"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1"> - <gml:posList srsDimension="3"> - 13.0 15.0 0.0 - 13.0 15.0 3.0 - 13.0 10.0 3.0 - 13.0 10.0 0.0 - 13.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.3"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1"> - <gml:posList srsDimension="3"> - 10.0 15.0 0.0 - 10.0 15.0 3.0 - 11.5 15.0 4.5 - 13.0 15.0 3.0 - 13.0 15.0 0.0 - 10.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.4"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 10.0 15.0 3.0 - 10.0 15.0 0.0 - 10.0 10.0 0.0 - 10.0 10.0 3.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.5"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1"> - <gml:posList srsDimension="3"> - 13.0 10.0 0.0 - 13.0 10.0 3.0 - 11.5 10.0 4.5 - 10.0 10.0 3.0 - 10.0 10.0 0.0 - 13.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.6"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 11.5 10.0 4.5 - 11.5 10.0 4.5 - 11.5 15.0 4.5 - 10.0 15.0 3.0 - 10.0 10.0 3.0 - - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.7"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1"> - <gml:posList srsDimension="3"> - 11.5 10.0 4.5 - 13.0 10.0 3.0 - 13.0 15.0 3.0 - 11.5 15.0 4.5 - 11.5 10.0 4.5 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:RoofSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.1"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 0.0 - 10.0 15.0 0.0 - 13.0 15.0 0.0 - 13.0 10.0 0.0 - 10.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:GroundSurface> - </bldg:boundedBy> - </bldg:Building> - </core:cityObjectMember> - <qual:validation> - <qual:validationDate>2002-05-30T09:00:00</qual:validationDate> - <qual:validationSoftware>CityDoctor2</qual:validationSoftware> - <qual:validationPlan> - <qual:globalParameters> - <qual:parameter name="numberOfRoundingPlaces">8</qual:parameter> - <qual:parameter name="minVertexDistance" uom="m">0.0001</qual:parameter> - <qual:parameter name="schematronFile"></qual:parameter> - </qual:globalParameters> - <qual:requirement name="R_GE_R_TOO_FEW_POINTS" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_R_CONSECUTIVE_POINTS_SAME" enabled="true"/> - <qual:requirement name="R_GE_R_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_P_NON_PLANAR" enabled="true"> - <qual:parameter name="type">distance</qual:parameter> - <qual:parameter name="distanceTolerance" uom="m">0.01</qual:parameter> - <qual:parameter name="angleTolerance" uom="deg">1</qual:parameter> - <qual:parameter name="degeneratedPolygonTolerance" uom="m">0.0000</qual:parameter> - </qual:requirement> - <qual:requirement name="R_GE_P_INTERIOR_DISCONNECTED" enabled="true"/> - <qual:requirement name="R_GE_P_INTERSECTING_RINGS" enabled="true"/> - <qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/> - <qual:requirement name="R_GE_P_ORIENTATION_RINGS_SAME" enabled="true"/> - <qual:requirement name="R_GE_P_INNER_RINGS_NESTED" enabled="true"/> - <qual:requirement name="R_GE_S_TOO_FEW_POLYGONS" enabled="true"/> - <qual:requirement name="R_GE_S_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_EDGE" enabled="true"/> - <qual:requirement name="R_GE_S_POLYGON_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_VERTEX" enabled="true"/> - <qual:requirement name="R_GE_S_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" enabled="true"/> - - <qual:filter> - <qual:checking>BUILDING</qual:checking> - <qual:checking>TRANSPORTATION</qual:checking> - <qual:checking>VEGETATION</qual:checking> - <qual:checking>BRIDGE</qual:checking> - <qual:checking>WATER</qual:checking> - <qual:checking>LAND</qual:checking> - </qual:filter> - </qual:validationPlan> - <qual:statistics> - <qual:numErrorBuildings numChecked="1">1</qual:numErrorBuildings> - <qual:numErrorVegetation numChecked="0">0</qual:numErrorVegetation> - <qual:numErrorLandObjects numChecked="0">0</qual:numErrorLandObjects> - <qual:numErrorBridgeObjects numChecked="0">0</qual:numErrorBridgeObjects> - <qual:numErrorWaterObjects numChecked="0">0</qual:numErrorWaterObjects> - <qual:numErrorTransportation numChecked="0">0</qual:numErrorTransportation> - <qual:errorStatistics> - <qual:error name="GE_R_CONSECUTIVE_POINTS_SAME">1</qual:error> - </qual:errorStatistics> - </qual:statistics> - </qual:validation> -</core:CityModel> \ No newline at end of file diff --git a/citygml4j-quality-ade/src/test/resources/SimpleSolid_HoleOutside.gml b/citygml4j-quality-ade/src/test/resources/SimpleSolid_HoleOutside.gml deleted file mode 100644 index 6c3c99d0c3b531d001502e2049953cb2d66780fd..0000000000000000000000000000000000000000 --- a/citygml4j-quality-ade/src/test/resources/SimpleSolid_HoleOutside.gml +++ /dev/null @@ -1,256 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3 https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3/qualityAde.xsd"> - -<!-- -Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m -Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), -die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert - -CityGML 2.0 - - -linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind. - -10.5.2017 -Author: V. Coors, HFT Stuttgart -Lizenz: ---> - - <core:cityObjectMember> - <bldg:Building gml:id="_Simple_BD.1"> - <qual:validationResult result="ERROR"> - <qual:GE_P_HOLE_OUTSIDE> - <qual:polygonId>_Simple_BD.1_PG.1</qual:polygonId> - <qual:linearRingId>_Simple_BD.1_PG.1_Ring1</qual:linearRingId> - </qual:GE_P_HOLE_OUTSIDE> - </qual:validationResult> - <bldg:lod2Solid> - <gml:Solid> - <gml:exterior> - <gml:CompositeSurface> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/> - </gml:CompositeSurface> - </gml:exterior> - </gml:Solid> - </bldg:lod2Solid> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.2"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1"> - <gml:posList srsDimension="3"> - 13.0 15.0 0.0 - 13.0 15.0 3.0 - 13.0 10.0 3.0 - 13.0 10.0 0.0 - 13.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.3"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1"> - <gml:posList srsDimension="3"> - 10.0 15.0 0.0 - 10.0 15.0 3.0 - 11.5 15.0 4.5 - 13.0 15.0 3.0 - 13.0 15.0 0.0 - 10.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.4"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 10.0 15.0 3.0 - 10.0 15.0 0.0 - 10.0 10.0 0.0 - 10.0 10.0 3.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.5"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1"> - <gml:posList srsDimension="3"> - 13.0 10.0 0.0 - 13.0 10.0 3.0 - 11.5 10.0 4.5 - 10.0 10.0 3.0 - 10.0 10.0 0.0 - 13.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.6"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 11.5 10.0 4.5 - 11.5 10.0 4.5 - 11.5 15.0 4.5 - 10.0 15.0 3.0 - 10.0 10.0 3.0 - - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.7"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1"> - <gml:posList srsDimension="3"> - 11.5 10.0 4.5 - 13.0 10.0 3.0 - 13.0 15.0 3.0 - 11.5 15.0 4.5 - 11.5 10.0 4.5 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:RoofSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.1"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 0.0 - 10.0 15.0 0.0 - 13.0 15.0 0.0 - 13.0 10.0 0.0 - 10.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:GroundSurface> - </bldg:boundedBy> - </bldg:Building> - </core:cityObjectMember> - <qual:validation> - <qual:validationDate>2002-05-30T09:00:00</qual:validationDate> - <qual:validationSoftware>CityDoctor2</qual:validationSoftware> - <qual:validationPlan> - <qual:globalParameters> - <qual:parameter name="numberOfRoundingPlaces">8</qual:parameter> - <qual:parameter name="minVertexDistance" uom="m">0.0001</qual:parameter> - <qual:parameter name="schematronFile"></qual:parameter> - </qual:globalParameters> - <qual:requirement name="R_GE_R_TOO_FEW_POINTS" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_R_CONSECUTIVE_POINTS_SAME" enabled="true"/> - <qual:requirement name="R_GE_R_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_P_NON_PLANAR" enabled="true"> - <qual:parameter name="type">distance</qual:parameter> - <qual:parameter name="distanceTolerance" uom="m">0.01</qual:parameter> - <qual:parameter name="angleTolerance" uom="deg">1</qual:parameter> - <qual:parameter name="degeneratedPolygonTolerance" uom="m">0.0000</qual:parameter> - </qual:requirement> - <qual:requirement name="R_GE_P_INTERIOR_DISCONNECTED" enabled="true"/> - <qual:requirement name="R_GE_P_INTERSECTING_RINGS" enabled="true"/> - <qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/> - <qual:requirement name="R_GE_P_ORIENTATION_RINGS_SAME" enabled="true"/> - <qual:requirement name="R_GE_P_INNER_RINGS_NESTED" enabled="true"/> - <qual:requirement name="R_GE_S_TOO_FEW_POLYGONS" enabled="true"/> - <qual:requirement name="R_GE_S_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_EDGE" enabled="true"/> - <qual:requirement name="R_GE_S_POLYGON_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_VERTEX" enabled="true"/> - <qual:requirement name="R_GE_S_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" enabled="true"/> - - <qual:filter> - <qual:checking>BUILDING</qual:checking> - <qual:checking>TRANSPORTATION</qual:checking> - <qual:checking>VEGETATION</qual:checking> - <qual:checking>BRIDGE</qual:checking> - <qual:checking>WATER</qual:checking> - <qual:checking>LAND</qual:checking> - </qual:filter> - </qual:validationPlan> - <qual:statistics> - <qual:numErrorBuildings numChecked="1">1</qual:numErrorBuildings> - <qual:numErrorVegetation numChecked="0">0</qual:numErrorVegetation> - <qual:numErrorLandObjects numChecked="0">0</qual:numErrorLandObjects> - <qual:numErrorBridgeObjects numChecked="0">0</qual:numErrorBridgeObjects> - <qual:numErrorWaterObjects numChecked="0">0</qual:numErrorWaterObjects> - <qual:numErrorTransportation numChecked="0">0</qual:numErrorTransportation> - <qual:errorStatistics> - <qual:error name="GE_R_CONSECUTIVE_POINTS_SAME">1</qual:error> - </qual:errorStatistics> - </qual:statistics> - </qual:validation> -</core:CityModel> \ No newline at end of file diff --git a/citygml4j-quality-ade/src/test/resources/SimpleSolid_InnerRingNested.gml b/citygml4j-quality-ade/src/test/resources/SimpleSolid_InnerRingNested.gml deleted file mode 100644 index 71f5720d1bc66a13f5b822c61c4932aa717abf70..0000000000000000000000000000000000000000 --- a/citygml4j-quality-ade/src/test/resources/SimpleSolid_InnerRingNested.gml +++ /dev/null @@ -1,257 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3 https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3/qualityAde.xsd"> - -<!-- -Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m -Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), -die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert - -CityGML 2.0 - - -linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind. - -10.5.2017 -Author: V. Coors, HFT Stuttgart -Lizenz: ---> - - <core:cityObjectMember> - <bldg:Building gml:id="_Simple_BD.1"> - <qual:validationResult result="ERROR"> - <qual:GE_P_INNER_RINGS_NESTED> - <qual:polygonId>_Simple_BD.1_PG.1</qual:polygonId> - <qual:linearRingId1>_Simple_BD.1_PG.1_Ring1</qual:linearRingId1> - <qual:linearRingId2>_Simple_BD.1_PG.1_Ring2</qual:linearRingId2> - </qual:GE_P_INNER_RINGS_NESTED> - </qual:validationResult> - <bldg:lod2Solid> - <gml:Solid> - <gml:exterior> - <gml:CompositeSurface> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/> - </gml:CompositeSurface> - </gml:exterior> - </gml:Solid> - </bldg:lod2Solid> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.2"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1"> - <gml:posList srsDimension="3"> - 13.0 15.0 0.0 - 13.0 15.0 3.0 - 13.0 10.0 3.0 - 13.0 10.0 0.0 - 13.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.3"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1"> - <gml:posList srsDimension="3"> - 10.0 15.0 0.0 - 10.0 15.0 3.0 - 11.5 15.0 4.5 - 13.0 15.0 3.0 - 13.0 15.0 0.0 - 10.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.4"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 10.0 15.0 3.0 - 10.0 15.0 0.0 - 10.0 10.0 0.0 - 10.0 10.0 3.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.5"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1"> - <gml:posList srsDimension="3"> - 13.0 10.0 0.0 - 13.0 10.0 3.0 - 11.5 10.0 4.5 - 10.0 10.0 3.0 - 10.0 10.0 0.0 - 13.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.6"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 11.5 10.0 4.5 - 11.5 10.0 4.5 - 11.5 15.0 4.5 - 10.0 15.0 3.0 - 10.0 10.0 3.0 - - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.7"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1"> - <gml:posList srsDimension="3"> - 11.5 10.0 4.5 - 13.0 10.0 3.0 - 13.0 15.0 3.0 - 11.5 15.0 4.5 - 11.5 10.0 4.5 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:RoofSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.1"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 0.0 - 10.0 15.0 0.0 - 13.0 15.0 0.0 - 13.0 10.0 0.0 - 10.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:GroundSurface> - </bldg:boundedBy> - </bldg:Building> - </core:cityObjectMember> - <qual:validation> - <qual:validationDate>2002-05-30T09:00:00</qual:validationDate> - <qual:validationSoftware>CityDoctor2</qual:validationSoftware> - <qual:validationPlan> - <qual:globalParameters> - <qual:parameter name="numberOfRoundingPlaces">8</qual:parameter> - <qual:parameter name="minVertexDistance" uom="m">0.0001</qual:parameter> - <qual:parameter name="schematronFile"></qual:parameter> - </qual:globalParameters> - <qual:requirement name="R_GE_R_TOO_FEW_POINTS" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_R_CONSECUTIVE_POINTS_SAME" enabled="true"/> - <qual:requirement name="R_GE_R_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_P_NON_PLANAR" enabled="true"> - <qual:parameter name="type">distance</qual:parameter> - <qual:parameter name="distanceTolerance" uom="m">0.01</qual:parameter> - <qual:parameter name="angleTolerance" uom="deg">1</qual:parameter> - <qual:parameter name="degeneratedPolygonTolerance" uom="m">0.0000</qual:parameter> - </qual:requirement> - <qual:requirement name="R_GE_P_INTERIOR_DISCONNECTED" enabled="true"/> - <qual:requirement name="R_GE_P_INTERSECTING_RINGS" enabled="true"/> - <qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/> - <qual:requirement name="R_GE_P_ORIENTATION_RINGS_SAME" enabled="true"/> - <qual:requirement name="R_GE_P_INNER_RINGS_NESTED" enabled="true"/> - <qual:requirement name="R_GE_S_TOO_FEW_POLYGONS" enabled="true"/> - <qual:requirement name="R_GE_S_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_EDGE" enabled="true"/> - <qual:requirement name="R_GE_S_POLYGON_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_VERTEX" enabled="true"/> - <qual:requirement name="R_GE_S_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" enabled="true"/> - - <qual:filter> - <qual:checking>BUILDING</qual:checking> - <qual:checking>TRANSPORTATION</qual:checking> - <qual:checking>VEGETATION</qual:checking> - <qual:checking>BRIDGE</qual:checking> - <qual:checking>WATER</qual:checking> - <qual:checking>LAND</qual:checking> - </qual:filter> - </qual:validationPlan> - <qual:statistics> - <qual:numErrorBuildings numChecked="1">1</qual:numErrorBuildings> - <qual:numErrorVegetation numChecked="0">0</qual:numErrorVegetation> - <qual:numErrorLandObjects numChecked="0">0</qual:numErrorLandObjects> - <qual:numErrorBridgeObjects numChecked="0">0</qual:numErrorBridgeObjects> - <qual:numErrorWaterObjects numChecked="0">0</qual:numErrorWaterObjects> - <qual:numErrorTransportation numChecked="0">0</qual:numErrorTransportation> - <qual:errorStatistics> - <qual:error name="GE_R_CONSECUTIVE_POINTS_SAME">1</qual:error> - </qual:errorStatistics> - </qual:statistics> - </qual:validation> -</core:CityModel> \ No newline at end of file diff --git a/citygml4j-quality-ade/src/test/resources/SimpleSolid_InteriorDisconnected.gml b/citygml4j-quality-ade/src/test/resources/SimpleSolid_InteriorDisconnected.gml deleted file mode 100644 index 580a6efb54a44c95078331f21e0e6c9266738749..0000000000000000000000000000000000000000 --- a/citygml4j-quality-ade/src/test/resources/SimpleSolid_InteriorDisconnected.gml +++ /dev/null @@ -1,255 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3 https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3/qualityAde.xsd"> - -<!-- -Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m -Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), -die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert - -CityGML 2.0 - - -linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind. - -10.5.2017 -Author: V. Coors, HFT Stuttgart -Lizenz: ---> - - <core:cityObjectMember> - <bldg:Building gml:id="_Simple_BD.1"> - <qual:validationResult result="ERROR"> - <qual:GE_P_INTERIOR_DISCONNECTED> - <qual:polygonId>_Simple_BD.1_PG.1</qual:polygonId> - </qual:GE_P_INTERIOR_DISCONNECTED> - </qual:validationResult> - <bldg:lod2Solid> - <gml:Solid> - <gml:exterior> - <gml:CompositeSurface> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/> - </gml:CompositeSurface> - </gml:exterior> - </gml:Solid> - </bldg:lod2Solid> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.2"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1"> - <gml:posList srsDimension="3"> - 13.0 15.0 0.0 - 13.0 15.0 3.0 - 13.0 10.0 3.0 - 13.0 10.0 0.0 - 13.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.3"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1"> - <gml:posList srsDimension="3"> - 10.0 15.0 0.0 - 10.0 15.0 3.0 - 11.5 15.0 4.5 - 13.0 15.0 3.0 - 13.0 15.0 0.0 - 10.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.4"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 10.0 15.0 3.0 - 10.0 15.0 0.0 - 10.0 10.0 0.0 - 10.0 10.0 3.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.5"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1"> - <gml:posList srsDimension="3"> - 13.0 10.0 0.0 - 13.0 10.0 3.0 - 11.5 10.0 4.5 - 10.0 10.0 3.0 - 10.0 10.0 0.0 - 13.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.6"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 11.5 10.0 4.5 - 11.5 10.0 4.5 - 11.5 15.0 4.5 - 10.0 15.0 3.0 - 10.0 10.0 3.0 - - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.7"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1"> - <gml:posList srsDimension="3"> - 11.5 10.0 4.5 - 13.0 10.0 3.0 - 13.0 15.0 3.0 - 11.5 15.0 4.5 - 11.5 10.0 4.5 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:RoofSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.1"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 0.0 - 10.0 15.0 0.0 - 13.0 15.0 0.0 - 13.0 10.0 0.0 - 10.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:GroundSurface> - </bldg:boundedBy> - </bldg:Building> - </core:cityObjectMember> - <qual:validation> - <qual:validationDate>2002-05-30T09:00:00</qual:validationDate> - <qual:validationSoftware>CityDoctor2</qual:validationSoftware> - <qual:validationPlan> - <qual:globalParameters> - <qual:parameter name="numberOfRoundingPlaces">8</qual:parameter> - <qual:parameter name="minVertexDistance" uom="m">0.0001</qual:parameter> - <qual:parameter name="schematronFile"></qual:parameter> - </qual:globalParameters> - <qual:requirement name="R_GE_R_TOO_FEW_POINTS" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_R_CONSECUTIVE_POINTS_SAME" enabled="true"/> - <qual:requirement name="R_GE_R_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_P_NON_PLANAR" enabled="true"> - <qual:parameter name="type">distance</qual:parameter> - <qual:parameter name="distanceTolerance" uom="m">0.01</qual:parameter> - <qual:parameter name="angleTolerance" uom="deg">1</qual:parameter> - <qual:parameter name="degeneratedPolygonTolerance" uom="m">0.0000</qual:parameter> - </qual:requirement> - <qual:requirement name="R_GE_P_INTERIOR_DISCONNECTED" enabled="true"/> - <qual:requirement name="R_GE_P_INTERSECTING_RINGS" enabled="true"/> - <qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/> - <qual:requirement name="R_GE_P_ORIENTATION_RINGS_SAME" enabled="true"/> - <qual:requirement name="R_GE_P_INNER_RINGS_NESTED" enabled="true"/> - <qual:requirement name="R_GE_S_TOO_FEW_POLYGONS" enabled="true"/> - <qual:requirement name="R_GE_S_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_EDGE" enabled="true"/> - <qual:requirement name="R_GE_S_POLYGON_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_VERTEX" enabled="true"/> - <qual:requirement name="R_GE_S_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" enabled="true"/> - - <qual:filter> - <qual:checking>BUILDING</qual:checking> - <qual:checking>TRANSPORTATION</qual:checking> - <qual:checking>VEGETATION</qual:checking> - <qual:checking>BRIDGE</qual:checking> - <qual:checking>WATER</qual:checking> - <qual:checking>LAND</qual:checking> - </qual:filter> - </qual:validationPlan> - <qual:statistics> - <qual:numErrorBuildings numChecked="1">1</qual:numErrorBuildings> - <qual:numErrorVegetation numChecked="0">0</qual:numErrorVegetation> - <qual:numErrorLandObjects numChecked="0">0</qual:numErrorLandObjects> - <qual:numErrorBridgeObjects numChecked="0">0</qual:numErrorBridgeObjects> - <qual:numErrorWaterObjects numChecked="0">0</qual:numErrorWaterObjects> - <qual:numErrorTransportation numChecked="0">0</qual:numErrorTransportation> - <qual:errorStatistics> - <qual:error name="GE_R_CONSECUTIVE_POINTS_SAME">1</qual:error> - </qual:errorStatistics> - </qual:statistics> - </qual:validation> -</core:CityModel> \ No newline at end of file diff --git a/citygml4j-quality-ade/src/test/resources/SimpleSolid_IntersectingRings.gml b/citygml4j-quality-ade/src/test/resources/SimpleSolid_IntersectingRings.gml deleted file mode 100644 index 4acb0908ce8c823d86610b189a68c157da7bc853..0000000000000000000000000000000000000000 --- a/citygml4j-quality-ade/src/test/resources/SimpleSolid_IntersectingRings.gml +++ /dev/null @@ -1,257 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3 https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3/qualityAde.xsd"> - -<!-- -Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m -Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), -die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert - -CityGML 2.0 - - -linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind. - -10.5.2017 -Author: V. Coors, HFT Stuttgart -Lizenz: ---> - - <core:cityObjectMember> - <bldg:Building gml:id="_Simple_BD.1"> - <qual:validationResult result="ERROR"> - <qual:GE_P_INTERSECTING_RINGS> - <qual:polygonId>_Simple_BD.1_PG.1</qual:polygonId> - <qual:linearRingId1>_Simple_BD.1_PG.1_Ring1</qual:linearRingId1> - <qual:linearRingId2>_Simple_BD.1_PG.1_Ring2</qual:linearRingId2> - </qual:GE_P_INTERSECTING_RINGS> - </qual:validationResult> - <bldg:lod2Solid> - <gml:Solid> - <gml:exterior> - <gml:CompositeSurface> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/> - </gml:CompositeSurface> - </gml:exterior> - </gml:Solid> - </bldg:lod2Solid> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.2"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1"> - <gml:posList srsDimension="3"> - 13.0 15.0 0.0 - 13.0 15.0 3.0 - 13.0 10.0 3.0 - 13.0 10.0 0.0 - 13.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.3"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1"> - <gml:posList srsDimension="3"> - 10.0 15.0 0.0 - 10.0 15.0 3.0 - 11.5 15.0 4.5 - 13.0 15.0 3.0 - 13.0 15.0 0.0 - 10.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.4"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 10.0 15.0 3.0 - 10.0 15.0 0.0 - 10.0 10.0 0.0 - 10.0 10.0 3.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.5"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1"> - <gml:posList srsDimension="3"> - 13.0 10.0 0.0 - 13.0 10.0 3.0 - 11.5 10.0 4.5 - 10.0 10.0 3.0 - 10.0 10.0 0.0 - 13.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.6"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 11.5 10.0 4.5 - 11.5 10.0 4.5 - 11.5 15.0 4.5 - 10.0 15.0 3.0 - 10.0 10.0 3.0 - - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.7"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1"> - <gml:posList srsDimension="3"> - 11.5 10.0 4.5 - 13.0 10.0 3.0 - 13.0 15.0 3.0 - 11.5 15.0 4.5 - 11.5 10.0 4.5 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:RoofSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.1"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 0.0 - 10.0 15.0 0.0 - 13.0 15.0 0.0 - 13.0 10.0 0.0 - 10.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:GroundSurface> - </bldg:boundedBy> - </bldg:Building> - </core:cityObjectMember> - <qual:validation> - <qual:validationDate>2002-05-30T09:00:00</qual:validationDate> - <qual:validationSoftware>CityDoctor2</qual:validationSoftware> - <qual:validationPlan> - <qual:globalParameters> - <qual:parameter name="numberOfRoundingPlaces">8</qual:parameter> - <qual:parameter name="minVertexDistance" uom="m">0.0001</qual:parameter> - <qual:parameter name="schematronFile"></qual:parameter> - </qual:globalParameters> - <qual:requirement name="R_GE_R_TOO_FEW_POINTS" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_R_CONSECUTIVE_POINTS_SAME" enabled="true"/> - <qual:requirement name="R_GE_R_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_P_NON_PLANAR" enabled="true"> - <qual:parameter name="type">distance</qual:parameter> - <qual:parameter name="distanceTolerance" uom="m">0.01</qual:parameter> - <qual:parameter name="angleTolerance" uom="deg">1</qual:parameter> - <qual:parameter name="degeneratedPolygonTolerance" uom="m">0.0000</qual:parameter> - </qual:requirement> - <qual:requirement name="R_GE_P_INTERIOR_DISCONNECTED" enabled="true"/> - <qual:requirement name="R_GE_P_INTERSECTING_RINGS" enabled="true"/> - <qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/> - <qual:requirement name="R_GE_P_ORIENTATION_RINGS_SAME" enabled="true"/> - <qual:requirement name="R_GE_P_INNER_RINGS_NESTED" enabled="true"/> - <qual:requirement name="R_GE_S_TOO_FEW_POLYGONS" enabled="true"/> - <qual:requirement name="R_GE_S_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_EDGE" enabled="true"/> - <qual:requirement name="R_GE_S_POLYGON_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_VERTEX" enabled="true"/> - <qual:requirement name="R_GE_S_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" enabled="true"/> - - <qual:filter> - <qual:checking>BUILDING</qual:checking> - <qual:checking>TRANSPORTATION</qual:checking> - <qual:checking>VEGETATION</qual:checking> - <qual:checking>BRIDGE</qual:checking> - <qual:checking>WATER</qual:checking> - <qual:checking>LAND</qual:checking> - </qual:filter> - </qual:validationPlan> - <qual:statistics> - <qual:numErrorBuildings numChecked="1">1</qual:numErrorBuildings> - <qual:numErrorVegetation numChecked="0">0</qual:numErrorVegetation> - <qual:numErrorLandObjects numChecked="0">0</qual:numErrorLandObjects> - <qual:numErrorBridgeObjects numChecked="0">0</qual:numErrorBridgeObjects> - <qual:numErrorWaterObjects numChecked="0">0</qual:numErrorWaterObjects> - <qual:numErrorTransportation numChecked="0">0</qual:numErrorTransportation> - <qual:errorStatistics> - <qual:error name="GE_R_CONSECUTIVE_POINTS_SAME">1</qual:error> - </qual:errorStatistics> - </qual:statistics> - </qual:validation> -</core:CityModel> \ No newline at end of file diff --git a/citygml4j-quality-ade/src/test/resources/SimpleSolid_MultipleConnectedComponents.gml b/citygml4j-quality-ade/src/test/resources/SimpleSolid_MultipleConnectedComponents.gml deleted file mode 100644 index 87ae4d3964d2b434399cdd7b9864fceeba015adb..0000000000000000000000000000000000000000 --- a/citygml4j-quality-ade/src/test/resources/SimpleSolid_MultipleConnectedComponents.gml +++ /dev/null @@ -1,266 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3 https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3/qualityAde.xsd"> - -<!-- -Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m -Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), -die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert - -CityGML 2.0 - - -linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind. - -10.5.2017 -Author: V. Coors, HFT Stuttgart -Lizenz: ---> - - <core:cityObjectMember> - <bldg:Building gml:id="_Simple_BD.1"> - - <qual:validationResult result="ERROR"> - <qual:GE_S_MULTIPLE_CONNECTED_COMPONENTS> - <qual:geometryId>_Simple_BD.1_Geom1</qual:geometryId> - <qual:components> - <qual:component> - <qual:polygonId>_Simple_BD.1_PG.1</qual:polygonId> - <qual:polygonId>_Simple_BD.1_PG.2</qual:polygonId> - </qual:component> - <qual:component> - <qual:polygonId>_Simple_BD.1_PG.3</qual:polygonId> - <qual:polygonId>_Simple_BD.1_PG.4</qual:polygonId> - </qual:component> - </qual:components> - </qual:GE_S_MULTIPLE_CONNECTED_COMPONENTS> - </qual:validationResult> - <bldg:lod2Solid> - <gml:Solid gml:id="_Simple_BD.1_Geom1"> - <gml:exterior> - <gml:CompositeSurface> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/> - </gml:CompositeSurface> - </gml:exterior> - </gml:Solid> - </bldg:lod2Solid> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.2"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1"> - <gml:posList srsDimension="3"> - 13.0 15.0 0.0 - 13.0 15.0 3.0 - 13.0 10.0 3.0 - 13.0 10.0 0.0 - 13.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.3"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1"> - <gml:posList srsDimension="3"> - 10.0 15.0 0.0 - 10.0 15.0 3.0 - 11.5 15.0 4.5 - 13.0 15.0 3.0 - 13.0 15.0 0.0 - 10.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.4"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 10.0 15.0 3.0 - 10.0 15.0 0.0 - 10.0 10.0 0.0 - 10.0 10.0 3.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.5"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1"> - <gml:posList srsDimension="3"> - 13.0 10.0 0.0 - 13.0 10.0 3.0 - 11.5 10.0 4.5 - 10.0 10.0 3.0 - 10.0 10.0 0.0 - 13.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.6"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 11.5 10.0 4.5 - 11.5 10.0 4.5 - 11.5 15.0 4.5 - 10.0 15.0 3.0 - 10.0 10.0 3.0 - - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.7"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1"> - <gml:posList srsDimension="3"> - 11.5 10.0 4.5 - 13.0 10.0 3.0 - 13.0 15.0 3.0 - 11.5 15.0 4.5 - 11.5 10.0 4.5 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:RoofSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.1"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 0.0 - 10.0 15.0 0.0 - 13.0 15.0 0.0 - 13.0 10.0 0.0 - 10.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:GroundSurface> - </bldg:boundedBy> - </bldg:Building> - </core:cityObjectMember> - <qual:validation> - <qual:validationDate>2002-05-30T09:00:00</qual:validationDate> - <qual:validationSoftware>CityDoctor2</qual:validationSoftware> - <qual:validationPlan> - <qual:globalParameters> - <qual:parameter name="numberOfRoundingPlaces">8</qual:parameter> - <qual:parameter name="minVertexDistance" uom="m">0.0001</qual:parameter> - <qual:parameter name="schematronFile"></qual:parameter> - </qual:globalParameters> - <qual:requirement name="R_GE_R_TOO_FEW_POINTS" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_R_CONSECUTIVE_POINTS_SAME" enabled="true"/> - <qual:requirement name="R_GE_R_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_P_NON_PLANAR" enabled="true"> - <qual:parameter name="type">distance</qual:parameter> - <qual:parameter name="distanceTolerance" uom="m">0.01</qual:parameter> - <qual:parameter name="angleTolerance" uom="deg">1</qual:parameter> - <qual:parameter name="degeneratedPolygonTolerance" uom="m">0.0000</qual:parameter> - </qual:requirement> - <qual:requirement name="R_GE_P_INTERIOR_DISCONNECTED" enabled="true"/> - <qual:requirement name="R_GE_P_INTERSECTING_RINGS" enabled="true"/> - <qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/> - <qual:requirement name="R_GE_P_ORIENTATION_RINGS_SAME" enabled="true"/> - <qual:requirement name="R_GE_P_INNER_RINGS_NESTED" enabled="true"/> - <qual:requirement name="R_GE_S_TOO_FEW_POLYGONS" enabled="true"/> - <qual:requirement name="R_GE_S_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_EDGE" enabled="true"/> - <qual:requirement name="R_GE_S_POLYGON_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_VERTEX" enabled="true"/> - <qual:requirement name="R_GE_S_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" enabled="true"/> - - <qual:filter> - <qual:checking>BUILDING</qual:checking> - <qual:checking>TRANSPORTATION</qual:checking> - <qual:checking>VEGETATION</qual:checking> - <qual:checking>BRIDGE</qual:checking> - <qual:checking>WATER</qual:checking> - <qual:checking>LAND</qual:checking> - </qual:filter> - </qual:validationPlan> - <qual:statistics> - <qual:numErrorBuildings numChecked="1">1</qual:numErrorBuildings> - <qual:numErrorVegetation numChecked="0">0</qual:numErrorVegetation> - <qual:numErrorLandObjects numChecked="0">0</qual:numErrorLandObjects> - <qual:numErrorBridgeObjects numChecked="0">0</qual:numErrorBridgeObjects> - <qual:numErrorWaterObjects numChecked="0">0</qual:numErrorWaterObjects> - <qual:numErrorTransportation numChecked="0">0</qual:numErrorTransportation> - <qual:errorStatistics> - <qual:error name="GE_R_CONSECUTIVE_POINTS_SAME">1</qual:error> - </qual:errorStatistics> - </qual:statistics> - </qual:validation> -</core:CityModel> \ No newline at end of file diff --git a/citygml4j-quality-ade/src/test/resources/SimpleSolid_NonManifoldEdge.gml b/citygml4j-quality-ade/src/test/resources/SimpleSolid_NonManifoldEdge.gml deleted file mode 100644 index c0c52b980e66b19d8e5e3bd5dbda2b55ed726e65..0000000000000000000000000000000000000000 --- a/citygml4j-quality-ade/src/test/resources/SimpleSolid_NonManifoldEdge.gml +++ /dev/null @@ -1,262 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3 https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3/qualityAde.xsd"> - -<!-- -Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m -Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), -die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert - -CityGML 2.0 - - -linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind. - -10.5.2017 -Author: V. Coors, HFT Stuttgart -Lizenz: ---> - - <core:cityObjectMember> - <bldg:Building gml:id="_Simple_BD.1"> - - <qual:validationResult result="ERROR"> - <qual:GE_S_NON_MANIFOLD_EDGE> - <qual:geometryId>_Simple_BD.1_Geom1</qual:geometryId> - <qual:edges> - <qual:edge> - <qual:from>10.0 1.0 2.0</qual:from> - <qual:to>11.0 2.0 3.0</qual:to> - </qual:edge> - </qual:edges> - </qual:GE_S_NON_MANIFOLD_EDGE> - </qual:validationResult> - <bldg:lod2Solid> - <gml:Solid gml:id="_Simple_BD.1_Geom1"> - <gml:exterior> - <gml:CompositeSurface> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/> - </gml:CompositeSurface> - </gml:exterior> - </gml:Solid> - </bldg:lod2Solid> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.2"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1"> - <gml:posList srsDimension="3"> - 13.0 15.0 0.0 - 13.0 15.0 3.0 - 13.0 10.0 3.0 - 13.0 10.0 0.0 - 13.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.3"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1"> - <gml:posList srsDimension="3"> - 10.0 15.0 0.0 - 10.0 15.0 3.0 - 11.5 15.0 4.5 - 13.0 15.0 3.0 - 13.0 15.0 0.0 - 10.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.4"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 10.0 15.0 3.0 - 10.0 15.0 0.0 - 10.0 10.0 0.0 - 10.0 10.0 3.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.5"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1"> - <gml:posList srsDimension="3"> - 13.0 10.0 0.0 - 13.0 10.0 3.0 - 11.5 10.0 4.5 - 10.0 10.0 3.0 - 10.0 10.0 0.0 - 13.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.6"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 11.5 10.0 4.5 - 11.5 10.0 4.5 - 11.5 15.0 4.5 - 10.0 15.0 3.0 - 10.0 10.0 3.0 - - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.7"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1"> - <gml:posList srsDimension="3"> - 11.5 10.0 4.5 - 13.0 10.0 3.0 - 13.0 15.0 3.0 - 11.5 15.0 4.5 - 11.5 10.0 4.5 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:RoofSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.1"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 0.0 - 10.0 15.0 0.0 - 13.0 15.0 0.0 - 13.0 10.0 0.0 - 10.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:GroundSurface> - </bldg:boundedBy> - </bldg:Building> - </core:cityObjectMember> - <qual:validation> - <qual:validationDate>2002-05-30T09:00:00</qual:validationDate> - <qual:validationSoftware>CityDoctor2</qual:validationSoftware> - <qual:validationPlan> - <qual:globalParameters> - <qual:parameter name="numberOfRoundingPlaces">8</qual:parameter> - <qual:parameter name="minVertexDistance" uom="m">0.0001</qual:parameter> - <qual:parameter name="schematronFile"></qual:parameter> - </qual:globalParameters> - <qual:requirement name="R_GE_R_TOO_FEW_POINTS" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_R_CONSECUTIVE_POINTS_SAME" enabled="true"/> - <qual:requirement name="R_GE_R_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_P_NON_PLANAR" enabled="true"> - <qual:parameter name="type">distance</qual:parameter> - <qual:parameter name="distanceTolerance" uom="m">0.01</qual:parameter> - <qual:parameter name="angleTolerance" uom="deg">1</qual:parameter> - <qual:parameter name="degeneratedPolygonTolerance" uom="m">0.0000</qual:parameter> - </qual:requirement> - <qual:requirement name="R_GE_P_INTERIOR_DISCONNECTED" enabled="true"/> - <qual:requirement name="R_GE_P_INTERSECTING_RINGS" enabled="true"/> - <qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/> - <qual:requirement name="R_GE_P_ORIENTATION_RINGS_SAME" enabled="true"/> - <qual:requirement name="R_GE_P_INNER_RINGS_NESTED" enabled="true"/> - <qual:requirement name="R_GE_S_TOO_FEW_POLYGONS" enabled="true"/> - <qual:requirement name="R_GE_S_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_EDGE" enabled="true"/> - <qual:requirement name="R_GE_S_POLYGON_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_VERTEX" enabled="true"/> - <qual:requirement name="R_GE_S_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" enabled="true"/> - - <qual:filter> - <qual:checking>BUILDING</qual:checking> - <qual:checking>TRANSPORTATION</qual:checking> - <qual:checking>VEGETATION</qual:checking> - <qual:checking>BRIDGE</qual:checking> - <qual:checking>WATER</qual:checking> - <qual:checking>LAND</qual:checking> - </qual:filter> - </qual:validationPlan> - <qual:statistics> - <qual:numErrorBuildings numChecked="1">1</qual:numErrorBuildings> - <qual:numErrorVegetation numChecked="0">0</qual:numErrorVegetation> - <qual:numErrorLandObjects numChecked="0">0</qual:numErrorLandObjects> - <qual:numErrorBridgeObjects numChecked="0">0</qual:numErrorBridgeObjects> - <qual:numErrorWaterObjects numChecked="0">0</qual:numErrorWaterObjects> - <qual:numErrorTransportation numChecked="0">0</qual:numErrorTransportation> - <qual:errorStatistics> - <qual:error name="GE_R_CONSECUTIVE_POINTS_SAME">1</qual:error> - </qual:errorStatistics> - </qual:statistics> - </qual:validation> -</core:CityModel> \ No newline at end of file diff --git a/citygml4j-quality-ade/src/test/resources/SimpleSolid_NonManifoldVertex.gml b/citygml4j-quality-ade/src/test/resources/SimpleSolid_NonManifoldVertex.gml deleted file mode 100644 index 78ab1d33024611a5664300382bd170328bdd9082..0000000000000000000000000000000000000000 --- a/citygml4j-quality-ade/src/test/resources/SimpleSolid_NonManifoldVertex.gml +++ /dev/null @@ -1,256 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3 https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3/qualityAde.xsd"> - -<!-- -Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m -Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), -die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert - -CityGML 2.0 - - -linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind. - -10.5.2017 -Author: V. Coors, HFT Stuttgart -Lizenz: ---> - - <core:cityObjectMember> - <bldg:Building gml:id="_Simple_BD.1"> - <qual:validationResult result="ERROR"> - <qual:GE_S_NON_MANIFOLD_VERTEX> - <qual:geometryId>_Simple_BD.1_Geom1</qual:geometryId> - <qual:vertex>1.0 2.0 3.0</qual:vertex> - </qual:GE_S_NON_MANIFOLD_VERTEX> - </qual:validationResult> - <bldg:lod2Solid> - <gml:Solid gml:id="_Simple_BD.1_Geom1"> - <gml:exterior> - <gml:CompositeSurface> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/> - </gml:CompositeSurface> - </gml:exterior> - </gml:Solid> - </bldg:lod2Solid> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.2"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1"> - <gml:posList srsDimension="3"> - 13.0 15.0 0.0 - 13.0 15.0 3.0 - 13.0 10.0 3.0 - 13.0 10.0 0.0 - 13.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.3"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1"> - <gml:posList srsDimension="3"> - 10.0 15.0 0.0 - 10.0 15.0 3.0 - 11.5 15.0 4.5 - 13.0 15.0 3.0 - 13.0 15.0 0.0 - 10.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.4"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 10.0 15.0 3.0 - 10.0 15.0 0.0 - 10.0 10.0 0.0 - 10.0 10.0 3.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.5"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1"> - <gml:posList srsDimension="3"> - 13.0 10.0 0.0 - 13.0 10.0 3.0 - 11.5 10.0 4.5 - 10.0 10.0 3.0 - 10.0 10.0 0.0 - 13.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.6"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 11.5 10.0 4.5 - 11.5 10.0 4.5 - 11.5 15.0 4.5 - 10.0 15.0 3.0 - 10.0 10.0 3.0 - - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.7"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1"> - <gml:posList srsDimension="3"> - 11.5 10.0 4.5 - 13.0 10.0 3.0 - 13.0 15.0 3.0 - 11.5 15.0 4.5 - 11.5 10.0 4.5 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:RoofSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.1"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 0.0 - 10.0 15.0 0.0 - 13.0 15.0 0.0 - 13.0 10.0 0.0 - 10.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:GroundSurface> - </bldg:boundedBy> - </bldg:Building> - </core:cityObjectMember> - <qual:validation> - <qual:validationDate>2002-05-30T09:00:00</qual:validationDate> - <qual:validationSoftware>CityDoctor2</qual:validationSoftware> - <qual:validationPlan> - <qual:globalParameters> - <qual:parameter name="numberOfRoundingPlaces">8</qual:parameter> - <qual:parameter name="minVertexDistance" uom="m">0.0001</qual:parameter> - <qual:parameter name="schematronFile"></qual:parameter> - </qual:globalParameters> - <qual:requirement name="R_GE_R_TOO_FEW_POINTS" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_R_CONSECUTIVE_POINTS_SAME" enabled="true"/> - <qual:requirement name="R_GE_R_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_P_NON_PLANAR" enabled="true"> - <qual:parameter name="type">distance</qual:parameter> - <qual:parameter name="distanceTolerance" uom="m">0.01</qual:parameter> - <qual:parameter name="angleTolerance" uom="deg">1</qual:parameter> - <qual:parameter name="degeneratedPolygonTolerance" uom="m">0.0000</qual:parameter> - </qual:requirement> - <qual:requirement name="R_GE_P_INTERIOR_DISCONNECTED" enabled="true"/> - <qual:requirement name="R_GE_P_INTERSECTING_RINGS" enabled="true"/> - <qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/> - <qual:requirement name="R_GE_P_ORIENTATION_RINGS_SAME" enabled="true"/> - <qual:requirement name="R_GE_P_INNER_RINGS_NESTED" enabled="true"/> - <qual:requirement name="R_GE_S_TOO_FEW_POLYGONS" enabled="true"/> - <qual:requirement name="R_GE_S_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_EDGE" enabled="true"/> - <qual:requirement name="R_GE_S_POLYGON_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_VERTEX" enabled="true"/> - <qual:requirement name="R_GE_S_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" enabled="true"/> - - <qual:filter> - <qual:checking>BUILDING</qual:checking> - <qual:checking>TRANSPORTATION</qual:checking> - <qual:checking>VEGETATION</qual:checking> - <qual:checking>BRIDGE</qual:checking> - <qual:checking>WATER</qual:checking> - <qual:checking>LAND</qual:checking> - </qual:filter> - </qual:validationPlan> - <qual:statistics> - <qual:numErrorBuildings numChecked="1">1</qual:numErrorBuildings> - <qual:numErrorVegetation numChecked="0">0</qual:numErrorVegetation> - <qual:numErrorLandObjects numChecked="0">0</qual:numErrorLandObjects> - <qual:numErrorBridgeObjects numChecked="0">0</qual:numErrorBridgeObjects> - <qual:numErrorWaterObjects numChecked="0">0</qual:numErrorWaterObjects> - <qual:numErrorTransportation numChecked="0">0</qual:numErrorTransportation> - <qual:errorStatistics> - <qual:error name="GE_R_CONSECUTIVE_POINTS_SAME">1</qual:error> - </qual:errorStatistics> - </qual:statistics> - </qual:validation> -</core:CityModel> \ No newline at end of file diff --git a/citygml4j-quality-ade/src/test/resources/SimpleSolid_NonPlanarPolygonDistancePlane.gml b/citygml4j-quality-ade/src/test/resources/SimpleSolid_NonPlanarPolygonDistancePlane.gml deleted file mode 100644 index df2c5d462a5f90240e89759dae219064e4a5f91d..0000000000000000000000000000000000000000 --- a/citygml4j-quality-ade/src/test/resources/SimpleSolid_NonPlanarPolygonDistancePlane.gml +++ /dev/null @@ -1,257 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3 https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3/qualityAde.xsd"> - -<!-- -Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m -Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), -die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert - -CityGML 2.0 - - -linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind. - -10.5.2017 -Author: V. Coors, HFT Stuttgart -Lizenz: ---> - - <core:cityObjectMember> - <bldg:Building gml:id="_Simple_BD.1"> - <qual:validationResult result="ERROR"> - <qual:GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE> - <qual:polygonId>_Simple_BD.1_PG.1</qual:polygonId> - <qual:vertex>1.0 2.0 3.0</qual:vertex> - <qual:distance uom="m">0.001</qual:distance> - </qual:GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE> - </qual:validationResult> - <bldg:lod2Solid> - <gml:Solid> - <gml:exterior> - <gml:CompositeSurface> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/> - </gml:CompositeSurface> - </gml:exterior> - </gml:Solid> - </bldg:lod2Solid> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.2"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1"> - <gml:posList srsDimension="3"> - 13.0 15.0 0.0 - 13.0 15.0 3.0 - 13.0 10.0 3.0 - 13.0 10.0 0.0 - 13.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.3"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1"> - <gml:posList srsDimension="3"> - 10.0 15.0 0.0 - 10.0 15.0 3.0 - 11.5 15.0 4.5 - 13.0 15.0 3.0 - 13.0 15.0 0.0 - 10.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.4"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 10.0 15.0 3.0 - 10.0 15.0 0.0 - 10.0 10.0 0.0 - 10.0 10.0 3.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.5"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1"> - <gml:posList srsDimension="3"> - 13.0 10.0 0.0 - 13.0 10.0 3.0 - 11.5 10.0 4.5 - 10.0 10.0 3.0 - 10.0 10.0 0.0 - 13.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.6"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 11.5 10.0 4.5 - 11.5 10.0 4.5 - 11.5 15.0 4.5 - 10.0 15.0 3.0 - 10.0 10.0 3.0 - - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.7"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1"> - <gml:posList srsDimension="3"> - 11.5 10.0 4.5 - 13.0 10.0 3.0 - 13.0 15.0 3.0 - 11.5 15.0 4.5 - 11.5 10.0 4.5 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:RoofSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.1"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 0.0 - 10.0 15.0 0.0 - 13.0 15.0 0.0 - 13.0 10.0 0.0 - 10.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:GroundSurface> - </bldg:boundedBy> - </bldg:Building> - </core:cityObjectMember> - <qual:validation> - <qual:validationDate>2002-05-30T09:00:00</qual:validationDate> - <qual:validationSoftware>CityDoctor2</qual:validationSoftware> - <qual:validationPlan> - <qual:globalParameters> - <qual:parameter name="numberOfRoundingPlaces">8</qual:parameter> - <qual:parameter name="minVertexDistance" uom="m">0.0001</qual:parameter> - <qual:parameter name="schematronFile"></qual:parameter> - </qual:globalParameters> - <qual:requirement name="R_GE_R_TOO_FEW_POINTS" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_R_CONSECUTIVE_POINTS_SAME" enabled="true"/> - <qual:requirement name="R_GE_R_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_P_NON_PLANAR" enabled="true"> - <qual:parameter name="type">distance</qual:parameter> - <qual:parameter name="distanceTolerance" uom="m">0.01</qual:parameter> - <qual:parameter name="angleTolerance" uom="deg">1</qual:parameter> - <qual:parameter name="degeneratedPolygonTolerance" uom="m">0.0000</qual:parameter> - </qual:requirement> - <qual:requirement name="R_GE_P_INTERIOR_DISCONNECTED" enabled="true"/> - <qual:requirement name="R_GE_P_INTERSECTING_RINGS" enabled="true"/> - <qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/> - <qual:requirement name="R_GE_P_ORIENTATION_RINGS_SAME" enabled="true"/> - <qual:requirement name="R_GE_P_INNER_RINGS_NESTED" enabled="true"/> - <qual:requirement name="R_GE_S_TOO_FEW_POLYGONS" enabled="true"/> - <qual:requirement name="R_GE_S_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_EDGE" enabled="true"/> - <qual:requirement name="R_GE_S_POLYGON_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_VERTEX" enabled="true"/> - <qual:requirement name="R_GE_S_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" enabled="true"/> - - <qual:filter> - <qual:checking>BUILDING</qual:checking> - <qual:checking>TRANSPORTATION</qual:checking> - <qual:checking>VEGETATION</qual:checking> - <qual:checking>BRIDGE</qual:checking> - <qual:checking>WATER</qual:checking> - <qual:checking>LAND</qual:checking> - </qual:filter> - </qual:validationPlan> - <qual:statistics> - <qual:numErrorBuildings numChecked="1">1</qual:numErrorBuildings> - <qual:numErrorVegetation numChecked="0">0</qual:numErrorVegetation> - <qual:numErrorLandObjects numChecked="0">0</qual:numErrorLandObjects> - <qual:numErrorBridgeObjects numChecked="0">0</qual:numErrorBridgeObjects> - <qual:numErrorWaterObjects numChecked="0">0</qual:numErrorWaterObjects> - <qual:numErrorTransportation numChecked="0">0</qual:numErrorTransportation> - <qual:errorStatistics> - <qual:error name="GE_R_CONSECUTIVE_POINTS_SAME">1</qual:error> - </qual:errorStatistics> - </qual:statistics> - </qual:validation> -</core:CityModel> \ No newline at end of file diff --git a/citygml4j-quality-ade/src/test/resources/SimpleSolid_NonPlanarPolygonNormalsDeviation.gml b/citygml4j-quality-ade/src/test/resources/SimpleSolid_NonPlanarPolygonNormalsDeviation.gml deleted file mode 100644 index 07af13edfd41f9c902dfa77e838649e46bb65364..0000000000000000000000000000000000000000 --- a/citygml4j-quality-ade/src/test/resources/SimpleSolid_NonPlanarPolygonNormalsDeviation.gml +++ /dev/null @@ -1,256 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3 https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3/qualityAde.xsd"> - -<!-- -Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m -Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), -die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert - -CityGML 2.0 - - -linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind. - -10.5.2017 -Author: V. Coors, HFT Stuttgart -Lizenz: ---> - - <core:cityObjectMember> - <bldg:Building gml:id="_Simple_BD.1"> - <qual:validationResult result="ERROR"> - <qual:GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION> - <qual:polygonId>_Simple_BD.1_PG.1</qual:polygonId> - <qual:deviation uom="deg">1.0</qual:deviation> - </qual:GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION> - </qual:validationResult> - <bldg:lod2Solid> - <gml:Solid> - <gml:exterior> - <gml:CompositeSurface> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/> - </gml:CompositeSurface> - </gml:exterior> - </gml:Solid> - </bldg:lod2Solid> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.2"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1"> - <gml:posList srsDimension="3"> - 13.0 15.0 0.0 - 13.0 15.0 3.0 - 13.0 10.0 3.0 - 13.0 10.0 0.0 - 13.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.3"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1"> - <gml:posList srsDimension="3"> - 10.0 15.0 0.0 - 10.0 15.0 3.0 - 11.5 15.0 4.5 - 13.0 15.0 3.0 - 13.0 15.0 0.0 - 10.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.4"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 10.0 15.0 3.0 - 10.0 15.0 0.0 - 10.0 10.0 0.0 - 10.0 10.0 3.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.5"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1"> - <gml:posList srsDimension="3"> - 13.0 10.0 0.0 - 13.0 10.0 3.0 - 11.5 10.0 4.5 - 10.0 10.0 3.0 - 10.0 10.0 0.0 - 13.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.6"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 11.5 10.0 4.5 - 11.5 10.0 4.5 - 11.5 15.0 4.5 - 10.0 15.0 3.0 - 10.0 10.0 3.0 - - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.7"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1"> - <gml:posList srsDimension="3"> - 11.5 10.0 4.5 - 13.0 10.0 3.0 - 13.0 15.0 3.0 - 11.5 15.0 4.5 - 11.5 10.0 4.5 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:RoofSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.1"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 0.0 - 10.0 15.0 0.0 - 13.0 15.0 0.0 - 13.0 10.0 0.0 - 10.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:GroundSurface> - </bldg:boundedBy> - </bldg:Building> - </core:cityObjectMember> - <qual:validation> - <qual:validationDate>2002-05-30T09:00:00</qual:validationDate> - <qual:validationSoftware>CityDoctor2</qual:validationSoftware> - <qual:validationPlan> - <qual:globalParameters> - <qual:parameter name="numberOfRoundingPlaces">8</qual:parameter> - <qual:parameter name="minVertexDistance" uom="m">0.0001</qual:parameter> - <qual:parameter name="schematronFile"></qual:parameter> - </qual:globalParameters> - <qual:requirement name="R_GE_R_TOO_FEW_POINTS" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_R_CONSECUTIVE_POINTS_SAME" enabled="true"/> - <qual:requirement name="R_GE_R_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_P_NON_PLANAR" enabled="true"> - <qual:parameter name="type">distance</qual:parameter> - <qual:parameter name="distanceTolerance" uom="m">0.01</qual:parameter> - <qual:parameter name="angleTolerance" uom="deg">1</qual:parameter> - <qual:parameter name="degeneratedPolygonTolerance" uom="m">0.0000</qual:parameter> - </qual:requirement> - <qual:requirement name="R_GE_P_INTERIOR_DISCONNECTED" enabled="true"/> - <qual:requirement name="R_GE_P_INTERSECTING_RINGS" enabled="true"/> - <qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/> - <qual:requirement name="R_GE_P_ORIENTATION_RINGS_SAME" enabled="true"/> - <qual:requirement name="R_GE_P_INNER_RINGS_NESTED" enabled="true"/> - <qual:requirement name="R_GE_S_TOO_FEW_POLYGONS" enabled="true"/> - <qual:requirement name="R_GE_S_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_EDGE" enabled="true"/> - <qual:requirement name="R_GE_S_POLYGON_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_VERTEX" enabled="true"/> - <qual:requirement name="R_GE_S_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" enabled="true"/> - - <qual:filter> - <qual:checking>BUILDING</qual:checking> - <qual:checking>TRANSPORTATION</qual:checking> - <qual:checking>VEGETATION</qual:checking> - <qual:checking>BRIDGE</qual:checking> - <qual:checking>WATER</qual:checking> - <qual:checking>LAND</qual:checking> - </qual:filter> - </qual:validationPlan> - <qual:statistics> - <qual:numErrorBuildings numChecked="1">1</qual:numErrorBuildings> - <qual:numErrorVegetation numChecked="0">0</qual:numErrorVegetation> - <qual:numErrorLandObjects numChecked="0">0</qual:numErrorLandObjects> - <qual:numErrorBridgeObjects numChecked="0">0</qual:numErrorBridgeObjects> - <qual:numErrorWaterObjects numChecked="0">0</qual:numErrorWaterObjects> - <qual:numErrorTransportation numChecked="0">0</qual:numErrorTransportation> - <qual:errorStatistics> - <qual:error name="GE_R_CONSECUTIVE_POINTS_SAME">1</qual:error> - </qual:errorStatistics> - </qual:statistics> - </qual:validation> -</core:CityModel> \ No newline at end of file diff --git a/citygml4j-quality-ade/src/test/resources/SimpleSolid_OrientationRingsSame.gml b/citygml4j-quality-ade/src/test/resources/SimpleSolid_OrientationRingsSame.gml deleted file mode 100644 index a5dfffece245fbd7933775498c535044bf49271c..0000000000000000000000000000000000000000 --- a/citygml4j-quality-ade/src/test/resources/SimpleSolid_OrientationRingsSame.gml +++ /dev/null @@ -1,256 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3 https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3/qualityAde.xsd"> - -<!-- -Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m -Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), -die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert - -CityGML 2.0 - - -linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind. - -10.5.2017 -Author: V. Coors, HFT Stuttgart -Lizenz: ---> - - <core:cityObjectMember> - <bldg:Building gml:id="_Simple_BD.1"> - <qual:validationResult result="ERROR"> - <qual:GE_P_ORIENTATION_RINGS_SAME> - <qual:polygonId>_Simple_BD.1_PG.1</qual:polygonId> - <qual:linearRingId>_Simple_BD.1_PG.1_Ring1</qual:linearRingId> - </qual:GE_P_ORIENTATION_RINGS_SAME> - </qual:validationResult> - <bldg:lod2Solid> - <gml:Solid> - <gml:exterior> - <gml:CompositeSurface> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/> - </gml:CompositeSurface> - </gml:exterior> - </gml:Solid> - </bldg:lod2Solid> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.2"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1"> - <gml:posList srsDimension="3"> - 13.0 15.0 0.0 - 13.0 15.0 3.0 - 13.0 10.0 3.0 - 13.0 10.0 0.0 - 13.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.3"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1"> - <gml:posList srsDimension="3"> - 10.0 15.0 0.0 - 10.0 15.0 3.0 - 11.5 15.0 4.5 - 13.0 15.0 3.0 - 13.0 15.0 0.0 - 10.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.4"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 10.0 15.0 3.0 - 10.0 15.0 0.0 - 10.0 10.0 0.0 - 10.0 10.0 3.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.5"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1"> - <gml:posList srsDimension="3"> - 13.0 10.0 0.0 - 13.0 10.0 3.0 - 11.5 10.0 4.5 - 10.0 10.0 3.0 - 10.0 10.0 0.0 - 13.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.6"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 11.5 10.0 4.5 - 11.5 10.0 4.5 - 11.5 15.0 4.5 - 10.0 15.0 3.0 - 10.0 10.0 3.0 - - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.7"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1"> - <gml:posList srsDimension="3"> - 11.5 10.0 4.5 - 13.0 10.0 3.0 - 13.0 15.0 3.0 - 11.5 15.0 4.5 - 11.5 10.0 4.5 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:RoofSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.1"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 0.0 - 10.0 15.0 0.0 - 13.0 15.0 0.0 - 13.0 10.0 0.0 - 10.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:GroundSurface> - </bldg:boundedBy> - </bldg:Building> - </core:cityObjectMember> - <qual:validation> - <qual:validationDate>2002-05-30T09:00:00</qual:validationDate> - <qual:validationSoftware>CityDoctor2</qual:validationSoftware> - <qual:validationPlan> - <qual:globalParameters> - <qual:parameter name="numberOfRoundingPlaces">8</qual:parameter> - <qual:parameter name="minVertexDistance" uom="m">0.0001</qual:parameter> - <qual:parameter name="schematronFile"></qual:parameter> - </qual:globalParameters> - <qual:requirement name="R_GE_R_TOO_FEW_POINTS" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_R_CONSECUTIVE_POINTS_SAME" enabled="true"/> - <qual:requirement name="R_GE_R_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_P_NON_PLANAR" enabled="true"> - <qual:parameter name="type">distance</qual:parameter> - <qual:parameter name="distanceTolerance" uom="m">0.01</qual:parameter> - <qual:parameter name="angleTolerance" uom="deg">1</qual:parameter> - <qual:parameter name="degeneratedPolygonTolerance" uom="m">0.0000</qual:parameter> - </qual:requirement> - <qual:requirement name="R_GE_P_INTERIOR_DISCONNECTED" enabled="true"/> - <qual:requirement name="R_GE_P_INTERSECTING_RINGS" enabled="true"/> - <qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/> - <qual:requirement name="R_GE_P_ORIENTATION_RINGS_SAME" enabled="true"/> - <qual:requirement name="R_GE_P_INNER_RINGS_NESTED" enabled="true"/> - <qual:requirement name="R_GE_S_TOO_FEW_POLYGONS" enabled="true"/> - <qual:requirement name="R_GE_S_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_EDGE" enabled="true"/> - <qual:requirement name="R_GE_S_POLYGON_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_VERTEX" enabled="true"/> - <qual:requirement name="R_GE_S_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" enabled="true"/> - - <qual:filter> - <qual:checking>BUILDING</qual:checking> - <qual:checking>TRANSPORTATION</qual:checking> - <qual:checking>VEGETATION</qual:checking> - <qual:checking>BRIDGE</qual:checking> - <qual:checking>WATER</qual:checking> - <qual:checking>LAND</qual:checking> - </qual:filter> - </qual:validationPlan> - <qual:statistics> - <qual:numErrorBuildings numChecked="1">1</qual:numErrorBuildings> - <qual:numErrorVegetation numChecked="0">0</qual:numErrorVegetation> - <qual:numErrorLandObjects numChecked="0">0</qual:numErrorLandObjects> - <qual:numErrorBridgeObjects numChecked="0">0</qual:numErrorBridgeObjects> - <qual:numErrorWaterObjects numChecked="0">0</qual:numErrorWaterObjects> - <qual:numErrorTransportation numChecked="0">0</qual:numErrorTransportation> - <qual:errorStatistics> - <qual:error name="GE_R_CONSECUTIVE_POINTS_SAME">1</qual:error> - </qual:errorStatistics> - </qual:statistics> - </qual:validation> -</core:CityModel> \ No newline at end of file diff --git a/citygml4j-quality-ade/src/test/resources/SimpleSolid_PolygonWrongOrientation.gml b/citygml4j-quality-ade/src/test/resources/SimpleSolid_PolygonWrongOrientation.gml deleted file mode 100644 index 2ef9c8794665180a1f8d98fc3a9dd4aab00236da..0000000000000000000000000000000000000000 --- a/citygml4j-quality-ade/src/test/resources/SimpleSolid_PolygonWrongOrientation.gml +++ /dev/null @@ -1,262 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3 https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3/qualityAde.xsd"> - -<!-- -Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m -Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), -die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert - -CityGML 2.0 - - -linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind. - -10.5.2017 -Author: V. Coors, HFT Stuttgart -Lizenz: ---> - - <core:cityObjectMember> - <bldg:Building gml:id="_Simple_BD.1"> - - <qual:validationResult result="ERROR"> - <qual:GE_S_POLYGON_WRONG_ORIENTATION> - <qual:geometryId>_Simple_BD.1_Geom1</qual:geometryId> - <qual:edges> - <qual:edge> - <qual:from>10.0 1.0 2.0</qual:from> - <qual:to>11.0 2.0 3.0</qual:to> - </qual:edge> - </qual:edges> - </qual:GE_S_POLYGON_WRONG_ORIENTATION> - </qual:validationResult> - <bldg:lod2Solid> - <gml:Solid gml:id="_Simple_BD.1_Geom1"> - <gml:exterior> - <gml:CompositeSurface> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/> - </gml:CompositeSurface> - </gml:exterior> - </gml:Solid> - </bldg:lod2Solid> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.2"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1"> - <gml:posList srsDimension="3"> - 13.0 15.0 0.0 - 13.0 15.0 3.0 - 13.0 10.0 3.0 - 13.0 10.0 0.0 - 13.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.3"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1"> - <gml:posList srsDimension="3"> - 10.0 15.0 0.0 - 10.0 15.0 3.0 - 11.5 15.0 4.5 - 13.0 15.0 3.0 - 13.0 15.0 0.0 - 10.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.4"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 10.0 15.0 3.0 - 10.0 15.0 0.0 - 10.0 10.0 0.0 - 10.0 10.0 3.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.5"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1"> - <gml:posList srsDimension="3"> - 13.0 10.0 0.0 - 13.0 10.0 3.0 - 11.5 10.0 4.5 - 10.0 10.0 3.0 - 10.0 10.0 0.0 - 13.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.6"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 11.5 10.0 4.5 - 11.5 10.0 4.5 - 11.5 15.0 4.5 - 10.0 15.0 3.0 - 10.0 10.0 3.0 - - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.7"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1"> - <gml:posList srsDimension="3"> - 11.5 10.0 4.5 - 13.0 10.0 3.0 - 13.0 15.0 3.0 - 11.5 15.0 4.5 - 11.5 10.0 4.5 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:RoofSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.1"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 0.0 - 10.0 15.0 0.0 - 13.0 15.0 0.0 - 13.0 10.0 0.0 - 10.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:GroundSurface> - </bldg:boundedBy> - </bldg:Building> - </core:cityObjectMember> - <qual:validation> - <qual:validationDate>2002-05-30T09:00:00</qual:validationDate> - <qual:validationSoftware>CityDoctor2</qual:validationSoftware> - <qual:validationPlan> - <qual:globalParameters> - <qual:parameter name="numberOfRoundingPlaces">8</qual:parameter> - <qual:parameter name="minVertexDistance" uom="m">0.0001</qual:parameter> - <qual:parameter name="schematronFile"></qual:parameter> - </qual:globalParameters> - <qual:requirement name="R_GE_R_TOO_FEW_POINTS" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_R_CONSECUTIVE_POINTS_SAME" enabled="true"/> - <qual:requirement name="R_GE_R_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_P_NON_PLANAR" enabled="true"> - <qual:parameter name="type">distance</qual:parameter> - <qual:parameter name="distanceTolerance" uom="m">0.01</qual:parameter> - <qual:parameter name="angleTolerance" uom="deg">1</qual:parameter> - <qual:parameter name="degeneratedPolygonTolerance" uom="m">0.0000</qual:parameter> - </qual:requirement> - <qual:requirement name="R_GE_P_INTERIOR_DISCONNECTED" enabled="true"/> - <qual:requirement name="R_GE_P_INTERSECTING_RINGS" enabled="true"/> - <qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/> - <qual:requirement name="R_GE_P_ORIENTATION_RINGS_SAME" enabled="true"/> - <qual:requirement name="R_GE_P_INNER_RINGS_NESTED" enabled="true"/> - <qual:requirement name="R_GE_S_TOO_FEW_POLYGONS" enabled="true"/> - <qual:requirement name="R_GE_S_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_EDGE" enabled="true"/> - <qual:requirement name="R_GE_S_POLYGON_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_VERTEX" enabled="true"/> - <qual:requirement name="R_GE_S_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" enabled="true"/> - - <qual:filter> - <qual:checking>BUILDING</qual:checking> - <qual:checking>TRANSPORTATION</qual:checking> - <qual:checking>VEGETATION</qual:checking> - <qual:checking>BRIDGE</qual:checking> - <qual:checking>WATER</qual:checking> - <qual:checking>LAND</qual:checking> - </qual:filter> - </qual:validationPlan> - <qual:statistics> - <qual:numErrorBuildings numChecked="1">1</qual:numErrorBuildings> - <qual:numErrorVegetation numChecked="0">0</qual:numErrorVegetation> - <qual:numErrorLandObjects numChecked="0">0</qual:numErrorLandObjects> - <qual:numErrorBridgeObjects numChecked="0">0</qual:numErrorBridgeObjects> - <qual:numErrorWaterObjects numChecked="0">0</qual:numErrorWaterObjects> - <qual:numErrorTransportation numChecked="0">0</qual:numErrorTransportation> - <qual:errorStatistics> - <qual:error name="GE_R_CONSECUTIVE_POINTS_SAME">1</qual:error> - </qual:errorStatistics> - </qual:statistics> - </qual:validation> -</core:CityModel> \ No newline at end of file diff --git a/citygml4j-quality-ade/src/test/resources/SimpleSolid_RingNotClosed.gml b/citygml4j-quality-ade/src/test/resources/SimpleSolid_RingNotClosed.gml deleted file mode 100644 index f01906282f981e46b3146ce76cc3257858a69a8d..0000000000000000000000000000000000000000 --- a/citygml4j-quality-ade/src/test/resources/SimpleSolid_RingNotClosed.gml +++ /dev/null @@ -1,255 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3 https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3/qualityAde.xsd"> - -<!-- -Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m -Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), -die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert - -CityGML 2.0 - - -linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind. - -10.5.2017 -Author: V. Coors, HFT Stuttgart -Lizenz: ---> - - <core:cityObjectMember> - <bldg:Building gml:id="_Simple_BD.1"> - <qual:validationResult result="ERROR"> - <qual:GE_R_NOT_CLOSED> - <qual:linearRingId>_Simple_BD.1_PG.6_LR.1</qual:linearRingId> - </qual:GE_R_NOT_CLOSED> - </qual:validationResult> - <bldg:lod2Solid> - <gml:Solid> - <gml:exterior> - <gml:CompositeSurface> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/> - </gml:CompositeSurface> - </gml:exterior> - </gml:Solid> - </bldg:lod2Solid> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.2"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1"> - <gml:posList srsDimension="3"> - 13.0 15.0 0.0 - 13.0 15.0 3.0 - 13.0 10.0 3.0 - 13.0 10.0 0.0 - 13.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.3"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1"> - <gml:posList srsDimension="3"> - 10.0 15.0 0.0 - 10.0 15.0 3.0 - 11.5 15.0 4.5 - 13.0 15.0 3.0 - 13.0 15.0 0.0 - 10.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.4"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 10.0 15.0 3.0 - 10.0 15.0 0.0 - 10.0 10.0 0.0 - 10.0 10.0 3.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.5"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1"> - <gml:posList srsDimension="3"> - 13.0 10.0 0.0 - 13.0 10.0 3.0 - 11.5 10.0 4.5 - 10.0 10.0 3.0 - 10.0 10.0 0.0 - 13.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.6"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 11.5 10.0 4.5 - 11.5 10.0 4.5 - 11.5 15.0 4.5 - 10.0 15.0 3.0 - 10.0 10.0 3.0 - - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.7"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1"> - <gml:posList srsDimension="3"> - 11.5 10.0 4.5 - 13.0 10.0 3.0 - 13.0 15.0 3.0 - 11.5 15.0 4.5 - 11.5 10.0 4.5 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:RoofSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.1"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 0.0 - 10.0 15.0 0.0 - 13.0 15.0 0.0 - 13.0 10.0 0.0 - 10.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:GroundSurface> - </bldg:boundedBy> - </bldg:Building> - </core:cityObjectMember> - <qual:validation> - <qual:validationDate>2002-05-30T09:00:00</qual:validationDate> - <qual:validationSoftware>CityDoctor2</qual:validationSoftware> - <qual:validationPlan> - <qual:globalParameters> - <qual:parameter name="numberOfRoundingPlaces">8</qual:parameter> - <qual:parameter name="minVertexDistance" uom="m">0.0001</qual:parameter> - <qual:parameter name="schematronFile"></qual:parameter> - </qual:globalParameters> - <qual:requirement name="R_GE_R_TOO_FEW_POINTS" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_R_CONSECUTIVE_POINTS_SAME" enabled="true"/> - <qual:requirement name="R_GE_R_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_P_NON_PLANAR" enabled="true"> - <qual:parameter name="type">distance</qual:parameter> - <qual:parameter name="distanceTolerance" uom="m">0.01</qual:parameter> - <qual:parameter name="angleTolerance" uom="deg">1</qual:parameter> - <qual:parameter name="degeneratedPolygonTolerance" uom="m">0.0000</qual:parameter> - </qual:requirement> - <qual:requirement name="R_GE_P_INTERIOR_DISCONNECTED" enabled="true"/> - <qual:requirement name="R_GE_P_INTERSECTING_RINGS" enabled="true"/> - <qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/> - <qual:requirement name="R_GE_P_ORIENTATION_RINGS_SAME" enabled="true"/> - <qual:requirement name="R_GE_P_INNER_RINGS_NESTED" enabled="true"/> - <qual:requirement name="R_GE_S_TOO_FEW_POLYGONS" enabled="true"/> - <qual:requirement name="R_GE_S_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_EDGE" enabled="true"/> - <qual:requirement name="R_GE_S_POLYGON_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_VERTEX" enabled="true"/> - <qual:requirement name="R_GE_S_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" enabled="true"/> - - <qual:filter> - <qual:checking>BUILDING</qual:checking> - <qual:checking>TRANSPORTATION</qual:checking> - <qual:checking>VEGETATION</qual:checking> - <qual:checking>BRIDGE</qual:checking> - <qual:checking>WATER</qual:checking> - <qual:checking>LAND</qual:checking> - </qual:filter> - </qual:validationPlan> - <qual:statistics> - <qual:numErrorBuildings numChecked="1">1</qual:numErrorBuildings> - <qual:numErrorVegetation numChecked="0">0</qual:numErrorVegetation> - <qual:numErrorLandObjects numChecked="0">0</qual:numErrorLandObjects> - <qual:numErrorBridgeObjects numChecked="0">0</qual:numErrorBridgeObjects> - <qual:numErrorWaterObjects numChecked="0">0</qual:numErrorWaterObjects> - <qual:numErrorTransportation numChecked="0">0</qual:numErrorTransportation> - <qual:errorStatistics> - <qual:error name="GE_R_CONSECUTIVE_POINTS_SAME">1</qual:error> - </qual:errorStatistics> - </qual:statistics> - </qual:validation> -</core:CityModel> \ No newline at end of file diff --git a/citygml4j-quality-ade/src/test/resources/SimpleSolid_RingSelfIntersection.gml b/citygml4j-quality-ade/src/test/resources/SimpleSolid_RingSelfIntersection.gml deleted file mode 100644 index 5b036f2ca8783e3b90e7b872a6630238731c5529..0000000000000000000000000000000000000000 --- a/citygml4j-quality-ade/src/test/resources/SimpleSolid_RingSelfIntersection.gml +++ /dev/null @@ -1,261 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3 https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3/qualityAde.xsd"> - -<!-- -Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m -Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), -die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert - -CityGML 2.0 - - -linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind. - -10.5.2017 -Author: V. Coors, HFT Stuttgart -Lizenz: ---> - - <core:cityObjectMember> - <bldg:Building gml:id="_Simple_BD.1"> - <qual:validationResult result="ERROR"> - <qual:GE_R_SELF_INTERSECTION> - <qual:linearRingId>_Simple_BD.1_PG.6_LR.1</qual:linearRingId> - <qual:type>POINT_TOUCHES_EDGE</qual:type> - <qual:edge1> - <qual:from>10.0 11.0 12.0</qual:from> - <qual:to>11.0 4.0 0.0</qual:to> - </qual:edge1> - <qual:vertex1>5.0 6.0 7.0</qual:vertex1> - </qual:GE_R_SELF_INTERSECTION> - </qual:validationResult> - <bldg:lod2Solid> - <gml:Solid> - <gml:exterior> - <gml:CompositeSurface> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/> - </gml:CompositeSurface> - </gml:exterior> - </gml:Solid> - </bldg:lod2Solid> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.2"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1"> - <gml:posList srsDimension="3"> - 13.0 15.0 0.0 - 13.0 15.0 3.0 - 13.0 10.0 3.0 - 13.0 10.0 0.0 - 13.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.3"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1"> - <gml:posList srsDimension="3"> - 10.0 15.0 0.0 - 10.0 15.0 3.0 - 11.5 15.0 4.5 - 13.0 15.0 3.0 - 13.0 15.0 0.0 - 10.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.4"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 10.0 15.0 3.0 - 10.0 15.0 0.0 - 10.0 10.0 0.0 - 10.0 10.0 3.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.5"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1"> - <gml:posList srsDimension="3"> - 13.0 10.0 0.0 - 13.0 10.0 3.0 - 11.5 10.0 4.5 - 10.0 10.0 3.0 - 10.0 10.0 0.0 - 13.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.6"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 11.5 10.0 4.5 - 11.5 10.0 4.5 - 11.5 15.0 4.5 - 10.0 15.0 3.0 - 10.0 10.0 3.0 - - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.7"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1"> - <gml:posList srsDimension="3"> - 11.5 10.0 4.5 - 13.0 10.0 3.0 - 13.0 15.0 3.0 - 11.5 15.0 4.5 - 11.5 10.0 4.5 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:RoofSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.1"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 0.0 - 10.0 15.0 0.0 - 13.0 15.0 0.0 - 13.0 10.0 0.0 - 10.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:GroundSurface> - </bldg:boundedBy> - </bldg:Building> - </core:cityObjectMember> - <qual:validation> - <qual:validationDate>2002-05-30T09:00:00</qual:validationDate> - <qual:validationSoftware>CityDoctor2</qual:validationSoftware> - <qual:validationPlan> - <qual:globalParameters> - <qual:parameter name="numberOfRoundingPlaces">8</qual:parameter> - <qual:parameter name="minVertexDistance" uom="m">0.0001</qual:parameter> - <qual:parameter name="schematronFile"></qual:parameter> - </qual:globalParameters> - <qual:requirement name="R_GE_R_TOO_FEW_POINTS" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_R_CONSECUTIVE_POINTS_SAME" enabled="true"/> - <qual:requirement name="R_GE_R_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_P_NON_PLANAR" enabled="true"> - <qual:parameter name="type">distance</qual:parameter> - <qual:parameter name="distanceTolerance" uom="m">0.01</qual:parameter> - <qual:parameter name="angleTolerance" uom="deg">1</qual:parameter> - <qual:parameter name="degeneratedPolygonTolerance" uom="m">0.0000</qual:parameter> - </qual:requirement> - <qual:requirement name="R_GE_P_INTERIOR_DISCONNECTED" enabled="true"/> - <qual:requirement name="R_GE_P_INTERSECTING_RINGS" enabled="true"/> - <qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/> - <qual:requirement name="R_GE_P_ORIENTATION_RINGS_SAME" enabled="true"/> - <qual:requirement name="R_GE_P_INNER_RINGS_NESTED" enabled="true"/> - <qual:requirement name="R_GE_S_TOO_FEW_POLYGONS" enabled="true"/> - <qual:requirement name="R_GE_S_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_EDGE" enabled="true"/> - <qual:requirement name="R_GE_S_POLYGON_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_VERTEX" enabled="true"/> - <qual:requirement name="R_GE_S_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" enabled="true"/> - - <qual:filter> - <qual:checking>BUILDING</qual:checking> - <qual:checking>TRANSPORTATION</qual:checking> - <qual:checking>VEGETATION</qual:checking> - <qual:checking>BRIDGE</qual:checking> - <qual:checking>WATER</qual:checking> - <qual:checking>LAND</qual:checking> - </qual:filter> - </qual:validationPlan> - <qual:statistics> - <qual:numErrorBuildings numChecked="1">1</qual:numErrorBuildings> - <qual:numErrorVegetation numChecked="0">0</qual:numErrorVegetation> - <qual:numErrorLandObjects numChecked="0">0</qual:numErrorLandObjects> - <qual:numErrorBridgeObjects numChecked="0">0</qual:numErrorBridgeObjects> - <qual:numErrorWaterObjects numChecked="0">0</qual:numErrorWaterObjects> - <qual:numErrorTransportation numChecked="0">0</qual:numErrorTransportation> - <qual:errorStatistics> - <qual:error name="GE_R_CONSECUTIVE_POINTS_SAME">1</qual:error> - </qual:errorStatistics> - </qual:statistics> - </qual:validation> -</core:CityModel> \ No newline at end of file diff --git a/citygml4j-quality-ade/src/test/resources/SimpleSolid_SolidNotClosed.gml b/citygml4j-quality-ade/src/test/resources/SimpleSolid_SolidNotClosed.gml deleted file mode 100644 index 9e1267269e03eb3acb3da7c2c1ffe5ac5960500e..0000000000000000000000000000000000000000 --- a/citygml4j-quality-ade/src/test/resources/SimpleSolid_SolidNotClosed.gml +++ /dev/null @@ -1,262 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3 https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3/qualityAde.xsd"> - -<!-- -Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m -Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), -die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert - -CityGML 2.0 - - -linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind. - -10.5.2017 -Author: V. Coors, HFT Stuttgart -Lizenz: ---> - - <core:cityObjectMember> - <bldg:Building gml:id="_Simple_BD.1"> - - <qual:validationResult result="ERROR"> - <qual:GE_S_NOT_CLOSED> - <qual:geometryId>_Simple_BD.1_Geom1</qual:geometryId> - <qual:edges> - <qual:edge> - <qual:from>10.0 1.0 2.0</qual:from> - <qual:to>11.0 2.0 3.0</qual:to> - </qual:edge> - </qual:edges> - </qual:GE_S_NOT_CLOSED> - </qual:validationResult> - <bldg:lod2Solid> - <gml:Solid gml:id="_Simple_BD.1_Geom1"> - <gml:exterior> - <gml:CompositeSurface> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/> - </gml:CompositeSurface> - </gml:exterior> - </gml:Solid> - </bldg:lod2Solid> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.2"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1"> - <gml:posList srsDimension="3"> - 13.0 15.0 0.0 - 13.0 15.0 3.0 - 13.0 10.0 3.0 - 13.0 10.0 0.0 - 13.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.3"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1"> - <gml:posList srsDimension="3"> - 10.0 15.0 0.0 - 10.0 15.0 3.0 - 11.5 15.0 4.5 - 13.0 15.0 3.0 - 13.0 15.0 0.0 - 10.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.4"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 10.0 15.0 3.0 - 10.0 15.0 0.0 - 10.0 10.0 0.0 - 10.0 10.0 3.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.5"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1"> - <gml:posList srsDimension="3"> - 13.0 10.0 0.0 - 13.0 10.0 3.0 - 11.5 10.0 4.5 - 10.0 10.0 3.0 - 10.0 10.0 0.0 - 13.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.6"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 11.5 10.0 4.5 - 11.5 10.0 4.5 - 11.5 15.0 4.5 - 10.0 15.0 3.0 - 10.0 10.0 3.0 - - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.7"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1"> - <gml:posList srsDimension="3"> - 11.5 10.0 4.5 - 13.0 10.0 3.0 - 13.0 15.0 3.0 - 11.5 15.0 4.5 - 11.5 10.0 4.5 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:RoofSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.1"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 0.0 - 10.0 15.0 0.0 - 13.0 15.0 0.0 - 13.0 10.0 0.0 - 10.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:GroundSurface> - </bldg:boundedBy> - </bldg:Building> - </core:cityObjectMember> - <qual:validation> - <qual:validationDate>2002-05-30T09:00:00</qual:validationDate> - <qual:validationSoftware>CityDoctor2</qual:validationSoftware> - <qual:validationPlan> - <qual:globalParameters> - <qual:parameter name="numberOfRoundingPlaces">8</qual:parameter> - <qual:parameter name="minVertexDistance" uom="m">0.0001</qual:parameter> - <qual:parameter name="schematronFile"></qual:parameter> - </qual:globalParameters> - <qual:requirement name="R_GE_R_TOO_FEW_POINTS" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_R_CONSECUTIVE_POINTS_SAME" enabled="true"/> - <qual:requirement name="R_GE_R_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_P_NON_PLANAR" enabled="true"> - <qual:parameter name="type">distance</qual:parameter> - <qual:parameter name="distanceTolerance" uom="m">0.01</qual:parameter> - <qual:parameter name="angleTolerance" uom="deg">1</qual:parameter> - <qual:parameter name="degeneratedPolygonTolerance" uom="m">0.0000</qual:parameter> - </qual:requirement> - <qual:requirement name="R_GE_P_INTERIOR_DISCONNECTED" enabled="true"/> - <qual:requirement name="R_GE_P_INTERSECTING_RINGS" enabled="true"/> - <qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/> - <qual:requirement name="R_GE_P_ORIENTATION_RINGS_SAME" enabled="true"/> - <qual:requirement name="R_GE_P_INNER_RINGS_NESTED" enabled="true"/> - <qual:requirement name="R_GE_S_TOO_FEW_POLYGONS" enabled="true"/> - <qual:requirement name="R_GE_S_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_EDGE" enabled="true"/> - <qual:requirement name="R_GE_S_POLYGON_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_VERTEX" enabled="true"/> - <qual:requirement name="R_GE_S_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" enabled="true"/> - - <qual:filter> - <qual:checking>BUILDING</qual:checking> - <qual:checking>TRANSPORTATION</qual:checking> - <qual:checking>VEGETATION</qual:checking> - <qual:checking>BRIDGE</qual:checking> - <qual:checking>WATER</qual:checking> - <qual:checking>LAND</qual:checking> - </qual:filter> - </qual:validationPlan> - <qual:statistics> - <qual:numErrorBuildings numChecked="1">1</qual:numErrorBuildings> - <qual:numErrorVegetation numChecked="0">0</qual:numErrorVegetation> - <qual:numErrorLandObjects numChecked="0">0</qual:numErrorLandObjects> - <qual:numErrorBridgeObjects numChecked="0">0</qual:numErrorBridgeObjects> - <qual:numErrorWaterObjects numChecked="0">0</qual:numErrorWaterObjects> - <qual:numErrorTransportation numChecked="0">0</qual:numErrorTransportation> - <qual:errorStatistics> - <qual:error name="GE_R_CONSECUTIVE_POINTS_SAME">1</qual:error> - </qual:errorStatistics> - </qual:statistics> - </qual:validation> -</core:CityModel> \ No newline at end of file diff --git a/citygml4j-quality-ade/src/test/resources/SimpleSolid_SolidSelfIntersection.gml b/citygml4j-quality-ade/src/test/resources/SimpleSolid_SolidSelfIntersection.gml deleted file mode 100644 index 6d55c8adfb63d4423c953369d8ff5c810894d262..0000000000000000000000000000000000000000 --- a/citygml4j-quality-ade/src/test/resources/SimpleSolid_SolidSelfIntersection.gml +++ /dev/null @@ -1,257 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3 https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3/qualityAde.xsd"> - -<!-- -Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m -Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), -die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert - -CityGML 2.0 - - -linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind. - -10.5.2017 -Author: V. Coors, HFT Stuttgart -Lizenz: ---> - - <core:cityObjectMember> - <bldg:Building gml:id="_Simple_BD.1"> - <qual:validationResult result="ERROR"> - <qual:GE_S_SELF_INTERSECTION> - <qual:geometryId>_Simple_BD.1_Geom1</qual:geometryId> - <qual:polygonId1>_Simple_BD.1_PG.1</qual:polygonId1> - <qual:polygonId2>_Simple_BD.1_PG.2</qual:polygonId2> - </qual:GE_S_SELF_INTERSECTION> - </qual:validationResult> - <bldg:lod2Solid> - <gml:Solid gml:id="_Simple_BD.1_Geom1"> - <gml:exterior> - <gml:CompositeSurface> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/> - </gml:CompositeSurface> - </gml:exterior> - </gml:Solid> - </bldg:lod2Solid> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.2"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1"> - <gml:posList srsDimension="3"> - 13.0 15.0 0.0 - 13.0 15.0 3.0 - 13.0 10.0 3.0 - 13.0 10.0 0.0 - 13.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.3"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1"> - <gml:posList srsDimension="3"> - 10.0 15.0 0.0 - 10.0 15.0 3.0 - 11.5 15.0 4.5 - 13.0 15.0 3.0 - 13.0 15.0 0.0 - 10.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.4"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 10.0 15.0 3.0 - 10.0 15.0 0.0 - 10.0 10.0 0.0 - 10.0 10.0 3.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.5"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1"> - <gml:posList srsDimension="3"> - 13.0 10.0 0.0 - 13.0 10.0 3.0 - 11.5 10.0 4.5 - 10.0 10.0 3.0 - 10.0 10.0 0.0 - 13.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.6"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 11.5 10.0 4.5 - 11.5 10.0 4.5 - 11.5 15.0 4.5 - 10.0 15.0 3.0 - 10.0 10.0 3.0 - - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.7"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1"> - <gml:posList srsDimension="3"> - 11.5 10.0 4.5 - 13.0 10.0 3.0 - 13.0 15.0 3.0 - 11.5 15.0 4.5 - 11.5 10.0 4.5 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:RoofSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.1"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 0.0 - 10.0 15.0 0.0 - 13.0 15.0 0.0 - 13.0 10.0 0.0 - 10.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:GroundSurface> - </bldg:boundedBy> - </bldg:Building> - </core:cityObjectMember> - <qual:validation> - <qual:validationDate>2002-05-30T09:00:00</qual:validationDate> - <qual:validationSoftware>CityDoctor2</qual:validationSoftware> - <qual:validationPlan> - <qual:globalParameters> - <qual:parameter name="numberOfRoundingPlaces">8</qual:parameter> - <qual:parameter name="minVertexDistance" uom="m">0.0001</qual:parameter> - <qual:parameter name="schematronFile"></qual:parameter> - </qual:globalParameters> - <qual:requirement name="R_GE_R_TOO_FEW_POINTS" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_R_CONSECUTIVE_POINTS_SAME" enabled="true"/> - <qual:requirement name="R_GE_R_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_P_NON_PLANAR" enabled="true"> - <qual:parameter name="type">distance</qual:parameter> - <qual:parameter name="distanceTolerance" uom="m">0.01</qual:parameter> - <qual:parameter name="angleTolerance" uom="deg">1</qual:parameter> - <qual:parameter name="degeneratedPolygonTolerance" uom="m">0.0000</qual:parameter> - </qual:requirement> - <qual:requirement name="R_GE_P_INTERIOR_DISCONNECTED" enabled="true"/> - <qual:requirement name="R_GE_P_INTERSECTING_RINGS" enabled="true"/> - <qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/> - <qual:requirement name="R_GE_P_ORIENTATION_RINGS_SAME" enabled="true"/> - <qual:requirement name="R_GE_P_INNER_RINGS_NESTED" enabled="true"/> - <qual:requirement name="R_GE_S_TOO_FEW_POLYGONS" enabled="true"/> - <qual:requirement name="R_GE_S_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_EDGE" enabled="true"/> - <qual:requirement name="R_GE_S_POLYGON_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_VERTEX" enabled="true"/> - <qual:requirement name="R_GE_S_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" enabled="true"/> - - <qual:filter> - <qual:checking>BUILDING</qual:checking> - <qual:checking>TRANSPORTATION</qual:checking> - <qual:checking>VEGETATION</qual:checking> - <qual:checking>BRIDGE</qual:checking> - <qual:checking>WATER</qual:checking> - <qual:checking>LAND</qual:checking> - </qual:filter> - </qual:validationPlan> - <qual:statistics> - <qual:numErrorBuildings numChecked="1">1</qual:numErrorBuildings> - <qual:numErrorVegetation numChecked="0">0</qual:numErrorVegetation> - <qual:numErrorLandObjects numChecked="0">0</qual:numErrorLandObjects> - <qual:numErrorBridgeObjects numChecked="0">0</qual:numErrorBridgeObjects> - <qual:numErrorWaterObjects numChecked="0">0</qual:numErrorWaterObjects> - <qual:numErrorTransportation numChecked="0">0</qual:numErrorTransportation> - <qual:errorStatistics> - <qual:error name="GE_R_CONSECUTIVE_POINTS_SAME">1</qual:error> - </qual:errorStatistics> - </qual:statistics> - </qual:validation> -</core:CityModel> \ No newline at end of file diff --git a/citygml4j-quality-ade/src/test/resources/SimpleSolid_TooFewPoints.gml b/citygml4j-quality-ade/src/test/resources/SimpleSolid_TooFewPoints.gml deleted file mode 100644 index 244901c92c5571a3fd3a5a9c15f65504235c7251..0000000000000000000000000000000000000000 --- a/citygml4j-quality-ade/src/test/resources/SimpleSolid_TooFewPoints.gml +++ /dev/null @@ -1,255 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3 https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3/qualityAde.xsd"> - -<!-- -Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m -Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), -die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert - -CityGML 2.0 - - -linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind. - -10.5.2017 -Author: V. Coors, HFT Stuttgart -Lizenz: ---> - - <core:cityObjectMember> - <bldg:Building gml:id="_Simple_BD.1"> - <qual:validationResult result="ERROR"> - <qual:GE_R_TOO_FEW_POINTS> - <qual:linearRingId>_Simple_BD.1_PG.6_LR.1</qual:linearRingId> - </qual:GE_R_TOO_FEW_POINTS> - </qual:validationResult> - <bldg:lod2Solid> - <gml:Solid> - <gml:exterior> - <gml:CompositeSurface> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/> - </gml:CompositeSurface> - </gml:exterior> - </gml:Solid> - </bldg:lod2Solid> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.2"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1"> - <gml:posList srsDimension="3"> - 13.0 15.0 0.0 - 13.0 15.0 3.0 - 13.0 10.0 3.0 - 13.0 10.0 0.0 - 13.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.3"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1"> - <gml:posList srsDimension="3"> - 10.0 15.0 0.0 - 10.0 15.0 3.0 - 11.5 15.0 4.5 - 13.0 15.0 3.0 - 13.0 15.0 0.0 - 10.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.4"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 10.0 15.0 3.0 - 10.0 15.0 0.0 - 10.0 10.0 0.0 - 10.0 10.0 3.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.5"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1"> - <gml:posList srsDimension="3"> - 13.0 10.0 0.0 - 13.0 10.0 3.0 - 11.5 10.0 4.5 - 10.0 10.0 3.0 - 10.0 10.0 0.0 - 13.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.6"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 11.5 10.0 4.5 - 11.5 10.0 4.5 - 11.5 15.0 4.5 - 10.0 15.0 3.0 - 10.0 10.0 3.0 - - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.7"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1"> - <gml:posList srsDimension="3"> - 11.5 10.0 4.5 - 13.0 10.0 3.0 - 13.0 15.0 3.0 - 11.5 15.0 4.5 - 11.5 10.0 4.5 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:RoofSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.1"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 0.0 - 10.0 15.0 0.0 - 13.0 15.0 0.0 - 13.0 10.0 0.0 - 10.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:GroundSurface> - </bldg:boundedBy> - </bldg:Building> - </core:cityObjectMember> - <qual:validation> - <qual:validationDate>2002-05-30T09:00:00</qual:validationDate> - <qual:validationSoftware>CityDoctor2</qual:validationSoftware> - <qual:validationPlan> - <qual:globalParameters> - <qual:parameter name="numberOfRoundingPlaces">8</qual:parameter> - <qual:parameter name="minVertexDistance" uom="m">0.0001</qual:parameter> - <qual:parameter name="schematronFile"></qual:parameter> - </qual:globalParameters> - <qual:requirement name="R_GE_R_TOO_FEW_POINTS" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_R_CONSECUTIVE_POINTS_SAME" enabled="true"/> - <qual:requirement name="R_GE_R_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_P_NON_PLANAR" enabled="true"> - <qual:parameter name="type">distance</qual:parameter> - <qual:parameter name="distanceTolerance" uom="m">0.01</qual:parameter> - <qual:parameter name="angleTolerance" uom="deg">1</qual:parameter> - <qual:parameter name="degeneratedPolygonTolerance" uom="m">0.0000</qual:parameter> - </qual:requirement> - <qual:requirement name="R_GE_P_INTERIOR_DISCONNECTED" enabled="true"/> - <qual:requirement name="R_GE_P_INTERSECTING_RINGS" enabled="true"/> - <qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/> - <qual:requirement name="R_GE_P_ORIENTATION_RINGS_SAME" enabled="true"/> - <qual:requirement name="R_GE_P_INNER_RINGS_NESTED" enabled="true"/> - <qual:requirement name="R_GE_S_TOO_FEW_POLYGONS" enabled="true"/> - <qual:requirement name="R_GE_S_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_EDGE" enabled="true"/> - <qual:requirement name="R_GE_S_POLYGON_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_VERTEX" enabled="true"/> - <qual:requirement name="R_GE_S_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" enabled="true"/> - - <qual:filter> - <qual:checking>BUILDING</qual:checking> - <qual:checking>TRANSPORTATION</qual:checking> - <qual:checking>VEGETATION</qual:checking> - <qual:checking>BRIDGE</qual:checking> - <qual:checking>WATER</qual:checking> - <qual:checking>LAND</qual:checking> - </qual:filter> - </qual:validationPlan> - <qual:statistics> - <qual:numErrorBuildings numChecked="1">1</qual:numErrorBuildings> - <qual:numErrorVegetation numChecked="0">0</qual:numErrorVegetation> - <qual:numErrorLandObjects numChecked="0">0</qual:numErrorLandObjects> - <qual:numErrorBridgeObjects numChecked="0">0</qual:numErrorBridgeObjects> - <qual:numErrorWaterObjects numChecked="0">0</qual:numErrorWaterObjects> - <qual:numErrorTransportation numChecked="0">0</qual:numErrorTransportation> - <qual:errorStatistics> - <qual:error name="GE_R_CONSECUTIVE_POINTS_SAME">1</qual:error> - </qual:errorStatistics> - </qual:statistics> - </qual:validation> -</core:CityModel> \ No newline at end of file diff --git a/citygml4j-quality-ade/src/test/resources/SimpleSolid_TooFewPolygons.gml b/citygml4j-quality-ade/src/test/resources/SimpleSolid_TooFewPolygons.gml deleted file mode 100644 index af5412489646970541fa822d2524b385e6ff3116..0000000000000000000000000000000000000000 --- a/citygml4j-quality-ade/src/test/resources/SimpleSolid_TooFewPolygons.gml +++ /dev/null @@ -1,255 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<core:CityModel xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/citygml/building/2.0 http://schemas.opengis.net/citygml/building/2.0/building.xsd http://www.opengis.net/citygml/appearance/2.0 http://schemas.opengis.net/citygml/appearance/2.0/appearance.xsd http://www.opengis.net/citygml/relief/2.0 http://schemas.opengis.net/citygml/relief/2.0/relief.xsd http://www.opengis.net/citygml/2.0 http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd http://www.opengis.net/citygml/generics/2.0 http://schemas.opengis.net/citygml/generics/2.0/generics.xsd https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3 https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.3/qualityAde.xsd"> - -<!-- -Einfaches Gebäude mit Grundriss 3m x 5m und Satteldach, Traufhöhe 3m, Firsthöhe 4,5m -Modelliert mit Begrenzungsflächen (eine Dachfläche, 4 Wandflächen, 1 Grundfläche), -die Gebäudegeometrie als Solid, der auf die Polygone der Begrenzungsflächen referenziert - -CityGML 2.0 - - -linear ring _Simple_BD.1_PG.6_LR.1 beinhaltet zwei aufeinander folgende Punkte, die identisch sind. - -10.5.2017 -Author: V. Coors, HFT Stuttgart -Lizenz: ---> - - <core:cityObjectMember> - <bldg:Building gml:id="_Simple_BD.1"> - <qual:validationResult result="ERROR"> - <qual:GE_S_TOO_FEW_POLYGONS> - <qual:geometryId>_Simple_BD.1_Geom1</qual:geometryId> - </qual:GE_S_TOO_FEW_POLYGONS> - </qual:validationResult> - <bldg:lod2Solid> - <gml:Solid gml:id="_Simple_BD.1_Geom1"> - <gml:exterior> - <gml:CompositeSurface> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.1"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.2"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.3"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.4"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.5"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.6"/> - <gml:surfaceMember xlink:href="#_Simple_BD.1_PG.7"/> - </gml:CompositeSurface> - </gml:exterior> - </gml:Solid> - </bldg:lod2Solid> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.2"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.2_LR.1"> - <gml:posList srsDimension="3"> - 13.0 15.0 0.0 - 13.0 15.0 3.0 - 13.0 10.0 3.0 - 13.0 10.0 0.0 - 13.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_2"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.3"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.3_LR.1"> - <gml:posList srsDimension="3"> - 10.0 15.0 0.0 - 10.0 15.0 3.0 - 11.5 15.0 4.5 - 13.0 15.0 3.0 - 13.0 15.0 0.0 - 10.0 15.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_3"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.4"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.4_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 10.0 15.0 3.0 - 10.0 15.0 0.0 - 10.0 10.0 0.0 - 10.0 10.0 3.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:WallSurface gml:id="_Simple_BD.1_WallSurface_4"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.5"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.5_LR.1"> - <gml:posList srsDimension="3"> - 13.0 10.0 0.0 - 13.0 10.0 3.0 - 11.5 10.0 4.5 - 10.0 10.0 3.0 - 10.0 10.0 0.0 - 13.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:WallSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:RoofSurface gml:id="_Simple_BD.1_RoofSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.6"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.6_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 3.0 - 11.5 10.0 4.5 - 11.5 10.0 4.5 - 11.5 15.0 4.5 - 10.0 15.0 3.0 - 10.0 10.0 3.0 - - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.7"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.7_LR.1"> - <gml:posList srsDimension="3"> - 11.5 10.0 4.5 - 13.0 10.0 3.0 - 13.0 15.0 3.0 - 11.5 15.0 4.5 - 11.5 10.0 4.5 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:RoofSurface> - </bldg:boundedBy> - <bldg:boundedBy> - <bldg:GroundSurface gml:id="_Simple_BD.1_GroundSurface_1"> - <bldg:lod2MultiSurface> - <gml:MultiSurface> - <gml:surfaceMember> - <gml:Polygon gml:id="_Simple_BD.1_PG.1"> - <gml:exterior> - <gml:LinearRing gml:id="_Simple_BD.1_PG.1_LR.1"> - <gml:posList srsDimension="3"> - 10.0 10.0 0.0 - 10.0 15.0 0.0 - 13.0 15.0 0.0 - 13.0 10.0 0.0 - 10.0 10.0 0.0 - </gml:posList> - </gml:LinearRing> - </gml:exterior> - </gml:Polygon> - </gml:surfaceMember> - </gml:MultiSurface> - </bldg:lod2MultiSurface> - </bldg:GroundSurface> - </bldg:boundedBy> - </bldg:Building> - </core:cityObjectMember> - <qual:validation> - <qual:validationDate>2002-05-30T09:00:00</qual:validationDate> - <qual:validationSoftware>CityDoctor2</qual:validationSoftware> - <qual:validationPlan> - <qual:globalParameters> - <qual:parameter name="numberOfRoundingPlaces">8</qual:parameter> - <qual:parameter name="minVertexDistance" uom="m">0.0001</qual:parameter> - <qual:parameter name="schematronFile"></qual:parameter> - </qual:globalParameters> - <qual:requirement name="R_GE_R_TOO_FEW_POINTS" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_R_CONSECUTIVE_POINTS_SAME" enabled="true"/> - <qual:requirement name="R_GE_R_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_R_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_P_NON_PLANAR" enabled="true"> - <qual:parameter name="type">distance</qual:parameter> - <qual:parameter name="distanceTolerance" uom="m">0.01</qual:parameter> - <qual:parameter name="angleTolerance" uom="deg">1</qual:parameter> - <qual:parameter name="degeneratedPolygonTolerance" uom="m">0.0000</qual:parameter> - </qual:requirement> - <qual:requirement name="R_GE_P_INTERIOR_DISCONNECTED" enabled="true"/> - <qual:requirement name="R_GE_P_INTERSECTING_RINGS" enabled="true"/> - <qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/> - <qual:requirement name="R_GE_P_ORIENTATION_RINGS_SAME" enabled="true"/> - <qual:requirement name="R_GE_P_INNER_RINGS_NESTED" enabled="true"/> - <qual:requirement name="R_GE_S_TOO_FEW_POLYGONS" enabled="true"/> - <qual:requirement name="R_GE_S_NOT_CLOSED" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_EDGE" enabled="true"/> - <qual:requirement name="R_GE_S_POLYGON_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION" enabled="true"/> - <qual:requirement name="R_GE_S_NON_MANIFOLD_VERTEX" enabled="true"/> - <qual:requirement name="R_GE_S_SELF_INTERSECTION" enabled="true"/> - <qual:requirement name="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS" enabled="true"/> - - <qual:filter> - <qual:checking>BUILDING</qual:checking> - <qual:checking>TRANSPORTATION</qual:checking> - <qual:checking>VEGETATION</qual:checking> - <qual:checking>BRIDGE</qual:checking> - <qual:checking>WATER</qual:checking> - <qual:checking>LAND</qual:checking> - </qual:filter> - </qual:validationPlan> - <qual:statistics> - <qual:numErrorBuildings numChecked="1">1</qual:numErrorBuildings> - <qual:numErrorVegetation numChecked="0">0</qual:numErrorVegetation> - <qual:numErrorLandObjects numChecked="0">0</qual:numErrorLandObjects> - <qual:numErrorBridgeObjects numChecked="0">0</qual:numErrorBridgeObjects> - <qual:numErrorWaterObjects numChecked="0">0</qual:numErrorWaterObjects> - <qual:numErrorTransportation numChecked="0">0</qual:numErrorTransportation> - <qual:errorStatistics> - <qual:error name="GE_R_CONSECUTIVE_POINTS_SAME">1</qual:error> - </qual:errorStatistics> - </qual:statistics> - </qual:validation> -</core:CityModel> \ No newline at end of file diff --git a/citygml4j-quality-ade/test.gml b/citygml4j-quality-ade/test.gml index 9e3fd3e6d46887707f9614e03f9cc3a8181bd17b..9ade22cf3c81ca8d8d91779f888e322895603822 100644 --- a/citygml4j-quality-ade/test.gml +++ b/citygml4j-quality-ade/test.gml @@ -1,18 +1,64 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <CityModel xmlns:xAL="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:wtr="http://www.opengis.net/citygml/waterbody/2.0" xmlns:app="http://www.opengis.net/citygml/appearance/2.0" xmlns="http://www.opengis.net/citygml/2.0" xmlns:veg="http://www.opengis.net/citygml/vegetation/2.0" xmlns:dem="http://www.opengis.net/citygml/relief/2.0" xmlns:tran="http://www.opengis.net/citygml/transportation/2.0" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:grp="http://www.opengis.net/citygml/cityobjectgroup/2.0" xmlns:tun="http://www.opengis.net/citygml/tunnel/2.0" xmlns:frn="http://www.opengis.net/citygml/cityfurniture/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:brid="http://www.opengis.net/citygml/bridge/2.0" xmlns:gen="http://www.opengis.net/citygml/generics/2.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.4" xmlns:luse="http://www.opengis.net/citygml/landuse/2.0" xsi:schemaLocation="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.4 file:/C:/Job/QualityADE/QualityADERepo/citygml4j-quality-ade/target/classes/qualityAde.xsd"> + <cityObjectMember> + <bldg:Building gml:id="testId"> + <qual:validationResult> + <qual:ValidationResult> + <qual:validationPlanID xlink:href="#planId"/> + <qual:error> + <qual:GE_S_ALL_POLYGONS_WRONG_ORIENTATION> + <qual:geometryId>geomId</qual:geometryId> + </qual:GE_S_ALL_POLYGONS_WRONG_ORIENTATION> + </qual:error> + <qual:resultType>ERROR</qual:resultType> + </qual:ValidationResult> + </qual:validationResult> + </bldg:Building> + </cityObjectMember> <gml:featureMember> - <qual:validation> - <qual:validationDate>2022-03-29T12:31:57.2173659+02:00</qual:validationDate> + <qual:Validation gml:id="planId"> + <qual:validationDate>2022-04-12T12:28:14.1485207+02:00</qual:validationDate> <qual:validationSoftware>testSoftware</qual:validationSoftware> + <qual:statistics> + <qual:Statistics> + <qual:numErrorBridgeObjects> + <qual:FeatureStatistics> + <qual:numChecked>5</qual:numChecked> + <qual:numErrors>2</qual:numErrors> + </qual:FeatureStatistics> + </qual:numErrorBridgeObjects> + </qual:Statistics> + </qual:statistics> <qual:validationPlan> - <qual:globalParameters> - <qual:requirement uom="uom" name="test">5</qual:requirement> - </qual:globalParameters> - <qual:requirement name="R_GE_P_HOLE_OUTSIDE" enabled="true"/> - <qual:filter> - <qual:checking>BRIDGE</qual:checking> - </qual:filter> + <qual:ValidationPlan> + <qual:globalParameters> + <qual:GlobalParameters> + <qual:parameter> + <qual:Parameter> + <qual:name>test</qual:name> + <qual:uom>uom</qual:uom> + <qual:value>5</qual:value> + </qual:Parameter> + </qual:parameter> + </qual:GlobalParameters> + </qual:globalParameters> + <qual:filter> + <qual:Filter> + <qual:checking> + <qual:Checking> + <qual:featureType>BRIDGE</qual:featureType> + </qual:Checking> + </qual:checking> + </qual:Filter> + </qual:filter> + <qual:requirement> + <qual:Requirement> + <qual:enabled>true</qual:enabled> + <qual:requirementType>R_GE_P_HOLE_OUTSIDE</qual:requirementType> + </qual:Requirement> + </qual:requirement> + </qual:ValidationPlan> </qual:validationPlan> - </qual:validation> + </qual:Validation> </gml:featureMember> </CityModel> \ No newline at end of file