X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.api.acr%2Fsrc%2Forg%2Fargeo%2Fapi%2Facr%2Fspi%2FContentProvider.java;h=e354672a781c77adc1a09a009f42a3f2264c71b1;hb=HEAD;hp=72aa162b3b59716af8972c256b6a36d06d476053;hpb=3b45f571938e0eb6803084aac3f2bd298e6026ba;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.api.acr/src/org/argeo/api/acr/spi/ContentProvider.java b/org.argeo.api.acr/src/org/argeo/api/acr/spi/ContentProvider.java index 72aa162b3..e354672a7 100644 --- a/org.argeo.api.acr/src/org/argeo/api/acr/spi/ContentProvider.java +++ b/org.argeo.api.acr/src/org/argeo/api/acr/spi/ContentProvider.java @@ -1,17 +1,82 @@ package org.argeo.api.acr.spi; import java.util.Iterator; +import java.util.Spliterator; 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; + +/** + * A prover of {@link Content}, which can be mounted in a + * {@link ProvidedRepository}. + */ public interface ContentProvider extends NamespaceContext { - ProvidedContent get(ProvidedSession session, String relativePath); + /** + * Return the content at this path, relative to the mount path. + * + * @return the content at this relative path, never null + * @throws ContentNotFoundException if there is no content at this relative path + */ + ProvidedContent get(ProvidedSession session, String relativePath) throws ContentNotFoundException; - boolean exists(ProvidedSession session, String relativePath); + /** + * Whether a content exist at his relative path. The default implementation call + * {@link #get(ProvidedSession, String)} and check whether a + * {@link ContentNotFoundException} is thrown or not. It should be overridden as + * soon as there is a mechanism to check existence before actually getting the + * content. + */ + default boolean exists(ProvidedSession session, String relativePath) { + try { + get(session, relativePath); + return true; + } catch (ContentNotFoundException e) { + return false; + } + } + /** The absolute path where this provider is mounted. */ String getMountPath(); + /** + * Search content within this provider. The default implementation throws an + * {@link UnsupportedOperationException}. + */ + default Spliterator search(ProvidedSession session, BasicSearch search, String relPath) { + throw new UnsupportedOperationException(); + } + + /* + * EDITION + */ + /** Switch this content (and its subtree) to editing mode. */ + default void openForEdit(ProvidedSession session, String relativePath) { + throw new UnsupportedOperationException(); + } + + /** Switch this content (and its subtree) to frozen mode. */ + default void freeze(ProvidedSession session, String relativePath) { + throw new UnsupportedOperationException(); + } + + /** Whether this content (and its subtree) are in editing mode. */ + default boolean isOpenForEdit(ProvidedSession session, String relativePath) { + throw new UnsupportedOperationException(); + } + + /** + * 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 */ @@ -21,12 +86,4 @@ public interface ContentProvider extends NamespaceContext { return prefixes.hasNext() ? prefixes.next() : null; } -// default ContentName parsePrefixedName(String nameWithPrefix) { -// return NamespaceUtils.parsePrefixedName(this, nameWithPrefix); -// } -// -// default String toPrefixedName(QName name) { -// return NamespaceUtils.toPrefixedName(this, name); -// } - }