Index: src/main/java/org/springframework/webflow/conversation/impl/JdkConcurrentConversationLock.java =================================================================== --- src/main/java/org/springframework/webflow/conversation/impl/JdkConcurrentConversationLock.java (revision 12756) +++ src/main/java/org/springframework/webflow/conversation/impl/JdkConcurrentConversationLock.java (working copy) @@ -27,7 +27,7 @@ * * @author Keith Donald */ -class JdkConcurrentConversationLock implements ConversationLock { +public class JdkConcurrentConversationLock implements ConversationLock { private Lock lock = new ReentrantLock(); Index: src/main/java/org/springframework/webflow/conversation/impl/ContainedConversation.java =================================================================== --- src/main/java/org/springframework/webflow/conversation/impl/ContainedConversation.java (revision 12756) +++ src/main/java/org/springframework/webflow/conversation/impl/ContainedConversation.java (working copy) @@ -33,7 +33,7 @@ * * @author Erwin Vervaet */ -class ContainedConversation implements Conversation, Serializable { +public class ContainedConversation implements Conversation, Serializable { private static final Log logger = LogFactory.getLog(SessionBindingConversationManager.class); @@ -45,6 +45,14 @@ private Map attributes; + protected void setContainer(ConversationContainer container) { + this.container = container; + } + + protected void setId(ConversationId id) { + this.id = id; + } + /** * Create a new contained conversation. * @param container the container containing the conversation Index: src/main/java/org/springframework/webflow/conversation/impl/ConversationContainer.java =================================================================== --- src/main/java/org/springframework/webflow/conversation/impl/ConversationContainer.java (revision 12756) +++ src/main/java/org/springframework/webflow/conversation/impl/ConversationContainer.java (working copy) @@ -34,7 +34,7 @@ * * @author Erwin Vervaet */ -class ConversationContainer implements Serializable { +public class ConversationContainer implements Serializable { /** * Maximum number of conversations in this container. -1 for unlimited. @@ -89,7 +89,7 @@ */ public synchronized Conversation createConversation(ConversationParameters parameters, ConversationLockFactory lockFactory) { - ContainedConversation conversation = new ContainedConversation(this, nextId(), lockFactory.createLock()); + ContainedConversation conversation = newContainedConversation(nextId(), lockFactory.createLock()); conversation.putAttribute("name", parameters.getName()); conversation.putAttribute("caption", parameters.getCaption()); conversation.putAttribute("description", parameters.getDescription()); @@ -144,4 +144,14 @@ private boolean maxExceeded() { return maxConversations > 0 && conversations.size() > maxConversations; } + + protected List getConversations() { + return conversations; + } + + // hook methods + + protected ContainedConversation newContainedConversation(ConversationId id, ConversationLock lock) { + return new ContainedConversation(this, id, lock); + } } \ No newline at end of file Index: src/main/java/org/springframework/webflow/conversation/impl/SessionBindingConversationManager.java =================================================================== --- src/main/java/org/springframework/webflow/conversation/impl/SessionBindingConversationManager.java (revision 12756) +++ src/main/java/org/springframework/webflow/conversation/impl/SessionBindingConversationManager.java (working copy) @@ -136,7 +136,7 @@ * Obtain the conversation container from the session. Create a new empty container and add it to the session if no * existing container can be found. */ - private ConversationContainer getConversationContainer() { + protected ConversationContainer getConversationContainer() { SharedAttributeMap sessionMap = ExternalContextHolder.getExternalContext().getSessionMap(); synchronized (sessionMap.getMutex()) { ConversationContainer container = (ConversationContainer) sessionMap.get(sessionKey); Index: src/main/java/org/springframework/webflow/conversation/impl/NoOpConversationLock.java =================================================================== --- src/main/java/org/springframework/webflow/conversation/impl/NoOpConversationLock.java (revision 12756) +++ src/main/java/org/springframework/webflow/conversation/impl/NoOpConversationLock.java (working copy) @@ -23,7 +23,7 @@ * * @author Keith Donald */ -class NoOpConversationLock implements ConversationLock { +public class NoOpConversationLock implements ConversationLock { /** * The singleton instance. Index: src/main/java/org/springframework/webflow/conversation/impl/JdkBackportConcurrentConversationLock.java =================================================================== --- src/main/java/org/springframework/webflow/conversation/impl/JdkBackportConcurrentConversationLock.java (revision 12756) +++ src/main/java/org/springframework/webflow/conversation/impl/JdkBackportConcurrentConversationLock.java (working copy) @@ -27,7 +27,7 @@ * @author Keith Donald * @author Rob Harrop */ -class JdkBackportConcurrentConversationLock implements ConversationLock { +public class JdkBackportConcurrentConversationLock implements ConversationLock { private Lock lock = new ReentrantLock(); Index: src/main/java/org/springframework/webflow/conversation/impl/ConversationLockFactory.java =================================================================== --- src/main/java/org/springframework/webflow/conversation/impl/ConversationLockFactory.java (revision 12756) +++ src/main/java/org/springframework/webflow/conversation/impl/ConversationLockFactory.java (working copy) @@ -25,7 +25,7 @@ * @author Keith Donald * @author Rob Harrop */ -class ConversationLockFactory { +public class ConversationLockFactory { private static final Log logger = LogFactory.getLog(ConversationLockFactory.class);