[jboss-svn-commits] JBL Code SVN: r10461 - in labs/jbossrules/trunk/drools-jbrms/src: main/java/org/drools/brms/server and 3 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Mar 22 18:11:36 EDT 2007


Author: tirelli
Date: 2007-03-22 18:11:36 -0400 (Thu, 22 Mar 2007)
New Revision: 10461

Added:
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/converter/
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/converter/BRXMLToDescrConverter.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/converter/
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/converter/BRXMLToDescrConverterTest.java
Modified:
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/brxml/CompositeFactPattern.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/brxml/ConnectiveConstraint.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/brxml/Constraint.java
Log:
JBRULES-647: adding transformation for CompositeFactPattern

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/brxml/CompositeFactPattern.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/brxml/CompositeFactPattern.java	2007-03-22 21:43:16 UTC (rev 10460)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/brxml/CompositeFactPattern.java	2007-03-22 22:11:36 UTC (rev 10461)
@@ -1,39 +1,42 @@
 package org.drools.brms.client.modeldriven.brxml;
 
-
 /**
  * Represents first order logic like Or, Not, Exists.
  * 
  * @author Michael Neale
  */
-public class CompositeFactPattern implements IPattern {
+public class CompositeFactPattern
+    implements
+    IPattern {
+    public static final String NOT    = "not";
+    public static final String EXISTS = "exists";
+    public static final String OR     = "or";
 
     /**
      * this will one of: [Not, Exist, Or]
      */
-    public String type;
-    public FactPattern[] patterns;
-    
-    
+    public String              type;
+    public FactPattern[]       patterns;
+
     public CompositeFactPattern(String type) {
         this.type = type;
     }
-    
-    public CompositeFactPattern() {}
-    
-    
+
+    public CompositeFactPattern() {
+    }
+
     public void addFactPattern(FactPattern pat) {
-        if (this.patterns == null) this.patterns = new FactPattern[0];
-        
+        if ( this.patterns == null ) this.patterns = new FactPattern[0];
+
         FactPattern[] list = this.patterns;
         FactPattern[] newList = new FactPattern[list.length + 1];
-        
+
         for ( int i = 0; i < list.length; i++ ) {
-            newList[i] =  list[i];
+            newList[i] = list[i];
         }
-        newList[list.length] = pat; 
-        
-        this.patterns = newList;    
+        newList[list.length] = pat;
+
+        this.patterns = newList;
     }
-    
+
 }

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/brxml/ConnectiveConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/brxml/ConnectiveConstraint.java	2007-03-22 21:43:16 UTC (rev 10460)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/brxml/ConnectiveConstraint.java	2007-03-22 22:11:36 UTC (rev 10461)
@@ -8,6 +8,10 @@
 public class ConnectiveConstraint
     implements
     PortableObject {
+    
+    public static final int UNDEFINED_CONNECTIVE = 0;
+    public static final int OR_CONNECTIVE = 1;
+    public static final int AND_CONNECTIVE = 2;
 
     public ConnectiveConstraint() {}
     
@@ -16,7 +20,9 @@
         this.operator = opr;
         this.value = val;
     }
+    public int connectiveType;
     public String operator;
     public String value;
+    public int constraintType;
     
 }

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/brxml/Constraint.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/brxml/Constraint.java	2007-03-22 21:43:16 UTC (rev 10460)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/brxml/Constraint.java	2007-03-22 22:11:36 UTC (rev 10461)
@@ -1,42 +1,52 @@
 package org.drools.brms.client.modeldriven.brxml;
 
-
 /**
  * This represents a contraint on a fact.
  * Can also include optional "connective constraints" that extend the options for matches.
  * @author Michael Neale
  *
  */
-public class Constraint implements PortableObject {
-    public String fieldBinding;
-    public String fieldName;
-    public String operator;
-    public String value;
+public class Constraint
+    implements
+    PortableObject {
     
+    public static final int    UNDEFINED = 0;
+    public static final int    LITERAL   = 1;
+    public static final int    VARIABLE  = 2;
+    public static final int    RET_VALUE = 3;
+    public static final int    ENUM      = 4;
+    public static final int    PREDICATE = 5;
+
+    public String                 fieldBinding;
+    public String                 fieldName;
+    public String                 operator;
+    public String                 value;
+    public int                    type;
+
     public ConnectiveConstraint[] connectives;
-    
+
     public Constraint(String field) {
         this.fieldName = field;
     }
-    
-    public Constraint() {}
-    
+
+    public Constraint() {
+    }
+
     /**
      * This adds a new connective.
      *
      */
     public void addNewConnective() {
-        if (connectives == null) {
-            connectives = new ConnectiveConstraint[] {new ConnectiveConstraint()};                      
+        if ( connectives == null ) {
+            connectives = new ConnectiveConstraint[]{new ConnectiveConstraint()};
         } else {
             ConnectiveConstraint[] newList = new ConnectiveConstraint[connectives.length + 1];
-            for ( int i = 0; i < connectives.length; i++ ) {            
+            for ( int i = 0; i < connectives.length; i++ ) {
                 newList[i] = connectives[i];
             }
             newList[connectives.length] = new ConnectiveConstraint();
             connectives = newList;
-        }          
+        }
     }
-    
-    
+
 }

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/converter/BRXMLToDescrConverter.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/converter/BRXMLToDescrConverter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/converter/BRXMLToDescrConverter.java	2007-03-22 22:11:36 UTC (rev 10461)
@@ -0,0 +1,174 @@
+package org.drools.brms.server.converter;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.brms.client.modeldriven.brxml.CompositeFactPattern;
+import org.drools.brms.client.modeldriven.brxml.ConnectiveConstraint;
+import org.drools.brms.client.modeldriven.brxml.Constraint;
+import org.drools.brms.client.modeldriven.brxml.DSLSentence;
+import org.drools.brms.client.modeldriven.brxml.FactPattern;
+import org.drools.brms.client.modeldriven.brxml.IPattern;
+import org.drools.brms.client.modeldriven.brxml.RuleAttribute;
+import org.drools.brms.client.modeldriven.brxml.RuleModel;
+import org.drools.lang.descr.AndDescr;
+import org.drools.lang.descr.AttributeDescr;
+import org.drools.lang.descr.BaseDescr;
+import org.drools.lang.descr.ColumnDescr;
+import org.drools.lang.descr.ConditionalElementDescr;
+import org.drools.lang.descr.ExistsDescr;
+import org.drools.lang.descr.FieldBindingDescr;
+import org.drools.lang.descr.FieldConstraintDescr;
+import org.drools.lang.descr.LiteralRestrictionDescr;
+import org.drools.lang.descr.NotDescr;
+import org.drools.lang.descr.OrDescr;
+import org.drools.lang.descr.PredicateDescr;
+import org.drools.lang.descr.RestrictionConnectiveDescr;
+import org.drools.lang.descr.RestrictionDescr;
+import org.drools.lang.descr.ReturnValueRestrictionDescr;
+import org.drools.lang.descr.RuleDescr;
+import org.drools.lang.descr.VariableRestrictionDescr;
+
+/** 
+ * This class will convert BRXML to Descriptors, allowing to roundtrip between 
+ * sipported formats (DRL, XML, CLP, etc).
+ * 
+ * It will work off the RuleModel object graph, primarily.
+ * 
+ * @author Edson Tirelli
+ */
+public class BRXMLToDescrConverter {
+
+    public RuleDescr toDescr(RuleModel model,
+                             String ruleName) {
+        RuleDescr rule = new RuleDescr( ruleName );
+        addAttributes( rule,
+                       model.attributes );
+        addLHS( rule,
+                model.lhs );
+        return rule;
+    }
+
+    private void addLHS(RuleDescr rule,
+                        IPattern[] lhs) {
+        AndDescr lhsDescr = new AndDescr(); 
+        rule.setLhs( lhsDescr );
+        for ( int i = 0; i < lhs.length; i++ ) {
+            IPattern cond = lhs[i];
+            if ( cond instanceof DSLSentence ) {
+                // need to decide what to do with DSL sentences
+                //render((DSLSentence) cond, buf);
+            } else if ( cond instanceof FactPattern ) {
+                addFact( lhsDescr,
+                         (FactPattern) cond );
+            } else if ( cond instanceof CompositeFactPattern ) {
+                addComposite( lhsDescr,
+                              (CompositeFactPattern) cond );
+            }
+        }
+
+    }
+
+    private void addComposite(ConditionalElementDescr ce,
+                              CompositeFactPattern pattern) {
+        ConditionalElementDescr inner = null;
+        if( CompositeFactPattern.OR.equals( pattern.type )) {
+            inner = new OrDescr();
+        } else if( CompositeFactPattern.NOT.equals( pattern.type )) {
+            inner = new NotDescr();
+        } else if( CompositeFactPattern.EXISTS.equals( pattern.type )) {
+            inner = new ExistsDescr();
+        }
+        for( int i = 0; i < pattern.patterns.length; i++ ) {
+            this.addFact( inner, pattern.patterns[i] );
+        }
+        ce.addDescr( (BaseDescr) inner );
+    }
+
+    private void addFact(ConditionalElementDescr ce,
+                         FactPattern pattern) {
+        ColumnDescr column = new ColumnDescr( pattern.factType );
+        column.setIdentifier( pattern.boundName );
+        ce.addDescr( column );
+
+        for ( int i = 0; i < pattern.constraints.length; i++ ) {
+            Constraint constr = pattern.constraints[i];
+            if ( constr.fieldBinding != null ) {
+                FieldBindingDescr fieldDescr = new FieldBindingDescr( constr.fieldName,
+                                                                      constr.fieldBinding );
+                column.addDescr( fieldDescr );
+            }
+            if ( constr.type == Constraint.PREDICATE ) {
+                PredicateDescr predicateDescr = new PredicateDescr( constr.value );
+                column.addDescr( predicateDescr );
+            } else {
+                FieldConstraintDescr constrDescr = new FieldConstraintDescr( constr.fieldName );
+                constrDescr.addRestriction( this.getFieldRestriction( constr.type,
+                                                                      constr.operator,
+                                                                      constr.value ) );
+
+                if ( constr.connectives != null ) {
+                    for ( int j = 0; j < constr.connectives.length; j++ ) {
+                        ConnectiveConstraint conn = constr.connectives[j];
+                        switch ( conn.connectiveType ) {
+                            case ConnectiveConstraint.AND_CONNECTIVE :
+                                RestrictionConnectiveDescr andDescr = new RestrictionConnectiveDescr( RestrictionConnectiveDescr.AND );
+                                constrDescr.addRestriction( andDescr );
+                                break;
+                            case ConnectiveConstraint.OR_CONNECTIVE :
+                                RestrictionConnectiveDescr orDescr = new RestrictionConnectiveDescr( RestrictionConnectiveDescr.OR );
+                                constrDescr.addRestriction( orDescr );
+                                break;
+                            default :
+                                // TODO: handle error
+                                // unknown connective... error
+                        }
+                        constrDescr.addRestriction( this.getFieldRestriction( conn.constraintType,
+                                                                              conn.operator,
+                                                                              conn.value ) );
+                    }
+                }
+                column.addDescr( constrDescr );
+            }
+        }
+    }
+
+    /**
+     * @param constr
+     * @param constrDescr
+     */
+    private RestrictionDescr getFieldRestriction(int type,
+                                                 String operator,
+                                                 String value) {
+        switch ( type ) {
+            case Constraint.LITERAL :
+                LiteralRestrictionDescr lit = new LiteralRestrictionDescr( operator,
+                                                                           value );
+                return lit;
+            case Constraint.VARIABLE :
+                VariableRestrictionDescr var = new VariableRestrictionDescr( operator,
+                                                                             value );
+                return var;
+            case Constraint.ENUM :
+                LiteralRestrictionDescr enu = new LiteralRestrictionDescr( operator,
+                                                                           value,
+                                                                           true );
+                return enu;
+            case Constraint.RET_VALUE :
+                ReturnValueRestrictionDescr rvc = new ReturnValueRestrictionDescr( operator,
+                                                                                   value );
+                return rvc;
+            default :
+                throw new RuntimeDroolsException( "Undefined constraint type in ROM: " + type );
+        }
+    }
+
+    private void addAttributes(RuleDescr rule,
+                               RuleAttribute[] attributes) {
+        for ( int i = 0; i < attributes.length; i++ ) {
+            RuleAttribute at = attributes[i];
+            AttributeDescr attr = new AttributeDescr( at.attributeName,
+                                                      at.value == null ? "true" : at.value );
+            rule.addAttribute( attr );
+        }
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/converter/BRXMLToDescrConverter.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/converter/BRXMLToDescrConverterTest.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/converter/BRXMLToDescrConverterTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/converter/BRXMLToDescrConverterTest.java	2007-03-22 22:11:36 UTC (rev 10461)
@@ -0,0 +1,93 @@
+package org.drools.brms.server.converter;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.drools.brms.client.modeldriven.brxml.CompositeFactPattern;
+import org.drools.brms.client.modeldriven.brxml.Constraint;
+import org.drools.brms.client.modeldriven.brxml.FactPattern;
+import org.drools.brms.client.modeldriven.brxml.RuleAttribute;
+import org.drools.brms.client.modeldriven.brxml.RuleModel;
+import org.drools.lang.descr.AttributeDescr;
+import org.drools.lang.descr.ColumnDescr;
+import org.drools.lang.descr.ConditionalElementDescr;
+import org.drools.lang.descr.FieldConstraintDescr;
+import org.drools.lang.descr.LiteralRestrictionDescr;
+import org.drools.lang.descr.OrDescr;
+import org.drools.lang.descr.RuleDescr;
+import org.drools.rule.LiteralConstraint;
+
+public class BRXMLToDescrConverterTest extends TestCase {
+
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    public void testToDescr() {
+        BRXMLToDescrConverter converter = new BRXMLToDescrConverter();
+        
+        RuleModel model = new RuleModel();
+        
+        // adding rule's attributes
+        RuleAttribute salience = new RuleAttribute( "salience", "10" );
+        RuleAttribute noloop = new RuleAttribute( "no-loop", null );
+        model.addAttribute( salience ); 
+        model.addAttribute( noloop ); 
+        
+        // adding simple pattern
+        FactPattern pat1 = new FactPattern("Cheese");
+        pat1.boundName = "cheese";
+        Constraint constr = new Constraint( "type" );
+        constr.operator = "==";
+        constr.value = "stilton";
+        constr.type = Constraint.LITERAL;
+        pat1.addConstraint( constr );
+        model.addLhsItem( pat1 );
+        
+        CompositeFactPattern comp1 = new CompositeFactPattern();
+        comp1.type = CompositeFactPattern.OR;
+        
+        FactPattern pat2 = new FactPattern("Person");
+        FactPattern pat3 = new FactPattern("People");
+        comp1.addFactPattern( pat2 );
+        comp1.addFactPattern( pat3 );
+        
+        model.addLhsItem( comp1 );
+        
+        // converting into descr
+        RuleDescr rule = converter.toDescr( model, "" );
+        // checking Attributes
+        List attributes = rule.getAttributes(); 
+        assertEquals( 2, attributes.size() );
+        AttributeDescr salienceDescr = (AttributeDescr) attributes.get( 0 );
+        assertEquals( salience.attributeName, salienceDescr.getName() );
+        assertEquals( salience.value, salienceDescr.getValue() );
+        AttributeDescr noloopDescr = (AttributeDescr) attributes.get( 1 );
+        assertEquals( noloop.attributeName, noloopDescr.getName() );
+        assertEquals( "true", noloopDescr.getValue() );
+        
+        // checking LHS patterns
+        ColumnDescr col1 = (ColumnDescr) rule.getLhs().getDescrs().get( 0 );
+        assertEquals( pat1.boundName, col1.getIdentifier() );
+        assertEquals( pat1.factType, col1.getObjectType() );
+        FieldConstraintDescr field = (FieldConstraintDescr) col1.getDescrs().get( 0 );
+        assertEquals( pat1.constraints[0].fieldName, field.getFieldName());
+        LiteralRestrictionDescr lit = (LiteralRestrictionDescr) field.getRestrictions().get( 0 );
+        assertEquals( pat1.constraints[0].operator, lit.getEvaluator());
+        assertEquals( pat1.constraints[0].value, lit.getText());
+        
+        OrDescr or1 = (OrDescr) rule.getLhs().getDescrs().get( 1 );
+        ColumnDescr col2 = (ColumnDescr) or1.getDescrs().get( 0 );
+        assertEquals( pat2.factType, col2.getObjectType() );
+        
+        ColumnDescr col3 = (ColumnDescr) or1.getDescrs().get( 1 );
+        assertEquals( pat3.factType, col3.getObjectType() );
+        
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/converter/BRXMLToDescrConverterTest.java
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native




More information about the jboss-svn-commits mailing list