Improve CMS file system
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 23 Oct 2023 04:59:01 +0000 (06:59 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 23 Oct 2023 04:59:01 +0000 (06:59 +0200)
org.argeo.cms/src/org/argeo/cms/file/provider/CmsFileStore.java
org.argeo.cms/src/org/argeo/cms/file/provider/CmsFileSystem.java
org.argeo.cms/src/org/argeo/cms/file/provider/CmsFileSystemProvider.java
org.argeo.cms/src/org/argeo/cms/file/provider/ContentAttributeView.java [deleted file]
org.argeo.cms/src/org/argeo/cms/file/provider/ContentAttributes.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/file/provider/ContentDirectoryStream.java
org.argeo.cms/src/org/argeo/cms/file/provider/ContentFileAttributeView.java [new file with mode: 0644]
swt/org.argeo.cms.swt/src/org/argeo/cms/swt/app/CmsUserApp.java

index 7abeec4e6cb74a04b72c4fe3230691ab6b6641ce..31fe9c73c3a6f05a505515957793afc7e4009a87 100644 (file)
@@ -52,14 +52,14 @@ public class CmsFileStore extends AbstractFsStore {
 
        @Override
        public boolean supportsFileAttributeView(Class<? extends FileAttributeView> type) {
-               if (ContentAttributeView.class.isAssignableFrom(type))
+               if (ContentFileAttributeView.class.isAssignableFrom(type))
                        return true;
                return false;
        }
 
        @Override
        public boolean supportsFileAttributeView(String name) {
-               if (ContentAttributeView.NAME.equals(name))
+               if (ContentFileAttributeView.NAME.equals(name))
                        return true;
                return false;
        }
index f581ea1c4bc97bfef25545ae60fc27f4425fe0ce..0b5d5defe39aa34fb8fd04f556cb19d23f1116b5 100644 (file)
@@ -87,7 +87,7 @@ public class CmsFileSystem extends AbstractFsSystem<CmsFileStore> {
 
        @Override
        public Set<String> supportedFileAttributeViews() {
-               return Collections.singleton(ContentAttributeView.NAME);
+               return Collections.singleton(ContentFileAttributeView.NAME);
        }
 
        @Override
index 5d93b7b580ac5b51223f74d83f64b99b1189a71f..602441e2fc3d3a3d8e8ecf64e749c3171e96582b 100644 (file)
@@ -39,15 +39,14 @@ public class CmsFileSystemProvider extends FileSystemProvider {
 
        private ProvidedRepository contentRepository;
 
-       
        public void start() {
-               
+
        }
-       
+
        public void stop() {
-               
+
        }
-       
+
        @Override
        public String getScheme() {
                return "cms";
@@ -171,17 +170,23 @@ public class CmsFileSystemProvider extends FileSystemProvider {
        public void checkAccess(Path path, AccessMode... modes) throws IOException {
        }
 
+       @SuppressWarnings("unchecked")
        @Override
        public <V extends FileAttributeView> V getFileAttributeView(Path path, Class<V> type, LinkOption... options) {
-               // TODO Auto-generated method stub
+               CmsPath cmsPath = (CmsPath) path;
+               if (BasicFileAttributes.class.isAssignableFrom(type))
+                       return (V) new ContentFileAttributeView(cmsPath.getContent());
+               else if (ContentFileAttributeView.class.isAssignableFrom(type))
+                       return (V) new ContentFileAttributeView(cmsPath.getContent());
                return null;
        }
 
+       @SuppressWarnings("unchecked")
        @Override
        public <A extends BasicFileAttributes> A readAttributes(Path path, Class<A> type, LinkOption... options)
                        throws IOException {
-               // TODO Auto-generated method stub
-               return null;
+               CmsPath cmsPath = (CmsPath) path;
+               return (A) new ContentAttributes(cmsPath.getContent());
        }
 
        @Override
diff --git a/org.argeo.cms/src/org/argeo/cms/file/provider/ContentAttributeView.java b/org.argeo.cms/src/org/argeo/cms/file/provider/ContentAttributeView.java
deleted file mode 100644 (file)
index 9bce042..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.argeo.cms.file.provider;
-
-import java.nio.file.attribute.FileAttributeView;
-
-import org.argeo.api.acr.Content;
-
-public class ContentAttributeView implements FileAttributeView {
-       final static String NAME = "content";
-
-       private final Content content;
-
-       public ContentAttributeView(Content content) {
-               this.content = content;
-       }
-
-       @Override
-       public String name() {
-               return NAME;
-       }
-
-       public Content getContent() {
-               return content;
-       }
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/file/provider/ContentAttributes.java b/org.argeo.cms/src/org/argeo/cms/file/provider/ContentAttributes.java
new file mode 100644 (file)
index 0000000..827bb2a
--- /dev/null
@@ -0,0 +1,80 @@
+package org.argeo.cms.file.provider;
+
+import java.nio.file.attribute.BasicFileAttributes;
+import java.nio.file.attribute.FileTime;
+import java.time.Instant;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.DName;
+
+public class ContentAttributes implements BasicFileAttributes {
+       // TODO optimise for FS-based content
+       private final Content content;
+
+       public ContentAttributes(Content content) {
+               assert content != null;
+               this.content = content;
+       }
+
+       @Override
+       public FileTime lastModifiedTime() {
+               Instant t = content.get(DName.getlastmodified, Instant.class).orElseThrow();
+               return FileTime.from(t);
+       }
+
+       @Override
+       public FileTime lastAccessTime() {
+               // TODO implement the concept in ACR ?
+               return FileTime.fromMillis(0l);
+       }
+
+       @Override
+       public FileTime creationTime() {
+               Instant t = content.get(DName.getlastmodified, Instant.class).orElseThrow();
+               return FileTime.from(t);
+       }
+
+       @Override
+       public boolean isRegularFile() {
+               return isRegularFile(content);
+       }
+
+       @Override
+       public boolean isDirectory() {
+               return isDirectory(content);
+       }
+
+       @Override
+       public boolean isSymbolicLink() {
+               // TODO supports links in ACR
+               return false;
+       }
+
+       @Override
+       public boolean isOther() {
+               return !isDirectory() && !isRegularFile() && !isSymbolicLink();
+       }
+
+       @Override
+       public long size() {
+               long size = content.get(DName.getcontentlength, Long.class).orElse(-1l);
+               return size;
+       }
+
+       @Override
+       public Object fileKey() {
+               // TODO check for UUIDs, etc.
+               return null;
+       }
+
+       static boolean isDirectory(Content c) {
+               return !isRegularFile(c);
+//             return c.isContentClass(DName.collection);
+       }
+
+       static boolean isRegularFile(Content c) {
+//             return c.containsKey(DName.getcontenttype.qName());
+               return !c.get(DName.getcontenttype, String.class).isEmpty();
+       }
+
+}
index 2cddf6275a67c4d338b7088ccc198e7ad1404248..55db44360f5ddb63ef75791b62f2c58be15270aa 100644 (file)
@@ -7,7 +7,6 @@ import java.nio.file.Path;
 import java.util.Iterator;
 
 import org.argeo.api.acr.Content;
-import org.argeo.api.acr.DName;
 
 public class ContentDirectoryStream implements DirectoryStream<Path> {
        private final CmsPath dir;
@@ -31,21 +30,13 @@ public class ContentDirectoryStream implements DirectoryStream<Path> {
                return iterator;
        }
 
-       static boolean isFile(Content c) {
-               return !c.get(DName.getcontenttype, String.class).isEmpty();
-       }
-
-       static boolean isDirectory(Content c) {
-               return c.isContentClass(DName.collection);
-       }
-
        class FilesAndCollectionsIterator implements Iterator<Path> {
                private Content next;
                private final Iterator<Content> it;
 
                public FilesAndCollectionsIterator() {
                        Content content = dir.getContent();
-                       if (!content.isContentClass(DName.collection))
+                       if (!ContentAttributes.isDirectory(content))
                                throw new IllegalStateException("Content " + content + " is not a collection");
                        it = content.iterator();
                        findNext();
@@ -53,9 +44,9 @@ public class ContentDirectoryStream implements DirectoryStream<Path> {
 
                private void findNext() {
                        next = null;
-                       while (it.hasNext() && next != null) {
+                       while (it.hasNext() && next == null) {
                                Content n = it.next();
-                               if (isFile(n) || isDirectory(n)) {
+                               if (ContentAttributes.isRegularFile(n) || ContentAttributes.isDirectory(n)) {
                                        if (filter != null) {
                                                try {
                                                        if (filter.accept(new CmsPath(dir.getFileSystem(), n)))
diff --git a/org.argeo.cms/src/org/argeo/cms/file/provider/ContentFileAttributeView.java b/org.argeo.cms/src/org/argeo/cms/file/provider/ContentFileAttributeView.java
new file mode 100644 (file)
index 0000000..adbe8d0
--- /dev/null
@@ -0,0 +1,83 @@
+package org.argeo.cms.file.provider;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.file.attribute.BasicFileAttributeView;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.nio.file.attribute.FileTime;
+import java.nio.file.attribute.UserDefinedFileAttributeView;
+import java.util.List;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.DName;
+
+public class ContentFileAttributeView implements BasicFileAttributeView, UserDefinedFileAttributeView {
+       final static String NAME = "content";
+
+       private final Content content;
+
+       public ContentFileAttributeView(Content content) {
+               this.content = content;
+       }
+
+       @Override
+       public String name() {
+               return NAME;
+       }
+
+       /*
+        * BasicFileAttributeView
+        */
+
+       @Override
+       public BasicFileAttributes readAttributes() throws IOException {
+               return new ContentAttributes(content);
+       }
+
+       @Override
+       public void setTimes(FileTime lastModifiedTime, FileTime lastAccessTime, FileTime createTime) throws IOException {
+               if (lastModifiedTime != null)
+                       content.put(DName.getlastmodified, lastModifiedTime.toInstant());
+               if (createTime != null)
+                       content.put(DName.getlastmodified, createTime.toInstant());
+               // ignore last accessed time
+       }
+
+       /*
+        * UserDefinedFileAttributeView
+        */
+
+       @Override
+       public List<String> list() throws IOException {
+//             List<String> res = new ArrayList<>();
+               return null;
+       }
+
+       @Override
+       public int size(String name) throws IOException {
+               // TODO Auto-generated method stub
+               return 0;
+       }
+
+       @Override
+       public int read(String name, ByteBuffer dst) throws IOException {
+               // TODO Auto-generated method stub
+               return 0;
+       }
+
+       @Override
+       public int write(String name, ByteBuffer src) throws IOException {
+               // TODO Auto-generated method stub
+               return 0;
+       }
+
+       @Override
+       public void delete(String name) throws IOException {
+               // TODO Auto-generated method stub
+
+       }
+
+       public Content getContent() {
+               return content;
+       }
+}
index d8d0f30430657a99c77e382c1f6a76d4f9e259f6..ca98f69beda3ee9f0e21addb445d9fc3a3990980 100644 (file)
@@ -48,7 +48,7 @@ public class CmsUserApp extends AbstractCmsApp {
 
                } else if ("app".equals(uiName)) {
                        Path rootPath = cmsFileSystemProvider.getPath(URI.create("cms:///"));
-                       SimpleFsBrowser view = new SimpleFsBrowser(parent, 0);
+                       SimpleFsBrowser view = new SimpleFsBrowser(cmsUi, 0);
                        view.setInput(rootPath);
                        view.setLayoutData(CmsSwtUtils.fillAll());