All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.jackrabbit.spi.RepositoryService Maven / Gradle / Ivy

/*
 * 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;

import java.io.InputStream;
import java.util.Iterator;
import java.util.Map;

import javax.jcr.AccessDeniedException;
import javax.jcr.Credentials;
import javax.jcr.InvalidItemStateException;
import javax.jcr.ItemExistsException;
import javax.jcr.ItemNotFoundException;
import javax.jcr.LoginException;
import javax.jcr.MergeException;
import javax.jcr.NamespaceException;
import javax.jcr.NoSuchWorkspaceException;
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import javax.jcr.ReferentialIntegrityException;
import javax.jcr.RepositoryException;
import javax.jcr.UnsupportedRepositoryOperationException;
import javax.jcr.ValueFormatException;
import javax.jcr.lock.LockException;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.nodetype.InvalidNodeTypeDefinitionException;
import javax.jcr.nodetype.NoSuchNodeTypeException;
import javax.jcr.nodetype.NodeTypeExistsException;
import javax.jcr.query.InvalidQueryException;
import javax.jcr.version.Version;
import javax.jcr.version.VersionException;

/**
 * The RepositoryService interface defines methods used to
 * retrieve information from the persistent layer of the repository as well
 * as the methods that modify its persistent state.
 * The implementation of this interface is intended to hold only the state of
 * the persistent layer, no session-related state should be held. Consequently,
 * each method that alters persistent state always includes all the information
 * necessary to fully specify and authorize a change.
 * 

* For example, consider the method *

 *    void RepositoryService.copy(SessionInfo sessionInfo,
 *                                String srcWorkspaceName,
 *                                NodeId srcNodeId, NodeId destParentNodeId,
 *                                Name destName)
 * 
* This method performs an immediate persistent copy of the node identified by * srcNodeId and that node's subtree to a position as child of the node * identified by destParentNodeId and assigns the newly copied node the name * destName.
* The SessionInfo object provides user and workspace identification * as well as eventual lock tokens required to execute the copy.
* If srcWorkspaceName differs from the workspace name present with * the SessionInfo, the copy is corresponds to a copy across workspaces. * The source and destination of the copy operation are specified by * {@link NodeId}s. The Name holds the new name. Taken together, * this information is sufficient to completely specify and authorize the copy * operations. *

* The RepositoryService in addition allows to create and submit {@link Batch} * objects, that cover lists of operations that have to be applied to the * persistent layer at once. */ public interface RepositoryService { /** * Return the IdFactory. * * @return The IdFactory. * @throws RepositoryException If an error occurs. */ public IdFactory getIdFactory() throws RepositoryException; /** * Return the NameFactory. * * @return The NameFactory. * @throws RepositoryException If an error occurs. */ public NameFactory getNameFactory() throws RepositoryException; /** * Return the PathFactory. * * @return The PathFactory. * @throws RepositoryException If an error occurs. */ public PathFactory getPathFactory() throws RepositoryException; /** * Return the QValueFactory defined with this SPI implementation. * * @return The QValueFactory. * @throws RepositoryException If an error occurs. */ public QValueFactory getQValueFactory() throws RepositoryException; /** * Returns a {@link ItemInfoCache} for the given SessionInfo. * @param sessionInfo * @return * @throws RepositoryException */ public ItemInfoCache getItemInfoCache(SessionInfo sessionInfo) throws RepositoryException; //-------------------------------------------------------------------------- /** * Returns all property descriptors that can be exposed with the * {@link javax.jcr.Repository Repository} implementation built on top of * this RepositoryService. * * @return key-value pairs for repository descriptor keys and values. * @throws javax.jcr.RepositoryException * @see javax.jcr.Repository#getDescriptorKeys() * @see javax.jcr.Repository#getDescriptor(String) */ public Map getRepositoryDescriptors() throws RepositoryException; //-----------------------------------< SessionInfo creation and release >--- /** * Returns a SessionInfo that will be used by other methods * on the RepositoryService. * An implementation may choose to authenticate the user using the supplied * credentials. * * @param credentials the credentials of the user. * @param workspaceName the name of the workspace the SessionInfo * should be built for. If the specified workspaceName is null * the implementation should select a default workspace. * @return a SessionInfo if authentication was successful. * @throws LoginException if authentication of the user fails. * @throws NoSuchWorkspaceException if the specified workspaceName * is not recognized. * @throws RepositoryException if an error occurs. */ public SessionInfo obtain(Credentials credentials, String workspaceName) throws LoginException, NoSuchWorkspaceException, RepositoryException; /** * Returns a new SessionInfo for the given workspace name that * will be used by other methods on the RepositoryService. * * @param sessionInfo for another workspace * @param workspaceName the name of the workspace the new SessionInfo * should be built for. If the specified workspaceName is null * the implementation should select a default workspace. * @return a SessionInfo if authentication was successful. * @throws LoginException if authentication of the user fails. * @throws NoSuchWorkspaceException if the specified workspaceName * is not recognized. * @throws RepositoryException if an error occurs. */ public SessionInfo obtain(SessionInfo sessionInfo, String workspaceName) throws LoginException, NoSuchWorkspaceException, RepositoryException; /** * Returns a SessionInfo that will be used by other methods * on the RepositoryService. * * @param sessionInfo * @param credentials * @return a SessionInfo if impersonate was successful. * @throws LoginException * @throws RepositoryException * @see javax.jcr.Session#impersonate(javax.jcr.Credentials) */ public SessionInfo impersonate(SessionInfo sessionInfo, Credentials credentials) throws LoginException, RepositoryException; /** * Indicates to the RepositoryService, that the given SessionInfo * will not be used any more. * * @param sessionInfo * @throws javax.jcr.RepositoryException */ public void dispose(SessionInfo sessionInfo) throws RepositoryException; //-------------------------------------------------------------------------- /** * Return all workspace names available for the given SessionInfo. * * @param sessionInfo * @return An array of workspace names. * @throws javax.jcr.RepositoryException * @see javax.jcr.Workspace#getAccessibleWorkspaceNames() * @see javax.jcr.Workspace#getName() */ public String[] getWorkspaceNames(SessionInfo sessionInfo) throws RepositoryException; //-----------------------------------------------------< Access Control >--- /** * Returns true if all actions defined in the specified array are granted * to given SessionInfo. False otherwise. * * @param sessionInfo * @param itemId * @param actions * @return true if the session with the given SessionInfo has * the specified rights for the given item. * @throws javax.jcr.RepositoryException * @see javax.jcr.Session#checkPermission(String, String) * @see javax.jcr.Session#hasPermission(String, String) */ public boolean isGranted(SessionInfo sessionInfo, ItemId itemId, String[] actions) throws RepositoryException; /** * TODO * * * @param sessionInfo * @return * @throws RepositoryException */ public PrivilegeDefinition[] getPrivilegeDefinitions(SessionInfo sessionInfo) throws RepositoryException; /** * TODO * * * @param sessionInfo * @param id * @return * @throws RepositoryException */ public Name[] getPrivilegeNames(SessionInfo sessionInfo, NodeId id) throws RepositoryException; /** * TODO * * @param sessionInfo * @param nodeId * @return * @throws RepositoryException */ public PrivilegeDefinition[] getSupportedPrivileges(SessionInfo sessionInfo, NodeId nodeId) throws RepositoryException; //------------------------------------------------------< Reading items >--- /** * Returns the QNodeDefinition for the Node * identified by the given id. This method should only be used if the * caller is not able to unambiguously determine the applicable definition * from the parent node type definition or if no parent exists (i.e. for * the root). * * @param sessionInfo * @param nodeId * @return The node definition applicable to the Node identified * by the given id. * @throws javax.jcr.RepositoryException */ public QNodeDefinition getNodeDefinition(SessionInfo sessionInfo, NodeId nodeId) throws RepositoryException; /** * Returns the QPropertyDefinition for the Property * identified by the given id. This method should only be used if the * caller is not able to unambiguously determine the applicable definition * from the parent node type definition. * * @param sessionInfo * @param propertyId * @return The property definition applicable for the Property * identified by the given id. * @throws javax.jcr.RepositoryException */ public QPropertyDefinition getPropertyDefinition(SessionInfo sessionInfo, PropertyId propertyId) throws RepositoryException; /** * Retrieve the NodeInfo for the node identified by the given * NodeId. See {@link #getItemInfos(SessionInfo, ItemId)} for * a similar method that in addition may return ItemInfos of * children Items. * * @param sessionInfo * @param nodeId * @return The NodeInfo for the node identified by the given id. * @throws javax.jcr.ItemNotFoundException * @throws javax.jcr.RepositoryException * @see javax.jcr.Session#getItem(String) * @see javax.jcr.Node#getNode(String) * @see javax.jcr.version.VersionHistory#getAllVersions() * @see javax.jcr.version.VersionHistory#getVersion(String) * @see javax.jcr.version.VersionHistory#getVersionByLabel(String) * @see javax.jcr.version.VersionHistory#getRootVersion() * @see javax.jcr.Node#getBaseVersion() * @see javax.jcr.Node#getVersionHistory() * @see javax.jcr.version.Version#getContainingHistory() * @deprecated Use {@link #getItemInfos(SessionInfo, ItemId)} */ public NodeInfo getNodeInfo(SessionInfo sessionInfo, NodeId nodeId) throws ItemNotFoundException, RepositoryException; /** * Method used to 'batch-read' from the persistent storage. It returns the * ItemInfo for the given ItemId as the first * element in the Iterator. In addition the iterator may contain * arbitrary ItemInfos. * * @param sessionInfo * @param itemId * @return An Iterator of ItemInfos containing * at least a single element: the ItemInfo that represents * the Item identified by the given ItemId. If the Iterator * contains multiple elements, the first is expected to represent the Item * identified by the given ItemId. * @throws javax.jcr.ItemNotFoundException * @throws javax.jcr.RepositoryException * @see javax.jcr.Session#getItem(String) * @see javax.jcr.Node#getNode(String) * @see javax.jcr.version.VersionHistory#getAllVersions() * @see javax.jcr.version.VersionHistory#getVersion(String) * @see javax.jcr.version.VersionHistory#getVersionByLabel(String) * @see javax.jcr.version.VersionHistory#getRootVersion() * @see javax.jcr.Node#getBaseVersion() * @see javax.jcr.Node#getVersionHistory() * @see javax.jcr.version.Version#getContainingHistory() */ public Iterator getItemInfos(SessionInfo sessionInfo, ItemId itemId) throws ItemNotFoundException, RepositoryException; /** * Returns an Iterator of ChildInfos present on the * Node represented by the given parentId. * * @param sessionInfo * @param parentId * @return An Iterator of ChildInfos present on the * Node represented by the given parentId. * @throws ItemNotFoundException * @throws RepositoryException */ public Iterator getChildInfos(SessionInfo sessionInfo, NodeId parentId) throws ItemNotFoundException, RepositoryException; /** * Returns the {@link PropertyId Id}s of the properties that are referencing * the node identified by the given nodeId. If * weakReferences is true the ids of * {@link javax.jcr.PropertyType#WEAKREFERENCE WEAKREFERENCE} properties are * returned, otherwise the property must be of type {@link javax.jcr.PropertyType#REFERENCE REFERENCE}. * * @param sessionInfo * @param nodeId * @param propertyName name filter of referring properties to be returned; * if null then all references are returned. * @param weakReferences If true the properties must be of type * {@link javax.jcr.PropertyType#WEAKREFERENCE}, otherwise of type * {@link javax.jcr.PropertyType#REFERENCE}. * @return An Iterator of {@link PropertyId Id}s of the properties that are * referencing the node identified by the given nodeId or an * empty iterator if the node is not referenceable or no references exist. * @throws ItemNotFoundException * @throws RepositoryException * @see PropertyInfo#getId() * @since JCR 2.0 */ public Iterator getReferences(SessionInfo sessionInfo, NodeId nodeId, Name propertyName, boolean weakReferences) throws ItemNotFoundException, RepositoryException; /** * Returns the PropertyInfo for the Property * identified by the given id. * * @param sessionInfo * @param propertyId * @return The PropertyInfo for the Property * identified by the given id. * @throws javax.jcr.ItemNotFoundException * @throws javax.jcr.RepositoryException * @see javax.jcr.Session#getItem(String) * @see javax.jcr.Node#getProperty(String) * @deprecated Use {@link #getItemInfos(SessionInfo, ItemId)} */ public PropertyInfo getPropertyInfo(SessionInfo sessionInfo, PropertyId propertyId) throws ItemNotFoundException, RepositoryException; //-----------------------------------------------< general modification >--- /** * Indicates the start of a set of operations that cause modifications * on the underlying persistence layer. All modification called on the * {@link Batch} must be executed at once or non must be executed upon * calling {@link #submit(Batch)}. * * @param sessionInfo * @param itemId Id of the Item that is a common ancestor of all * Items affected upon batch execution. This Item * might itself be modified within the scope of the Batch. * @return A Batch indicating the start of a set of transient modifications * that will be execute at once upon {@link #submit(Batch)}. * @throws RepositoryException * @see javax.jcr.Item#save() * @see javax.jcr.Session#save() * @see Batch */ public Batch createBatch(SessionInfo sessionInfo, ItemId itemId) throws RepositoryException; /** * Completes the given {@link Batch} or discard all the previous modifications. * See {@link #createBatch(SessionInfo,ItemId)} for additional information * regarding batch creation. * * @param batch * @throws PathNotFoundException * @throws ItemNotFoundException * @throws NoSuchNodeTypeException * @throws ValueFormatException * @throws VersionException * @throws LockException * @throws ConstraintViolationException * @throws AccessDeniedException * @throws UnsupportedRepositoryOperationException * @throws RepositoryException * @see Batch */ public void submit(Batch batch) throws PathNotFoundException, ItemNotFoundException, NoSuchNodeTypeException, ValueFormatException, VersionException, LockException, ConstraintViolationException, AccessDeniedException, UnsupportedRepositoryOperationException, RepositoryException; /** * Creates a new {@code Tree} that can be populated and later on be applied * to the specified {@code Batch} by calling {@code #setTree}. * * @param nodeName * @param primaryTypeName * @param uniqueId * @return a new {@code Tree} instance. * @throws RepositoryException */ public Tree createTree(SessionInfo sessionInfo, Batch batch, Name nodeName, Name primaryTypeName, String uniqueId) throws RepositoryException; //-------------------------------------------------------------< Import >--- /** * Imports the data present in the given InputStream into the * persistent layer. Note, that the implementation is responsible for * validating the data presented and for the integrity of the repository * upon completion. * * @param sessionInfo * @param parentId * @param xmlStream * @param uuidBehaviour * @throws ItemExistsException * @throws PathNotFoundException * @throws VersionException * @throws ConstraintViolationException * @throws LockException * @throws AccessDeniedException * @throws UnsupportedRepositoryOperationException * @throws RepositoryException * @see javax.jcr.Workspace#importXML(String, java.io.InputStream, int) */ public void importXml(SessionInfo sessionInfo, NodeId parentId, InputStream xmlStream, int uuidBehaviour) throws ItemExistsException, PathNotFoundException, VersionException, ConstraintViolationException, LockException, AccessDeniedException, UnsupportedRepositoryOperationException, RepositoryException; //---------------------------------------------------------< Copy, Move >--- /** * Moves the node identified by the given srcNodeId (and its * entire subtree) to the new location defined by destParentNodeId * and a new name (destName). * * @param sessionInfo * @param srcNodeId * @param destParentNodeId * @param destName * @throws javax.jcr.ItemExistsException * @throws javax.jcr.PathNotFoundException * @throws javax.jcr.version.VersionException * @throws javax.jcr.nodetype.ConstraintViolationException * @throws javax.jcr.lock.LockException * @throws javax.jcr.AccessDeniedException * @throws javax.jcr.UnsupportedRepositoryOperationException * @throws javax.jcr.RepositoryException * @see javax.jcr.Workspace#move(String, String) */ public void move(SessionInfo sessionInfo, NodeId srcNodeId, NodeId destParentNodeId, Name destName) throws ItemExistsException, PathNotFoundException, VersionException, ConstraintViolationException, LockException, AccessDeniedException, UnsupportedRepositoryOperationException, RepositoryException; /** * Clone the subtree identified by the given srcNodeId * in workspace named srcWorkspaceName to the destination * in the workspace specified by the given SessionInfo. The * destination is composed by the given parent id and the new name * as indicated by destName. *

* Note, that srcWorkspaceName may be the same as the one * specified within the SessionInfo. In this case the copy * corresponds to a copy within a single workspace. * * @param sessionInfo * @param srcWorkspaceName * @param srcNodeId * @param destParentNodeId * @param destName * @throws javax.jcr.NoSuchWorkspaceException * @throws javax.jcr.nodetype.ConstraintViolationException * @throws javax.jcr.version.VersionException * @throws javax.jcr.AccessDeniedException * @throws javax.jcr.PathNotFoundException * @throws javax.jcr.ItemExistsException * @throws javax.jcr.lock.LockException * @throws javax.jcr.UnsupportedRepositoryOperationException * @throws javax.jcr.RepositoryException * @see javax.jcr.Workspace#copy(String, String) * @see javax.jcr.Workspace#copy(String, String, String) */ public void copy(SessionInfo sessionInfo, String srcWorkspaceName, NodeId srcNodeId, NodeId destParentNodeId, Name destName) throws NoSuchWorkspaceException, ConstraintViolationException, VersionException, AccessDeniedException, PathNotFoundException, ItemExistsException, LockException, UnsupportedRepositoryOperationException, RepositoryException; //------------------------------------------------------< Update, Clone >--- /** * Updates the node identified by the given NodeId replacing * it (an the complete subtree) with a clone of its corresponding node * present in the workspace with the given srcWorkspaceName. * * @param sessionInfo * @param nodeId * @param srcWorkspaceName * @throws javax.jcr.NoSuchWorkspaceException * @throws javax.jcr.AccessDeniedException * @throws javax.jcr.lock.LockException * @throws javax.jcr.InvalidItemStateException * @throws javax.jcr.RepositoryException * @see javax.jcr.Node#update(String) */ public void update(SessionInfo sessionInfo, NodeId nodeId, String srcWorkspaceName) throws NoSuchWorkspaceException, AccessDeniedException, LockException, InvalidItemStateException, RepositoryException; /** * Clone the subtree identified by the given srcNodeId * in workspace named srcWorkspaceName to the destination * in the workspace specified by the given SessionInfo. The * destination is composed by the given parent id and the new name * as indicated by destName. * * @param sessionInfo * @param srcWorkspaceName * @param srcNodeId * @param destParentNodeId * @param destName * @param removeExisting * @throws javax.jcr.NoSuchWorkspaceException * @throws javax.jcr.nodetype.ConstraintViolationException * @throws javax.jcr.version.VersionException * @throws javax.jcr.AccessDeniedException * @throws javax.jcr.PathNotFoundException * @throws javax.jcr.ItemExistsException * @throws javax.jcr.lock.LockException * @throws javax.jcr.UnsupportedRepositoryOperationException * @throws javax.jcr.RepositoryException * @see javax.jcr.Workspace#clone(String, String, String, boolean) */ 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; //------------------------------------------------------------< Locking >--- /** * Returns the lock information that applies to Node identified * by the given NodeId or null. If the implementation * does not support locking at all, this method always returns null. * * @param sessionInfo * @param nodeId * @return The lock information for the Node identified by the given * nodeId or null if no lock applies to that Node. * @throws javax.jcr.AccessDeniedException * @throws javax.jcr.RepositoryException If some other error occurs. * @see Node#getLock() */ public LockInfo getLockInfo(SessionInfo sessionInfo, NodeId nodeId) throws AccessDeniedException, RepositoryException; /** * Create a lock on the Node identified by the given id. * * @param sessionInfo * @param nodeId * @param deep * @param sessionScoped * @return The LockInfo associated with the new lock * that has been created. * @throws javax.jcr.UnsupportedRepositoryOperationException If this SPI * implementation does not support locking at all. * @throws javax.jcr.lock.LockException If the Node identified by the given * id cannot be locked due to an existing lock or due to missing mixin type. * @throws javax.jcr.AccessDeniedException * @throws javax.jcr.RepositoryException If another error occurs. * @see javax.jcr.Node#lock(boolean, boolean) */ public LockInfo lock(SessionInfo sessionInfo, NodeId nodeId, boolean deep, boolean sessionScoped) throws UnsupportedRepositoryOperationException, LockException, AccessDeniedException, RepositoryException; /** * Create a lock on the Node identified by the given id. * * @param sessionInfo * @param nodeId * @param deep * @param sessionScoped * @param timeoutHint long indicating the desired lock timeout in seconds. * The implementation is free to ignore the hint. * @param ownerHint String indicating the desired lockOwner info. The * implementation is free to ignore the hint. * @return The LockInfo associated with the new lock * that has been created. * @throws javax.jcr.UnsupportedRepositoryOperationException If this SPI * implementation does not support locking at all. * @throws javax.jcr.lock.LockException If the Node identified by the given * id cannot be locked due to an existing lock or due to missing mixin type. * @throws javax.jcr.AccessDeniedException * @throws javax.jcr.RepositoryException If another error occurs. * @see javax.jcr.lock.LockManager#lock(String, boolean, boolean, long, String) * @since JCR 2.0 */ public LockInfo lock(SessionInfo sessionInfo, NodeId nodeId, boolean deep, boolean sessionScoped, long timeoutHint, String ownerHint) throws UnsupportedRepositoryOperationException, LockException, AccessDeniedException, RepositoryException; /** * Explicit refresh of an existing lock. Existing locks should be refreshed * implicitly with all read and write methods listed here. * * @param sessionInfo * @param nodeId * @throws javax.jcr.UnsupportedRepositoryOperationException If this SPI * implementation does not support locking at all. * @throws javax.jcr.lock.LockException If the Node identified by the given * id is not locked (any more) or if the SessionInfo does not * contain the token associated with the lock to be refreshed. * @throws javax.jcr.AccessDeniedException * @throws javax.jcr.RepositoryException If another error occurs. * @see javax.jcr.lock.Lock */ public void refreshLock(SessionInfo sessionInfo, NodeId nodeId) throws UnsupportedRepositoryOperationException, LockException, AccessDeniedException, RepositoryException; /** * Releases the lock on the Node identified by the given * NodeId. *

* Please note, that on {@link javax.jcr.Session#logout() logout} all * session-scoped locks must be released by calling unlock. * * @param sessionInfo * @param nodeId * @throws javax.jcr.UnsupportedRepositoryOperationException If this SPI * implementation does not support locking at all. * @throws javax.jcr.lock.LockException If the Node identified by the given * id is not locked or if the SessionInfo does not contain the * token associated with the lock to be released. * @throws javax.jcr.AccessDeniedException * @throws javax.jcr.RepositoryException If another error occurs. * @see javax.jcr.Node#unlock() */ public void unlock(SessionInfo sessionInfo, NodeId nodeId) throws UnsupportedRepositoryOperationException, LockException, AccessDeniedException, RepositoryException; //---------------------------------------------------------< Versioning >--- /** * Performs a checkin for the Node identified by the given * NodeId. * * @param sessionInfo * @param nodeId * @return NodeId of newly created version * @throws javax.jcr.version.VersionException * @throws javax.jcr.UnsupportedRepositoryOperationException * @throws javax.jcr.InvalidItemStateException * @throws javax.jcr.lock.LockException * @throws javax.jcr.RepositoryException * @see javax.jcr.Node#checkin() */ public NodeId checkin(SessionInfo sessionInfo, NodeId nodeId) throws VersionException, UnsupportedRepositoryOperationException, InvalidItemStateException, LockException, RepositoryException; /** * Performs a checkout for the Node identified by the given * NodeId. Same as {@link #checkout(SessionInfo, NodeId, NodeId)} * where the activityId is null. * * @param sessionInfo * @param nodeId * @throws javax.jcr.UnsupportedRepositoryOperationException * @throws javax.jcr.lock.LockException * @throws javax.jcr.RepositoryException * @see javax.jcr.Node#checkout() */ public void checkout(SessionInfo sessionInfo, NodeId nodeId) throws UnsupportedRepositoryOperationException, LockException, RepositoryException; /** * Performs a checkout for the Node identified by the given * NodeId and for activity identified by the specified * activityId. If the activityId is null * this corresponds to {@link #checkout(SessionInfo, NodeId)} * * @param sessionInfo * @param nodeId * @param activityId Id of the activity node set to the editing session or * null if no activity is in effect. * @throws UnsupportedRepositoryOperationException * @throws LockException * @throws RepositoryException * @since JCR 2.0 */ public void checkout(SessionInfo sessionInfo, NodeId nodeId, NodeId activityId) throws UnsupportedRepositoryOperationException, LockException, RepositoryException; /** * Performs a checkpoint for the Node identified by the given * NodeId. * * @param sessionInfo * @param nodeId * @return NodeId of newly created version * @throws javax.jcr.UnsupportedRepositoryOperationException * @throws javax.jcr.RepositoryException * @see javax.jcr.version.VersionManager#checkpoint(String) * @since JCR 2.0 */ public NodeId checkpoint(SessionInfo sessionInfo, NodeId nodeId) throws UnsupportedRepositoryOperationException, RepositoryException; /** * Performs a checkpoint for the Node identified by the given * NodeId. For the checkout part the specified activityId * is taken into account as specified in {@link #checkout(SessionInfo, NodeId, NodeId)}. * * @param sessionInfo * @param nodeId * @param activityId Id of the activity node set to the editing session or * null if no activity is in effect. * @throws UnsupportedRepositoryOperationException * @throws LockException * @throws RepositoryException * @since JCR 2.0 */ public NodeId checkpoint(SessionInfo sessionInfo, NodeId nodeId, NodeId activityId) throws UnsupportedRepositoryOperationException, RepositoryException; /** * Remove the version identified by the specified versionId. * * @param sessionInfo * @param versionHistoryId NodeId identifying the version * history the version identified by versionId belongs to. * @param versionId * @throws ReferentialIntegrityException * @throws AccessDeniedException * @throws UnsupportedRepositoryOperationException * @throws VersionException * @throws RepositoryException * @see javax.jcr.version.VersionHistory#removeVersion(String) */ public void removeVersion(SessionInfo sessionInfo, NodeId versionHistoryId, NodeId versionId) throws ReferentialIntegrityException, AccessDeniedException, UnsupportedRepositoryOperationException, VersionException, RepositoryException; /** * Restores the node identified by nodeId to the state defined * by the version with the specified versionId. * * @param sessionInfo * @param nodeId * @param versionId * @param removeExisting boolean flag indicating how to deal with an * identifier collision that may occur if a node exists outside the subtree * to be restored with the same identified as a node that would be * introduces by the restore. If the removeExisting is * true the restored node takes precedence and the * existing node is removed. Otherwise the restore fails. * @throws javax.jcr.version.VersionException * @throws javax.jcr.PathNotFoundException * @throws javax.jcr.ItemExistsException * @throws javax.jcr.UnsupportedRepositoryOperationException * @throws javax.jcr.lock.LockException * @throws javax.jcr.InvalidItemStateException * @throws javax.jcr.RepositoryException * @see javax.jcr.Node#restore(String, boolean) * @see javax.jcr.Node#restore(javax.jcr.version.Version, boolean) * @see javax.jcr.Node#restore(javax.jcr.version.Version, String, boolean) * @see javax.jcr.Node#restoreByLabel(String, boolean) */ public void restore(SessionInfo sessionInfo, NodeId nodeId, NodeId versionId, boolean removeExisting) throws VersionException, PathNotFoundException, ItemExistsException, UnsupportedRepositoryOperationException, LockException, InvalidItemStateException, RepositoryException; /** * Restore multiple versions at once. The versions to be restored are * identified by the given array of NodeIds. * * @param sessionInfo * @param versionIds * @param removeExisting boolean flag indicating how to deal with an * identifier collision that may occur if a node exists outside the subtrees * to be restored with the same identified as any node that would be * introduces by the restore. If the removeExisting is * true the node to be restored takes precedence and the * existing node is removed. Otherwise the restore fails. * @throws javax.jcr.ItemExistsException * @throws javax.jcr.UnsupportedRepositoryOperationException * @throws javax.jcr.version.VersionException * @throws javax.jcr.lock.LockException * @throws javax.jcr.InvalidItemStateException * @throws javax.jcr.RepositoryException * @see javax.jcr.Workspace#restore(javax.jcr.version.Version[], boolean) */ public void restore(SessionInfo sessionInfo, NodeId[] versionIds, boolean removeExisting) throws ItemExistsException, UnsupportedRepositoryOperationException, VersionException, LockException, InvalidItemStateException, RepositoryException; /** * Merge the node identified by the given NodeId and its subtree * with the corresponding node present in the workspace with the name of * srcWorkspaceName. * * @param sessionInfo * @param nodeId * @param srcWorkspaceName * @param bestEffort * @return an Iterator over the {@link NodeId}s of all nodes that * received a merge result of "fail" in the course of this operation. * @throws javax.jcr.NoSuchWorkspaceException * @throws javax.jcr.AccessDeniedException * @throws javax.jcr.MergeException * @throws javax.jcr.lock.LockException * @throws javax.jcr.InvalidItemStateException * @throws javax.jcr.RepositoryException * @see javax.jcr.Node#merge(String, boolean) */ public Iterator merge(SessionInfo sessionInfo, NodeId nodeId, String srcWorkspaceName, boolean bestEffort) throws NoSuchWorkspaceException, AccessDeniedException, MergeException, LockException, InvalidItemStateException, RepositoryException; /** * Merge the node identified by the given NodeId and its subtree * with the corresponding node present in the workspace with the name of * srcWorkspaceName. * * @param sessionInfo * @param nodeId * @param srcWorkspaceName * @param bestEffort * @return an Iterator over the {@link NodeId}s of all nodes that * received a merge result of "fail" in the course of this operation. * @throws javax.jcr.NoSuchWorkspaceException * @throws javax.jcr.AccessDeniedException * @throws javax.jcr.MergeException * @throws javax.jcr.lock.LockException * @throws javax.jcr.InvalidItemStateException * @throws javax.jcr.RepositoryException * @see javax.jcr.version.VersionManager#merge(String, String, boolean, boolean) * @since JCR 2.0 */ public Iterator merge(SessionInfo sessionInfo, NodeId nodeId, String srcWorkspaceName, boolean bestEffort, boolean isShallow) throws NoSuchWorkspaceException, AccessDeniedException, MergeException, LockException, InvalidItemStateException, RepositoryException; /** * Resolve an existing merge conflict present with the node identified by * the given NodeId. * * @param sessionInfo * @param nodeId * @param mergeFailedIds The NodeIds remaining in the jcr:mergeFailed * REFERENCE property. The version id(s) to be resolved were removed from the * array and added to the predecessor ids in case of {@link Node#doneMerge(Version)}. * In case of a {@link Node#cancelMerge(Version)} the version id only gets * removed from the list. * @param predecessorIds The complete set of predecessor id including those * that have been added in order to resolve a merge conflict. * @throws javax.jcr.version.VersionException * @throws javax.jcr.InvalidItemStateException * @throws javax.jcr.UnsupportedRepositoryOperationException * @throws javax.jcr.RepositoryException * @see javax.jcr.Node#cancelMerge(javax.jcr.version.Version) * @see javax.jcr.Node#doneMerge(javax.jcr.version.Version) */ public void resolveMergeConflict(SessionInfo sessionInfo, NodeId nodeId, NodeId[] mergeFailedIds, NodeId[] predecessorIds) throws VersionException, InvalidItemStateException, UnsupportedRepositoryOperationException, RepositoryException; /** * Add the given version label in the persistent layer. * * @param sessionInfo * @param versionHistoryId NodeId identifying the version * history the version identified by versionId belongs to. * @param versionId NodeId identifying the version the * label belongs to. * @param label The label to be added. * @param moveLabel If the label is already assigned to a version within * the same version history this parameter has the following effect: If true * the label already present gets moved to be now be a label of the version * indicated by versionId. If false this method * fails and the label remains with the original version. * @throws javax.jcr.version.VersionException * @throws javax.jcr.RepositoryException * @see javax.jcr.version.VersionHistory#addVersionLabel(String, String, boolean) */ public void addVersionLabel(SessionInfo sessionInfo, NodeId versionHistoryId, NodeId versionId, Name label, boolean moveLabel) throws VersionException, RepositoryException; /** * Remove the given version label in the persistent layer. * * @param sessionInfo * @param versionHistoryId NodeId identifying the version * history the version identified by versionId belongs to. * @param versionId NodeId identifying the version the * label belongs to. * @param label The label to be removed. * @throws javax.jcr.version.VersionException * @throws javax.jcr.RepositoryException * @see javax.jcr.version.VersionHistory#removeVersionLabel(String) */ public void removeVersionLabel(SessionInfo sessionInfo, NodeId versionHistoryId, NodeId versionId, Name label) throws VersionException, RepositoryException; /** * Create a new activity. * * @param sessionInfo * @param title * @return the NodeId of the new activity node. * @throws javax.jcr.UnsupportedRepositoryOperationException * @throws javax.jcr.RepositoryException * @see javax.jcr.version.VersionManager#createActivity(String) * @since JCR 2.0 */ public NodeId createActivity(SessionInfo sessionInfo, String title) throws UnsupportedRepositoryOperationException, RepositoryException; /** * Removes the activity identified by the specified activityId. * * @param sessionInfo * @param activityId * @throws javax.jcr.UnsupportedRepositoryOperationException * @throws javax.jcr.RepositoryException * @see javax.jcr.version.VersionManager#removeActivity(Node) * @since JCR 2.0 */ public void removeActivity(SessionInfo sessionInfo, NodeId activityId) throws UnsupportedRepositoryOperationException, RepositoryException; /** * Merges the activity identified by the given activityId into * the workspace the specified sessionInfo has been created for. * * @param sessionInfo * @param activityId * @return an Iterator over the {@link NodeId}s of all nodes that * received a merge result of "fail" in the course of this operation. * @throws UnsupportedRepositoryOperationException * @throws RepositoryException */ public Iterator mergeActivity(SessionInfo sessionInfo, NodeId activityId) throws UnsupportedRepositoryOperationException, RepositoryException; /** * * @param sessionInfo * @param nodeId * @return * @throws UnsupportedRepositoryOperationException * @throws RepositoryException * @see javax.jcr.version.VersionManager#createConfiguration(String) */ public NodeId createConfiguration(SessionInfo sessionInfo, NodeId nodeId) throws UnsupportedRepositoryOperationException, RepositoryException; //----------------------------------------------------------< Searching >--- /** * Returns a String array identifying all query languages supported by this * SPI implementation. * * @param sessionInfo * @return String array identifying all query languages supported by this * SPI implementation. * @throws javax.jcr.RepositoryException * @see javax.jcr.query.QueryManager#getSupportedQueryLanguages() */ public String[] getSupportedQueryLanguages(SessionInfo sessionInfo) throws RepositoryException; /** * Checks if the query statement is valid according to the * specified query language and returns the bind variable * names found in the query statement. * * @param sessionInfo the session info. * @param statement the query statement to check. * @param language the query language. * @param namespaces the locally re-mapped namespace which may be used in * the query statement. * @return the bind variable names. * @throws InvalidQueryException if the query statement is invalid or the * language is not supported. * @throws RepositoryException if an error occurs while checking the * statement. * @see javax.jcr.query.QueryManager#createQuery(String, String) */ public String[] checkQueryStatement(SessionInfo sessionInfo, String statement, String language, Map namespaces) throws InvalidQueryException, RepositoryException; /** * Execute the given query statement with the specified query language. The * additional namespaces parameter provides a mapping of prefix * to namespace uri in order to be able to properly resolve prefix:localname * patterns present within the query statement. * * @param sessionInfo the session info that wants to execute the query. * @param statement the query statement to be execute. * @param language the query language used to parse the query * statement. * @param namespaces the locally re-mapped namespace which may be used in * the query statement. * @param limit The maximum result size or -1 is no * maximum is set. * @param offset The offset in the total result set or -1 * is no offset is set. * @param values A Map of name/value pairs collected upon calls to * {@link javax.jcr.query.Query#bindValue(String, * javax.jcr.Value)}. * @return The query info. * @throws RepositoryException if an error occurs. * @see javax.jcr.query.Query#execute() */ public QueryInfo executeQuery(SessionInfo sessionInfo, String statement, String language, Map namespaces, long limit, long offset, Map values) throws RepositoryException; //--------------------------------------------------------< Observation >--- /** * Creates an event filter. If the repository supports observation, the * filter created is based on the parameters available in {@link * javax.jcr.observation.ObservationManager#addEventListener}. *

* Note, that an SPI implementation may support observation even if * the corresponding {@link javax.jcr.Repository#OPTION_OBSERVATION_SUPPORTED repository descriptor} * does not return 'true'. * * @param sessionInfo the session info which requests an event filter. * @param eventTypes A combination of one or more event type constants * encoded as a bitmask. * @param absPath An absolute path. * @param isDeep A boolean. * @param uuid Array of jcr:uuid properties. * @param nodeTypeName Array of node type names. * @param noLocal A boolean. * @return the event filter instance with the given parameters. * @throws UnsupportedRepositoryOperationException if this SPI implementation * does not allow to create event filters. * @throws RepositoryException if an error occurs while creating the * EventFilter. * @see javax.jcr.observation.ObservationManager#addEventListener(javax.jcr.observation.EventListener, int, String, boolean, String[], String[], boolean) */ public EventFilter createEventFilter(SessionInfo sessionInfo, int eventTypes, Path absPath, boolean isDeep, String[] uuid, Name[] nodeTypeName, boolean noLocal) throws UnsupportedRepositoryOperationException, RepositoryException; /** * Creates a new {@link Subscription} for events with an initial set of * {@link EventFilter}s. The returned subscription must provide events from * the time when the subscription was created. If an empty array of filters * is passed no events will be available through the created subscription * unless the filters are later updated by calling * {@link RepositoryService#updateEventFilters(Subscription, EventFilter[])}. * * @param sessionInfo the session info. * @param filters the initial event filters for the subscription. * @return * @throws UnsupportedRepositoryOperationException * if this SPI implementation does not support * observation. * @throws RepositoryException if an error occurs while creating the * Subscription. */ public Subscription createSubscription(SessionInfo sessionInfo, EventFilter[] filters) throws UnsupportedRepositoryOperationException, RepositoryException; /** * Updates events filters on the subscription. When this method returns all * events that go through the passed subscription and have been generated * after this method call must be filtered using the passed * filters. *

* An implementation is required to accept at least event filter instances * created by {@link RepositoryService#createEventFilter}. Optionally an * implementation may also support event filters instanciated by the client * itself. An implementation may require special deployment in that case, * e.g. to make the event filter implementation class available to the * repository server. *

* Note on thread-safety: it is permissible to call this methods * while another thread is blocked in calling {@link * RepositoryService#getEvents(Subscription, long)} using the same * subscription instance as a parameter. * * @param subscription the subscription where the event filters are * applied. * @param filters the filters that are applied to the events as they * occurred on the repository. An event is included in an * event bundle if it is {@link EventFilter#accept(Event, * boolean) accept}ed by at least one of the supplied * filters. If an empty array is passed none of the potential * events are include in an event bundle. This allows a * client to skip or ignore events for a certain period of * time. * @throws RepositoryException if an error occurs while updating the event * filters. */ public void updateEventFilters(Subscription subscription, EventFilter[] filters) throws RepositoryException; /** * Retrieves the events that occurred since the last call to this method for * the passed subscription. *

* Note, that an SPI implementation may support observation even if the * corresponding {@link javax.jcr.Repository#OPTION_OBSERVATION_SUPPORTED * repository descriptor} does return 'false'. *

* An implementation should un-block a calling thread and let it return if * the associated subscription is disposed by another thread. * * @param subscription a subscription. * @param timeout a timeout in milliseconds to wait at most for an * event bundle. If timeout is up and no * event occurred meanwhile an empty array is returned. * @return an array of EventBundles representing the events * that occurred. * @throws RepositoryException if an error occurs while retrieving the * event bundles. * @throws InterruptedException if the calling thread is interrupted while * waiting for events within the specified * timeout. */ public EventBundle[] getEvents(Subscription subscription, long timeout) throws RepositoryException, InterruptedException; /** * Returns events from the EventJournal after a given point in * time. The returned event bundle may only contain events up to a given * time. In order to retrieve more events a client must call this method * again with the timestamp from the last event bundle. An empty bundle * indicates that there are no more events. * * @param sessionInfo the session info. * @param filter the event filter to apply. Please note: the * noLocal flag is ignored. * @param after retrieve events that occurred after the given * timestamp. * @return the event bundle. * @throws RepositoryException if an error occurs. * @throws UnsupportedRepositoryOperationException * if the underlying implementation does not * support event journaling. */ public EventBundle getEvents(SessionInfo sessionInfo, EventFilter filter, long after) throws RepositoryException, UnsupportedRepositoryOperationException; /** * Indicates that the passed subscription is no longer needed. *

* Note on thread-safety: it is permissible to call this methods * while another thread is blocked in calling {@link * RepositoryService#getEvents(Subscription, long)} using the same * subscription instance as a parameter. * * @throws RepositoryException if an error occurs while the subscription is * disposed. */ public void dispose(Subscription subscription) throws RepositoryException; //---------------------------------------------------------< Namespaces >--- /** * Retrieve all registered namespaces. The namespace to prefix mapping is * done using the prefix as key and the namespace as value in the Map. * * @param sessionInfo * @return * @throws javax.jcr.RepositoryException * @see javax.jcr.Workspace#getNamespaceRegistry() * @see javax.jcr.NamespaceRegistry#getPrefixes() * @see javax.jcr.NamespaceRegistry#getURIs() */ public Map getRegisteredNamespaces(SessionInfo sessionInfo) throws RepositoryException; /** * Returns the namespace URI for the given namespace prefix. * * @param sessionInfo the session info. * @param prefix a namespace prefix to resolve. * @return the namespace URI for the given namespace prefix. * @throws NamespaceException if prefix is not mapped to a namespace URI. * @throws RepositoryException if another error occurs. * @see javax.jcr.NamespaceRegistry#getURI(String) */ public String getNamespaceURI(SessionInfo sessionInfo, String prefix) throws NamespaceException, RepositoryException; /** * Returns the namespace prefix for the given namespace uri. * * @param sessionInfo the session info. * @param uri the namespace URI. * @return the namespace prefix. * @throws NamespaceException if the URI unknown. * @throws RepositoryException if another error occurs. * @see javax.jcr.NamespaceRegistry#getPrefix(String) */ public String getNamespacePrefix(SessionInfo sessionInfo, String uri) throws NamespaceException, RepositoryException; /** * Register a new namespace with the given prefix and uri. * * @param sessionInfo * @param prefix Prefix of the namespace to be registered. * @param uri Namespace URI to be registered. * @throws javax.jcr.NamespaceException * @throws javax.jcr.UnsupportedRepositoryOperationException * @throws javax.jcr.AccessDeniedException * @throws javax.jcr.RepositoryException * @see javax.jcr.NamespaceRegistry#registerNamespace(String, String) */ public void registerNamespace(SessionInfo sessionInfo, String prefix, String uri) throws NamespaceException, UnsupportedRepositoryOperationException, AccessDeniedException, RepositoryException; /** * Unregister the namespace identified by the given uri * * @param sessionInfo * @param uri Namespace URI to be unregistered. * @throws javax.jcr.NamespaceException * @throws javax.jcr.UnsupportedRepositoryOperationException * @throws javax.jcr.AccessDeniedException * @throws javax.jcr.RepositoryException * @see javax.jcr.NamespaceRegistry#unregisterNamespace(String) */ public void unregisterNamespace(SessionInfo sessionInfo, String uri) throws NamespaceException, UnsupportedRepositoryOperationException, AccessDeniedException, RepositoryException; //----------------------------------------------------------< NodeTypes >--- /** * Retrieve the QNodeTypeDefinitions of all registered nodetypes. * * @param sessionInfo * @return Iterator of {@link QNodeTypeDefinition}s. * @throws javax.jcr.RepositoryException * @see javax.jcr.Workspace#getNodeTypeManager() * @see javax.jcr.nodetype.NodeTypeManager#getAllNodeTypes() * @see javax.jcr.nodetype.NodeTypeManager#getMixinNodeTypes() * @see javax.jcr.nodetype.NodeTypeManager#getPrimaryNodeTypes() * @see javax.jcr.nodetype.NodeTypeManager#getNodeType(String) */ public Iterator getQNodeTypeDefinitions(SessionInfo sessionInfo) throws RepositoryException; /** * Retrieve QNodeTypeDefinitions for the given names. The * implementation is free to return additional definitions which will (probably) * be needed by the caller due to node type inheritance. The caller must be * able to deal with any kind of additional QNodeTypeDefinitions * present in the Iterator irrespective whether they have been * loaded before or not. * * @param sessionInfo * @param nodetypeNames names of node types to retrieve * @return {@link QNodeTypeDefinition} * @throws javax.jcr.nodetype.NoSuchNodeTypeException if for any of the given * names no QNodeTypeDefinition exists. * @throws javax.jcr.RepositoryException * @see javax.jcr.Workspace#getNodeTypeManager() * @see javax.jcr.nodetype.NodeTypeManager#getAllNodeTypes() * @see javax.jcr.nodetype.NodeTypeManager#getMixinNodeTypes() * @see javax.jcr.nodetype.NodeTypeManager#getPrimaryNodeTypes() * @see javax.jcr.nodetype.NodeTypeManager#getNodeType(String) */ public Iterator getQNodeTypeDefinitions(SessionInfo sessionInfo, Name[] nodetypeNames) throws RepositoryException; /** * Registers the node types with the specified QNodeTypeDefinitions. * If allowUpdate is true this method may also be * used to reregister existing node types with a modified definition, otherwise * this method will fail with NodeTypeExistsException if any of * the specified definition has the name of an already registered node type. * * @param sessionInfo * @param nodeTypeDefinitions * @param allowUpdate * @throws InvalidNodeTypeDefinitionException If any of the specified definitions * is invalid. * @throws NodeTypeExistsException If any of the specified definitions has the * name of an already registered node type and allowUpdate is false. * @throws UnsupportedRepositoryOperationException If registering node types * is not supported. * @throws RepositoryException If another error occurs. * @see javax.jcr.nodetype.NodeTypeManager#registerNodeTypes(javax.jcr.nodetype.NodeTypeDefinition[], boolean) */ public void registerNodeTypes(SessionInfo sessionInfo, QNodeTypeDefinition[] nodeTypeDefinitions, boolean allowUpdate) throws InvalidNodeTypeDefinitionException, NodeTypeExistsException, UnsupportedRepositoryOperationException, RepositoryException; /** * Unregisters the node types with the specified names. * * @param sessionInfo * @param nodeTypeNames * @throws UnsupportedRepositoryOperationException If unregistering node types * is not supported. * @throws NoSuchNodeTypeException If any of the specified names has no * corresponding registered node type. * @throws RepositoryException If another error occurs. * @see javax.jcr.nodetype.NodeTypeManager#unregisterNodeTypes(String[]) */ public void unregisterNodeTypes(SessionInfo sessionInfo, Name[] nodeTypeNames) throws UnsupportedRepositoryOperationException, NoSuchNodeTypeException, RepositoryException; //-----------------------------------------------< Workspace Management >--- /** * Create a new workspace with the specified name. If * srcWorkspaceName isn't null the content of * that workspace is 'cloned' to the new workspace as inital content, * otherwise an empty workspace will be created. * * @param sessionInfo * @param name The name of the new workspace. * @param srcWorkspaceName The name of the workspace from which the initial * content of the new workspace will be 'cloned'. * @throws AccessDeniedException * @throws UnsupportedRepositoryOperationException * @throws NoSuchWorkspaceException * @throws RepositoryException * @see javax.jcr.Workspace#createWorkspace(String) * @see javax.jcr.Workspace#createWorkspace(String, String) * @since JCR 2.0 */ public void createWorkspace(SessionInfo sessionInfo, String name, String srcWorkspaceName) throws AccessDeniedException, UnsupportedRepositoryOperationException, NoSuchWorkspaceException, RepositoryException; /** * Deletes the workspace with the specified name. * * @param sessionInfo * @param name The name of the workspace to be deleted. * @throws AccessDeniedException * @throws UnsupportedRepositoryOperationException * @throws NoSuchWorkspaceException * @throws RepositoryException * @see javax.jcr.Workspace#deleteWorkspace(String) * @since JCR 2.0 */ public void deleteWorkspace(SessionInfo sessionInfo, String name) throws AccessDeniedException, UnsupportedRepositoryOperationException, NoSuchWorkspaceException, RepositoryException; }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy