X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=jcr%2Forg.argeo.cms.jcr%2Fsrc%2Forg%2Fargeo%2Fcms%2Fjcr%2Facr%2FJcrContent.java;h=6d274c60c039a0a00b8939035cef5d257b02fae2;hb=0e2b79a501ec1f8932840ed401dd8ce93602a9fd;hp=04c5d2d8c3b2f0d32960c52d05e64bc572e70b77;hpb=8282011b0e20e80704b209ad55fa9fb132e16280;p=lgpl%2Fargeo-commons.git
diff --git a/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContent.java b/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContent.java
index 04c5d2d8c..6d274c60c 100644
--- a/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContent.java
+++ b/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContent.java
@@ -1,8 +1,14 @@
package org.argeo.cms.jcr.acr;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.util.ArrayList;
import java.util.Calendar;
+import java.util.HashSet;
import java.util.Iterator;
+import java.util.List;
import java.util.Optional;
+import java.util.Set;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
@@ -13,93 +19,125 @@ import javax.jcr.RepositoryException;
import javax.jcr.Value;
import javax.jcr.nodetype.NodeType;
import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
import org.argeo.api.acr.Content;
+import org.argeo.api.acr.NamespaceUtils;
import org.argeo.api.acr.spi.AbstractContent;
import org.argeo.api.acr.spi.ProvidedSession;
import org.argeo.jcr.Jcr;
import org.argeo.jcr.JcrException;
+/** A JCR {@link Node} accessed as {@link Content}. */
public class JcrContent extends AbstractContent {
- private Node jcrNode;
+// private Node jcrNode;
private JcrContentProvider provider;
private ProvidedSession session;
- protected JcrContent(ProvidedSession session, JcrContentProvider provider, Node node) {
+ private String jcrWorkspace;
+ private String jcrPath;
+
+ protected JcrContent(ProvidedSession session, JcrContentProvider provider, String jcrWorkspace, String jcrPath) {
this.session = session;
this.provider = provider;
- this.jcrNode = node;
+ this.jcrWorkspace = jcrWorkspace;
+ this.jcrPath = jcrPath;
}
@Override
public QName getName() {
- return session.parsePrefixedName(Jcr.getName(jcrNode));
+ String name = Jcr.getName(getJcrNode());
+ if (name.equals("")) {// root
+ name = Jcr.getWorkspaceName(getJcrNode());
+ }
+ return NamespaceUtils.parsePrefixedName(provider, name);
}
+ @SuppressWarnings("unchecked")
@Override
public Optional get(QName key, Class clss) {
if (isDefaultAttrTypeRequested(clss)) {
- return Optional.of((A) get(jcrNode, key.toString()));
+ return Optional.of((A) get(getJcrNode(), key.toString()));
}
- return Optional.of((A) Jcr.get(jcrNode, key.toString()));
+ return Optional.of((A) Jcr.get(getJcrNode(), key.toString()));
}
@Override
public Iterator iterator() {
try {
- return new JcrContentIterator(jcrNode.getNodes());
+ return new JcrContentIterator(getJcrNode().getNodes());
} catch (RepositoryException e) {
- throw new JcrException("Cannot list children of " + jcrNode, e);
+ throw new JcrException("Cannot list children of " + getJcrNode(), e);
}
}
@Override
protected Iterable keys() {
- return new Iterable() {
-
- @Override
- public Iterator iterator() {
- try {
- PropertyIterator propertyIterator = jcrNode.getProperties();
- return new JcrKeyIterator(provider, propertyIterator);
- } catch (RepositoryException e) {
- throw new JcrException("Cannot retrive properties from " + jcrNode, e);
- }
+ try {
+ Set keys = new HashSet<>();
+ for (PropertyIterator propertyIterator = getJcrNode().getProperties(); propertyIterator.hasNext();) {
+ Property property = propertyIterator.nextProperty();
+ // TODO convert standard names
+ // TODO skip technical properties
+ QName name = NamespaceUtils.parsePrefixedName(provider, property.getName());
+ keys.add(name);
}
- };
+ return keys;
+ } catch (RepositoryException e) {
+ throw new JcrException("Cannot list properties of " + getJcrNode(), e);
+ }
}
public Node getJcrNode() {
- return jcrNode;
+ try {
+ // TODO caching?
+ return provider.getJcrSession(session, jcrWorkspace).getNode(jcrPath);
+ } catch (RepositoryException e) {
+ throw new JcrException("Cannot retrieve " + jcrPath + " from workspace " + jcrWorkspace, e);
+ }
}
/** Cast to a standard Java object. */
static Object get(Node node, String property) {
try {
- Value value = node.getProperty(property).getValue();
- switch (value.getType()) {
- case PropertyType.STRING:
- return value.getString();
- case PropertyType.DOUBLE:
- return (Double) value.getDouble();
- case PropertyType.LONG:
- return (Long) value.getLong();
- case PropertyType.BOOLEAN:
- return (Boolean) value.getBoolean();
- case PropertyType.DATE:
- Calendar calendar = value.getDate();
- return calendar.toInstant();
- case PropertyType.BINARY:
- throw new IllegalArgumentException("Binary is not supported as an attribute");
- default:
- return value.getString();
+ Property p = node.getProperty(property);
+ if (p.isMultiple()) {
+ Value[] values = p.getValues();
+ List