Return-Path: X-Original-To: apmail-openwebbeans-commits-archive@www.apache.org Delivered-To: apmail-openwebbeans-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id DA02E108AC for ; Mon, 29 Dec 2014 07:20:40 +0000 (UTC) Received: (qmail 99795 invoked by uid 500); 29 Dec 2014 07:20:41 -0000 Delivered-To: apmail-openwebbeans-commits-archive@openwebbeans.apache.org Received: (qmail 99770 invoked by uid 500); 29 Dec 2014 07:20:41 -0000 Mailing-List: contact commits-help@openwebbeans.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@openwebbeans.apache.org Delivered-To: mailing list commits@openwebbeans.apache.org Received: (qmail 99758 invoked by uid 99); 29 Dec 2014 07:20:40 -0000 Received: from eris.apache.org (HELO hades.apache.org) (140.211.11.105) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 29 Dec 2014 07:20:40 +0000 Received: from hades.apache.org (localhost [127.0.0.1]) by hades.apache.org (ASF Mail Server at hades.apache.org) with ESMTP id E2166AC0919; Mon, 29 Dec 2014 07:20:38 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1648291 - in /openwebbeans/trunk: webbeans-impl/src/main/java/org/apache/webbeans/conversation/ webbeans-jsf/src/main/java/org/apache/webbeans/jsf/ webbeans-jsf12/src/main/java/org/apache/webbeans/jsf12/ webbeans-web/src/main/java/org/apac... Date: Mon, 29 Dec 2014 07:20:35 -0000 To: commits@openwebbeans.apache.org From: rmannibucau@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20141229072039.E2166AC0919@hades.apache.org> Author: rmannibucau Date: Mon Dec 29 07:20:35 2014 New Revision: 1648291 URL: http://svn.apache.org/r1648291 Log: allowing better check on conversation if it is busy or not - main issue is we dont control cause of our spi where a boolean is set (servlet layer? jsf layer?...) so we need to support multiple calls by thread + avoid to serialize the conversation itself but use conversation manager for it Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationImpl.java openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/WebBeansPhaseListener.java openwebbeans/trunk/webbeans-jsf12/src/main/java/org/apache/webbeans/jsf12/WebBeansPhaseListener.java openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationImpl.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationImpl.java?rev=1648291&r1=1648290&r2=1648291&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationImpl.java (original) +++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationImpl.java Mon Dec 29 07:20:35 2014 @@ -18,14 +18,15 @@ */ package org.apache.webbeans.conversation; -import java.io.IOException; -import java.io.ObjectInputStream; +import java.io.ObjectStreamException; import java.io.Serializable; -import java.util.concurrent.atomic.AtomicBoolean; +import java.util.HashSet; +import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; +import javax.enterprise.context.BusyConversationException; import javax.enterprise.context.ContextNotActiveException; import javax.enterprise.context.Conversation; import javax.enterprise.context.ConversationScoped; @@ -71,8 +72,13 @@ public class ConversationImpl implements /**Generating ids*/ private static AtomicInteger conversationIdGenerator = new AtomicInteger(0); - /**This instance is under used*/ - private AtomicBoolean inUsed = new AtomicBoolean(false); + /** + This instance is under used and by which threads, Atomicinteger would be great but then contract of ContextsService but be enhanced to + be compatible wih WBPhaseListeners. Using thread allow to call iUseIt() multiple times. + String to be serializable. + TODO: serialization should be done manually to use the manager otherwise all is broken + */ + private Set threadsUsingIt = new HashSet(); private transient WebBeansContext webBeansContext; @@ -134,6 +140,7 @@ public class ConversationImpl implements { isTransient = false; id = Integer.toString(conversationIdGenerator.incrementAndGet()); + iUseIt(); updateTimeOut(); //Conversation manager @@ -184,7 +191,7 @@ public class ConversationImpl implements */ @Override public void begin(String id) - { + { //Look at other conversation, that may collate with this is final ConversationManager conversationManager = webBeansContext.getConversationManager(); if(conversationManager.isConversationExistWithGivenId(id)) @@ -197,6 +204,7 @@ public class ConversationImpl implements { isTransient = false; this.id = id; + iUseIt(); if (this.sessionId == null) { OpenWebBeansWebPlugin web = webBeansContext.getPluginLoader().getWebPlugin(); @@ -217,10 +225,11 @@ public class ConversationImpl implements @Override public void end() { + check(); if(!isTransient) { isTransient = true; - + iDontUseItAnymore(); webBeansContext.getConversationManager().removeConversation(this); } else @@ -229,22 +238,24 @@ public class ConversationImpl implements throw new IllegalStateException(toString() + " has already ended"); } } - - - /** - * @return the inUsed - */ - public AtomicBoolean getInUsed() + + public int iUseIt() { - return inUsed; + long thread = Thread.currentThread().getId(); + synchronized (this) + { + threadsUsingIt.add(thread); + return threadsUsingIt.size(); + } } - /** - * @param inUsed the inUsed to set - */ - public void setInUsed(boolean inUsed) + public void iDontUseItAnymore() { - this.inUsed.set(inUsed); + long thread = Thread.currentThread().getId(); + synchronized (this) + { + threadsUsingIt.remove(thread); + } } /** @@ -262,6 +273,7 @@ public class ConversationImpl implements @Override public long getTimeout() { + check(); return timeout; } @@ -271,15 +283,26 @@ public class ConversationImpl implements @Override public boolean isTransient() { + check(); return isTransient; } - + + private synchronized void check() + { + if (threadsUsingIt.size() > 1) + { + throw new BusyConversationException( + "Propogated conversation with sessionid/cid=" + sessionId + "/" + id + " is used by other request."); + } + } + /** * {@inheritDoc} */ @Override public void setTimeout(long milliseconds) { + check(); timeout = milliseconds; } @@ -375,21 +398,36 @@ public class ConversationImpl implements @Override public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("Conversation with id [ "); - builder.append(id); - builder.append(" ]"); - - return builder.toString(); + return "Conversation with id [ " + id + " ]"; } - /** - * We need this for restoring our WebBeansContext on de-serialisation - */ - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException + private Object writeReplace() throws ObjectStreamException { - webBeansContext = WebBeansContext.currentInstance(); - in.defaultReadObject(); + Serialization serialization = new Serialization(); + serialization.setId(id); + serialization.setSessionId(sessionId); + return serialization; } + public static class Serialization implements Serializable + { + private String sessionId; + private String id; + + public void setSessionId(String sessionId) + { + this.sessionId = sessionId; + } + + public void setId(String id) + { + this.id = id; + } + + Object readResolve() throws ObjectStreamException + { + return WebBeansContext.currentInstance().getConversationManager().getPropogatedConversation(id, sessionId); + } + } } + Modified: openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/WebBeansPhaseListener.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/WebBeansPhaseListener.java?rev=1648291&r1=1648290&r2=1648291&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/WebBeansPhaseListener.java (original) +++ openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/WebBeansPhaseListener.java Mon Dec 29 07:20:35 2014 @@ -85,7 +85,7 @@ public class WebBeansPhaseListener imple ConversationImpl owbConversation = (ConversationImpl)conversation; owbConversation.updateTimeOut(); //Other threads can now access propogated conversation. - owbConversation.setInUsed(false); + owbConversation.iDontUseItAnymore(); } } } @@ -137,7 +137,7 @@ public class WebBeansPhaseListener imple //Conversation must be used by one thread at a time ConversationImpl owbConversation = (ConversationImpl)conversation; - if(!owbConversation.getInUsed().compareAndSet(false, true)) + if(owbConversation.iUseIt() > 1) { contextFactory.initConversationContext(getRequest(phaseEvent)); //Throw Busy exception Modified: openwebbeans/trunk/webbeans-jsf12/src/main/java/org/apache/webbeans/jsf12/WebBeansPhaseListener.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-jsf12/src/main/java/org/apache/webbeans/jsf12/WebBeansPhaseListener.java?rev=1648291&r1=1648290&r2=1648291&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-jsf12/src/main/java/org/apache/webbeans/jsf12/WebBeansPhaseListener.java (original) +++ openwebbeans/trunk/webbeans-jsf12/src/main/java/org/apache/webbeans/jsf12/WebBeansPhaseListener.java Mon Dec 29 07:20:35 2014 @@ -83,7 +83,7 @@ public class WebBeansPhaseListener imple ConversationImpl owbConversation = (ConversationImpl)conversation; owbConversation.updateTimeOut(); //Other threads can now access propogated conversation. - owbConversation.setInUsed(false); + owbConversation.iDontUseItAnymore(); } } } @@ -133,7 +133,7 @@ public class WebBeansPhaseListener imple //Conversation must be used by one thread at a time ConversationImpl owbConversation = (ConversationImpl)conversation; - if(!owbConversation.getInUsed().compareAndSet(false, true)) + if(owbConversation.iUseIt() > 1) { contextFactory.initConversationContext(null); //Throw Busy exception Modified: openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java?rev=1648291&r1=1648290&r2=1648291&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java (original) +++ openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java Mon Dec 29 07:20:35 2014 @@ -173,7 +173,10 @@ public class WebContextsService extends //Destroy singleton context endContext(Singleton.class, destroyObject); - sharedSingletonContext.destroy(); + if (sharedSingletonContext != null) + { + sharedSingletonContext.destroy(); + } //Clear saved contexts related with //this servlet context @@ -438,7 +441,7 @@ public class WebContextsService extends ConversationImpl owbConversation = (ConversationImpl)conversation; owbConversation.updateTimeOut(); //Other threads can now access propogated conversation. - owbConversation.setInUsed(false); + owbConversation.iDontUseItAnymore(); } }