| /* |
| * 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 javax.jcr.ItemExistsException; |
| import javax.jcr.PathNotFoundException; |
| import javax.jcr.AccessDeniedException; |
| import javax.jcr.UnsupportedRepositoryOperationException; |
| import javax.jcr.RepositoryException; |
| import javax.jcr.ValueFormatException; |
| import javax.jcr.lock.LockException; |
| import javax.jcr.nodetype.ConstraintViolationException; |
| import javax.jcr.version.VersionException; |
| |
| /** |
| * The <code>Batch</code> defines an ordered list of of operations that must be |
| * executed at once on the persistent layer. If any of the modifications added |
| * to the batch fails, none of the other changes must be persisted, thus leaving |
| * the persistent layer unaffected. |
| * <p> |
| * The <code>Batch</code> object is obtained by calling |
| * {@link RepositoryService#createBatch(SessionInfo,ItemId)}. The following |
| * methods can then be called on the returned <code>Batch</code> object to queue |
| * the corresponding operations: |
| * <ul> |
| * <li>addNode,</li> |
| * <li>addProperty,</li> |
| * <li>setValue,</li> |
| * <li>remove,</li> |
| * <li>reorderNodes,</li> |
| * <li>setMixins,</li> |
| * <li>move</li> |
| * </ul> |
| * The operations collected in a Batch are persisted upon a successful call to |
| * {@link RepositoryService#submit(Batch)}. The operations queued in the batch |
| * must be validated as a single unit and (if validation succeeds) applied to |
| * the persistent layer. If validation fails submitting the <code>Batch</code> |
| * is aborted and an exception is thrown. |
| * <p> |
| * The Batch mechanism is required because there are sets of operations for |
| * which the following are both true: |
| * <ul> |
| * <li>The set can only be validated and put into effect as a single logical unit.<br> |
| * For example, adding mutually referring reference properties.</li> |
| * <li>The set contains operations that can only be validated on the persistent |
| * layer.<br>For example, operations that require a referential integrity check.</li> |
| * </ul> |
| * In addition the <code>Batch</code> mechanism is desirable in order to |
| * minimize calls to the persistent layer, which enables client-server |
| * implementations to reduce the number of network roundtrips. |
| * <p> |
| * Since the batch records the delta of pending changes within the scope of |
| * an {@link javax.jcr.Item#save()} (or a {@link javax.jcr.Session#save()} it is |
| * intended to be constructed upon save (not before) and then submitted to the |
| * persistent layer as a single logical operation (see above). |
| * <p> |
| * Note however, that methods of the JCR API that have immediate effect on the |
| * persistent storage have to call that storage, validate and return. The batch |
| * does not play a role in these operations, instead they are covered by the |
| * {@link RepositoryService}. |
| */ |
| public interface Batch { |
| |
| /** |
| * Add a new node to the persistent layer. |
| * |
| * @param parentId NodeId identifying the parent node. |
| * @param nodeName Name of the node to be created. |
| * @param nodetypeName Primary node type name of the node to be created. |
| * @param uuid Value for the jcr:uuid property of the node to be created or |
| * <code>null</code>. If due to an import the uuid of the resulting node is |
| * already defined, it must be passed as separate uuid parameter, indicating |
| * a binding value for the server. Otherwise the uuid must be <code>null</code>. |
| * @throws javax.jcr.ItemExistsException |
| * @throws javax.jcr.PathNotFoundException |
| * @throws javax.jcr.version.VersionException |
| * @throws javax.jcr.nodetype.ConstraintViolationException |
| * @throws javax.jcr.nodetype.NoSuchNodeTypeException |
| * @throws javax.jcr.lock.LockException |
| * @throws javax.jcr.AccessDeniedException |
| * @throws javax.jcr.UnsupportedRepositoryOperationException |
| * @throws javax.jcr.RepositoryException |
| * @see javax.jcr.Node#addNode(String) |
| * @see javax.jcr.Node#addNode(String, String) |
| * @see javax.jcr.Session#importXML(String, java.io.InputStream, int) |
| * @see javax.jcr.query.Query#storeAsNode(String) |
| */ |
| public void addNode(NodeId parentId, Name nodeName, Name nodetypeName, String uuid) throws RepositoryException; |
| |
| /** |
| * Add a new property to the persistent layer. |
| * <p> |
| * Note: this call should succeed in case the property already exists. |
| * |
| * @param parentId NodeId identifying the parent node. |
| * @param propertyName Name of the property to be created. |
| * @param value The value of the property to be created. |
| * @throws ValueFormatException |
| * @throws VersionException |
| * @throws LockException |
| * @throws ConstraintViolationException |
| * @throws PathNotFoundException |
| * @throws ItemExistsException |
| * @throws AccessDeniedException |
| * @throws UnsupportedRepositoryOperationException |
| * @throws RepositoryException |
| * @see javax.jcr.Node#setProperty(String, javax.jcr.Value) |
| * @see javax.jcr.Node#setProperty(String, javax.jcr.Value, int) |
| * @see javax.jcr.Node#setProperty(String, String) |
| * @see javax.jcr.Node#setProperty(String, String, int) |
| * @see javax.jcr.Node#setProperty(String, java.util.Calendar) |
| * @see javax.jcr.Node#setProperty(String, boolean) |
| * @see javax.jcr.Node#setProperty(String, double) |
| * @see javax.jcr.Node#setProperty(String, long) |
| * @see javax.jcr.Node#setProperty(String, javax.jcr.Node) |
| * @see javax.jcr.Session#importXML(String, java.io.InputStream, int) |
| * @see javax.jcr.query.Query#storeAsNode(String) |
| */ |
| public void addProperty(NodeId parentId, Name propertyName, QValue value) throws ValueFormatException, VersionException, LockException, ConstraintViolationException, PathNotFoundException, ItemExistsException, AccessDeniedException, UnsupportedRepositoryOperationException, RepositoryException; |
| |
| /** |
| * Add a new multi-valued property to the persistent layer. |
| * <p> |
| * Note: this call should succeed in case the property already exists. |
| * |
| * @param parentId NodeId identifying the parent node. |
| * @param propertyName Name of the property to be created. |
| * @param values The values of the property to be created. |
| * @throws javax.jcr.ValueFormatException |
| * @throws javax.jcr.version.VersionException |
| * @throws javax.jcr.lock.LockException |
| * @throws javax.jcr.nodetype.ConstraintViolationException |
| * @throws javax.jcr.PathNotFoundException |
| * @throws javax.jcr.ItemExistsException |
| * @throws javax.jcr.AccessDeniedException |
| * @throws javax.jcr.UnsupportedRepositoryOperationException |
| * @throws javax.jcr.RepositoryException |
| * @see javax.jcr.Node#setProperty(String, javax.jcr.Value[]) |
| * @see javax.jcr.Node#setProperty(String, javax.jcr.Value[], int) |
| * @see javax.jcr.Node#setProperty(String, String[]) |
| * @see javax.jcr.Node#setProperty(String, String[], int) |
| * @see javax.jcr.Session#importXML(String, java.io.InputStream, int) |
| */ |
| public void addProperty(NodeId parentId, Name propertyName, QValue[] values) throws ValueFormatException, VersionException, LockException, ConstraintViolationException, PathNotFoundException, ItemExistsException, AccessDeniedException, UnsupportedRepositoryOperationException, RepositoryException; |
| |
| /** |
| * Modify the value of an existing property. Note that in contrast to |
| * the JCR API this method should not accept a <code>null</code> value. |
| * Removing a property is achieved by calling {@link #remove(ItemId)}. |
| * |
| * @param propertyId PropertyId identifying the property to be modified. |
| * @param value The new value. |
| * @throws ValueFormatException |
| * @throws VersionException |
| * @throws LockException |
| * @throws ConstraintViolationException |
| * @throws AccessDeniedException |
| * @throws UnsupportedRepositoryOperationException |
| * @throws RepositoryException |
| * @see javax.jcr.Property#setValue(javax.jcr.Value) |
| * @see javax.jcr.Property#setValue(String) |
| * @see javax.jcr.Property#setValue(long) |
| * @see javax.jcr.Property#setValue(double) |
| * @see javax.jcr.Property#setValue(java.util.Calendar) |
| * @see javax.jcr.Property#setValue(boolean) |
| * @see javax.jcr.Property#setValue(javax.jcr.Node) |
| */ |
| public void setValue(PropertyId propertyId, QValue value) throws RepositoryException; |
| |
| /** |
| * Modify the value of an existing, multi-valued property. Note that in |
| * contrast to the JCR API this method should not accept a <code>null</code> |
| * value. Removing a property is achieved by calling {@link #remove(ItemId)}. |
| * |
| * @param propertyId PropertyId identifying the property to be modified. |
| * @param values The new values. |
| * @throws javax.jcr.ValueFormatException |
| * @throws javax.jcr.version.VersionException |
| * @throws javax.jcr.lock.LockException |
| * @throws javax.jcr.nodetype.ConstraintViolationException |
| * @throws javax.jcr.AccessDeniedException |
| * @throws javax.jcr.UnsupportedRepositoryOperationException |
| * @throws javax.jcr.RepositoryException |
| * @see javax.jcr.Property#setValue(javax.jcr.Value[]) |
| * @see javax.jcr.Property#setValue(String[]) |
| */ |
| public void setValue(PropertyId propertyId, QValue[] values) throws RepositoryException; |
| |
| /** |
| * Remove an existing item. |
| * |
| * @param itemId ItemId identifying the item to be removed. |
| * @throws javax.jcr.version.VersionException |
| * @throws javax.jcr.lock.LockException |
| * @throws javax.jcr.nodetype.ConstraintViolationException |
| * @throws javax.jcr.AccessDeniedException |
| * @throws javax.jcr.UnsupportedRepositoryOperationException |
| * @throws javax.jcr.RepositoryException |
| * @see javax.jcr.Item#remove() |
| */ |
| public void remove(ItemId itemId) throws RepositoryException; |
| |
| /** |
| * Modify the order of the child nodes identified by the given |
| * <code>NodeId</code>s. |
| * |
| * @param parentId NodeId identifying the parent node. |
| * @param srcNodeId NodeId identifying the node to be reordered. |
| * @param beforeNodeId NodeId identifying the child node, before which the |
| * source node must be placed. |
| * @throws javax.jcr.UnsupportedRepositoryOperationException |
| * @throws javax.jcr.version.VersionException |
| * @throws javax.jcr.nodetype.ConstraintViolationException |
| * @throws javax.jcr.ItemNotFoundException |
| * @throws javax.jcr.lock.LockException |
| * @throws javax.jcr.AccessDeniedException |
| * @throws javax.jcr.RepositoryException |
| * @see javax.jcr.Node#orderBefore(String, String) |
| */ |
| public void reorderNodes(NodeId parentId, NodeId srcNodeId, NodeId beforeNodeId) throws RepositoryException; |
| |
| /** |
| * Modify the set of mixin node types present on the node identified by the |
| * given id. |
| * |
| * @param nodeId NodeId identifying the node to be modified. |
| * @param mixinNodeTypeNames The new set of mixin types. Compared to the |
| * previous values this may result in both adding and/or removing mixin types. |
| * @throws javax.jcr.nodetype.NoSuchNodeTypeException |
| * @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.Node#addMixin(String) |
| * @see javax.jcr.Node#removeMixin(String) |
| */ |
| public void setMixins(NodeId nodeId, Name[] mixinNodeTypeNames) throws RepositoryException; |
| |
| /** |
| * Change the primary type of the node identified by the given <code>nodeId</code>. |
| * |
| * @param nodeId NodeId identifying the node to be modified. |
| * @param primaryNodeTypeName |
| * @throws RepositoryException |
| * @see javax.jcr.Node#setPrimaryType(String) |
| */ |
| public void setPrimaryType(NodeId nodeId, Name primaryNodeTypeName) throws RepositoryException; |
| |
| /** |
| * Move the node identified by the given <code>srcNodeId</code> to the |
| * new parent identified by <code>destParentNodeId</code> and change its |
| * name to <code>destName</code>. |
| * |
| * @param srcNodeId NodeId identifying the node to be moved. |
| * @param destParentNodeId NodeId identifying the new parent. |
| * @param destName The new name of the moved node. |
| * @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.Session#move(String, String) |
| */ |
| public void move(NodeId srcNodeId, NodeId destParentNodeId, Name destName) throws RepositoryException; |
| |
| /** |
| * Add a new content tree to the persistent layer. |
| * |
| * @param parentId |
| * @param contentTree |
| * @throws RepositoryException |
| */ |
| public void setTree(NodeId parentId, Tree contentTree) throws RepositoryException; |
| } |