diff --git a/src/main/java/caosdb/server/resource/FileSystemResource.java b/src/main/java/caosdb/server/resource/FileSystemResource.java index 290a88801b4f14401981f9d91a6ba00cf27c12a4..65e83ee08bc9aeac988022650cd903e34453381b 100644 --- a/src/main/java/caosdb/server/resource/FileSystemResource.java +++ b/src/main/java/caosdb/server/resource/FileSystemResource.java @@ -29,6 +29,7 @@ import caosdb.server.database.backend.implementation.MySQL.ConnectionException; import caosdb.server.database.misc.TransactionBenchmark; import caosdb.server.entity.Entity; import caosdb.server.entity.FileProperties; +import caosdb.server.entity.Message; import caosdb.server.entity.RetrieveEntity; import caosdb.server.entity.container.TransactionContainer; import caosdb.server.permissions.EntityPermission; @@ -149,17 +150,32 @@ public class FileSystemResource extends AbstractCaosDBServerResource { return null; } + /** + * Return an element for the given file on a file system. + * + * <p>If there is no File entity for this file, an element without `id` is returned, instead a + * corresponding message is added to the element. + */ Element getFileElement(final String directory, final File file) throws Exception { final Element celem = new Element("file"); - celem.setAttribute( - "id", - getEntityID((directory.endsWith("/") ? directory : directory + "/") + file.getName())); + + final String entId = + getEntityID((directory.endsWith("/") ? directory : directory + "/") + file.getName()); + if (entId == null) { + new Message("Orphaned file").addToElement(celem); + } else { + celem.setAttribute("id", entId); + } celem.setAttribute("name", file.getName()); return celem; } protected String getEntityID(final String path) throws Exception { - return getEntity(path).getId().toString(); + final Entity fileEnt = getEntity(path); + if (fileEnt == null) { + return null; + } + return fileEnt.getId().toString(); } private Entity getEntity(final String path) throws Exception { @@ -170,7 +186,12 @@ public class FileSystemResource extends AbstractCaosDBServerResource { e.setFileProperties(fp); c.add(e); final Transaction<?> t = new RetrieveSparseEntityByPath(c); - t.execute(); + try { + t.execute(); + } catch (NullPointerException npe) { + // For example files in file system without corresponding File records. + return null; + } final long t2 = System.currentTimeMillis(); getBenchmark().addMeasurement(this.getClass().getSimpleName() + ".getEntity", t2 - t1); return e;