package org.argeo.cms.jcr.acr;
+import static javax.jcr.query.qom.QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO;
+
import java.util.ArrayList;
import java.util.List;
+import javax.jcr.Property;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.query.QueryManager;
import javax.xml.namespace.QName;
import org.apache.jackrabbit.commons.query.sql2.QOMFormatter;
+import org.argeo.api.acr.DName;
import org.argeo.api.acr.NamespaceUtils;
import org.argeo.api.acr.search.BasicSearch;
import org.argeo.api.acr.search.Constraint;
import org.argeo.api.acr.search.ContentFilter;
import org.argeo.api.acr.search.ContentFilter.Eq;
import org.argeo.api.acr.search.ContentFilter.IsContentClass;
+import org.argeo.api.acr.search.ContentFilter.IsDefined;
import org.argeo.api.acr.search.ContentFilter.Not;
import org.argeo.api.cms.CmsLog;
}
} else if (constraint instanceof Eq comp) {
- DynamicOperand dynamicOperand = factory.propertyValue(selectorName,
- NamespaceUtils.toPrefixedName(comp.getProp()));
+ QName prop = comp.getProp();
+ if (DName.creationdate.equals(prop))
+ prop = JcrName.created.qName();
+ else if (DName.getlastmodified.equals(prop))
+ prop = JcrName.lastModified.qName();
+
+ DynamicOperand dynamicOperand = factory.propertyValue(selectorName, NamespaceUtils.toPrefixedName(prop));
// TODO better convert attribute value
StaticOperand staticOperand = factory
.literal(session.getValueFactory().createValue(comp.getValue().toString()));
- return factory.comparison(dynamicOperand, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, staticOperand);
+ return factory.comparison(dynamicOperand, JCR_OPERATOR_EQUAL_TO, staticOperand);
} else if (constraint instanceof Not not) {
return factory.not(toQomConstraint(not.getNegated()));
+ } else if (constraint instanceof IsDefined comp) {
+ QName prop = comp.getProp();
+ if (DName.checkedIn.equals(prop) || DName.checkedOut.equals(prop)) {
+ DynamicOperand dynamicOperand = factory.propertyValue(selectorName, Property.JCR_IS_CHECKED_OUT);
+ StaticOperand staticOperand = factory
+ .literal(session.getValueFactory().createValue(DName.checkedOut.equals(prop)));
+ return factory.comparison(dynamicOperand, JCR_OPERATOR_EQUAL_TO, staticOperand);
+ } else {
+ return factory.propertyExistence(selectorName, NamespaceUtils.toPrefixedName(prop));
+ }
} else {
throw new IllegalArgumentException("Constraint " + constraint.getClass() + " is not supported");
}
import org.argeo.api.acr.Content;
import org.argeo.api.acr.CrAttributeType;
+import org.argeo.api.acr.DName;
import org.argeo.api.acr.NamespaceUtils;
import org.argeo.api.acr.spi.ProvidedSession;
import org.argeo.api.cms.CmsConstants;
@SuppressWarnings("unchecked")
@Override
public <A> Optional<A> get(QName key, Class<A> clss) {
- Object value = get(getJcrNode(), key.toString());
+ Node node = getJcrNode();
+ if (DName.creationdate.equals(key))
+ key = JcrName.created.qName();
+ else if (DName.getlastmodified.equals(key))
+ key = JcrName.lastModified.qName();
+ else if (DName.checkedOut.equals(key)) {
+ try {
+ if (!node.hasProperty(Property.JCR_IS_CHECKED_OUT))
+ return Optional.empty();
+ boolean isCheckedOut = node.getProperty(Property.JCR_IS_CHECKED_OUT).getBoolean();
+ if (!isCheckedOut)
+ return Optional.empty();
+ // FIXME return URI
+ return (Optional<A>) Optional.of(new Object());
+ } catch (RepositoryException e) {
+ throw new JcrException(e);
+ }
+ } else if (DName.checkedIn.equals(key)) {
+ try {
+ if (!node.hasProperty(Property.JCR_IS_CHECKED_OUT))
+ return Optional.empty();
+ boolean isCheckedOut = node.getProperty(Property.JCR_IS_CHECKED_OUT).getBoolean();
+ if (isCheckedOut)
+ return Optional.empty();
+ // FIXME return URI
+ return (Optional<A>) Optional.of(new Object());
+ } catch (RepositoryException e) {
+ throw new JcrException(e);
+ }
+ }
+
+ Object value = get(node, key.toString());
if (value instanceof List<?> lst)
return Optional.of((A) lst);
// TODO check other collections?
@Override
protected Iterable<QName> keys() {
try {
+ Node node = getJcrNode();
Set<QName> keys = new HashSet<>();
- for (PropertyIterator propertyIterator = getJcrNode().getProperties(); propertyIterator.hasNext();) {
+ for (PropertyIterator propertyIterator = node.getProperties(); propertyIterator.hasNext();) {
Property property = propertyIterator.nextProperty();
+ QName name = NamespaceUtils.parsePrefixedName(provider, property.getName());
+
// TODO convert standard names
+ if (property.getName().equals(Property.JCR_CREATED))
+ name = DName.creationdate.qName();
+ if (property.getName().equals(Property.JCR_LAST_MODIFIED))
+ name = DName.getlastmodified.qName();
+ if (property.getName().equals(Property.JCR_IS_CHECKED_OUT)) {
+ boolean isCheckedOut = node.getProperty(Property.JCR_IS_CHECKED_OUT).getBoolean();
+ name = isCheckedOut ? DName.checkedOut.qName() : DName.checkedIn.qName();
+ }
+
// TODO skip technical properties
- QName name = NamespaceUtils.parsePrefixedName(provider, property.getName());
keys.add(name);
}
return keys;
public int getSiblingIndex() {
return Jcr.getIndex(getJcrNode());
}
-
-
@Override
public String getText() {
- return JcrxApi.getXmlValue(getJcrNode());
+ return JcrxApi.getXmlValue(getJcrNode());
}
/*