Commit 31710fb8 authored by Matthias Betz's avatar Matthias Betz
Browse files

add check error hierarchy

extending visitor and add abstract visitor
parent b50c5f13
Pipeline #11354 passed with stage
in 1 minute and 40 seconds
......@@ -23,7 +23,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.ErrorId;
import de.hft.stuttgart.citydoctor2.check.ErrorReport;
import de.hft.stuttgart.citydoctor2.check.ErrorType;
......@@ -43,30 +42,25 @@ import de.hft.stuttgart.citydoctor2.datastructure.Polygon;
* @author Matthias Betz
*
*/
public class PolygonWrongOrientationError implements CheckError {
public class PolygonWrongOrientationError extends SolidError {
@Serial
private static final long serialVersionUID = -3006643655816847097L;
private final List<Edge> edges;
private final Geometry g;
public PolygonWrongOrientationError(Geometry g, List<Edge> edges) {
super(g);
this.edges = edges;
this.g = g;
}
public List<Edge> getEdges() {
return edges;
}
public Geometry getGeometry() {
return g;
}
@Override
public void report(ErrorReport report) {
report.add(g);
super.report(report);
Set<Polygon> possiblePolygons = new HashSet<>();
for (Edge e : edges) {
possiblePolygons.addAll(e.getAdjacentPolygons());
......@@ -76,17 +70,18 @@ public class PolygonWrongOrientationError implements CheckError {
@Override
public void accept(ErrorVisitor errorVisitor) {
super.accept(errorVisitor);
errorVisitor.visit(this);
}
@Override
public boolean accept(HealingMethod method, ModificationListener l) {
return method.visit(this, l);
return super.accept(method, l) || method.visit(this, l);
}
@Override
public String toString() {
return "PolygonWrongOrientationError [edges=" + edges + ", g=" + g + "]";
return "PolygonWrongOrientationError [edges=" + edges + ", g=" + getGeometry() + "]";
}
@Override
......
......@@ -18,7 +18,8 @@
*/
package de.hft.stuttgart.citydoctor2.check.error;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import java.io.Serial;
import de.hft.stuttgart.citydoctor2.check.ErrorId;
import de.hft.stuttgart.citydoctor2.check.ErrorReport;
import de.hft.stuttgart.citydoctor2.check.ErrorType;
......@@ -29,8 +30,6 @@ import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
import java.io.Serial;
/**
* When a point is repeated in a linear ring, but is not consecutive. This
* results in a self intersection of the ring and this error object is created.
......@@ -38,30 +37,20 @@ import java.io.Serial;
* @author Matthias Betz
*
*/
public class RingDuplicatePointError implements CheckError {
public class RingDuplicatePointError extends RingSelfIntersectionError {
@Serial
private static final long serialVersionUID = 7208982075173209953L;
private final LinearRing r;
private final Vertex v1;
private final Vertex v2;
public RingDuplicatePointError(LinearRing r, Vertex v1, Vertex v2) {
this.r = r;
super(r);
this.v1 = v1;
this.v2 = v2;
}
@Override
public void accept(ErrorVisitor errorVisitor) {
errorVisitor.visit(this);
}
public LinearRing getRing() {
return r;
}
public Vertex getVertex1() {
return v1;
}
......@@ -70,21 +59,27 @@ public class RingDuplicatePointError implements CheckError {
return v2;
}
@Override
public void accept(ErrorVisitor errorVisitor) {
super.accept(errorVisitor);
errorVisitor.visit(this);
}
@Override
public boolean accept(HealingMethod method, ModificationListener l) {
return method.visit(this, l);
return super.accept(method, l) || method.visit(this, l);
}
@Override
public void report(ErrorReport report) {
report.add(r);
super.report(report);
report.add("duplicate point 1", v1);
report.add("duplicate point 2", v2);
}
@Override
public String toString() {
return "DuplicatePointError [r=" + r + ", v1=" + v1 + ", v2=" + v2 + "]";
return "DuplicatePointError [r=" + getRing() + ", v1=" + v1 + ", v2=" + v2 + "]";
}
@Override
......
......@@ -18,7 +18,8 @@
*/
package de.hft.stuttgart.citydoctor2.check.error;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import java.io.Serial;
import de.hft.stuttgart.citydoctor2.check.ErrorId;
import de.hft.stuttgart.citydoctor2.check.ErrorReport;
import de.hft.stuttgart.citydoctor2.check.ErrorType;
......@@ -30,8 +31,6 @@ import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import de.hft.stuttgart.citydoctor2.math.Vector3d;
import java.io.Serial;
/**
* When two edges of the same linear ring are intersecting with each other this
* error object is created.
......@@ -39,7 +38,7 @@ import java.io.Serial;
* @author Matthias Betz
*
*/
public class RingEdgeIntersectionError implements CheckError {
public class RingEdgeIntersectionError extends RingSelfIntersectionError {
@Serial
private static final long serialVersionUID = 4923311259469198172L;
......@@ -47,20 +46,15 @@ public class RingEdgeIntersectionError implements CheckError {
private final Edge e1;
private final Edge e2;
private final Vector3d intersection;
private final LinearRing lr;
public RingEdgeIntersectionError(LinearRing lr, Edge e1, Edge e2, Vector3d intersection) {
if (e1 == null || e2 == null || lr == null || intersection == null) {
super(lr);
if (e1 == null || e2 == null || intersection == null) {
throw new IllegalArgumentException("Parameters may not be null");
}
this.e1 = e1;
this.e2 = e2;
this.intersection = intersection;
this.lr = lr;
}
public LinearRing getRing() {
return lr;
}
public Edge getEdge1() {
......@@ -78,7 +72,7 @@ public class RingEdgeIntersectionError implements CheckError {
@Override
public void report(ErrorReport report) {
report.add("type", "edge intersection");
report.add(lr);
super.report(report);
report.add(e1);
report.add(e2);
report.add("intersection point", intersection);
......@@ -86,17 +80,18 @@ public class RingEdgeIntersectionError implements CheckError {
@Override
public void accept(ErrorVisitor errorVisitor) {
super.accept(errorVisitor);
errorVisitor.visit(this);
}
@Override
public boolean accept(HealingMethod method, ModificationListener l) {
return method.visit(this, l);
return super.accept(method, l) || method.visit(this, l);
}
@Override
public String toString() {
return "EdgeIntersectionError [e1=" + e1 + ", e2=" + e2 + ", intersection=" + intersection + ", lr=" + lr + "]";
return "EdgeIntersectionError [e1=" + e1 + ", e2=" + e2 + ", intersection=" + intersection + ", lr=" + getRing() + "]";
}
@Override
......
package de.hft.stuttgart.citydoctor2.check.error;
import java.io.Serial;
import java.util.Objects;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.ErrorReport;
import de.hft.stuttgart.citydoctor2.check.ErrorVisitor;
import de.hft.stuttgart.citydoctor2.check.HealingMethod;
import de.hft.stuttgart.citydoctor2.check.ModificationListener;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
public abstract class RingError implements CheckError {
@Serial
private static final long serialVersionUID = -1579410065481104979L;
private final LinearRing ring;
public RingError(LinearRing ring) {
Objects.requireNonNull(ring);
this.ring = ring;
}
public LinearRing getRing() {
return ring;
}
@Override
public void report(ErrorReport report) {
report.add(ring);
}
@Override
public void accept(ErrorVisitor errorVisitor) {
errorVisitor.visit(this);
}
@Override
public boolean accept(HealingMethod method, ModificationListener l) {
return method.visit(this, l);
}
}
......@@ -18,7 +18,8 @@
*/
package de.hft.stuttgart.citydoctor2.check.error;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import java.io.Serial;
import de.hft.stuttgart.citydoctor2.check.ErrorId;
import de.hft.stuttgart.citydoctor2.check.ErrorReport;
import de.hft.stuttgart.citydoctor2.check.ErrorType;
......@@ -28,8 +29,6 @@ import de.hft.stuttgart.citydoctor2.check.ModificationListener;
import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import java.io.Serial;
/**
* If the first and last point of a linear ring are not the same, this error is
* created.
......@@ -37,39 +36,34 @@ import java.io.Serial;
* @author Matthias Betz
*
*/
public class RingNotClosedError implements CheckError {
@Serial
private static final long serialVersionUID = 2554099996830579201L;
private final LinearRing ring;
public class RingNotClosedError extends RingError {
public RingNotClosedError(LinearRing ring) {
this.ring = ring;
}
public LinearRing getRing() {
return ring;
super(ring);
}
@Serial
private static final long serialVersionUID = 2554099996830579201L;
@Override
public void report(ErrorReport report) {
report.add(ring);
super.report(report);
}
@Override
public void accept(ErrorVisitor errorVisitor) {
super.accept(errorVisitor);
errorVisitor.visit(this);
}
@Override
public boolean accept(HealingMethod method, ModificationListener l) {
return method.visit(this, l);
return super.accept(method, l) || method.visit(this, l);
}
@Override
public String toString() {
return "RingNotClosedError [ring=" + ring + "]";
return "RingNotClosedError [ring=" + getRing() + "]";
}
@Override
......
package de.hft.stuttgart.citydoctor2.check.error;
import java.io.Serial;
import de.hft.stuttgart.citydoctor2.check.ErrorVisitor;
import de.hft.stuttgart.citydoctor2.check.HealingMethod;
import de.hft.stuttgart.citydoctor2.check.ModificationListener;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
public abstract class RingSelfIntersectionError extends RingError {
@Serial
private static final long serialVersionUID = -4528714710581552235L;
public RingSelfIntersectionError(LinearRing ring) {
super(ring);
}
@Override
public void accept(ErrorVisitor errorVisitor) {
super.accept(errorVisitor);
errorVisitor.visit(this);
}
@Override
public boolean accept(HealingMethod method, ModificationListener l) {
return super.accept(method, l) || method.visit(this, l);
}
}
......@@ -18,7 +18,8 @@
*/
package de.hft.stuttgart.citydoctor2.check.error;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import java.io.Serial;
import de.hft.stuttgart.citydoctor2.check.ErrorId;
import de.hft.stuttgart.citydoctor2.check.ErrorReport;
import de.hft.stuttgart.citydoctor2.check.ErrorType;
......@@ -28,47 +29,40 @@ import de.hft.stuttgart.citydoctor2.check.ModificationListener;
import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import java.io.Serial;
/**
* If a linear ring has less than 4 distinct points, it is has too few points.
*
* @author Matthias Betz
*
*/
public class RingTooFewPointsError implements CheckError {
public class RingTooFewPointsError extends RingError {
@Serial
private static final long serialVersionUID = 7207518573842743261L;
private final LinearRing lr;
public RingTooFewPointsError(LinearRing lr) {
this.lr = lr;
}
public LinearRing getRing() {
return lr;
super(lr);
}
@Override
public void report(ErrorReport report) {
report.add(lr);
super.report(report);
}
@Override
public void accept(ErrorVisitor errorVisitor) {
super.accept(errorVisitor);
errorVisitor.visit(this);
}
@Override
public boolean accept(HealingMethod method, ModificationListener l) {
return method.visit(this, l);
return super.accept(method, l) || method.visit(this, l);
}
@Override
public String toString() {
return "TooFewPointsError [lr=" + lr + "]";
return "TooFewPointsError [ring=" + getRing() + "]";
}
@Override
......
package de.hft.stuttgart.citydoctor2.check.error;
import java.io.Serial;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.ErrorReport;
import de.hft.stuttgart.citydoctor2.check.ErrorVisitor;
import de.hft.stuttgart.citydoctor2.check.HealingMethod;
import de.hft.stuttgart.citydoctor2.check.ModificationListener;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
public abstract class SolidError implements CheckError {
@Serial
private static final long serialVersionUID = 4251342593056430783L;
private Geometry geom;
public SolidError(Geometry geom) {
this.geom = geom;
}
public Geometry getGeometry() {
return geom;
}
@Override
public void report(ErrorReport report) {
report.add(geom);
}
@Override
public void accept(ErrorVisitor errorVisitor) {
errorVisitor.visit(this);
}
@Override
public boolean accept(HealingMethod method, ModificationListener l) {
return method.visit(this, l);
}
}
......@@ -21,7 +21,6 @@ package de.hft.stuttgart.citydoctor2.check.error;
import java.io.Serial;
import java.util.List;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.ErrorId;
import de.hft.stuttgart.citydoctor2.check.ErrorReport;
import de.hft.stuttgart.citydoctor2.check.ErrorType;
......@@ -39,21 +38,16 @@ import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
* @author Matthias Betz
*
*/
public class SolidNotClosedError implements CheckError {
public class SolidNotClosedError extends SolidError {
@Serial
private static final long serialVersionUID = 8256385219885788891L;
private final List<Edge> errorEdges;
private final Geometry g;
public SolidNotClosedError(Geometry g, List<Edge> errorEdges) {
super(g);
this.errorEdges = errorEdges;
this.g = g;
}
public Geometry getGeometry() {
return g;
}
public List<Edge> getErrorEdges() {
......@@ -62,23 +56,24 @@ public class SolidNotClosedError implements CheckError {
@Override
public void report(ErrorReport report) {
report.add(g);
super.report(report);
report.addEdges("open edges", errorEdges);
}
@Override
public void accept(ErrorVisitor errorVisitor) {
super.accept(errorVisitor);
errorVisitor.visit(this);
}
@Override
public boolean accept(HealingMethod method, ModificationListener l) {
return method.visit(this, l);
return super.accept(method, l) || method.visit(this, l);
}
@Override
public String toString() {
return "SolidNotClosedError [errorEdges=" + errorEdges + ", g=" + g + "]";
return "SolidNotClosedError [errorEdges=" + errorEdges + ", g=" + getGeometry() + "]";
}
@Override
......
......@@ -21,9 +21,7 @@ package de.hft.stuttgart.citydoctor2.check.error;
import java.io.Serial;
import java.util.List;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.ErrorId;
import de.hft.stuttgart.citydoctor2.check.ErrorReport;
import de.hft.stuttgart.citydoctor2.check.ErrorType;
import de.hft.stuttgart.citydoctor2.check.ErrorVisitor;
import de.hft.stuttgart.citydoctor2.check.HealingMethod;
......@@ -38,46 +36,37 @@ import de.hft.stuttgart.citydoctor2.utils.PolygonIntersection;
* @author Matthias Betz
*
*/
public class SolidSelfIntError implements CheckError {
public class SolidSelfIntError extends SolidError {
@Serial
private static final long serialVersionUID = -4479936555545861422L;
private final Geometry g;
private final List<PolygonIntersection> intersections;
public SolidSelfIntError(Geometry g, List<PolygonIntersection> intersections) {
this.g = g;
super(g);
this.intersections = intersections;
}
public Geometry getGeometry() {
return g;
}
@Override
public void report(ErrorReport report) {
report.add(g);
}
public List<PolygonIntersection> getIntersections() {
return intersections;
}
@Override
public void accept(ErrorVisitor errorVisitor) {
super.accept(errorVisitor);
errorVisitor.visit(this);
}
@Override
public boolean accept(HealingMethod method, ModificationListener l) {
return method.visit(this, l);
return super.accept(method, l) || method.visit(this, l);
}
@Override
public String toString() {
return "SolidSelfIntError [g=" + g + ", intersection=" + intersections + "]";
return "SolidSelfIntError [g=" + getGeometry() + ", intersection=" + intersections + "]";
}
@Override
......
......@@ -18,7 +18,8 @@
*/
package de.hft.stuttgart.citydoctor2.check.error;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import java.io.Serial;
import de.hft.stuttgart.citydoctor2.check.ErrorId;
import de.hft.stuttgart.citydoctor2.check.ErrorReport;
import de.hft.stuttgart.citydoctor2.check.ErrorType;
......@@ -28,48 +29,42 @@ import de.hft.stuttgart.citydoctor2.check.ModificationListener;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.GmlElement;
import java.io.Serial;
/**
* When a geometry has less than 4 polygons, it cannot form a valid solid.
*
* @author Matthias Betz
*
*/
public class TooFewPolygonsError implements CheckError {
public class TooFewPolygonsError extends SolidError {
@Serial
private static final long serialVersionUID = 5800732409355221678L;
private final Geometry g;
public TooFewPolygonsError(Geometry g) {
this.g = g;
super(g);
}
public Geometry getGeometry() {
return g;
}
@Override
public void report(ErrorReport report) {
report.add(g);
report.add("number of polygons", g.getPolygons().size());
super.report(report);
report.add("number of polygons", getGeometry().getPolygons().size());
}
@Override
public void accept(ErrorVisitor errorVisitor) {
super.accept(errorVisitor);
errorVisitor.visit(this);
}
@Override
public boolean accept(HealingMethod method, ModificationListener l) {
return method.visit(this, l);
return super.accept(method, l) || method.visit(this, l);
}
@Override
public String toString() {
return "TooFewPolygonsError [g=" + g + "]";
return "TooFewPolygonsError [g=" + getGeometry() + "]";
}
@Override
......
......@@ -48,9 +48,6 @@ public class Edge implements Serializable {
this.to = to;
}
private Edge() {
}
public Vertex getFrom() {
return from;
}
......
......@@ -44,9 +44,6 @@ public class LinkedPolygon extends Polygon {
private Geometry parent;
private ConcretePolygon poly;
private LinkedPolygon() {
}
/**
* @param poly polygon this is linked to
* @param parent the parent of the linked polygon
......
package de.hft.stuttgart.citydoctor2.utils;
import java.io.Serial;
/**
* This Throwable signals that a requested CheckError was found.
*/
public class CheckErrorFound extends Throwable {
@Serial
private static final long serialVersionUID = -2066876428396230230L;
public CheckErrorFound() {
public CheckErrorFound() {
super("CheckError was found", null, true, false);
}
}
......@@ -22,7 +22,9 @@ import de.hft.stuttgart.citydoctor2.check.error.NotFloorError;
import de.hft.stuttgart.citydoctor2.check.error.NotGroundError;
import de.hft.stuttgart.citydoctor2.check.error.NotWallError;
import de.hft.stuttgart.citydoctor2.check.error.NullAreaError;
import de.hft.stuttgart.citydoctor2.check.error.PlanarityError;
import de.hft.stuttgart.citydoctor2.check.error.PointTouchesEdgeError;
import de.hft.stuttgart.citydoctor2.check.error.PolygonError;
import de.hft.stuttgart.citydoctor2.check.error.PolygonHoleOutsideError;
import de.hft.stuttgart.citydoctor2.check.error.PolygonInteriorDisconnectedError;
import de.hft.stuttgart.citydoctor2.check.error.PolygonIntersectingRingsError;
......@@ -31,9 +33,12 @@ import de.hft.stuttgart.citydoctor2.check.error.PolygonWithoutSurfaceError;
import de.hft.stuttgart.citydoctor2.check.error.PolygonWrongOrientationError;
import de.hft.stuttgart.citydoctor2.check.error.RingDuplicatePointError;
import de.hft.stuttgart.citydoctor2.check.error.RingEdgeIntersectionError;
import de.hft.stuttgart.citydoctor2.check.error.RingError;
import de.hft.stuttgart.citydoctor2.check.error.RingNotClosedError;
import de.hft.stuttgart.citydoctor2.check.error.RingSelfIntersectionError;
import de.hft.stuttgart.citydoctor2.check.error.RingTooFewPointsError;
import de.hft.stuttgart.citydoctor2.check.error.SchematronError;
import de.hft.stuttgart.citydoctor2.check.error.SolidError;
import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError;
import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError;
......@@ -265,4 +270,29 @@ public class ListErrorVisitor implements ErrorVisitor {
public void visit(PolygonWithoutSurfaceError err) {
controller.highlight(err.getPolygon(), geom);
}
@Override
public void visit(RingError err) {
// nothing to display
}
@Override
public void visit(PolygonError err) {
// nothing to display
}
@Override
public void visit(RingSelfIntersectionError err) {
// nothing to display
}
@Override
public void visit(PlanarityError err) {
// nothing to display
}
@Override
public void visit(SolidError err) {
// nothing to display
}
}
......@@ -2,13 +2,14 @@ package de.hft.stuttgart.citydoctor2.gui.tree;
import java.util.List;
import de.hft.stuttgart.citydoctor2.check.AbstractErrorVisitor;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.ErrorVisitor;
import de.hft.stuttgart.citydoctor2.check.error.AllPolygonsWrongOrientationError;
import de.hft.stuttgart.citydoctor2.check.error.AttributeInvalidError;
import de.hft.stuttgart.citydoctor2.check.error.AttributeMissingError;
import de.hft.stuttgart.citydoctor2.check.error.AttributeValueWrongError;
import de.hft.stuttgart.citydoctor2.check.error.ConsecutivePointSameError;
import de.hft.stuttgart.citydoctor2.check.error.DegeneratedRingError;
import de.hft.stuttgart.citydoctor2.check.error.DependenciesNotMetError;
import de.hft.stuttgart.citydoctor2.check.error.MultipleConnectedComponentsError;
import de.hft.stuttgart.citydoctor2.check.error.NestedRingError;
......@@ -36,7 +37,6 @@ import de.hft.stuttgart.citydoctor2.check.error.SchematronError;
import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError;
import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError;
import de.hft.stuttgart.citydoctor2.check.error.DegeneratedRingError;
import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError;
import de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError;
import de.hft.stuttgart.citydoctor2.datastructure.ConcretePolygon;
......@@ -57,7 +57,7 @@ import de.hft.stuttgart.citydoctor2.utils.PolygonIntersection;
import de.hft.stuttgart.citydoctor2.utils.PolygonIntersection.IntersectionType;
import javafx.scene.control.TreeItem;
public class ErrorItemVisitor implements ErrorVisitor {
public class ErrorItemVisitor extends AbstractErrorVisitor {
private static String nameOfAttribute = Localization.getText("ErrorItemVisitor.nameOfAttribute") + ": ";
private static String childId = Localization.getText("ErrorItemVisitor.childId") + ": ";
......
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