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 {
/**
* 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;
/**
* 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
*/
@Override
default String getPrefix(String namespaceURI) {
Iterator prefixes = getPrefixes(namespaceURI);
return prefixes.hasNext() ? prefixes.next() : null;
}
}