| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. 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.decorator; |
| |
| import java.io.InputStream; |
| import java.util.Calendar; |
| |
| import javax.jcr.AccessDeniedException; |
| import javax.jcr.InvalidItemStateException; |
| import javax.jcr.Item; |
| import javax.jcr.ItemExistsException; |
| import javax.jcr.ItemNotFoundException; |
| import javax.jcr.NoSuchWorkspaceException; |
| import javax.jcr.Node; |
| import javax.jcr.NodeIterator; |
| import javax.jcr.PathNotFoundException; |
| import javax.jcr.Property; |
| import javax.jcr.PropertyIterator; |
| import javax.jcr.RepositoryException; |
| import javax.jcr.Session; |
| import javax.jcr.UnsupportedRepositoryOperationException; |
| import javax.jcr.Value; |
| import javax.jcr.ValueFormatException; |
| import javax.jcr.MergeException; |
| import javax.jcr.lock.Lock; |
| import javax.jcr.lock.LockException; |
| import javax.jcr.nodetype.ConstraintViolationException; |
| import javax.jcr.nodetype.NoSuchNodeTypeException; |
| import javax.jcr.nodetype.NodeDefinition; |
| import javax.jcr.nodetype.NodeType; |
| import javax.jcr.version.Version; |
| import javax.jcr.version.VersionException; |
| import javax.jcr.version.VersionHistory; |
| |
| public class NodeDecorator extends ItemDecorator implements Node { |
| |
| protected Node node; |
| |
| public NodeDecorator(DecoratorFactory factory, Session session, Node node) { |
| super(factory, session, node); |
| this.node = node; |
| } |
| |
| /** |
| * Returns the underlying <code>Node</code> of the <code>node</code> |
| * that decorates it. Unwrapping <code>null</code> returns <code>null</code>. |
| * |
| * @param node decorates the underlying node. |
| * @return the underlying node. |
| * @throws IllegalStateException if <code>node</code> is not of type |
| * {@link NodeDecorator}. |
| */ |
| public static Node unwrap(Node node) { |
| if (node == null) { |
| return null; |
| } |
| if (node instanceof NodeDecorator) { |
| node = (Node) ((NodeDecorator) node).unwrap(); |
| } else { |
| throw new IllegalStateException("node is not of type NodeDecorator"); |
| } |
| return node; |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Node addNode(String name) throws ItemExistsException, |
| PathNotFoundException, VersionException, |
| ConstraintViolationException, LockException, RepositoryException { |
| Node child = node.addNode(name); |
| return factory.getNodeDecorator(session, child); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Node addNode(String name, String type) throws ItemExistsException, |
| PathNotFoundException, NoSuchNodeTypeException, LockException, |
| VersionException, ConstraintViolationException, RepositoryException { |
| Node child = node.addNode(name, type); |
| return factory.getNodeDecorator(session, child); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public void orderBefore(String srcChildRelPath, String destChildRelPath) |
| throws UnsupportedRepositoryOperationException, VersionException, |
| ConstraintViolationException, ItemNotFoundException, |
| LockException, RepositoryException { |
| node.orderBefore(srcChildRelPath, destChildRelPath); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Property setProperty(String name, Value value) |
| throws ValueFormatException, VersionException, LockException, |
| ConstraintViolationException, RepositoryException { |
| Property prop = node.setProperty(name, value); |
| return factory.getPropertyDecorator(session, prop); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Property setProperty(String name, Value value, int type) |
| throws ValueFormatException, VersionException, LockException, |
| ConstraintViolationException, RepositoryException { |
| Property prop = node.setProperty(name, value, type); |
| return factory.getPropertyDecorator(session, prop); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Property setProperty(String name, Value[] values) |
| throws ValueFormatException, VersionException, LockException, |
| ConstraintViolationException, RepositoryException { |
| Property prop = node.setProperty(name, values); |
| return factory.getPropertyDecorator(session, prop); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Property setProperty(String name, Value[] values, int type) |
| throws ValueFormatException, VersionException, LockException, |
| ConstraintViolationException, RepositoryException { |
| Property prop = node.setProperty(name, values, type); |
| return factory.getPropertyDecorator(session, prop); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Property setProperty(String name, String[] values) |
| throws ValueFormatException, VersionException, LockException, |
| ConstraintViolationException, RepositoryException { |
| Property prop = node.setProperty(name, values); |
| return factory.getPropertyDecorator(session, prop); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Property setProperty(String name, String[] values, int type) |
| throws ValueFormatException, VersionException, LockException, |
| ConstraintViolationException, RepositoryException { |
| Property prop = node.setProperty(name, values, type); |
| return factory.getPropertyDecorator(session, prop); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Property setProperty(String name, String value) |
| throws ValueFormatException, VersionException, LockException, |
| ConstraintViolationException, RepositoryException { |
| Property prop = node.setProperty(name, value); |
| return factory.getPropertyDecorator(session, prop); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Property setProperty(String name, String value, int type) |
| throws ValueFormatException, VersionException, LockException, |
| ConstraintViolationException, RepositoryException { |
| Property prop = node.setProperty(name, value, type); |
| return factory.getPropertyDecorator(session, prop); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Property setProperty(String name, InputStream value) |
| throws ValueFormatException, VersionException, LockException, |
| ConstraintViolationException, RepositoryException { |
| Property prop = node.setProperty(name, value); |
| return factory.getPropertyDecorator(session, prop); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Property setProperty(String name, boolean value) |
| throws ValueFormatException, VersionException, LockException, |
| ConstraintViolationException, RepositoryException { |
| Property prop = node.setProperty(name, value); |
| return factory.getPropertyDecorator(session, prop); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Property setProperty(String name, double value) |
| throws ValueFormatException, VersionException, LockException, |
| ConstraintViolationException, RepositoryException { |
| Property prop = node.setProperty(name, value); |
| return factory.getPropertyDecorator(session, prop); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Property setProperty(String name, long value) |
| throws ValueFormatException, VersionException, LockException, |
| ConstraintViolationException, RepositoryException { |
| Property prop = node.setProperty(name, value); |
| return factory.getPropertyDecorator(session, prop); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Property setProperty(String name, Calendar value) |
| throws ValueFormatException, VersionException, LockException, |
| ConstraintViolationException, RepositoryException { |
| Property prop = node.setProperty(name, value); |
| return factory.getPropertyDecorator(session, prop); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Property setProperty(String name, Node value) |
| throws ValueFormatException, VersionException, LockException, |
| ConstraintViolationException, RepositoryException { |
| Property prop = node.setProperty(name, NodeDecorator.unwrap(value)); |
| return factory.getPropertyDecorator(session, prop); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Node getNode(String relPath) throws PathNotFoundException, RepositoryException { |
| Node n = node.getNode(relPath); |
| return factory.getNodeDecorator(session, n); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public NodeIterator getNodes() throws RepositoryException { |
| return new DecoratingNodeIterator(factory, session, node.getNodes()); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public NodeIterator getNodes(String namePattern) |
| throws RepositoryException { |
| return new DecoratingNodeIterator(factory, session, node.getNodes(namePattern)); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Property getProperty(String relPath) |
| throws PathNotFoundException, RepositoryException { |
| Property prop = node.getProperty(relPath); |
| return factory.getPropertyDecorator(session, prop); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public PropertyIterator getProperties() throws RepositoryException { |
| return new DecoratingPropertyIterator(factory, session, node.getProperties()); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public PropertyIterator getProperties(String namePattern) |
| throws RepositoryException { |
| return new DecoratingPropertyIterator(factory, session, node.getProperties(namePattern)); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Item getPrimaryItem() throws ItemNotFoundException, |
| RepositoryException { |
| return factory.getItemDecorator(session, node.getPrimaryItem()); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public String getUUID() throws UnsupportedRepositoryOperationException, |
| RepositoryException { |
| return node.getUUID(); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public int getIndex() throws RepositoryException { |
| return node.getIndex(); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public PropertyIterator getReferences() throws RepositoryException { |
| return new DecoratingPropertyIterator(factory, session, node.getReferences()); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public boolean hasNode(String relPath) throws RepositoryException { |
| return node.hasNode(relPath); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public boolean hasProperty(String relPath) throws RepositoryException { |
| return node.hasProperty(relPath); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public boolean hasNodes() throws RepositoryException { |
| return node.hasNodes(); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public boolean hasProperties() throws RepositoryException { |
| return node.hasProperties(); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public NodeType getPrimaryNodeType() throws RepositoryException { |
| return node.getPrimaryNodeType(); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public NodeType[] getMixinNodeTypes() throws RepositoryException { |
| return node.getMixinNodeTypes(); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public boolean isNodeType(String nodeTypeName) throws RepositoryException { |
| return node.isNodeType(nodeTypeName); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public void addMixin(String mixinName) |
| throws NoSuchNodeTypeException, VersionException, |
| ConstraintViolationException, LockException, RepositoryException { |
| node.addMixin(mixinName); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public void removeMixin(String mixinName) |
| throws NoSuchNodeTypeException, VersionException, |
| ConstraintViolationException, LockException, RepositoryException { |
| node.removeMixin(mixinName); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public boolean canAddMixin(String mixinName) |
| throws NoSuchNodeTypeException, RepositoryException { |
| return node.canAddMixin(mixinName); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public NodeDefinition getDefinition() throws RepositoryException { |
| return node.getDefinition(); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Version checkin() throws VersionException, |
| UnsupportedRepositoryOperationException, InvalidItemStateException, |
| LockException, RepositoryException { |
| Version version = node.checkin(); |
| return factory.getVersionDecorator(session, version); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public void checkout() throws UnsupportedRepositoryOperationException, |
| LockException, RepositoryException { |
| node.checkout(); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public void doneMerge(Version version) |
| throws VersionException, InvalidItemStateException, |
| UnsupportedRepositoryOperationException, RepositoryException { |
| node.doneMerge(VersionDecorator.unwrap(version)); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public void cancelMerge(Version version) |
| throws VersionException, InvalidItemStateException, |
| UnsupportedRepositoryOperationException, RepositoryException { |
| node.cancelMerge(VersionDecorator.unwrap(version)); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public void update(String srcWorkspaceName) |
| throws NoSuchWorkspaceException, AccessDeniedException, |
| LockException, InvalidItemStateException, RepositoryException { |
| node.update(srcWorkspaceName); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public NodeIterator merge(String srcWorkspace, boolean bestEffort) |
| throws NoSuchWorkspaceException, AccessDeniedException, |
| MergeException, LockException, InvalidItemStateException, |
| RepositoryException { |
| NodeIterator nodes = node.merge(srcWorkspace, bestEffort); |
| return new DecoratingNodeIterator(factory, session, nodes); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public String getCorrespondingNodePath(String workspaceName) |
| throws ItemNotFoundException, NoSuchWorkspaceException, |
| AccessDeniedException, RepositoryException { |
| return node.getCorrespondingNodePath(workspaceName); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public boolean isCheckedOut() throws RepositoryException { |
| return node.isCheckedOut(); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public void restore(String versionName, boolean removeExisting) |
| throws VersionException, ItemExistsException, |
| UnsupportedRepositoryOperationException, LockException, |
| InvalidItemStateException, RepositoryException { |
| node.restore(versionName, removeExisting); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public void restore(Version version, boolean removeExisting) |
| throws VersionException, ItemExistsException, |
| UnsupportedRepositoryOperationException, LockException, |
| RepositoryException { |
| node.restore(VersionDecorator.unwrap(version), removeExisting); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public void restore(Version version, |
| String relPath, |
| boolean removeExisting) |
| throws PathNotFoundException, ItemExistsException, |
| VersionException, ConstraintViolationException, |
| UnsupportedRepositoryOperationException, LockException, |
| InvalidItemStateException, RepositoryException { |
| node.restore(VersionDecorator.unwrap(version), relPath, removeExisting); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public void restoreByLabel(String versionLabel, boolean removeExisting) |
| throws VersionException, ItemExistsException, |
| UnsupportedRepositoryOperationException, LockException, |
| InvalidItemStateException, RepositoryException { |
| node.restoreByLabel(versionLabel, removeExisting); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public VersionHistory getVersionHistory() |
| throws UnsupportedRepositoryOperationException, RepositoryException { |
| VersionHistory hist = node.getVersionHistory(); |
| return factory.getVersionHistoryDecorator(session, hist); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Version getBaseVersion() |
| throws UnsupportedRepositoryOperationException, RepositoryException { |
| return factory.getVersionDecorator(session, node.getBaseVersion()); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Lock lock(boolean isDeep, boolean isSessionScoped) |
| throws UnsupportedRepositoryOperationException, LockException, |
| AccessDeniedException, InvalidItemStateException, |
| RepositoryException { |
| Lock lock = node.lock(isDeep, isSessionScoped); |
| return factory.getLockDecorator(session, lock); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public Lock getLock() throws UnsupportedRepositoryOperationException, |
| LockException, AccessDeniedException, RepositoryException { |
| Lock lock = node.getLock(); |
| return factory.getLockDecorator(session, lock); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public void unlock() throws UnsupportedRepositoryOperationException, |
| LockException, AccessDeniedException, InvalidItemStateException, |
| RepositoryException { |
| node.unlock(); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public boolean holdsLock() throws RepositoryException { |
| return node.holdsLock(); |
| } |
| |
| /** |
| * @inheritDoc |
| */ |
| public boolean isLocked() throws RepositoryException { |
| return node.isLocked(); |
| } |
| } |