You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by an...@apache.org on 2006/10/16 11:39:20 UTC
svn commit: r464431 - in /jackrabbit/trunk/contrib/spi:
jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/
jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/
jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/
spi/src/main/java/org...
Author: angela
Date: Mon Oct 16 02:39:18 2006
New Revision: 464431
URL: http://svn.apache.org/viewvc?view=rev&rev=464431
Log:
work in progress
- reorder: wrong usage of OrderPatch
- reorder: missing check for 'before' being null
- reorder: affected-items in op. not consistent with modified items
- move: session.move must remember srcId
- spi: add possibility to obtain sessionInfo for another workspace based on an existing sessionInfo.
- uriresolver: defensive check for type of ItemId
Modified:
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Move.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/ReorderNodes.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java
jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java
jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java?view=diff&rev=464431&r1=464430&r2=464431
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java Mon Oct 16 02:39:18 2006
@@ -49,6 +49,7 @@
import org.apache.jackrabbit.spi.SessionInfo;
import org.apache.jackrabbit.spi.NodeId;
import org.apache.jackrabbit.spi.IdFactory;
+import org.apache.jackrabbit.spi.XASessionInfo;
import org.apache.commons.collections.map.ReferenceMap;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
@@ -738,7 +739,14 @@
//--------------------------------------------------------------------------
SessionImpl switchWorkspace(String workspaceName) throws AccessDeniedException,
NoSuchWorkspaceException, RepositoryException {
- return new SessionImpl(sessionInfo, repository, config);
+ checkAccessibleWorkspace(workspaceName);
+
+ SessionInfo info = config.getRepositoryService().obtain(sessionInfo, workspaceName);
+ if (info instanceof XASessionInfo) {
+ return new XASessionImpl((XASessionInfo) info, repository, config);
+ } else {
+ return new SessionImpl(info, repository, config);
+ }
}
/**
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java?view=diff&rev=464431&r1=464430&r2=464431
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java Mon Oct 16 02:39:18 2006
@@ -678,7 +678,7 @@
}
public void visit(Move operation) throws LockException, ConstraintViolationException, AccessDeniedException, ItemExistsException, UnsupportedRepositoryOperationException, VersionException, RepositoryException {
- NodeId moveId = operation.getNodeState().getNodeId();
+ NodeId moveId = operation.getSourceId();
NodeId destParentId = operation.getDestinationParentState().getNodeId();
if (batch == null) {
events = service.move(sessionInfo, moveId, destParentId, operation.getDestinationName());
@@ -733,7 +733,10 @@
public void visit(ReorderNodes operation) throws RepositoryException {
NodeId parentId = operation.getParentState().getNodeId();
NodeId insertId = operation.getInsertNode().getNodeId();
- NodeId beforeId = operation.getBeforeNode().getNodeId();
+ NodeId beforeId = null;
+ if (operation.getBeforeNode() != null) {
+ beforeId = operation.getBeforeNode().getNodeId() ;
+ }
batch.reorderNodes(parentId, insertId, beforeId);
}
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Move.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Move.java?view=diff&rev=464431&r1=464430&r2=464431
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Move.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/Move.java Mon Oct 16 02:39:18 2006
@@ -25,6 +25,7 @@
import org.apache.jackrabbit.name.QName;
import org.apache.jackrabbit.name.MalformedPathException;
import org.apache.jackrabbit.name.NamespaceResolver;
+import org.apache.jackrabbit.spi.NodeId;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
@@ -44,12 +45,14 @@
private static Logger log = LoggerFactory.getLogger(Move.class);
+ private final NodeId srcId;
private final NodeState srcState;
private final NodeState srcParentState;
private final NodeState destParentState;
private final QName destName;
private Move(NodeState srcNodeState, NodeState srcParentState, NodeState destParentState, QName destName) {
+ this.srcId = (NodeId) srcNodeState.getId();
this.srcState = srcNodeState;
this.srcParentState = srcParentState;
this.destParentState = destParentState;
@@ -70,7 +73,11 @@
}
//----------------------------------------< Access Operation Parameters >---
- public NodeState getNodeState() {
+ public NodeId getSourceId() {
+ return srcId;
+ }
+
+ public NodeState getSourceState() {
return srcState;
}
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/ReorderNodes.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/ReorderNodes.java?view=diff&rev=464431&r1=464430&r2=464431
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/ReorderNodes.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/operation/ReorderNodes.java Mon Oct 16 02:39:18 2006
@@ -41,10 +41,6 @@
this.insert = insert;
this.before = before;
addAffectedItemState(parentState);
- addAffectedItemState(insert);
- if (before != null) {
- addAffectedItemState(before);
- }
}
//----------------------------------------------------------< Operation >---
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java?view=diff&rev=464431&r1=464430&r2=464431
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java Mon Oct 16 02:39:18 2006
@@ -22,7 +22,6 @@
import org.apache.jackrabbit.spi.QNodeDefinition;
import org.apache.jackrabbit.name.Path;
import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.MalformedPathException;
import org.apache.jackrabbit.spi.NodeId;
import org.apache.jackrabbit.spi.ItemId;
import org.apache.jackrabbit.spi.Event;
@@ -58,22 +57,6 @@
private static Logger log = LoggerFactory.getLogger(NodeState.class);
/**
- * A current element Path instance.
- */
- public static final Path CURRENT_PATH;
-
- static {
- try {
- Path.PathBuilder builder = new Path.PathBuilder();
- builder.addFirst(Path.CURRENT_ELEMENT);
- CURRENT_PATH = builder.getPath();
- } catch (MalformedPathException e) {
- // path is always valid
- throw new InternalError("unable to create path from '.'");
- }
- }
-
- /**
* the name of this node's primary type
*/
private QName nodeTypeName;
@@ -565,71 +548,71 @@
switch (event.getType()) {
case Event.NODE_ADDED:
case Event.PROPERTY_ADDED:
- if (id.equals(event.getParentId())) {
- ItemId evId = event.getItemId();
- ItemState newState = null;
+ if (!id.equals(event.getParentId())) {
+ // TODO: TOBEFIXED. this should never occur and indicates severe consistency issue.
+ throw new IllegalArgumentException("Event parent (" + event.getParentId() + ") does not match this state with id: " + id);
+ }
+ ItemId evId = event.getItemId();
+ ItemState newState = null;
- if (evId.denotesNode()) {
- QName name = event.getQPath().getNameElement().getName();
- int index = event.getQPath().getNameElement().getNormalizedIndex();
- String uuid = (((NodeId)evId).getPath() != null) ? null : ((NodeId)evId).getUUID();
-
- // add new childNodeEntry if it has not been added by
- // some earlier 'add' event
- // TODO: TOBEFIXED for SNSs
- ChildNodeEntry cne = getChildNodeEntry(name, index);
- if (cne == null || ((uuid == null) ? cne.getUUID() != null : !uuid.equals(cne.getUUID()))) {
- cne = childNodeEntries.add(name, uuid);
- }
- try {
- newState = cne.getNodeState();
- } catch (ItemStateException e) {
- log.error("Internal error", e);
- }
+ if (evId.denotesNode()) {
+ QName name = event.getQPath().getNameElement().getName();
+ int index = event.getQPath().getNameElement().getNormalizedIndex();
+ String uuid = (((NodeId)evId).getPath() != null) ? null : ((NodeId)evId).getUUID();
+
+ // add new childNodeEntry if it has not been added by
+ // some earlier 'add' event
+ // TODO: TOBEFIXED for SNSs
+ ChildNodeEntry cne = getChildNodeEntry(name, index);
+ if (cne == null || ((uuid == null) ? cne.getUUID() != null : !uuid.equals(cne.getUUID()))) {
+ cne = childNodeEntries.add(name, uuid);
+ }
+ try {
+ newState = cne.getNodeState();
+ } catch (ItemStateException e) {
+ log.error("Internal error", e);
+ }
+ } else {
+ QName pName = ((PropertyId) event.getItemId()).getQName();
+ // create a new property reference if it has not been
+ // added by some earlier 'add' event
+ ChildPropertyEntry re;
+ if (hasPropertyName(pName)) {
+ re = (ChildPropertyEntry) properties.get(pName);
} else {
- QName pName = ((PropertyId) event.getItemId()).getQName();
- // create a new property reference if it has not been
- // added by some earlier 'add' event
- ChildPropertyEntry re;
- if (hasPropertyName(pName)) {
- re = (ChildPropertyEntry) properties.get(pName);
- } else {
- re = PropertyReference.create(this, pName, isf, idFactory);
- properties.put(pName, re);
- }
- try {
- newState = re.getPropertyState();
- } catch (ItemStateException e) {
- log.error("Internal error", e);
- }
- // make sure this state is up to date (uuid/mixins)
- refresh(pName, event.getType());
+ re = PropertyReference.create(this, pName, isf, idFactory);
+ properties.put(pName, re);
+ }
+ try {
+ newState = re.getPropertyState();
+ } catch (ItemStateException e) {
+ log.error("Internal error", e);
}
+ // make sure this state is up to date (uuid/mixins)
+ refresh(pName, event.getType());
+ }
- // connect the added state from the transient layer to the
- // new workspaceState and make sure its data are updated.
- if (newState != null && changeLog != null) {
- for (Iterator it = changeLog.addedStates(); it.hasNext();) {
- ItemState added = (ItemState) it.next();
- if (added.hasOverlayedState()) {
- // already connected
- continue;
- }
- // TODO: TOBEFIXED. may fail (produce wrong results) for SNSs, since currently events upon 'save' are not garantied to be 'local' changes only
- if (added.getId().equals(evId)) {
- added.connect(newState);
- added.merge();
- break;
- }
+ // connect the added state from the transient layer to the
+ // new workspaceState and make sure its data are updated.
+ if (newState != null && changeLog != null) {
+ for (Iterator it = changeLog.addedStates(); it.hasNext();) {
+ ItemState added = (ItemState) it.next();
+ if (added.hasOverlayedState()) {
+ // already connected
+ continue;
+ }
+ // TODO: TOBEFIXED. may fail (produce wrong results) for SNSs, since currently events upon 'save' are not garantied to be 'local' changes only
+ // TODO: TOBEFIXED. equals to false if added-state is referenceable.
+ if (added.getId().equals(evId)) {
+ added.connect(newState);
+ added.merge();
+ break;
}
}
- // and let the transiently modified session state now, that
- // its workspace state has been touched.
- setStatus(Status.MODIFIED);
- } else {
- // ILLEGAL
- throw new IllegalArgumentException("Illegal event type " + event.getType() + " for NodeState.");
}
+ // and let the transiently modified session state now, that
+ // its workspace state has been touched.
+ setStatus(Status.MODIFIED);
break;
case Event.NODE_REMOVED:
@@ -779,25 +762,29 @@
Collection wspEntries = wspState.getChildNodeEntries();
// remove child entries, that are 'REMOVED' in the wsp layer
+ Set toRemove = new HashSet();
for (Iterator it = getChildNodeEntries().iterator(); it.hasNext();) {
ChildNodeEntry cne = (ChildNodeEntry) it.next();
if (cne.isAvailable()) {
try {
NodeState ns = cne.getNodeState();
if (ns.getStatus() == Status.REMOVED) {
- childNodeEntries.remove(cne.getName(), cne.getIndex());
+ toRemove.add(cne);
}
} catch (ItemStateException e) {
// should not occur
log.error("Internal error while merging item node states.", e);
}
} else if (wspState.getChildNodeEntries(cne.getName()).isEmpty()) {
- childNodeEntries.remove(cne.getName(), cne.getIndex());
+ toRemove.add(cne);
} // TODO: clean up same-named siblings
}
+ for (Iterator it = toRemove.iterator(); it.hasNext();) {
+ ChildNodeEntry cne = (ChildNodeEntry) it.next();
+ childNodeEntries.remove(cne.getName(), cne.getIndex());
+ }
// add missing child entries
-
for (Iterator it = wspEntries.iterator(); it.hasNext();) {
ChildNodeEntry wspEntry = (ChildNodeEntry) it.next();
List namedEntries = getChildNodeEntries(wspEntry.getName());
@@ -1168,6 +1155,7 @@
}
// mark both this and newParent modified
markModified();
+ childState.markModified();
newParent.markModified();
}
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java?view=diff&rev=464431&r1=464430&r2=464431
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java Mon Oct 16 02:39:18 2006
@@ -476,9 +476,8 @@
public void visit(Move operation) throws LockException, ConstraintViolationException, AccessDeniedException, ItemExistsException, UnsupportedRepositoryOperationException, VersionException, RepositoryException {
// retrieve states and assert they are modifiable
- NodeState srcState = operation.getNodeState();
+ NodeState srcState = operation.getSourceState();
NodeState srcParent = operation.getSourceParentState();
-
NodeState destParent = operation.getDestinationParentState();
// state validation: move-Source can be removed from old/added to new parent
@@ -556,7 +555,7 @@
EffectiveNodeType ent = validator.getEffectiveNodeType(nState);
QPropertyDefinition pd = ent.getApplicablePropertyDefinition(QName.JCR_MIXINTYPES, PropertyType.NAME, true);
QValue[] mixinValue = QValue.create(nState.getMixinTypeNames());
- int options = 0; // nothing to check
+ int options = ItemStateValidator.CHECK_LOCK | ItemStateValidator.CHECK_VERSIONING;
addPropertyState(nState, pd.getQName(), pd.getRequiredType(), mixinValue, pd, options);
}
} else {
@@ -568,7 +567,7 @@
if (nState.hasPropertyName(QName.JCR_MIXINTYPES)) {
try {
PropertyState pState = nState.getPropertyState(QName.JCR_MIXINTYPES);
- int options = 0; // no checks required
+ int options = ItemStateValidator.CHECK_LOCK | ItemStateValidator.CHECK_VERSIONING;
removeItemState(pState, options);
} catch (ItemStateException e) {
// should not occur, since existance has been asserted before
Modified: jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java?view=diff&rev=464431&r1=464430&r2=464431
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java (original)
+++ jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java Mon Oct 16 02:39:18 2006
@@ -79,6 +79,20 @@
throws LoginException, NoSuchWorkspaceException, RepositoryException;
/**
+ * Returns a new <code>SessionInfo</code> for the given workspace name that
+ * will be used by other methods on the <code>RepositoryService</code>.
+ *
+ * @param sessionInfo for another workspace
+ * @return a <code>SessionInfo</code> if authentication was successful.
+ * @throws LoginException if authentication of the user fails.
+ * @throws NoSuchWorkspaceException if the specified <code>workspaceName</code>
+ * is not recognized.
+ * @throws RepositoryException if an error occurs.
+ */
+ public SessionInfo obtain(SessionInfo sessionInfo, String workspaceName)
+ throws LoginException, NoSuchWorkspaceException, RepositoryException;
+
+ /**
* Indicates to the <code>RepositoryService</code>, that the given SessionInfo
* will not be used any more.
*
Modified: jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java?view=diff&rev=464431&r1=464430&r2=464431
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java Mon Oct 16 02:39:18 2006
@@ -65,6 +65,7 @@
import org.apache.jackrabbit.webdav.DavException;
import org.apache.jackrabbit.webdav.MultiStatus;
import org.apache.jackrabbit.webdav.DavMethods;
+import org.apache.jackrabbit.webdav.ordering.OrderingConstants;
import org.apache.jackrabbit.webdav.observation.SubscriptionInfo;
import org.apache.jackrabbit.webdav.observation.EventType;
import org.apache.jackrabbit.webdav.observation.Filter;
@@ -390,15 +391,27 @@
*
* @see RepositoryService#obtain(Credentials, String)
*/
- public SessionInfo obtain(Credentials credentials, String workspaceName) throws LoginException, NoSuchWorkspaceException, RepositoryException {
+ public SessionInfo obtain(Credentials credentials, String workspaceName)
+ throws LoginException, NoSuchWorkspaceException, RepositoryException {
+ CredentialsWrapper dc = new CredentialsWrapper(credentials);
+ return obtain(dc, workspaceName);
+ }
+
+ public SessionInfo obtain(SessionInfo sessionInfo, String workspaceName)
+ throws LoginException, NoSuchWorkspaceException, RepositoryException {
+ checkSessionInfo(sessionInfo);
+ return obtain(((SessionInfoImpl)sessionInfo).getCredentials(), workspaceName);
+ }
+
+ private SessionInfo obtain(CredentialsWrapper credentials, String workspaceName)
+ throws LoginException, NoSuchWorkspaceException, RepositoryException {
// check if the workspace with the given name is accessible
PropFindMethod method = null;
try {
DavPropertyNameSet nameSet = new DavPropertyNameSet();
nameSet.add(DeltaVConstants.WORKSPACE);
method = new PropFindMethod(uriResolver.getWorkspaceUri(workspaceName), nameSet, DavConstants.DEPTH_0);
- CredentialsWrapper dc = new CredentialsWrapper(credentials);
- getClient(dc.getCredentials()).executeMethod(method);
+ getClient(credentials.getCredentials()).executeMethod(method);
MultiStatusResponse[] responses = method.getResponseBodyAsMultiStatus().getResponses();
if (responses.length != 1) {
@@ -412,7 +425,7 @@
if (!wspName.equals(workspaceName)) {
throw new LoginException("Login failed: Invalid workspace name " + workspaceName);
}
- return new SessionInfoImpl(dc, workspaceName, new SubscriptionMgrImpl());
+ return new SessionInfoImpl(credentials, workspaceName, new SubscriptionMgrImpl());
} else {
throw new LoginException("Login failed: Unknown workspace '" + workspaceName+ " '.");
}
@@ -1787,13 +1800,20 @@
public void reorderNodes(NodeId parentId, NodeId srcNodeId, NodeId beforeNodeId) throws UnsupportedRepositoryOperationException, VersionException, ConstraintViolationException, ItemNotFoundException, LockException, AccessDeniedException, RepositoryException {
checkConsumed();
try {
+ String uri = getItemUri(parentId, sessionInfo);
String srcUri = getItemUri(srcNodeId, sessionInfo);
String srcSegment = Text.getName(srcUri, true);
- String targetSegment = Text.getName(getItemUri(beforeNodeId, sessionInfo), true);
-
- String uri = getItemUri(parentId, sessionInfo);
- OrderPatchMethod method = new OrderPatchMethod(uri, srcSegment, targetSegment, true);
+ OrderPatchMethod method;
+ if (beforeNodeId == null) {
+ // move src to the end
+ method = new OrderPatchMethod(uri, OrderingConstants.ORDERING_TYPE_CUSTOM, srcSegment, false);
+ } else {
+ // insert src before the targetSegment
+ String beforeUri = getItemUri(beforeNodeId, sessionInfo);
+ String targetSegment = Text.getName(beforeUri, true);
+ method = new OrderPatchMethod(uri, OrderingConstants.ORDERING_TYPE_CUSTOM, srcSegment, targetSegment, true);
+ }
methods.add(method);
} catch (IOException e) {
throw new RepositoryException(e);
Modified: jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java?view=diff&rev=464431&r1=464430&r2=464431
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java Mon Oct 16 02:39:18 2006
@@ -182,7 +182,10 @@
String workspaceName) throws RepositoryException {
IdURICache cache = getCache(workspaceName);
if (cache.containsUri(response.getHref())) {
- return (NodeId) cache.getItemId(response.getHref());
+ ItemId id = cache.getItemId(response.getHref());
+ if (id.denotesNode()) {
+ return (NodeId) id;
+ }
}
NodeId nodeId;
@@ -223,19 +226,22 @@
String workspaceName) throws RepositoryException {
IdURICache cache = getCache(workspaceName);
if (cache.containsUri(response.getHref())) {
- return (PropertyId) cache.getItemId(response.getHref());
- } else {
- try {
- DavPropertySet propSet = response.getProperties(DavServletResponse.SC_OK);
- QName name = NameFormat.parse(propSet.get(ItemResourceConstants.JCR_NAME).getValue().toString(), nsResolver);
- PropertyId propertyId = service.getIdFactory().createPropertyId(parentId, name);
-
- cache.add(response.getHref(), propertyId);
- return propertyId;
- } catch (BaseException e) {
- throw new RepositoryException(e);
+ ItemId id = cache.getItemId(response.getHref());
+ if (!id.denotesNode()) {
+ return (PropertyId) id;
}
}
+
+ try {
+ DavPropertySet propSet = response.getProperties(DavServletResponse.SC_OK);
+ QName name = NameFormat.parse(propSet.get(ItemResourceConstants.JCR_NAME).getValue().toString(), nsResolver);
+ PropertyId propertyId = service.getIdFactory().createPropertyId(parentId, name);
+
+ cache.add(response.getHref(), propertyId);
+ return propertyId;
+ } catch (BaseException e) {
+ throw new RepositoryException(e);
+ }
}
//-------------------------------------------------------< URI resolver >---
@@ -270,40 +276,43 @@
IdURICache cache = getCache(sessionInfo.getWorkspaceName());
if (cache.containsUri(uri)) {
// id has been accessed before and is cached
- return (NodeId) cache.getItemId(uri);
- } else {
- // retrieve parentId from cache or by recursive calls
- NodeId parentId;
- if (uri.equals(getRootItemUri(sessionInfo.getWorkspaceName()))) {
- parentId = null;
- } else {
- String parentUri = Text.getRelativeParent(uri, 1, true);
- parentId = getNodeId(parentUri, sessionInfo);
+ ItemId id = cache.getItemId(uri);
+ if (id.denotesNode()) {
+ return (NodeId) id;
}
+ }
- DavPropertyNameSet nameSet = new DavPropertyNameSet();
- nameSet.add(ItemResourceConstants.JCR_UUID);
- nameSet.add(ItemResourceConstants.JCR_NAME);
- nameSet.add(ItemResourceConstants.JCR_INDEX);
- DavMethodBase method = null;
- try {
- method = new PropFindMethod(uri, nameSet, DavConstants.DEPTH_0);
-
- service.getClient(sessionInfo).executeMethod(method);
- MultiStatusResponse[] responses = method.getResponseBodyAsMultiStatus().getResponses();
- if (responses.length != 1) {
- throw new ItemNotFoundException("Unable to retrieve the node with id " + uri);
- }
- return buildNodeId(parentId, responses[0], sessionInfo.getWorkspaceName());
+ // retrieve parentId from cache or by recursive calls
+ NodeId parentId;
+ if (uri.equals(getRootItemUri(sessionInfo.getWorkspaceName()))) {
+ parentId = null;
+ } else {
+ String parentUri = Text.getRelativeParent(uri, 1, true);
+ parentId = getNodeId(parentUri, sessionInfo);
+ }
- } catch (IOException e) {
- throw new RepositoryException(e);
- } catch (DavException e) {
- throw ExceptionConverter.generate(e);
- } finally {
- if (method != null) {
- method.releaseConnection();
- }
+ DavPropertyNameSet nameSet = new DavPropertyNameSet();
+ nameSet.add(ItemResourceConstants.JCR_UUID);
+ nameSet.add(ItemResourceConstants.JCR_NAME);
+ nameSet.add(ItemResourceConstants.JCR_INDEX);
+ DavMethodBase method = null;
+ try {
+ method = new PropFindMethod(uri, nameSet, DavConstants.DEPTH_0);
+
+ service.getClient(sessionInfo).executeMethod(method);
+ MultiStatusResponse[] responses = method.getResponseBodyAsMultiStatus().getResponses();
+ if (responses.length != 1) {
+ throw new ItemNotFoundException("Unable to retrieve the node with id " + uri);
+ }
+ return buildNodeId(parentId, responses[0], sessionInfo.getWorkspaceName());
+
+ } catch (IOException e) {
+ throw new RepositoryException(e);
+ } catch (DavException e) {
+ throw ExceptionConverter.generate(e);
+ } finally {
+ if (method != null) {
+ method.releaseConnection();
}
}
}
@@ -314,23 +323,26 @@
public PropertyId getPropertyId(String uri, SessionInfo sessionInfo) throws RepositoryException {
IdURICache cache = getCache(sessionInfo.getWorkspaceName());
if (cache.containsUri(uri)) {
- return (PropertyId) cache.getItemId(uri);
- } else {
- // separate parent uri and property JCRName
- String parentUri = Text.getRelativeParent(uri, 1, true);
- // make sure propName is unescaped
- String propName = Text.unescape(Text.getName(uri, true));
- // retrieve parent node id
- NodeId parentId = getNodeId(parentUri, sessionInfo);
- // build property id
- try {
- PropertyId propertyId = service.getIdFactory().createPropertyId(parentId, NameFormat.parse(propName, nsResolver));
- cache.add(uri, propertyId);
-
- return propertyId;
- } catch (NameException e) {
- throw new RepositoryException(e);
+ ItemId id = cache.getItemId(uri);
+ if (!id.denotesNode()) {
+ return (PropertyId) id;
}
+ }
+
+ // separate parent uri and property JCRName
+ String parentUri = Text.getRelativeParent(uri, 1, true);
+ // make sure propName is unescaped
+ String propName = Text.unescape(Text.getName(uri, true));
+ // retrieve parent node id
+ NodeId parentId = getNodeId(parentUri, sessionInfo);
+ // build property id
+ try {
+ PropertyId propertyId = service.getIdFactory().createPropertyId(parentId, NameFormat.parse(propName, nsResolver));
+ cache.add(uri, propertyId);
+
+ return propertyId;
+ } catch (NameException e) {
+ throw new RepositoryException(e);
}
}
}