Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
CityDoctor
CityDoctor2
Commits
b7b0e6e6
Commit
b7b0e6e6
authored
Dec 12, 2025
by
Matthias Betz
Browse files
Add XMLValidationError and list it in global errors
parent
d240ea97
Changes
19
Hide whitespace changes
Inline
Side-by-side
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/AbstractErrorVisitor.java
View file @
b7b0e6e6
...
...
@@ -40,6 +40,7 @@ import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import
de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError
;
import
de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError
;
import
de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError
;
import
de.hft.stuttgart.citydoctor2.check.error.XMLValidationError
;
public
abstract
class
AbstractErrorVisitor
implements
ErrorVisitor
{
...
...
@@ -206,5 +207,9 @@ public abstract class AbstractErrorVisitor implements ErrorVisitor {
@Override
public
void
visit
(
SolidError
err
)
{
}
@Override
public
void
visit
(
XMLValidationError
err
)
{
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/CheckResult.java
View file @
b7b0e6e6
...
...
@@ -71,4 +71,8 @@ public class CheckResult implements Serializable {
return
String
.
format
(
"CheckResult [id=%s, status=%s, error=%s]"
,
id
,
status
,
err
);
}
public
boolean
isParsingError
()
{
return
false
;
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/Checkable.java
View file @
b7b0e6e6
...
...
@@ -26,7 +26,7 @@ import java.util.Map;
import
de.hft.stuttgart.citydoctor2.utils.CheckErrorFound
;
import
de.hft.stuttgart.citydoctor2.utils.visitors.CheckableErrorCollector
;
import
de.hft.stuttgart.citydoctor2.utils.visitors.Clear
Visitor
ResultsVisitor
;
import
de.hft.stuttgart.citydoctor2.utils.visitors.ClearResultsVisitor
;
import
de.hft.stuttgart.citydoctor2.utils.visitors.ClearMetaInformationVisitor
;
import
de.hft.stuttgart.citydoctor2.utils.visitors.ContainsAnyErrorVisitor
;
import
de.hft.stuttgart.citydoctor2.utils.visitors.ContainsErrorVisitor
;
...
...
@@ -221,18 +221,18 @@ public abstract class Checkable implements Serializable {
}
/**
* Clears the checkResults
list
of this checkable.
* Clears the checkResults of this checkable
unless the error occured during parsing
.
*/
public
void
clearCheckResults
()
{
setValidated
(
false
);
checkResults
.
clear
(
);
checkResults
.
entrySet
().
removeIf
(
e
->
!
e
.
getValue
().
isParsingError
()
);
setValidated
(!
checkResults
.
isEmpty
()
);
}
/**
* Clears the checkResults list of this checkable and all child objects in its datastructure.
*/
public
final
void
clearAllContainedCheckResults
()
{
this
.
accept
(
new
Clear
Visitor
ResultsVisitor
());
this
.
accept
(
new
ClearResultsVisitor
());
}
/**
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/ErrorId.java
View file @
b7b0e6e6
...
...
@@ -66,6 +66,7 @@ public record ErrorId(String name) implements Serializable {
public
static
final
ErrorId
SE_BS_UNFRAGMENTED
=
new
ErrorId
(
"SE_BS_UNFRAGMENTED"
);
public
static
final
ErrorId
GE_P_DEGENERATED_RING
=
new
ErrorId
(
"GE_P_DEGENERATED_POLYGON"
);
public
static
final
ErrorId
SE_POLYGON_WITHOUT_SURFACE
=
new
ErrorId
(
"SE_POLYGON_WITHOUT_SURFACE"
);
public
static
final
ErrorId
SC_SCHEMA_VALIDATION
=
new
ErrorId
(
"SC_SCHEMA_VALIDATION"
);
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/ErrorVisitor.java
View file @
b7b0e6e6
...
...
@@ -58,6 +58,7 @@ import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import
de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError
;
import
de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError
;
import
de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError
;
import
de.hft.stuttgart.citydoctor2.check.error.XMLValidationError
;
/**
* Visitor pattern interface to access errors. This is to determine the type of
...
...
@@ -149,5 +150,7 @@ public interface ErrorVisitor {
public
void
visit
(
CheckError
err
);
public
void
visit
(
SolidError
err
);
public
void
visit
(
XMLValidationError
err
);
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/HealingMethod.java
View file @
b7b0e6e6
...
...
@@ -51,6 +51,7 @@ import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import
de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError
;
import
de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError
;
import
de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError
;
import
de.hft.stuttgart.citydoctor2.check.error.XMLValidationError
;
/**
* Visitor pattern interface used in the healing procedures. The modification
...
...
@@ -199,6 +200,10 @@ public interface HealingMethod {
default
boolean
visit
(
PolygonWithoutSurfaceError
err
,
ModificationListener
l
)
{
return
false
;
}
default
boolean
visit
(
XMLValidationError
err
,
ModificationListener
l
)
{
return
false
;
}
public
HealingMethod
createNew
();
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/QualityAdeErrorVisitor.java
View file @
b7b0e6e6
...
...
@@ -58,6 +58,7 @@ import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import
de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError
;
import
de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError
;
import
de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError
;
import
de.hft.stuttgart.citydoctor2.check.error.XMLValidationError
;
import
de.hft.stuttgart.citydoctor2.datastructure.Edge
;
import
de.hft.stuttgart.citydoctor2.datastructure.LinearRing
;
import
de.hft.stuttgart.citydoctor2.datastructure.Polygon
;
...
...
@@ -403,5 +404,10 @@ public class QualityAdeErrorVisitor extends AbstractErrorVisitor {
public
void
visit
(
PolygonWithoutSurfaceError
err
)
{
// not translated
}
@Override
public
void
visit
(
XMLValidationError
err
)
{
// not translated
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/check/error/XMLValidationError.java
0 → 100644
View file @
b7b0e6e6
package
de.hft.stuttgart.citydoctor2.check.error
;
import
java.io.Serial
;
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
;
import
de.hft.stuttgart.citydoctor2.check.ModificationListener
;
import
de.hft.stuttgart.citydoctor2.datastructure.GmlElement
;
public
class
XMLValidationError
implements
CheckError
{
@Serial
private
static
final
long
serialVersionUID
=
4002356100680460598L
;
private
String
message
;
public
XMLValidationError
(
String
message
)
{
this
.
message
=
message
;
}
@Override
public
ErrorType
getType
()
{
return
ErrorType
.
ERROR
;
}
@Override
public
ErrorId
getErrorId
()
{
return
ErrorId
.
SC_SCHEMA_VALIDATION
;
}
@Override
public
GmlElement
getFeature
()
{
return
null
;
}
@Override
public
void
accept
(
ErrorVisitor
errorVisitor
)
{
errorVisitor
.
visit
(
this
);
}
@Override
public
boolean
accept
(
HealingMethod
method
,
ModificationListener
l
)
{
return
method
.
visit
(
this
,
l
);
}
public
String
getMessage
()
{
return
message
;
}
@Override
public
void
report
(
ErrorReport
report
)
{
report
.
add
(
"message"
,
message
);
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/GMLValidationHandler.java
View file @
b7b0e6e6
...
...
@@ -28,29 +28,38 @@ import org.xml.sax.SAXParseException;
public
class
GMLValidationHandler
implements
ErrorHandler
{
private
static
final
int
MAX_LINE_SIZE
=
200
;
private
static
final
Logger
logger
=
LogManager
.
getLogger
(
GMLValidationHandler
.
class
);
private
final
List
<
String
>
messages
=
new
ArrayList
<>();
@Override
public
void
error
(
SAXParseException
exception
)
{
String
message
=
"["
+
exception
.
getLineNumber
()
+
", "
+
exception
.
getColumnNumber
()
+
"] "
+
exception
.
getMessage
();
String
message
=
constructMessage
(
exception
);
logger
.
error
(
message
);
messages
.
add
(
message
);
}
private
String
constructMessage
(
SAXParseException
exception
)
{
String
exceptionMessage
=
exception
.
getMessage
();
String
message
=
"[line: "
+
exception
.
getLineNumber
()
+
"] "
+
exceptionMessage
.
substring
(
0
,
Math
.
min
(
exceptionMessage
.
length
(),
MAX_LINE_SIZE
));
if
(
exceptionMessage
.
length
()
>
MAX_LINE_SIZE
)
{
message
+=
"..."
;
}
return
message
;
}
@Override
public
void
warning
(
SAXParseException
exception
)
{
String
message
=
"["
+
exception
.
getLineNumber
()
+
", "
+
exception
.
getColumnNumber
()
+
"] "
+
exception
.
getMessage
();
String
message
=
constructMessage
(
exception
);
logger
.
warn
(
message
);
messages
.
add
(
message
);
}
@Override
public
void
fatalError
(
SAXParseException
exception
)
{
String
message
=
"["
+
exception
.
getLineNumber
()
+
", "
+
exception
.
getColumnNumber
()
+
"] "
+
exception
.
getMessage
();
String
message
=
constructMessage
(
exception
);
logger
.
fatal
(
message
);
messages
.
add
(
message
);
}
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/CityGmlParser.java
View file @
b7b0e6e6
...
...
@@ -28,6 +28,7 @@ import java.nio.file.Path;
import
java.nio.file.Paths
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.Collections
;
import
java.util.List
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
...
...
@@ -43,8 +44,6 @@ import javax.xml.validation.Schema;
import
javax.xml.validation.SchemaFactory
;
import
javax.xml.validation.Validator
;
import
de.hft.stuttgart.citydoctor2.datastructure.GmlId
;
import
de.hft.stuttgart.citydoctor2.datastructure.ImplicitGeometryHolder
;
import
org.apache.logging.log4j.Level
;
import
org.apache.logging.log4j.LogManager
;
import
org.apache.logging.log4j.Logger
;
...
...
@@ -84,8 +83,11 @@ import org.xmlobjects.schema.SchemaHandlerException;
import
org.xmlobjects.stream.XMLReader
;
import
org.xmlobjects.stream.XMLReaderFactory
;
import
de.hft.stuttgart.citydoctor2.check.error.XMLValidationError
;
import
de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel
;
import
de.hft.stuttgart.citydoctor2.datastructure.CityObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.GmlId
;
import
de.hft.stuttgart.citydoctor2.datastructure.ImplicitGeometryHolder
;
import
de.hft.stuttgart.citydoctor2.mapper.citygml3.Citygml3FeatureMapper
;
import
de.hft.stuttgart.citydoctor2.mapper.citygml3.GMLValidationHandler
;
import
de.hft.stuttgart.citydoctor2.math.Vector3d
;
...
...
@@ -262,11 +264,9 @@ public class CityGmlParser {
throws
CityGmlParseException
,
InvalidGmlFileException
{
CityGMLContext
context
=
getContext
();
Path
file
=
Paths
.
get
(
filePath
);
List
<
String
>
validationIssues
=
Collections
.
emptyList
();
if
(
config
.
getValidate
())
{
List
<
String
>
messages
=
validateFile
(
context
,
handler
,
file
);
if
(!
messages
.
isEmpty
())
{
throw
new
InvalidGmlFileException
(
"Invalid GML File. First error: \n"
+
messages
.
get
(
0
));
}
validationIssues
=
validateFile
(
context
,
handler
,
file
);
}
try
{
...
...
@@ -277,7 +277,11 @@ public class CityGmlParser {
if
(
l
!=
null
)
{
ois
.
addListener
(
l:
:
updateProgress
);
}
return
readAndKeepFeatures
(
config
,
file
,
in
,
ois
,
verbose
,
unconnected
);
CityDoctorModel
model
=
readAndKeepFeatures
(
config
,
file
,
in
,
ois
,
verbose
,
unconnected
);
for
(
String
xmlError
:
validationIssues
)
{
model
.
addGlobalError
(
new
XMLValidationError
(
xmlError
));
}
return
model
;
}
}
catch
(
CityGMLReadException
|
IOException
e
)
{
throw
new
CityGmlParseException
(
"Failed to read CityGML file"
,
e
);
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/Clear
Visitor
ResultsVisitor.java
→
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/utils/visitors/ClearResultsVisitor.java
View file @
b7b0e6e6
...
...
@@ -6,7 +6,7 @@ import de.hft.stuttgart.citydoctor2.check.Checkable;
/**
* This Visitor removes the check results from a CityObject and the objects in its datastructure.
*/
public
class
Clear
Visitor
ResultsVisitor
extends
CheckableUtilsVisitor
{
public
class
ClearResultsVisitor
extends
CheckableUtilsVisitor
{
@Override
public
void
check
(
Checkable
checkable
)
{
...
...
CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/BoundarySurfaceTest.java
View file @
b7b0e6e6
...
...
@@ -30,7 +30,7 @@ import java.util.ArrayList;
import
java.util.List
;
import
java.util.concurrent.atomic.AtomicInteger
;
import
de.hft.stuttgart.citydoctor2.utils.visitors.Clear
Visitor
ResultsVisitor
;
import
de.hft.stuttgart.citydoctor2.utils.visitors.ClearResultsVisitor
;
import
de.hft.stuttgart.citydoctor2.utils.visitors.GmlGeometryRebuilder
;
import
de.hft.stuttgart.citydoctor2.utils.visitors.UnsetGeometriesVisitor
;
import
org.citygml4j.core.model.construction.AbstractConstructionSurface
;
...
...
@@ -141,7 +141,7 @@ public class BoundarySurfaceTest {
assertFalse
(
bs
.
getAllCheckResults
().
isEmpty
());
bs
.
addOpening
(
oMock
);
bs
.
clearAllContainedCheckResults
();
verify
(
oMock
).
accept
(
any
(
Clear
Visitor
ResultsVisitor
.
class
));
verify
(
oMock
).
accept
(
any
(
ClearResultsVisitor
.
class
));
assertTrue
(
bs
.
getAllCheckResults
().
isEmpty
());
}
...
...
CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/GeometryTest.java
View file @
b7b0e6e6
...
...
@@ -33,7 +33,7 @@ import java.util.ArrayList;
import
java.util.List
;
import
de.hft.stuttgart.citydoctor2.check.CheckableUtilsVisitor
;
import
de.hft.stuttgart.citydoctor2.utils.visitors.Clear
Visitor
ResultsVisitor
;
import
de.hft.stuttgart.citydoctor2.utils.visitors.ClearResultsVisitor
;
import
org.citygml4j.core.model.construction.AbstractConstructionSurface
;
import
org.citygml4j.core.model.construction.WallSurface
;
import
org.citygml4j.core.util.geometry.GeometryFactory
;
...
...
@@ -301,7 +301,7 @@ public class GeometryTest {
Polygon
p
=
mock
(
Polygon
.
class
);
geom
.
addPolygon
(
p
);
geom
.
clearAllContainedCheckResults
();
verify
(
p
).
accept
(
any
(
Clear
Visitor
ResultsVisitor
.
class
));
verify
(
p
).
accept
(
any
(
ClearResultsVisitor
.
class
));
assertFalse
(
geom
.
containsError
(
CheckId
.
C_GE_P_HOLE_OUTSIDE
));
}
...
...
CityDoctorParent/CityDoctorModel/src/test/java/de/hft/stuttgart/citydoctor2/datastructure/TrafficSpaceTest.java
View file @
b7b0e6e6
...
...
@@ -6,7 +6,7 @@ import de.hft.stuttgart.citydoctor2.check.CheckId;
import
de.hft.stuttgart.citydoctor2.check.CheckResult
;
import
de.hft.stuttgart.citydoctor2.check.ResultStatus
;
import
de.hft.stuttgart.citydoctor2.parser.ParserConfiguration
;
import
de.hft.stuttgart.citydoctor2.utils.visitors.Clear
Visitor
ResultsVisitor
;
import
de.hft.stuttgart.citydoctor2.utils.visitors.ClearResultsVisitor
;
import
org.citygml4j.core.model.core.AbstractSpaceBoundary
;
import
org.citygml4j.core.model.core.AbstractUnoccupiedSpace
;
import
org.citygml4j.core.model.deprecated.core.DeprecatedPropertiesOfAbstractCityObject
;
...
...
@@ -91,7 +91,7 @@ public class TrafficSpaceTest {
tso
.
clearAllContainedCheckResults
();
assertFalse
(
tso
.
containsError
(
CheckId
.
C_GE_P_HOLE_OUTSIDE
));
verify
(
taMock
).
accept
(
any
(
Clear
Visitor
ResultsVisitor
.
class
));
verify
(
taMock
).
accept
(
any
(
ClearResultsVisitor
.
class
));
}
@Test
...
...
CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/Checker.java
View file @
b7b0e6e6
...
...
@@ -18,6 +18,49 @@
*/
package
de.hft.stuttgart.citydoctor2.check
;
import
java.io.BufferedOutputStream
;
import
java.io.File
;
import
java.io.FileInputStream
;
import
java.io.FileNotFoundException
;
import
java.io.FileOutputStream
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.io.UncheckedIOException
;
import
java.nio.file.Files
;
import
java.nio.file.Path
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.HashMap
;
import
java.util.HashSet
;
import
java.util.Iterator
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map.Entry
;
import
java.util.Set
;
import
java.util.concurrent.Callable
;
import
java.util.concurrent.ExecutionException
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.Future
;
import
java.util.concurrent.LinkedBlockingQueue
;
import
java.util.concurrent.ThreadPoolExecutor
;
import
java.util.concurrent.TimeUnit
;
import
java.util.concurrent.atomic.AtomicInteger
;
import
javax.xml.XMLConstants
;
import
javax.xml.transform.Result
;
import
javax.xml.transform.Source
;
import
javax.xml.transform.Transformer
;
import
javax.xml.transform.TransformerException
;
import
javax.xml.transform.TransformerFactory
;
import
javax.xml.transform.dom.DOMResult
;
import
javax.xml.transform.dom.DOMSource
;
import
javax.xml.transform.sax.SAXResult
;
import
javax.xml.transform.stream.StreamSource
;
import
org.apache.logging.log4j.LogManager
;
import
org.apache.logging.log4j.Logger
;
import
de.hft.stuttgart.citydoctor2.check.error.AttributeInvalidError
;
import
de.hft.stuttgart.citydoctor2.check.error.AttributeMissingError
;
import
de.hft.stuttgart.citydoctor2.check.error.AttributeValueWrongError
;
...
...
@@ -29,13 +72,11 @@ import de.hft.stuttgart.citydoctor2.checks.Checks;
import
de.hft.stuttgart.citydoctor2.checks.SvrlContentHandler
;
import
de.hft.stuttgart.citydoctor2.checks.util.FeatureCheckedListener
;
import
de.hft.stuttgart.citydoctor2.database.CityObjectCache
;
import
de.hft.stuttgart.citydoctor2.database.CityObjectCache
;
import
de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel
;
import
de.hft.stuttgart.citydoctor2.datastructure.CityObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.FeatureType
;
import
de.hft.stuttgart.citydoctor2.datastructure.GmlId
;
import
de.hft.stuttgart.citydoctor2.datastructure.ImplicitGeometryHolder
;
import
de.hft.stuttgart.citydoctor2.datastructure.GmlId
;
import
de.hft.stuttgart.citydoctor2.parser.CityGmlConsumer
;
import
de.hft.stuttgart.citydoctor2.parser.CityGmlParseException
;
import
de.hft.stuttgart.citydoctor2.parser.CityGmlParser
;
...
...
@@ -59,40 +100,6 @@ import de.hft.stuttgart.quality.model.properties.RequirementProperty;
import
de.hft.stuttgart.quality.model.types.Checking
;
import
de.hft.stuttgart.quality.model.types.Parameter
;
import
de.hft.stuttgart.quality.model.types.ValidationPlan
;
import
org.apache.logging.log4j.LogManager
;
import
org.apache.logging.log4j.Logger
;
import
javax.xml.XMLConstants
;
import
javax.xml.transform.Result
;
import
javax.xml.transform.Source
;
import
javax.xml.transform.Transformer
;
import
javax.xml.transform.TransformerException
;
import
javax.xml.transform.TransformerFactory
;
import
javax.xml.transform.dom.DOMResult
;
import
javax.xml.transform.dom.DOMSource
;
import
javax.xml.transform.sax.SAXResult
;
import
javax.xml.transform.stream.StreamSource
;
import
java.io.BufferedOutputStream
;
import
java.io.File
;
import
java.io.FileInputStream
;
import
java.io.FileNotFoundException
;
import
java.io.FileOutputStream
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.io.UncheckedIOException
;
import
java.nio.file.Files
;
import
java.nio.file.Path
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.HashMap
;
import
java.util.HashSet
;
import
java.util.Iterator
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map.Entry
;
import
java.util.Set
;
import
java.util.concurrent.*
;
import
java.util.concurrent.atomic.AtomicInteger
;
/**
* The main container class for checking. It contains the logic for validation,
...
...
@@ -253,7 +260,7 @@ public class Checker {
}
handler
.
getFeatureErrors
().
forEach
((
k
,
v
)
->
{
String
trimmedId
=
k
.
trim
();
CityObject
co
=
cache
.
get
(
new
GmlId
(
k
));
CityObject
co
=
cache
.
get
(
new
GmlId
(
trimmedId
));
if
(
co
==
null
)
{
// gml id reported by schematron was not found, add to general errors
handleSchematronErrorsGlobal
(
v
);
...
...
CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/CityDoctorController.java
View file @
b7b0e6e6
package
de.hft.stuttgart.citydoctor2.gui
;
import
java.io.File
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.HashMap
;
import
java.util.HashSet
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Optional
;
import
java.util.Set
;
import
java.util.concurrent.atomic.AtomicInteger
;
import
java.util.function.Function
;
import
java.util.function.Supplier
;
import
java.util.stream.Stream
;
import
org.apache.logging.log4j.LogManager
;
import
org.apache.logging.log4j.Logger
;
import
org.citygml4j.core.model.core.CityModel
;
import
de.hft.stuttgart.citydoctor2.check.CheckError
;
import
de.hft.stuttgart.citydoctor2.check.Checker
;
import
de.hft.stuttgart.citydoctor2.check.ErrorId
;
import
de.hft.stuttgart.citydoctor2.check.ValidationConfiguration
;
import
de.hft.stuttgart.citydoctor2.check.error.SchematronError
;
import
de.hft.stuttgart.citydoctor2.database.UnconnectedCache
;
import
de.hft.stuttgart.citydoctor2.datastructure.*
;
import
de.hft.stuttgart.citydoctor2.datastructure.AbstractBuilding
;
import
de.hft.stuttgart.citydoctor2.datastructure.AbstractFurniture
;
import
de.hft.stuttgart.citydoctor2.datastructure.AbstractRoom
;
import
de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface
;
import
de.hft.stuttgart.citydoctor2.datastructure.BoundingBox
;
import
de.hft.stuttgart.citydoctor2.datastructure.BridgeConstructiveElement
;
import
de.hft.stuttgart.citydoctor2.datastructure.BridgeObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.Building
;
import
de.hft.stuttgart.citydoctor2.datastructure.BuildingConstructiveElement
;
import
de.hft.stuttgart.citydoctor2.datastructure.BuildingPart
;
import
de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit
;
import
de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel
;
import
de.hft.stuttgart.citydoctor2.datastructure.CityFurniture
;
import
de.hft.stuttgart.citydoctor2.datastructure.CityObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.FeatureType
;
import
de.hft.stuttgart.citydoctor2.datastructure.GenericCityObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.Geometry
;
import
de.hft.stuttgart.citydoctor2.datastructure.GmlId
;
import
de.hft.stuttgart.citydoctor2.datastructure.Installation
;
import
de.hft.stuttgart.citydoctor2.datastructure.Opening
;
import
de.hft.stuttgart.citydoctor2.datastructure.Storey
;
import
de.hft.stuttgart.citydoctor2.datastructure.TopLevelTransportFeature
;
import
de.hft.stuttgart.citydoctor2.datastructure.TrafficAreaObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.TrafficSpaceObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.TransportSection
;
import
de.hft.stuttgart.citydoctor2.datastructure.TransportationObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.TransportationSpace
;
import
de.hft.stuttgart.citydoctor2.datastructure.Tunnel
;
import
de.hft.stuttgart.citydoctor2.datastructure.TunnelConstructiveElement
;
import
de.hft.stuttgart.citydoctor2.datastructure.TunnelPart
;
import
de.hft.stuttgart.citydoctor2.datastructure.Vegetation
;
import
de.hft.stuttgart.citydoctor2.datastructure.WaterObject
;
import
de.hft.stuttgart.citydoctor2.exceptions.CityDoctorWriteException
;
import
de.hft.stuttgart.citydoctor2.gui.table.ErrorStat
;
import
de.hft.stuttgart.citydoctor2.gui.tree.*
;
import
de.hft.stuttgart.citydoctor2.gui.tree.AddMoreButtonRunnable
;
import
de.hft.stuttgart.citydoctor2.gui.tree.ButtonRenderable
;
import
de.hft.stuttgart.citydoctor2.gui.tree.Renderable
;
import
de.hft.stuttgart.citydoctor2.gui.tree.node.CityObjectGroupNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.node.CityObjectNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.node.GeometryNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.node.OpeningNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.node.TopLevelCityObjectNode
;
import
de.hft.stuttgart.citydoctor2.mapper.citygml3.GMLValidationHandler
;
import
de.hft.stuttgart.citydoctor2.parser.*
;
import
de.hft.stuttgart.citydoctor2.parser.CityGmlParseException
;
import
de.hft.stuttgart.citydoctor2.parser.CityGmlParser
;
import
de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException
;
import
de.hft.stuttgart.citydoctor2.parser.ParserConfiguration
;
import
de.hft.stuttgart.citydoctor2.parser.ProgressListener
;
import
de.hft.stuttgart.citydoctor2.utils.Localization
;
import
de.hft.stuttgart.quality.adapter.types.ErrorAdapter
;
import
javafx.application.Platform
;
import
javafx.scene.chart.XYChart.Data
;
import
javafx.scene.chart.XYChart.Series
;
...
...
@@ -29,18 +81,6 @@ import javafx.scene.control.TreeView;
import
javafx.scene.paint.Color
;
import
javafx.stage.FileChooser
;
import
javafx.stage.FileChooser.ExtensionFilter
;
import
org.apache.logging.log4j.LogManager
;
import
org.apache.logging.log4j.Logger
;
import
org.citygml4j.core.model.core.CityModel
;
import
org.xml.sax.SAXParseException
;
import
java.io.File
;
import
java.util.*
;
import
java.util.List
;
import
java.util.concurrent.atomic.AtomicInteger
;
import
java.util.function.Function
;
import
java.util.function.Supplier
;
import
java.util.stream.Stream
;
public
class
CityDoctorController
{
...
...
@@ -98,40 +138,14 @@ public class CityDoctorController {
});
currentChecker
=
null
;
currentConfig
=
new
ParserConfiguration
(
numberOfRoundingPlaces
,
useValidation
,
lowMemory
);
GMLValidationHandler
handler
=
null
;
List
<
String
>
validationIssues
=
new
ArrayList
<>();
if
(
useValidation
)
{
handler
=
new
GMLValidationHandler
()
{
@Override
public
void
error
(
SAXParseException
exception
)
{
if
(
exception
.
getLineNumber
()
>=
0
)
{
String
s
=
"In line "
+
exception
.
getLineNumber
()
+
":"
;
validationIssues
.
add
(
s
);
}
validationIssues
.
add
(
exception
.
getMessage
());
}
@Override
public
void
warning
(
SAXParseException
exception
)
{
error
(
exception
);
}
@Override
public
void
fatalError
(
SAXParseException
exception
)
{
error
(
exception
);
}
};
}
model
=
CityGmlParser
.
parseCityGmlFile
(
path
,
currentConfig
,
l
,
handler
);
if
(!
validationIssues
.
isEmpty
())
{
StringJoiner
sj
=
new
StringJoiner
(
"\n"
);
validationIssues
.
stream
().
forEach
(
sj:
:
add
);
throw
new
InvalidGmlFileException
(
sj
.
toString
());
}
model
=
CityGmlParser
.
parseCityGmlFile
(
path
,
currentConfig
,
l
);
mainWindow
.
getClickHandler
().
setConfig
(
currentConfig
);
sourceFile
=
path
;
renderer
.
reset
();
Platform
.
runLater
(()
->
{
// show errors that occured during parsing
updateGlobalErrors
();
mainWindow
.
addFileNameToTitle
(
path
);
mainWindow
.
getCheckButton
().
setDisable
(
false
);
mainWindow
.
getLod1Btn
().
setDisable
(
false
);
...
...
@@ -1099,6 +1113,11 @@ public class CityDoctorController {
for
(
CheckError
e
:
model
.
getGlobalErrors
())
{
e
.
accept
(
globErrVisitor
);
}
if
(
model
.
getGlobalErrors
().
isEmpty
())
{
mainWindow
.
getGlobalErrorsLabel
().
setStyle
(
"-fx-text-fill: black;"
);
}
else
{
mainWindow
.
getGlobalErrorsLabel
().
setStyle
(
"-fx-text-fill: red;"
);
}
}
void
updateFeatureTrees
()
{
...
...
@@ -1233,6 +1252,7 @@ public class CityDoctorController {
case
LAND
->
filterLandTree
(
searchString
);
case
CITY_FURNITURE
->
filterCityFurnitureTree
(
searchString
);
case
OTHER_CITY_OBJECT
->
filterOtherCityObjectsTree
(
searchString
);
default
->
throw
new
IllegalArgumentException
(
"selected tab is unknown: "
+
selectedTab
);
}
...
...
CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/GlobalErrorVisitor.java
View file @
b7b0e6e6
...
...
@@ -42,6 +42,7 @@ import de.hft.stuttgart.citydoctor2.check.error.SolidSelfIntError;
import
de.hft.stuttgart.citydoctor2.check.error.SurfaceUnfragmentedError
;
import
de.hft.stuttgart.citydoctor2.check.error.TooFewPolygonsError
;
import
de.hft.stuttgart.citydoctor2.check.error.UnknownCheckError
;
import
de.hft.stuttgart.citydoctor2.check.error.XMLValidationError
;
public
class
GlobalErrorVisitor
implements
ErrorVisitor
{
...
...
@@ -221,5 +222,11 @@ public class GlobalErrorVisitor implements ErrorVisitor {
@Override
public
void
visit
(
SolidError
err
)
{
}
@Override
public
void
visit
(
XMLValidationError
err
)
{
mainWindow
.
getGlobalErrorsView
().
getItems
().
add
(
err
.
getErrorId
().
getIdString
()
+
" - "
+
err
.
getMessage
());
}
}
CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/ListErrorVisitor.java
View file @
b7b0e6e6
...
...
@@ -45,6 +45,7 @@ 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.check.error.XMLValidationError
;
import
de.hft.stuttgart.citydoctor2.datastructure.Edge
;
import
de.hft.stuttgart.citydoctor2.datastructure.LinearRing
;
import
de.hft.stuttgart.citydoctor2.datastructure.Vertex
;
...
...
@@ -295,4 +296,9 @@ public class ListErrorVisitor implements ErrorVisitor {
public
void
visit
(
SolidError
err
)
{
// nothing to display
}
@Override
public
void
visit
(
XMLValidationError
err
)
{
// nothing to display
}
}
CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/MainWindow.java
View file @
b7b0e6e6
...
...
@@ -208,6 +208,8 @@ public class MainWindow extends Application {
@FXML
private
Label
availableLabel
;
private
Label
globalErrorsLabel
;
private
Image
north
;
private
Image
northFlip
;
...
...
@@ -310,9 +312,6 @@ public class MainWindow extends Application {
ViewRegistration
.
registerView
(
valView
);
setupViews
(
valView
);
createLanguageSelector
();
setLabelsInCorrectLanguage
();
Scene
scene
=
new
Scene
(
bp
,
1280
,
800
);
createDropTarget
(
scene
,
valView
);
String
version
=
Localization
.
getText
(
Localization
.
VERSION
);
...
...
@@ -544,6 +543,9 @@ public class MainWindow extends Application {
setupSearchButtons
();
setupShowCityComboBox
();
createLanguageSelector
();
setLabelsInCorrectLanguage
();
detailsTabPane
.
getSelectionModel
().
selectedIndexProperty
()
.
addListener
((
ov
,
oldI
,
newI
)
->
Platform
.
runLater
(()
->
{
...
...
@@ -553,6 +555,11 @@ public class MainWindow extends Application {
errorView
.
getSelectionModel
().
getSelectedItem
().
getValue
().
visit
(
renderer
);
}
}));
// setup label of the global error tab for color changes
globalErrorsLabel
=
new
Label
(
globalErrorsTab
.
getText
());
globalErrorsTab
.
setGraphic
(
globalErrorsLabel
);
globalErrorsTab
.
setText
(
""
);
}
private
void
setupShowCityComboBox
()
{
...
...
@@ -1190,4 +1197,8 @@ public class MainWindow extends Application {
public
FeatureType
getSelectedTab
()
{
return
selectedTab
;
}
public
Label
getGlobalErrorsLabel
()
{
return
globalErrorsLabel
;
}
}
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment