X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Facr%2Ffs%2FFsContent.java;h=5920c420370c78a4051f9000820af7d16c1c34da;hb=a4e2def61f587de89a03037aec2b95c54732ec55;hp=b8f98d2c84996e7fa4c6b1ad39e465037298b076;hpb=ea7d6818525ff88cc6b9ed0957c912545bd8eb81;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 b8f98d2c8..5920c4203 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 @@ -24,6 +24,7 @@ import java.util.Set; import java.util.StringJoiner; import java.util.concurrent.CompletableFuture; +import javax.xml.XMLConstants; import javax.xml.namespace.QName; import javax.xml.transform.Source; import javax.xml.transform.TransformerException; @@ -35,6 +36,7 @@ import org.argeo.api.acr.ContentName; import org.argeo.api.acr.ContentResourceException; import org.argeo.api.acr.CrAttributeType; import org.argeo.api.acr.CrName; +import org.argeo.api.acr.DName; import org.argeo.api.acr.NamespaceUtils; import org.argeo.api.acr.spi.ContentProvider; import org.argeo.api.acr.spi.ProvidedContent; @@ -42,7 +44,7 @@ import org.argeo.api.acr.spi.ProvidedSession; import org.argeo.api.cms.CmsLog; import org.argeo.cms.acr.AbstractContent; import org.argeo.cms.acr.ContentUtils; -import org.argeo.util.FsUtils; +import org.argeo.cms.util.FsUtils; /** Content persisted as a filesystem {@link Path}. */ public class FsContent extends AbstractContent implements ProvidedContent { @@ -54,14 +56,15 @@ public class FsContent extends AbstractContent implements ProvidedContent { private static final Map POSIX_KEYS; static { BASIC_KEYS = new HashMap<>(); - BASIC_KEYS.put(CrName.creationTime.qName(), "basic:creationTime"); - BASIC_KEYS.put(CrName.lastModifiedTime.qName(), "basic:lastModifiedTime"); - BASIC_KEYS.put(CrName.size.qName(), "basic:size"); + BASIC_KEYS.put(DName.creationdate.qName(), "basic:creationTime"); + BASIC_KEYS.put(DName.getlastmodified.qName(), "basic:lastModifiedTime"); + BASIC_KEYS.put(DName.getcontentlength.qName(), "basic:size"); + BASIC_KEYS.put(CrName.fileKey.qName(), "basic:fileKey"); POSIX_KEYS = new HashMap<>(BASIC_KEYS); - POSIX_KEYS.put(CrName.owner.qName(), "owner:owner"); - POSIX_KEYS.put(CrName.group.qName(), "posix:group"); + POSIX_KEYS.put(DName.owner.qName(), "owner:owner"); + POSIX_KEYS.put(DName.group.qName(), "posix:group"); POSIX_KEYS.put(CrName.permissions.qName(), "posix:permissions"); } @@ -87,7 +90,7 @@ public class FsContent extends AbstractContent implements ProvidedContent { } else { // TODO should we support prefixed name for known types? - QName providerName = NamespaceUtils.parsePrefixedName(provider, path.getFileName().toString()); + QName providerName = provider.fromFsPrefixedName(path.getFileName().toString()); // QName providerName = new QName(path.getFileName().toString()); // TODO remove extension if mounted? this.name = new ContentName(providerName, session); @@ -123,7 +126,7 @@ public class FsContent extends AbstractContent implements ProvidedContent { } else { UserDefinedFileAttributeView udfav = Files.getFileAttributeView(path, UserDefinedFileAttributeView.class); - String prefixedName = NamespaceUtils.toPrefixedName(provider, key); + String prefixedName = provider.toFsPrefixedName(key); if (!udfav.list().contains(prefixedName)) return Optional.empty(); ByteBuffer buf = ByteBuffer.allocate(udfav.size(prefixedName)); @@ -195,7 +198,9 @@ public class FsContent extends AbstractContent implements ProvidedContent { if (udfav != null) { try { for (String name : udfav.list()) { - QName providerName = NamespaceUtils.parsePrefixedName(provider, name); + QName providerName = provider.fromFsPrefixedName(name); + if (providerName.getNamespaceURI().equals(XMLConstants.XMLNS_ATTRIBUTE_NS_URI)) + continue; // skip prefix mapping QName sessionName = new ContentName(providerName, getSession()); result.add(sessionName); } @@ -210,7 +215,7 @@ public class FsContent extends AbstractContent implements ProvidedContent { protected void removeAttr(QName key) { UserDefinedFileAttributeView udfav = Files.getFileAttributeView(path, UserDefinedFileAttributeView.class); try { - udfav.delete(NamespaceUtils.toPrefixedName(provider, key)); + udfav.delete(provider.toFsPrefixedName(key)); } catch (IOException e) { throw new ContentResourceException("Cannot delete attribute " + key + " for " + path, e); } @@ -234,7 +239,7 @@ public class FsContent extends AbstractContent implements ProvidedContent { UserDefinedFileAttributeView udfav = Files.getFileAttributeView(path, UserDefinedFileAttributeView.class); ByteBuffer bb = ByteBuffer.wrap(toWrite.getBytes(StandardCharsets.UTF_8)); try { - udfav.write(NamespaceUtils.toPrefixedName(provider, key), bb); + udfav.write(provider.toFsPrefixedName(key), bb); } catch (IOException e) { throw new ContentResourceException("Cannot delete attribute " + key + " for " + path, e); } @@ -245,7 +250,7 @@ public class FsContent extends AbstractContent implements ProvidedContent { if (POSIX_KEYS.containsKey(key)) return POSIX_KEYS.get(key); else - return USER_ + NamespaceUtils.toPrefixedName(provider, key); + return USER_ + provider.toFsPrefixedName(key); } /* @@ -280,8 +285,8 @@ public class FsContent extends AbstractContent implements ProvidedContent { public Content add(QName name, QName... classes) { FsContent fsContent; try { - Path newPath = path.resolve(NamespaceUtils.toPrefixedName(provider, name)); - if (ContentName.contains(classes, CrName.collection.qName())) + Path newPath = path.resolve(provider.toFsPrefixedName(name)); + if (ContentName.contains(classes, DName.collection.qName())) Files.createDirectory(newPath); else Files.createFile(newPath); @@ -357,13 +362,13 @@ public class FsContent extends AbstractContent implements ProvidedContent { @Override public List getContentClasses() { List res = new ArrayList<>(); - List value = getMultiple(CrName.cc.qName(), String.class); + List value = getMultiple(DName.resourcetype.qName(), String.class); for (String s : value) { QName name = NamespaceUtils.parsePrefixedName(provider, s); res.add(name); } if (Files.isDirectory(path)) - res.add(CrName.collection.qName()); + res.add(DName.collection.qName()); return res; } @@ -371,14 +376,14 @@ public class FsContent extends AbstractContent implements ProvidedContent { public void addContentClasses(QName... contentClass) { List toWrite = new ArrayList<>(); for (QName cc : getContentClasses()) { - if (cc.equals(CrName.collection.qName())) + if (cc.equals(DName.collection.qName())) continue; // skip toWrite.add(NamespaceUtils.toPrefixedName(provider, cc)); } for (QName cc : contentClass) { toWrite.add(NamespaceUtils.toPrefixedName(provider, cc)); } - put(CrName.cc.qName(), toWrite); + put(DName.resourcetype.qName(), toWrite); } /* @@ -395,7 +400,7 @@ public class FsContent extends AbstractContent implements ProvidedContent { */ @SuppressWarnings("unchecked") public CompletableFuture write(Class clss) { - if (isContentClass(CrName.collection.qName())) { + if (isContentClass(DName.collection.qName())) { throw new IllegalStateException("Cannot directly write to a collection"); } if (InputStream.class.isAssignableFrom(clss)) {