Commit 81be0b1d authored by Riegel's avatar Riegel
Browse files

Merge branch 'dev_GUI' into 'dev'

Open source release of CityDoctorGUI and other extensions.

See merge request !6
parents 12d96d95 5a4d0a74
Pipeline #10056 passed with stage
in 1 minute and 6 seconds
...@@ -85,54 +85,39 @@ public class QualityADEUtils { ...@@ -85,54 +85,39 @@ public class QualityADEUtils {
} }
public static de.hft.stuttgart.quality.model.enums.ErrorId mapErrorIdToAdeId(ErrorId key) { public static de.hft.stuttgart.quality.model.enums.ErrorId mapErrorIdToAdeId(ErrorId key) {
switch (key.getIdString()) { return switch (key.getIdString()) {
case "GE_R_NOT_CLOSED": case "GE_R_NOT_CLOSED" -> de.hft.stuttgart.quality.model.enums.ErrorId.GE_R_NOT_CLOSED;
return de.hft.stuttgart.quality.model.enums.ErrorId.GE_R_NOT_CLOSED; case "GE_R_TOO_FEW_POINTS" -> de.hft.stuttgart.quality.model.enums.ErrorId.GE_R_TOO_FEW_POINTS;
case "GE_R_TOO_FEW_POINTS": case "GE_R_CONSECUTIVE_POINTS_SAME" ->
return de.hft.stuttgart.quality.model.enums.ErrorId.GE_R_TOO_FEW_POINTS; de.hft.stuttgart.quality.model.enums.ErrorId.GE_R_CONSECUTIVE_POINTS_SAME;
case "GE_R_CONSECUTIVE_POINTS_SAME": case "GE_R_SELF_INTERSECTION" -> de.hft.stuttgart.quality.model.enums.ErrorId.GE_R_SELF_INTERSECTION;
return de.hft.stuttgart.quality.model.enums.ErrorId.GE_R_CONSECUTIVE_POINTS_SAME; case "GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION" ->
case "GE_R_SELF_INTERSECTION": de.hft.stuttgart.quality.model.enums.ErrorId.GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION;
return de.hft.stuttgart.quality.model.enums.ErrorId.GE_R_SELF_INTERSECTION; case "GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE" ->
case "GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION": de.hft.stuttgart.quality.model.enums.ErrorId.GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE;
return de.hft.stuttgart.quality.model.enums.ErrorId.GE_P_NON_PLANAR_POLYGON_NORMALS_DEVIATION; case "GE_P_INTERIOR_DISCONNECTED" ->
case "GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE": de.hft.stuttgart.quality.model.enums.ErrorId.GE_P_INTERIOR_DISCONNECTED;
return de.hft.stuttgart.quality.model.enums.ErrorId.GE_P_NON_PLANAR_POLYGON_DISTANCE_PLANE; case "GE_P_INTERSECTING_RINGS" -> de.hft.stuttgart.quality.model.enums.ErrorId.GE_P_INTERSECTING_RINGS;
case "GE_P_INTERIOR_DISCONNECTED": case "GE_P_HOLE_OUTSIDE" -> de.hft.stuttgart.quality.model.enums.ErrorId.GE_P_HOLE_OUTSIDE;
return de.hft.stuttgart.quality.model.enums.ErrorId.GE_P_INTERIOR_DISCONNECTED; case "GE_P_ORIENTATION_RINGS_SAME" ->
case "GE_P_INTERSECTING_RINGS": de.hft.stuttgart.quality.model.enums.ErrorId.GE_P_ORIENTATION_RINGS_SAME;
return de.hft.stuttgart.quality.model.enums.ErrorId.GE_P_INTERSECTING_RINGS; case "GE_P_INNER_RINGS_NESTED" -> de.hft.stuttgart.quality.model.enums.ErrorId.GE_P_INNER_RINGS_NESTED;
case "GE_P_HOLE_OUTSIDE": case "GE_S_TOO_FEW_POLYGONS" -> de.hft.stuttgart.quality.model.enums.ErrorId.GE_S_TOO_FEW_POLYGONS;
return de.hft.stuttgart.quality.model.enums.ErrorId.GE_P_HOLE_OUTSIDE; case "GE_S_NOT_CLOSED" -> de.hft.stuttgart.quality.model.enums.ErrorId.GE_S_NOT_CLOSED;
case "GE_P_ORIENTATION_RINGS_SAME": case "GE_S_NON_MANIFOLD_EDGE" -> de.hft.stuttgart.quality.model.enums.ErrorId.GE_S_NON_MANIFOLD_EDGE;
return de.hft.stuttgart.quality.model.enums.ErrorId.GE_P_ORIENTATION_RINGS_SAME; case "GE_S_POLYGON_WRONG_ORIENTATION" ->
case "GE_P_INNER_RINGS_NESTED": de.hft.stuttgart.quality.model.enums.ErrorId.GE_S_POLYGON_WRONG_ORIENTATION;
return de.hft.stuttgart.quality.model.enums.ErrorId.GE_P_INNER_RINGS_NESTED; case "GE_S_ALL_POLYGONS_WRONG_ORIENTATION" ->
case "GE_S_TOO_FEW_POLYGONS": de.hft.stuttgart.quality.model.enums.ErrorId.GE_S_ALL_POLYGONS_WRONG_ORIENTATION;
return de.hft.stuttgart.quality.model.enums.ErrorId.GE_S_TOO_FEW_POLYGONS; case "GE_S_NON_MANIFOLD_VERTEX" -> de.hft.stuttgart.quality.model.enums.ErrorId.GE_S_NON_MANIFOLD_VERTEX;
case "GE_S_NOT_CLOSED": case "GE_S_SELF_INTERSECTION" -> de.hft.stuttgart.quality.model.enums.ErrorId.GE_S_SELF_INTERSECTION;
return de.hft.stuttgart.quality.model.enums.ErrorId.GE_S_NOT_CLOSED; case "GE_S_MULTIPLE_CONNECTED_COMPONENTS" ->
case "GE_S_NON_MANIFOLD_EDGE": de.hft.stuttgart.quality.model.enums.ErrorId.GE_S_MULTIPLE_CONNECTED_COMPONENTS;
return de.hft.stuttgart.quality.model.enums.ErrorId.GE_S_NON_MANIFOLD_EDGE; case "SE_ATTRIBUTE_WRONG_VALUE" -> de.hft.stuttgart.quality.model.enums.ErrorId.SE_ATTRIBUTE_WRONG_VALUE;
case "GE_S_POLYGON_WRONG_ORIENTATION": case "SE_ATTRIBUTE_MISSING" -> de.hft.stuttgart.quality.model.enums.ErrorId.SE_ATTRIBUTE_MISSING;
return de.hft.stuttgart.quality.model.enums.ErrorId.GE_S_POLYGON_WRONG_ORIENTATION; case "SE_ATTRIBUTE_INVALID" -> de.hft.stuttgart.quality.model.enums.ErrorId.SE_ATTRIBUTE_INVALID;
case "GE_S_ALL_POLYGONS_WRONG_ORIENTATION": default -> null;
return de.hft.stuttgart.quality.model.enums.ErrorId.GE_S_ALL_POLYGONS_WRONG_ORIENTATION; };
case "GE_S_NON_MANIFOLD_VERTEX":
return de.hft.stuttgart.quality.model.enums.ErrorId.GE_S_NON_MANIFOLD_VERTEX;
case "GE_S_SELF_INTERSECTION":
return de.hft.stuttgart.quality.model.enums.ErrorId.GE_S_SELF_INTERSECTION;
case "GE_S_MULTIPLE_CONNECTED_COMPONENTS":
return de.hft.stuttgart.quality.model.enums.ErrorId.GE_S_MULTIPLE_CONNECTED_COMPONENTS;
case "SE_ATTRIBUTE_WRONG_VALUE":
return de.hft.stuttgart.quality.model.enums.ErrorId.SE_ATTRIBUTE_WRONG_VALUE;
case "SE_ATTRIBUTE_MISSING":
return de.hft.stuttgart.quality.model.enums.ErrorId.SE_ATTRIBUTE_MISSING;
case "SE_ATTRIBUTE_INVALID":
return de.hft.stuttgart.quality.model.enums.ErrorId.SE_ATTRIBUTE_INVALID;
default:
return null;
}
} }
} }
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
*/ */
package de.hft.stuttgart.citydoctor2.utils; package de.hft.stuttgart.citydoctor2.utils;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
/** /**
...@@ -30,10 +31,11 @@ import java.io.Serializable; ...@@ -30,10 +31,11 @@ import java.io.Serializable;
*/ */
public class SerializablePair<A extends Serializable, B extends Serializable> implements Serializable { public class SerializablePair<A extends Serializable, B extends Serializable> implements Serializable {
@Serial
private static final long serialVersionUID = -5307944001963352647L; private static final long serialVersionUID = -5307944001963352647L;
private A a; private final A a;
private B b; private final B b;
public SerializablePair(A a, B b) { public SerializablePair(A a, B b) {
this.a = a; this.a = a;
...@@ -82,14 +84,9 @@ public class SerializablePair<A extends Serializable, B extends Serializable> im ...@@ -82,14 +84,9 @@ public class SerializablePair<A extends Serializable, B extends Serializable> im
return false; return false;
} }
if (b == null) { if (b == null) {
if (other.b != null) { return other.b == null;
return false; } else return b.equals(other.b);
} }
} else if (!b.equals(other.b)) {
return false;
}
return true;
}
@Override @Override
public String toString() { public String toString() {
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>de.hft.stuttgart</groupId> <groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorParent</artifactId> <artifactId>CityDoctorParent</artifactId>
...@@ -65,7 +64,11 @@ ...@@ -65,7 +64,11 @@
<groupId>net.sf.saxon</groupId> <groupId>net.sf.saxon</groupId>
<artifactId>Saxon-HE</artifactId> <artifactId>Saxon-HE</artifactId>
</dependency> </dependency>
</dependencies> <dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</dependency>
</dependencies>
<build> <build>
<resources> <resources>
<resource> <resource>
......
...@@ -43,7 +43,6 @@ import javax.xml.transform.Source; ...@@ -43,7 +43,6 @@ import javax.xml.transform.Source;
import javax.xml.transform.Transformer; import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerFactory;
import javax.xml.transform.URIResolver;
import javax.xml.transform.dom.DOMResult; import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource; import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.sax.SAXResult; import javax.xml.transform.sax.SAXResult;
...@@ -105,8 +104,8 @@ public class Checker { ...@@ -105,8 +104,8 @@ public class Checker {
private List<Filter> includeFilters; private List<Filter> includeFilters;
private List<Filter> excludeFilters; private List<Filter> excludeFilters;
private Checks checkConfig; private final Checks checkConfig;
private CityDoctorModel model; private final CityDoctorModel model;
public Checker(CityDoctorModel model) { public Checker(CityDoctorModel model) {
this(ValidationConfiguration.loadStandardValidationConfig(), model); this(ValidationConfiguration.loadStandardValidationConfig(), model);
...@@ -131,7 +130,6 @@ public class Checker { ...@@ -131,7 +130,6 @@ public class Checker {
* given or this checker has not validated anything, nothing is done. * given or this checker has not validated anything, nothing is done.
* *
* @param xmlOutput the output file location for the XML report. Can be null. * @param xmlOutput the output file location for the XML report. Can be null.
* @param model the model for which the report is written.
*/ */
public void writeXmlReport(String xmlOutput) { public void writeXmlReport(String xmlOutput) {
if (!model.isValidated() || xmlOutput == null) { if (!model.isValidated() || xmlOutput == null) {
...@@ -316,8 +314,7 @@ public class Checker { ...@@ -316,8 +314,7 @@ public class Checker {
handleInputFilter(filter); handleInputFilter(filter);
if (excludeFilters != null) { if (excludeFilters != null) {
for (Filter f : excludeFilters) { for (Filter f : excludeFilters) {
if (f instanceof TypeFilter) { if (f instanceof TypeFilter tf) {
TypeFilter tf = (TypeFilter) f;
FeatureType type = tf.getType(); FeatureType type = tf.getType();
TopLevelFeatureType tlft = mapToTopLevelFeatureType(type); TopLevelFeatureType tlft = mapToTopLevelFeatureType(type);
if (tlft == null) { if (tlft == null) {
...@@ -392,22 +389,15 @@ public class Checker { ...@@ -392,22 +389,15 @@ public class Checker {
} }
private TopLevelFeatureType mapToTopLevelFeatureType(FeatureType type) { private TopLevelFeatureType mapToTopLevelFeatureType(FeatureType type) {
switch (type) { return switch (type) {
case BRIDGE: case BRIDGE -> TopLevelFeatureType.BRIDGE;
return TopLevelFeatureType.BRIDGE; case BUILDING -> TopLevelFeatureType.BUILDING;
case BUILDING: case LAND -> TopLevelFeatureType.LAND;
return TopLevelFeatureType.BUILDING; case TRANSPORTATION -> TopLevelFeatureType.TRANSPORTATION;
case LAND: case VEGETATION -> TopLevelFeatureType.VEGETATION;
return TopLevelFeatureType.LAND; case WATER -> TopLevelFeatureType.WATER;
case TRANSPORTATION: default -> null;
return TopLevelFeatureType.TRANSPORTATION; };
case VEGETATION:
return TopLevelFeatureType.VEGETATION;
case WATER:
return TopLevelFeatureType.WATER;
default:
return null;
}
} }
private RequirementId mapToRequirement(String requirementName) { private RequirementId mapToRequirement(String requirementName) {
...@@ -445,13 +435,7 @@ public class Checker { ...@@ -445,13 +435,7 @@ public class Checker {
transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
transformerFactory.setURIResolver(new URIResolver() { transformerFactory.setURIResolver((href, base) -> new StreamSource(Checker.class.getResourceAsStream(href)));
@Override
public Source resolve(String href, String base) throws TransformerException {
return new StreamSource(Checker.class.getResourceAsStream(href));
}
});
Source dsdlXslSource = new StreamSource(Checker.class.getResourceAsStream("iso_dsdl_include.xsl")); Source dsdlXslSource = new StreamSource(Checker.class.getResourceAsStream("iso_dsdl_include.xsl"));
Transformer dsdlXslTransformer = transformerFactory.newTransformer(dsdlXslSource); Transformer dsdlXslTransformer = transformerFactory.newTransformer(dsdlXslSource);
...@@ -706,14 +690,14 @@ public class Checker { ...@@ -706,14 +690,14 @@ public class Checker {
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug(Localization.getText("Checker.checkFeature"), co); logger.debug(Localization.getText("Checker.checkFeature"), co);
} }
for (int i = 0; i < execLayers.size(); i++) { for (List<Check> execLayer : execLayers) {
for (Check check : execLayers.get(i)) { for (Check check : execLayer) {
if (logger.isTraceEnabled()) { if (logger.isTraceEnabled()) {
logger.trace(Localization.getText("Checker.executeCheck"), check.getCheckId()); logger.trace(Localization.getText("Checker.executeCheck"), check.getCheckId());
} }
co.accept(check); co.accept(check);
} }
} }
} }
public static List<List<Check>> buildExecutionLayers(List<Check> checks) { public static List<List<Check>> buildExecutionLayers(List<Check> checks) {
......
...@@ -30,7 +30,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.CityObject; ...@@ -30,7 +30,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
*/ */
public class EqualsIgnoreCaseFilter implements Filter { public class EqualsIgnoreCaseFilter implements Filter {
private String id; private final String id;
public EqualsIgnoreCaseFilter(String id) { public EqualsIgnoreCaseFilter(String id) {
Objects.requireNonNull(id); Objects.requireNonNull(id);
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
*/ */
package de.hft.stuttgart.citydoctor2.check; package de.hft.stuttgart.citydoctor2.check;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -26,6 +27,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.FeatureType; ...@@ -26,6 +27,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.FeatureType;
public class ExcludeFilterConfiguration implements Serializable { public class ExcludeFilterConfiguration implements Serializable {
@Serial
private static final long serialVersionUID = 5308380997654048837L; private static final long serialVersionUID = 5308380997654048837L;
private List<FeatureType> types; private List<FeatureType> types;
......
...@@ -27,6 +27,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.CityObject; ...@@ -27,6 +27,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
* @author Matthias Betz * @author Matthias Betz
* *
*/ */
@FunctionalInterface
public interface Filter { public interface Filter {
/** /**
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
*/ */
package de.hft.stuttgart.citydoctor2.check; package de.hft.stuttgart.citydoctor2.check;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
/** /**
...@@ -29,6 +30,7 @@ import java.io.Serializable; ...@@ -29,6 +30,7 @@ import java.io.Serializable;
*/ */
public class FilterConfiguration implements Serializable { public class FilterConfiguration implements Serializable {
@Serial
private static final long serialVersionUID = 3344890310114546998L; private static final long serialVersionUID = 3344890310114546998L;
private ExcludeFilterConfiguration exclude; private ExcludeFilterConfiguration exclude;
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
*/ */
package de.hft.stuttgart.citydoctor2.check; package de.hft.stuttgart.citydoctor2.check;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -34,6 +35,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.FeatureType; ...@@ -34,6 +35,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.FeatureType;
*/ */
public class IncludeFilterConfiguration implements Serializable { public class IncludeFilterConfiguration implements Serializable {
@Serial
private static final long serialVersionUID = 1840264505629236113L; private static final long serialVersionUID = 1840264505629236113L;
private List<FeatureType> types; private List<FeatureType> types;
......
...@@ -24,7 +24,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.CityObject; ...@@ -24,7 +24,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
public class PatternFilter implements Filter { public class PatternFilter implements Filter {
private Pattern pattern; private final Pattern pattern;
public PatternFilter(String patternString) { public PatternFilter(String patternString) {
pattern = Pattern.compile(patternString); pattern = Pattern.compile(patternString);
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
*/ */
package de.hft.stuttgart.citydoctor2.check; package de.hft.stuttgart.citydoctor2.check;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
...@@ -31,6 +32,7 @@ import java.util.Map; ...@@ -31,6 +32,7 @@ import java.util.Map;
*/ */
public class RequirementConfiguration implements Serializable { public class RequirementConfiguration implements Serializable {
@Serial
private static final long serialVersionUID = -1258195428669813888L; private static final long serialVersionUID = -1258195428669813888L;
private boolean enabled; private boolean enabled;
......
...@@ -63,22 +63,22 @@ public class StreamCityGmlConsumer implements CityGmlConsumer { ...@@ -63,22 +63,22 @@ public class StreamCityGmlConsumer implements CityGmlConsumer {
private static final Logger logger = LogManager.getLogger(StreamCityGmlConsumer.class); private static final Logger logger = LogManager.getLogger(StreamCityGmlConsumer.class);
private Checker c; private final Checker c;
private XmlStreamReporter xmlReporter; private final XmlStreamReporter xmlReporter;
private PdfStreamReporter pdfReporter; private final PdfStreamReporter pdfReporter;
private SvrlContentHandler handler; private final SvrlContentHandler handler;
private Map<ErrorId, AtomicInteger> errorCount; private final Map<ErrorId, AtomicInteger> errorCount;
private GeometryFactory gmlFactory; private final GeometryFactory gmlFactory;
private ValidationConfiguration config; private final ValidationConfiguration config;
private Statistics statistics; private final Statistics statistics;
private FeatureStatistics buildingStatistics; private final FeatureStatistics buildingStatistics;
private FeatureStatistics bridgeStatistics; private final FeatureStatistics bridgeStatistics;
private FeatureStatistics transportationStatistics; private final FeatureStatistics transportationStatistics;
private FeatureStatistics vegetationStatistics; private final FeatureStatistics vegetationStatistics;
private FeatureStatistics landStatistics; private final FeatureStatistics landStatistics;
private FeatureStatistics waterStatistics; private final FeatureStatistics waterStatistics;
private Validation val; private final Validation val;
private FeatureCheckedListener l; private final FeatureCheckedListener l;
public StreamCityGmlConsumer(Checker c, XmlStreamReporter xmlReporter, PdfStreamReporter pdfReporter, public StreamCityGmlConsumer(Checker c, XmlStreamReporter xmlReporter, PdfStreamReporter pdfReporter,
SvrlContentHandler handler, ValidationConfiguration config, FeatureCheckedListener l) { SvrlContentHandler handler, ValidationConfiguration config, FeatureCheckedListener l) {
...@@ -92,7 +92,7 @@ public class StreamCityGmlConsumer implements CityGmlConsumer { ...@@ -92,7 +92,7 @@ public class StreamCityGmlConsumer implements CityGmlConsumer {
gmlFactory = GeometryFactory.newInstance(); gmlFactory = GeometryFactory.newInstance();
val = new Validation(); val = new Validation();
val.setId("CD" + UUID.randomUUID().toString()); val.setId("CD" + UUID.randomUUID());
val.setValidationDate(ZonedDateTime.now()); val.setValidationDate(ZonedDateTime.now());
val.setValidationSoftware("CityDoctor " + Localization.getText(Localization.VERSION)); val.setValidationSoftware("CityDoctor " + Localization.getText(Localization.VERSION));
statistics = new Statistics(); statistics = new Statistics();
...@@ -182,7 +182,7 @@ public class StreamCityGmlConsumer implements CityGmlConsumer { ...@@ -182,7 +182,7 @@ public class StreamCityGmlConsumer implements CityGmlConsumer {
} }
val.setStatistics(new StatisticsProperty(statistics)); val.setStatistics(new StatisticsProperty(statistics));
ValidationPlan validationPlan = c.createValidationPlan(); ValidationPlan validationPlan = c.createValidationPlan();
validationPlan.setId("CD_PLAN_" + UUID.randomUUID().toString()); validationPlan.setId("CD_PLAN_" + UUID.randomUUID());
cm.getFeatureMembers().add(new AbstractFeatureProperty(validationPlan)); cm.getFeatureMembers().add(new AbstractFeatureProperty(validationPlan));
val.setValidationPlan(new Reference(validationPlan)); val.setValidationPlan(new Reference(validationPlan));
......
...@@ -21,27 +21,28 @@ package de.hft.stuttgart.citydoctor2.check; ...@@ -21,27 +21,28 @@ package de.hft.stuttgart.citydoctor2.check;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject; import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import de.hft.stuttgart.citydoctor2.datastructure.FeatureType; import de.hft.stuttgart.citydoctor2.datastructure.FeatureType;
/** /**
* Filters the feature type of features * Filters the feature type of features
*
* @author Matthias Betz
* *
* @author Matthias Betz
*/ */
public class TypeFilter implements Filter { public class TypeFilter implements Filter {
private FeatureType type; private final FeatureType type;
public TypeFilter(FeatureType type) {
this.type = type;
}
@Override
public boolean matches(CityObject co) {
return co.getFeatureType() == type;
}
public TypeFilter(FeatureType type) {
this.type = type;
}
public FeatureType getType() { public FeatureType getType() {
return type; return type;
} }
@Override
public boolean matches(CityObject co) {
return co.getFeatureType() == type;
}
} }
...@@ -18,14 +18,7 @@ ...@@ -18,14 +18,7 @@
*/ */
package de.hft.stuttgart.citydoctor2.check; package de.hft.stuttgart.citydoctor2.check;
import java.io.BufferedWriter; import java.io.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
...@@ -33,6 +26,7 @@ import java.util.Map.Entry; ...@@ -33,6 +26,7 @@ import java.util.Map.Entry;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.LoaderOptions;
import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.Constructor; import org.yaml.snakeyaml.constructor.Constructor;
import org.yaml.snakeyaml.nodes.Tag; import org.yaml.snakeyaml.nodes.Tag;
...@@ -55,6 +49,7 @@ public class ValidationConfiguration implements Serializable { ...@@ -55,6 +49,7 @@ public class ValidationConfiguration implements Serializable {
public static final String CHECK_FOR_SOLID_XML = "checkForSolid.xml"; public static final String CHECK_FOR_SOLID_XML = "checkForSolid.xml";
private static final String NUMBER_OF_ROUNDING_PLACES_DEFAULT = "8"; private static final String NUMBER_OF_ROUNDING_PLACES_DEFAULT = "8";
private static final String MIN_VERTEX_DISTANCE_DEFAULT = "0.0001"; private static final String MIN_VERTEX_DISTANCE_DEFAULT = "0.0001";
@Serial
private static final long serialVersionUID = -8020055032177740646L; private static final long serialVersionUID = -8020055032177740646L;
private static final Logger logger = LogManager.getLogger(ValidationConfiguration.class); private static final Logger logger = LogManager.getLogger(ValidationConfiguration.class);
...@@ -72,7 +67,7 @@ public class ValidationConfiguration implements Serializable { ...@@ -72,7 +67,7 @@ public class ValidationConfiguration implements Serializable {
} }
public static ValidationConfiguration loadValidationConfig(InputStream stream) { public static ValidationConfiguration loadValidationConfig(InputStream stream) {
Yaml yaml = new Yaml(new Constructor(ValidationConfiguration.class)); Yaml yaml = new Yaml(new Constructor(ValidationConfiguration.class, new LoaderOptions()));
ValidationConfiguration config = yaml.load(stream); ValidationConfiguration config = yaml.load(stream);
config.validateConfiguration(); config.validateConfiguration();
return config; return config;
...@@ -104,9 +99,9 @@ public class ValidationConfiguration implements Serializable { ...@@ -104,9 +99,9 @@ public class ValidationConfiguration implements Serializable {
DumperOptions options = new DumperOptions(); DumperOptions options = new DumperOptions();
options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
options.setPrettyFlow(true); options.setPrettyFlow(true);
Representer rep = new ValidationConfigurationRepresenter(); Representer rep = new ValidationConfigurationRepresenter(options);
rep.addClassTag(ValidationConfiguration.class, Tag.MAP); rep.addClassTag(ValidationConfiguration.class, Tag.MAP);
Yaml yaml = new Yaml(rep, options); Yaml yaml = new Yaml(rep);
try (BufferedWriter bw = new BufferedWriter(new FileWriter(f))) { try (BufferedWriter bw = new BufferedWriter(new FileWriter(f))) {
yaml.dump(this, bw); yaml.dump(this, bw);
} }
...@@ -178,9 +173,9 @@ public class ValidationConfiguration implements Serializable { ...@@ -178,9 +173,9 @@ public class ValidationConfiguration implements Serializable {
return cConfig; return cConfig;
}); });
} }
globalParameters.computeIfAbsent(GlobalParameters.MIN_VERTEX_DISTANCE, k -> MIN_VERTEX_DISTANCE_DEFAULT); globalParameters.putIfAbsent(GlobalParameters.MIN_VERTEX_DISTANCE, MIN_VERTEX_DISTANCE_DEFAULT);
globalParameters.computeIfAbsent(GlobalParameters.NUMBER_OF_ROUNDING_PLACES, globalParameters.putIfAbsent(GlobalParameters.NUMBER_OF_ROUNDING_PLACES,
k -> NUMBER_OF_ROUNDING_PLACES_DEFAULT); NUMBER_OF_ROUNDING_PLACES_DEFAULT);
} }
public int getNumberOfRoundingPlaces() { public int getNumberOfRoundingPlaces() {
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
*/ */
package de.hft.stuttgart.citydoctor2.check; package de.hft.stuttgart.citydoctor2.check;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.introspector.Property; import org.yaml.snakeyaml.introspector.Property;
import org.yaml.snakeyaml.nodes.CollectionNode; import org.yaml.snakeyaml.nodes.CollectionNode;
import org.yaml.snakeyaml.nodes.MappingNode; import org.yaml.snakeyaml.nodes.MappingNode;
...@@ -35,7 +36,11 @@ import org.yaml.snakeyaml.representer.Representer; ...@@ -35,7 +36,11 @@ import org.yaml.snakeyaml.representer.Representer;
* *
*/ */
public class ValidationConfigurationRepresenter extends Representer { public class ValidationConfigurationRepresenter extends Representer {
public ValidationConfigurationRepresenter(DumperOptions options) {
super(options);
}
@Override @Override
protected NodeTuple representJavaBeanProperty(Object javaBean, Property property, Object propertyValue, protected NodeTuple representJavaBeanProperty(Object javaBean, Property property, Object propertyValue,
Tag customTag) { Tag customTag) {
......
...@@ -38,7 +38,7 @@ import de.hft.stuttgart.citydoctor2.check.RequirementType; ...@@ -38,7 +38,7 @@ import de.hft.stuttgart.citydoctor2.check.RequirementType;
*/ */
public class CheckPrototype { public class CheckPrototype {
private Check c; private final Check c;
public CheckPrototype(Check c) { public CheckPrototype(Check c) {
this.c = c; this.c = c;
......
...@@ -69,12 +69,12 @@ public class Checks { ...@@ -69,12 +69,12 @@ public class Checks {
private static final Logger logger = LogManager.getLogger(Checks.class); private static final Logger logger = LogManager.getLogger(Checks.class);
private static List<CheckPrototype> checkPrototypes; private static final List<CheckPrototype> checkPrototypes;
private static Map<CheckId, CheckPrototype> prototypeMap; private static final Map<CheckId, CheckPrototype> prototypeMap;
private static Map<String, Requirement> availableRequirements; private static Map<String, Requirement> availableRequirements;
private Map<CheckId, Check> checkMap; private final Map<CheckId, Check> checkMap;
static { static {
checkPrototypes = new ArrayList<>(); checkPrototypes = new ArrayList<>();
......
...@@ -45,8 +45,8 @@ public class SvrlContentHandler implements ContentHandler { ...@@ -45,8 +45,8 @@ public class SvrlContentHandler implements ContentHandler {
private StringBuilder buffer; private StringBuilder buffer;
private Map<String, List<SchematronError>> featureErrors; private final Map<String, List<SchematronError>> featureErrors;
private List<SchematronError> generalErrors; private final List<SchematronError> generalErrors;
public SvrlContentHandler() { public SvrlContentHandler() {
featureErrors = new HashMap<>(); featureErrors = new HashMap<>();
...@@ -65,22 +65,23 @@ public class SvrlContentHandler implements ContentHandler { ...@@ -65,22 +65,23 @@ public class SvrlContentHandler implements ContentHandler {
public void setDocumentLocator(Locator locator) { public void setDocumentLocator(Locator locator) {
// not needed // not needed
} }
@SuppressWarnings("RedundantThrows")
@Override @Override
public void startDocument() throws SAXException { public void startDocument() throws SAXException {
// not needed // not needed
} }
@Override @SuppressWarnings("RedundantThrows")
@Override
public void endDocument() throws SAXException { public void endDocument() throws SAXException {
// not needed // not needed
} }
@SuppressWarnings("RedundantThrows")
@Override @Override
public void startPrefixMapping(String prefix, String uri) throws SAXException { public void startPrefixMapping(String prefix, String uri) throws SAXException {
// not needed // not needed
} }
@SuppressWarnings("RedundantThrows")
@Override @Override
public void endPrefixMapping(String prefix) throws SAXException { public void endPrefixMapping(String prefix) throws SAXException {
// not needed // not needed
...@@ -132,17 +133,17 @@ public class SvrlContentHandler implements ContentHandler { ...@@ -132,17 +133,17 @@ public class SvrlContentHandler implements ContentHandler {
buffer.append(ch, start, length); buffer.append(ch, start, length);
} }
} }
@SuppressWarnings("RedundantThrows")
@Override @Override
public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
// not needed // not needed
} }
@SuppressWarnings("RedundantThrows")
@Override @Override
public void processingInstruction(String target, String data) throws SAXException { public void processingInstruction(String target, String data) throws SAXException {
// not needed // not needed
} }
@SuppressWarnings("RedundantThrows")
@Override @Override
public void skippedEntity(String name) throws SAXException { public void skippedEntity(String name) throws SAXException {
// not needed // not needed
......
...@@ -124,9 +124,9 @@ public class RingSelfIntCheck extends Check { ...@@ -124,9 +124,9 @@ public class RingSelfIntCheck extends Check {
Segment3d s1 = new Segment3d(e1.getFrom(), e1.getTo()); Segment3d s1 = new Segment3d(e1.getFrom(), e1.getTo());
Segment3d s2 = new Segment3d(e2.getFrom(), e2.getTo()); Segment3d s2 = new Segment3d(e2.getFrom(), e2.getTo());
DistanceResult dr = s1.getDistanceResult(s2); DistanceResult dr = s1.getDistanceResult(s2);
if (dr.getDistance() < epsilon) { if (dr.distance() < epsilon) {
// intersection // intersection
CheckError err = new RingEdgeIntersectionError(lr, e1, e2, dr.getPoint1()); CheckError err = new RingEdgeIntersectionError(lr, e1, e2, dr.point1());
CheckResult cr = new CheckResult(this, ResultStatus.ERROR, err); CheckResult cr = new CheckResult(this, ResultStatus.ERROR, err);
lr.addCheckResult(cr); lr.addCheckResult(cr);
return; return;
......
...@@ -34,12 +34,9 @@ import de.hft.stuttgart.citydoctor2.check.ResultStatus; ...@@ -34,12 +34,9 @@ import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError; import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils; import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
import de.hft.stuttgart.citydoctor2.checks.util.SelfIntersectionUtil; import de.hft.stuttgart.citydoctor2.checks.util.SelfIntersectionUtil;
import de.hft.stuttgart.citydoctor2.datastructure.ConcretePolygon;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry; import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.GeometryType; import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
import de.hft.stuttgart.citydoctor2.math.Segment3d;
import de.hft.stuttgart.citydoctor2.utils.PolygonIntersection; import de.hft.stuttgart.citydoctor2.utils.PolygonIntersection;
import de.hft.stuttgart.citydoctor2.utils.PolygonIntersection.IntersectionType;
/** /**
* Check for self intersecting solids * Check for self intersecting solids
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment