X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Facr%2Ffs%2FFsContent.java;h=43cae85721bf6b96c3f577f157f64b56845c11b2;hb=54df376a9c2dd458a82eaa09bfbb718fe699dd0d;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..43cae8572 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"); } @@ -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); } @@ -176,6 +199,8 @@ public class FsContent extends AbstractContent implements ProvidedContent { try { for (String name : udfav.list()) { QName providerName = NamespaceUtils.parsePrefixedName(provider, name); + if (providerName.getNamespaceURI().equals(XMLConstants.XMLNS_ATTRIBUTE_NS_URI)) + continue; // skip prefix mapping QName sessionName = new ContentName(providerName, getSession()); result.add(sessionName); } @@ -261,7 +286,7 @@ public class FsContent extends AbstractContent implements ProvidedContent { FsContent fsContent; try { Path newPath = path.resolve(NamespaceUtils.toPrefixedName(provider, name)); - if (ContentName.contains(classes, CrName.collection.qName())) + 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)) {