Return-Path: Delivered-To: apmail-myfaces-commits-archive@www.apache.org Received: (qmail 53645 invoked from network); 16 Dec 2009 19:44:41 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 16 Dec 2009 19:44:41 -0000 Received: (qmail 7598 invoked by uid 500); 16 Dec 2009 19:44:41 -0000 Delivered-To: apmail-myfaces-commits-archive@myfaces.apache.org Received: (qmail 7420 invoked by uid 500); 16 Dec 2009 19:44:40 -0000 Mailing-List: contact commits-help@myfaces.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "MyFaces Development" Delivered-To: mailing list commits@myfaces.apache.org Received: (qmail 7359 invoked by uid 99); 16 Dec 2009 19:44:40 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 16 Dec 2009 19:44:40 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 16 Dec 2009 19:44:38 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 27F5E23889E7; Wed, 16 Dec 2009 19:44:17 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r891400 - /myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/BaseWeaver.java Date: Wed, 16 Dec 2009 19:44:17 -0000 To: commits@myfaces.apache.org From: werpu@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20091216194417.27F5E23889E7@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: werpu Date: Wed Dec 16 19:44:16 2009 New Revision: 891400 URL: http://svn.apache.org/viewvc?rev=891400&view=rev Log: https://issues.apache.org/jira/browse/EXTSCRIPT-30 fixing a concurrent modification exception at bean refresh stage for myfaces 2.0 Modified: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/BaseWeaver.java Modified: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/BaseWeaver.java URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/BaseWeaver.java?rev=891400&r1=891399&r2=891400&view=diff ============================================================================== --- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/BaseWeaver.java (original) +++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/BaseWeaver.java Wed Dec 16 19:44:16 2009 @@ -286,7 +286,10 @@ getLog().info("[EXT-SCRIPTING] Tainting all beans to avoid classcast exceptions"); if (managedBeanTainted) { - for (Map.Entry entry : mbeans.entrySet()) { + + Map workCopy = makeSnapshot(mbeans); + + for (Map.Entry entry : workCopy.entrySet()) { Class managedBeanClass = entry.getValue().getManagedBeanClass(); if (WeavingContext.isDynamic(managedBeanClass)) { //managed bean class found we drop the class from our session @@ -306,6 +309,14 @@ } + private Map makeSnapshot(Map mbeans) { + Map workCopy = new HashMap(mbeans.size()); + for (Map.Entry entry : mbeans.entrySet()) { + workCopy.put(entry.getKey(), entry.getValue()); + } + return workCopy; + } + private void updateBeanRefreshTime() { long sessionRefreshTime = System.currentTimeMillis(); FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(ScriptingConst.SESS_BEAN_REFRESH_TIMER, sessionRefreshTime); @@ -327,8 +338,11 @@ private void refreshPersonalScopedBeans() { Map mbeans = RuntimeConfig.getCurrentInstance(FacesContext.getCurrentInstance().getExternalContext()).getManagedBeans(); + //the map is immutable but in between scanning might change it so we make a full copy of the map - for (Map.Entry entry : mbeans.entrySet()) { + Map workCopy = makeSnapshot(mbeans); + + for (Map.Entry entry : workCopy.entrySet()) { Class managedBeanClass = entry.getValue().getManagedBeanClass(); if (WeavingContext.isDynamic(managedBeanClass)) { @@ -401,11 +415,11 @@ List retVal = new LinkedList(); for (String scriptPath : scriptPaths) { - List tmpList = FileUtils.fetchSourceFiles(new File(scriptPath), "*"+getFileEnding()); + List tmpList = FileUtils.fetchSourceFiles(new File(scriptPath), "*" + getFileEnding()); int lenRoot = scriptPath.length(); //ok O(n2) but we are lazy for now if this imposes a problem we can flatten the inner loop out for (File sourceFile : tmpList) { - String relativeFile = sourceFile.getAbsolutePath().substring(lenRoot+1); + String relativeFile = sourceFile.getAbsolutePath().substring(lenRoot + 1); String className = ClassUtils.relativeFileToClassName(relativeFile); retVal.add(className); }