Commit b9f844bd authored by Luna Riegel's avatar 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
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();
} }
......
...@@ -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;
} }
...@@ -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() {
......
...@@ -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;
}
} }
...@@ -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());
} }
} }
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();
}
} }
...@@ -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);
......
...@@ -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 {
......
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