[jboss-svn-commits] JBL Code SVN: r34368 - in labs/jbossesb/trunk/product: samples/quickstarts/business_ruleservice_ruleAgent/ruleAgent/package and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Jul 29 20:14:27 EDT 2010


Author: dward
Date: 2010-07-29 20:14:26 -0400 (Thu, 29 Jul 2010)
New Revision: 34368

Added:
   labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/util/RulesClassLoader.java
Removed:
   labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleAgentResourceClassLoader.java
Modified:
   labs/jbossesb/trunk/product/samples/quickstarts/business_ruleservice_cep/readme.txt
   labs/jbossesb/trunk/product/samples/quickstarts/business_ruleservice_ruleAgent/ruleAgent/package/org.jboss.soa.esb.services.rules.pkg
   labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleAgentHelper.java
   labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleBaseHelper.java
Log:
Fix for JBESB-3402 ( https://jira.jboss.org/browse/JBESB-3402 ).


Modified: labs/jbossesb/trunk/product/samples/quickstarts/business_ruleservice_cep/readme.txt
===================================================================
--- labs/jbossesb/trunk/product/samples/quickstarts/business_ruleservice_cep/readme.txt	2010-07-29 23:58:09 UTC (rev 34367)
+++ labs/jbossesb/trunk/product/samples/quickstarts/business_ruleservice_cep/readme.txt	2010-07-30 00:14:26 UTC (rev 34368)
@@ -1,3 +1,8 @@
+Note:
+=====
+  This example is currently under development and will most likely change in
+  the next release of JBoss ESB to more accurately showcase a CEP application.
+
 Overview:
 =========
   An example of Complex Event Processing, using the classic "hub and spoke"

Modified: labs/jbossesb/trunk/product/samples/quickstarts/business_ruleservice_ruleAgent/ruleAgent/package/org.jboss.soa.esb.services.rules.pkg
===================================================================
(Binary files differ)

Modified: labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleAgentHelper.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleAgentHelper.java	2010-07-29 23:58:09 UTC (rev 34367)
+++ labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleAgentHelper.java	2010-07-30 00:14:26 UTC (rev 34368)
@@ -52,10 +52,12 @@
 import org.drools.ChangeSet;
 import org.drools.agent.RuleAgent;
 import org.drools.builder.ResourceType;
+import org.drools.builder.conf.ClassLoaderCacheOption;
 import org.drools.conf.EventProcessingOption;
 import org.drools.xml.ChangeSetSemanticModule;
 import org.drools.xml.SemanticModules;
 import org.drools.xml.XmlChangeSetReader;
+import org.jboss.internal.soa.esb.services.rules.util.RulesClassLoader;
 import org.jboss.internal.soa.esb.util.StreamUtils;
 import org.jboss.soa.esb.ConfigurationException;
 import org.jboss.soa.esb.services.rules.RuleInfo;
@@ -107,6 +109,7 @@
 	}
 	
 	private final Properties properties = new Properties();
+	private final ClassLoader classLoader;
 	private String name = null;
 	private final ChangeSet changeSet;
 	
@@ -117,6 +120,7 @@
 	public DroolsRuleAgentHelper(final RuleInfo ruleInfo) throws RuleServiceException
 	{
 		final String ruleAgentProperties = ruleInfo.getRuleSource();
+		classLoader = new RulesClassLoader(ruleAgentProperties);
 		
 		String contents;
 		InputStream is = null;
@@ -150,7 +154,7 @@
 		if (ruleAgentProperties.endsWith(".xml") && contents.indexOf("<change-set") != -1)
 		{
 			// change-set
-			changeSet = readChangeSet(ruleAgentProperties, contents);
+			changeSet = readChangeSet(contents);
 		}
 		else
 		{
@@ -248,16 +252,19 @@
 					logger.debug("created ChangeSet XML [" + xml + "]");
 				}
 			}
-			changeSet = readChangeSet(ruleAgentProperties, xml);
+			changeSet = readChangeSet(xml);
 		}
+		// If this isn't false, then all rules' LHS object conditions will not match on .esb redeploys!
+		// (since objects are only equal if they're classloaders are also equal - and they're not on redploys)
+		properties.setProperty(ClassLoaderCacheOption.PROPERTY_NAME, Boolean.FALSE.toString());
 	}
 	
-	private ChangeSet readChangeSet(String ruleAgentProperties, String xml) throws RuleServiceException
+	private ChangeSet readChangeSet(String xml) throws RuleServiceException
 	{
 		SemanticModules semanticModules = new SemanticModules();
 		semanticModules.addSemanticModule(new ChangeSetSemanticModule());
 		XmlChangeSetReader reader = new XmlChangeSetReader(semanticModules);
-		reader.setClassLoader(new DroolsRuleAgentResourceClassLoader(ruleAgentProperties), null);
+		reader.setClassLoader(classLoader, null);
 		try
 		{
 			return reader.read(new StringReader(xml));
@@ -477,11 +484,15 @@
 
         return items;
     }
-	
+    
 	public Properties getProperties()
 	{
 		return properties;
 	}
+    public ClassLoader getClassLoader()
+    {
+    	return classLoader;
+    }
 	
 	public String getName()
 	{

Deleted: labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleAgentResourceClassLoader.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleAgentResourceClassLoader.java	2010-07-29 23:58:09 UTC (rev 34367)
+++ labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleAgentResourceClassLoader.java	2010-07-30 00:14:26 UTC (rev 34368)
@@ -1,146 +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-2010
- */
-package org.jboss.internal.soa.esb.services.rules;
-
-import java.net.URL;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.apache.log4j.Logger;
-import org.jboss.internal.soa.esb.assertion.AssertArgument;
-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.jboss.soa.esb.lifecycle.LifecycleResourceManager;
-
-/**
- * Holds lifecycle-bound references to whatever the TCCL was at the time of construction,
- * and tries to use that for getting resources.  This will not only help us find the correct
- * resource, but it will also help us avoid a memory leak, as the ClassLoader of the
- * XmlChangeSetReader is used to create the ClassPathResource, which is held onto globally
- * by the static drools ResourceChangeScanner/Notifier mechanism.
- * 
- * @author dward at jboss.org
- */
-public class DroolsRuleAgentResourceClassLoader extends ClassLoader
-{
-	
-	private final String ruleAgentProperties;
-	
-	public DroolsRuleAgentResourceClassLoader(String ruleAgentProperties)
-	{
-		AssertArgument.isNotNullAndNotEmpty(ruleAgentProperties, RULE_AGENT_PROPERTIES);
-		this.ruleAgentProperties = ruleAgentProperties;
-		ClassLoader tccl = Thread.currentThread().getContextClassLoader();
-		if (tccl != null)
-		{
-			try
-			{
-				putClassLoader(this.ruleAgentProperties, tccl);
-			}
-			catch (LifecycleResourceException lre)
-			{
-				throw new RuntimeException(lre);
-			}
-		}
-	}
-	
-	@Override
-	public final URL getResource(String name)
-	{
-		ClassLoader cl;
-		try
-		{
-			cl = getClassLoader(ruleAgentProperties);
-		}
-		catch (LifecycleResourceException lre)
-		{
-			throw new RuntimeException(lre);
-		}
-		return (cl != null ? cl.getResource(name) : null);
-	}
-	
-	private static final Logger logger = Logger.getLogger(DroolsRuleAgentResourceClassLoader.class);
-	
-	private static final String RULE_AGENT_PROPERTIES = "ruleAgentProperties";
-	
-	private static final LifecycleResource<Map<String, ClassLoader>> lifecycleClassLoaders =
-		new LifecycleResource<Map<String, ClassLoader>>(new LifecycleRuleAgentFactory(), LifecyclePriorities.RULE_AGENT_RESOURCE_CLASSLOADER_PRIORITY);
-	
-	private static final void putClassLoader(String ruleAgentProperties, ClassLoader classLoader) throws LifecycleResourceException
-	{
-		String key = buildKey(ruleAgentProperties);
-		Map<String, ClassLoader> map = lifecycleClassLoaders.getLifecycleResource();
-		synchronized (map)
-		{
-			map.put(key, classLoader);
-		}
-	}
-	
-	private static final ClassLoader getClassLoader(String ruleAgentProperties) throws LifecycleResourceException
-	{
-		String key = buildKey(ruleAgentProperties);
-		Map<String, ClassLoader> map = lifecycleClassLoaders.getLifecycleResource();
-		synchronized (map)
-		{
-			return map.get(key);
-		}
-	}
-	
-	private static final String buildKey(String ruleAgentProperties)
-	{
-		return new StringBuilder()
-			.append(DroolsRuleAgentResourceClassLoader.class.getSimpleName())
-			.append("?deployment=")
-			.append(LifecycleResourceManager.getSingleton().getIdentity())
-			.append('&')
-			.append(RULE_AGENT_PROPERTIES)
-			.append('=')
-			.append(ruleAgentProperties)
-			.toString();
-	}
-	
-	private static final class LifecycleRuleAgentFactory implements LifecycleResourceFactory<Map<String, ClassLoader>>
-	{
-		
-		public Map<String, ClassLoader> createLifecycleResource(String lifecycleIdentity) throws LifecycleResourceException
-		{
-			return new ConcurrentHashMap<String, ClassLoader>();
-		}
-		
-		public void destroyLifecycleResource(Map<String, ClassLoader> resource, String lifecycleIdentity) throws LifecycleResourceException
-		{
-			if (resource.size() > 0)
-			{
-				if ( logger.isInfoEnabled() )
-				{
-					for ( String key : resource.keySet() )
-					{
-						logger.info("Removing " + key);
-					}
-				}
-				resource.clear();
-			}
-		}
-        
-	}
-
-}

Modified: labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleBaseHelper.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleBaseHelper.java	2010-07-29 23:58:09 UTC (rev 34367)
+++ labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleBaseHelper.java	2010-07-30 00:14:26 UTC (rev 34368)
@@ -29,8 +29,10 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
+import java.util.Properties;
 
 import org.apache.log4j.Logger;
+import org.drools.ChangeSet;
 import org.drools.KnowledgeBase;
 import org.drools.KnowledgeBaseConfiguration;
 import org.drools.KnowledgeBaseFactory;
@@ -40,12 +42,15 @@
 import org.drools.builder.DecisionTableConfiguration;
 import org.drools.builder.DecisionTableInputType;
 import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderConfiguration;
 import org.drools.builder.KnowledgeBuilderErrors;
 import org.drools.builder.KnowledgeBuilderFactory;
 import org.drools.builder.ResourceType;
+import org.drools.builder.conf.ClassLoaderCacheOption;
 import org.drools.compiler.DroolsParserException;
 import org.drools.conf.EventProcessingOption;
 import org.drools.io.ResourceFactory;
+import org.jboss.internal.soa.esb.services.rules.util.RulesClassLoader;
 import org.jboss.internal.soa.esb.util.StreamUtils;
 import org.jboss.soa.esb.services.rules.RuleInfo;
 import org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.StringValue;
@@ -209,12 +214,19 @@
 	 */
 	public KnowledgeAgent createRuleAgent(final RuleInfo ruleInfo) throws RuleServiceException
 	{
-		DroolsRuleAgentHelper drah = new DroolsRuleAgentHelper(ruleInfo);
-		KnowledgeAgentConfiguration kac = KnowledgeAgentFactory.newKnowledgeAgentConfiguration(drah.getProperties());
-		KnowledgeAgent ka = KnowledgeAgentFactory.newKnowledgeAgent(drah.getName(), kac);
-		ka.setSystemEventListener(new LogAgentEventListener(drah.getName()));
-		ka.applyChangeSet(drah.getChangeSet());
-		return ka;
+		final DroolsRuleAgentHelper drah = new DroolsRuleAgentHelper(ruleInfo);
+		final Properties properties = drah.getProperties();
+		final ClassLoader classLoader = drah.getClassLoader();
+		final String name = drah.getName();
+		final ChangeSet changeSet = drah.getChangeSet();
+		final KnowledgeBaseConfiguration kbaseConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(properties, classLoader);
+		final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kbaseConfig);
+		final KnowledgeAgentConfiguration kagentConfig = KnowledgeAgentFactory.newKnowledgeAgentConfiguration(properties);
+		final KnowledgeBuilderConfiguration kbuilderConfig = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(properties, classLoader);
+		final KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent(name, kbase, kagentConfig, kbuilderConfig);
+		kagent.setSystemEventListener(new LogAgentEventListener(name));
+		kagent.applyChangeSet(changeSet);
+		return kagent;
 	}
 	
 	private String getFileContents( final String fileName ) throws RuleServiceException
@@ -252,8 +264,14 @@
 		{
 			throw new RuleServiceException("Generation raised the following errors: " + errors) ;
 		}
-		KnowledgeBaseConfiguration kbaseConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
 		
+		// If we don't use this config, then all rules' LHS object conditions will not match on .esb redeploys!
+		// (since objects are only equal if their ClassLoaders are also equal - and they're not on redeploys..)
+		final Properties properties = new Properties();
+		properties.setProperty(ClassLoaderCacheOption.PROPERTY_NAME, Boolean.FALSE.toString());
+		final ClassLoader classLoader = new RulesClassLoader(ruleInfo.getRuleSource());
+		KnowledgeBaseConfiguration kbaseConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(properties, classLoader);
+		
 		// CEP
 		StringValue eventProcessingType = RULE_EVENT_PROCESSING_TYPE.getStringValue(ruleInfo.getEventProcessingType());
 		if (STREAM.equals(eventProcessingType))

Added: labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/util/RulesClassLoader.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/util/RulesClassLoader.java	                        (rev 0)
+++ labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/util/RulesClassLoader.java	2010-07-30 00:14:26 UTC (rev 34368)
@@ -0,0 +1,180 @@
+/*
+ * 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-2010
+ */
+package org.jboss.internal.soa.esb.services.rules.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.log4j.Logger;
+import org.jboss.internal.soa.esb.assertion.AssertArgument;
+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.jboss.soa.esb.lifecycle.LifecycleResourceManager;
+
+/**
+ * Holds lifecycle-bound references to whatever the TCCL was at the time of construction,
+ * and tries to use that for loading classes or getting resources.  This will not only
+ * help us find the correct class or resource, but it will also help us avoid a memory leak,
+ * as there are static drools mechanisms (like ResourceChangeScanner/Notifier).
+ * 
+ * @author dward at jboss.org
+ */
+public final class RulesClassLoader extends ClassLoader
+{
+	
+	private final String ruleSource;
+	
+	public RulesClassLoader(final String ruleSource)
+	{
+		AssertArgument.isNotNullAndNotEmpty(ruleSource, RULE_SOURCE);
+		this.ruleSource = ruleSource;
+		ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+		if (tccl != null)
+		{
+			try
+			{
+				putClassLoader(this.ruleSource, tccl);
+			}
+			catch (LifecycleResourceException lre)
+			{
+				throw new RuntimeException(lre);
+			}
+		}
+	}
+	
+	@Override
+	public final URL getResource(String name)
+	{
+		ClassLoader cl = getClassLoader();
+		return (cl != null) ? cl.getResource(name) : super.getResource(name);
+	}
+	
+	@Override
+	public final InputStream getResourceAsStream(String name)
+	{
+		ClassLoader cl = getClassLoader();
+		return (cl != null) ? cl.getResourceAsStream(name) : super.getResourceAsStream(name);
+	}
+	
+	@Override
+	public final Enumeration<URL> getResources(String name) throws IOException
+	{
+		ClassLoader cl = getClassLoader();
+		return (cl != null) ? cl.getResources(name) : super.getResources(name);
+	}
+	
+	@Override
+	public final Class<?> loadClass(String name) throws ClassNotFoundException
+	{
+		ClassLoader cl = getClassLoader();
+		return (cl != null) ? cl.loadClass(name) : super.loadClass(name);
+	}
+	
+	@Override
+	public final Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
+	{
+		ClassLoader cl = getClassLoader();
+		return (cl != null) ? cl.loadClass(name) : super.loadClass(name, resolve);
+	}
+	
+	private final ClassLoader getClassLoader()
+	{
+		try
+		{
+			return getClassLoader(this.ruleSource);
+		}
+		catch (LifecycleResourceException lre)
+		{
+			throw new RuntimeException(lre);
+		}
+	}
+	
+	private static final Logger logger = Logger.getLogger(RulesClassLoader.class);
+	
+	private static final String RULE_SOURCE = "ruleSource";
+	
+	private static final LifecycleResource<Map<String, ClassLoader>> lifecycleClassLoaders =
+		new LifecycleResource<Map<String, ClassLoader>>(new LifecycleRuleAgentFactory(), LifecyclePriorities.RULE_AGENT_RESOURCE_CLASSLOADER_PRIORITY);
+	
+	private static final void putClassLoader(String ruleSource, ClassLoader classLoader) throws LifecycleResourceException
+	{
+		String key = buildKey(ruleSource);
+		Map<String, ClassLoader> map = lifecycleClassLoaders.getLifecycleResource();
+		synchronized (map)
+		{
+			map.put(key, classLoader);
+		}
+	}
+	
+	private static final ClassLoader getClassLoader(String ruleSource) throws LifecycleResourceException
+	{
+		String key = buildKey(ruleSource);
+		Map<String, ClassLoader> map = lifecycleClassLoaders.getLifecycleResource();
+		synchronized (map)
+		{
+			return map.get(key);
+		}
+	}
+	
+	private static final String buildKey(String ruleSource)
+	{
+		return new StringBuilder()
+			.append(RulesClassLoader.class.getSimpleName())
+			.append("?deployment=")
+			.append(LifecycleResourceManager.getSingleton().getIdentity())
+			.append('&')
+			.append(RULE_SOURCE)
+			.append('=')
+			.append(ruleSource)
+			.toString();
+	}
+	
+	private static final class LifecycleRuleAgentFactory implements LifecycleResourceFactory<Map<String, ClassLoader>>
+	{
+		
+		public Map<String, ClassLoader> createLifecycleResource(String lifecycleIdentity) throws LifecycleResourceException
+		{
+			return new ConcurrentHashMap<String, ClassLoader>();
+		}
+		
+		public void destroyLifecycleResource(Map<String, ClassLoader> resource, String lifecycleIdentity) throws LifecycleResourceException
+		{
+			if (resource.size() > 0)
+			{
+				if ( logger.isInfoEnabled() )
+				{
+					for ( String key : resource.keySet() )
+					{
+						logger.info("Removing " + key);
+					}
+				}
+				resource.clear();
+			}
+		}
+        
+	}
+
+}


Property changes on: labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/util/RulesClassLoader.java
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native



More information about the jboss-svn-commits mailing list