Commit 52ac2709 authored by Matthias Betz's avatar Matthias Betz
Browse files

update quality ade to 1.0.0

parent 38715130
Pipeline #7237 passed with stage
in 6 seconds
......@@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>de.hft.stuttgart</groupId>
<artifactId>citygml4j-quality-ade</artifactId>
<version>3.1.4</version>
<version>3.2.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
......
......@@ -25,7 +25,7 @@ import org.citygml4j.xml.module.ade.ADEModule;
public class QualityADEContext implements CityGMLADE {
private final List<ADEModule> modules = Collections.singletonList(QualityADEModule.V0_1_4);
private final List<ADEModule> modules = Collections.singletonList(QualityADEModule.V1_0_0);
@Override
public List<ADEModule> getADEModules() {
......
......@@ -22,9 +22,9 @@ import org.citygml4j.xml.module.ade.ADEModule;
public class QualityADEModule extends ADEModule {
public static final String NAMESPACE_URI = "https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.4";
public static final String NAMESPACE_URI = "https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/1.0.0";
public static final QualityADEModule V0_1_4 = new QualityADEModule();
public static final QualityADEModule V1_0_0 = new QualityADEModule();
public QualityADEModule() {
super(NAMESPACE_URI, "qual", CityGMLVersion.v2_0);
......
/*-
* Copyright 2023 Hochschule für Technik Stuttgart
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.hft.stuttgart.quality.adapter.types;
import javax.xml.namespace.QName;
import org.xmlobjects.annotation.XMLElement;
import org.xmlobjects.builder.ObjectBuildException;
import org.xmlobjects.serializer.ObjectSerializeException;
import org.xmlobjects.stream.XMLReadException;
import org.xmlobjects.stream.XMLReader;
import org.xmlobjects.stream.XMLWriteException;
import org.xmlobjects.stream.XMLWriter;
import org.xmlobjects.xml.Attributes;
import org.xmlobjects.xml.Element;
import org.xmlobjects.xml.Namespaces;
import de.hft.stuttgart.quality.QualityADEModule;
import de.hft.stuttgart.quality.model.types.SemanticAttributeInvalidError;
@XMLElement(name = "SE_ATTRIBUTE_INVALID", namespaceURI = QualityADEModule.NAMESPACE_URI)
public class SemanticAttributeInvalidErrorAdapter extends AbstractSemanticErrorAdapter<SemanticAttributeInvalidError> {
@Override
public SemanticAttributeInvalidError createObject(QName name, Object parent) throws ObjectBuildException {
return new SemanticAttributeInvalidError();
}
@Override
public void buildChildObject(SemanticAttributeInvalidError object, QName name, Attributes attributes,
XMLReader reader) throws ObjectBuildException, XMLReadException {
if (!QualityADEModule.NAMESPACE_URI.equals(name.getNamespaceURI())) {
return;
}
switch (name.getLocalPart()) {
case "childId":
reader.getTextContent().ifPresent(object::setChildId);
break;
case "attributeName":
reader.getTextContent().ifPresent(object::setAttributeName);
break;
default:
throw new IllegalStateException(
"Cannot handle name " + name + " when building SemanticAttributeInvalidError element");
}
}
@Override
public Element createElement(SemanticAttributeInvalidError object, Namespaces namespaces)
throws ObjectSerializeException {
return Element.of(QualityADEModule.NAMESPACE_URI, "SE_ATTRIBUTE_INVALID");
}
@Override
public void writeChildElements(SemanticAttributeInvalidError object, Namespaces namespaces, XMLWriter writer)
throws ObjectSerializeException, XMLWriteException {
if (object.getChildId() != null) {
writer.writeElement(
Element.of(QualityADEModule.NAMESPACE_URI, "childId").addTextContent(object.getChildId()));
}
if (object.getAttributeName() != null) {
writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "attributeName")
.addTextContent(object.getAttributeName()));
}
}
}
......@@ -37,9 +37,6 @@ public class SemanticAttributeMissingErrorAdapter extends AbstractSemanticErrorA
case "attributeName":
reader.getTextContent().ifPresent(object::setAttributeName);
break;
case "generic":
reader.getTextContent().ifPresent(s -> object.setGeneric(Boolean.parseBoolean(s)));
break;
default:
throw new IllegalStateException(
"Cannot handle name " + name + " when building SemanticAttributeMissingError element");
......@@ -63,7 +60,5 @@ public class SemanticAttributeMissingErrorAdapter extends AbstractSemanticErrorA
writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "attributeName")
.addTextContent(object.getAttributeName()));
}
writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "generic")
.addTextContent(Boolean.toString(object.isGeneric())));
}
}
......@@ -38,9 +38,6 @@ public class SemanticAttributeWrongValueErrorAdapter
case "attributeName":
reader.getTextContent().ifPresent(object::setAttributeName);
break;
case "generic":
reader.getTextContent().ifPresent(s -> object.setGeneric(Boolean.parseBoolean(s)));
break;
default:
throw new IllegalStateException(
"Cannot handle name " + name + " when building SemanticAttributeWrongValueError element");
......@@ -65,7 +62,5 @@ public class SemanticAttributeWrongValueErrorAdapter
writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "attributeName")
.addTextContent(object.getAttributeName()));
}
writer.writeElement(Element.of(QualityADEModule.NAMESPACE_URI, "generic")
.addTextContent(Boolean.toString(object.isGeneric())));
}
}
......@@ -5,6 +5,7 @@ import javax.xml.namespace.QName;
import org.citygml4j.xml.adapter.core.AbstractFeatureAdapter;
import org.xmlobjects.annotation.XMLElement;
import org.xmlobjects.builder.ObjectBuildException;
import org.xmlobjects.gml.adapter.base.ReferenceAdapter;
import org.xmlobjects.serializer.ObjectSerializeException;
import org.xmlobjects.stream.XMLReadException;
import org.xmlobjects.stream.XMLReader;
......@@ -16,7 +17,6 @@ import org.xmlobjects.xml.Namespaces;
import de.hft.stuttgart.quality.QualityADEModule;
import de.hft.stuttgart.quality.adapter.properties.StatisticsPropertyAdapter;
import de.hft.stuttgart.quality.adapter.properties.ValidationPlanPropertyAdapter;
import de.hft.stuttgart.quality.model.types.Validation;
@XMLElement(name = "Validation", namespaceURI = QualityADEModule.NAMESPACE_URI)
......@@ -45,8 +45,8 @@ public class ValidationAdapter extends AbstractFeatureAdapter<Validation> {
case "statistics":
object.setStatistics(reader.getObjectUsingBuilder(StatisticsPropertyAdapter.class));
break;
case "validationPlan":
object.setValidationPlan(reader.getObjectUsingBuilder(ValidationPlanPropertyAdapter.class));
case "validationPlanID":
object.setValidationPlan(reader.getObjectUsingBuilder(ReferenceAdapter.class));
break;
default:
super.buildChildObject(object, name, attributes, reader);
......@@ -75,8 +75,8 @@ public class ValidationAdapter extends AbstractFeatureAdapter<Validation> {
object.getStatistics(), StatisticsPropertyAdapter.class, namespaces);
}
if (object.getValidationPlan() != null) {
writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "validationPlan"),
object.getValidationPlan(), ValidationPlanPropertyAdapter.class, namespaces);
writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "validationPlanID"),
object.getValidationPlan(), ReferenceAdapter.class, namespaces);
}
}
}
......@@ -2,11 +2,10 @@ package de.hft.stuttgart.quality.adapter.types;
import javax.xml.namespace.QName;
import org.citygml4j.xml.adapter.core.AbstractFeatureAdapter;
import org.xmlobjects.annotation.XMLElement;
import org.xmlobjects.builder.ObjectBuildException;
import org.xmlobjects.builder.ObjectBuilder;
import org.xmlobjects.serializer.ObjectSerializeException;
import org.xmlobjects.serializer.ObjectSerializer;
import org.xmlobjects.stream.XMLReadException;
import org.xmlobjects.stream.XMLReader;
import org.xmlobjects.stream.XMLWriteException;
......@@ -23,7 +22,7 @@ import de.hft.stuttgart.quality.model.properties.RequirementProperty;
import de.hft.stuttgart.quality.model.types.ValidationPlan;
@XMLElement(name = "ValidationPlan", namespaceURI = QualityADEModule.NAMESPACE_URI)
public class ValidationPlanAdapter implements ObjectBuilder<ValidationPlan>, ObjectSerializer<ValidationPlan> {
public class ValidationPlanAdapter extends AbstractFeatureAdapter<ValidationPlan> {
@Override
public ValidationPlan createObject(QName name, Object parent) throws ObjectBuildException {
......@@ -47,7 +46,7 @@ public class ValidationPlanAdapter implements ObjectBuilder<ValidationPlan>, Obj
object.getRequirements().add(reader.getObjectUsingBuilder(RequirementPropertyAdapter.class));
break;
default:
throw new IllegalStateException("Cannot handle name " + name + " when building ValidationPlan element");
super.buildChildObject(object, name, attributes, reader);
}
}
......
......@@ -37,8 +37,8 @@ public class ValidationResultAdapter implements ObjectBuilder<ValidationResult>,
return;
}
switch (name.getLocalPart()) {
case "validationPlanID":
object.setValidationPlanID(reader.getObjectUsingBuilder(ReferenceAdapter.class));
case "validationID":
object.setValidationID(reader.getObjectUsingBuilder(ReferenceAdapter.class));
break;
case "error":
object.getErrors().add(reader.getObjectUsingBuilder(AbstractErrorPropertyAdapter.class));
......@@ -60,7 +60,7 @@ public class ValidationResultAdapter implements ObjectBuilder<ValidationResult>,
public void writeChildElements(ValidationResult object, Namespaces namespaces, XMLWriter writer)
throws ObjectSerializeException, XMLWriteException {
if (object.getValidationPlanID() != null) {
writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "validationPlanID"),
writer.writeElementUsingSerializer(Element.of(QualityADEModule.NAMESPACE_URI, "validationID"),
object.getValidationPlanID(), ReferenceAdapter.class, namespaces);
}
for (AbstractErrorProperty err : object.getErrors()) {
......
......@@ -22,6 +22,6 @@ public enum ErrorId {
GE_P_INTERSECTING_RINGS, GE_P_HOLE_OUTSIDE, GE_P_ORIENTATION_RINGS_SAME, GE_P_INNER_RINGS_NESTED,
GE_S_TOO_FEW_POLYGONS, GE_S_NOT_CLOSED, GE_S_NON_MANIFOLD_EDGE, GE_S_POLYGON_WRONG_ORIENTATION,
GE_S_ALL_POLYGONS_WRONG_ORIENTATION, GE_S_NON_MANIFOLD_VERTEX, GE_S_SELF_INTERSECTION,
GE_S_MULTIPLE_CONNECTED_COMPONENTS, SE_ATTRIBUTE_WRONG_VALUE, SE_ATTRIBUTE_MISSING
GE_S_MULTIPLE_CONNECTED_COMPONENTS, SE_ATTRIBUTE_WRONG_VALUE, SE_ATTRIBUTE_MISSING, SE_ATTRIBUTE_INVALID
}
......@@ -23,6 +23,6 @@ public enum RequirementId {
R_GE_P_ORIENTATION_RINGS_SAME, R_GE_P_INNER_RINGS_NESTED, R_GE_S_TOO_FEW_POLYGONS, R_GE_S_NOT_CLOSED,
R_GE_S_NON_MANIFOLD_EDGE, R_GE_S_POLYGON_WRONG_ORIENTATION, R_GE_S_ALL_POLYGONS_WRONG_ORIENTATION,
R_GE_S_NON_MANIFOLD_VERTEX, R_GE_S_SELF_INTERSECTION, R_GE_S_MULTIPLE_CONNECTED_COMPONENTS,
R_SE_ATTRIBUTES_EXISTING, R_SE_ATTRIBUTES_CORRECT
R_SE_ATTRIBUTES_EXISTING, R_SE_ATTRIBUTES_CORRECT, R_SE_ATTRIBUTES_VALID
}
/*-
* Copyright 2023 Hochschule für Technik Stuttgart
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.hft.stuttgart.quality.model.types;
import de.hft.stuttgart.quality.model.walker.ValidationErrorVisitor;
public class SemanticAttributeInvalidError extends AbstractSemanticError {
private static final long serialVersionUID = 6528329813293026972L;
private String childId;
private String attributeName;
public String getChildId() {
return childId;
}
public void setChildId(String childId) {
this.childId = childId;
}
public String getAttributeName() {
return attributeName;
}
public void setAttributeName(String attributeName) {
this.attributeName = attributeName;
}
@Override
public void accept(ValidationErrorVisitor visitor) {
super.accept(visitor);
visitor.visit(this);
}
}
......@@ -23,7 +23,6 @@ public class SemanticAttributeMissingError extends AbstractSemanticError {
private String childId;
private String attributeName;
private boolean generic;
public String getChildId() {
return childId;
......@@ -41,14 +40,6 @@ public class SemanticAttributeMissingError extends AbstractSemanticError {
this.attributeName = attributeName;
}
public boolean isGeneric() {
return generic;
}
public void setGeneric(boolean generic) {
this.generic = generic;
}
@Override
public void accept(ValidationErrorVisitor visitor) {
super.accept(visitor);
......
......@@ -23,7 +23,6 @@ public class SemanticAttributeWrongValueError extends AbstractSemanticError {
private String childId;
private String attributeName;
private boolean generic;
public String getChildId() {
return childId;
......@@ -41,14 +40,6 @@ public class SemanticAttributeWrongValueError extends AbstractSemanticError {
this.attributeName = attributeName;
}
public boolean isGeneric() {
return generic;
}
public void setGeneric(boolean generic) {
this.generic = generic;
}
@Override
public void accept(ValidationErrorVisitor visitor) {
super.accept(visitor);
......
......@@ -19,9 +19,9 @@ import java.time.ZonedDateTime;
import org.citygml4j.core.model.ade.ADEObject;
import org.citygml4j.core.model.core.AbstractFeature;
import org.xmlobjects.gml.model.base.Reference;
import de.hft.stuttgart.quality.model.properties.StatisticsProperty;
import de.hft.stuttgart.quality.model.properties.ValidationPlanProperty;
public class Validation extends AbstractFeature implements ADEObject {
......@@ -30,7 +30,7 @@ public class Validation extends AbstractFeature implements ADEObject {
private ZonedDateTime validationDate;
private String validationSoftware;
private StatisticsProperty statistics;
private ValidationPlanProperty validationPlan;
private Reference validationPlan;
public ZonedDateTime getValidationDate() {
return validationDate;
......@@ -56,11 +56,11 @@ public class Validation extends AbstractFeature implements ADEObject {
this.statistics = asChild(statistics);
}
public ValidationPlanProperty getValidationPlan() {
public Reference getValidationPlan() {
return validationPlan;
}
public void setValidationPlan(ValidationPlanProperty validationPlan) {
public void setValidationPlan(Reference validationPlan) {
this.validationPlan = asChild(validationPlan);
}
......
......@@ -18,14 +18,14 @@ package de.hft.stuttgart.quality.model.types;
import java.util.List;
import org.citygml4j.core.model.ade.ADEObject;
import org.xmlobjects.gml.model.GMLObject;
import org.citygml4j.core.model.core.AbstractFeature;
import org.xmlobjects.model.ChildList;
import de.hft.stuttgart.quality.model.properties.FilterProperty;
import de.hft.stuttgart.quality.model.properties.GlobalParametersProperty;
import de.hft.stuttgart.quality.model.properties.RequirementProperty;
public class ValidationPlan extends GMLObject implements ADEObject {
public class ValidationPlan extends AbstractFeature implements ADEObject {
private static final long serialVersionUID = 434443226848485642L;
......
......@@ -30,16 +30,16 @@ public class ValidationResult extends GMLObject implements ADEObject {
private static final long serialVersionUID = 4867627296196445082L;
private Reference validationPlanID;
private Reference validationID;
private List<AbstractErrorProperty> errors;
private ResultType resultType;
public Reference getValidationPlanID() {
return validationPlanID;
return validationID;
}
public void setValidationPlanID(Reference validationPlanID) {
this.validationPlanID = asChild(validationPlanID);
public void setValidationID(Reference validationPlanID) {
this.validationID = asChild(validationPlanID);
}
public List<AbstractErrorProperty> getErrors() {
......
......@@ -37,6 +37,7 @@ import de.hft.stuttgart.quality.model.types.PolygonWrongOrientationError;
import de.hft.stuttgart.quality.model.types.RingNotClosedError;
import de.hft.stuttgart.quality.model.types.RingSelfIntersectionError;
import de.hft.stuttgart.quality.model.types.RingTooFewPointsError;
import de.hft.stuttgart.quality.model.types.SemanticAttributeInvalidError;
import de.hft.stuttgart.quality.model.types.SemanticAttributeMissingError;
import de.hft.stuttgart.quality.model.types.SemanticAttributeWrongValueError;
import de.hft.stuttgart.quality.model.types.SolidNotClosedError;
......@@ -65,6 +66,10 @@ public interface ValidationErrorVisitor {
}
default void visit(SemanticAttributeInvalidError err) {
}
default void visit(AbstractSolidError err) {
}
......
<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.4" elementFormDefault="qualified" targetNamespace="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/0.1.4" version="0.1.4">
<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:bldg="http://www.opengis.net/citygml/building/2.0" xmlns:core="http://www.opengis.net/citygml/2.0" xmlns:gml="http://www.opengis.net/gml" xmlns:qual="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/1.0.0" elementFormDefault="qualified" targetNamespace="https://transfer.hft-stuttgart.de/pages/citydoctor/qualityade/1.0.0" version="1.0.0">
<import namespace="http://www.opengis.net/citygml/2.0" schemaLocation="http://schemas.opengis.net/citygml/2.0/cityGMLBase.xsd"/>
<import namespace="http://www.opengis.net/citygml/building/2.0" schemaLocation="http://schemas.opengis.net/citygml/building/2.0/building.xsd"/>
<import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
......@@ -117,6 +117,9 @@
<element ref="qual:EdgeList"/>
</sequence>
</complexType>
<simpleType name="Enumeration1Type">
<restriction base="string"/>
</simpleType>
<element name="Error" substitutionGroup="gml:_Object" type="qual:ErrorType"/>
<complexType name="ErrorType">
<sequence>
......@@ -152,6 +155,7 @@
<enumeration value="GE_S_MULTIPLE_CONNECTED_COMPONENTS"/>
<enumeration value="SE_ATTRIBUTE_WRONG_VALUE"/>
<enumeration value="SE_ATTRIBUTE_MISSING"/>
<enumeration value="SE_ATTRIBUTE_INVALID"/>
</restriction>
</simpleType>
<element name="FeatureStatistics" substitutionGroup="gml:_Object" type="qual:FeatureStatisticsType"/>
......@@ -541,6 +545,7 @@
<enumeration value="R_GE_S_MULTIPLE_CONNECTED_COMPONENTS"/>
<enumeration value="R_SE_ATTRIBUTES_EXISTING"/>
<enumeration value="R_SE_ATTRIBUTES_CORRECT"/>
<enumeration value="R_SE_ATTRIBUTES_VALID"/>
</restriction>
</simpleType>
<simpleType name="ResultTypeType">
......@@ -558,6 +563,22 @@
<enumeration value="DEGENERATED_RING"/>
</restriction>
</simpleType>
<element name="SE_ATTRIBUTE_INVALID" substitutionGroup="qual:AbstractSemanticError" type="qual:SE_ATTRIBUTE_INVALIDType"/>
<complexType name="SE_ATTRIBUTE_INVALIDType">
<complexContent>
<extension base="qual:AbstractSemanticErrorType">
<sequence>
<element name="childId" type="string"/>
<element name="attributeName" type="string"/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="SE_ATTRIBUTE_INVALIDPropertyType">
<sequence>
<element ref="qual:SE_ATTRIBUTE_INVALID"/>
</sequence>
</complexType>
<element name="SE_ATTRIBUTE_MISSING" substitutionGroup="qual:AbstractSemanticError" type="qual:SE_ATTRIBUTE_MISSINGType"/>
<complexType name="SE_ATTRIBUTE_MISSINGType">
<complexContent>
......@@ -565,7 +586,6 @@
<sequence>
<element name="childId" type="string"/>
<element name="attributeName" type="string"/>
<element name="generic" type="boolean"/>
</sequence>
</extension>
</complexContent>
......@@ -582,7 +602,6 @@
<sequence>
<element name="childId" type="string"/>
<element name="attributeName" type="string"/>
<element name="generic" type="boolean"/>
</sequence>
</extension>
</complexContent>
......@@ -617,7 +636,7 @@
<element name="validationDate" type="dateTime"/>
<element name="validationSoftware" type="string"/>
<element minOccurs="0" name="statistics" type="qual:StatisticsPropertyType"/>
<element name="validationPlan" type="qual:ValidationPlanPropertyType"/>
<element name="validationPlanID" type="gml:ReferenceType"/>
</sequence>
</extension>
</complexContent>
......@@ -628,23 +647,28 @@
</sequence>
<attributeGroup ref="gml:AssociationAttributeGroup"/>
</complexType>
<element name="ValidationPlan" substitutionGroup="gml:_Object" type="qual:ValidationPlanType"/>
<element name="ValidationPlan" substitutionGroup="gml:_Feature" type="qual:ValidationPlanType"/>
<complexType name="ValidationPlanType">
<sequence>
<element name="globalParameters" type="qual:GlobalParametersPropertyType"/>
<element name="filter" type="qual:FilterPropertyType"/>
<element maxOccurs="unbounded" name="requirement" type="qual:RequirementPropertyType"/>
</sequence>
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element name="globalParameters" type="qual:GlobalParametersPropertyType"/>
<element name="filter" type="qual:FilterPropertyType"/>
<element maxOccurs="unbounded" name="requirement" type="qual:RequirementPropertyType"/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="ValidationPlanPropertyType">
<sequence>
<sequence minOccurs="0">
<element ref="qual:ValidationPlan"/>
</sequence>
<attributeGroup ref="gml:AssociationAttributeGroup"/>
</complexType>
<element name="ValidationResult" substitutionGroup="gml:_Object" type="qual:ValidationResultType"/>
<complexType name="ValidationResultType">
<sequence>
<element name="validationPlanID" type="gml:ReferenceType"/>
<element name="validationID" type="qual:ValidationPropertyType"/>
<element maxOccurs="unbounded" minOccurs="0" name="error" type="qual:AbstractErrorPropertyType"/>
<element name="resultType" type="qual:ResultTypeType"/>
</sequence>
......