Improve ACR search and edition
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 22 Jun 2023 05:57:10 +0000 (07:57 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 22 Jun 2023 05:57:10 +0000 (07:57 +0200)
org.argeo.api.acr/src/org/argeo/api/acr/QNamed.java
org.argeo.api.acr/src/org/argeo/api/acr/search/BasicSearch.java
org.argeo.api.acr/src/org/argeo/api/acr/search/Intersection.java
org.argeo.api.acr/src/org/argeo/api/acr/search/Union.java
org.argeo.api.acr/src/org/argeo/api/acr/spi/ContentProvider.java
org.argeo.cms/src/org/argeo/cms/acr/CmsContentSession.java
org.argeo.cms/src/org/argeo/cms/acr/xml/DomContentProvider.java

index 063a7d32175f1d0e0a949964720c35a239464f68..73ae4f02ead43b8c69038712e6e3a17477090ffe 100644 (file)
@@ -23,6 +23,7 @@ public interface QNamed extends Supplier<String> {
                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. */
        default String get() {
                return getDefaultPrefix() + ":" + localName();
        }
@@ -43,5 +44,10 @@ public interface QNamed extends Supplier<String> {
                        return XMLConstants.DEFAULT_NS_PREFIX;
                }
 
+               @Override
+               default String get() {
+                       return localName();
+               }
+
        }
 }
index 2e4f249d4ce5dbe35206f621e250368c003ce184..8cbdebf7e5d5c8e6614dea460a739e59328158d1 100644 (file)
@@ -34,10 +34,20 @@ public class BasicSearch {
                return this;
        }
 
+       /**
+        * Convenience method, to search below this absolute path, with depth
+        * {@link Depth#INFINITTY}.
+        */
+       public BasicSearch from(String path) {
+               return from(URI.create(path), Depth.INFINITTY);
+       }
+
+       /** Search below this URI, with depth {@link Depth#INFINITTY}. */
        public BasicSearch from(URI uri) {
                return from(uri, Depth.INFINITTY);
        }
 
+       /** Search below this URI, with this {@link Depth}. */
        public BasicSearch from(URI uri, Depth depth) {
                Objects.requireNonNull(uri);
                Objects.requireNonNull(depth);
index 9ce7632041db410e5216a4e757d4b49f9060b298..44ca906056e7df060c15c71008614cda315008f7 100644 (file)
@@ -1,7 +1,7 @@
 package org.argeo.api.acr.search;
 
 /** A composition which is the intersection of sets (AND). */
-class Intersection implements Composition {
+public class Intersection implements Composition {
        ContentFilter<Intersection> filter;
 
        @SuppressWarnings("unchecked")
index df1b00175019600fe6bfdf791a31f7802bb8325e..d33b13da2fd7d6050d27b7993abf551a2f44604f 100644 (file)
@@ -1,7 +1,7 @@
 package org.argeo.api.acr.search;
 
 /** A composition which is the union of sets (OR). */
-class Union implements Composition {
+public class Union implements Composition {
        ContentFilter<Union> filter;
 
        @SuppressWarnings("unchecked")
index 56610ef4b097c917ceec3a155fc59e95b1f5893d..8b59f2fa23120784660d1c4a6e4defd3b9f44754 100644 (file)
@@ -7,6 +7,7 @@ import javax.xml.namespace.NamespaceContext;
 
 import org.argeo.api.acr.Content;
 import org.argeo.api.acr.ContentNotFoundException;
+import org.argeo.api.acr.ContentSession;
 import org.argeo.api.acr.search.BasicSearch;
 
 /**
@@ -50,6 +51,17 @@ public interface ContentProvider extends NamespaceContext {
                throw new UnsupportedOperationException();
        }
 
+       /*
+        * EDITION
+        */
+       /**
+        * Called when an edition cycle is completed. Does nothing by default.
+        * 
+        * @see ContentSession#edit(java.util.function.Consumer)
+        */
+       default void persist(ProvidedSession session) {
+       }
+
        /*
         * NAMESPACE CONTEXT
         */
index af7dca046ab636b014c7c601f0908ff3060661a6..8d475fd204853737eae48b94629c04fcdf858ea2 100644 (file)
@@ -26,7 +26,7 @@ import org.argeo.api.acr.spi.ProvidedContent;
 import org.argeo.api.acr.spi.ProvidedRepository;
 import org.argeo.api.acr.spi.ProvidedSession;
 import org.argeo.api.uuid.UuidFactory;
-import org.argeo.cms.acr.xml.DomContentProvider;
+import org.argeo.cms.CurrentUser;
 
 /** Implements {@link ProvidedSession}. */
 class CmsContentSession implements ProvidedSession {
@@ -137,9 +137,10 @@ class CmsContentSession implements ProvidedSession {
                        synchronized (CmsContentSession.this) {
                                // TODO optimise
                                for (ContentProvider provider : modifiedProviders) {
-                                       if (provider instanceof DomContentProvider) {
-                                               ((DomContentProvider) provider).persist(s);
-                                       }
+                                       provider.persist(s);
+//                                     if (provider instanceof DomContentProvider) {
+//                                             ((DomContentProvider) provider).persist(s);
+//                                     }
                                }
                                modifiedProviders.clear();
                                return s;
@@ -179,6 +180,18 @@ class CmsContentSession implements ProvidedSession {
                return sessionRunDir;
        }
 
+       @Override
+       public boolean equals(Object o) {
+               if (o instanceof CmsContentSession session)
+                       return uuid.equals(session.uuid);
+               return false;
+       }
+
+       @Override
+       public String toString() {
+               return "Content Session " + uuid + " (" + CurrentUser.getUsername(subject) + ")";
+       }
+
        /*
         * SEARCH
         */
index d569350975ff1c5fa8597ebe6962f8bbdf95e13a..39d9c2a90b56d5a8483c9813fb5637e0b94dc7d3 100644 (file)
@@ -96,6 +96,7 @@ public class DomContentProvider implements ContentProvider, NamespaceContext {
                return nodes.getLength() != 0;
        }
 
+       @Override
        public void persist(ProvidedSession session) {
                if (mountPath != null) {
                        Content mountPoint = session.getMountPoint(mountPath);