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
b9f844bd
Commit
b9f844bd
authored
Oct 17, 2025
by
Luna Riegel
Browse files
Fix: Fix resolving of LibraryObjects in ZIP-files
parent
a9ebb77b
Pipeline
#12006
passed with stage
in 3 minutes and 38 seconds
Changes
8
Pipelines
1
Show whitespace changes
Inline
Side-by-side
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/database/CacheManager.java
View file @
b9f844bd
package
de.hft.stuttgart.citydoctor2.database
;
package
de.hft.stuttgart.citydoctor2.database
;
import
de.hft.stuttgart.citydoctor2.datastructure.CityObject
;
import
de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException
;
import
de.hft.stuttgart.citydoctor2.zip.CityGmlZipEntry
;
import
org.apache.commons.io.FilenameUtils
;
import
org.apache.commons.io.FilenameUtils
;
import
java.io.File
;
import
java.io.File
;
import
java.util.List
;
public
class
CacheManager
{
public
class
CacheManager
{
...
@@ -24,6 +28,10 @@ public class CacheManager {
...
@@ -24,6 +28,10 @@ public class CacheManager {
return
cache
;
return
cache
;
}
}
public
static
List
<
CityObject
>
retrieveLibraryObject
(
CityGmlZipEntry
entry
)
throws
InvalidGmlFileException
{
return
entry
.
getModel
().
getCache
().
retrieveLibraryObject
(
entry
.
getDisplayName
());
}
public
static
UnconnectedCache
getUnconnectedCache
(){
public
static
UnconnectedCache
getUnconnectedCache
(){
return
new
UnconnectedCache
();
return
new
UnconnectedCache
();
}
}
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/database/CityObjectCache.java
View file @
b9f844bd
...
@@ -2,6 +2,7 @@ package de.hft.stuttgart.citydoctor2.database;
...
@@ -2,6 +2,7 @@ package de.hft.stuttgart.citydoctor2.database;
import
de.hft.stuttgart.citydoctor2.datastructure.CityObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.CityObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.GmlId
;
import
de.hft.stuttgart.citydoctor2.datastructure.GmlId
;
import
de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException
;
import
java.util.List
;
import
java.util.List
;
import
java.util.stream.Stream
;
import
java.util.stream.Stream
;
...
@@ -20,4 +21,6 @@ public interface CityObjectCache {
...
@@ -20,4 +21,6 @@ public interface CityObjectCache {
int
getFeatureCount
();
int
getFeatureCount
();
void
resetCache
();
void
resetCache
();
List
<
CityObject
>
retrieveLibraryObject
(
String
fileName
)
throws
InvalidGmlFileException
;
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/database/DatabaseHandler.java
View file @
b9f844bd
...
@@ -6,6 +6,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
...
@@ -6,6 +6,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import
de.hft.stuttgart.citydoctor2.datastructure.Geometry
;
import
de.hft.stuttgart.citydoctor2.datastructure.Geometry
;
import
de.hft.stuttgart.citydoctor2.datastructure.GmlId
;
import
de.hft.stuttgart.citydoctor2.datastructure.GmlId
;
import
javafx.scene.control.Alert
;
import
javafx.scene.control.Alert
;
import
org.apache.commons.io.FilenameUtils
;
import
org.apache.commons.lang3.SerializationException
;
import
org.apache.commons.lang3.SerializationException
;
import
org.apache.commons.lang3.SerializationUtils
;
import
org.apache.commons.lang3.SerializationUtils
;
import
org.apache.logging.log4j.LogManager
;
import
org.apache.logging.log4j.LogManager
;
...
@@ -47,7 +48,7 @@ public class DatabaseHandler {
...
@@ -47,7 +48,7 @@ public class DatabaseHandler {
}
}
public
DatabaseHandler
(
String
fileName
){
public
DatabaseHandler
(
String
fileName
){
this
.
fileName
=
"\""
+
fileName
+
"\
""
;
this
.
fileName
=
FilenameUtils
.
removeExtension
(
fileName
).
replaceAll
(
" [^a-zA-Z0-9]"
,
""
)
;
setupFeaturesTable
();
setupFeaturesTable
();
}
}
...
@@ -58,6 +59,10 @@ public class DatabaseHandler {
...
@@ -58,6 +59,10 @@ public class DatabaseHandler {
}
public
String
getFileName
()
{
return
fileName
;
}
}
public
void
setupFeaturesTable
()
{
public
void
setupFeaturesTable
()
{
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/database/FeatureCache.java
View file @
b9f844bd
...
@@ -5,6 +5,7 @@ import com.github.benmanes.caffeine.cache.LoadingCache;
...
@@ -5,6 +5,7 @@ import com.github.benmanes.caffeine.cache.LoadingCache;
import
com.github.benmanes.caffeine.cache.RemovalCause
;
import
com.github.benmanes.caffeine.cache.RemovalCause
;
import
de.hft.stuttgart.citydoctor2.datastructure.CityObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.CityObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.GmlId
;
import
de.hft.stuttgart.citydoctor2.datastructure.GmlId
;
import
de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException
;
import
java.util.HashMap
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.List
;
...
@@ -70,5 +71,22 @@ public class FeatureCache implements CityObjectCache{
...
@@ -70,5 +71,22 @@ public class FeatureCache implements CityObjectCache{
cache
.
invalidateAll
();
cache
.
invalidateAll
();
}
}
@Override
public
List
<
CityObject
>
retrieveLibraryObject
(
String
fileName
)
throws
InvalidGmlFileException
{
String
prevHandler
=
handler
.
getFileName
();
this
.
changeFileName
(
fileName
);
int
featureCount
=
getFeatureCount
();
if
(
featureCount
!=
1
){
if
(
featureCount
==
0
){
throw
new
InvalidGmlFileException
(
String
.
format
(
"LibraryObject ZIP-entry %s contains no Feature"
,
fileName
));
}
else
{
throw
new
InvalidGmlFileException
(
String
.
format
(
"LibraryObject ZIP-entry %s contains more than one Feature"
,
fileName
));
}
}
List
<
CityObject
>
objects
=
handler
.
getAllCityObjects
();
this
.
changeFileName
(
prevHandler
);
return
objects
;
}
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/database/UnconnectedCache.java
View file @
b9f844bd
...
@@ -2,6 +2,7 @@ package de.hft.stuttgart.citydoctor2.database;
...
@@ -2,6 +2,7 @@ package de.hft.stuttgart.citydoctor2.database;
import
de.hft.stuttgart.citydoctor2.datastructure.CityObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.CityObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.GmlId
;
import
de.hft.stuttgart.citydoctor2.datastructure.GmlId
;
import
de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException
;
import
java.util.HashMap
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.List
;
...
@@ -17,7 +18,6 @@ public class UnconnectedCache implements CityObjectCache{
...
@@ -17,7 +18,6 @@ public class UnconnectedCache implements CityObjectCache{
UnconnectedCache
()
{
UnconnectedCache
()
{
cache
=
new
HashMap
<>();
cache
=
new
HashMap
<>();
}
}
@Override
@Override
...
@@ -46,6 +46,11 @@ public class UnconnectedCache implements CityObjectCache{
...
@@ -46,6 +46,11 @@ public class UnconnectedCache implements CityObjectCache{
}
}
public
void
resetCache
(){
public
void
resetCache
(){
cache
.
clear
();
//
}
@Override
public
List
<
CityObject
>
retrieveLibraryObject
(
String
fileName
)
throws
InvalidGmlFileException
{
return
List
.
copyOf
(
cache
.
values
());
}
}
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/LibraryObject.java
View file @
b9f844bd
package
de.hft.stuttgart.citydoctor2.datastructure
;
package
de.hft.stuttgart.citydoctor2.datastructure
;
import
de.hft.stuttgart.citydoctor2.database.CacheManager
;
import
de.hft.stuttgart.citydoctor2.parser.CityGmlParseException
;
import
de.hft.stuttgart.citydoctor2.parser.CityGmlParseException
;
import
de.hft.stuttgart.citydoctor2.parser.CityGmlParser
;
import
de.hft.stuttgart.citydoctor2.parser.CityGmlParser
;
import
de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException
;
import
de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException
;
...
@@ -87,7 +88,7 @@ public class LibraryObject extends Geometry {
...
@@ -87,7 +88,7 @@ public class LibraryObject extends Geometry {
Geometry
geo
=
null
;
Geometry
geo
=
null
;
try
{
try
{
entry
.
loadEntry
(
config
,
true
);
entry
.
loadEntry
(
config
,
true
);
geo
=
getProtoGeometry
(
entry
.
getModel
()
);
geo
=
getProtoGeometry
(
entry
);
}
catch
(
InvalidGmlFileException
e
)
{
}
catch
(
InvalidGmlFileException
e
)
{
logger
.
error
(
e
.
getStackTrace
());
logger
.
error
(
e
.
getStackTrace
());
}
catch
(
CityGmlParseException
e
)
{
}
catch
(
CityGmlParseException
e
)
{
...
@@ -111,4 +112,17 @@ public class LibraryObject extends Geometry {
...
@@ -111,4 +112,17 @@ public class LibraryObject extends Geometry {
return
objects
.
get
(
0
).
getHighestLodGeometry
();
return
objects
.
get
(
0
).
getHighestLodGeometry
();
}
}
private
static
Geometry
getProtoGeometry
(
CityGmlZipEntry
entry
)
throws
InvalidGmlFileException
,
CityGmlParseException
{
if
(
entry
.
getModel
()
==
null
)
{
throw
new
CityGmlParseException
(
"CityDoctorModel of referenced LibraryObject is null"
);
}
List
<
CityObject
>
objects
=
CacheManager
.
retrieveLibraryObject
(
entry
);
if
(
objects
.
isEmpty
())
{
throw
new
InvalidGmlFileException
(
"Referenced library-object gml file does not contain any CityGML objects!"
);
}
else
if
(
objects
.
size
()
>
1
)
{
throw
new
InvalidGmlFileException
(
"Referenced library-object gml file contains more than one CityGML object!"
);
}
return
objects
.
get
(
0
).
getHighestLodGeometry
();
}
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java
View file @
b9f844bd
...
@@ -1038,6 +1038,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
...
@@ -1038,6 +1038,7 @@ public class Citygml3FeatureMapper extends ObjectWalker {
Path
loPath
=
zipEntry
.
resolveLibraryObjectPath
(
libraryObjectPath
);
Path
loPath
=
zipEntry
.
resolveLibraryObjectPath
(
libraryObjectPath
);
CityGmlZipEntry
libEntry
=
zipEntry
.
getArchive
().
getEntry
(
loPath
.
toString
());
CityGmlZipEntry
libEntry
=
zipEntry
.
getArchive
().
getEntry
(
loPath
.
toString
());
libObj
=
LibraryObject
.
of
(
libEntry
,
config
);
libObj
=
LibraryObject
.
of
(
libEntry
,
config
);
}
}
if
(
libObj
!=
null
)
{
if
(
libObj
!=
null
)
{
igh
=
new
ImplicitGeometryHolder
(
ig
,
libObj
);
igh
=
new
ImplicitGeometryHolder
(
ig
,
libObj
);
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/CityGmlParser.java
View file @
b9f844bd
...
@@ -289,12 +289,6 @@ public class CityGmlParser {
...
@@ -289,12 +289,6 @@ public class CityGmlParser {
}
}
}
}
public
static
CityDoctorModel
parseCityGmlZipEntry
(
CityGmlZipEntry
entry
,
ParserConfiguration
config
,
ProgressListener
l
)
throws
CityGmlParseException
,
InvalidGmlFileException
,
IOException
{
return
parseCityGmlZipEntry
(
entry
,
config
,
l
,
false
);
}
public
static
CityDoctorModel
parseCityGmlZipEntry
(
CityGmlZipEntry
entry
,
ParserConfiguration
config
,
public
static
CityDoctorModel
parseCityGmlZipEntry
(
CityGmlZipEntry
entry
,
ParserConfiguration
config
,
ProgressListener
l
,
boolean
nested
)
ProgressListener
l
,
boolean
nested
)
throws
CityGmlParseException
,
InvalidGmlFileException
,
IOException
{
throws
CityGmlParseException
,
InvalidGmlFileException
,
IOException
{
...
...
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