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;
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 java.io.File;
import java.util.List;
public class CacheManager {
......@@ -24,6 +28,10 @@ public class CacheManager {
return cache;
}
public static List<CityObject> retrieveLibraryObject(CityGmlZipEntry entry) throws InvalidGmlFileException {
return entry.getModel().getCache().retrieveLibraryObject(entry.getDisplayName());
}
public static UnconnectedCache getUnconnectedCache(){
return new UnconnectedCache();
}
......
......@@ -2,6 +2,7 @@ package de.hft.stuttgart.citydoctor2.database;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException;
import java.util.List;
import java.util.stream.Stream;
......@@ -20,4 +21,6 @@ public interface CityObjectCache {
int getFeatureCount();
void resetCache();
List<CityObject> retrieveLibraryObject(String fileName) throws InvalidGmlFileException;
}
......@@ -6,6 +6,7 @@ import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
import javafx.scene.control.Alert;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.SerializationException;
import org.apache.commons.lang3.SerializationUtils;
import org.apache.logging.log4j.LogManager;
......@@ -47,7 +48,7 @@ public class DatabaseHandler {
}
public DatabaseHandler(String fileName){
this.fileName = "\"" + fileName + "\"";
this.fileName = FilenameUtils.removeExtension(fileName).replaceAll(" [^a-zA-Z0-9]","");
setupFeaturesTable();
}
......@@ -58,6 +59,10 @@ public class DatabaseHandler {
}
public String getFileName() {
return fileName;
}
public void setupFeaturesTable() {
......
......@@ -5,6 +5,7 @@ import com.github.benmanes.caffeine.cache.LoadingCache;
import com.github.benmanes.caffeine.cache.RemovalCause;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException;
import java.util.HashMap;
import java.util.List;
......@@ -70,5 +71,22 @@ public class FeatureCache implements CityObjectCache{
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;
import de.hft.stuttgart.citydoctor2.datastructure.CityObject;
import de.hft.stuttgart.citydoctor2.datastructure.GmlId;
import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException;
import java.util.HashMap;
import java.util.List;
......@@ -17,7 +18,6 @@ public class UnconnectedCache implements CityObjectCache{
UnconnectedCache() {
cache = new HashMap<>();
}
@Override
......@@ -46,6 +46,11 @@ public class UnconnectedCache implements CityObjectCache{
}
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;
import de.hft.stuttgart.citydoctor2.database.CacheManager;
import de.hft.stuttgart.citydoctor2.parser.CityGmlParseException;
import de.hft.stuttgart.citydoctor2.parser.CityGmlParser;
import de.hft.stuttgart.citydoctor2.parser.InvalidGmlFileException;
......@@ -87,7 +88,7 @@ public class LibraryObject extends Geometry {
Geometry geo = null;
try {
entry.loadEntry(config, true);
geo = getProtoGeometry(entry.getModel());
geo = getProtoGeometry(entry);
} catch (InvalidGmlFileException e) {
logger.error(e.getStackTrace());
} catch (CityGmlParseException e) {
......@@ -111,4 +112,17 @@ public class LibraryObject extends Geometry {
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 {
Path loPath = zipEntry.resolveLibraryObjectPath(libraryObjectPath);
CityGmlZipEntry libEntry = zipEntry.getArchive().getEntry(loPath.toString());
libObj = LibraryObject.of(libEntry, config);
}
if (libObj != null) {
igh = new ImplicitGeometryHolder(ig, libObj);
......
......@@ -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,
ProgressListener l, boolean nested)
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