From 7b90373ca37766e80fa5b127e6a2dcd90a9dc94f Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sun, 24 Sep 2023 11:34:12 +0200 Subject: [PATCH] Improve ACR --- .../src/org/argeo/api/acr/DName.java | 25 +++++++++++++- .../src/org/argeo/api/acr/QNamed.java | 33 +++++++++++++++++-- .../argeo/api/acr/search/ContentFilter.java | 23 ++++++++++++- 3 files changed, 77 insertions(+), 4 deletions(-) diff --git a/org.argeo.api.acr/src/org/argeo/api/acr/DName.java b/org.argeo.api.acr/src/org/argeo/api/acr/DName.java index be065a8d9..d39f35d86 100644 --- a/org.argeo.api.acr/src/org/argeo/api/acr/DName.java +++ b/org.argeo.api.acr/src/org/argeo/api/acr/DName.java @@ -23,15 +23,38 @@ public enum DName implements QNamed // RFC4918 (WebDav) value used as CR class collection, // - // RFC3744 (ACL) properties uase as CR attr + // RFC3744 (ACL) properties used as CR attr owner, // group, // + + // RFC3253 (versioning) properties used as CR attr + checkedOut("checked-out"), // + checkedIn("checked-in"), // // ; public final static String WEBDAV_NAMESPACE_URI = "DAV:"; public final static String WEBDAV_DEFAULT_PREFIX = "D"; + private final String localName; + + private DName(String localName) { + assert localName != null; + this.localName = localName; + } + + private DName() { + this.localName = null; + } + + @Override + public String localName() { + if (localName != null) + return localName; + else + return name(); + } + @Override public String getNamespace() { return WEBDAV_NAMESPACE_URI; diff --git a/org.argeo.api.acr/src/org/argeo/api/acr/QNamed.java b/org.argeo.api.acr/src/org/argeo/api/acr/QNamed.java index 73ae4f02e..9852a602a 100644 --- a/org.argeo.api.acr/src/org/argeo/api/acr/QNamed.java +++ b/org.argeo.api.acr/src/org/argeo/api/acr/QNamed.java @@ -15,23 +15,52 @@ public interface QNamed extends Supplier { return name(); } + /** + * A {@link QName} corresponding to this definition. Calls + * {@link #createQName()} by default, but it could return a cached value. + */ default QName qName() { - return new ContentName(getNamespace(), localName(), getDefaultPrefix()); + return createQName(); } + /** + * A prefixed representation of this qualified name within the provided + * {@link NamespaceContext}. + */ default String get(NamespaceContext namespaceContext) { return namespaceContext.getPrefix(getNamespace()) + ":" + localName(); } - /** This qualified named with its default prefix. If it is unqualified this method should be overridden, or QNamed.Unqualified be used. */ + /** + * Create a {@link QName} corresponding on this definition. Can typically be + * used to cache the {@link QName} in enums. + */ + default QName createQName() { + return new ContentName(getNamespace(), localName(), getDefaultPrefix()); + } + + /** + * This qualified named with its default prefix. If it is unqualified this + * method should be overridden, or QNamed.Unqualified be used. + */ default String get() { return getDefaultPrefix() + ":" + localName(); } + /** The namespace URI of this qualified name. */ String getNamespace(); + /** + * The default prefix of this qualified name, as expected to be found in + * {@link RuntimeNamespaceContext}. + */ String getDefaultPrefix(); + /** Compares to a plain {@link QName}. */ + default boolean equals(QName qName) { + return qName().equals(qName); + } + /** To be used by enums without namespace (typically XML attributes). */ static interface Unqualified extends QNamed { @Override diff --git a/org.argeo.api.acr/src/org/argeo/api/acr/search/ContentFilter.java b/org.argeo.api.acr/src/org/argeo/api/acr/search/ContentFilter.java index 45f2d848c..55ed21531 100644 --- a/org.argeo.api.acr/src/org/argeo/api/acr/search/ContentFilter.java +++ b/org.argeo.api.acr/src/org/argeo/api/acr/search/ContentFilter.java @@ -74,10 +74,18 @@ public abstract class ContentFilter implements } public COMPOSITION eq(QNamed attr, Object value) { - addConstraint(new Eq(attr.qName(), value)); + return eq(attr.qName(), value); + } + + public COMPOSITION isDefined(QName attr) { + addConstraint(new IsDefined(attr)); return composition; } + public COMPOSITION isDefined(QNamed attr) { + return isDefined(attr.qName()); + } + /* * UTILITIES */ @@ -148,6 +156,19 @@ public abstract class ContentFilter implements } + public static class IsDefined implements Constraint { + final QName prop; + + public IsDefined(QName prop) { + super(); + this.prop = prop; + } + + public QName getProp() { + return prop; + } + } + public static class IsContentClass implements Constraint { final QName[] contentClasses; -- 2.30.2