X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Facr%2Ffs%2FFsContent.java;h=d0df8845f308a4fa5befbef1c60ef5ca953e2265;hb=4c7e1885b8bf3c93fa0919ace122e3f289a925ea;hp=078cb50a8d38f28280385b7bf9e90f48c2c5aada;hpb=eb4cc3db3bf141c229f0f7ff929daff108bee6d2;p=lgpl%2Fargeo-commons.git
diff --git a/org.argeo.cms/src/org/argeo/cms/acr/fs/FsContent.java b/org.argeo.cms/src/org/argeo/cms/acr/fs/FsContent.java
index 078cb50a8..d0df8845f 100644
--- a/org.argeo.cms/src/org/argeo/cms/acr/fs/FsContent.java
+++ b/org.argeo.cms/src/org/argeo/cms/acr/fs/FsContent.java
@@ -11,10 +11,12 @@ import java.nio.file.Path;
import java.nio.file.attribute.FileTime;
import java.nio.file.attribute.UserDefinedFileAttributeView;
import java.time.Instant;
+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.Optional;
import java.util.Set;
@@ -33,6 +35,7 @@ import org.argeo.cms.acr.AbstractContent;
import org.argeo.cms.acr.ContentUtils;
import org.argeo.util.FsUtils;
+/** Content persisted as a filesystem {@link Path}. */
public class FsContent extends AbstractContent implements ProvidedContent {
final static String USER_ = "user:";
@@ -51,17 +54,16 @@ public class FsContent extends AbstractContent implements ProvidedContent {
POSIX_KEYS.put(CrName.PERMISSIONS.get(), "posix:permissions");
}
- private final ProvidedSession session;
private final FsContentProvider provider;
private final Path path;
private final boolean isRoot;
private final QName name;
protected FsContent(ProvidedSession session, FsContentProvider contentProvider, Path path) {
- this.session = session;
+ super(session);
this.provider = contentProvider;
this.path = path;
- this.isRoot = contentProvider.isRoot(path);
+ this.isRoot = contentProvider.isMountRoot(path);
// TODO check file names with ':' ?
if (isRoot) {
String mountPath = provider.getMountPath();
@@ -72,7 +74,12 @@ public class FsContent extends AbstractContent implements ProvidedContent {
this.name = CrName.ROOT.get();
}
} else {
- QName providerName = NamespaceUtils.parsePrefixedName(provider, path.getFileName().toString());
+
+ // TODO should we support prefixed name for known types?
+ // QName providerName = NamespaceUtils.parsePrefixedName(provider,
+ // path.getFileName().toString());
+ QName providerName = new QName(path.getFileName().toString());
+ // TODO remove extension if mounted?
this.name = new ContentName(providerName, session);
}
}
@@ -94,6 +101,7 @@ public class FsContent extends AbstractContent implements ProvidedContent {
* ATTRIBUTES
*/
+ @SuppressWarnings("unchecked")
@Override
public Optional get(QName key, Class clss) {
Object value;
@@ -152,7 +160,7 @@ public class FsContent extends AbstractContent implements ProvidedContent {
try {
for (String name : udfav.list()) {
QName providerName = NamespaceUtils.parsePrefixedName(provider, name);
- QName sessionName = new ContentName(providerName, session);
+ QName sessionName = new ContentName(providerName, getSession());
result.add(sessionName);
}
} catch (IOException e) {
@@ -178,7 +186,7 @@ public class FsContent extends AbstractContent implements ProvidedContent {
UserDefinedFileAttributeView udfav = Files.getFileAttributeView(path, UserDefinedFileAttributeView.class);
ByteBuffer bb = ByteBuffer.wrap(value.toString().getBytes(StandardCharsets.UTF_8));
try {
- int size = udfav.write(NamespaceUtils.toPrefixedName(provider, key), bb);
+ udfav.write(NamespaceUtils.toPrefixedName(provider, key), bb);
} catch (IOException e) {
throw new ContentResourceException("Cannot delete attribute " + key + " for " + path, e);
}
@@ -204,9 +212,9 @@ public class FsContent extends AbstractContent implements ProvidedContent {
Optional isMount = fsContent.get(CrName.MOUNT.get(), String.class);
if (isMount.orElse("false").equals("true")) {
QName[] classes = null;
- ContentProvider contentProvider = session.getRepository().getMountContentProvider(fsContent,
- false, classes);
- Content mountedContent = contentProvider.get(session, fsContent.getPath(), "");
+ ContentProvider contentProvider = getSession().getRepository()
+ .getMountContentProvider(fsContent, false, classes);
+ Content mountedContent = contentProvider.get(getSession(), "");
return mountedContent;
} else {
return (Content) fsContent;
@@ -238,9 +246,10 @@ public class FsContent extends AbstractContent implements ProvidedContent {
throw new ContentResourceException("Cannot create new content", e);
}
- if (session.getRepository().shouldMount(classes)) {
- ContentProvider contentProvider = session.getRepository().getMountContentProvider(fsContent, true, classes);
- Content mountedContent = contentProvider.get(session, fsContent.getPath(), "");
+ if (getSession().getRepository().shouldMount(classes)) {
+ ContentProvider contentProvider = getSession().getRepository().getMountContentProvider(fsContent, true,
+ classes);
+ Content mountedContent = contentProvider.get(getSession(), "");
fsContent.put(CrName.MOUNT.get(), "true");
return mountedContent;
@@ -261,11 +270,12 @@ public class FsContent extends AbstractContent implements ProvidedContent {
if (mountPath == null || mountPath.equals("/"))
return null;
String[] parent = ContentUtils.getParentPath(mountPath);
- return session.get(parent[0]);
+ return getSession().get(parent[0]);
}
return new FsContent(this, path.getParent());
}
+ @SuppressWarnings("unchecked")
@Override
public C open(Class clss) throws IOException, IllegalArgumentException {
if (InputStream.class.isAssignableFrom(clss)) {
@@ -291,13 +301,22 @@ public class FsContent extends AbstractContent implements ProvidedContent {
}
/*
- * ACCESSORS
+ * TYPING
*/
+
@Override
- public ProvidedSession getSession() {
- return session;
+ public List getTypes() {
+ List res = new ArrayList<>();
+ if (Files.isDirectory(path))
+ res.add(CrName.COLLECTION.get());
+ // TODO add other types
+ return res;
}
+ /*
+ * ACCESSORS
+ */
+
@Override
public FsContentProvider getProvider() {
return provider;