[jboss-svn-commits] JBL Code SVN: r18326 - labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Tue Feb 5 15:09:41 EST 2008
Author: mark.proctor at jboss.com
Date: 2008-02-05 15:09:41 -0500 (Tue, 05 Feb 2008)
New Revision: 18326
Added:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DialectData.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DialectDatas.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Function.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MVELDialectData.java
Log:
JBRULES-1450 De-couple drools-core from the java dialect's PackageCompilationData
-Initial de-coupling attempt
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DialectData.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DialectData.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DialectData.java 2008-02-05 20:09:41 UTC (rev 18326)
@@ -0,0 +1,13 @@
+package org.drools.rule;
+
+public interface DialectData {
+ public void removeRule(Package pkg, Rule rule);
+
+ public void removeFunction(Package pkg, Function function);
+
+ public void merge(DialectData newData);
+
+ public boolean isDirty();
+
+ public void reload();
+}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DialectDatas.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DialectDatas.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/DialectDatas.java 2008-02-05 20:09:41 UTC (rev 18326)
@@ -0,0 +1,182 @@
+package org.drools.rule;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.common.DroolsObjectInputStream;
+import org.drools.rule.JavaDialectData.PackageClassLoader;
+
+public class DialectDatas implements Externalizable {
+ private ClassLoader parentClassLoader;
+ private CompositePackageClassLoader classLoader;
+
+ private Map<String, DialectData> dialects;
+
+ private Map lineMappings;
+
+ /**
+ * Default constructor - for Externalizable. This should never be used by a user, as it
+ * will result in an invalid state for the instance.
+ */
+ public DialectDatas() {
+
+ }
+
+ public DialectDatas(ClassLoader classLoader) {
+ this.parentClassLoader = classLoader;
+ this.classLoader = new CompositePackageClassLoader( this.parentClassLoader );
+ this.dialects = new HashMap<String, DialectData>();
+ }
+
+ /**
+ * Handles the write serialization of the PackageCompilationData. Patterns in Rules may reference generated data which cannot be serialized by
+ * default methods. The PackageCompilationData holds a reference to the generated bytecode. The generated bytecode must be restored before any Rules.
+ *
+ */
+ public void writeExternal(final ObjectOutput stream) throws IOException {
+ stream.writeObject( this.lineMappings );
+
+ final ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ final ObjectOutput out = new ObjectOutputStream( bos );
+ out.writeObject( this.dialects );
+ stream.writeObject( bos.toByteArray() );
+ }
+
+ /**
+ * Handles the read serialization of the PackageCompilationData. Patterns in Rules may reference generated data which cannot be serialized by
+ * default methods. The PackageCompilationData holds a reference to the generated bytecode; which must be restored before any Rules.
+ * A custom ObjectInputStream, able to resolve classes against the bytecode, is used to restore the Rules.
+ *
+ */
+ public void readExternal(final ObjectInput stream) throws IOException,
+ ClassNotFoundException {
+ if ( stream instanceof DroolsObjectInputStream ) {
+ DroolsObjectInputStream droolsStream = (DroolsObjectInputStream) stream;
+ this.parentClassLoader = droolsStream.getClassLoader();
+ } else {
+ this.parentClassLoader = Thread.currentThread().getContextClassLoader();
+ }
+
+ this.classLoader = new CompositePackageClassLoader( this.parentClassLoader );
+
+ this.lineMappings = (Map) stream.readObject();
+
+ final byte[] bytes = (byte[]) stream.readObject();
+ final DroolsObjectInputStream streamWithLoader = new DroolsObjectInputStream( new ByteArrayInputStream( bytes ),
+ this.classLoader );
+ streamWithLoader.setDialectDatas( this );
+ this.dialects = (Map) streamWithLoader.readObject();
+ }
+
+ public void addDialectData(String dialect, DialectData dialectData) {
+ this.dialects.put( dialect, dialectData );
+ }
+
+ public DialectData getDialectData(String dialect) {
+ DialectData data = this.dialects.get( dialect );
+ if ( data == null ) {
+ if ( "java".equals( dialect ) ) {
+ data = new JavaDialectData( this );
+ } else if ( "mvel".equals( dialect )) {
+ data = new MVELDialectData( this );
+ } else {
+ throw new RuntimeException("DialectData " + dialect + " does not exist." );
+ }
+ this.dialects.put( dialect, data );
+ }
+ return data;
+ }
+
+ public DialectData removeRule(final Package pkg, final Rule rule) {
+ DialectData dialect = this.dialects.get( rule.getDialect() );
+ dialect.removeRule( pkg, rule );
+ return dialect;
+ }
+
+ public DialectData removeFunction(final Package pkg, final Function function) {
+ DialectData dialect = this.dialects.get( function.getDialect() );
+ dialect.removeFunction( pkg, function );
+ return dialect;
+ }
+
+ public void merge(DialectDatas newDatas) {
+ for(Iterator it = newDatas.dialects.entrySet().iterator(); it.hasNext(); ) {
+ Entry entry = ( Entry ) it.next();
+ DialectData data = ( DialectData ) this.dialects.get( entry.getKey() );
+ data.merge( ( DialectData ) entry.getValue() );
+ }
+
+ if ( this.lineMappings != null ) {
+ // merge line mappings
+ this.lineMappings.putAll( newDatas.getLineMappings() );
+ } else {
+ this.lineMappings = newDatas.getLineMappings();
+ }
+ }
+
+ public boolean isDirty() {
+ return true;
+ }
+
+ public void reloadDirty() {
+ // detect if any dialect is dirty, if so reload() them all
+ boolean isDirty = false;
+ for(Iterator it = this.dialects.values().iterator(); it.hasNext(); ) {
+ DialectData data = ( DialectData ) it.next();
+ if ( data.isDirty() ) {
+ isDirty = true;
+ break;
+ }
+ }
+
+ if ( isDirty ) {
+ this.classLoader = new CompositePackageClassLoader( this.parentClassLoader );
+ for(Iterator it = this.dialects.values().iterator(); it.hasNext(); ) {
+ DialectData data = ( DialectData ) it.next();
+ data.reload();
+ }
+ }
+ }
+
+ public ClassLoader getParentClassLoader() {
+ return this.parentClassLoader;
+ }
+
+ public void setParentClassLoader(ClassLoader classLoader) {
+ this.parentClassLoader = classLoader;
+ }
+
+ public ClassLoader getClassLoader() {
+ return this.classLoader;
+ }
+
+ public void addClassLoader(ClassLoader classLoader) {
+ this.classLoader.addClassLoader( classLoader );
+ }
+
+ public void clear() {
+ this.dialects.clear();
+ }
+
+ public LineMappings getLineMappings(final String className) {
+ return (LineMappings) getLineMappings().get( className );
+ }
+
+ public Map getLineMappings() {
+ if ( this.lineMappings == null ) {
+ this.lineMappings = new HashMap();
+ }
+ return this.lineMappings;
+ }
+}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Function.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Function.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Function.java 2008-02-05 20:09:41 UTC (rev 18326)
@@ -0,0 +1,22 @@
+package org.drools.rule;
+
+import java.io.Serializable;
+
+public class Function implements Dialectable, Serializable {
+ private String name;
+ private String dialect;
+
+ public Function(String name,
+ String dialect) {
+ this.name = name;
+ this.dialect = dialect;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public String getDialect() {
+ return this.dialect;
+ }
+}
Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MVELDialectData.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MVELDialectData.java (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/MVELDialectData.java 2008-02-05 20:09:41 UTC (rev 18326)
@@ -0,0 +1,46 @@
+package org.drools.rule;
+
+import java.io.Serializable;
+import java.util.HashMap;
+
+import org.mvel.ast.Function;
+import org.mvel.integration.impl.MapVariableResolverFactory;
+
+public class MVELDialectData implements DialectData, Serializable {
+ private MapVariableResolverFactory functionFactory;
+
+ public MVELDialectData(final DialectDatas datas) {
+ this.functionFactory = new MapVariableResolverFactory( new HashMap() );
+ }
+
+ public void addFunction(String name, Function function) {
+ this.functionFactory.createVariable( name, function );
+ }
+
+ public boolean isDirty() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public void removeFunction(Package pkg,
+ org.drools.rule.Function function) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void removeRule(Package pkg,
+ Rule rule) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void merge(DialectData newData) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void reload() {
+ // TODO Auto-generated method stub
+
+ }
+}
More information about the jboss-svn-commits
mailing list