[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