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/10/06 15:17:12 UTC
svn commit: r1005019 - in
/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core:
SessionImpl.java session/SessionContext.java session/SessionState.java
Author: jukka
Date: Wed Oct 6 13:17:12 2010
New Revision: 1005019
URL: http://svn.apache.org/viewvc?rev=1005019&view=rev
Log:
JCR-2763: Drop the Dumpable interface
Make SessionContext.toString() more detailed while SessionImpl.toString() returns a more trimmed-down session name.
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionContext.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionState.java
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=1005019&r1=1005018&r2=1005019&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 Wed Oct 6 13:17:12 2010
@@ -32,6 +32,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.atomic.AtomicLong;
import javax.jcr.AccessDeniedException;
import javax.jcr.Credentials;
@@ -97,6 +98,7 @@ import org.apache.jackrabbit.spi.commons
import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
import org.apache.jackrabbit.spi.commons.name.NameConstants;
import org.apache.jackrabbit.spi.commons.namespace.NamespaceResolver;
+import org.apache.jackrabbit.util.Text;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.ContentHandler;
@@ -123,6 +125,11 @@ public class SessionImpl extends Abstrac
private static Logger log = LoggerFactory.getLogger(SessionImpl.class);
/**
+ * Session counter. Used to generate unique internal session names.
+ */
+ private static final AtomicLong SESSION_COUNTER = new AtomicLong();
+
+ /**
* The component context of this session.
*/
protected final SessionContext context;
@@ -149,6 +156,12 @@ public class SessionImpl extends Abstrac
protected final String userId;
/**
+ * Unique internal name of this session. Returned by the
+ * {@link #toString()} method for use in logging and debugging.
+ */
+ private final String sessionName;
+
+ /**
* the attributes of this session
*/
protected final Map<String, Object> attributes =
@@ -230,6 +243,13 @@ public class SessionImpl extends Abstrac
this.subject = subject;
this.userId = retrieveUserId(subject, wspConfig.getName());
+ long count = SESSION_COUNTER.incrementAndGet();
+ if (userId != null) {
+ String user = Text.escapeIllegalJcrChars(userId);
+ this.sessionName = "session-" + user + "-" + count;
+ } else {
+ this.sessionName = "session-" + count;
+ }
namePathResolver = new DefaultNamePathResolver(this, this, true);
context.setItemStateManager(createSessionItemStateManager());
@@ -1202,7 +1222,7 @@ public class SessionImpl extends Abstrac
*/
@Override
public String toString() {
- return context.toString();
+ return sessionName;
}
/**
Modified: 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=1005019&r1=1005018&r2=1005019&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionContext.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionContext.java Wed Oct 6 13:17:12 2010
@@ -16,8 +16,6 @@
*/
package org.apache.jackrabbit.core.session;
-import java.util.concurrent.atomic.AtomicLong;
-
import javax.jcr.NamespaceException;
import javax.jcr.RepositoryException;
import javax.jcr.ValueFactory;
@@ -44,7 +42,6 @@ import org.apache.jackrabbit.spi.Path;
import org.apache.jackrabbit.spi.commons.conversion.IllegalNameException;
import org.apache.jackrabbit.spi.commons.conversion.MalformedPathException;
import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
-import org.apache.jackrabbit.util.Text;
/**
* Component context of a session. This class keeps track of the internal
@@ -53,28 +50,6 @@ import org.apache.jackrabbit.util.Text;
public class SessionContext implements NamePathResolver {
/**
- * Session counter. Used to generate unique internal session names.
- */
- private static AtomicLong counter = new AtomicLong();
-
- /**
- * Creates a unique internal session name for a session with the
- * given user.
- *
- * @param userId session user, or <code>null</code>
- * @return session name
- */
- private static String createSessionName(String userId) {
- long count = counter.incrementAndGet();
- if (userId != null) {
- String user = Text.escapeIllegalJcrChars(userId);
- return "session-" + user + "-" + count;
- } else {
- return "session-" + count;
- }
- }
-
- /**
* The repository context of this session.
*/
private final RepositoryContext repositoryContext;
@@ -85,12 +60,6 @@ public class SessionContext implements N
private final SessionImpl session;
/**
- * Unique internal name of this session. Returned by the
- * {@link #toString()} method for use in logging and debugging.
- */
- private final String sessionName;
-
- /**
* The state of this session.
*/
private final SessionState state;
@@ -150,7 +119,6 @@ public class SessionContext implements N
assert session != null;
this.repositoryContext = repositoryContext;
this.session = session;
- this.sessionName = createSessionName(session.getUserID());
this.state = new SessionState(this);
this.valueFactory =
new ValueFactoryImpl(session, repositoryContext.getDataStore());
@@ -350,15 +318,13 @@ public class SessionContext implements N
//--------------------------------------------------------------< Object >
/**
- * Returns the unique internal name of this session. The returned name
- * is especially useful for debugging and logging purposes.
+ * Dumps the session internals to a string.
*
- * @see #sessionName
- * @return session name
+ * @return string representation of session internals
*/
@Override
public String toString() {
- return sessionName;
+ return session + ":\n" + itemManager + "\n" + itemStateManager;
}
}
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionState.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionState.java?rev=1005019&r1=1005018&r2=1005019&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionState.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/session/SessionState.java Wed Oct 6 13:17:12 2010
@@ -136,6 +136,8 @@ public class SessionState {
*/
public <T> T perform(SessionOperation<T> operation)
throws RepositoryException {
+ String session = context.getSessionImpl().toString();
+
// Acquire the exclusive lock for accessing session internals.
// No other session should be holding the lock, so we log a
// message to let the user know of such cases.
@@ -143,19 +145,19 @@ public class SessionState {
if (isWriteOperation
&& operation instanceof SessionWriteOperation) {
Exception trace = new Exception(
- "Stack trace of concurrent access to " + context);
+ "Stack trace of concurrent access to " + session);
log.warn("Attempt to perform " + operation
+ " while another thread is concurrently writing"
- + " to " + context + ". Blocking until the other"
+ + " to " + session + ". Blocking until the other"
+ " thread is finished using this session. Please"
+ " review your code to avoid concurrent use of"
+ " a session.", trace);
} else if (log.isDebugEnabled()) {
Exception trace = new Exception(
- "Stack trace of concurrent access to " + context);
+ "Stack trace of concurrent access to " + session);
log.debug("Attempt to perform " + operation + " while"
+ " another thread is concurrently reading from "
- + context + ". Blocking until the other thread"
+ + session + ". Blocking until the other thread"
+ " is finished using this session. Please"
+ " review your code to avoid concurrent use of"
+ " a session.", trace);
@@ -226,10 +228,12 @@ public class SessionState {
* <code>false</code> if the session had already been closed
*/
public boolean close() {
+ String session = context.getSessionImpl().toString();
+
if (!lock.tryLock()) {
Exception trace = new Exception(
- "Stack trace of concurrent access to " + context);
- log.warn("Attempt to close " + context + " while another"
+ "Stack trace of concurrent access to " + session);
+ log.warn("Attempt to close " + session + " while another"
+ " thread is concurrently accessing this session."
+ " Blocking until the other thread is finished"
+ " using this session. Please review your code"
@@ -239,17 +243,17 @@ public class SessionState {
try {
if (isAlive()) {
closed = new Exception(
- "Stack trace of where " + context
+ "Stack trace of where " + session
+ " was originally closed");
return true;
} else {
Exception trace = new Exception(
"Stack trace of the duplicate attempt to close "
- + context);
- log.warn("Attempt to close " + context + " after it has"
+ + session);
+ log.warn("Attempt to close " + session + " after it has"
+ " already been closed. Please review your code"
+ " for proper session management.", trace);
- log.warn(context + " has already been closed. See the"
+ log.warn(session + " has already been closed. See the"
+ " attached exception for a trace of where this"
+ " session was closed.", closed);
return false;