[jboss-svn-commits] JBL Code SVN: r27691 - in labs/jbossesb/trunk/product: rosetta/src/org/jboss/soa/esb/lifecycle and 9 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Jul 7 06:57:03 EDT 2009


Author: kevin.conner at jboss.com
Date: 2009-07-07 06:57:02 -0400 (Tue, 07 Jul 2009)
New Revision: 27691

Added:
   labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/smooks/
   labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/smooks/resource/
   labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/smooks/resource/SmooksResource.java
Removed:
   labs/jbossesb/trunk/product/services/smooks/src/main/java/org/jboss/soa/esb/actions/converters/SmooksInstanceManager.java
Modified:
   labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/lifecycle/LifecyclePriorities.java
   labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/services/security/auth/ws/WSSecurityInfoExtractor.java
   labs/jbossesb/trunk/product/services/smooks/src/main/java/org/jboss/soa/esb/actions/converters/SmooksTransformer.java
   labs/jbossesb/trunk/product/services/smooks/src/main/java/org/jboss/soa/esb/smooks/SmooksAction.java
   labs/jbossesb/trunk/product/services/smooks/src/main/java/org/jboss/soa/esb/smooks/splitting/AbstractStreamSplitter.java
   labs/jbossesb/trunk/product/services/soap/src/main/java/org/jboss/soa/esb/actions/soap/AbstractWsdlContractPublisher.java
   labs/jbossesb/trunk/product/services/soap/src/main/java/org/jboss/soa/esb/actions/soap/wise/SOAPClient.java
   labs/jbossesb/trunk/product/services/soap/src/main/java/org/jboss/soa/esb/actions/soap/wise/SmooksHandler.java
   labs/jbossesb/trunk/product/services/soap/src/main/java/org/jboss/soa/esb/actions/soap/wise/SmooksMapper.java
   labs/jbossesb/trunk/product/services/soapui-client/src/main/java/org/jboss/soa/esb/services/soapui/SoapUIClientService.java
Log:
cache smooks instances as lifecycle, handle soapui-client: JBESB-2521

Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/lifecycle/LifecyclePriorities.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/lifecycle/LifecyclePriorities.java	2009-07-07 10:11:25 UTC (rev 27690)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/lifecycle/LifecyclePriorities.java	2009-07-07 10:57:02 UTC (rev 27691)
@@ -52,6 +52,11 @@
     public static final int COURIER_PRIORITY = 100000 ;
     
     /**
+     * The smooks priority.
+     */
+    public static final int SMOOKS_RESOURCE_PRIORITY = 150000 ;
+    
+    /**
      * The JMS connection pool priority.
      */
     public static final int JMS_CONNECTION_POOL_PRIORITY = 200000 ;

Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/services/security/auth/ws/WSSecurityInfoExtractor.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/services/security/auth/ws/WSSecurityInfoExtractor.java	2009-07-07 10:11:25 UTC (rev 27690)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/services/security/auth/ws/WSSecurityInfoExtractor.java	2009-07-07 10:57:02 UTC (rev 27691)
@@ -21,16 +21,19 @@
 package org.jboss.soa.esb.services.security.auth.ws;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.StringReader;
 import java.util.HashSet;
 import java.util.Set;
 
 import javax.xml.transform.stream.StreamSource;
 
+import org.jboss.soa.esb.lifecycle.LifecycleResourceException;
 import org.jboss.soa.esb.services.security.auth.AuthenticationRequest;
 import org.jboss.soa.esb.services.security.auth.AuthenticationRequestImpl;
 import org.jboss.soa.esb.services.security.auth.SecurityInfoExtractor;
 import org.jboss.soa.esb.services.security.principals.User;
+import org.jboss.soa.esb.smooks.resource.SmooksResource;
 import org.jboss.soa.esb.util.ClassUtil;
 import org.milyn.Smooks;
 import org.milyn.payload.JavaResult;
@@ -119,10 +122,19 @@
 
 	private void createSmooks(final String configFile) 
 	{
+		final InputStream is = ClassUtil.getResourceAsStream(configFile, getClass()) ;
+		if (is == null)
+		{
+			throw new IllegalArgumentException("Failed to located configuration file resource: " + configFile) ;
+		}
 		try
 		{
-    		this.smooks = new Smooks( ClassUtil.getResourceAsStream(configFile, getClass()));
-		} 
+			this.smooks = SmooksResource.createSmooksResource(is);
+		}
+		catch (final LifecycleResourceException lre)
+		{
+			throw new IllegalStateException("Could not parse " + configFile, lre);
+		}
 		catch (final SAXException e)
 		{
 			throw new IllegalStateException("Could not parse " + configFile, e);

Added: labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/smooks/resource/SmooksResource.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/smooks/resource/SmooksResource.java	                        (rev 0)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/smooks/resource/SmooksResource.java	2009-07-07 10:57:02 UTC (rev 27691)
@@ -0,0 +1,175 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, JBoss Inc., and others contributors as indicated
+ * by the @authors tag. All rights reserved.
+ * See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public License,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.
+ *
+ * (C) 2005-2006, JBoss Inc.
+ */
+package org.jboss.soa.esb.smooks.resource;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.IdentityHashMap;
+import java.util.Iterator;
+
+import org.apache.log4j.Logger;
+import org.jboss.soa.esb.lifecycle.LifecyclePriorities;
+import org.jboss.soa.esb.lifecycle.LifecycleResource;
+import org.jboss.soa.esb.lifecycle.LifecycleResourceException;
+import org.jboss.soa.esb.lifecycle.LifecycleResourceFactory;
+import org.milyn.Smooks;
+import org.xml.sax.SAXException;
+
+/**
+ * Smooks resource tied to the lifecycle.
+ */
+public class SmooksResource
+{
+    /**
+     * The logger for this class.
+     */
+    private static Logger LOGGER = Logger.getLogger(SmooksResource.class);
+    
+    /**
+     * The lifecycle resource factory.
+     */
+    private static final LifecycleResourceFactory<IdentityHashMap<Smooks, Smooks>> lifecycleSmooksResourceFactory = new SmooksResourceFactory() ;
+    /**
+     * Lifecycle smooks resources.
+     */
+    private static final LifecycleResource<IdentityHashMap<Smooks, Smooks>> lifecycleSmooksResource =
+        new LifecycleResource<IdentityHashMap<Smooks, Smooks>>(lifecycleSmooksResourceFactory, LifecyclePriorities.SMOOKS_RESOURCE_PRIORITY) ;
+    
+    private SmooksResource()
+    {
+    }
+
+    /**
+     * Create a smooks instance.
+     * @return The smooks instance.
+     * @throws LifecycleResourceException For errors creating the lifecycle resource.
+     */
+    public static Smooks createSmooksResource()
+        throws LifecycleResourceException
+    {
+        final Smooks smooks = new Smooks() ;
+        lifecycleSmooksResource.getLifecycleResource().put(smooks, smooks) ;
+        
+        return smooks;
+    }
+
+    /**
+     * Create a smooks instance using the specified configuration.
+     * @param config The configuration representing the smooks configuration.
+     * @return The smooks instance.
+     * @throws SAXException For errors parsing the smooks configuration.
+     * @throws IOException For errors accessing the smooks configuration.
+     * @throws LifecycleResourceException For errors creating the lifecycle resource.
+     */
+    public static Smooks createSmooksResource(final String config)
+        throws SAXException, IOException, LifecycleResourceException
+    {
+        final Smooks smooks = new Smooks(config) ;
+        lifecycleSmooksResource.getLifecycleResource().put(smooks, smooks) ;
+        
+        return smooks;
+    }
+
+    /**
+     * Create a smooks instance using the specified input stream.
+     * @param is The input stream representing the smooks configuration.
+     * @return The smooks instance.
+     * @throws SAXException For errors parsing the smooks configuration.
+     * @throws IOException For errors accessing the smooks configuration.
+     * @throws LifecycleResourceException For errors creating the lifecycle resource.
+     */
+    public static Smooks createSmooksResource(final InputStream is)
+        throws SAXException, IOException, LifecycleResourceException
+    {
+        final Smooks smooks = new Smooks(is) ;
+        lifecycleSmooksResource.getLifecycleResource().put(smooks, smooks) ;
+        
+        return smooks;
+    }
+
+    /**
+     * Close the smooks resource.
+     * @param smooks The smooks resource.
+     */
+    public static void closeSmooksResource(final Smooks smooks)
+    {
+        try
+        {
+            smooks.close() ;
+        }
+        finally
+        {
+            try
+            {
+                lifecycleSmooksResource.getLifecycleResource().remove(smooks) ;
+            }
+            catch (final LifecycleResourceException lre) {} // ignore
+        }
+    }
+
+    /**
+     * The lifecycle resource factory
+     * @author kevin
+     */
+    private static class SmooksResourceFactory implements LifecycleResourceFactory<IdentityHashMap<Smooks, Smooks>>
+    {
+        /**
+         * Create a resource object which will be associated with the specified lifecycle identity.
+         * @param lifecycleIdentity The associated lifecycle identity.
+         * @return The lifecycle resource
+         * @throws LifecycleResourceException for errors during construction.
+         */
+        public IdentityHashMap<Smooks, Smooks> createLifecycleResource(final String lifecycleIdentity)
+            throws LifecycleResourceException
+        {
+            return new IdentityHashMap<Smooks, Smooks>() ;
+        }
+
+        /**
+         * Destroy a resource object which is associated with the specified lifecycle identity.
+         * @param resource The lifecycle resource.
+         * @param lifecycleIdentity The associated lifecycle identity.
+         * @return The lifecycle resource.
+         * @throws LifecycleResourceException for errors during destroy.
+         */
+        public void destroyLifecycleResource(final IdentityHashMap<Smooks, Smooks> resource, final String lifecycleIdentity)
+            throws LifecycleResourceException
+        {
+            if (resource.size() > 0)
+            {
+                LOGGER.warn("Closing smooks resources for identity " + lifecycleIdentity) ;
+                final Iterator<Smooks> smooksIter = resource.keySet().iterator() ;
+                while(smooksIter.hasNext())
+                {
+                    final Smooks smooks = smooksIter.next() ;
+                    smooksIter.remove() ;
+                    try
+                    {
+                        smooks.close() ;
+                    }
+                    catch (final Exception ex)
+                    {
+                        LOGGER.warn("Unexpected exception closing smooks resource", ex) ;
+                    }
+                }
+            }
+        }
+    }
+}


Property changes on: labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/smooks/resource/SmooksResource.java
___________________________________________________________________
Name: svn:keywords
   + Rev Date
Name: svn:eol-style
   + native

Deleted: labs/jbossesb/trunk/product/services/smooks/src/main/java/org/jboss/soa/esb/actions/converters/SmooksInstanceManager.java
===================================================================
--- labs/jbossesb/trunk/product/services/smooks/src/main/java/org/jboss/soa/esb/actions/converters/SmooksInstanceManager.java	2009-07-07 10:11:25 UTC (rev 27690)
+++ labs/jbossesb/trunk/product/services/smooks/src/main/java/org/jboss/soa/esb/actions/converters/SmooksInstanceManager.java	2009-07-07 10:57:02 UTC (rev 27691)
@@ -1,78 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2006, JBoss Inc., and others contributors as indicated
- * by the @authors tag. All rights reserved.
- * See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- * This copyrighted material is made available to anyone wishing to use,
- * modify, copy, or redistribute it subject to the terms and conditions
- * of the GNU Lesser General Public License, v. 2.1.
- * This program is distributed in the hope that it will be useful, but WITHOUT A
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
- * You should have received a copy of the GNU Lesser General Public License,
- * v.2.1 along with this distribution; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA  02110-1301, USA.
- *
- * (C) 2005-2006, JBoss Inc.
- */
-package org.jboss.soa.esb.actions.converters;
-
-import org.jboss.soa.esb.util.ClassUtil;
-import org.jboss.internal.soa.esb.assertion.AssertArgument;
-import org.apache.log4j.Logger;
-import org.milyn.Smooks;
-import org.milyn.SmooksException;
-import org.xml.sax.SAXException;
-
-import java.io.InputStream;
-import java.io.IOException;
-import java.util.Arrays;
-
-/**
- * Smooks instance manager.
- * <p/>
- * Manages configuration updates.
- *
- * @author <a href="mailto:tom.fennelly at jboss.com">tom.fennelly at jboss.com</a>
- */
-class SmooksInstanceManager {
-
-    private static Logger logger = Logger.getLogger(SmooksInstanceManager.class);
-    private SmooksConfiguration config = new SmooksConfiguration();
-    private String configurationSourceURI;
-    private Smooks smooksInstance;
-
-    protected SmooksInstanceManager(String configurationSourceName, String configurationSourceURI) throws SmooksException {
-        AssertArgument.isNotNullAndNotEmpty(configurationSourceURI, "configurationSourceURI");
-        this.configurationSourceURI = configurationSourceURI;
-
-        smooksInstance = createSmooksInstance();
-    }
-
-    protected Smooks getSmooksInstance() {
-        return smooksInstance;
-    }
-
-    protected void close() {
-    }
-
-    private Smooks createSmooksInstance() throws SmooksException{
-        // We're not synchronizing creation of (or access to) the Smooks
-        // instances, so there is a possiblility that 1+ instances of
-        // Smooks could be "in circulation" for brief intervals (after an
-        // update notification).  This is OK and not an issue. The
-        // older instance(s) will eventually get GC'd.        
-        try {
-            Smooks instance = new Smooks(configurationSourceURI);
-
-            return instance;
-        } catch (SAXException e) {
-            throw new SmooksException("Invalid Smooks resource config '" + configurationSourceURI + "'.", e);
-        } catch (IOException e) {
-            throw new SmooksException("Error reading Smooks resource config '" + configurationSourceURI + "'.", e);
-        }
-    }
-
-}

Modified: labs/jbossesb/trunk/product/services/smooks/src/main/java/org/jboss/soa/esb/actions/converters/SmooksTransformer.java
===================================================================
--- labs/jbossesb/trunk/product/services/smooks/src/main/java/org/jboss/soa/esb/actions/converters/SmooksTransformer.java	2009-07-07 10:11:25 UTC (rev 27690)
+++ labs/jbossesb/trunk/product/services/smooks/src/main/java/org/jboss/soa/esb/actions/converters/SmooksTransformer.java	2009-07-07 10:57:02 UTC (rev 27691)
@@ -27,6 +27,7 @@
 import org.jboss.soa.esb.actions.ActionUtils;
 import org.jboss.soa.esb.helpers.ConfigTree;
 import org.jboss.soa.esb.helpers.KeyValuePair;
+import org.jboss.soa.esb.lifecycle.LifecycleResourceException;
 import org.jboss.soa.esb.listeners.message.MessageDeliverException;
 import org.jboss.soa.esb.message.Body;
 import org.jboss.soa.esb.message.Message;
@@ -34,16 +35,18 @@
 import org.jboss.soa.esb.message.body.content.BytesBody;
 import org.jboss.soa.esb.services.transform.TransformationException;
 import org.jboss.soa.esb.services.transform.TransformationService;
+import org.jboss.soa.esb.smooks.resource.SmooksResource;
 import org.milyn.Smooks;
 import org.milyn.SmooksUtil;
 import org.milyn.container.ExecutionContext;
-import org.milyn.javabean.BeanAccessor;
 import org.milyn.javabean.repository.BeanRepository;
 import org.milyn.profile.DefaultProfileSet;
 import org.milyn.profile.ProfileStore;
 import org.milyn.profile.UnknownProfileMemberException;
+import org.xml.sax.SAXException;
 
 import java.io.ByteArrayInputStream;
+import java.io.IOException;
 import java.util.*;
 
 /**
@@ -159,7 +162,7 @@
     public static final String UPDATE_TOPIC="update-topic";
 
     private static Logger logger = Logger.getLogger(SmooksTransformer.class);
-    private SmooksInstanceManager smooksInstanceManager;
+    private Smooks smooks;
     private MessagePayloadProxy payloadProxy;
     private String inputLocation;
     private String outputLocation;
@@ -239,24 +242,24 @@
         // centralised (console based) config specified in the smooks.esb.properties. If not,
         // we have an error!
         if(resourceConfig != null) {
-            initialiseLocalSmooksInstanceManager(resourceConfig);
-        }
-
-        if(smooksInstanceManager == null) {
+            try {
+                smooks = SmooksResource.createSmooksResource(resourceConfig);
+            } catch (final LifecycleResourceException lre) {
+                throw new ActionLifecycleException("Unexpected exception creating smooks lifecycle resource", lre);
+            } catch (final IOException ie) {
+                throw new ActionLifecycleException("Unexpected IO exception accessing smooks resource: " + resourceConfig, ie);
+            } catch (final SAXException saxe) {
+                throw new ActionLifecycleException("Unexpected exception parsing smooks resource: " + resourceConfig, saxe);
+            }
+        } else {
             throw new ActionLifecycleException("Invalid " + getClass().getSimpleName() + " action configuration.  No 'resource-config' specified on the action.");
         }
         
         logger.info("Smooks configurations are now loaded.");
     }
 
-    private void initialiseLocalSmooksInstanceManager(String resourceConfig) {
-        String actionName = actionConfig.getAttribute("action");
-
-        smooksInstanceManager = new SmooksInstanceManager(actionName, resourceConfig);
-    }
-
     public void destroy() throws ActionLifecycleException {
-        smooksInstanceManager.close();
+        SmooksResource.closeSmooksResource(smooks);
     }
 
 	/* (non-Javadoc)
@@ -276,11 +279,6 @@
     public Message process(Message message) throws ActionProcessingException {
         String messageProfile = "";
 
-    	if(smooksInstanceManager == null) {
-            logger.warn("SmooksTransformer instance is decommisioned.  Probably due to a bad action configuration. Not performing transformation on this message.");
-            return message;
-        }
-        
         long startTime = System.nanoTime();
 
         Object payload = null;
@@ -304,7 +302,6 @@
                 messageBytes = ((String)payload).getBytes("UTF-8");
 	
 	            long start = System.currentTimeMillis();
-                Smooks smooks = smooksInstanceManager.getSmooksInstance();
                 ExecutionContext executionContext;
 
                 // Register the message profile with Smooks (if there is one and it's not already registered)...

Modified: labs/jbossesb/trunk/product/services/smooks/src/main/java/org/jboss/soa/esb/smooks/SmooksAction.java
===================================================================
--- labs/jbossesb/trunk/product/services/smooks/src/main/java/org/jboss/soa/esb/smooks/SmooksAction.java	2009-07-07 10:11:25 UTC (rev 27690)
+++ labs/jbossesb/trunk/product/services/smooks/src/main/java/org/jboss/soa/esb/smooks/SmooksAction.java	2009-07-07 10:57:02 UTC (rev 27691)
@@ -28,6 +28,7 @@
 import org.jboss.soa.esb.message.Message;
 import org.jboss.soa.esb.message.MessagePayloadProxy;
 import org.jboss.soa.esb.message.Properties;
+import org.jboss.soa.esb.smooks.resource.SmooksResource;
 import org.milyn.Smooks;
 import org.milyn.profile.Profile;
 import org.milyn.container.ExecutionContext;
@@ -138,7 +139,7 @@
         final String smooksConfig = configTree.getRequiredAttribute("smooksConfig");
         try
         {
-            smooks = new Smooks(smooksConfig);
+            smooks = SmooksResource.createSmooksResource(smooksConfig);
         }
         catch (Exception e)
         {
@@ -222,7 +223,7 @@
     @Override
     public void destroy() throws ActionLifecycleException
     {
-        smooks.close();
+        SmooksResource.closeSmooksResource(smooks);
         super.destroy();
     }
 

Modified: labs/jbossesb/trunk/product/services/smooks/src/main/java/org/jboss/soa/esb/smooks/splitting/AbstractStreamSplitter.java
===================================================================
--- labs/jbossesb/trunk/product/services/smooks/src/main/java/org/jboss/soa/esb/smooks/splitting/AbstractStreamSplitter.java	2009-07-07 10:11:25 UTC (rev 27690)
+++ labs/jbossesb/trunk/product/services/smooks/src/main/java/org/jboss/soa/esb/smooks/splitting/AbstractStreamSplitter.java	2009-07-07 10:57:02 UTC (rev 27691)
@@ -22,6 +22,7 @@
 import org.jboss.soa.esb.Configurable;
 import org.jboss.soa.esb.ConfigurationException;
 import org.jboss.soa.esb.helpers.ConfigTree;
+import org.jboss.soa.esb.smooks.resource.SmooksResource;
 import org.milyn.Smooks;
 import org.milyn.event.report.HtmlReportGenerator;
 import org.milyn.container.ExecutionContext;
@@ -51,9 +52,9 @@
         encoding = config.getAttribute("encoding", "UTF-8");
         reportPath = config.getAttribute("reportPath");
         try {
-            smooks = new Smooks(splitterConfig);
+            smooks = SmooksResource.createSmooksResource(splitterConfig);
         } catch (Exception e) {
-            e.printStackTrace();
+            throw new ConfigurationException("Failed to create smooks resource", e) ;
         }
     }
 

Modified: labs/jbossesb/trunk/product/services/soap/src/main/java/org/jboss/soa/esb/actions/soap/AbstractWsdlContractPublisher.java
===================================================================
--- labs/jbossesb/trunk/product/services/soap/src/main/java/org/jboss/soa/esb/actions/soap/AbstractWsdlContractPublisher.java	2009-07-07 10:11:25 UTC (rev 27690)
+++ labs/jbossesb/trunk/product/services/soap/src/main/java/org/jboss/soa/esb/actions/soap/AbstractWsdlContractPublisher.java	2009-07-07 10:57:02 UTC (rev 27691)
@@ -23,7 +23,9 @@
 import org.jboss.internal.soa.esb.publish.ContractInfo;
 import org.jboss.internal.soa.esb.publish.ServletContractPublisher;
 import org.jboss.internal.soa.esb.util.StreamUtils;
+import org.jboss.soa.esb.lifecycle.LifecycleResourceException;
 import org.jboss.soa.esb.listeners.config.Action;
+import org.jboss.soa.esb.smooks.resource.SmooksResource;
 import org.jboss.soa.esb.ConfigurationException;
 import org.jboss.soa.esb.http.HttpClientFactory;
 import org.jboss.soa.esb.addressing.EPR;
@@ -197,7 +199,7 @@
     protected void initializeTransformer() throws ConfigurationException {
         try {
             // Initialise the transformer with the rewriting resource configs...
-            transformer = new Smooks("/org/jboss/soa/esb/actions/soap/wsdltrans.xml");
+            transformer = SmooksResource.createSmooksResource("/org/jboss/soa/esb/actions/soap/wsdltrans.xml");
 
             // And add the user defined config, if there is one.... 
             String wsdlTransformConfig = actionProperties.getProperty("wsdlTransform");
@@ -210,6 +212,8 @@
                     throw new ConfigurationException("Failed to read the User Defined WSDL Transformation config '" + wsdlTransformConfig + "'.", e);
                 }
             }
+        } catch (final LifecycleResourceException lre) {
+            throw new ConfigurationException("Failed to read the Endpoint Transformation config for WSDL.", lre);
         } catch (IOException e) {
             throw new ConfigurationException("Failed to read the Endpoint Transformation config for WSDL.", e);
         } catch (SAXException e) {

Modified: labs/jbossesb/trunk/product/services/soap/src/main/java/org/jboss/soa/esb/actions/soap/wise/SOAPClient.java
===================================================================
--- labs/jbossesb/trunk/product/services/soap/src/main/java/org/jboss/soa/esb/actions/soap/wise/SOAPClient.java	2009-07-07 10:11:25 UTC (rev 27690)
+++ labs/jbossesb/trunk/product/services/soap/src/main/java/org/jboss/soa/esb/actions/soap/wise/SOAPClient.java	2009-07-07 10:57:02 UTC (rev 27691)
@@ -237,26 +237,33 @@
         WSEndpoint endpoint = getEndpoint(client);
         
         Object payload = getMessagePayload(message);
-        addSmooksHandlers(endpoint, payload);
-        addCustomHandlers(endpoint);
-        addLoggingHandler(endpoint);
-        
-        WSMethod wsMethod = getWSMethodFromEndpoint(operationName, endpoint);
-
-        InvocationResult result;
-        try 
+        final List<SmooksHandler> handlers = addSmooksHandlers(endpoint, payload);
+        try
         {
-            result = wsMethod.invoke(payload, smooksRequestMapper);
-        } 
-        catch (final WiseException e) 
-        {
-            if (logger.isDebugEnabled())
+            addCustomHandlers(endpoint);
+            addLoggingHandler(endpoint);
+            
+            WSMethod wsMethod = getWSMethodFromEndpoint(operationName, endpoint);
+    
+            InvocationResult result;
+            try 
             {
-                logger.debug("Exception thrown from wsMethod invocation", e) ;
+                result = wsMethod.invoke(payload, smooksRequestMapper);
+            } 
+            catch (final WiseException e) 
+            {
+                if (logger.isDebugEnabled())
+                {
+                    logger.debug("Exception thrown from wsMethod invocation", e) ;
+                }
+                throw new ActionProcessingException("Could not call method" + operationName, e);
             }
-            throw new ActionProcessingException("Could not call method" + operationName, e);
+            return mapResponseToMessage(message, result, smooksResponseMapper);
         }
-        return mapResponseToMessage(message, result, smooksResponseMapper);
+        finally
+        {
+            cleanupHandlers(handlers) ;
+        }
     }
     
     synchronized WSDynamicClient createClient(final String wsdl, final String serviceName, final String username, final String password) throws ActionProcessingException
@@ -302,23 +309,29 @@
         }
     }
 
-    private void addSmooksHandlers(final WSEndpoint endpoint, final Object params)
+    private List<SmooksHandler> addSmooksHandlers(final WSEndpoint endpoint, final Object params)
         throws ActionProcessingException
     {
+        final List<SmooksHandler> handlers = new ArrayList<SmooksHandler>() ;
+        boolean cleanup = true ;
         try
         {
             for (String config : smooksHandler) 
             {
                 logger.debug("adding smooks handler:" + config);
+                final SmooksHandler handler ;
                 if (params instanceof Map) 
                 {
-                    endpoint.addHandler(new SmooksHandler(config, (Map)params));
+                    handler = new SmooksHandler(config, (Map)params);
                 } 
                 else 
                 {
-                    endpoint.addHandler(new SmooksHandler(config, null));
+                    handler = new SmooksHandler(config, null);
                 }
+                handlers.add(handler) ;
+                endpoint.addHandler(handler) ;
             }
+            cleanup = false ;
         }
         catch (final RuntimeException re)
         {
@@ -328,8 +341,30 @@
         {
             throw new ActionProcessingException("Unexpected exception while adding smooks handlers", ex) ;
         }
+        finally
+        {
+            if (cleanup)
+            {
+                cleanupHandlers(handlers) ;
+            }
+        }
+        return handlers ;
     }
 
+    private void cleanupHandlers(final List<SmooksHandler> handlers)
+    {
+        for(SmooksHandler handler: handlers)
+        {
+            try
+            {
+                handler.cleanup() ;
+            }
+            catch (final Exception ex)
+            {
+                logger.warn("Unexpected exception cleaning up smooks handler", ex) ;
+            }
+        }
+    }
     private void addCustomHandlers(final WSEndpoint endpoint)
     {
         for (String config : customHandlers) 

Modified: labs/jbossesb/trunk/product/services/soap/src/main/java/org/jboss/soa/esb/actions/soap/wise/SmooksHandler.java
===================================================================
--- labs/jbossesb/trunk/product/services/soap/src/main/java/org/jboss/soa/esb/actions/soap/wise/SmooksHandler.java	2009-07-07 10:11:25 UTC (rev 27690)
+++ labs/jbossesb/trunk/product/services/soap/src/main/java/org/jboss/soa/esb/actions/soap/wise/SmooksHandler.java	2009-07-07 10:57:02 UTC (rev 27691)
@@ -30,6 +30,8 @@
 import javax.xml.ws.handler.soap.SOAPHandler;
 import javax.xml.ws.handler.soap.SOAPMessageContext;
 
+import org.jboss.soa.esb.lifecycle.LifecycleResourceException;
+import org.jboss.soa.esb.smooks.resource.SmooksResource;
 import org.milyn.Smooks;
 import org.milyn.container.ExecutionContext;
 import org.milyn.javabean.repository.BeanRepository;
@@ -69,11 +71,12 @@
      * @throws IOException 
      * @throws SAXException 
      * @throws IllegalArgumentException 
+     * @throws LifecycleResourceException
      */
-    public SmooksHandler(String resource, Map beans) throws IllegalArgumentException, SAXException, IOException {
+    public SmooksHandler(String resource, Map beans) throws IllegalArgumentException, SAXException, IOException, LifecycleResourceException {
 	this.smooksResource = resource;
 	this.beansMap = beans;
-	smooks = new Smooks();
+	smooks = SmooksResource.createSmooksResource();
     smooks.addConfigurations("smooks-resource", new URIResourceLocator().getResource(smooksResource));
     }
 
@@ -169,4 +172,8 @@
     public void setInBoundHandlingEnabled(boolean inBoundHandlingEnabled) {
 	this.inBoundHandlingEnabled = inBoundHandlingEnabled;
     }
+    
+    public void cleanup() {
+        SmooksResource.closeSmooksResource(smooks);
+    }
 }

Modified: labs/jbossesb/trunk/product/services/soap/src/main/java/org/jboss/soa/esb/actions/soap/wise/SmooksMapper.java
===================================================================
--- labs/jbossesb/trunk/product/services/soap/src/main/java/org/jboss/soa/esb/actions/soap/wise/SmooksMapper.java	2009-07-07 10:11:25 UTC (rev 27690)
+++ labs/jbossesb/trunk/product/services/soap/src/main/java/org/jboss/soa/esb/actions/soap/wise/SmooksMapper.java	2009-07-07 10:57:02 UTC (rev 27691)
@@ -20,6 +20,8 @@
 
 import javax.xml.transform.Source;
 
+import org.jboss.soa.esb.lifecycle.LifecycleResourceException;
+import org.jboss.soa.esb.smooks.resource.SmooksResource;
 import org.milyn.Smooks;
 import org.milyn.container.ExecutionContext;
 import org.milyn.container.plugin.PayloadProcessor;
@@ -50,9 +52,10 @@
      * @throws SAXException 
      * @throws IOException 
      * @throws IllegalArgumentException 
+     * @throws LifecycleResourceException
      */
     public SmooksMapper(String smooksResource)
-        throws IllegalArgumentException, IOException, SAXException {
+        throws IllegalArgumentException, IOException, SAXException, LifecycleResourceException {
 	this(smooksResource, null);
     }
 
@@ -67,12 +70,14 @@
      *                the URI of smooks html report to generate.
      * @throws SAXException 
      * @throws IllegalArgumentException 
+     * @throws IOException
+     * @throws LifecycleResourceException
      */
     public SmooksMapper(String smooksResource, String smooksReport)
-        throws IOException, IllegalArgumentException, SAXException {
+        throws IOException, IllegalArgumentException, SAXException, LifecycleResourceException {
 	this.smooksResource = smooksResource;
 	this.smooksReport = smooksReport;
-	smooks = new Smooks();
+	smooks = SmooksResource.createSmooksResource();
 	smooks.addConfigurations("smooks-resource", new URIResourceLocator().getResource(smooksResource));
     }
 

Modified: labs/jbossesb/trunk/product/services/soapui-client/src/main/java/org/jboss/soa/esb/services/soapui/SoapUIClientService.java
===================================================================
--- labs/jbossesb/trunk/product/services/soapui-client/src/main/java/org/jboss/soa/esb/services/soapui/SoapUIClientService.java	2009-07-07 10:11:25 UTC (rev 27690)
+++ labs/jbossesb/trunk/product/services/soapui-client/src/main/java/org/jboss/soa/esb/services/soapui/SoapUIClientService.java	2009-07-07 10:57:02 UTC (rev 27691)
@@ -30,6 +30,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
@@ -52,16 +53,13 @@
 import org.apache.xmlbeans.XmlOptions;
 import org.jboss.internal.soa.esb.soap.OGNLUtils;
 import org.jboss.internal.soa.esb.util.ESBProperties;
-import org.jboss.internal.soa.esb.util.LRUCache;
 import org.jboss.soa.esb.ConfigurationException;
 import org.jboss.internal.soa.esb.util.XMLHelper;
 import org.jboss.soa.esb.dom.YADOMUtil;
 import org.jboss.soa.esb.http.HttpClientFactory;
 import org.jboss.system.ServiceMBeanSupport;
 import org.jboss.system.server.ServerConfig;
-import org.jboss.system.server.ServerConfigLocator;
 import org.milyn.Smooks;
-import org.milyn.resource.URIResourceLocator;
 import org.milyn.xml.XmlUtil;
 import org.w3c.dom.Comment;
 import org.w3c.dom.Document;
@@ -97,7 +95,7 @@
     private static Logger logger = Logger.getLogger(SoapUIClientService.class);
     private Map<String, WsdlInterface[]> wsdls = new HashMap<String, WsdlInterface[]>();
     private DocumentBuilderFactory docBuilderFactory ;
-    private Map<String, Smooks> smooksCache;
+    private SmooksCache smooksCache;
     private ESBProperties properties;
     private static final String CLONED_POSTFIX = " - cloned";
     /**
@@ -132,7 +130,7 @@
         docBuilderFactory = DocumentBuilderFactory.newInstance();
         docBuilderFactory.setNamespaceAware(true);
         int smooksLRUCacheSize = properties.getIntProperty("smooks.lru.cache.size", 30);
-        smooksCache = new LRUCache<String, Smooks>(smooksLRUCacheSize);
+        smooksCache = new SmooksCache(smooksLRUCacheSize);
     }
 
     protected void startService() throws Exception {
@@ -175,6 +173,7 @@
     @Override
     protected void stopService() throws Exception
     {
+        smooksCache.clean();
         if (propertyFile != null)
         {
             File dataDir;
@@ -496,15 +495,15 @@
 
     private void applySmooksTransform(String smooksResource, Document messageDoc) throws IOException, SAXException {
         if(smooksResource != null) {
-            Smooks smooks = smooksCache.get(smooksResource);
-
-            if(smooks == null) {
-                smooks = new Smooks();
-                smooks.addConfigurations("smooks-resource", new ByteArrayInputStream(smooksResource.getBytes("UTF-8")));
-                smooksCache.put(smooksResource, smooks);
+            SmooksEntry smooksEntry = smooksCache.get(smooksResource);
+            try {
+                final Smooks smooks = smooksEntry.getSmooks();
+                smooks.filter(new DOMSource(messageDoc), new DOMResult(), smooks.createExecutionContext());        
             }
-
-            smooks.filter(new DOMSource(messageDoc), new DOMResult(), smooks.createExecutionContext());        
+            finally
+            {
+                smooksCache.release(smooksEntry);
+            }
         }
     }
 
@@ -786,4 +785,176 @@
     {
         return serverDataDir;
     }
+
+    static final class SmooksCache
+    {
+        /**
+         * The unused entries.
+         */
+        private final Map<String, Smooks> cachedResources = new HashMap<String, Smooks>();
+        /**
+         * The list of cached resource entries.
+         */
+        private final LinkedList<String> cachedResourceInsertion = new LinkedList<String>();
+        /**
+         * The active entries.
+         */
+        private final Map<String, SmooksEntry> active = new HashMap<String, SmooksEntry>();
+        /**
+         * The cache size.
+         */
+        private final int smooksLRUCacheSize;
+
+        public SmooksCache(final int smooksLRUCacheSize)
+        {
+            this.smooksLRUCacheSize = smooksLRUCacheSize;
+        }
+
+        public synchronized void clean() {
+            cachedResourceInsertion.clear() ;
+            final Collection<Smooks> cachedSmooks = cachedResources.values() ;
+            for(Smooks smooks: cachedSmooks) {
+                closeSmooks(smooks) ;
+            }
+            cachedResources.clear() ;
+            if (active.size() > 0) {
+                logger.warn("Active smooks entries in cache") ;
+            }
+        }
+
+        public SmooksEntry get(final String smooksResource)
+            throws IOException, SAXException {
+            final SmooksEntry smooks = internalGet(smooksResource);
+            if (smooks != null) {
+                return smooks;
+            } else {
+                return create(smooksResource);
+            }
+        }
+
+        private synchronized SmooksEntry internalGet(final String smooksResource) {
+            final SmooksEntry result;
+            final SmooksEntry activeEntry = active.get(smooksResource);
+            if (activeEntry != null) {
+                activeEntry.incCount();
+                result = activeEntry;
+            } else {
+                final Smooks smooks = (Smooks) cachedResources.remove(smooksResource);
+                if (smooks != null) {
+                    cachedResourceInsertion.remove(smooksResource);
+                    final SmooksEntry entry = new SmooksEntry(smooks, smooksResource);
+                    active.put(smooksResource, entry);
+                    result = entry;
+                } else {
+                    result = null;
+                }
+            }
+            return result;
+        }
+
+        private SmooksEntry create(final String smooksResource)
+                throws IOException, SAXException {
+            final SmooksEntry result;
+            boolean close = false;
+            final Smooks smooks = new Smooks();
+            smooks.addConfigurations("smooks-resource", new ByteArrayInputStream(smooksResource.getBytes("UTF-8")));
+            synchronized (this)
+            {
+                final SmooksEntry current = internalGet(smooksResource);
+                if (current == null) {
+                    final SmooksEntry newEntry = new SmooksEntry(smooks,
+                            smooksResource);
+                    active.put(smooksResource, newEntry);
+                    result = newEntry;
+                } else {
+                    close = true;
+                    result = current;
+                }
+            }
+            if (close) {
+                closeSmooks(smooks);
+            } else {
+                checkExpired();
+            }
+            return result;
+        }
+
+        public void release(final SmooksEntry smooksEntry) {
+            boolean cached = false ;
+            synchronized (this)
+            {
+                if (smooksEntry.decCount() == 0) {
+                    final String smooksResource = smooksEntry.getSmooksResource();
+                    cachedResources.put(smooksResource, smooksEntry.getSmooks());
+                    cachedResourceInsertion.addLast(smooksResource);
+                    cached = true ;
+                }
+            }
+            if (cached) {
+                checkExpired();
+            }
+        }
+
+        private void checkExpired() {
+            final List<Smooks> expiredSmooks;
+            synchronized (this)
+            {
+                final int activeSize = active.size();
+                final int cachedSize = cachedResourceInsertion.size();
+                final int expiredCount = (activeSize >= smooksLRUCacheSize ? cachedSize
+                        : activeSize + cachedSize - smooksLRUCacheSize);
+                if (expiredCount > 0) {
+                    expiredSmooks = new ArrayList<Smooks>(expiredCount);
+                    for (int count = 0; count < expiredCount; count++) {
+                        final String expiredSmooksResource = cachedResourceInsertion.removeFirst();
+                        expiredSmooks.add((Smooks) cachedResources.remove(expiredSmooksResource));
+                    }
+                } else {
+                    expiredSmooks = null;
+                }
+            }
+            if (expiredSmooks != null) {
+                for (Smooks smooks : expiredSmooks) {
+                    closeSmooks(smooks);
+                }
+            }
+        }
+
+        private void closeSmooks(final Smooks smooks) {
+            try {
+                smooks.close();
+            } catch (final Throwable th) {
+                logger.warn("Unexpected exception cleaning smooks resource", th);
+            }
+        }
+    }
+
+    static final class SmooksEntry
+    {
+        private final Smooks smooks;
+        private final String smooksResource;
+        private int count = 1;
+
+        SmooksEntry(final Smooks smooks, final String smooksResource)
+        {
+            this.smooks = smooks;
+            this.smooksResource = smooksResource;
+        }
+
+        Smooks getSmooks() {
+            return smooks;
+        }
+
+        String getSmooksResource() {
+            return smooksResource;
+        }
+
+        int incCount() {
+            return ++count;
+        }
+
+        int decCount() {
+            return --count;
+        }
+    }
 }




More information about the jboss-svn-commits mailing list