[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