From c5d5dbfff752c5e7ec93d5f046306e3da82e06b0 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sun, 24 Sep 2023 11:34:29 +0200 Subject: [PATCH] Support for standard ACR properties --- .../argeo/cms/jcr/acr/BasicSearchToQom.java | 26 +++++++-- .../src/org/argeo/cms/jcr/acr/JcrContent.java | 53 ++++++++++++++++--- .../src/org/argeo/cms/jcr/acr/JcrName.java | 18 +++++++ 3 files changed, 88 insertions(+), 9 deletions(-) create mode 100644 org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrName.java diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/BasicSearchToQom.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/BasicSearchToQom.java index 7294070..5ed36b8 100644 --- a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/BasicSearchToQom.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/BasicSearchToQom.java @@ -1,8 +1,11 @@ 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; @@ -15,12 +18,14 @@ import javax.jcr.query.qom.StaticOperand; 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; @@ -114,14 +119,29 @@ class BasicSearchToQom { } } 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"); } diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContent.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContent.java index a46dd85..149ef3a 100644 --- a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContent.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContent.java @@ -36,6 +36,7 @@ import javax.xml.transform.stream.StreamSource; 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; @@ -92,7 +93,38 @@ public class JcrContent extends AbstractContent { @SuppressWarnings("unchecked") @Override public Optional get(QName key, Class 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) 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) 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? @@ -111,12 +143,23 @@ public class JcrContent extends AbstractContent { @Override protected Iterable keys() { try { + Node node = getJcrNode(); Set 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; @@ -202,12 +245,10 @@ public class JcrContent extends AbstractContent { public int getSiblingIndex() { return Jcr.getIndex(getJcrNode()); } - - @Override public String getText() { - return JcrxApi.getXmlValue(getJcrNode()); + return JcrxApi.getXmlValue(getJcrNode()); } /* diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrName.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrName.java new file mode 100644 index 0000000..de0d1b1 --- /dev/null +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrName.java @@ -0,0 +1,18 @@ +package org.argeo.cms.jcr.acr; + +import org.argeo.api.acr.QNamed; + +public enum JcrName implements QNamed { + created, lastModified, isCheckedOut; + + @Override + public String getNamespace() { + return JcrContentNamespace.JCR.getNamespaceURI(); + } + + @Override + public String getDefaultPrefix() { + return JcrContentNamespace.JCR.getDefaultPrefix(); + } + +} -- 2.30.2