package org.argeo.cms.jcr.acr;
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;
import javax.jcr.Property;
import javax.jcr.PropertyIterator;
import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
import javax.jcr.Value;
import javax.jcr.nodetype.NodeType;
import javax.xml.namespace.QName;
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 JcrContentProvider provider;
private ProvidedSession session;
protected JcrContent(ProvidedSession session, JcrContentProvider provider, Node node) {
this.session = session;
this.provider = provider;
this.jcrNode = node;
}
@Override
public QName getName() {
String name = Jcr.getName(jcrNode);
if (name.equals("")) {// root
name = Jcr.getWorkspaceName(jcrNode);
}
return NamespaceUtils.parsePrefixedName(provider, name);
}
@Override
public Optional get(QName key, Class clss) {
if (isDefaultAttrTypeRequested(clss)) {
return Optional.of((A) get(jcrNode, key.toString()));
}
return Optional.of((A) Jcr.get(jcrNode, key.toString()));
}
@Override
public Iterator iterator() {
try {
return new JcrContentIterator(jcrNode.getNodes());
} catch (RepositoryException e) {
throw new JcrException("Cannot list children of " + jcrNode, e);
}
}
@Override
protected Iterable keys() {
try {
Set keys = new HashSet<>();
properties: for (PropertyIterator propertyIterator = jcrNode.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 " + jcrNode, e);
}
// 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);
// }
// }
// };
}
public Node getJcrNode() {
return jcrNode;
}
/** Cast to a standard Java object. */
static Object get(Node node, String property) {
try {
Property p = node.getProperty(property);
if (p.isMultiple()) {
Value[] values = p.getValues();
List