Index: src/main/java/org/apache/jackrabbit/spi/commons/AbstractReadableRepositoryService.java =================================================================== --- src/main/java/org/apache/jackrabbit/spi/commons/AbstractReadableRepositoryService.java (revision 0) +++ src/main/java/org/apache/jackrabbit/spi/commons/AbstractReadableRepositoryService.java (revision 0) @@ -0,0 +1,695 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.jackrabbit.spi.commons; + +import org.apache.jackrabbit.spi.Batch; +import org.apache.jackrabbit.spi.SessionInfo; +import org.apache.jackrabbit.spi.ItemId; +import org.apache.jackrabbit.spi.NodeId; +import org.apache.jackrabbit.spi.Name; +import org.apache.jackrabbit.spi.LockInfo; +import org.apache.jackrabbit.spi.EventFilter; +import org.apache.jackrabbit.spi.Path; +import org.apache.jackrabbit.spi.Subscription; +import org.apache.jackrabbit.spi.EventBundle; +import org.apache.jackrabbit.spi.QNodeDefinition; +import org.apache.jackrabbit.spi.QPropertyDefinition; +import org.apache.jackrabbit.spi.PropertyId; +import org.apache.jackrabbit.spi.QueryInfo; +import org.apache.jackrabbit.spi.QNodeTypeDefinition; +import org.apache.jackrabbit.spi.commons.namespace.NamespaceMapping; +import org.apache.jackrabbit.spi.commons.nodetype.compact.CompactNodeTypeDefReader; +import org.apache.jackrabbit.spi.commons.nodetype.compact.QNodeTypeDefinitionsBuilderImpl; +import org.apache.jackrabbit.spi.commons.nodetype.compact.ParseException; + +import javax.jcr.RepositoryException; +import javax.jcr.PathNotFoundException; +import javax.jcr.ItemNotFoundException; +import javax.jcr.ValueFormatException; +import javax.jcr.AccessDeniedException; +import javax.jcr.UnsupportedRepositoryOperationException; +import javax.jcr.ItemExistsException; +import javax.jcr.NoSuchWorkspaceException; +import javax.jcr.InvalidItemStateException; +import javax.jcr.ReferentialIntegrityException; +import javax.jcr.MergeException; +import javax.jcr.NamespaceException; +import javax.jcr.Credentials; +import javax.jcr.LoginException; +import javax.jcr.SimpleCredentials; +import javax.jcr.query.InvalidQueryException; +import javax.jcr.lock.LockException; +import javax.jcr.version.VersionException; +import javax.jcr.nodetype.NoSuchNodeTypeException; +import javax.jcr.nodetype.ConstraintViolationException; +import java.io.InputStream; +import java.io.Reader; +import java.util.Iterator; +import java.util.Map; +import java.util.List; +import java.util.ArrayList; +import java.util.Set; +import java.util.HashSet; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; + +/** + * AbstractReadableRepositoryService provides an abstract base + * class where all methods that attempt to write throw an + * {@link UnsupportedRepositoryOperationException}. This class useful for + * repository service implementation that only provide read access to the + * underlying content. + */ +public abstract class AbstractReadableRepositoryService + extends AbstractRepositoryService { + + protected static final Set WRITE_ACTIONS = new HashSet(Arrays.asList( + new String[]{"add_node", "set_property", "remove"})); + + /** + * The repository descriptors. + */ + protected final Map descriptors; + + /** + * The fixed set of namespaces known to the repository service. + */ + protected final NamespaceMapping namespaces = new NamespaceMapping(); + + /** + * The fixed set of node type definitions known to the repository service. + */ + protected final Map nodeTypeDefs = new HashMap(); + + /** + * The node definition of the root node. + */ + protected QNodeDefinition rootNodeDefinition; + + /** + * The list of workspaces that this repository service exposes. + */ + protected final List wspNames; + + /** + * Creates a new AbstractReadableRepositoryService. + * + * @param descriptors the repository descriptors. Maps descriptor keys to + * descriptor values. + * @param namespaces the namespaces. Maps namespace prefixes to namespace + * URIs. + * @param cnd a reader on the compact node type definition. + * @param wspNames a list of workspace names. + * @throws RepositoryException if the namespace mappings are invalid. + * @throws ParseException if an error occurs while parsing the CND. + */ + public AbstractReadableRepositoryService(Map descriptors, + Map namespaces, + Reader cnd, + List wspNames) + throws RepositoryException, ParseException { + this.descriptors = Collections.unmodifiableMap(new HashMap(descriptors)); + for (Iterator it = namespaces.entrySet().iterator(); it.hasNext(); ) { + Map.Entry entry = (Map.Entry) it.next(); + this.namespaces.setMapping((String) entry.getKey(), + (String) entry.getValue()); + } + CompactNodeTypeDefReader reader = new CompactNodeTypeDefReader( + cnd, "", this.namespaces, new QNodeTypeDefinitionsBuilderImpl()); + for (Iterator it = reader.getNodeTypeDefs().iterator(); it.hasNext(); ) { + QNodeTypeDefinition def = (QNodeTypeDefinition) it.next(); + nodeTypeDefs.put(def.getName(), def); + } + this.wspNames = Collections.unmodifiableList(new ArrayList(wspNames)); + } + + //---------------------------< subclass responsibility >-------------------- + + /** + * Create the root node definition. + * + * @return the root node definition for a workspace. + * @throws RepositoryException if an error occurs. + */ + protected abstract QNodeDefinition createRootNodeDefinition() + throws RepositoryException; + + /** + * Checks if the given credentials are valid. + * + * @param credentials the credentials to check. + * @param workspaceName the workspace to access. + * @throws LoginException if the credentials are invalid. + */ + protected abstract void checkCredentials(Credentials credentials, + String workspaceName) + throws LoginException; + + //---------------------< may be overwritten by subclasses>------------------ + + /** + * Checks the type of the sessionInfo instance. This default + * implementation checks if sessionInfo is of type + * {@link SessionInfoImpl}, otherwise throws a {@link RepositoryException}. + * + * @param sessionInfo the session info to check. + * @throws RepositoryException if the given sessionInfo is not + * of the required type for this repository + * service implementation. + */ + protected void checkSessionInfo(SessionInfo sessionInfo) + throws RepositoryException { + if (sessionInfo instanceof SessionInfoImpl) { + return; + } + throw new RepositoryException("SessionInfo not of type " + + SessionInfoImpl.class.getName()); + } + + /** + * Creates a session info instance for the given userId and + * workspaceName. This default implementation creates a + * {@link SessionInfoImpl} instance and sets the userId and workspaceName. + * + * @param userId the userId. + * @param workspaceName the name of the workspace to access. + * @return a session info instance for the given userId and + * workspaceName. + */ + protected SessionInfo createSessionInfo(String userId, + String workspaceName) { + SessionInfoImpl s = new SessionInfoImpl(); + s.setUserID(userId); + s.setWorkspacename(workspaceName); + return s; + } + + //----------------------------< login >------------------------------------- + + /** + * This default implementation does: + * + * @param credentials the credentials for the login. + * @param workspaceName the name of the workspace to log in. + * @return the session info. + * @throws LoginException if the credentials are invalid. + * @throws NoSuchWorkspaceException if workspaceName is unknown. + * @throws RepositoryException if another error occurs. + */ + public SessionInfo obtain(Credentials credentials, String workspaceName) + throws LoginException, NoSuchWorkspaceException, RepositoryException { + checkCredentials(credentials, workspaceName); + if (!wspNames.contains(workspaceName)) { + throw new NoSuchWorkspaceException(workspaceName); + } + String userId = null; + if (credentials instanceof SimpleCredentials) { + userId = ((SimpleCredentials) credentials).getUserID(); + } + return createSessionInfo(userId, workspaceName); + } + + /** + * This default implementation returns the session info retuned by the call + * to {@link #createSessionInfo(String, String)} with the userId taken + * from the passed sessionInfo. + */ + public SessionInfo obtain(SessionInfo sessionInfo, String workspaceName) + throws LoginException, NoSuchWorkspaceException, RepositoryException { + return createSessionInfo(sessionInfo.getUserID(), workspaceName); + } + + /** + * This default implementation returns the session info returned by the call + * to {@link #obtain(Credentials, String)} with the workspaceName taken from + * the passed sessionInfo. + */ + public SessionInfo impersonate(SessionInfo sessionInfo, Credentials credentials) + throws LoginException, RepositoryException { + return obtain(credentials, sessionInfo.getWorkspaceName()); + } + + /** + * This default implementation does nothing. + */ + public void dispose(SessionInfo sessionInfo) throws RepositoryException { + // do nothing + } + + //-----------------------------< reading >---------------------------------- + + /** + * This default implementation returns an iterator over the item infos + * returned by the call to {@link #getNodeInfo(SessionInfo, NodeId)}. + */ + public Iterator getItemInfos(SessionInfo sessionInfo, NodeId nodeId) throws + ItemNotFoundException, RepositoryException { + return Collections.singleton(getNodeInfo(sessionInfo, nodeId)).iterator(); + } + + //--------------------------< descriptors >--------------------------------- + + /** + * This default implementation returns the descriptors that were passed + * to the constructor of this repository service. + */ + public Map getRepositoryDescriptors() throws RepositoryException { + return descriptors; + } + + //-------------------------< workspace names >------------------------------ + + /** + * This default implementation first calls {@link #checkSessionInfo(SessionInfo)} + * with the sessionInfo, then returns the workspaces that were + * passed to the constructor of this repository service. + */ + public String[] getWorkspaceNames(SessionInfo sessionInfo) throws + RepositoryException { + checkSessionInfo(sessionInfo); + return (String[]) wspNames.toArray(new String[wspNames.size()]); + } + + //-------------------------< access control >------------------------------- + + /** + * This default implementation first calls {@link #checkSessionInfo(SessionInfo)} + * with the sessionInfo, then returns false if + * the any of the actions are in {@link #WRITE_ACTIONS}; + * otherwise returns true. + */ + public boolean isGranted(SessionInfo sessionInfo, + ItemId itemId, + String[] actions) throws RepositoryException { + checkSessionInfo(sessionInfo); + // deny all but read + for (int i = 0; i < actions.length; i++) { + if (WRITE_ACTIONS.contains(actions[i])) { + return false; + } + } + return true; + } + + //-----------------------------< node types >------------------------------- + + /** + * This default implementation first calls {@link #checkSessionInfo(SessionInfo)} + * with the sessionInfo, + */ + public Iterator getQNodeTypeDefinitions(SessionInfo sessionInfo) throws + RepositoryException { + checkSessionInfo(sessionInfo); + return nodeTypeDefs.values().iterator(); + } + + /** + * This default implementation first calls {@link #checkSessionInfo(SessionInfo)} + * with the sessionInfo, then gathers the {@link QNodeTypeDefinition}s + * with the given nodetypeNames. If one of the nodetypeNames + * is not a valid node type definition then a {@link RepositoryException} + * is thrown. + */ + public Iterator getQNodeTypeDefinitions(SessionInfo sessionInfo, Name[] nodetypeNames) + throws RepositoryException { + checkSessionInfo(sessionInfo); + List ntDefs = new ArrayList(); + for (int i = 0; i < nodetypeNames.length; i++) { + Object def = nodeTypeDefs.get(nodetypeNames[i]); + if (def == null) { + throw new RepositoryException("unknown node type: " + + nodetypeNames[i]); + } + ntDefs.add(def); + } + return ntDefs.iterator(); + } + + /** + * This default implementation first calls {@link #checkSessionInfo(SessionInfo)} + * with the sessionInfo, then lazily initializes {@link #rootNodeDefinition} + * if nodeId denotes the root node; otherwise throws a + * {@link UnsupportedRepositoryOperationException}. + */ + public QNodeDefinition getNodeDefinition(SessionInfo sessionInfo, + NodeId nodeId) + throws RepositoryException { + checkSessionInfo(sessionInfo); + if (nodeId.getUniqueID() == null && nodeId.getPath().denotesRoot()) { + synchronized (this) { + if (rootNodeDefinition == null) { + rootNodeDefinition = createRootNodeDefinition(); + } + return rootNodeDefinition; + } + } + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public QPropertyDefinition getPropertyDefinition(SessionInfo sessionInfo, + PropertyId propertyId) + throws RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + //-----------------------------< namespaces >------------------------------- + + /** + * This default implementation first calls {@link #checkSessionInfo(SessionInfo)} + * with the sessionInfo, then returns the prefix to namespace + * URL mapping that was provided in the constructor of this repository + * service. + */ + public Map getRegisteredNamespaces(SessionInfo sessionInfo) throws + RepositoryException { + checkSessionInfo(sessionInfo); + return namespaces.getPrefixToURIMapping(); + } + + /** + * This default implementation first calls {@link #checkSessionInfo(SessionInfo)} + * with the sessionInfo, then returns the namepsace URI for the + * given prefix. + */ + public String getNamespaceURI(SessionInfo sessionInfo, String prefix) + throws NamespaceException, RepositoryException { + checkSessionInfo(sessionInfo); + return namespaces.getURI(prefix); + } + + /** + * This default implementation first calls {@link #checkSessionInfo(SessionInfo)} + * with the sessionInfo, then return the namespace prefix for + * the given uri. + */ + public String getNamespacePrefix(SessionInfo sessionInfo, String uri) + throws NamespaceException, RepositoryException { + checkSessionInfo(sessionInfo); + return namespaces.getPrefix(uri); + } + + //-----------------------------< write methods >---------------------------- + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public Batch createBatch(SessionInfo sessionInfo, ItemId itemId) + throws RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public void submit(Batch batch) throws PathNotFoundException, ItemNotFoundException, NoSuchNodeTypeException, ValueFormatException, VersionException, LockException, ConstraintViolationException, AccessDeniedException, UnsupportedRepositoryOperationException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public void importXml(SessionInfo sessionInfo, + NodeId parentId, + InputStream xmlStream, + int uuidBehaviour) throws ItemExistsException, PathNotFoundException, VersionException, ConstraintViolationException, LockException, AccessDeniedException, UnsupportedRepositoryOperationException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public void move(SessionInfo sessionInfo, + NodeId srcNodeId, + NodeId destParentNodeId, + Name destName) throws ItemExistsException, PathNotFoundException, VersionException, ConstraintViolationException, LockException, AccessDeniedException, UnsupportedRepositoryOperationException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public void copy(SessionInfo sessionInfo, + String srcWorkspaceName, + NodeId srcNodeId, + NodeId destParentNodeId, + Name destName) throws NoSuchWorkspaceException, ConstraintViolationException, VersionException, AccessDeniedException, PathNotFoundException, ItemExistsException, LockException, UnsupportedRepositoryOperationException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public void update(SessionInfo sessionInfo, + NodeId nodeId, + String srcWorkspaceName) + throws NoSuchWorkspaceException, AccessDeniedException, LockException, InvalidItemStateException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public void clone(SessionInfo sessionInfo, + String srcWorkspaceName, + NodeId srcNodeId, + NodeId destParentNodeId, + Name destName, + boolean removeExisting) throws NoSuchWorkspaceException, ConstraintViolationException, VersionException, AccessDeniedException, PathNotFoundException, ItemExistsException, LockException, UnsupportedRepositoryOperationException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public LockInfo lock(SessionInfo sessionInfo, + NodeId nodeId, + boolean deep, + boolean sessionScoped) + throws UnsupportedRepositoryOperationException, LockException, AccessDeniedException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @return null. + */ + public LockInfo getLockInfo(SessionInfo sessionInfo, NodeId nodeId) + throws AccessDeniedException, RepositoryException { + return null; + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public void refreshLock(SessionInfo sessionInfo, NodeId nodeId) + throws UnsupportedRepositoryOperationException, LockException, AccessDeniedException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public void unlock(SessionInfo sessionInfo, NodeId nodeId) + throws UnsupportedRepositoryOperationException, LockException, AccessDeniedException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public NodeId checkin(SessionInfo sessionInfo, NodeId nodeId) + throws VersionException, UnsupportedRepositoryOperationException, InvalidItemStateException, LockException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public void checkout(SessionInfo sessionInfo, NodeId nodeId) + throws UnsupportedRepositoryOperationException, LockException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public void removeVersion(SessionInfo sessionInfo, + NodeId versionHistoryId, + NodeId versionId) + throws ReferentialIntegrityException, AccessDeniedException, UnsupportedRepositoryOperationException, VersionException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public void restore(SessionInfo sessionInfo, + NodeId nodeId, + NodeId versionId, + boolean removeExisting) throws VersionException, PathNotFoundException, ItemExistsException, UnsupportedRepositoryOperationException, LockException, InvalidItemStateException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public void restore(SessionInfo sessionInfo, + NodeId[] versionIds, + boolean removeExisting) throws ItemExistsException, UnsupportedRepositoryOperationException, VersionException, LockException, InvalidItemStateException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public Iterator merge(SessionInfo sessionInfo, + NodeId nodeId, + String srcWorkspaceName, + boolean bestEffort) throws NoSuchWorkspaceException, AccessDeniedException, MergeException, LockException, InvalidItemStateException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public void resolveMergeConflict(SessionInfo sessionInfo, + NodeId nodeId, + NodeId[] mergeFailedIds, + NodeId[] predecessorIds) + throws VersionException, InvalidItemStateException, UnsupportedRepositoryOperationException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public void addVersionLabel(SessionInfo sessionInfo, + NodeId versionHistoryId, + NodeId versionId, + Name label, + boolean moveLabel) throws VersionException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public void removeVersionLabel(SessionInfo sessionInfo, + NodeId versionHistoryId, + NodeId versionId, + Name label) throws VersionException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + //-----------------------------< observation >------------------------------ + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public EventFilter createEventFilter(SessionInfo sessionInfo, + int eventTypes, + Path absPath, + boolean isDeep, + String[] uuid, + Name[] nodeTypeName, + boolean noLocal) + throws UnsupportedRepositoryOperationException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public Subscription createSubscription(SessionInfo sessionInfo, + EventFilter[] filters) + throws UnsupportedRepositoryOperationException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public void updateEventFilters(Subscription subscription, + EventFilter[] filters) + throws RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public EventBundle[] getEvents(Subscription subscription, long timeout) + throws RepositoryException, InterruptedException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public void dispose(Subscription subscription) throws RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + //----------------------< namespace registry >------------------------------ + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public void registerNamespace(SessionInfo sessionInfo, + String prefix, + String uri) throws NamespaceException, UnsupportedRepositoryOperationException, AccessDeniedException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + /** + * @throws UnsupportedRepositoryOperationException always. + */ + public void unregisterNamespace(SessionInfo sessionInfo, String uri) + throws NamespaceException, UnsupportedRepositoryOperationException, AccessDeniedException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + //-------------------------------< query >---------------------------------- + + public String[] getSupportedQueryLanguages(SessionInfo sessionInfo) throws + RepositoryException { + checkSessionInfo(sessionInfo); + return new String[0]; + } + + public void checkQueryStatement(SessionInfo sessionInfo, String statement, + String language, Map namespaces) throws + InvalidQueryException, RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + + public QueryInfo executeQuery(SessionInfo sessionInfo, String statement, + String language, Map namespaces) throws + RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } +} Property changes on: src\main\java\org\apache\jackrabbit\spi\commons\AbstractReadableRepositoryService.java ___________________________________________________________________ Added: svn:eol-style + native Index: src/main/java/org/apache/jackrabbit/spi/commons/AbstractRepositoryService.java =================================================================== --- src/main/java/org/apache/jackrabbit/spi/commons/AbstractRepositoryService.java (revision 0) +++ src/main/java/org/apache/jackrabbit/spi/commons/AbstractRepositoryService.java (revision 0) @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.jackrabbit.spi.commons; + +import org.apache.jackrabbit.spi.IdFactory; +import org.apache.jackrabbit.spi.NameFactory; +import org.apache.jackrabbit.spi.PathFactory; +import org.apache.jackrabbit.spi.QValueFactory; +import org.apache.jackrabbit.spi.RepositoryService; +import org.apache.jackrabbit.spi.commons.identifier.IdFactoryImpl; +import org.apache.jackrabbit.spi.commons.name.NameFactoryImpl; +import org.apache.jackrabbit.spi.commons.name.PathFactoryImpl; +import org.apache.jackrabbit.spi.commons.value.QValueFactoryImpl; + +import javax.jcr.RepositoryException; + +/** + * AbstractRepositoryService provides an abstract base class for + * repository service implementations. This class provides default + * implementations for the following methods: + * + */ +public abstract class AbstractRepositoryService implements RepositoryService { + + /** + * @return {@link IdFactoryImpl#getInstance()}. + * @throws RepositoryException if an error occurs. + */ + public IdFactory getIdFactory() throws RepositoryException { + return IdFactoryImpl.getInstance(); + } + + /** + * @return {@link NameFactoryImpl#getInstance()}. + * @throws RepositoryException if an error occurs. + */ + public NameFactory getNameFactory() throws RepositoryException { + return NameFactoryImpl.getInstance(); + } + + /** + * @return {@link PathFactoryImpl#getInstance()}. + * @throws RepositoryException if an error occurs. + */ + public PathFactory getPathFactory() throws RepositoryException { + return PathFactoryImpl.getInstance(); + } + + /** + * @return {@link QValueFactoryImpl#getInstance()}. + * @throws RepositoryException if an error occurs. + */ + public QValueFactory getQValueFactory() throws RepositoryException { + return QValueFactoryImpl.getInstance(); + } +} Property changes on: src\main\java\org\apache\jackrabbit\spi\commons\AbstractRepositoryService.java ___________________________________________________________________ Added: svn:eol-style + native