Commit 1da24add authored by Matthias Betz's avatar Matthias Betz
Browse files

Merge branch 'CheckEngineRework' into 'master'

Check engine rework

See merge request betzms/citydoctor2!4
parents 09470a4d cd494d75
Pipeline #2115 passed with stage
in 2 minutes and 53 seconds
......@@ -21,22 +21,25 @@ package de.hft.stuttgart.citydoctor2.checks.geometry;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.CheckResult;
import de.hft.stuttgart.citydoctor2.check.CheckType;
import de.hft.stuttgart.citydoctor2.check.RequirementType;
import de.hft.stuttgart.citydoctor2.check.Requirement;
import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.check.error.RingNotClosedError;
import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
/**
* CP_CLOSE checks the closeness a linear ring. A linear ring must end where it
* C_GE_R_NOT_CLOSED checks the closeness a linear ring. A linear ring must end where it
* started.
*
* @author Matthias Betz - 12bema1bif@hft-stuttgart.de
* @author Matthias Betz
*
*/
public class RingNotClosedCheck extends Check {
......@@ -69,8 +72,13 @@ public class RingNotClosedCheck extends Check {
}
@Override
public CheckType getType() {
return CheckType.GEOMETRY;
public RequirementType getType() {
return RequirementType.GEOMETRY;
}
@Override
public Set<Requirement> appliesToRequirements() {
return CollectionUtils.singletonSet(Requirement.R_GE_R_NOT_CLOSED);
}
@Override
......
......@@ -22,15 +22,19 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.CheckResult;
import de.hft.stuttgart.citydoctor2.check.CheckType;
import de.hft.stuttgart.citydoctor2.check.RequirementType;
import de.hft.stuttgart.citydoctor2.check.Requirement;
import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.check.error.PointTouchesEdgeError;
import de.hft.stuttgart.citydoctor2.check.error.RingEdgeIntersectionError;
import de.hft.stuttgart.citydoctor2.checks.Checks;
import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
import de.hft.stuttgart.citydoctor2.datastructure.Edge;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
......@@ -39,14 +43,19 @@ import de.hft.stuttgart.citydoctor2.math.DistanceResult;
import de.hft.stuttgart.citydoctor2.math.Segment3d;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
/**
* Checks whether a ring self intersects. Also checks if a point is too close to
* an edge of the ring.
*
* @author Matthias Betz
*
*/
public class RingSelfIntCheck extends Check {
private static final String EPSILON_NAME = "minVertexDistance";
private static final List<CheckId> dependencies;
static {
ArrayList<CheckId> deps = new ArrayList<>();
deps.add(CheckId.C_GE_R_TOO_FEW_POINTS);
......@@ -55,14 +64,12 @@ public class RingSelfIntCheck extends Check {
dependencies = Collections.unmodifiableList(deps);
}
private double epsilon = 0.0001;
private double epsilon = Checks.MIN_VERTEX_DISTANCE_DEFAULT;
@Override
public void init(Map<String, String> parameters, ParserConfiguration config) {
String epsilonString = parameters.get(EPSILON_NAME);
if (epsilonString == null) {
epsilon = 0.0001;
} else {
if (epsilonString != null) {
epsilon = Double.parseDouble(epsilonString);
}
}
......@@ -141,8 +148,13 @@ public class RingSelfIntCheck extends Check {
}
@Override
public CheckType getType() {
return CheckType.GEOMETRY;
public Set<Requirement> appliesToRequirements() {
return CollectionUtils.singletonSet(Requirement.R_GE_R_SELF_INTERSECTION);
}
@Override
public RequirementType getType() {
return RequirementType.GEOMETRY;
}
@Override
......
......@@ -21,14 +21,17 @@ package de.hft.stuttgart.citydoctor2.checks.geometry;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.CheckResult;
import de.hft.stuttgart.citydoctor2.check.CheckType;
import de.hft.stuttgart.citydoctor2.check.RequirementType;
import de.hft.stuttgart.citydoctor2.check.Requirement;
import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.check.error.SolidNotClosedError;
import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
import de.hft.stuttgart.citydoctor2.datastructure.Edge;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
......@@ -37,8 +40,9 @@ import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
* This class detects half edges without neighbor, i.e. holes in solid
* geometries
*
* @author dwagner, alam
* @author Matthias Betz - 12bema1bif@hft-stuttgart.de
* @author dwagner
* @author alam
* @author Matthias Betz
*/
public class SolidNotClosedCheck extends Check {
......@@ -89,8 +93,13 @@ public class SolidNotClosedCheck extends Check {
}
@Override
public CheckType getType() {
return CheckType.GEOMETRY;
public Set<Requirement> appliesToRequirements() {
return CollectionUtils.singletonSet(Requirement.R_GE_S_NOT_CLOSED);
}
@Override
public RequirementType getType() {
return RequirementType.GEOMETRY;
}
@Override
......
......@@ -21,15 +21,18 @@ package de.hft.stuttgart.citydoctor2.checks.geometry;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.CheckResult;
import de.hft.stuttgart.citydoctor2.check.CheckType;
import de.hft.stuttgart.citydoctor2.check.RequirementType;
import de.hft.stuttgart.citydoctor2.check.GeometrySelfIntersection;
import de.hft.stuttgart.citydoctor2.check.Requirement;
import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
import de.hft.stuttgart.citydoctor2.checks.util.SelfIntersectionUtil;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
......@@ -100,8 +103,13 @@ public class SolidSelfIntCheck extends Check {
}
@Override
public CheckType getType() {
return CheckType.GEOMETRY;
public Set<Requirement> appliesToRequirements() {
return CollectionUtils.singletonSet(Requirement.R_GE_S_SELF_INTERSECTION);
}
@Override
public RequirementType getType() {
return RequirementType.GEOMETRY;
}
@Override
......
......@@ -28,23 +28,25 @@ import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.CheckResult;
import de.hft.stuttgart.citydoctor2.check.CheckType;
import de.hft.stuttgart.citydoctor2.check.RequirementType;
import de.hft.stuttgart.citydoctor2.check.Requirement;
import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.check.error.RingTooFewPointsError;
import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import de.hft.stuttgart.citydoctor2.datastructure.Vertex;
/**
* CP_NUMPOINTS checks the minimum number of point in a linear ring. At least
* C_GE_R_TOO_FEW_POINTS checks the minimum number of point in a linear ring. At least
* three vertices are minimum for a linear ring. <br/>
* <br/>
* <b>Dependency:</b> <br/>
* <dd>
* <dd>none</dd></dd>
* <dd>C_GE_R_NOT_CLOSED</dd></dd>
*
* @author Matthias Betz - 12bema1bif@hft-stuttgart.de
* @author Matthias Betz
*/
public class NumPointsCheck extends Check {
public class TooFewPointsCheck extends Check {
private static final List<CheckId> dependencies;
......@@ -97,13 +99,18 @@ public class NumPointsCheck extends Check {
}
@Override
public CheckType getType() {
return CheckType.GEOMETRY;
public Set<Requirement> appliesToRequirements() {
return CollectionUtils.singletonSet(Requirement.R_GE_R_TOO_FEW_POINTS);
}
@Override
public RequirementType getType() {
return RequirementType.GEOMETRY;
}
@Override
public Check createNewInstance() {
return new NumPointsCheck();
return new TooFewPointsCheck();
}
@Override
......
......@@ -21,21 +21,24 @@ package de.hft.stuttgart.citydoctor2.checks.geometry;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.CheckResult;
import de.hft.stuttgart.citydoctor2.check.CheckType;
import de.hft.stuttgart.citydoctor2.check.RequirementType;
import de.hft.stuttgart.citydoctor2.check.Requirement;
import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError;
import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
/**
* This class checks minimum number of planes for a solid
* This class checks minimum number of polygons for a solid
*
* @author Matthias Betz 12bema1bif@hft-stuttgart.de
* @author Matthias Betz
*/
public class TooFewPolygonsCheck extends Check {
......@@ -59,7 +62,6 @@ public class TooFewPolygonsCheck extends Check {
* not.
*
* @param toBeCheckedGeometry The ViewableGeometry that has to be checked.
* @return Vector of CDErrors
*/
@Override
public void check(Geometry g) {
......@@ -83,8 +85,13 @@ public class TooFewPolygonsCheck extends Check {
}
@Override
public CheckType getType() {
return CheckType.GEOMETRY;
public Set<Requirement> appliesToRequirements() {
return CollectionUtils.singletonSet(Requirement.R_GE_S_TOO_FEW_POLYGONS);
}
@Override
public RequirementType getType() {
return RequirementType.GEOMETRY;
}
@Override
......
......@@ -21,12 +21,15 @@ package de.hft.stuttgart.citydoctor2.checks.semantics;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.CheckResult;
import de.hft.stuttgart.citydoctor2.check.CheckType;
import de.hft.stuttgart.citydoctor2.check.RequirementType;
import de.hft.stuttgart.citydoctor2.check.Requirement;
import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
import de.hft.stuttgart.citydoctor2.checks.util.UnfragmentedCheck;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurfaceType;
......@@ -68,8 +71,13 @@ public class GroundSurfaceUnfragmented extends Check {
}
@Override
public CheckType getType() {
return CheckType.SEMANTIC;
public Set<Requirement> appliesToRequirements() {
return CollectionUtils.singletonSet(Requirement.R_SE_BS_GROUND_UNFRAGMENTED);
}
@Override
public RequirementType getType() {
return RequirementType.SEMANTIC;
}
@Override
......@@ -79,7 +87,7 @@ public class GroundSurfaceUnfragmented extends Check {
@Override
public CheckId getCheckId() {
return CheckId.C_SEM_BS_GROUND_NOT_FRAGMENTED;
return CheckId.C_SE_BS_GROUND_NOT_FRAGMENTED;
}
}
......@@ -21,13 +21,16 @@ package de.hft.stuttgart.citydoctor2.checks.semantics;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.CheckResult;
import de.hft.stuttgart.citydoctor2.check.CheckType;
import de.hft.stuttgart.citydoctor2.check.RequirementType;
import de.hft.stuttgart.citydoctor2.check.Requirement;
import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.check.error.NotCeilingError;
import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurfaceType;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
......@@ -82,8 +85,13 @@ public class IsCeilingCheck extends Check {
}
@Override
public CheckType getType() {
return CheckType.SEMANTIC;
public Set<Requirement> appliesToRequirements() {
return CollectionUtils.singletonSet(Requirement.R_SE_BS_IS_CEILING);
}
@Override
public RequirementType getType() {
return RequirementType.SEMANTIC;
}
@Override
......@@ -93,7 +101,7 @@ public class IsCeilingCheck extends Check {
@Override
public CheckId getCheckId() {
return CheckId.C_SEM_BS_NOT_CEILING;
return CheckId.C_SE_BS_IS_CEILING;
}
}
......@@ -21,13 +21,16 @@ package de.hft.stuttgart.citydoctor2.checks.semantics;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.CheckResult;
import de.hft.stuttgart.citydoctor2.check.CheckType;
import de.hft.stuttgart.citydoctor2.check.RequirementType;
import de.hft.stuttgart.citydoctor2.check.Requirement;
import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.check.error.NotFloorError;
import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurfaceType;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
......@@ -83,8 +86,13 @@ public class IsFloorCheck extends Check {
}
@Override
public CheckType getType() {
return CheckType.SEMANTIC;
public Set<Requirement> appliesToRequirements() {
return CollectionUtils.singletonSet(Requirement.R_SE_BS_IS_FLOOR);
}
@Override
public RequirementType getType() {
return RequirementType.SEMANTIC;
}
@Override
......@@ -94,7 +102,7 @@ public class IsFloorCheck extends Check {
@Override
public CheckId getCheckId() {
return CheckId.C_SEM_BS_NOT_FLOOR;
return CheckId.C_SE_BS_IS_FLOOR;
}
}
......@@ -21,13 +21,16 @@ package de.hft.stuttgart.citydoctor2.checks.semantics;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.CheckResult;
import de.hft.stuttgart.citydoctor2.check.CheckType;
import de.hft.stuttgart.citydoctor2.check.RequirementType;
import de.hft.stuttgart.citydoctor2.check.Requirement;
import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.check.error.NotGroundError;
import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurfaceType;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
......@@ -82,8 +85,13 @@ public class IsGroundCheck extends Check {
}
@Override
public CheckType getType() {
return CheckType.SEMANTIC;
public Set<Requirement> appliesToRequirements() {
return CollectionUtils.singletonSet(Requirement.R_SE_BS_IS_GROUND);
}
@Override
public RequirementType getType() {
return RequirementType.SEMANTIC;
}
@Override
......@@ -93,6 +101,6 @@ public class IsGroundCheck extends Check {
@Override
public CheckId getCheckId() {
return CheckId.C_SEM_BS_NOT_GROUND;
return CheckId.C_SE_BS_IS_GROUND;
}
}
......@@ -22,15 +22,16 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.CheckResult;
import de.hft.stuttgart.citydoctor2.check.CheckType;
import de.hft.stuttgart.citydoctor2.check.DefaultParameter;
import de.hft.stuttgart.citydoctor2.check.Requirement;
import de.hft.stuttgart.citydoctor2.check.RequirementType;
import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.check.Unit;
import de.hft.stuttgart.citydoctor2.check.error.NotWallError;
import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurfaceType;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
......@@ -52,7 +53,6 @@ public class IsWallCheck extends Check {
private static final String UPPER_ANGLE_NAME = "upperAngle";
private static final List<CheckId> dependencies;
private static final List<DefaultParameter> defaultParameters;
static {
ArrayList<CheckId> deps = new ArrayList<>();
......@@ -63,10 +63,6 @@ public class IsWallCheck extends Check {
deps.add(CheckId.C_GE_P_NON_PLANAR);
dependencies = Collections.unmodifiableList(deps);
ArrayList<DefaultParameter> defParameters = new ArrayList<>(3);
defParameters.add(new DefaultParameter(LOWER_ANGLE_NAME, "45", Unit.DEGREE));
defParameters.add(new DefaultParameter(UPPER_ANGLE_NAME, "135", Unit.DEGREE));
defaultParameters = Collections.unmodifiableList(defParameters);
}
private static final Vector3d Z_AXIS = new Vector3d(0, 0, 1);
......@@ -133,13 +129,13 @@ public class IsWallCheck extends Check {
}
@Override
public List<DefaultParameter> getDefaultParameter() {
return defaultParameters;
public Set<Requirement> appliesToRequirements() {
return CollectionUtils.singletonSet(Requirement.R_SE_BS_IS_WALL);
}
@Override
public CheckType getType() {
return CheckType.SEMANTIC;
public RequirementType getType() {
return RequirementType.SEMANTIC;
}
@Override
......@@ -149,7 +145,7 @@ public class IsWallCheck extends Check {
@Override
public CheckId getCheckId() {
return CheckId.C_SEM_BS_IS_WALL;
return CheckId.C_SE_BS_IS_WALL;
}
}
......@@ -22,13 +22,14 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.CheckResult;
import de.hft.stuttgart.citydoctor2.check.CheckType;
import de.hft.stuttgart.citydoctor2.check.DefaultParameter;
import de.hft.stuttgart.citydoctor2.check.Unit;
import de.hft.stuttgart.citydoctor2.check.Requirement;
import de.hft.stuttgart.citydoctor2.check.RequirementType;
import de.hft.stuttgart.citydoctor2.checks.util.CollectionUtils;
import de.hft.stuttgart.citydoctor2.checks.util.UnfragmentedCheck;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurfaceType;
......@@ -43,17 +44,12 @@ import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
public class RoofSurfaceUnfragmentedCheck extends Check {
private static final List<CheckId> dependencies;
private static final List<DefaultParameter> defaultParameters;
private static final String MAX_ANGLE_DEVIATION = "maxAngleDeviation";
private double maxAngleDeviation = Math.toRadians(1);
static {
ArrayList<DefaultParameter> defParameters = new ArrayList<>(3);
defParameters.add(new DefaultParameter(MAX_ANGLE_DEVIATION, "1", Unit.DEGREE));
defaultParameters = Collections.unmodifiableList(defParameters);
ArrayList<CheckId> deps = new ArrayList<>();
deps.add(CheckId.C_GE_R_TOO_FEW_POINTS);
deps.add(CheckId.C_GE_R_NOT_CLOSED);
......@@ -88,13 +84,13 @@ public class RoofSurfaceUnfragmentedCheck extends Check {
}
@Override
public List<DefaultParameter> getDefaultParameter() {
return defaultParameters;
public Set<Requirement> appliesToRequirements() {
return CollectionUtils.singletonSet(Requirement.R_SE_BS_ROOF_UNFRAGMENTED);
}
@Override
public CheckType getType() {
return CheckType.SEMANTIC;
public RequirementType getType() {
return RequirementType.SEMANTIC;
}
@Override
......@@ -104,7 +100,7 @@ public class RoofSurfaceUnfragmentedCheck extends Check {
@Override
public CheckId getCheckId() {
return CheckId.C_SEM_BS_ROOF_NOT_FRAGMENTED;
return CheckId.C_SE_BS_ROOF_UNFRAGMENTED;
}
}
/*-
* Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart
*
* This file is part of CityDoctor2.
*
* CityDoctor2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* CityDoctor2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with CityDoctor2. If not, see <https://www.gnu.org/licenses/>.
*/
package de.hft.stuttgart.citydoctor2.checks.util;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class CollectionUtils {
private CollectionUtils() {
}
public static <T> Set<T> singletonSet(T v) {
HashSet<T> set = new HashSet<>(2);
set.add(v);
return set;
}
@SafeVarargs
public static <T> Set<T> asSet(T... values) {
HashSet<T> set = new HashSet<>((int) (values.length * 1.25));
set.addAll(Arrays.asList(values));
return set;
}
}
......@@ -32,10 +32,9 @@ import java.util.concurrent.atomic.AtomicInteger;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import de.hft.stuttgart.citydoctor2.check.CheckConfiguration;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.ErrorType;
import de.hft.stuttgart.citydoctor2.check.RequirementConfiguration;
import de.hft.stuttgart.citydoctor2.check.ValidationConfiguration;
import de.hft.stuttgart.citydoctor2.checkresult.CheckReport;
import de.hft.stuttgart.citydoctor2.checkresult.Environment;
......@@ -115,10 +114,10 @@ public class XmlStreamReporter implements StreamReporter {
plan.setNumberOfRoundingPlaces(config.getNumberOfRoundingPlaces());
List<PlanCheck> checkConfigs = new ArrayList<>();
plan.setChecks(checkConfigs);
for (Entry<CheckId, CheckConfiguration> e : config.getChecks().entrySet()) {
for (Entry<String, RequirementConfiguration> e : config.getRequirements().entrySet()) {
PlanCheck checkConfig = new PlanCheck();
checkConfigs.add(checkConfig);
checkConfig.setName(e.getKey().toString());
checkConfig.setName(e.getKey());
if (e.getValue().isEnabled()) {
checkConfig.setActivated(true);
Map<String, String> checkParams = e.getValue().getParameters();
......
......@@ -41,6 +41,10 @@ import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.events.EventFormatter;
import org.apache.fop.events.model.EventSeverity;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.xmlgraphics.util.MimeConstants;
import org.jdom2.Document;
import org.jdom2.Element;
......@@ -57,6 +61,8 @@ import de.hft.stuttgart.citydoctor2.checkresult.utility.CheckReportWriteExceptio
*/
public class PdfReport {
private static final Logger logger = LogManager.getLogger(PdfReport.class);
private static final String FRONT_PAGE = "front-page";
private static final String REGION_BODY = "region-body";
private static final String MASTER_NAME = "master-name";
......@@ -160,16 +166,28 @@ public class PdfReport {
try {
FOUserAgent userAgent = FOP_FACTORY.newFOUserAgent();
userAgent.getEventBroadcaster().addEventListener(event -> {
EventSeverity severity = event.getSeverity();
String msg = EventFormatter.format(event);
if (severity == EventSeverity.ERROR) {
logger.error(msg);
} else if (severity == EventSeverity.FATAL) {
logger.fatal(msg);
} else if (severity == EventSeverity.INFO) {
logger.info(msg);
} else if (severity == EventSeverity.WARN) {
logger.warn(msg);
}
});
Fop fop = FOP_FACTORY.newFop(MimeConstants.MIME_PDF, userAgent, outFile);
TransformerFactory factory = TransformerFactory.newInstance();
// deactivate external dtds because of security issues
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
// identity transformer
Transformer transformer = factory.newTransformer();
DOMOutputter domOutputter = new DOMOutputter();
Source src = new DOMSource(domOutputter.output(doc));
Result res = new SAXResult(fop.getDefaultHandler());
transformer.transform(src, res);
......
......@@ -32,7 +32,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import de.hft.stuttgart.citydoctor2.check.CheckConfiguration;
import de.hft.stuttgart.citydoctor2.check.RequirementConfiguration;
import de.hft.stuttgart.citydoctor2.check.CheckError;
import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.CheckResult;
......@@ -133,8 +133,8 @@ public class PdfStreamReporter implements StreamReporter {
if (config.getSchematronFilePath() != null && !config.getSchematronFilePath().isEmpty()) {
vp.addTextElement("Schematron file: " + config.getSchematronFilePath());
}
for (Entry<CheckId, CheckConfiguration> e : config.getChecks().entrySet()) {
String text = e.getKey().toString();
for (Entry<String, RequirementConfiguration> e : config.getRequirements().entrySet()) {
String text = e.getKey();
String color;
if (e.getValue().isEnabled()) {
text = text + " = enabled";
......
......@@ -29,6 +29,10 @@ import org.jdom2.Namespace;
*/
public class PdfUtils {
private static final String HEIGHT_STRING = "height";
private static final String WIDTH_STRING = "width";
private static final Namespace svgNs = Namespace.getNamespace("svg", "http://www.w3.org/2000/svg");
private static final int WIDTH = 450;
......@@ -46,8 +50,8 @@ public class PdfUtils {
String val2LengthString = "" + val2Length;
Element svgElement = new Element("svg", svgNs);
svgElement.setAttribute("width", "450px");
svgElement.setAttribute("height", "30px");
svgElement.setAttribute(WIDTH_STRING, "450px");
svgElement.setAttribute(HEIGHT_STRING, "30px");
if (val1 > 0) {
Element gVal1Style = new Element("g", svgNs);
......@@ -58,8 +62,8 @@ public class PdfUtils {
gVal1Style.addContent(val1Rect);
val1Rect.setAttribute("x", "0");
val1Rect.setAttribute("y", "0");
val1Rect.setAttribute("width", val1LengthString);
val1Rect.setAttribute("height", "30");
val1Rect.setAttribute(WIDTH_STRING, val1LengthString);
val1Rect.setAttribute(HEIGHT_STRING, "30");
Element val1Text = new Element("text", svgNs);
svgElement.addContent(val1Text);
val1Text.setAttribute("x", "5");
......@@ -76,8 +80,8 @@ public class PdfUtils {
gVal2Style.addContent(val2Rect);
val2Rect.setAttribute("x", val1LengthString);
val2Rect.setAttribute("y", "0");
val2Rect.setAttribute("width", val2LengthString);
val2Rect.setAttribute("height", "30");
val2Rect.setAttribute(WIDTH_STRING, val2LengthString);
val2Rect.setAttribute(HEIGHT_STRING, "30");
Element val2Text = new Element("text", svgNs);
svgElement.addContent(val2Text);
String val2String = "" + val2;
......
......@@ -51,8 +51,8 @@ public class CheckerTest {
@Test
public void testSchematron() throws CityGmlParseException, InvalidGmlFileException {
ValidationConfiguration config = ValidationConfiguration.loadStandardValidationConfig();
config.getChecks().get(CheckId.C_SEM_BS_ROOF_NOT_FRAGMENTED).setEnabled(false);
config.setSchematronFilePath("src/test/resources/schematronTest.xml");
config.getRequirements().get(Requirement.R_SE_BS_ROOF_UNFRAGMENTED.toString()).setEnabled(false);
config.setSchematronFilePathInGlobalParameters("src/test/resources/schematronTest.xml");
CityDoctorModel model = CityGmlParser.parseCityGmlFile(
"src/test/resources/SimpleSolid_SrefBS_SchematronTest.gml", config.getParserConfiguration());
Checker checker = new Checker(config, model);
......
......@@ -25,6 +25,7 @@ import java.io.FileNotFoundException;
import org.junit.Test;
import de.hft.stuttgart.citydoctor2.datastructure.FeatureType;
import de.hft.stuttgart.quality.model.jaxb.RequirementId;
public class ValidationConfigurationTest {
......@@ -33,8 +34,8 @@ public class ValidationConfigurationTest {
String file = "src/test/resources/testConfig.yml";
ValidationConfiguration config = ValidationConfiguration.loadValidationConfig(file);
assertEquals(8, config.getNumberOfRoundingPlaces());
assertTrue(config.getChecks().containsKey(CheckId.C_GE_R_TOO_FEW_POINTS));
assertTrue(config.getChecks().get(CheckId.C_GE_P_NON_PLANAR).isEnabled());
assertTrue(config.getRequirements().containsKey(RequirementId.R_GE_R_TOO_FEW_POINTS.toString()));
assertFalse(config.getRequirements().get(RequirementId.R_GE_P_NON_PLANAR.toString()).isEnabled());
assertNull(config.getFilter());
}
......@@ -43,8 +44,8 @@ public class ValidationConfigurationTest {
String file = "src/test/resources/testConfigWithFilter.yml";
ValidationConfiguration config = ValidationConfiguration.loadValidationConfig(file);
assertEquals(8, config.getNumberOfRoundingPlaces());
assertTrue(config.getChecks().containsKey(CheckId.C_GE_R_TOO_FEW_POINTS));
assertTrue(config.getChecks().get(CheckId.C_GE_P_NON_PLANAR).isEnabled());
assertTrue(config.getRequirements().containsKey(RequirementId.R_GE_R_TOO_FEW_POINTS.toString()));
assertFalse(config.getRequirements().get(RequirementId.R_GE_P_NON_PLANAR.toString()).isEnabled());
FilterConfiguration filterConfig = config.getFilter();
assertNotNull(filterConfig);
......
......@@ -20,13 +20,16 @@ package de.hft.stuttgart.citydoctor2.checks;
import static org.junit.Assert.assertEquals;
import java.util.Set;
import org.junit.Test;
import de.hft.stuttgart.citydoctor2.check.Check;
import de.hft.stuttgart.citydoctor2.check.CheckId;
import de.hft.stuttgart.citydoctor2.check.CheckResult;
import de.hft.stuttgart.citydoctor2.check.CheckType;
import de.hft.stuttgart.citydoctor2.check.RequirementType;
import de.hft.stuttgart.citydoctor2.check.ErrorId;
import de.hft.stuttgart.citydoctor2.check.Requirement;
import de.hft.stuttgart.citydoctor2.check.ResultStatus;
import de.hft.stuttgart.citydoctor2.datastructure.AbstractBuilding;
import de.hft.stuttgart.citydoctor2.datastructure.Building;
......@@ -43,7 +46,7 @@ public class CheckContainerTest {
}
@Override
public CheckType getType() {
public RequirementType getType() {
return null;
}
......@@ -57,6 +60,11 @@ public class CheckContainerTest {
return CheckId.C_GE_P_HOLE_OUTSIDE;
}
@Override
public Set<Requirement> appliesToRequirements() {
return null;
}
};
CheckContainer cc = new CheckContainer(c);
AbstractBuilding ab = new Building();
......
Markdown is supported
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