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=d61827d500eb03e9cebc1755d6266072ebc6ed18;hpb=975fb5e581d0650768afc68a0e839657f318e77a;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 d61827d50..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; @@ -33,31 +34,37 @@ import javax.xml.transform.stream.StreamResult; import org.argeo.api.acr.Content; 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; 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 { + private CmsLog log = CmsLog.getLog(FsContent.class); + final static String USER_ = "user:"; private static final Map BASIC_KEYS; 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"); } @@ -83,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); @@ -119,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)); @@ -146,25 +153,41 @@ public class FsContent extends AbstractContent implements ProvidedContent { } // TODO perform trivial file conversion to other formats } + + // TODO better deal with multiple types if (value instanceof byte[]) { String str = new String((byte[]) value, StandardCharsets.UTF_8); String[] arr = str.split("\n"); + if (arr.length == 1) { - res = (A) arr[0]; + if (clss.isAssignableFrom(String.class)) { + res = (A) arr[0]; + } else { + res = (A) CrAttributeType.parse(arr[0]); + } } else { - List lst = new ArrayList<>(); + List lst = new ArrayList<>(); for (String s : arr) { - lst.add(s); + lst.add(CrAttributeType.parse(s)); } res = (A) lst; } } - if (res == null) - try { - res = (A) value; - } catch (ClassCastException e) { - return Optional.empty(); - } + if (res == null) { + if (isDefaultAttrTypeRequested(clss)) + return Optional.of((A) CrAttributeType.parse(value.toString())); + if (clss.isAssignableFrom(value.getClass())) + return Optional.of((A) value); + if (clss.isAssignableFrom(String.class)) + return Optional.of((A) value.toString()); + log.warn("Cannot interpret " + key + " in " + this); + return Optional.empty(); +// try { +// res = (A) value; +// } catch (ClassCastException e) { +// return Optional.empty(); +// } + } return Optional.of(res); } @@ -175,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); } @@ -190,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); } @@ -214,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); } @@ -225,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); } /* @@ -260,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); @@ -337,15 +362,13 @@ public class FsContent extends AbstractContent implements ProvidedContent { @Override public List getContentClasses() { List res = new ArrayList<>(); - Optional> value = getMultiple(CrName.cc.qName(), String.class); - if (!value.isEmpty()) { - for (String s : value.get()) { - QName name = NamespaceUtils.parsePrefixedName(provider, s); - res.add(name); - } + 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; } @@ -353,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); } /* @@ -377,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)) {