You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2010/06/22 17:01:23 UTC
svn commit: r956912 - in
/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core:
./ session/ version/
Author: jukka
Date: Tue Jun 22 15:01:23 2010
New Revision: 956912
URL: http://svn.apache.org/viewvc?rev=956912&view=rev
Log:
JCR-890: concurrent read-only access to a session
Turn Item.save() into a managed operation.
Introduce SessionContext to avoid having to pass a yet another reference around.
Added:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionContext.java (with props)
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionImpl.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java?rev=956912&r1=956911&r2=956912&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java Tue Jun 22 15:01:23 2010
@@ -56,6 +56,8 @@ import org.apache.jackrabbit.core.nodety
import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
import org.apache.jackrabbit.core.security.AccessManager;
import org.apache.jackrabbit.core.security.authorization.Permission;
+import org.apache.jackrabbit.core.session.SessionContext;
+import org.apache.jackrabbit.core.session.SessionOperation;
import org.apache.jackrabbit.core.state.ChildNodeEntry;
import org.apache.jackrabbit.core.state.ItemState;
import org.apache.jackrabbit.core.state.ItemStateException;
@@ -90,7 +92,12 @@ public abstract class ItemImpl implement
protected final ItemId id;
/**
- * <code>Session</code> through which this <code>Item</code> was acquired
+ * The component context of the session to which this item is associated.
+ */
+ protected final SessionContext sessionContext;
+
+ /**
+ * The session to which this item is associated.
*/
protected final SessionImpl session;
@@ -113,17 +120,23 @@ public abstract class ItemImpl implement
* Package private constructor.
*
* @param itemMgr the <code>ItemManager</code> that created this <code>Item</code>
- * @param session the <code>Session</code> through which this <code>Item</code> is acquired
+ * @param sessionContext the component context of the associated session
* @param data ItemData of this <code>Item</code>
*/
- ItemImpl(ItemManager itemMgr, SessionImpl session, ItemData data) {
- this.session = session;
- stateMgr = session.getItemStateManager();
+ ItemImpl(ItemManager itemMgr, SessionContext sessionContext, ItemData data) {
+ this.sessionContext = sessionContext;
+ this.session = sessionContext.getSessionImpl();
+ this.stateMgr = session.getItemStateManager();
this.id = data.getId();
this.itemMgr = itemMgr;
this.data = data;
}
+ protected void perform(SessionOperation operation)
+ throws RepositoryException {
+ sessionContext.getSessionState().perform(operation);
+ }
+
/**
* Performs a sanity check on this item and the associated session.
*
@@ -131,7 +144,7 @@ public abstract class ItemImpl implement
*/
protected void sanityCheck() throws RepositoryException {
// check session status
- session.sanityCheck();
+ perform(new SessionOperation("sanity check"));
// check status of this item for read operation
final int status = data.getStatus();
@@ -955,16 +968,21 @@ public abstract class ItemImpl implement
/**
* {@inheritDoc}
*/
- public void save()
- throws AccessDeniedException, ItemExistsException,
- ConstraintViolationException, InvalidItemStateException,
- ReferentialIntegrityException, VersionException, LockException,
- NoSuchNodeTypeException, RepositoryException {
+ public void save() throws RepositoryException {
// check state of this instance
sanityCheck();
- // synchronize on this session
- synchronized (session) {
+ perform(new SaveOperation());
+ }
+
+ private class SaveOperation extends SessionOperation {
+
+ public SaveOperation() {
+ super("item save");
+ }
+
+ @Override
+ public void perform() throws RepositoryException {
/**
* build list of transient (i.e. new & modified) states that
* should be persisted
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java?rev=956912&r1=956911&r2=956912&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java Tue Jun 22 15:01:23 2010
@@ -52,6 +52,7 @@ import org.apache.jackrabbit.core.util.D
import org.apache.jackrabbit.core.version.VersionHistoryImpl;
import org.apache.jackrabbit.core.version.VersionImpl;
import org.apache.jackrabbit.core.security.AccessManager;
+import org.apache.jackrabbit.core.session.SessionContext;
import org.apache.jackrabbit.spi.Name;
import org.apache.jackrabbit.spi.Path;
import org.apache.jackrabbit.spi.QPropertyDefinition;
@@ -92,6 +93,11 @@ public class ItemManager implements Dump
private final org.apache.jackrabbit.spi.commons.nodetype.NodeDefinitionImpl rootNodeDef;
private final NodeId rootNodeId;
+ /**
+ * Component context of the associated session.
+ */
+ protected final SessionContext sessionContext;
+
protected final SessionImpl session;
private final SessionItemStateManager sism;
@@ -118,20 +124,19 @@ public class ItemManager implements Dump
* @param sism the item state manager associated with the new
* instance
* @param hierMgr the hierarchy manager
- * @param session the session associated with the new instance
+ * @param sessionContext component context of the associated session
* @param rootNodeDef the definition of the root node
* @param rootNodeId the id of the root node
* @param dataStore the data store of this repository, or <code>null</code>
*/
- protected ItemManager(SessionItemStateManager sism,
- HierarchyManager hierMgr,
- SessionImpl session,
- NodeDefinitionImpl rootNodeDef,
- NodeId rootNodeId,
- DataStore dataStore) {
+ protected ItemManager(
+ SessionItemStateManager sism, HierarchyManager hierMgr,
+ SessionContext sessionContext, NodeDefinitionImpl rootNodeDef,
+ NodeId rootNodeId, DataStore dataStore) {
this.sism = sism;
this.hierMgr = hierMgr;
- this.session = session;
+ this.sessionContext = sessionContext;
+ this.session = sessionContext.getSessionImpl();
this.rootNodeDef = rootNodeDef;
this.rootNodeId = rootNodeId;
this.dataStore = dataStore;
@@ -149,7 +154,7 @@ public class ItemManager implements Dump
* @param itemStateProvider the item state provider associated with
* the new instance
* @param hierMgr the hierarchy manager
- * @param session the session associated with the new instance
+ * @param sessionContext component context of the associated session
* @param rootNodeDef the definition of the root node
* @param rootNodeId the id of the root node
* @param dataStore the data store of this repository, or <code>null</code>
@@ -158,12 +163,12 @@ public class ItemManager implements Dump
public static ItemManager createInstance(
SessionItemStateManager itemStateProvider,
HierarchyManager hierMgr,
- SessionImpl session,
+ SessionContext sessionContext,
NodeDefinitionImpl rootNodeDef,
NodeId rootNodeId,
DataStore dataStore) {
ItemManager mgr = new ItemManager(
- itemStateProvider, hierMgr, session, rootNodeDef,
+ itemStateProvider, hierMgr, sessionContext, rootNodeDef,
rootNodeId, dataStore);
itemStateProvider.addListener(mgr);
return mgr;
@@ -865,18 +870,18 @@ public class ItemManager implements Dump
// check special nodes
final NodeState state = data.getNodeState();
if (state.getNodeTypeName().equals(NameConstants.NT_VERSION)) {
- return new VersionImpl(this, session, data);
+ return new VersionImpl(this, sessionContext, data);
} else if (state.getNodeTypeName().equals(NameConstants.NT_VERSIONHISTORY)) {
- return new VersionHistoryImpl(this, session, data);
+ return new VersionHistoryImpl(this, sessionContext, data);
} else {
// create node object
- return new NodeImpl(this, session, data);
+ return new NodeImpl(this, sessionContext, data);
}
}
private PropertyImpl createPropertyInstance(PropertyData data) {
// check special nodes
- return new PropertyImpl(this, session, data, dataStore);
+ return new PropertyImpl(this, sessionContext, data, dataStore);
}
//---------------------------------------------------< item cache methods >
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java?rev=956912&r1=956911&r2=956912&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java Tue Jun 22 15:01:23 2010
@@ -80,6 +80,7 @@ import org.apache.jackrabbit.core.nodety
import org.apache.jackrabbit.core.query.QueryManagerImpl;
import org.apache.jackrabbit.core.security.AccessManager;
import org.apache.jackrabbit.core.security.authorization.Permission;
+import org.apache.jackrabbit.core.session.SessionContext;
import org.apache.jackrabbit.core.state.ChildNodeEntry;
import org.apache.jackrabbit.core.state.ItemState;
import org.apache.jackrabbit.core.state.ItemStateException;
@@ -123,11 +124,13 @@ public class NodeImpl extends ItemImpl i
* Protected constructor.
*
* @param itemMgr the <code>ItemManager</code> that created this <code>Node</code> instance
- * @param session the <code>Session</code> through which this <code>Node</code> is acquired
+ * @param sessionContext the component context of the associated session
* @param data the node data
*/
- protected NodeImpl(ItemManager itemMgr, SessionImpl session, AbstractNodeData data) {
- super(itemMgr, session, data);
+ protected NodeImpl(
+ ItemManager itemMgr, SessionContext sessionContext,
+ AbstractNodeData data) {
+ super(itemMgr, sessionContext, data);
this.data = data;
// paranoid sanity check
NodeTypeRegistry ntReg = session.getNodeTypeManager().getNodeTypeRegistry();
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java?rev=956912&r1=956911&r2=956912&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java Tue Jun 22 15:01:23 2010
@@ -42,6 +42,7 @@ import javax.jcr.version.VersionExceptio
import org.apache.jackrabbit.core.data.DataStore;
import org.apache.jackrabbit.core.id.PropertyId;
import org.apache.jackrabbit.core.security.authorization.Permission;
+import org.apache.jackrabbit.core.session.SessionContext;
import org.apache.jackrabbit.core.state.ItemState;
import org.apache.jackrabbit.core.state.ItemStateException;
import org.apache.jackrabbit.core.state.PropertyState;
@@ -76,14 +77,14 @@ public class PropertyImpl extends ItemIm
* Package private constructor.
*
* @param itemMgr the <code>ItemManager</code> that created this <code>Property</code>
- * @param session the <code>Session</code> through which this <code>Property</code> is acquired
+ * @param sessionContext the component context of the associated session
* @param data the property data
* @param dataStore the data store of this repository, or <code>null</code>
*/
PropertyImpl(
- ItemManager itemMgr, SessionImpl session, PropertyData data,
- DataStore dataStore) {
- super(itemMgr, session, data);
+ ItemManager itemMgr, SessionContext sessionContext,
+ PropertyData data, DataStore dataStore) {
+ super(itemMgr, sessionContext, data);
this.data = data;
this.dataStore = dataStore;
// value will be read on demand
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java?rev=956912&r1=956911&r2=956912&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java Tue Jun 22 15:01:23 2010
@@ -39,8 +39,8 @@ import org.apache.jackrabbit.core.securi
import org.apache.jackrabbit.core.security.authorization.Permission;
import org.apache.jackrabbit.core.session.ActiveSessionState;
import org.apache.jackrabbit.core.session.ClosedSessionState;
+import org.apache.jackrabbit.core.session.SessionContext;
import org.apache.jackrabbit.core.session.SessionOperation;
-import org.apache.jackrabbit.core.session.SessionState;
import org.apache.jackrabbit.core.state.LocalItemStateManager;
import org.apache.jackrabbit.core.state.NodeState;
import org.apache.jackrabbit.core.state.SessionItemStateManager;
@@ -66,7 +66,6 @@ import org.xml.sax.InputSource;
import javax.jcr.AccessDeniedException;
import javax.jcr.Credentials;
-import javax.jcr.InvalidItemStateException;
import javax.jcr.Item;
import javax.jcr.ItemExistsException;
import javax.jcr.ItemNotFoundException;
@@ -86,7 +85,6 @@ import javax.jcr.Workspace;
import javax.jcr.lock.Lock;
import javax.jcr.lock.LockException;
import javax.jcr.nodetype.ConstraintViolationException;
-import javax.jcr.nodetype.NoSuchNodeTypeException;
import javax.jcr.observation.EventListener;
import javax.jcr.observation.ObservationManager;
import javax.jcr.retention.RetentionManager;
@@ -127,9 +125,9 @@ public class SessionImpl extends Abstrac
private static Logger log = LoggerFactory.getLogger(SessionImpl.class);
/**
- * The state of this session.
+ * The component context of this session.
*/
- protected volatile SessionState state = new ActiveSessionState();
+ protected final SessionContext context = new SessionContext(this);
/**
* The component context of the repository that issued this session.
@@ -274,6 +272,7 @@ public class SessionImpl extends Abstrac
RepositoryContext repositoryContext, Subject subject,
WorkspaceConfig wspConfig)
throws AccessDeniedException, RepositoryException {
+ this.context.setSessionState(new ActiveSessionState());
this.repositoryContext = repositoryContext;
this.subject = subject;
@@ -334,7 +333,7 @@ public class SessionImpl extends Abstrac
protected ItemManager createItemManager(SessionItemStateManager itemStateMgr,
HierarchyManager hierMgr) {
return ItemManager.createInstance(
- itemStateMgr, hierMgr, this,
+ itemStateMgr, hierMgr, context,
ntMgr.getRootNodeDefinition(),
repositoryContext.getRootNodeId(),
repositoryContext.getDataStore());
@@ -375,6 +374,11 @@ public class SessionImpl extends Abstrac
return repositoryContext.getSecurityManager().getAccessManager(this, ctx);
}
+ private void perform(SessionOperation operation)
+ throws RepositoryException {
+ context.getSessionState().perform(operation);
+ }
+
/**
* Performs a sanity check on this session.
*
@@ -383,7 +387,7 @@ public class SessionImpl extends Abstrac
* been closed explicitly or if it has expired)
*/
protected void sanityCheck() throws RepositoryException {
- state.perform(new SessionOperation("sanity check"));
+ perform(new SessionOperation("sanity check"));
}
/**
@@ -893,7 +897,7 @@ public class SessionImpl extends Abstrac
* {@inheritDoc}
*/
public void save() throws RepositoryException {
- state.perform(new SessionOperation("save") {
+ perform(new SessionOperation("save") {
@Override
public void perform() throws RepositoryException {
// JCR-2425: check whether session is allowed to read root node
@@ -911,7 +915,7 @@ public class SessionImpl extends Abstrac
* {@inheritDoc}
*/
public void refresh(final boolean keepChanges) throws RepositoryException {
- state.perform(new SessionOperation("refresh") {
+ perform(new SessionOperation("refresh") {
@Override
public void perform() throws RepositoryException {
// JCR-1753: Ensure that we are up to date with cluster changes
@@ -1168,7 +1172,7 @@ public class SessionImpl extends Abstrac
* {@inheritDoc}
*/
public boolean isLive() {
- return state.isAlive();
+ return context.getSessionState().isAlive();
}
/**
@@ -1222,7 +1226,7 @@ public class SessionImpl extends Abstrac
wsp.dispose();
// invalidate session
- state = new ClosedSessionState();
+ context.setSessionState(new ClosedSessionState());
// logout JAAS subject
if (loginContext != null) {
Added: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionContext.java?rev=956912&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionContext.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionContext.java Tue Jun 22 15:01:23 2010
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.session;
+
+import org.apache.jackrabbit.core.SessionImpl;
+
+public class SessionContext {
+
+ private final SessionImpl session;
+
+ private volatile SessionState state;
+
+ public SessionContext(SessionImpl session) {
+ this.session = session;
+ }
+
+ public SessionImpl getSessionImpl() {
+ return session;
+ }
+
+ public SessionState getSessionState() {
+ return state;
+ }
+
+ public void setSessionState(SessionState state) {
+ this.state = state;
+ }
+
+}
Propchange: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionContext.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.java?rev=956912&r1=956911&r2=956912&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionHistoryImpl.java Tue Jun 22 15:01:23 2010
@@ -20,8 +20,8 @@ import org.apache.jackrabbit.core.Abstra
import org.apache.jackrabbit.core.ItemManager;
import org.apache.jackrabbit.core.id.NodeId;
import org.apache.jackrabbit.core.NodeImpl;
-import org.apache.jackrabbit.core.SessionImpl;
import org.apache.jackrabbit.core.security.authorization.Permission;
+import org.apache.jackrabbit.core.session.SessionContext;
import org.apache.jackrabbit.spi.Name;
import org.apache.jackrabbit.spi.commons.conversion.NameException;
import org.apache.jackrabbit.commons.iterator.FrozenNodeIteratorAdapter;
@@ -56,11 +56,13 @@ public class VersionHistoryImpl extends
/**
* Create a new instance of this class.
* @param itemMgr item manager
- * @param session session
+ * @param sessionContext component context of the associated session
* @param data node data
*/
- public VersionHistoryImpl(ItemManager itemMgr, SessionImpl session, AbstractNodeData data) {
- super(itemMgr, session, data);
+ public VersionHistoryImpl(
+ ItemManager itemMgr, SessionContext sessionContext,
+ AbstractNodeData data) {
+ super(itemMgr, sessionContext, data);
}
/**
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionImpl.java?rev=956912&r1=956911&r2=956912&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionImpl.java Tue Jun 22 15:01:23 2010
@@ -19,8 +19,8 @@ package org.apache.jackrabbit.core.versi
import org.apache.jackrabbit.core.ItemManager;
import org.apache.jackrabbit.core.AbstractNodeData;
import org.apache.jackrabbit.core.id.NodeId;
+import org.apache.jackrabbit.core.session.SessionContext;
import org.apache.jackrabbit.core.NodeImpl;
-import org.apache.jackrabbit.core.SessionImpl;
import javax.jcr.version.Version;
import javax.jcr.version.VersionHistory;
import org.slf4j.Logger;
@@ -47,11 +47,13 @@ public class VersionImpl extends NodeImp
/**
* Create a new instance of this class.
* @param itemMgr item manager
- * @param session session
+ * @param sessionContext component context of the associated session
* @param data node data
*/
- public VersionImpl(ItemManager itemMgr, SessionImpl session, AbstractNodeData data) {
- super(itemMgr, session, data);
+ public VersionImpl(
+ ItemManager itemMgr, SessionContext sessionContext,
+ AbstractNodeData data) {
+ super(itemMgr, sessionContext, data);
}
/**