You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2004/10/25 19:49:43 UTC
svn commit: rev 55516 - in incubator/jackrabbit/trunk: lib src/java/org/apache/jackrabbit/core src/java/org/apache/jackrabbit/core/jndi src/java/org/apache/jackrabbit/core/nodetype src/java/org/apache/jackrabbit/core/observation src/java/org/apache/jackrabbit/core/search/lucene src/java/org/apache/jackrabbit/core/state/tx src/java/org/apache/jackrabbit/core/version src/java/org/apache/jackrabbit/core/xml src/test/org/apache/jackrabbit/test src/test/org/apache/jackrabbit/test/observation
Author: stefan
Date: Mon Oct 25 10:49:43 2004
New Revision: 55516
Added:
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/AccessManager.java (contents, props changed)
Removed:
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/AbstractAccessManager.java
Modified:
incubator/jackrabbit/trunk/lib/jcr.jar
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/AccessManagerImpl.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ItemImpl.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ItemManager.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/NodeImpl.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/PropertyImpl.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/RepositoryImpl.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SearchManager.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SessionImpl.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SystemSession.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/Test.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/WorkspaceImpl.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/jndi/BindableRepository.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeImpl.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/PropertyDefImpl.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/observation/EventConsumer.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/observation/EventImpl.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/observation/EventState.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/observation/ObservationManagerFactory.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/search/lucene/QueryResultImpl.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/tx/XASessionImpl.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/NodeWrapper.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionImpl.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/AbstractSAXEventGenerator.java
incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/AbstractJCRTest.java
incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/AbstractObservationTest.java
incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/NodeAddedTest.java
incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/NodeRemovedTest.java
incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/PropertyAddedTest.java
incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/PropertyChangedTest.java
incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/PropertyRemovedTest.java
Log:
migrating to v0.15 of the jsr 170 spec
Modified: incubator/jackrabbit/trunk/lib/jcr.jar
==============================================================================
Binary files. No diff available.
Added: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/AccessManager.java
==============================================================================
--- (empty file)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/AccessManager.java Mon Oct 25 10:49:43 2004
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * Licensed 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.core;
+
+import javax.jcr.AccessDeniedException;
+import javax.jcr.RepositoryException;
+import javax.jcr.ItemNotFoundException;
+
+/**
+ * The <code>AccessManager</code> can be queried to determines whether permission
+ * is granted to perform a specific action on a specific item.
+ */
+public interface AccessManager {
+
+ /** READ permission constant */
+ public static final int READ = 1;
+ /** WRITE permission constant */
+ public static final int WRITE = 2;
+
+ /**
+ * Determines whether the specified <code>permissions</code> are granted
+ * on the item with the specified <code>id</code> (i.e. the <i>target</i> item).
+ *
+ * @param id the id of the target item
+ * @param permissions A combination of one or more of the following constants
+ * encoded as a bitmask value:
+ * <ul>
+ * <li><code>READ</code></li>
+ * <li><code>WRITE</code></li>
+ * </ul>
+ *
+ * @throws AccessDeniedException if permission is denied
+ * @throws ItemNotFoundException if the target item does not exist
+ * @throws RepositoryException it an error occurs
+ */
+ public void checkPermission(ItemId id, int permissions)
+ throws AccessDeniedException, ItemNotFoundException, RepositoryException;
+
+ /**
+ * Determines whether the specified <code>permissions</code> are granted
+ * on the item with the specified <code>id</code> (i.e. the <i>target</i> item).
+ *
+ * @param id the id of the target item
+ * @param permissions A combination of one or more of the following constants
+ * @return <code>true</code> if permission is granted; otherwise <code>false</code>
+ * @throws ItemNotFoundException if the target item does not exist
+ * @throws RepositoryException it an error occurs
+ */
+ public boolean isGranted(ItemId id, int permissions)
+ throws ItemNotFoundException, RepositoryException;
+}
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/AccessManagerImpl.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/AccessManagerImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/AccessManagerImpl.java Mon Oct 25 10:49:43 2004
@@ -17,72 +17,47 @@
import org.apache.log4j.Logger;
+import javax.jcr.AccessDeniedException;
import javax.jcr.Credentials;
-import javax.jcr.ItemNotFoundException;
-import javax.jcr.PathNotFoundException;
import javax.jcr.RepositoryException;
-import javax.jcr.access.AccessManager;
+import javax.jcr.ItemNotFoundException;
/**
* <code>AccessManagerImpl</code> ...
*/
-public class AccessManagerImpl extends AbstractAccessManager {
+public class AccessManagerImpl implements AccessManager {
private static Logger log = Logger.getLogger(AccessManagerImpl.class);
+ /** hierarchy manager used for ACL-based access control model */
protected final HierarchyManager hierMgr;
- protected final NamespaceResolver nsResolver;
/**
* Package private constructor
*
* @param credentials
* @param hierMgr
- * @param nsReg
*/
- AccessManagerImpl(Credentials credentials, HierarchyManager hierMgr, NamespaceResolver nsReg) {
+ AccessManagerImpl(Credentials credentials, HierarchyManager hierMgr) {
this.hierMgr = hierMgr;
- this.nsResolver = nsReg;
- }
-
- /**
- * Copy constructor
- */
- AccessManagerImpl(AccessManagerImpl other) {
- this.hierMgr = other.hierMgr;
- this.nsResolver = other.nsResolver;
- }
-
- /**
- * @param id
- * @param permissions
- * @return
- */
- public boolean isGranted(ItemId id, long permissions) throws ItemNotFoundException, RepositoryException {
- return (getPermissions(id) & permissions) == permissions;
}
+ //--------------------------------------------------------< AccessManager >
/**
- * @param id
- * @return
+ * @see AccessManager#checkPermission(ItemId, int)
*/
- public long getPermissions(ItemId id) throws ItemNotFoundException, RepositoryException {
- // @todo implement resource-based access control
-
- return PermissionImpl.ALL_VALUES;
+ public void checkPermission(ItemId id, int permissions)
+ throws AccessDeniedException, ItemNotFoundException,
+ RepositoryException {
+ // @todo implement access control
}
- //--------------------------------------------------------< AccessManager >
/**
- * @see AccessManager#getPermissions(String)
+ * @see AccessManager#isGranted(ItemId, int)
*/
- public long getPermissions(String absPath) throws PathNotFoundException, RepositoryException {
- try {
- return getPermissions(hierMgr.resolvePath(Path.create(absPath, nsResolver, true)));
- } catch (MalformedPathException mpe) {
- String msg = "failed to check permissions for " + absPath;
- log.warn(msg, mpe);
- throw new RepositoryException(msg, mpe);
- }
+ public boolean isGranted(ItemId id, int permissions)
+ throws ItemNotFoundException, RepositoryException {
+ // @todo implement access control
+ return true;
}
}
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ItemImpl.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ItemImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ItemImpl.java Mon Oct 25 10:49:43 2004
@@ -28,13 +28,12 @@
import org.apache.log4j.Logger;
import javax.jcr.*;
-import javax.jcr.access.AccessDeniedException;
-import javax.jcr.access.Permission;
import javax.jcr.lock.LockException;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.nodetype.NodeDef;
import javax.jcr.nodetype.NodeType;
import javax.jcr.nodetype.PropertyDef;
+import javax.jcr.version.VersionException;
import javax.jcr.version.VersionHistory;
import java.util.*;
@@ -449,13 +448,13 @@
* - if it is 'new', check that its node type satisfies the
* 'required node type' constraint specified in its definition
* - if new child nodes have been added to the node in question,
- * check the ADD_NODE permission
+ * check the WRITE permission
* - if child items have been removed from the node in question,
- * check the REMOVE_ITEM permission
+ * check the WRITE permission
* - check if 'mandatory' child items exist
*
* for every transient property:
- * - check the SET_PROPERTY permission
+ * - check the WRITE permission
* - check if the property value satisfies the value constraints specified
* in the property's definition
*
@@ -496,8 +495,8 @@
// check child removals
if (!nodeState.getRemovedChildNodeEntries().isEmpty() || !nodeState.getRemovedPropertyEntries().isEmpty()) {
- // check REMOVE_ITEM permission
- if (!accessMgr.isGranted(id, Permission.REMOVE_ITEM)) {
+ // check WRITE permission
+ if (!accessMgr.isGranted(id, AccessManager.WRITE)) {
String msg = node.safeGetJCRPath() + ": not allowed to remove a child item";
log.error(msg);
throw new AccessDeniedException(msg);
@@ -515,8 +514,8 @@
Node childNode = (Node) itemMgr.getItem(new NodeId(entry.getUUID()));
NodeDef childDef = childNode.getDefinition();
if (!childDef.isAutoCreate()) {
- // check ADD_NODE permission
- if (!accessMgr.isGranted(id, Permission.ADD_NODE)) {
+ // check WRITE permission
+ if (!accessMgr.isGranted(id, AccessManager.WRITE)) {
String msg = node.safeGetJCRPath() + ": not allowed to add node " + childNode.getName();
log.error(msg);
throw new AccessDeniedException(msg);
@@ -552,12 +551,20 @@
PropertyDefImpl def = (PropertyDefImpl) prop.getDefinition();
if (!def.isAutoCreate()) {
- // check SET_PROPERTY permission
- if (!accessMgr.isGranted(nodeId, Permission.SET_PROPERTY)) {
+ // check WRITE permission on property
+ if (!accessMgr.isGranted(propId, AccessManager.WRITE)) {
String msg = itemMgr.safeGetJCRPath(nodeId) + ": not allowed to set property " + prop.getName();
log.error(msg);
throw new AccessDeniedException(msg);
}
+ if (propState.getOverlayedState() == null) {
+ // property has been added, check WRITE permission on parent
+ if (!accessMgr.isGranted(nodeId, AccessManager.WRITE)) {
+ String msg = itemMgr.safeGetJCRPath(nodeId) + ": not allowed to set property " + prop.getName();
+ log.error(msg);
+ throw new AccessDeniedException(msg);
+ }
+ }
}
// check value constraints
@@ -565,7 +572,7 @@
// as those are set by the implementation only, i.e. they
// cannot be set by the user through the api)
if (!def.isProtected()) {
- if (def.getValueConstraint() != null) {
+ if (def.getValueConstraints() != null) {
InternalValue[] values = propState.getValues();
try {
NodeTypeImpl.checkSetPropertyValueConstraints(def, values);
@@ -586,7 +593,7 @@
private void checkReferences(Iterator iterDirty, Iterator iterRemoved,
ReferenceManager refMgr)
- throws ConstraintViolationException, RepositoryException {
+ throws ReferentialIntegrityException, RepositoryException {
// map of target (node) id's and modified NodeReferences objects
HashMap dirtyNodeRefs = new HashMap();
@@ -628,7 +635,7 @@
String msg = itemMgr.safeGetJCRPath(propState.getId())
+ ": target node of REFERENCE property does not exist";
log.warn(msg);
- throw new ConstraintViolationException(msg);
+ throw new ReferentialIntegrityException(msg);
}
// target is a new (unsaved) node; make sure that it is
// within the scope of the current save operation
@@ -640,7 +647,7 @@
String msg = itemMgr.safeGetJCRPath(propState.getId())
+ ": target node of REFERENCE property is a new node and must therefore either be saved first or be within the scope of the current save operation.";
log.warn(msg);
- throw new ConstraintViolationException(msg);
+ throw new ReferentialIntegrityException(msg);
}
} catch (MalformedPathException mpe) {
// should never get here...
@@ -715,7 +722,7 @@
String msg = nodeState.getId()
+ ": the node cannot be removed because it is being referenced.";
log.warn(msg);
- throw new ConstraintViolationException(msg);
+ throw new ReferentialIntegrityException(msg);
}
}
@@ -953,12 +960,66 @@
}
/**
+ * @see Item#remove
+ */
+ public void remove() throws RepositoryException {
+ // check state of this instance
+ checkItemState();
+
+ Path.PathElement thisName = getPrimaryPath().getNameElement();
+
+ // check if protected
+ if (isNode()) {
+ NodeImpl node = (NodeImpl) this;
+ NodeDef def = node.getDefinition();
+ // check protected flag
+ if (def.isProtected()) {
+ String msg = safeGetJCRPath() + ": cannot remove a protected node";
+ log.error(msg);
+ throw new ConstraintViolationException(msg);
+ }
+ } else {
+ PropertyImpl prop = (PropertyImpl) this;
+ PropertyDef def = prop.getDefinition();
+ // check protected flag
+ if (def.isProtected()) {
+ String msg = safeGetJCRPath() + ": cannot remove a protected property";
+ log.error(msg);
+ throw new ConstraintViolationException(msg);
+ }
+ }
+
+ NodeImpl parentNode = (NodeImpl) getParent();
+
+ // check if versioning allows write
+ if (!parentNode.safeIsCheckedOut()) {
+ String msg = parentNode.safeGetJCRPath() + ": cannot remove a child of a checked-in node";
+ log.error(msg);
+ throw new VersionException(msg);
+ }
+
+ // check protected flag of parent node
+ if (parentNode.getDefinition().isProtected()) {
+ String msg = parentNode.safeGetJCRPath() + ": cannot remove a child of a protected node";
+ log.error(msg);
+ throw new ConstraintViolationException(msg);
+ }
+
+ // delegate the removal of the child item to the parent node
+ if (isNode()) {
+ parentNode.removeChildNode(thisName.getName(), thisName.getIndex());
+ } else {
+ parentNode.removeChildProperty(thisName.getName());
+ }
+ }
+
+ /**
* @see Item#save
*/
public synchronized void save()
throws AccessDeniedException, LockException,
ConstraintViolationException, InvalidItemStateException,
- RepositoryException {
+ ReferentialIntegrityException, RepositoryException {
// check state of this instance
checkItemState();
@@ -1241,40 +1302,6 @@
*/
public Session getSession() throws RepositoryException {
return session;
- }
-
- /**
- * @see Item#isGranted
- */
- public boolean isGranted(long permissions)
- throws UnsupportedRepositoryOperationException, RepositoryException {
- checkItemState();
-
- try {
- // check state of this instance
- checkItemState();
-
- Permission[] perms = session.getAccessManager().getSupportedPermissions();
- // check each permission separately
- AccessManagerImpl accessMgr = session.getAccessManager();
- for (int i = 0; i < perms.length; i++) {
- Permission perm = perms[i];
- if ((permissions & perm.getValue()) == perm.getValue()) {
- if (!accessMgr.isGranted(id, perm.getValue())) {
- return false;
- }
- }
- permissions &= ~perm.getValue();
- }
- if (permissions > 0) {
- log.warn("unsupported/unknown permissions: " + permissions);
- }
- return true;
- } catch (PathNotFoundException pnfe) {
- String msg = "failed to check permissions on " + safeGetJCRPath();
- log.error(msg, pnfe);
- throw new RepositoryException(msg, pnfe);
- }
}
/**
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ItemManager.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ItemManager.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/ItemManager.java Mon Oct 25 10:49:43 2004
@@ -21,8 +21,6 @@
import org.apache.log4j.Logger;
import javax.jcr.*;
-import javax.jcr.access.AccessDeniedException;
-import javax.jcr.access.Permission;
import javax.jcr.nodetype.NodeDef;
import javax.jcr.nodetype.PropertyDef;
import java.io.PrintStream;
@@ -207,7 +205,7 @@
public synchronized ItemImpl getItem(ItemId id)
throws ItemNotFoundException, AccessDeniedException, RepositoryException {
// check privileges
- if (!session.getAccessManager().isGranted(id, Permission.READ_ITEM)) {
+ if (!session.getAccessManager().isGranted(id, AccessManager.READ)) {
// clear cache
if (isCached(id)) {
evictItem(id);
@@ -239,7 +237,7 @@
synchronized NodeIterator getChildNodes(NodeId parentId)
throws ItemNotFoundException, AccessDeniedException, RepositoryException {
// check privileges
- if (!session.getAccessManager().isGranted(parentId, Permission.READ_ITEM)) {
+ if (!session.getAccessManager().isGranted(parentId, AccessManager.READ)) {
// clear cache
ItemImpl item = retrieveItem(parentId);
if (item != null) {
@@ -295,7 +293,7 @@
synchronized PropertyIterator getChildProperties(NodeId parentId)
throws ItemNotFoundException, AccessDeniedException, RepositoryException {
// check privileges
- if (!session.getAccessManager().isGranted(parentId, Permission.READ_ITEM)) {
+ if (!session.getAccessManager().isGranted(parentId, AccessManager.READ)) {
ItemImpl item = retrieveItem(parentId);
if (item != null) {
evictItem(parentId);
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/NodeImpl.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/NodeImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/NodeImpl.java Mon Oct 25 10:49:43 2004
@@ -24,7 +24,6 @@
import org.apache.log4j.Logger;
import javax.jcr.*;
-import javax.jcr.access.AccessDeniedException;
import javax.jcr.lock.Lock;
import javax.jcr.lock.LockException;
import javax.jcr.nodetype.*;
@@ -1033,92 +1032,6 @@
//-----------------------------------------------------------------< Node >
/**
- * @see Node#remove(String)
- */
- public synchronized void remove(String relPath)
- throws PathNotFoundException, RepositoryException {
- // check state of this instance
- checkItemState();
-
- Path targetPath;
- Path.PathElement targetName;
- Path parentPath;
- try {
- targetPath = Path.create(getPrimaryPath(), relPath, session.getNamespaceResolver(), true);
- targetName = targetPath.getNameElement();
- parentPath = targetPath.getAncestor(1);
- } catch (MalformedPathException e) {
- String msg = "failed to resolve path " + relPath + " relative to " + safeGetJCRPath();
- log.error(msg, e);
- throw new RepositoryException(msg, e);
- }
-
- // check if the specified item exists and if it is protected
- ItemImpl targetItem;
- try {
- targetItem = itemMgr.getItem(targetPath);
- if (targetItem.isNode()) {
- NodeImpl node = (NodeImpl) targetItem;
- NodeDef def = node.getDefinition();
- // check protected flag
- if (def.isProtected()) {
- String msg = targetItem.safeGetJCRPath() + ": cannot remove a protected node";
- log.error(msg);
- throw new ConstraintViolationException(msg);
- }
- } else {
- PropertyImpl prop = (PropertyImpl) targetItem;
- PropertyDef def = prop.getDefinition();
- // check protected flag
- if (def.isProtected()) {
- String msg = targetItem.safeGetJCRPath() + ": cannot remove a protected property";
- log.error(msg);
- throw new ConstraintViolationException(msg);
- }
- }
- } catch (AccessDeniedException ade) {
- throw new PathNotFoundException(relPath);
- }
-
- NodeImpl parentNode;
- try {
- ItemImpl parent = itemMgr.getItem(parentPath);
- if (!parent.isNode()) {
- // should never get here
- String msg = "cannot remove an item from a property " + parent.safeGetJCRPath();
- log.error(msg);
- throw new RepositoryException(msg);
- }
- parentNode = (NodeImpl) parent;
- } catch (AccessDeniedException ade) {
- // should never get here because we already checked
- // the existence of the child...
- throw new PathNotFoundException(relPath);
- }
-
- // check if versioning allows write
- if (!parentNode.safeIsCheckedOut()) {
- String msg = parentNode.safeGetJCRPath() + ": cannot remove a child of a checked-in node";
- log.error(msg);
- throw new VersionException(msg);
- }
-
- // check protected flag of parent node
- if (parentNode.getDefinition().isProtected()) {
- String msg = parentNode.safeGetJCRPath() + ": cannot remove a child of a protected node";
- log.error(msg);
- throw new ConstraintViolationException(msg);
- }
-
- // delegate the removal of the child item to the parent node
- if (targetItem.isNode()) {
- parentNode.removeChildNode(targetName.getName(), targetName.getIndex());
- } else {
- parentNode.removeChildProperty(targetName.getName());
- }
- }
-
- /**
* @see Node#addNode(String)
*/
public synchronized Node addNode(String relPath)
@@ -2083,7 +1996,8 @@
* @see Node#checkin()
*/
public Version checkin()
- throws UnsupportedRepositoryOperationException, RepositoryException {
+ throws VersionException, UnsupportedRepositoryOperationException,
+ RepositoryException {
if (!isCheckedOut()) {
String msg = "Unable to checkin node. Is not checked-out. " + safeGetJCRPath();
@@ -2316,11 +2230,11 @@
NodeIterator ni = getNodes();
while (ni.hasNext()) {
// if the subnode does not exist in the src, and this is update,
- // so delete here aswell?
+ // so delete here as well?
Node n = ni.nextNode();
if (!srcNode.hasNode(n.getName())) {
// todo: how does this work for same name siblings?
- remove(n.getName());
+ n.remove();
}
}
// 'clone' nodes that do not exist
@@ -2734,7 +2648,7 @@
// if frozen node exist, replace
// todo: make work for same name siblings
if (hasNode(f.getName())) {
- getNode(f.getName()).remove(".");
+ getNode(f.getName()).remove();
}
NodeImpl n = addNode(f.getName(), f);
n.restoreFrozenState(f, vsel);
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/PropertyImpl.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/PropertyImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/PropertyImpl.java Mon Oct 25 10:49:43 2004
@@ -24,7 +24,6 @@
import org.apache.log4j.Logger;
import javax.jcr.*;
-import javax.jcr.access.AccessDeniedException;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.nodetype.PropertyDef;
import javax.jcr.version.VersionException;
@@ -338,7 +337,7 @@
/**
* @see Property#getValues()
*/
- public Value[] getValues() throws RepositoryException {
+ public Value[] getValues() throws ValueFormatException, RepositoryException {
// check state of this instance
checkItemState();
@@ -359,7 +358,7 @@
/**
* @see Property#getValue()
*/
- public Value getValue() throws RepositoryException {
+ public Value getValue() throws ValueFormatException, RepositoryException {
// check state of this instance
checkItemState();
@@ -518,18 +517,6 @@
}
/**
- * @see Property#hasValue()
- */
- public boolean hasValue() {
- // check state of this instance
- //checkItemState();
-
- PropertyState state = (PropertyState) getItemState();
- InternalValue[] values = state.getValues();
- return values.length > 0;
- }
-
- /**
* @see Property#setValue(Calendar)
*/
public void setValue(Calendar date) throws ValueFormatException, RepositoryException {
@@ -992,9 +979,14 @@
/**
* @see Property#getLength
*/
- public long getLength() {
+ public long getLength() throws ValueFormatException, RepositoryException {
// check state of this instance
- //checkItemState();
+ checkItemState();
+
+ // check multi-value flag
+ if (definition.isMultiple()) {
+ throw new ValueFormatException(safeGetJCRPath() + " is multi-valued");
+ }
InternalValue[] values = ((PropertyState) state).getValues();
if (values.length == 0) {
@@ -1013,8 +1005,9 @@
return name.toJCRName(session.getNamespaceResolver()).length();
} catch (NoPrefixDeclaredException npde) {
// should never happen...
- log.warn(safeGetJCRPath() + ": the value represents an invalid name", npde);
- return -1;
+ String msg = safeGetJCRPath() + ": the value represents an invalid name";
+ log.error(msg, npde);
+ throw new RepositoryException(msg, npde);
}
case PropertyType.PATH:
@@ -1023,8 +1016,9 @@
return path.toJCRPath(session.getNamespaceResolver()).length();
} catch (NoPrefixDeclaredException npde) {
// should never happen...
- log.warn(safeGetJCRPath() + ": the value represents an invalid path", npde);
- return -1;
+ String msg = safeGetJCRPath() + ": the value represents an invalid path";
+ log.error(msg, npde);
+ throw new RepositoryException(msg, npde);
}
case PropertyType.BINARY:
@@ -1032,6 +1026,60 @@
return blob.getLength();
}
return -1;
+ }
+
+ /**
+ * @see Property#getLengths
+ */
+ public long[] getLengths() throws ValueFormatException, RepositoryException {
+ // check state of this instance
+ checkItemState();
+
+ // check multi-value flag
+ if (!definition.isMultiple()) {
+ throw new ValueFormatException(safeGetJCRPath() + " is not multi-valued");
+ }
+
+ InternalValue[] values = ((PropertyState) state).getValues();
+ long[] lengths = new long[values.length];
+ for (int i = 0; i < values.length; i++) {
+ long length = -1;
+ InternalValue value = values[i];
+ switch (value.getType()) {
+ case PropertyType.STRING:
+ case PropertyType.LONG:
+ case PropertyType.DOUBLE:
+ length = value.toString().length();
+
+ case PropertyType.NAME:
+ QName name = (QName) value.internalValue();
+ try {
+ length = name.toJCRName(session.getNamespaceResolver()).length();
+ } catch (NoPrefixDeclaredException npde) {
+ // should never happen...
+ String msg = safeGetJCRPath() + ": the value represents an invalid name";
+ log.error(msg, npde);
+ throw new RepositoryException(msg, npde);
+ }
+
+ case PropertyType.PATH:
+ Path path = (Path) value.internalValue();
+ try {
+ length = path.toJCRPath(session.getNamespaceResolver()).length();
+ } catch (NoPrefixDeclaredException npde) {
+ // should never happen...
+ String msg = safeGetJCRPath() + ": the value represents an invalid path";
+ log.error(msg, npde);
+ throw new RepositoryException(msg, npde);
+ }
+
+ case PropertyType.BINARY:
+ BLOBFileValue blob = (BLOBFileValue) value.internalValue();
+ length = blob.getLength();
+ }
+ lengths[i] = length;
+ }
+ return lengths;
}
/**
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/RepositoryImpl.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/RepositoryImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/RepositoryImpl.java Mon Oct 25 10:49:43 2004
@@ -34,7 +34,6 @@
import javax.jcr.observation.Event;
import javax.jcr.observation.EventIterator;
import javax.jcr.observation.EventListener;
-import javax.jcr.observation.EventType;
import java.io.*;
import java.util.HashMap;
import java.util.Iterator;
@@ -311,8 +310,8 @@
String wspName = ((WorkspaceConfig) iter.next()).getName();
Session s = getSystemSession(wspName);
s.getWorkspace().getObservationManager().addEventListener(this,
- EventType.CHILD_NODE_ADDED | EventType.CHILD_NODE_REMOVED
- | EventType.PROPERTY_ADDED | EventType.PROPERTY_REMOVED,
+ Event.NODE_ADDED | Event.NODE_REMOVED
+ | Event.PROPERTY_ADDED | Event.PROPERTY_REMOVED,
"/", true, null, null, false);
// register SearchManager as EventListener
@@ -320,9 +319,9 @@
if (searchMgr != null) {
s.getWorkspace().getObservationManager().addEventListener(searchMgr,
- EventType.CHILD_NODE_ADDED | EventType.CHILD_NODE_REMOVED |
- EventType.PROPERTY_ADDED | EventType.PROPERTY_REMOVED |
- EventType.PROPERTY_CHANGED,
+ Event.NODE_ADDED | Event.NODE_REMOVED |
+ Event.PROPERTY_ADDED | Event.PROPERTY_REMOVED |
+ Event.PROPERTY_CHANGED,
"/", true, null, null, false);
}
}
@@ -684,7 +683,7 @@
}
if (credentials == null) {
// anonymous login
- return new SessionImpl(this, ANONYMOUS_CREDENTIALS, wspConfig);
+ return new XASessionImpl(this, ANONYMOUS_CREDENTIALS, wspConfig, txMgr);
} else if (credentials instanceof SimpleCredentials) {
// username/password credentials
// @todo implement authentication/authorization
@@ -696,6 +695,14 @@
}
}
+ /**
+ * @see Repository#login(String)
+ */
+ public Session login(String workspaceName)
+ throws LoginException, NoSuchWorkspaceException, RepositoryException {
+ return login(null, workspaceName);
+ }
+
//--------------------------------------------------------< EventListener >
/**
* @see EventListener#onEvent(EventIterator)
@@ -710,19 +717,19 @@
while (events.hasNext()) {
Event event = events.nextEvent();
long type = event.getType();
- if ((type & EventType.CHILD_NODE_ADDED) == EventType.CHILD_NODE_ADDED) {
+ if ((type & Event.NODE_ADDED) == Event.NODE_ADDED) {
nodesCount++;
repProps.setProperty(STATS_NODE_COUNT_PROPERTY, Long.toString(nodesCount));
}
- if ((type & EventType.CHILD_NODE_REMOVED) == EventType.CHILD_NODE_REMOVED) {
+ if ((type & Event.NODE_REMOVED) == Event.NODE_REMOVED) {
nodesCount--;
repProps.setProperty(STATS_NODE_COUNT_PROPERTY, Long.toString(nodesCount));
}
- if ((type & EventType.PROPERTY_ADDED) == EventType.PROPERTY_ADDED) {
+ if ((type & Event.PROPERTY_ADDED) == Event.PROPERTY_ADDED) {
propsCount++;
repProps.setProperty(STATS_PROP_COUNT_PROPERTY, Long.toString(propsCount));
}
- if ((type & EventType.PROPERTY_REMOVED) == EventType.PROPERTY_REMOVED) {
+ if ((type & Event.PROPERTY_REMOVED) == Event.PROPERTY_REMOVED) {
propsCount--;
repProps.setProperty(STATS_PROP_COUNT_PROPERTY, Long.toString(propsCount));
}
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SearchManager.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SearchManager.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SearchManager.java Mon Oct 25 10:49:43 2004
@@ -34,9 +34,8 @@
import org.apache.lucene.search.Query;
import javax.jcr.RepositoryException;
-import javax.jcr.access.Permission;
import javax.jcr.observation.EventIterator;
-import javax.jcr.observation.EventType;
+import javax.jcr.observation.Event;
import java.io.IOException;
import java.util.*;
@@ -128,7 +127,7 @@
for (int i = 0; i < result.length(); i++) {
String uuid = result.doc(i).get(FieldNames.UUID);
// check access
- if (accessMgr.isGranted(new NodeId(uuid), Permission.READ_ITEM)) {
+ if (accessMgr.isGranted(new NodeId(uuid), AccessManager.READ)) {
uuids.add(uuid);
}
}
@@ -157,24 +156,24 @@
try {
EventImpl e = (EventImpl) events.nextEvent();
long type = e.getType();
- if (type == EventType.CHILD_NODE_ADDED) {
+ if (type == Event.NODE_ADDED) {
- Path path = Path.create(e.getNodePath() + ((e.getNodePath().length() > 1) ? "/" : "") + e.getChildName(),
+ Path path = Path.create(e.getPath(),
session.getNamespaceResolver(),
true);
pendingNodes.add(path);
- } else if (type == EventType.CHILD_NODE_REMOVED) {
+ } else if (type == Event.NODE_REMOVED) {
- Path path = Path.create(e.getNodePath() + ((e.getNodePath().length() > 1) ? "/" : "") + e.getChildName(),
+ Path path = Path.create(e.getPath(),
session.getNamespaceResolver(),
true);
deleteNode(path, e.getChildUUID());
- } else if (type == EventType.PROPERTY_ADDED
- || type == EventType.PROPERTY_CHANGED
- || type == EventType.PROPERTY_REMOVED) {
+ } else if (type == Event.PROPERTY_ADDED
+ || type == Event.PROPERTY_CHANGED
+ || type == Event.PROPERTY_REMOVED) {
- Path path = Path.create(e.getNodePath(),
+ Path path = Path.create(e.getPath(),
session.getNamespaceResolver(),
true);
if (!modified.contains(e.getParentUUID())) {
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SessionImpl.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SessionImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SessionImpl.java Mon Oct 25 10:49:43 2004
@@ -30,12 +30,12 @@
import org.xml.sax.helpers.XMLReaderFactory;
import javax.jcr.*;
-import javax.jcr.access.AccessDeniedException;
import javax.jcr.lock.LockException;
import javax.jcr.nodetype.ConstraintViolationException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
+import java.security.AccessControlException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
@@ -48,6 +48,14 @@
private static Logger log = Logger.getLogger(SessionImpl.class);
/**
+ * prededfined action constants in checkPermission
+ */
+ public static final String READ_ACTION = "read";
+ public static final String REMOVE_ACTION = "remove";
+ public static final String ADD_NODE_ACTION = "add_node";
+ public static final String SET_PROPERTY_ACTION = "set_property";
+
+ /**
* the repository that issued this session
*/
protected final RepositoryImpl rep;
@@ -192,7 +200,7 @@
*/
protected AccessManagerImpl createAccessManager(Credentials credentials,
HierarchyManager hierMgr) {
- return new AccessManagerImpl(credentials, hierMgr, getNamespaceResolver());
+ return new AccessManagerImpl(credentials, hierMgr);
}
/**
@@ -200,7 +208,7 @@
*
* @return the <code>AccessManager</code> associated with this session
*/
- protected AccessManagerImpl getAccessManager() {
+ public AccessManagerImpl getAccessManager() {
return accessMgr;
}
@@ -274,6 +282,147 @@
//--------------------------------------------------------------< Session >
/**
+ * @see Session#checkPermission(String, String)
+ */
+ public void checkPermission(String absPath, String actions)
+ throws AccessControlException {
+ // build the set of actions to be checked
+ String[] strings = actions.split(",");
+ HashSet set = new HashSet();
+ for (int i = 0; i < strings.length; i++) {
+ set.add(strings[i]);
+ }
+
+ Path targetPath = null;
+ ItemId targetId = null;
+
+ /**
+ * "read" action:
+ * requires READ permission on target item
+ */
+ if (set.contains(READ_ACTION)) {
+ try {
+ targetPath = Path.create(absPath, getNamespaceResolver(), true);
+ targetId = hierMgr.resolvePath(targetPath);
+ accessMgr.checkPermission(targetId, AccessManager.READ);
+ } catch (PathNotFoundException pnfe) {
+ // target does not exist, throw exception
+ throw new AccessControlException(READ_ACTION);
+ } catch (MalformedPathException mpe) {
+ String msg = "invalid path: " + absPath;
+ log.warn(msg, mpe);
+ throw new AccessControlException(READ_ACTION);
+ } catch (RepositoryException re) {
+ String msg = "failed to check READ permission on " + absPath;
+ log.warn(msg, re);
+ throw new AccessControlException(READ_ACTION);
+ }
+ }
+
+ Path parentPath = null;
+ ItemId parentId = null;
+
+ /**
+ * "add_node" action:
+ * requires WRITE permission on parent item
+ */
+ if (set.contains(ADD_NODE_ACTION)) {
+ try {
+ if (targetPath == null) {
+ targetPath = Path.create(absPath, getNamespaceResolver(), true);
+ }
+ parentPath = targetPath.getAncestor(1);
+ parentId = hierMgr.resolvePath(parentPath);
+ accessMgr.checkPermission(parentId, AccessManager.WRITE);
+ } catch (PathNotFoundException pnfe) {
+ // parent does not exist, throw exception
+ throw new AccessControlException(ADD_NODE_ACTION);
+ } catch (MalformedPathException mpe) {
+ String msg = "invalid path: " + absPath;
+ log.warn(msg, mpe);
+ throw new AccessControlException(ADD_NODE_ACTION);
+ } catch (RepositoryException re) {
+ String msg = "failed to check WRITE permission on parent of " + absPath;
+ log.warn(msg, re);
+ throw new AccessControlException(ADD_NODE_ACTION);
+ }
+ }
+
+ /**
+ * "remove" action:
+ * requires WRITE permission on parent item
+ */
+ if (set.contains(REMOVE_ACTION)) {
+ try {
+ if (targetPath == null) {
+ targetPath = Path.create(absPath, getNamespaceResolver(), true);
+ }
+ if (parentPath == null) {
+ parentPath = targetPath.getAncestor(1);
+ }
+ if (parentId == null) {
+ parentId = hierMgr.resolvePath(parentPath);
+ }
+ accessMgr.checkPermission(parentId, AccessManager.WRITE);
+ } catch (PathNotFoundException pnfe) {
+ // parent does not exist, throw exception
+ throw new AccessControlException(REMOVE_ACTION);
+ } catch (MalformedPathException mpe) {
+ String msg = "invalid path: " + absPath;
+ log.warn(msg, mpe);
+ throw new AccessControlException(REMOVE_ACTION);
+ } catch (RepositoryException re) {
+ String msg = "failed to check WRITE permission on parent of " + absPath;
+ log.warn(msg, re);
+ throw new AccessControlException(REMOVE_ACTION);
+ }
+ }
+
+ /**
+ * "set_property" action:
+ * requires WRITE permission on parent item if property is going to be
+ * added or WRITE permission on target item if property is going to be
+ * modified
+ */
+ if (set.contains(SET_PROPERTY_ACTION)) {
+ try {
+ if (targetPath == null) {
+ targetPath = Path.create(absPath, getNamespaceResolver(), true);
+ }
+ if (targetId == null) {
+ try {
+ targetId = hierMgr.resolvePath(targetPath);
+ // property does already exist,
+ // check WRITE permission on target
+ accessMgr.checkPermission(targetId, AccessManager.WRITE);
+ } catch (PathNotFoundException pnfe) {
+ // property does not exist yet,
+ // check WRITE permission on parent
+ if (parentPath == null) {
+ parentPath = targetPath.getAncestor(1);
+ }
+ if (parentId == null) {
+ parentId = hierMgr.resolvePath(parentPath);
+ }
+ accessMgr.checkPermission(parentId, AccessManager.WRITE);
+ }
+ }
+ } catch (PathNotFoundException pnfe) {
+ // parent does not exist, throw exception
+ throw new AccessControlException(SET_PROPERTY_ACTION);
+ } catch (MalformedPathException mpe) {
+ String msg = "invalid path: " + absPath;
+ log.warn(msg, mpe);
+ throw new AccessControlException(SET_PROPERTY_ACTION);
+ } catch (RepositoryException re) {
+ String msg = "failed to check WRITE permission on parent of " + absPath;
+ log.warn(msg, re);
+ throw new AccessControlException(SET_PROPERTY_ACTION);
+ }
+ }
+ }
+
+ /**
* @see Session#getWorkspace()
*/
public Workspace getWorkspace() {
@@ -294,7 +443,7 @@
// a 'superuser' to impersonate another user without needing
// to know its password.
try {
- return rep.login(otherCredentials, null);
+ return rep.login(otherCredentials, getWorkspace().getName());
} catch (NoSuchWorkspaceException nswe) {
// should never get here...
String msg = "impersonate failed";
@@ -360,7 +509,9 @@
/**
* @see Session#save
*/
- public void save() throws AccessDeniedException, LockException, ConstraintViolationException, InvalidItemStateException, RepositoryException {
+ public void save() throws AccessDeniedException, LockException,
+ ConstraintViolationException, InvalidItemStateException,
+ RepositoryException {
getItemManager().getRootNode().save();
}
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SystemSession.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SystemSession.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SystemSession.java Mon Oct 25 10:49:43 2004
@@ -18,8 +18,9 @@
import org.apache.jackrabbit.core.config.WorkspaceConfig;
import org.apache.log4j.Logger;
-import javax.jcr.PathNotFoundException;
+import javax.jcr.AccessDeniedException;
import javax.jcr.RepositoryException;
+import javax.jcr.ItemNotFoundException;
/**
* A <code>SystemTicket</code> ...
@@ -40,22 +41,33 @@
throws RepositoryException {
super(rep, SYSTEM_USER_ID, wspConfig);
- accessMgr = new SystemAccessManqager();
+ accessMgr = new SystemAccessManqager(hierMgr);
}
//--------------------------------------------------------< inner classes >
private class SystemAccessManqager extends AccessManagerImpl {
- SystemAccessManqager() {
- super(null, getHierarchyManager(), getNamespaceResolver());
+ SystemAccessManqager(HierarchyManager hierMgr) {
+ super(null, hierMgr);
}
+ //----------------------------------------------------< AccessManager >
/**
- * @see AbstractAccessManager#getPermissions(String)
+ * @see AccessManager#checkPermission(ItemId, int)
*/
- public long getPermissions(String absPath)
- throws PathNotFoundException, RepositoryException {
- return PermissionImpl.ALL_VALUES;
+ public void checkPermission(ItemId id, int permissions)
+ throws AccessDeniedException, ItemNotFoundException,
+ RepositoryException {
+ // allow everything
+ }
+
+ /**
+ * @see AccessManager#isGranted(ItemId, int)
+ */
+ public boolean isGranted(ItemId id, int permissions)
+ throws ItemNotFoundException, RepositoryException {
+ // allow everything
+ return true;
}
}
}
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/Test.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/Test.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/Test.java Mon Oct 25 10:49:43 2004
@@ -146,7 +146,7 @@
//root.setProperty("blob", new FileInputStream(new File("d:/temp/jckrabbit.zip")));
if (root.hasProperty("blah")) {
- root.remove("blah");
+ root.getProperty("blah").remove();
}
root.setProperty("blah", 1);
root.setProperty("blah", 1.4);
@@ -223,11 +223,11 @@
System.out.println(prop.getPath() + " is a reference to " + target.getPath());
}
/*
- misc.remove(".");
+ misc.remove();
try {
root.save();
} catch (ConstraintViolationException cve) {
- root.remove("ref");
+ root.getProperty("ref").remove();
root.save();
}
*/
@@ -246,7 +246,7 @@
importNode(new File("d:/dev/jsr170/jackrabbit/src/java"), imported);
if (root.hasNode("foo")) {
- root.remove("foo");
+ root.getNode("foo").remove();
}
Node n = root.addNode("foo", "nt:folder");
@@ -268,7 +268,7 @@
System.out.println();
dumpTree(root, System.out);
- n3.remove("prop1");
+ prop1.remove();
System.out.println();
dumpTree(root, System.out);
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/WorkspaceImpl.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/WorkspaceImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/WorkspaceImpl.java Mon Oct 25 10:49:43 2004
@@ -29,9 +29,6 @@
import org.xml.sax.SAXException;
import javax.jcr.*;
-import javax.jcr.access.AccessDeniedException;
-import javax.jcr.access.AccessManager;
-import javax.jcr.access.Permission;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.nodetype.NodeTypeManager;
import javax.jcr.observation.EventListener;
@@ -274,10 +271,10 @@
Path.PathElement nodeName = nodePath.getNameElement();
try {
// check access rights
- if (!accessMgr.isGranted(parentState.getId(), Permission.READ_ITEM)) {
+ if (!accessMgr.isGranted(parentState.getId(), AccessManager.READ)) {
throw new PathNotFoundException(hierMgr.safeGetJCRPath(parentPath));
}
- if (!accessMgr.isGranted(parentState.getId(), Permission.ADD_NODE)) {
+ if (!accessMgr.isGranted(parentState.getId(), AccessManager.WRITE)) {
throw new AccessDeniedException(hierMgr.safeGetJCRPath(parentPath) + ": not allowed to add child node");
}
} catch (ItemNotFoundException infe) {
@@ -352,11 +349,11 @@
try {
// check access rights
- if (!accessMgr.isGranted(targetState.getId(), Permission.READ_ITEM)) {
+ if (!accessMgr.isGranted(targetState.getId(), AccessManager.READ)) {
throw new PathNotFoundException(hierMgr.safeGetJCRPath(nodePath));
}
- if (!accessMgr.isGranted(parentState.getId(), Permission.REMOVE_ITEM)) {
- throw new AccessDeniedException(hierMgr.safeGetJCRPath(parentPath) + ": not allowed to remove child node");
+ if (!accessMgr.isGranted(parentState.getId(), AccessManager.WRITE)) {
+ throw new AccessDeniedException(hierMgr.safeGetJCRPath(parentPath) + ": not allowed to remove node");
}
} catch (ItemNotFoundException infe) {
String msg = "internal error: failed to check access rights for " + hierMgr.safeGetJCRPath(nodePath);
@@ -577,7 +574,7 @@
try {
// check read access right on source node
- if (!accessMgr.isGranted(srcState.getId(), Permission.READ_ITEM)) {
+ if (!accessMgr.isGranted(srcState.getId(), AccessManager.READ)) {
throw new PathNotFoundException(srcAbsPath);
}
} catch (ItemNotFoundException infe) {
@@ -712,6 +709,25 @@
}
/**
+ * @see Workspace#copy(String, String, String)
+ */
+ public void copy(String srcWorkspace, String srcAbsPath, String destAbsPath)
+ throws NoSuchWorkspaceException, ConstraintViolationException,
+ AccessDeniedException, PathNotFoundException, ItemExistsException,
+ RepositoryException {
+ // copy (i.e. pull) subtree at srcAbsPath from srcWorkspace
+ // to 'this' workspace at destAbsPath
+ PersistentItemStateProvider srcStateMgr = rep.getWorkspaceStateManager(srcWorkspace);
+ // FIXME need to setup a hierarchy manager for source workspace
+ HierarchyManagerImpl srcHierMgr = new HierarchyManagerImpl(rep.getRootNodeUUID(), srcStateMgr, session.getNamespaceResolver());
+ // do cross-workspace copy
+ internalCopy(srcAbsPath, srcStateMgr, srcHierMgr,
+ destAbsPath, persistentStateMgr, hierMgr,
+ session.getAccessManager(), session.getNamespaceResolver(),
+ rep.getNodeTypeRegistry(), false);
+ }
+
+ /**
* @see Workspace#move
*/
public void move(String srcAbsPath, String destAbsPath)
@@ -853,13 +869,6 @@
}
/**
- * @see Workspace#getAccessManager
- */
- public AccessManager getAccessManager() throws UnsupportedRepositoryOperationException, RepositoryException {
- return session.getAccessManager();
- }
-
- /**
* @see Workspace#getObservationManager
*/
public synchronized ObservationManager getObservationManager()
@@ -929,7 +938,7 @@
}
// check read access
- if (!session.getAccessManager().isGranted(state.getId(), Permission.READ_ITEM)) {
+ if (!session.getAccessManager().isGranted(state.getId(), AccessManager.READ)) {
throw new PathNotFoundException(absPath);
}
@@ -972,7 +981,7 @@
}
// check read access
- if (!session.getAccessManager().isGranted(state.getId(), Permission.READ_ITEM)) {
+ if (!session.getAccessManager().isGranted(state.getId(), AccessManager.READ)) {
throw new PathNotFoundException(absPath);
}
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/jndi/BindableRepository.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/jndi/BindableRepository.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/jndi/BindableRepository.java Mon Oct 25 10:49:43 2004
@@ -85,16 +85,24 @@
/**
* @see Repository#getProperty(String)
*/
- public String getProperty(String s) {
- return delegatee.getProperty(s);
+ public String getProperty(String key) {
+ return delegatee.getProperty(key);
}
/**
* @see Repository#login(Credentials, String)
*/
- public Session login(Credentials credentials, String s)
+ public Session login(Credentials credentials, String workspaceName)
throws LoginException, NoSuchWorkspaceException, RepositoryException {
- return delegatee.login(credentials, s);
+ return delegatee.login(credentials, workspaceName);
+ }
+
+ /**
+ * @see Repository#login(String)
+ */
+ public Session login(String workspaceName)
+ throws LoginException, NoSuchWorkspaceException, RepositoryException {
+ return delegatee.login(workspaceName);
}
//--------------------------------------------------------< Referenceable >
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeImpl.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/NodeTypeImpl.java Mon Oct 25 10:49:43 2004
@@ -295,6 +295,27 @@
}
/**
+ * @see NodeType#isNodeType(String)
+ */
+ public boolean isNodeType(String nodeTypeName) {
+ QName ntName;
+ try {
+ ntName = QName.fromJCRName(nodeTypeName, nsResolver);
+ } catch (IllegalNameException ine) {
+ log.warn("invalid node type name: " + nodeTypeName, ine);
+ return false;
+ } catch (UnknownPrefixException upe) {
+ log.warn("invalid node type name: " + nodeTypeName, upe);
+ return false;
+ }
+ if (getQName().equals(ntName) || isDerivedFrom(ntName)) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
* @see NodeType#hasOrderableChildNodes
*/
public boolean hasOrderableChildNodes() {
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/PropertyDefImpl.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/PropertyDefImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/nodetype/PropertyDefImpl.java Mon Oct 25 10:49:43 2004
@@ -80,15 +80,18 @@
}
/**
- * @see PropertyDef#getValueConstraint
+ * @see PropertyDef#getValueConstraints
*/
- public String getValueConstraint() {
+ public String[] getValueConstraints() {
ValueConstraint[] constraints = propDef.getValueConstraints();
if (constraints == null || constraints.length == 0) {
- return null;
- } else {
- return constraints[0].getDefinition();
+ return new String[0];
}
+ String[] vca = new String[constraints.length];
+ for (int i = 0; i < constraints.length; i++) {
+ vca[i] = constraints[i].getDefinition();
+ }
+ return vca;
}
/**
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/observation/EventConsumer.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/observation/EventConsumer.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/observation/EventConsumer.java Mon Oct 25 10:49:43 2004
@@ -15,18 +15,14 @@
*/
package org.apache.jackrabbit.core.observation;
-import org.apache.jackrabbit.core.MalformedPathException;
-import org.apache.jackrabbit.core.NoPrefixDeclaredException;
-import org.apache.jackrabbit.core.Path;
-import org.apache.jackrabbit.core.SessionImpl;
+import org.apache.jackrabbit.core.*;
import org.apache.log4j.Logger;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
-import javax.jcr.access.Permission;
+import javax.jcr.observation.Event;
import javax.jcr.observation.EventIterator;
import javax.jcr.observation.EventListener;
-import javax.jcr.observation.EventType;
import java.util.*;
/**
@@ -132,8 +128,8 @@
Set denied = null;
while (it.hasNext()) {
EventState state = (EventState) it.next();
- if (state.getType() == EventType.CHILD_NODE_REMOVED
- || state.getType() == EventType.PROPERTY_REMOVED) {
+ if (state.getType() == Event.NODE_REMOVED
+ || state.getType() == Event.PROPERTY_REMOVED) {
if (session.equals(state.getSession())) {
// if we created the event, we can be sure that
@@ -141,23 +137,20 @@
continue;
}
- try {
- // FIXME is there a better way to check access right
- // without transforming path
- Path p = Path.create(state.getParentPath(), state.getChildItemQName(), false);
- if (!session.getWorkspace().getAccessManager().isGranted(p.toJCRPath(session.getNamespaceResolver()),
- Permission.READ_ITEM)) {
- if (denied == null) {
- denied = new HashSet();
- }
- denied.add(state);
+ // check read permission
+ ItemId targetId;
+ if (state.getChildUUID() == null) {
+ // target is a property
+ targetId = new PropertyId(state.getParentUUID(), state.getChildItemQName());
+ } else {
+ // target is a node
+ targetId = new NodeId(state.getChildUUID());
+ }
+ if (!session.getAccessManager().isGranted(targetId, AccessManager.READ)) {
+ if (denied == null) {
+ denied = new HashSet();
}
- } catch (MalformedPathException e) {
- // should actually never happen
- log.error("internal error: malformed path exception", e);
- } catch (NoPrefixDeclaredException e) {
- // should actually never happen
- log.error("internal error: no prefix declared", e);
+ denied.add(state);
}
}
}
@@ -177,26 +170,22 @@
// check permissions
for (Iterator it = events.iterator(); it.hasNext();) {
EventState state = (EventState) it.next();
- if (state.getType() == EventType.CHILD_NODE_ADDED
- || state.getType() == EventType.PROPERTY_ADDED
- || state.getType() == EventType.PROPERTY_CHANGED) {
- try {
- // FIXME is there a better way to check access right
- // without transforming path
- Path p = Path.create(state.getParentPath(), state.getChildItemQName(), false);
- if (!session.getWorkspace().getAccessManager().isGranted(p.toJCRPath(session.getNamespaceResolver()),
- Permission.READ_ITEM)) {
- if (denied == null) {
- denied = new HashSet();
- }
- denied.add(state);
+ if (state.getType() == Event.NODE_ADDED
+ || state.getType() == Event.PROPERTY_ADDED
+ || state.getType() == Event.PROPERTY_CHANGED) {
+ ItemId targetId;
+ if (state.getChildUUID() == null) {
+ // target is a property
+ targetId = new PropertyId(state.getParentUUID(), state.getChildItemQName());
+ } else {
+ // target is a node
+ targetId = new NodeId(state.getChildUUID());
+ }
+ if (!session.getAccessManager().isGranted(targetId, AccessManager.READ)) {
+ if (denied == null) {
+ denied = new HashSet();
}
- } catch (MalformedPathException e) {
- // should actually never happen
- log.error("internal error: malformed path exception", e);
- } catch (NoPrefixDeclaredException e) {
- // should actually never happen
- log.error("internal error: no prefix declared", e);
+ denied.add(state);
}
}
}
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/observation/EventImpl.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/observation/EventImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/observation/EventImpl.java Mon Oct 25 10:49:43 2004
@@ -69,14 +69,14 @@
/**
* @see Event#getType()
*/
- public long getType() {
+ public int getType() {
return eventState.getType();
}
/**
- * @see Event#getNodePath()
+ * @see Event#getPath()
*/
- public String getNodePath() throws RepositoryException {
+ public String getPath() throws RepositoryException {
try {
return eventState.getParentPath().toJCRPath(session.getNamespaceResolver());
} catch (NoPrefixDeclaredException e) {
@@ -87,20 +87,6 @@
}
/**
- * @see Event#getChildName()
- */
- public String getChildName() throws RepositoryException {
- try {
- return eventState.getChildItemQName().toJCRName(session.getNamespaceResolver());
- } catch (NoPrefixDeclaredException e) {
- // should never get here...
- String msg = "internal error: encountered unregistered namespace in name";
- log.error(msg, e);
- throw new RepositoryException(msg, e);
- }
- }
-
- /**
* @see Event#getUserId()
*/
public String getUserId() {
@@ -137,18 +123,12 @@
StringBuffer sb = new StringBuffer();
sb.append("Event: Path: ");
try {
- sb.append(getNodePath());
+ sb.append(getPath());
} catch (RepositoryException e) {
log.error("Exception retrieving path: " + e);
sb.append("[Error retrieving path]");
}
sb.append(", ").append(EventState.valueOf(getType())).append(": ");
- try {
- sb.append(getChildName());
- } catch (RepositoryException e) {
- log.error("Exception retrieving child item name: " + e);
- sb.append("[Error retrieving child item name]");
- }
sb.append(", UserId: ").append(getUserId());
stringValue = sb.toString();
}
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/observation/EventState.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/observation/EventState.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/observation/EventState.java Mon Oct 25 10:49:43 2004
@@ -20,7 +20,7 @@
import org.apache.jackrabbit.core.nodetype.NodeTypeImpl;
import javax.jcr.Session;
-import javax.jcr.observation.EventType;
+import javax.jcr.observation.Event;
/**
* The <code>EventState</code> class encapsulates the session
@@ -29,9 +29,9 @@
class EventState {
/**
- * The {@link javax.jcr.observation.EventType} of this event.
+ * The {@link javax.jcr.observation.Event} of this event.
*/
- private final long type;
+ private final int type;
/**
* The UUID of the parent node associated with this event.
@@ -45,8 +45,8 @@
/**
* The UUID of a child node, in case this EventState is of type
- * {@link javax.jcr.observation.EventType#CHILD_NODE_ADDED} or
- * {@link javax.jcr.observation.EventType#CHILD_NODE_REMOVED}.
+ * {@link javax.jcr.observation.Event#NODE_ADDED} or
+ * {@link javax.jcr.observation.Event#NODE_REMOVED}.
*/
private final String childUUID;
@@ -78,8 +78,7 @@
/**
* Creates a new <code>EventState</code> instance.
*
- * @param type the {@link javax.jcr.observation.EventType} of this
- * event.
+ * @param type the type of this event.
* @param parentUUID the uuid of the parent node associated with this
* event.
* @param parentPath the path of the parent node associated with this
@@ -93,14 +92,14 @@
* @param nodeType the node type of the parent node.
* @param session the {@link javax.jcr.Session} that caused this event.
*/
- private EventState(long type,
+ private EventState(int type,
String parentUUID,
Path parentPath,
String childUUID,
QName childName,
NodeTypeImpl nodeType,
Session session) {
- long mask = (EventType.PROPERTY_ADDED | EventType.PROPERTY_CHANGED | EventType.PROPERTY_REMOVED);
+ int mask = (Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED | Event.PROPERTY_REMOVED);
if ((type & mask) > 0) {
if (childUUID != null) {
throw new IllegalArgumentException("childUUID only allowed for Node events.");
@@ -123,7 +122,7 @@
/**
* Creates a new {@link javax.jcr.observation.Event} of type
- * {@link javax.jcr.observation.EventType#CHILD_NODE_ADDED}.
+ * {@link javax.jcr.observation.Event#NODE_ADDED}.
*
* @param parentUUID the uuid of the parent node associated with
* this <code>EventState</code>.
@@ -141,7 +140,7 @@
QName childName,
NodeTypeImpl nodeType,
Session session) {
- return new EventState(EventType.CHILD_NODE_ADDED,
+ return new EventState(Event.NODE_ADDED,
parentUUID,
parentPath,
childUUID,
@@ -152,7 +151,7 @@
/**
* Creates a new {@link javax.jcr.observation.Event} of type
- * {@link javax.jcr.observation.EventType#CHILD_NODE_REMOVED}.
+ * {@link javax.jcr.observation.Event#NODE_REMOVED}.
*
* @param parentUUID the uuid of the parent node associated with
* this <code>EventState</code>.
@@ -170,7 +169,7 @@
QName childName,
NodeTypeImpl nodeType,
Session session) {
- return new EventState(EventType.CHILD_NODE_REMOVED,
+ return new EventState(Event.NODE_REMOVED,
parentUUID,
parentPath,
childUUID,
@@ -181,7 +180,7 @@
/**
* Creates a new {@link javax.jcr.observation.Event} of type
- * {@link javax.jcr.observation.EventType#PROPERTY_ADDED}.
+ * {@link javax.jcr.observation.Event#PROPERTY_ADDED}.
*
* @param parentUUID the uuid of the parent node associated with
* this <code>EventState</code>.
@@ -197,7 +196,7 @@
QName childName,
NodeTypeImpl nodeType,
Session session) {
- return new EventState(EventType.PROPERTY_ADDED,
+ return new EventState(Event.PROPERTY_ADDED,
parentUUID,
parentPath,
null,
@@ -208,7 +207,7 @@
/**
* Creates a new {@link javax.jcr.observation.Event} of type
- * {@link javax.jcr.observation.EventType#PROPERTY_REMOVED}.
+ * {@link javax.jcr.observation.Event#PROPERTY_REMOVED}.
*
* @param parentUUID the uuid of the parent node associated with
* this <code>EventState</code>.
@@ -224,7 +223,7 @@
QName childName,
NodeTypeImpl nodeType,
Session session) {
- return new EventState(EventType.PROPERTY_REMOVED,
+ return new EventState(Event.PROPERTY_REMOVED,
parentUUID,
parentPath,
null,
@@ -235,7 +234,7 @@
/**
* Creates a new {@link javax.jcr.observation.Event} of type
- * {@link javax.jcr.observation.EventType#PROPERTY_CHANGED}.
+ * {@link javax.jcr.observation.Event#PROPERTY_CHANGED}.
*
* @param parentUUID the uuid of the parent node associated with
* this <code>EventState</code>.
@@ -251,7 +250,7 @@
QName childName,
NodeTypeImpl nodeType,
Session session) {
- return new EventState(EventType.PROPERTY_CHANGED,
+ return new EventState(Event.PROPERTY_CHANGED,
parentUUID,
parentPath,
null,
@@ -263,7 +262,7 @@
/**
* @see javax.jcr.observation.Event#getType()
*/
- public long getType() {
+ public int getType() {
return type;
}
@@ -393,19 +392,19 @@
/**
* Returns a String representation of <code>eventType</code>.
*
- * @param eventType an event type defined by {@link EventType}.
+ * @param eventType an event type defined by {@link Event}.
* @return a String representation of <code>eventType</code>.
*/
- public static String valueOf(long eventType) {
- if (eventType == EventType.CHILD_NODE_ADDED) {
- return "ChildNodeAdded";
- } else if (eventType == EventType.CHILD_NODE_REMOVED) {
- return "ChildNodeRemoved";
- } else if (eventType == EventType.PROPERTY_ADDED) {
+ public static String valueOf(int eventType) {
+ if (eventType == Event.NODE_ADDED) {
+ return "NodeAdded";
+ } else if (eventType == Event.NODE_REMOVED) {
+ return "NodeRemoved";
+ } else if (eventType == Event.PROPERTY_ADDED) {
return "PropertyAdded";
- } else if (eventType == EventType.PROPERTY_CHANGED) {
+ } else if (eventType == Event.PROPERTY_CHANGED) {
return "PropertyChanged";
- } else if (eventType == EventType.PROPERTY_REMOVED) {
+ } else if (eventType == Event.PROPERTY_REMOVED) {
return "PropertyRemoved";
} else {
return "UnknownEventType";
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/observation/ObservationManagerFactory.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/observation/ObservationManagerFactory.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/observation/ObservationManagerFactory.java Mon Oct 25 10:49:43 2004
@@ -268,7 +268,7 @@
* @see ObservationManager#addEventListener
*/
public void addEventListener(EventListener listener,
- long eventTypes,
+ int eventTypes,
String absPath,
boolean isDeep,
String[] uuid,
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/search/lucene/QueryResultImpl.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/search/lucene/QueryResultImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/search/lucene/QueryResultImpl.java Mon Oct 25 10:49:43 2004
@@ -20,6 +20,7 @@
import javax.jcr.NodeIterator;
import javax.jcr.PropertyIterator;
+import javax.jcr.RepositoryException;
import javax.jcr.query.QueryResult;
/**
@@ -43,12 +44,18 @@
this.selectProps = selectProps;
}
- public PropertyIterator getProperties() {
+ /**
+ * @see QueryResult#getProperties()
+ */
+ public PropertyIterator getProperties() throws RepositoryException {
return new PropertyIteratorImpl(selectProps,
new NodeIteratorImpl(itemMgr, uuids));
}
- public NodeIterator getNodes() {
+ /**
+ * @see QueryResult#getNodes()
+ */
+ public NodeIterator getNodes() throws RepositoryException {
return new NodeIteratorImpl(itemMgr, uuids);
}
}
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/tx/XASessionImpl.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/tx/XASessionImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/tx/XASessionImpl.java Mon Oct 25 10:49:43 2004
@@ -396,7 +396,7 @@
* Has to be overridden to provide the access manager based on items
* contained in the current transaction
*/
- protected AccessManagerImpl getAccessManager() {
+ public AccessManagerImpl getAccessManager() {
if (tx != null) {
return (AccessManagerImpl) tx.getAttribute(ATTRIBUTE_ACCESS_MANAGER);
}
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/NodeWrapper.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/NodeWrapper.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/NodeWrapper.java Mon Oct 25 10:49:43 2004
@@ -19,7 +19,6 @@
import org.apache.jackrabbit.core.QName;
import javax.jcr.*;
-import javax.jcr.access.AccessDeniedException;
import javax.jcr.lock.Lock;
import javax.jcr.lock.LockException;
import javax.jcr.nodetype.ConstraintViolationException;
@@ -152,13 +151,6 @@
}
/**
- * @see Node#remove(String)
- */
- public void remove(String relPath) throws PathNotFoundException, RepositoryException {
- delegatee.remove(relPath);
- }
-
- /**
* @see Node#getNode(String)
*/
public Node getNode(String relPath) throws PathNotFoundException, RepositoryException {
@@ -510,7 +502,7 @@
}
/**
- * @see javax.jcr.Node#save()
+ * @see Node#save()
*/
public void save() throws AccessDeniedException, LockException, ConstraintViolationException, InvalidItemStateException, RepositoryException {
delegatee.save();
@@ -524,9 +516,9 @@
}
/**
- * @see Node#isGranted(long)
+ * @see Node#remove()
*/
- public boolean isGranted(long permissions) throws UnsupportedRepositoryOperationException, RepositoryException {
- return delegatee.isGranted(permissions);
+ public void remove() throws RepositoryException {
+ delegatee.remove();
}
}
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.java Mon Oct 25 10:49:43 2004
@@ -24,6 +24,7 @@
import javax.jcr.version.Version;
import javax.jcr.version.VersionHistory;
import javax.jcr.version.VersionIterator;
+import javax.jcr.version.VersionException;
/**
* This Class implements a version history that extends a node.
@@ -87,16 +88,28 @@
}
/**
- * @see VersionHistory#addVersionLabel(Version, String, boolean)
+ * @see VersionHistory#addVersionLabel(String, String)
*/
- public void addVersionLabel(Version version, String label, boolean move) throws RepositoryException {
- history.addVersionLabel(((VersionImpl) version).version, label, move);
+ public void addVersionLabel(String versionName, String label) throws VersionException, RepositoryException {
+ InternalVersion v;
+ try {
+ QName name = QName.fromJCRName(versionName, ((SessionImpl) unwrap().getSession()).getNamespaceResolver());
+ v = history.getVersion(name);
+ } catch (IllegalNameException e) {
+ throw new RepositoryException(e);
+ } catch (UnknownPrefixException e) {
+ throw new RepositoryException(e);
+ }
+ if (v == null) {
+ throw new VersionException("specified version does not exist");
+ }
+ history.addVersionLabel(v, label, false);
}
/**
* @see VersionHistory#removeVersionLabel(String)
*/
- public void removeVersionLabel(String label) throws RepositoryException {
+ public void removeVersionLabel(String label) throws VersionException, RepositoryException {
history.removeVersionLabel(label);
}
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionImpl.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionImpl.java Mon Oct 25 10:49:43 2004
@@ -61,12 +61,11 @@
return version.internalGetLabels();
}
- public void addVersionLabel(String label) throws RepositoryException {
- version.getVersionHistory().addVersionLabel(version, label, false);
- }
-
- public void removeVersionLabel(String label) throws RepositoryException {
- version.getVersionHistory().removeVersionLabel(label);
+ /**
+ * @see Version#hasVersionLabel
+ */
+ public boolean hasVersionLabel(String label) {
+ return version.internalHasLabel(label);
}
/**
@@ -112,7 +111,7 @@
}
/**
- * Returns the forzen node of this version
+ * Returns the frozen node of this version
*
* @return
* @throws RepositoryException
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/AbstractSAXEventGenerator.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/AbstractSAXEventGenerator.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/AbstractSAXEventGenerator.java Mon Oct 25 10:49:43 2004
@@ -25,7 +25,6 @@
import org.xml.sax.SAXException;
import javax.jcr.RepositoryException;
-import javax.jcr.access.Permission;
import java.util.Iterator;
/**
@@ -171,7 +170,7 @@
}
PropertyId propId = new PropertyId(nodeState.getUUID(), pe.getName());
// check read access
- if (accessMgr.isGranted(propId, Permission.READ_ITEM)) {
+ if (accessMgr.isGranted(propId, AccessManager.READ)) {
// serialize property
process(pe, nodeState.getUUID(), level + 1);
}
@@ -187,7 +186,7 @@
NodeState.ChildNodeEntry cne = (NodeState.ChildNodeEntry) iter.next();
NodeId childId = new NodeId(cne.getUUID());
// check read access
- if (accessMgr.isGranted(childId, Permission.READ_ITEM)) {
+ if (accessMgr.isGranted(childId, AccessManager.READ)) {
NodeState childState;
try {
childState = (NodeState) stateProvider.getItemState(childId);
Modified: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/AbstractJCRTest.java
==============================================================================
--- incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/AbstractJCRTest.java (original)
+++ incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/AbstractJCRTest.java Mon Oct 25 10:49:43 2004
@@ -108,7 +108,7 @@
// clean test root
testRootNode = root.getNode(testPath);
for (NodeIterator children = testRootNode.getNodes(); children.hasNext();) {
- testRootNode.remove(children.nextNode().getName());
+ children.nextNode().remove();
}
} else {
// create nodes to testPath
@@ -131,7 +131,7 @@
// clean test root
testRootNode = root.getNode(testPath);
for (NodeIterator children = testRootNode.getNodes(); children.hasNext();) {
- testRootNode.remove(children.nextNode().getName());
+ children.nextNode().remove();
}
root.save();
}
Modified: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/AbstractObservationTest.java
==============================================================================
--- incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/AbstractObservationTest.java (original)
+++ incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/AbstractObservationTest.java Mon Oct 25 10:49:43 2004
@@ -20,7 +20,6 @@
import javax.jcr.RepositoryException;
import javax.jcr.observation.Event;
import javax.jcr.observation.EventListener;
-import javax.jcr.observation.EventType;
import javax.jcr.observation.ObservationManager;
import java.util.HashSet;
import java.util.Set;
@@ -54,7 +53,7 @@
*/
protected void addEventListener(EventListener listener) throws RepositoryException {
addEventListener(listener,
- EventType.CHILD_NODE_ADDED | EventType.CHILD_NODE_REMOVED | EventType.PROPERTY_ADDED | EventType.PROPERTY_CHANGED | EventType.PROPERTY_REMOVED);
+ Event.NODE_ADDED | Event.NODE_REMOVED | Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED | Event.PROPERTY_REMOVED);
}
/**
@@ -62,10 +61,10 @@
* type(s).
*
* @param listener the <code>EventListener</code>.
- * @param eventType the {@link javax.jcr.observation.EventType}s
+ * @param eventType the event types
* @throws RepositoryException if registration fails.
*/
- protected void addEventListener(EventListener listener, long eventType)
+ protected void addEventListener(EventListener listener, int eventType)
throws RepositoryException {
if (obsMgr != null) {
obsMgr.addEventListener(listener,
@@ -108,7 +107,7 @@
*/
protected void checkNodeAdded(Event[] events, String[] relPaths)
throws RepositoryException {
- checkNodes(events, relPaths, EventType.CHILD_NODE_ADDED);
+ checkNodes(events, relPaths, Event.NODE_ADDED);
}
/**
@@ -123,7 +122,7 @@
*/
protected void checkNodeRemoved(Event[] events, String[] relPaths)
throws RepositoryException {
- checkNodes(events, relPaths, EventType.CHILD_NODE_REMOVED);
+ checkNodes(events, relPaths, Event.NODE_REMOVED);
}
/**
@@ -138,7 +137,7 @@
*/
protected void checkPropertyAdded(Event[] events, String[] relPaths)
throws RepositoryException {
- checkNodes(events, relPaths, EventType.PROPERTY_ADDED);
+ checkNodes(events, relPaths, Event.PROPERTY_ADDED);
}
/**
@@ -153,7 +152,7 @@
*/
protected void checkPropertyChanged(Event[] events, String[] relPaths)
throws RepositoryException {
- checkNodes(events, relPaths, EventType.PROPERTY_CHANGED);
+ checkNodes(events, relPaths, Event.PROPERTY_CHANGED);
}
/**
@@ -168,7 +167,7 @@
*/
protected void checkPropertyRemoved(Event[] events, String[] relPaths)
throws RepositoryException {
- checkNodes(events, relPaths, EventType.PROPERTY_REMOVED);
+ checkNodes(events, relPaths, Event.PROPERTY_REMOVED);
}
/**
@@ -187,8 +186,7 @@
Set paths = new HashSet();
for (int i = 0; i < events.length; i++) {
assertEquals("Wrong event type", eventType, events[i].getType());
- String path = events[i].getNodePath()
- + "/" + events[i].getChildName();
+ String path = events[i].getPath();
paths.add(path);
}
for (int i = 0; i < relPaths.length; i++) {
Modified: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/NodeAddedTest.java
==============================================================================
--- incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/NodeAddedTest.java (original)
+++ incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/NodeAddedTest.java Mon Oct 25 10:49:43 2004
@@ -18,17 +18,16 @@
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.observation.Event;
-import javax.jcr.observation.EventType;
/**
- * Test cases for {@link javax.jcr.observation.EventType#CHILD_NODE_ADDED
+ * Test cases for {@link javax.jcr.observation.Event.NODE_ADDED
* CHILD_NODE_ADDED} events.
*/
public class NodeAddedTest extends AbstractObservationTest {
public void testSingleNodeAdded() throws RepositoryException {
EventResult result = new EventResult(log);
- addEventListener(result, EventType.CHILD_NODE_ADDED);
+ addEventListener(result, Event.NODE_ADDED);
testRootNode.addNode(nodeName1, testNodeType);
testRootNode.save();
removeEventListener(result);
@@ -38,7 +37,7 @@
public void testMultipleNodeAdded1() throws RepositoryException {
EventResult result = new EventResult(log);
- addEventListener(result, EventType.CHILD_NODE_ADDED);
+ addEventListener(result, Event.NODE_ADDED);
testRootNode.addNode(nodeName1, testNodeType);
testRootNode.addNode(nodeName2, testNodeType);
testRootNode.save();
@@ -49,7 +48,7 @@
public void testMultipleNodeAdded2() throws RepositoryException {
EventResult result = new EventResult(log);
- addEventListener(result, EventType.CHILD_NODE_ADDED);
+ addEventListener(result, Event.NODE_ADDED);
Node n1 = testRootNode.addNode(nodeName1, testNodeType);
n1.addNode(nodeName2, testNodeType);
testRootNode.save();
@@ -60,10 +59,10 @@
public void testTransientNodeAddedRemoved() throws RepositoryException {
EventResult result = new EventResult(log);
- addEventListener(result, EventType.CHILD_NODE_ADDED);
+ addEventListener(result, Event.NODE_ADDED);
Node n1 = testRootNode.addNode(nodeName1, testNodeType);
- n1.addNode(nodeName2, testNodeType);
- n1.remove(nodeName2);
+ Node n2 = n1.addNode(nodeName2, testNodeType);
+ n2.remove();
testRootNode.save();
removeEventListener(result);
Event[] events = result.getEvents(DEFAULT_WAIT_TIMEOUT);
Modified: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/NodeRemovedTest.java
==============================================================================
--- incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/NodeRemovedTest.java (original)
+++ incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/NodeRemovedTest.java Mon Oct 25 10:49:43 2004
@@ -18,20 +18,19 @@
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.observation.Event;
-import javax.jcr.observation.EventType;
/**
- * Test cases for {@link javax.jcr.observation.EventType#CHILD_NODE_REMOVED
+ * Test cases for {@link javax.jcr.observation.Event#NODE_REMOVED
* CHILD_NODE_REMOVED} events.
*/
public class NodeRemovedTest extends AbstractObservationTest {
public void testSingleNodeRemoved() throws RepositoryException {
EventResult result = new EventResult(log);
- addEventListener(result, EventType.CHILD_NODE_REMOVED);
- testRootNode.addNode("foo", NT_UNSTRUCTURED);
+ addEventListener(result, Event.NODE_REMOVED);
+ Node foo = testRootNode.addNode("foo", NT_UNSTRUCTURED);
testRootNode.save();
- testRootNode.remove("foo");
+ foo.remove();
testRootNode.save();
removeEventListener(result);
Event[] events = result.getEvents(DEFAULT_WAIT_TIMEOUT);
@@ -40,11 +39,11 @@
public void testMultiNodesRemoved() throws RepositoryException {
EventResult result = new EventResult(log);
- addEventListener(result, EventType.CHILD_NODE_REMOVED);
+ addEventListener(result, Event.NODE_REMOVED);
Node foo = testRootNode.addNode("foo", NT_UNSTRUCTURED);
foo.addNode("bar", NT_UNSTRUCTURED);
testRootNode.save();
- testRootNode.remove("foo");
+ foo.remove();
testRootNode.save();
removeEventListener(result);
Event[] events = result.getEvents(DEFAULT_WAIT_TIMEOUT);
@@ -53,12 +52,12 @@
public void testMultiNodesRemovedWithRemaining() throws RepositoryException {
EventResult result = new EventResult(log);
- addEventListener(result, EventType.CHILD_NODE_REMOVED);
+ addEventListener(result, Event.NODE_REMOVED);
Node foo = testRootNode.addNode("foo", NT_UNSTRUCTURED);
testRootNode.addNode("foobar", NT_UNSTRUCTURED);
foo.addNode("bar", NT_UNSTRUCTURED);
testRootNode.save();
- testRootNode.remove("foo");
+ foo.remove();
testRootNode.save();
removeEventListener(result);
Event[] events = result.getEvents(DEFAULT_WAIT_TIMEOUT);
Modified: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/PropertyAddedTest.java
==============================================================================
--- incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/PropertyAddedTest.java (original)
+++ incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/PropertyAddedTest.java Mon Oct 25 10:49:43 2004
@@ -18,17 +18,16 @@
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.observation.Event;
-import javax.jcr.observation.EventType;
/**
- * Test cases for {@link javax.jcr.observation.EventType#PROPERTY_ADDED
+ * Test cases for {@link javax.jcr.observation.Event#PROPERTY_ADDED
* PROPERTY_ADDED} events.
*/
public class PropertyAddedTest extends AbstractObservationTest {
public void testSinglePropertyAdded() throws RepositoryException {
EventResult result = new EventResult(log);
- addEventListener(result, EventType.PROPERTY_ADDED);
+ addEventListener(result, Event.PROPERTY_ADDED);
Node foo = testRootNode.addNode("foo", NT_UNSTRUCTURED);
foo.setProperty("prop1", new String[]{"foo"});
testRootNode.save();
@@ -40,7 +39,7 @@
public void testMultiPropertyAdded() throws RepositoryException {
EventResult result = new EventResult(log);
- addEventListener(result, EventType.PROPERTY_ADDED);
+ addEventListener(result, Event.PROPERTY_ADDED);
Node foo = testRootNode.addNode("foo", NT_UNSTRUCTURED);
foo.setProperty("prop1", new String[]{"foo"});
foo.setProperty("prop2", new String[]{"bar"});
Modified: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/PropertyChangedTest.java
==============================================================================
--- incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/PropertyChangedTest.java (original)
+++ incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/PropertyChangedTest.java Mon Oct 25 10:49:43 2004
@@ -18,10 +18,9 @@
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.observation.Event;
-import javax.jcr.observation.EventType;
/**
- * Test cases for {@link javax.jcr.observation.EventType#PROPERTY_CHANGED
+ * Test cases for {@link javax.jcr.observation.Event#PROPERTY_CHANGED
* PROPERTY_CHANGED} events.
*/
public class PropertyChangedTest extends AbstractObservationTest {
@@ -31,7 +30,7 @@
Node foo = testRootNode.addNode("foo", NT_UNSTRUCTURED);
foo.setProperty("bar", new String[]{"foo"});
testRootNode.save();
- addEventListener(result, EventType.PROPERTY_CHANGED);
+ addEventListener(result, Event.PROPERTY_CHANGED);
foo.getProperty("bar").setValue(new String[]{"foobar"});
testRootNode.save();
removeEventListener(result);
@@ -45,7 +44,7 @@
foo.setProperty("prop1", new String[]{"foo"});
foo.setProperty("prop2", new String[]{"bar"});
testRootNode.save();
- addEventListener(result, EventType.PROPERTY_CHANGED);
+ addEventListener(result, Event.PROPERTY_CHANGED);
foo.getProperty("prop1").setValue(new String[]{"foobar"});
foo.getProperty("prop2").setValue(new String[]{"foobar"});
testRootNode.save();
@@ -59,7 +58,7 @@
Node foo = testRootNode.addNode("foo", NT_UNSTRUCTURED);
foo.setProperty("bar", new String[]{"foo"});
testRootNode.save();
- addEventListener(result, EventType.PROPERTY_CHANGED);
+ addEventListener(result, Event.PROPERTY_CHANGED);
foo.getProperty("bar").setValue(new String[]{"foobar"});
foo.setProperty("foo", new String[]{"bar"}); // will not fire prop changed event
testRootNode.save();
@@ -74,7 +73,7 @@
foo.setProperty("prop1", new String[]{"foo"});
foo.setProperty("prop2", new String[]{"bar"});
testRootNode.save();
- addEventListener(result, EventType.PROPERTY_CHANGED);
+ addEventListener(result, Event.PROPERTY_CHANGED);
foo.getProperty("prop1").setValue(new String[]{"foobar"});
foo.getProperty("prop2").setValue(new String[]{"foobar"});
foo.setProperty("prop3", new String[]{"foo"}); // will not fire prop changed event
Modified: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/PropertyRemovedTest.java
==============================================================================
--- incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/PropertyRemovedTest.java (original)
+++ incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/observation/PropertyRemovedTest.java Mon Oct 25 10:49:43 2004
@@ -17,23 +17,23 @@
import javax.jcr.Node;
import javax.jcr.RepositoryException;
+import javax.jcr.Property;
import javax.jcr.observation.Event;
-import javax.jcr.observation.EventType;
/**
- * Test cases for {@link javax.jcr.observation.EventType#PROPERTY_REMOVED
+ * Test cases for {@link javax.jcr.observation.Event#PROPERTY_REMOVED
* PROPERTY_REMOVED} events.
*/
public class PropertyRemovedTest extends AbstractObservationTest {
public void testSinglePropertyRemoved() throws RepositoryException {
EventResult result = new EventResult(log);
- addEventListener(result, EventType.PROPERTY_REMOVED);
+ addEventListener(result, Event.PROPERTY_REMOVED);
Node foo = testRootNode.addNode("foo", NT_UNSTRUCTURED);
- foo.setProperty("prop1", new String[]{"foo"});
+ Property prop1 = foo.setProperty("prop1", new String[]{"foo"});
foo.setProperty("prop2", new String[]{"bar"});
testRootNode.save();
- foo.remove("prop1");
+ prop1.remove();
testRootNode.save();
removeEventListener(result);
Event[] events = result.getEvents(DEFAULT_WAIT_TIMEOUT);
@@ -42,13 +42,13 @@
public void testMultiPropertyRemoved() throws RepositoryException {
EventResult result = new EventResult(log);
- addEventListener(result, EventType.PROPERTY_REMOVED);
+ addEventListener(result, Event.PROPERTY_REMOVED);
Node foo = testRootNode.addNode("foo", NT_UNSTRUCTURED);
- foo.setProperty("prop1", new String[]{"foo"});
- foo.setProperty("prop2", new String[]{"bar"});
+ Property prop1 = foo.setProperty("prop1", new String[]{"foo"});
+ Property prop2 = foo.setProperty("prop2", new String[]{"bar"});
testRootNode.save();
- foo.remove("prop1");
- foo.remove("prop2");
+ prop1.remove();
+ prop2.remove();
testRootNode.save();
removeEventListener(result);
Event[] events = result.getEvents(DEFAULT_WAIT_TIMEOUT);