[jboss-svn-commits] JBL Code SVN: r10608 - in labs/jbossrules/trunk/drools-compiler/src: main/java/org/drools/brms and 17 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Mar 29 08:09:13 EDT 2007


Author: michael.neale at jboss.com
Date: 2007-03-29 08:09:13 -0400 (Thu, 29 Mar 2007)
New Revision: 10608

Added:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/SuggestionCompletionEngine.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionAssertFact.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionAssertLogicalFact.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionFieldList.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionFieldValue.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionModifyField.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionRetractFact.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionSetField.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/CompositeFactPattern.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ConnectiveConstraint.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/Constraint.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/DSLSentence.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/FactPattern.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/IAction.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/IPattern.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/PortableObject.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/RuleAttribute.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/RuleModel.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/package.html
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/package.html
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/converter/
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/converter/BRXMLToDescrConverter.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/package.html
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/rules/
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/rules/SuggestionCompletionLoader.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/util/
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/util/BRLPersistence.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/util/SuggestionCompletionEngineBuilder.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/resource/
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/resource/util/
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/resource/util/ByteArrayClassLoader.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/client/
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/client/modeldriven/
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/client/modeldriven/SuggestionCompletionTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/ActionFieldValueTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/ActionSetFieldTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/CompositeFactPatternTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/ConstraintTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/DSLSentenceTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/FactPatternTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/RuleModelTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/package.html
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/server/
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/server/converter/
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/server/converter/BRXMLToDescrConverterTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/server/util/
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/server/util/BRLPersitenceTest.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/server/util/SuggestionCompletionEngineBuilderTest.java
Log:
JBRULES-758 Moved re-usable stuff from BRMS to compiler

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/SuggestionCompletionEngine.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/SuggestionCompletionEngine.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/SuggestionCompletionEngine.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,229 @@
+package org.drools.brms.client.modeldriven;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.drools.brms.client.modeldriven.brxml.DSLSentence;
+import org.drools.brms.client.modeldriven.brxml.PortableObject;
+
+/**
+ * An suggestion completion processor. This should be usable in both GWT/Web and the IDE.
+ * The data for this can be loaded into this from simple string lists.
+ *  
+ * @author Michael Neale
+ */
+public class SuggestionCompletionEngine implements PortableObject {
+
+    /** These are the explicit types supported */
+    public static final String TYPE_COLLECTION = "Collection";
+    public static final String TYPE_COMPARABLE = "Comparable";
+    public static final String TYPE_STRING = "String";
+    public static final String TYPE_NUMERIC = "Numeric";
+    
+    /**
+     * The operators that are used at different times (based on type).
+     */
+    private static final String[] STANDARD_CONNECTIVES = new String[] { "| ==", "| !=", "& !="};
+    private static final String[] STRING_CONNECTIVES = new String[] { "| ==", "| !=", "& !=", "& matches", "| matches"};
+    private static final String[] COMPARABLE_CONNECTIVES = new String[] {"| ==", "| !=", "& !=", "& >", "& <", "| >", "| <", "& >=", "& <=", "| <=", "| >="};
+    private static final String[] COLLECTION_CONNECTIVES = new String[] {"| ==", "| !=", "& !=", "| contains", "& contains", "| excludes", "& excludes"};
+    
+    private static final String[] STANDARD_OPERATORS = new String[] { "==", "!=" };
+    private static final String[] COMPARABLE_OPERATORS = new String[] { "==", "!=", "<", ">", "<=", ">="};
+    private static final String[] STRING_OPERATORS = new String[] {"==", "!=", "matches"};
+    private static final String[] COLLECTION_OPERATORS = new String[] {"contains", "excludes", "==", "!="};
+        
+    /** The top level conditional elements (first order logic) */
+    private static final String[] CONDITIONAL_ELEMENTS = new String[] {"not", "exists", "or"};
+    
+    
+    /** 
+     * A list of fact types (never fully qualified).
+     */
+    public String[] factTypes;
+    
+    /**
+     * A map of types to the fields. key is type, value is (String[] of fields)
+     * 
+     * @gwt.typeArgs <java.lang.String, java.lang.String[]>
+     */
+    public Map fieldsForType;
+    
+    /**
+     * A map of the Fields to their types, needed for operator completions,
+     * as well as other things like rendering strings, dates etc.
+     * This is in the format of: { 'Type.field' => 'typename' }.
+     * Should not be the exact type, perhaps just a high level interface, eg "Comparable".
+     * 
+     * @gwt.typeArgs <java.lang.String, java.lang.String>
+     */
+    public Map fieldTypes;
+    
+    
+    
+    
+    /**
+     * Contains a map of globals (name is key) and their type (value).
+     * @gwt.typeArgs <java.lang.String, java.lang.String>
+     */
+    public Map globalTypes = new HashMap();
+    
+    
+    /** Operators (from the grammar):
+     *      op=(    '=='
+        |   '>'
+        |   '>='
+        |   '<'
+        |   '<='
+        |   '!='
+        |   'contains'
+        |   'matches'
+        |       'excludes'
+        )
+     * Connectives add "&" and "|" to this.
+     */
+    
+
+    
+
+
+    /**
+     * DSL language extensions, if needed, if provided by the package.
+     */
+    public DSLSentence[] conditionDSLSentences = new DSLSentence[0];
+    public DSLSentence[] actionDSLSentences = new DSLSentence[0];
+    
+    
+//    /**
+//     * For bulk loading up the data (from a previous rule save)
+//     * 
+//     * @param factToFields A map of "FactType" (key - String) to String[] (value) 
+//     * @param factFieldToOperator A map of "FactType.field" (key - String) to String[] operators
+//     * @param factFieldToConnectiveOperator A map of "FactType.field" (key -String) to String[] operators 
+//     *                                  that are valid CONNECTIVE operators.
+//     *                                  
+//     * @param globals A map of global variable name to its fields (String[]).
+//     * @param boundFacts A map of bound facts to types.
+//     * @param conditionDSLs a list of DSLSentence suggestions for the LHS
+//     * @param actionDSLs a list of DSLSentence suggestions for the RHS                          
+//     *                                       
+//     */
+//    public void load( 
+//                      Map factToFields, 
+//                      Map factFieldToOperator, 
+//                      Map factFieldToConnectiveOperator,
+//                      Map globals,                      
+//                      List conditionDSLs,
+//                      List actionDSLs
+//                    ) {
+//        this.factToFields = factToFields;
+//        this.factFieldToOperator = factFieldToOperator;
+//        this.factFieldToConnectiveOperator = factFieldToConnectiveOperator;
+//        this.actionDSLSentences = actionDSLs;
+//        this.conditionDSLSentences = conditionDSLs;
+//        this.globals = globals;
+//
+//    }
+    
+    public SuggestionCompletionEngine() {  
+
+        
+        
+    }
+
+    
+    
+
+    public String[] getConditionalElements() {       
+        return CONDITIONAL_ELEMENTS;
+    }
+    
+    public DSLSentence[] getDSLConditions() {
+        return conditionDSLSentences;
+    }
+    
+    public DSLSentence[] getDSLActions() {
+        return actionDSLSentences;
+    }
+
+    public String[] getConnectiveOperatorCompletions(String factType,
+                                                     String fieldName) {
+        String type = (String) this.fieldTypes.get( factType + "." + fieldName );
+        if (type == null) {
+          return STANDARD_CONNECTIVES;  
+        } else if (type.equals( TYPE_STRING )) {
+          return STRING_CONNECTIVES;  
+        } else if (type.equals( TYPE_COMPARABLE ) || type.equals( TYPE_NUMERIC )) {
+          return COMPARABLE_CONNECTIVES;
+        } else if (type.equals( TYPE_COLLECTION )){
+            return COLLECTION_CONNECTIVES;
+        } else {
+            return STANDARD_CONNECTIVES;
+        }
+        
+    }
+
+
+
+    public String[] getFactTypes() {
+        return this.factTypes;
+    }
+
+    public String[] getFieldCompletions(String factType) {
+       return (String[]) this.fieldsForType.get( factType );
+        
+    }
+
+    public String[] getOperatorCompletions(String factType,
+                                           String fieldName) {
+        String type = (String) this.fieldTypes.get( factType + "." + fieldName );
+        if (type == null) {
+            return STANDARD_OPERATORS;
+        } else if (type.equals( TYPE_STRING )) {
+            return STRING_OPERATORS;
+        } else if (type.equals( TYPE_COMPARABLE ) || type.equals( TYPE_NUMERIC )) {
+            return COMPARABLE_OPERATORS;
+        } else if (type.equals( TYPE_COLLECTION )) {
+            return COLLECTION_OPERATORS;
+        } else {            
+            return STANDARD_OPERATORS;
+        }
+                
+    }
+    
+    public String getFieldType( String factType,
+                                String fieldName ) {
+        return (String) this.fieldTypes.get( factType + "." + fieldName );
+    }
+    
+    public boolean isGlobalVariable(String variable) {
+        return this.globalTypes.containsKey( variable );
+    }
+    
+    public String[] getFieldCompletionsForGlobalVariable(String varName) {
+        String type = (String) this.globalTypes.get( varName );        
+        return (String[]) this.fieldsForType.get( type );
+    }
+
+
+    private String[] toStringArray(Set set) {
+        String[] f = new String[set.size()];
+        int i = 0;
+        for ( Iterator iter = set.iterator(); iter.hasNext(); ) {
+            f[i] = (String) iter.next();
+            i++;
+        }
+        return f;                
+    }
+
+    public String[] getGlobalVariables() {         
+        return toStringArray( this.globalTypes.keySet() );
+    }
+
+
+    
+
+    
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/SuggestionCompletionEngine.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionAssertFact.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionAssertFact.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionAssertFact.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,28 @@
+package org.drools.brms.client.modeldriven.brxml;
+
+/**
+ * This is used when asserting a new fact.
+ * @author Michael Neale
+ *
+ */
+public class ActionAssertFact
+    extends
+    ActionFieldList {
+
+    /**
+     * This is used mainly for display purposes. 
+     */
+    public String getType() {
+        return "assert";
+    }
+    
+    public String factType;
+    
+    public ActionAssertFact(String type) {
+        this.factType = type;
+    }
+    
+    public ActionAssertFact() {}
+    
+
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionAssertFact.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionAssertLogicalFact.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionAssertLogicalFact.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionAssertLogicalFact.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,25 @@
+package org.drools.brms.client.modeldriven.brxml;
+
+/**
+ * Logical assertions are used as part of "truth maintenance". 
+ * 
+ * @author Michael Neale
+ */
+public class ActionAssertLogicalFact extends ActionAssertFact {
+
+    public ActionAssertLogicalFact(String fact) {
+        super(fact);
+    }
+    
+    public ActionAssertLogicalFact() {
+        super();
+    }
+
+    /**
+     * This is used mainly for display purposes. 
+     */    
+    public String getType() {
+        return "assertLogical";
+    }
+    
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionAssertLogicalFact.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionFieldList.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionFieldList.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionFieldList.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,48 @@
+package org.drools.brms.client.modeldriven.brxml;
+
+/**
+ * This class is the parent for field setting or assertion actions.
+ * 
+ * Contains the list of fields and their values to be set.
+ * 
+ * @author Michael Neale
+ *
+ */
+public abstract class ActionFieldList
+    implements
+    IAction {
+
+    public ActionFieldValue[] fieldValues = new ActionFieldValue[0];
+
+    public void removeField(int idx) {
+        //Unfortunately, this is kinda duplicate code with other methods, 
+        //but with typed arrays, and GWT, its not really possible to do anything "better" 
+        //at this point in time. 
+        ActionFieldValue[] newList = new ActionFieldValue[fieldValues.length - 1];
+        int newIdx = 0;
+        for ( int i = 0; i < fieldValues.length; i++ ) {
+            
+            if (i != idx) {
+                newList[newIdx] = fieldValues[i];
+                newIdx++;
+            }
+            
+        }
+        this.fieldValues = newList;        
+    }
+    
+    public void addFieldValue(ActionFieldValue val) {
+        if (fieldValues == null) {
+            fieldValues = new ActionFieldValue[1];            
+            fieldValues[0] = val;            
+        } else {
+            ActionFieldValue[] newList = new ActionFieldValue[fieldValues.length + 1];
+            for ( int i = 0; i < fieldValues.length; i++ ) {            
+                newList[i] = fieldValues[i];
+            }
+            newList[fieldValues.length] = val;
+            fieldValues = newList;
+        }        
+    }    
+    
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionFieldList.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionFieldValue.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionFieldValue.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionFieldValue.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,40 @@
+package org.drools.brms.client.modeldriven.brxml;
+
+
+/**
+ * Holds field and value for "action" parts of the rule.
+ * 
+ * @author Michael Neale
+ */
+public class ActionFieldValue
+    implements
+    PortableObject {
+
+    public ActionFieldValue(String field, String value) {
+        this.field = field;
+        this.value = value;
+    }
+    
+    public ActionFieldValue() {}
+    
+    public String field;
+    public String value;
+    
+    /**
+     * This will return true if the value is really a "formula" - in 
+     * the sense of like an excel spreadsheet.
+     * 
+     *  If it IS a formula, then the value should never be turned into a 
+     *  string, always left as-is.
+     * 
+     */
+    public boolean isFormula() {
+        if (value == null) return false;
+        if (value.trim().startsWith( "=" )) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+    
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionFieldValue.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionModifyField.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionModifyField.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionModifyField.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,27 @@
+package org.drools.brms.client.modeldriven.brxml;
+
+/**
+ * Basically the same as setting fields, EXCEPT that
+ * it will notify the engine of the changes.
+ * This only applies to bound fact variables from the LHS.
+ * 
+ * @author Michael Neale
+ */
+public class ActionModifyField extends ActionSetField {
+
+    public ActionModifyField(String itemText) {
+        super(itemText);        
+    }
+    
+    public ActionModifyField() {
+        super();
+    }
+
+    /**
+     * This is used mainly for display purposes. 
+     */    
+    public String getType() {
+        return "modify";
+    }    
+    
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionModifyField.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionRetractFact.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionRetractFact.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionRetractFact.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,21 @@
+package org.drools.brms.client.modeldriven.brxml;
+
+/**
+ * This is used to specify that the bound fact should be retracted
+ * when the rule fires.
+ * @author Michael Neale
+ *
+ */
+public class ActionRetractFact
+    implements
+    IAction {
+    
+    public ActionRetractFact() {}
+    
+    public ActionRetractFact(String var) {
+        this.variableName = var;
+    }
+    
+    public String variableName;
+
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionRetractFact.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionSetField.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionSetField.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionSetField.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,30 @@
+package org.drools.brms.client.modeldriven.brxml;
+
+/**
+ * For setting a field on a bound LHS variable or a global.
+ * If setting a field on a fact bound variable, this will 
+ * NOT notify the engine of any changes (unless done outside of the engine).
+ * 
+ * @author Michael Neale
+ */
+public class ActionSetField extends ActionFieldList {
+
+    
+    public ActionSetField(String var) {
+        this.variable = var;
+    }
+    
+    /**
+     * This is used mainly for display purposes. 
+     */    
+    public String getType() {
+        return "set";
+    }
+    
+    public ActionSetField() {}
+    public String variable;
+
+     
+ 
+    
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ActionSetField.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/CompositeFactPattern.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/CompositeFactPattern.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/CompositeFactPattern.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +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 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 CompositeFactPattern(String type) {
+        this.type = type;
+    }
+
+    public CompositeFactPattern() {
+    }
+
+    public void addFactPattern(FactPattern pat) {
+        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[list.length] = pat;
+
+        this.patterns = newList;
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/CompositeFactPattern.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ConnectiveConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ConnectiveConstraint.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ConnectiveConstraint.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,28 @@
+package org.drools.brms.client.modeldriven.brxml;
+
+
+/**
+ * This is for a connective constraint that adds more options to a field constraint. 
+ * @author Michael Neale
+ */
+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() {}
+    
+    public ConnectiveConstraint(String opr,
+                                String val) {
+        this.operator = opr;
+        this.value = val;
+    }
+    public int connectiveType;
+    public String operator;
+    public String value;
+    public int constraintType;
+    
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/ConnectiveConstraint.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/Constraint.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/Constraint.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/Constraint.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,72 @@
+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 {
+    
+
+    /**
+     * This may be string, or number, anything really. 
+     */
+    public static final int    TYPE_LITERAL   = 1;
+    
+    /**
+     * This is when it is set to a valid previously bound variable.
+     */
+    public static final int    TYPE_VARIABLE  = 2;
+    
+    /**
+     * This is for a "formula" that calculates a value.
+     */
+    public static final int    TYPE_RET_VALUE = 3;
+    
+    /**
+     * This is not used yet. ENUMs are not suitable for business rules
+     * until we can get data driven non code enums.
+     */
+    public static final int    TYPE_ENUM      = 4;
+    
+    /**
+     * The fieldName and fieldBinding is not used in the case of a predicate. 
+     */
+    public static final int    TYPE_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() {
+    }
+
+    /**
+     * This adds a new connective.
+     *
+     */
+    public void addNewConnective() {
+        if ( connectives == null ) {
+            connectives = new ConnectiveConstraint[]{new ConnectiveConstraint()};
+        } else {
+            ConnectiveConstraint[] newList = new ConnectiveConstraint[connectives.length + 1];
+            for ( int i = 0; i < connectives.length; i++ ) {
+                newList[i] = connectives[i];
+            }
+            newList[connectives.length] = new ConnectiveConstraint();
+            connectives = newList;
+        }
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/Constraint.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/DSLSentence.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/DSLSentence.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/DSLSentence.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,35 @@
+package org.drools.brms.client.modeldriven.brxml;
+
+
+/**
+ * This represents a DSL sentence.
+ * @author Michael Neale
+ */
+public class DSLSentence
+    implements
+    IPattern,
+    IAction {
+
+    public String sentence;
+    
+    /**
+     * This will strip off any residual "{" stuff...
+     */
+    public String toString() {
+        char[] chars = sentence.toCharArray();
+        String result = "";
+        for ( int i = 0; i < chars.length; i++ ) {
+            char c = chars[i];
+            if (c != '{' && c != '}') {
+                result += c;
+            }
+        }
+        return result;
+    }
+    
+    public DSLSentence copy() {
+        DSLSentence newOne = new DSLSentence();
+        newOne.sentence = this.sentence;
+        return newOne;
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/DSLSentence.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/FactPattern.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/FactPattern.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/FactPattern.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,63 @@
+package org.drools.brms.client.modeldriven.brxml;
+
+/**
+ * A fact pattern is a declaration of a fact type, and its constraint,
+ * and perhaps a variable that is it bound to
+ * It is the equivalent of a "column" in drools terms. 
+ * @author Michael Neale
+ *
+ */
+public class FactPattern implements IPattern {
+
+    public Constraint[] constraints;
+    public String factType;
+    public String boundName;
+    
+    public FactPattern() {
+        this.constraints = new Constraint[0];
+    }
+    
+    public FactPattern(String factType) {
+        this.factType = factType;
+        this.constraints = new Constraint[0];
+    }
+    
+
+    
+    
+    public void addConstraint(Constraint constraint) {
+        if (constraints == null) {
+            constraints = new Constraint[1];            
+            constraints[0] = constraint;            
+        } else {
+            Constraint[] newList = new Constraint[constraints.length + 1];
+            for ( int i = 0; i < constraints.length; i++ ) {            
+                newList[i] = constraints[i];
+            }
+            newList[constraints.length] = constraint;
+            constraints = newList;
+        }
+    }
+
+    public void removeConstraint(int idx) {
+        //Unfortunately, this is kinda duplicate code with other methods, 
+        //but with typed arrays, and GWT, its not really possible to do anything "better" 
+        //at this point in time. 
+        Constraint[] newList = new Constraint[constraints.length - 1];
+        int newIdx = 0;
+        for ( int i = 0; i < constraints.length; i++ ) {
+            
+            if (i != idx) {
+                newList[newIdx] = constraints[i];
+                newIdx++;
+            }
+            
+        }
+        this.constraints = newList;        
+        
+    }
+    
+    
+    
+    
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/FactPattern.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/IAction.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/IAction.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/IAction.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,6 @@
+package org.drools.brms.client.modeldriven.brxml;
+
+
+public interface IAction extends PortableObject {
+    
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/IAction.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/IPattern.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/IPattern.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/IPattern.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,8 @@
+package org.drools.brms.client.modeldriven.brxml;
+
+
+public interface IPattern
+    extends
+    PortableObject {
+
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/IPattern.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/PortableObject.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/PortableObject.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/PortableObject.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,12 @@
+package org.drools.brms.client.modeldriven.brxml;
+
+/**
+ * This is the marker interface for portable Ajaxy type objects.
+ * This is replaced in the BRMS with a GWT specific one, and only used here so the RuleModel
+ * can compile. It does nothing, and is strictly a marker interface only. 
+ * @author Michael Neale
+ *
+ */
+public interface PortableObject {
+
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/PortableObject.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/RuleAttribute.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/RuleAttribute.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/RuleAttribute.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,22 @@
+package org.drools.brms.client.modeldriven.brxml;
+
+
+/**
+ * This holds values for rule attributes (eg salience, agenda-group etc).
+ * @author Michael Neale
+ */
+public class RuleAttribute
+    implements
+    PortableObject {
+    
+    public RuleAttribute(String name,
+                         String value) {
+        this.attributeName = name;
+        this.value = value;
+    }
+    public String attributeName;
+    public String value;
+
+    public RuleAttribute() {}
+    
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/RuleAttribute.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/RuleModel.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/RuleModel.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/RuleModel.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,176 @@
+package org.drools.brms.client.modeldriven.brxml;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RuleModel implements PortableObject {
+
+    public String name;
+    public String modelVersion = "1.0";
+    
+    public RuleAttribute[] attributes = new RuleAttribute[0];
+    
+    public IPattern[] lhs = new IPattern[0];
+    public IAction[] rhs = new IAction[0];
+    
+    /**
+     * This will return the fact pattern that a variable is bound to. 
+     * 
+     * @param var The bound fact variable (NOT bound field).
+     * @return null or the FactPattern found. 
+     */
+    public FactPattern getBoundFact(String var) {
+        if (lhs == null ) return null;
+        for ( int i = 0; i < lhs.length; i++ ) {
+            
+            if (lhs[i] instanceof FactPattern) {
+                FactPattern p = (FactPattern) lhs[i];
+                if (p.boundName != null && var.equals( p.boundName)) {
+                    return p;
+                }
+            }
+        }
+        return null;
+    }
+    
+    /**
+     * @return A list of bound facts (String). Or empty list if none are found.
+     */
+    public List getBoundFacts() {
+        if (lhs == null) return null;
+        List list = new ArrayList();
+        for ( int i = 0; i < lhs.length; i++ ) {
+            if (lhs[i] instanceof FactPattern) {
+                FactPattern p = (FactPattern) lhs[i];
+                if (p.boundName != null)  list.add( p.boundName );
+            }
+        }
+        return list;
+        
+    }
+
+    /**
+     * 
+     * @param idx Remove this index from the LHS.
+     * @param Returns false if it was NOT allowed to remove this item (ie 
+     * it is used on the RHS).
+     */
+    public boolean removeLhsItem(int idx) {
+        
+        IPattern[] newList = new IPattern[lhs.length - 1];
+        int newIdx = 0;
+        for ( int i = 0; i < lhs.length; i++ ) {
+            
+            if (i != idx) {
+                newList[newIdx] = lhs[i];
+                newIdx++;
+            } else {
+                if (lhs[i] instanceof FactPattern) {
+                    FactPattern p = (FactPattern) lhs[i];
+                    if (p.boundName != null && isBoundFactUsed( p.boundName )) {
+                        return false;
+                    }
+                }
+                
+            }
+            
+        }
+        this.lhs = newList;
+        return true;
+    }
+
+    /**
+     * @param binding The name of the LHS fact binding.
+     * @return Returns true if the specified binding is used on the RHS.
+     */
+    public boolean isBoundFactUsed(String binding) {
+        if (rhs == null) return false;
+        for ( int i = 0; i < rhs.length; i++ ) {
+            if (rhs[i] instanceof ActionSetField) {
+                ActionSetField set = (ActionSetField) rhs[i];
+                if (set.variable.equals( binding )) {
+                    return true;
+                }
+            } else if (rhs[i] instanceof ActionRetractFact) {
+                ActionRetractFact ret = (ActionRetractFact) rhs[i];
+                if (ret.variableName.equals( binding )) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+    
+    public void addLhsItem(IPattern pat) {
+        if (this.lhs == null) this.lhs = new IPattern[0];
+        
+        IPattern[] list = this.lhs;
+        IPattern[] newList = new IPattern[list.length + 1];
+        
+        for ( int i = 0; i < list.length; i++ ) {
+            newList[i] =  list[i];
+        }
+        newList[list.length] = pat; 
+        
+        this.lhs = newList;        
+    }
+    
+    public void addRhsItem(IAction action) {
+        if (this.rhs == null) this.rhs = new IAction[0];
+        
+        IAction[] list = this.rhs;
+        IAction[] newList = new IAction[list.length + 1];
+        
+        for ( int i = 0; i < list.length; i++ ) {
+            newList[i] =  list[i];
+        }
+        newList[list.length] = action; 
+        
+        this.rhs = newList;         
+    }
+    
+    public void removeRhsItem(int idx) {
+        IAction[] newList = new IAction[rhs.length - 1];
+        int newIdx = 0;
+        for ( int i = 0; i < rhs.length; i++ ) {
+            
+            if (i != idx) {
+                newList[newIdx] = rhs[i];
+                newIdx++;
+            }
+            
+        }
+        this.rhs = newList;
+    }
+
+    public void addAttribute(RuleAttribute attribute) {
+        
+        
+        RuleAttribute[] list = this.attributes;
+        RuleAttribute[] newList = new RuleAttribute[list.length + 1];
+        
+        for ( int i = 0; i < list.length; i++ ) {
+            newList[i] =  list[i];
+        }
+        newList[list.length] = attribute; 
+        
+        this.attributes = newList;        
+        
+    }
+    
+    public void removeAttribute(int idx) {
+        RuleAttribute[] newList = new RuleAttribute[attributes.length - 1];
+        int newIdx = 0;
+        for ( int i = 0; i < attributes.length; i++ ) {
+            
+            if (i != idx) {
+                newList[newIdx] = attributes[i];
+                newIdx++;
+            }
+            
+        }
+        this.attributes = newList;
+
+    }
+    
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/RuleModel.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/package.html
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/package.html	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/package.html	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,9 @@
+<body>
+	This package holds classes that are used as RPC classes for the rule modeller, 
+	as well as the DOM for the BRXML rule format that the rule modeller uses.
+	
+	IMPORTANT:
+	Do not change these unless you are adding fields or removing fields, not refactoring
+	fields. Especially if there is existing data. XSLT may need to be used to massage
+	the existing XML to suit the new structure.
+</body>
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/modeldriven/brxml/package.html
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/package.html
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/package.html	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/package.html	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,5 @@
+<body>
+This package and subpackages are for items pertinent to the BRMS, that are kept in this module for re-usability.
+Items in this package and subpackage must be compilable via GWT to Javascript, which means a subset of java. 
+Generally, you won't need to look in this package.
+</body>
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/client/package.html
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/converter/BRXMLToDescrConverter.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/converter/BRXMLToDescrConverter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/converter/BRXMLToDescrConverter.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -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.TYPE_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.TYPE_LITERAL :
+                LiteralRestrictionDescr lit = new LiteralRestrictionDescr( operator,
+                                                                           value );
+                return lit;
+            case Constraint.TYPE_VARIABLE :
+                VariableRestrictionDescr var = new VariableRestrictionDescr( operator,
+                                                                             value );
+                return var;
+            case Constraint.TYPE_ENUM :
+                LiteralRestrictionDescr enu = new LiteralRestrictionDescr( operator,
+                                                                           value,
+                                                                           true );
+                return enu;
+            case Constraint.TYPE_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-compiler/src/main/java/org/drools/brms/server/converter/BRXMLToDescrConverter.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/package.html
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/package.html	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/package.html	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,3 @@
+<body>
+	This package has some server utilities that are used by the BRMS and IDE.
+</body>
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/package.html
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/rules/SuggestionCompletionLoader.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/rules/SuggestionCompletionLoader.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/rules/SuggestionCompletionLoader.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,367 @@
+package org.drools.brms.server.rules;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.jar.JarEntry;
+import java.util.jar.JarInputStream;
+
+import org.codehaus.jfdi.interpreter.ClassTypeResolver;
+import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+import org.drools.brms.server.util.SuggestionCompletionEngineBuilder;
+import org.drools.compiler.DrlParser;
+import org.drools.compiler.DroolsParserException;
+import org.drools.compiler.ParserError;
+import org.drools.lang.descr.FactTemplateDescr;
+import org.drools.lang.descr.FieldTemplateDescr;
+import org.drools.lang.descr.GlobalDescr;
+import org.drools.lang.descr.ImportDescr;
+import org.drools.lang.descr.PackageDescr;
+import org.drools.lang.dsl.DSLMapping;
+import org.drools.lang.dsl.DSLMappingEntry;
+import org.drools.lang.dsl.DSLMappingFile;
+import org.drools.resource.util.ByteArrayClassLoader;
+import org.drools.util.asm.ClassFieldInspector;
+
+/**
+ * This utility class loads suggestion completion stuff for the package configuration, 
+ * introspecting from models, templates etc. 
+ * 
+ * This also includes DSL stuff, basically, everything you need to get started with a package.
+ * It also validates the package configuration, and can provide errors.
+ * 
+ * This does NOT validate assets in the package, other then to load up DSLs, models etc
+ * as needed.
+ * 
+ * FYI: the tests for this are in the BRMS module, in context of a full BRMS.
+ * 
+ * @author Michael Neale
+ *
+ */
+public class SuggestionCompletionLoader {
+
+    private SuggestionCompletionEngineBuilder builder = new SuggestionCompletionEngineBuilder();
+    private DrlParser                         parser  = new DrlParser();
+    private final ByteArrayClassLoader        loader;
+    protected List errors;
+
+    public SuggestionCompletionLoader() {
+        loader = new ByteArrayClassLoader( this.getClass().getClassLoader() );
+    }
+
+    /**
+     * This will validate, and generate a new engine, ready to go.
+     * If there are errors, you can get them by doing getErrors();
+     * @param pkg
+     * @return
+     */
+    public SuggestionCompletionEngine getSuggestionEngine(String header, List<JarInputStream> jars, List<DSLMappingFile> dsls) {
+        errors = new ArrayList();
+        builder.newCompletionEngine();
+
+        
+
+        if (!header.trim().equals( "" )) {
+            processPackageHeader( header, jars );
+        }
+
+        // populating DSL sentences
+        this.populateDSLSentences( dsls );
+        
+        return builder.getInstance();
+    }
+
+    private void processPackageHeader(String header, List<JarInputStream> jars) {
+        // get fact types from imports
+        PackageDescr pkgDescr;
+        try {
+            pkgDescr = parser.parse( header );
+        } catch ( DroolsParserException e1 ) {
+            throw new IllegalStateException( "Serious error, unable to validate package.", e1 );
+        }
+   
+        if (this.parser.hasErrors()) {
+            for ( Iterator iter = this.parser.getErrors().iterator(); iter.hasNext(); ) {
+                ParserError element = (ParserError) iter.next();
+                errors.add( element.getMessage() );
+            }            
+        }
+        // populating information for the model itself
+        this.populateModelInfo( pkgDescr, jars );
+   
+        // populating globals
+        this.populateGlobalInfo( pkgDescr, jars );
+   
+
+    }
+
+    /**
+     * @param pkg
+     * @param errors
+     */
+    private void populateDSLSentences(List<DSLMappingFile> dsls) {
+//        AssetItemIterator it = pkg.listAssetsByFormat( new String[]{AssetFormats.DSL} );
+//        while ( it.hasNext() ) {
+//            AssetItem item = (AssetItem) it.next();
+//            String dslData = item.getContent();
+//            DSLMappingFile file = new DSLMappingFile();
+//            try {
+//                if ( file.parseAndLoad( new StringReader( dslData ) ) ) {
+//                    DSLMapping mapping = file.getMapping();
+//                    for ( Iterator entries = mapping.getEntries().iterator(); entries.hasNext(); ) {
+//                        DSLMappingEntry entry = (DSLMappingEntry) entries.next();
+//                        if (entry.getSection() == DSLMappingEntry.CONDITION) {
+//                            builder.addDSLConditionSentence( entry.getMappingKey() );
+//                        } else if (entry.getSection() == DSLMappingEntry.CONSEQUENCE) {
+//                            builder.addDSLActionSentence( entry.getMappingKey() );
+//                        }
+//                        
+//                    }
+//                } else {
+//                    errors.add( file.getErrors().toString() );
+//                }
+//            } catch ( IOException e ) {
+//                errors.add( "Error while loading DSL language configuration : " + item.getBinaryContentAttachmentFileName() + " error message: " + e.getMessage() );
+//            }
+//        }
+
+        for ( DSLMappingFile file : dsls ) {
+            DSLMapping mapping = file.getMapping();
+            for ( Iterator entries = mapping.getEntries().iterator(); entries.hasNext(); ) {
+                DSLMappingEntry entry = (DSLMappingEntry) entries.next();
+                if (entry.getSection() == DSLMappingEntry.CONDITION) {
+                    builder.addDSLConditionSentence( entry.getMappingKey() );
+                } else if (entry.getSection() == DSLMappingEntry.CONSEQUENCE) {
+                    builder.addDSLActionSentence( entry.getMappingKey() );
+                }
+            }
+        }
+     
+        
+    }
+
+    /**
+     * Populate the global stuff.
+     */
+    private void populateGlobalInfo(PackageDescr pkgDescr,
+                                    List<JarInputStream> jars) {
+
+        // populating information for the globals
+        for ( Iterator it = pkgDescr.getGlobals().iterator(); it.hasNext(); ) {
+            GlobalDescr global = (GlobalDescr) it.next();
+            try {
+                String shortTypeName = global.getType();
+                if ( !this.builder.hasFieldsForType( shortTypeName ) ) {
+                    Class clazz = loadClass( 
+                                             global.getType(), jars );
+                    loadClassFields( clazz,
+                                     shortTypeName );
+
+                    this.builder.addGlobalType( global.getIdentifier(),
+                                                shortTypeName );
+                }
+
+                builder.addGlobalType( global.getIdentifier(),
+                                       shortTypeName );
+            } catch ( IOException e ) {
+                errors.add( "Error while inspecting class for global: " + global.getType() + " error message: " + e.getMessage());
+            }
+
+        }
+    }
+
+    /**
+     * Populate the fact type data.
+     */
+    private void populateModelInfo(PackageDescr pkgDescr, List<JarInputStream> jars) {
+
+        // iterating over the import list
+        ClassTypeResolver resolver = new ClassTypeResolver();
+        for ( Iterator it = pkgDescr.getImports().iterator(); it.hasNext(); ) {
+            ImportDescr imp = (ImportDescr) it.next();
+            String classname = imp.getTarget();
+            resolver.addImport( classname );
+
+            Class clazz = loadClass(  classname, jars );
+            if ( clazz != null ) {
+                try {
+                    String shortTypeName = getShortNameOfClass( clazz.getName() );
+                    loadClassFields( clazz,
+                                     shortTypeName );
+                    builder.addFactType( shortTypeName );
+                } catch ( IOException e ) {
+                    errors.add( "Error while inspecting the class: " + classname + ". The error was: " + e.getMessage() );
+                }
+            }
+        }
+
+        // iterating over templates
+        populateFactTemplateTypes( pkgDescr,
+                                   resolver );
+    }
+
+    /**
+     * Iterates over fact templates and add them to the model definition
+     * 
+     * @param pkgDescr
+     */
+    private void populateFactTemplateTypes(PackageDescr pkgDescr,
+                                           ClassTypeResolver resolver) {
+        for ( Iterator it = pkgDescr.getFactTemplates().iterator(); it.hasNext(); ) {
+            FactTemplateDescr templ = (FactTemplateDescr) it.next();
+            String factType = templ.getName();
+            builder.addFactType( factType );
+
+            String[] fields = new String[templ.getFields().size()];
+            builder.addFieldsForType( factType,
+                                      fields );
+
+            int index = 0;
+            for ( Iterator fieldsIt = templ.getFields().iterator(); fieldsIt.hasNext(); ) {
+                FieldTemplateDescr fieldDescr = (FieldTemplateDescr) fieldsIt.next();
+                fields[index++] = fieldDescr.getName();
+                String fieldType = fieldDescr.getClassType();
+
+                Class fieldTypeClass = null;
+                try {
+                    fieldTypeClass = resolver.resolveType( fieldType );
+                } catch ( ClassNotFoundException e ) {
+                    errors.add( "Fact template field type not found: " + fieldType );
+                }
+                builder.addFieldType( factType + "." + fieldDescr.getName(),
+                                      getFieldType( fieldTypeClass ) );
+            }
+        }
+    }
+
+    private void loadClassFields(Class clazz,
+                                 String shortTypeName) throws IOException {
+        if (clazz == null) return;
+        ClassFieldInspector inspector = new ClassFieldInspector( clazz );
+        String[] fields = (String[]) inspector.getFieldNames().keySet().toArray( new String[inspector.getFieldNames().size()] );
+
+        fields = removeIrrelevantFields( fields );
+
+        builder.addFieldsForType( shortTypeName,
+                                  fields );
+        for ( int i = 0; i < fields.length; i++ ) {
+            Class type = (Class) inspector.getFieldTypes().get( fields[i] );
+            String fieldType = getFieldType( type );
+            builder.addFieldType( shortTypeName + "." + fields[i],
+                                  fieldType );
+        }
+    }
+
+    String getShortNameOfClass(String clazz) {
+        return clazz.substring( clazz.lastIndexOf( '.' ) + 1 );
+    }
+
+    /**
+     * This will remove the unneeded "fields" that come from java.lang.Object
+     * these are really not needed for the modeller.
+     */
+    String[] removeIrrelevantFields(String[] fields) {
+        List result = new ArrayList();
+        for ( int i = 0; i < fields.length; i++ ) {
+            String field = fields[i];
+            if ( field.equals( "class" ) || field.equals( "hashCode" ) || field.equals( "toString" ) ) {
+                //ignore
+            } else {
+                result.add( field );
+            }
+        }
+        return (String[]) result.toArray( new String[result.size()] );
+    }
+
+    /**
+     * @param pkg
+     * @param classname
+     * @param clazz
+     * @return
+     */
+    private Class loadClass(String classname, List<JarInputStream> jars) {
+        Class clazz = null;
+        try {
+            // check if it is already in the classpath
+            clazz = loader.loadClass( classname );
+
+        } catch ( ClassNotFoundException e1 ) {
+
+            // not found in the classpath, so check if it
+            // is in a package model
+            try {
+                addJars( jars );
+                clazz = loader.loadClass( classname );
+            } catch ( IOException e ) {
+                throw new IllegalStateException( e );
+            } catch ( ClassNotFoundException e ) {
+                errors.add( "Class not found: " + classname );
+            }
+        }
+        return clazz;
+    }
+    
+    /**
+     * This will add the given jars to the classloader.
+     */
+    private void addJars(List<JarInputStream> jars) throws IOException {
+        for ( JarInputStream jis : jars ) {
+            JarEntry entry = null;
+            byte[] buf = new byte[1024];
+            int len = 0;
+            while ( (entry = jis.getNextJarEntry()) != null ) {
+                if ( !entry.isDirectory() ) {
+                    ByteArrayOutputStream out = new ByteArrayOutputStream();
+                    while ( (len = jis.read( buf )) >= 0 ) {
+                        out.write( buf, 0, len );
+                    }
+                    loader.addResource( entry.getName(),
+                                        out.toByteArray() );
+                }
+            }        
+            
+        }
+    }
+
+    /**
+     * @param inspector
+     * @param fields
+     * @param i
+     * @return
+     */
+    private String getFieldType(Class type) {
+        String fieldType = null; // if null, will use standard operators
+        if ( type != null ) {
+            if ( type.isPrimitive() && (type != boolean.class) ) {
+                fieldType = SuggestionCompletionEngine.TYPE_NUMERIC;
+            } else if ( Number.class.isAssignableFrom( type ) ) {
+                fieldType = SuggestionCompletionEngine.TYPE_NUMERIC;
+            } else if ( String.class.isAssignableFrom( type ) ) {
+                fieldType = SuggestionCompletionEngine.TYPE_STRING;
+            } else if ( Collection.class.isAssignableFrom( type ) ) {
+                fieldType = SuggestionCompletionEngine.TYPE_COLLECTION;
+            } else if ( Comparable.class.isAssignableFrom( type ) ) {
+                fieldType = SuggestionCompletionEngine.TYPE_COMPARABLE;
+            } 
+        }
+        return fieldType;
+    }
+    
+    /**
+     * @return true if there were errors when processing the package.
+     */
+    public boolean hasErrors() {
+        return (this.errors.size() > 0);
+    }
+    
+    /**
+     * Returns a list of String errors.
+     */
+    public List getErrors() {
+        return this.errors;
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/rules/SuggestionCompletionLoader.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/util/BRLPersistence.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/util/BRLPersistence.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/util/BRLPersistence.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,68 @@
+package org.drools.brms.server.util;
+
+import org.drools.brms.client.modeldriven.brxml.ActionAssertFact;
+import org.drools.brms.client.modeldriven.brxml.ActionAssertLogicalFact;
+import org.drools.brms.client.modeldriven.brxml.ActionFieldValue;
+import org.drools.brms.client.modeldriven.brxml.ActionModifyField;
+import org.drools.brms.client.modeldriven.brxml.ActionRetractFact;
+import org.drools.brms.client.modeldriven.brxml.ActionSetField;
+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.RuleAttribute;
+import org.drools.brms.client.modeldriven.brxml.RuleModel;
+
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomDriver;
+
+/**
+ * This class persists the rule model to XML and back.
+ * 
+ * This is the 'brxml' xml format (Business Rule Language).
+ * 
+ * @author Michael Neale
+ */
+public class BRLPersistence {
+
+    private XStream        xt;
+    private static final BRLPersistence INSTANCE = new BRLPersistence();
+
+    private BRLPersistence() {
+        xt = new XStream(new DomDriver());
+
+        xt.alias( "rule", RuleModel.class );
+        xt.alias( "fact", FactPattern.class );
+        xt.alias( "retract", ActionRetractFact.class );
+        xt.alias( "assert", ActionAssertFact.class );
+        xt.alias( "modify", ActionModifyField.class );
+        xt.alias( "setField", ActionSetField.class );
+        xt.alias( "dslSentence", DSLSentence.class );
+        xt.alias( "compositePattern", CompositeFactPattern.class );
+        xt.alias( "attribute", RuleAttribute.class );
+
+        xt.alias( "fieldValue", ActionFieldValue.class );
+        xt.alias( "connectiveConstraint", ConnectiveConstraint.class );
+        xt.alias( "constraint", Constraint.class );
+
+        xt.alias( "assertLogical", ActionAssertLogicalFact.class );
+
+
+    }
+
+    public static BRLPersistence getInstance() {
+        return INSTANCE;
+    }
+
+    public String toXML(RuleModel model) {
+        return xt.toXML( model );
+    }
+
+    public RuleModel toModel(String xml) {
+        if (xml == null) return new RuleModel();    
+        if (xml.trim().equals( "" )) return new RuleModel();
+        return (RuleModel) xt.fromXML( xml );
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/util/BRLPersistence.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/util/SuggestionCompletionEngineBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/util/SuggestionCompletionEngineBuilder.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/util/SuggestionCompletionEngineBuilder.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,145 @@
+/*
+ * Copyright 2006 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools.brms.server.util;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+import org.drools.brms.client.modeldriven.brxml.DSLSentence;
+
+/**
+ * A builder to incrementally populate a SuggestionCompletionEngine
+ * 
+ * @author etirelli
+ */
+public class SuggestionCompletionEngineBuilder {
+
+    private SuggestionCompletionEngine instance      = new SuggestionCompletionEngine();
+    private List                       factTypes     = new ArrayList();
+    private Map                        fieldsForType = new HashMap();
+    private Map                        fieldTypes    = new HashMap();
+    private Map                        globalTypes   = new HashMap();
+    private List                       actionDSLSentences  = new ArrayList();
+    private List                       conditionDSLSentences  = new ArrayList();
+
+    public SuggestionCompletionEngineBuilder() {
+    }
+
+    /**
+     * Start the creation of a new SuggestionCompletionEngine
+     */
+    public void newCompletionEngine() {
+        this.instance = new SuggestionCompletionEngine();
+        this.factTypes = new ArrayList();
+        this.fieldsForType = new HashMap();
+        this.fieldTypes = new HashMap();
+        this.globalTypes = new HashMap();
+        this.actionDSLSentences = new ArrayList();
+        this.conditionDSLSentences = new ArrayList();
+    }
+
+    /**
+     * Adds a fact type to the engine
+     * 
+     * @param factType
+     */
+    public void addFactType(String factType) {
+        this.factTypes.add( factType );
+    }
+
+    /**
+     * Adds the list of fields for a given type
+     * 
+     * @param type
+     * @param fields
+     */
+    public void addFieldsForType(String type,
+                                 String[] fields) {
+        this.fieldsForType.put( type,
+                                fields );
+    }
+
+    /**
+     * @return true if this has the type already registered (field information).
+     */
+    public boolean hasFieldsForType(String type) {
+        return this.fieldsForType.containsKey( type );
+    }
+    
+    /**
+     * Adds a type declaration for a field
+     * 
+     * @param field
+     * @param type
+     */
+    public void addFieldType(String field,
+                             String type) {
+        this.fieldTypes.put( field,
+                             type );
+    }
+
+    /**
+     * Adds a global and its corresponding type to the engine
+     * 
+     * @param global
+     * @param type
+     */
+    public void addGlobalType(String global,
+                              String type) {
+        this.globalTypes.put( global,
+                              type );
+    }
+
+    /**
+     * Add a DSL sentence for an action.
+     */
+    public void addDSLActionSentence(String sentence) {
+        DSLSentence sen = new DSLSentence();
+        sen.sentence = sentence;
+        this.actionDSLSentences.add( sen );
+    }
+    
+    /**
+     * Add a DSL sentence for a condition.
+     */
+    public void addDSLConditionSentence(String sentence) {
+        DSLSentence sen = new DSLSentence();
+        sen.sentence = sentence;
+        this.conditionDSLSentences.add( sen );
+    }
+    
+
+    /**
+     * Returns a SuggestionCompletionEngine instance populated with 
+     * all the data since last call to newCompletionEngine() method
+     * 
+     * @return
+     */
+    public SuggestionCompletionEngine getInstance() {
+        this.instance.factTypes = (String[]) this.factTypes.toArray( new String[this.factTypes.size()] );
+        this.instance.fieldsForType = this.fieldsForType;
+        this.instance.fieldTypes = this.fieldTypes;
+        this.instance.globalTypes = this.globalTypes;
+        this.instance.actionDSLSentences = (DSLSentence[]) this.actionDSLSentences.toArray( new DSLSentence[this.actionDSLSentences.size()] );
+        this.instance.conditionDSLSentences = (DSLSentence[]) this.conditionDSLSentences.toArray( new DSLSentence[this.conditionDSLSentences.size()] );
+        return this.instance;
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/brms/server/util/SuggestionCompletionEngineBuilder.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/resource/util/ByteArrayClassLoader.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/resource/util/ByteArrayClassLoader.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/resource/util/ByteArrayClassLoader.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2006 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.drools.resource.util;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * A class loader for in memory byte[] resources
+ * 
+ * @author etirelli
+ */
+public class ByteArrayClassLoader extends ClassLoader {
+    
+    private final Map resources = new HashMap();
+
+    public ByteArrayClassLoader(final ClassLoader parentClassLoader) {
+        super( parentClassLoader );
+    }
+    
+    public void addResource( String name, byte[] bytecode ) {
+        this.resources.put( name, bytecode );
+    }
+
+    public Class fastFindClass(final String name) {
+        final Class clazz = findLoadedClass( name );
+
+        if ( clazz == null ) {
+            final byte[] clazzBytes = (byte[]) this.resources.get( convertClassToResourcePath(name) );
+            if ( clazzBytes != null ) {
+                return defineClass( name,
+                                    clazzBytes,
+                                    0,
+                                    clazzBytes.length );
+            }
+        }
+
+        return clazz;
+    }
+
+    /**
+     * Javadocs recommend that this method not be overloaded. We overload this so that we can prioritise the fastFindClass 
+     * over method calls to parent.loadClass(name, false); and c = findBootstrapClass0(name); which the default implementation
+     * would first - hence why we call it "fastFindClass" instead of standard findClass, this indicates that we give it a 
+     * higher priority than normal.
+     * 
+     */
+    protected synchronized Class loadClass(final String name,
+                                           final boolean resolve) throws ClassNotFoundException {
+        Class clazz = fastFindClass( name );
+
+        if ( clazz == null ) {
+            final ClassLoader parent = getParent();
+            if ( parent != null ) {
+                clazz = parent.loadClass( name );
+            } else {
+                throw new ClassNotFoundException( name );
+            }
+        }
+
+        if ( resolve ) {
+            resolveClass( clazz );
+        }
+
+        return clazz;
+    }
+
+    protected Class findClass(final String name) throws ClassNotFoundException {
+        final Class clazz = fastFindClass( name );
+        if ( clazz == null ) {
+            throw new ClassNotFoundException( name );
+        }
+        return clazz;
+    }
+
+    public InputStream getResourceAsStream(final String name) {
+        final byte[] bytes = (byte[]) this.resources.get( name );
+        if ( bytes != null ) {
+            return new ByteArrayInputStream( bytes );
+        } else {
+            InputStream input = this.getParent().getResourceAsStream( name );
+            if( input == null ){
+                input = super.getResourceAsStream( name );
+            }
+            return input;
+        }
+    }
+    
+//    /**
+//     * org/my/Class.xxx -> org.my.Class
+//     */
+//    private static String convertResourceToClassName( final String pResourceName ) {
+//        return stripExtension(pResourceName).replace('/', '.');
+//    }
+//
+    /**
+     * org.my.Class -> org/my/Class.class
+     */
+    private static String convertClassToResourcePath( final String pName ) {
+        return pName.replace('.', '/') + ".class";
+    }
+
+//    /**
+//     * org/my/Class.xxx -> org/my/Class
+//     */
+//    private static String stripExtension( final String pResourceName ) {
+//        final int i = pResourceName.lastIndexOf('.');
+//        final String withoutExtension = pResourceName.substring(0, i);
+//        return withoutExtension;
+//    }
+    
+    
+
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/resource/util/ByteArrayClassLoader.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/client/modeldriven/SuggestionCompletionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/client/modeldriven/SuggestionCompletionTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/client/modeldriven/SuggestionCompletionTest.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,147 @@
+package org.drools.brms.client.modeldriven;
+
+import java.util.HashMap;
+
+import junit.framework.TestCase;
+
+public class SuggestionCompletionTest extends TestCase {
+
+    public void testCompletions() {
+        
+        
+        SuggestionCompletionEngine com = new SuggestionCompletionEngine();
+
+        com.factTypes = new String[] {"Person", "Vehicle"};
+        com.fieldsForType = new HashMap() {{
+            put("Person", new String[] {"age", "name", "rank"});
+            put("Vehicle", new String[] {"type", "make"});
+        }};
+        com.fieldTypes = new HashMap() {{
+           put("Person.age", "Numeric");
+           put("Person.rank", "Comparable");
+           put("Person.name", "String");
+           put("Vehicle.make", "String");
+           put("Vehicle.type", "String");
+        }};
+        com.globalTypes = new HashMap() {{
+           put("bar", "Person");
+           put("baz", "Vehicle");
+        }};
+        
+
+        
+        String[] c =com.getConditionalElements();
+        assertEquals("not", c[0]);
+        assertEquals("exists", c[1]);
+        assertEquals("or", c[2]);
+        
+        c = com.getFactTypes();
+        assertEquals(2, c.length);
+        assertContains("Person", c);
+        assertContains("Vehicle", c);
+
+        
+        c = com.getFieldCompletions( "Person" );
+        assertEquals("age", c[0]);
+        assertEquals("name", c[1]);
+        
+        c = com.getFieldCompletions( "Vehicle" );
+        assertEquals("type", c[0]);
+        assertEquals( "make", c[1] );
+        
+        c = com.getOperatorCompletions( "Person", "name" );
+        assertEquals(3, c.length);
+        assertEquals("==", c[0]);
+        assertEquals( "!=", c[1] );
+        assertEquals( "matches", c[2] );
+        
+        
+        c = com.getOperatorCompletions( "Person", "age" );
+        assertEquals(6, c.length);
+        assertEquals(c[0], "==");
+        assertEquals(c[1], "!=");
+        assertEquals(c[2], "<" );
+        assertEquals(c[3], ">" );
+        
+        c = com.getOperatorCompletions( "Person", "rank" );        
+        assertEquals(6, c.length);
+        assertEquals(c[0], "==");
+        assertEquals(c[1], "!=");
+        assertEquals(c[2], "<" );
+        assertEquals(c[3], ">" );
+
+        c = com.getConnectiveOperatorCompletions( "Vehicle", "make" );
+        assertEquals(5, c.length);
+        assertEquals("| ==", c[0]);
+        
+        c = com.getGlobalVariables();
+        assertEquals(2, c.length);
+        assertEquals("baz", c[0]);
+        assertEquals("bar", c[1]);
+        
+        c = com.getFieldCompletionsForGlobalVariable( "bar" );
+        assertEquals(3, c.length);
+        assertEquals("age", c[0]);
+        assertEquals("name", c[1]);
+
+        c = com.getFieldCompletionsForGlobalVariable( "baz" );
+        assertEquals(2, c.length);
+        assertEquals("type", c[0]);
+        assertEquals("make", c[1]);
+
+
+        //check that it has default operators for general objects
+        c = com.getOperatorCompletions( "Person", "wankle" );
+        assertEquals(2, c.length);        
+        
+    }
+    
+    public void testAdd() {
+        SuggestionCompletionEngine com = new SuggestionCompletionEngine();
+        com.factTypes = new String[] {"Foo"};
+        com.fieldsForType = new HashMap() {{
+           put("Foo", new String[] {"a"}); 
+        }};
+        
+        assertEquals(1, com.getFactTypes().length);
+        assertEquals("Foo", com.getFactTypes()[0]);
+        
+        assertEquals(1, com.getFieldCompletions( "Foo" ).length);
+        assertEquals("a", com.getFieldCompletions( "Foo" )[0]);
+        
+    }
+    
+    private void assertContains(String string,
+                                String[] c) {
+        
+        for ( int i = 0; i < c.length; i++ ) {
+            if (string.equals( c[i] )) {
+                return;
+            }
+        } 
+        fail( "String array did not contain: " + string );
+        
+    }
+    
+    
+    public void testGlobalAndFacts() {
+        SuggestionCompletionEngine com = new SuggestionCompletionEngine();
+
+        com.globalTypes = new HashMap() {{
+            put("y", "Foo");
+        }};
+        com.fieldsForType = new HashMap() {{
+           put("Foo", new String[] {"a"}); 
+        }};
+        
+        
+        
+        assertFalse(com.isGlobalVariable( "x" ));        
+        assertTrue(com.isGlobalVariable( "y" ));
+    }
+    
+    
+    
+    
+    
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/client/modeldriven/SuggestionCompletionTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/ActionFieldValueTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/ActionFieldValueTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/ActionFieldValueTest.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,16 @@
+package org.drools.brms.modeldriven;
+
+import org.drools.brms.client.modeldriven.brxml.ActionFieldValue;
+
+import junit.framework.TestCase;
+
+public class ActionFieldValueTest extends TestCase {
+
+    public void testFormula() {
+        ActionFieldValue val = new ActionFieldValue("x", "y");
+        assertFalse(val.isFormula());
+        val = new ActionFieldValue("x", "=y * 20");
+        assertTrue(val.isFormula());
+    }
+    
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/ActionFieldValueTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/ActionSetFieldTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/ActionSetFieldTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/ActionSetFieldTest.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,42 @@
+package org.drools.brms.modeldriven;
+
+import junit.framework.TestCase;
+
+import org.drools.brms.client.modeldriven.brxml.ActionFieldValue;
+import org.drools.brms.client.modeldriven.brxml.ActionSetField;
+
+public class ActionSetFieldTest extends TestCase {
+
+    public void testRemove() {
+        ActionSetField set = new ActionSetField();
+        set.fieldValues = new ActionFieldValue[2];
+        ActionFieldValue v0 = new ActionFieldValue("x", "42");
+        ActionFieldValue v1 = new ActionFieldValue("y", "43");
+        set.fieldValues[0] = v0;
+        set.fieldValues[1] = v1;
+        
+        set.removeField( 1 );
+        
+        assertEquals(1, set.fieldValues.length);
+        assertEquals(v0, set.fieldValues[0]);
+        
+    }
+    
+    public void testAdd() {
+        ActionSetField set = new ActionSetField();
+        set.fieldValues = new ActionFieldValue[2];
+        ActionFieldValue v0 = new ActionFieldValue("x", "42");
+        ActionFieldValue v1 = new ActionFieldValue("y", "43");
+        set.fieldValues[0] = v0;
+        set.fieldValues[1] = v1;
+
+        ActionFieldValue q = new ActionFieldValue("q", "q");
+        set.addFieldValue( q);
+        
+        assertEquals(3, set.fieldValues.length);
+        assertEquals(q, set.fieldValues[2]);
+        assertEquals(v0, set.fieldValues[0]);
+        
+    }
+    
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/ActionSetFieldTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/CompositeFactPatternTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/CompositeFactPatternTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/CompositeFactPatternTest.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,24 @@
+package org.drools.brms.modeldriven;
+
+import junit.framework.TestCase;
+
+import org.drools.brms.client.modeldriven.brxml.CompositeFactPattern;
+import org.drools.brms.client.modeldriven.brxml.FactPattern;
+
+public class CompositeFactPatternTest extends TestCase {
+
+    public void testAddPattern() {
+        CompositeFactPattern pat = new CompositeFactPattern();
+        FactPattern x = new FactPattern();
+        pat.addFactPattern( x  );
+        assertEquals(1, pat.patterns.length);
+        
+        FactPattern y = new FactPattern();
+        pat.addFactPattern( y  );
+        assertEquals(2, pat.patterns.length);
+        assertEquals(x, pat.patterns[0]);
+        assertEquals(y, pat.patterns[1]);
+    }
+    
+    
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/CompositeFactPatternTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/ConstraintTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/ConstraintTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/ConstraintTest.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,24 @@
+package org.drools.brms.modeldriven;
+
+import junit.framework.TestCase;
+
+import org.drools.brms.client.modeldriven.brxml.Constraint;
+
+public class ConstraintTest extends TestCase {
+
+    public void testAdd() {
+        Constraint con = new Constraint();
+        con.addNewConnective();
+        
+        assertEquals(1, con.connectives.length);
+        assertNotNull(con.connectives[0]);
+
+        con.addNewConnective();
+        
+        assertEquals(2, con.connectives.length);
+        assertNotNull(con.connectives[1]);
+
+        
+    }
+    
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/ConstraintTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/DSLSentenceTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/DSLSentenceTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/DSLSentenceTest.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,24 @@
+package org.drools.brms.modeldriven;
+
+import org.drools.brms.client.modeldriven.brxml.DSLSentence;
+
+import junit.framework.TestCase;
+
+public class DSLSentenceTest extends TestCase {
+
+    
+    public void testSentence() {
+        
+        DSLSentence sen = new DSLSentence();
+        sen.sentence = "this is {something} here and {here}";
+        assertEquals("this is something here and here", sen.toString());
+        
+        sen.sentence = "foo bar";
+        assertEquals("foo bar", sen.toString());
+        
+        DSLSentence newOne = sen.copy();
+        assertFalse(newOne == sen);
+        assertEquals(newOne.sentence, sen.sentence);
+    }
+    
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/DSLSentenceTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/FactPatternTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/FactPatternTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/FactPatternTest.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,46 @@
+package org.drools.brms.modeldriven;
+
+import junit.framework.TestCase;
+
+import org.drools.brms.client.modeldriven.brxml.Constraint;
+import org.drools.brms.client.modeldriven.brxml.FactPattern;
+
+public class FactPatternTest extends TestCase {
+
+    public void testAddConstraint() {
+        FactPattern p = new FactPattern();
+        Constraint x = new Constraint("x");
+        p.addConstraint(x);
+        
+        assertEquals(1, p.constraints.length);
+        assertEquals(x, p.constraints[0]);
+        
+        Constraint y = new Constraint("y");
+        
+        p.addConstraint( y );
+        assertEquals(2, p.constraints.length);
+        assertEquals(x, p.constraints[0]);
+        assertEquals(y, p.constraints[1]);
+        
+    }
+    
+    public void testRemoveConstraint() {
+        FactPattern p = new FactPattern();
+        Constraint x = new Constraint("x");
+        p.addConstraint(x);
+        Constraint y = new Constraint("y");        
+        p.addConstraint( y );
+
+        assertEquals(2, p.constraints.length);
+        
+        p.removeConstraint(1);
+        
+        assertEquals(1, p.constraints.length);
+        
+        assertEquals(x, p.constraints[0]);
+        
+    }
+    
+    
+    
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/FactPatternTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/RuleModelTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/RuleModelTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/RuleModelTest.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,187 @@
+package org.drools.brms.modeldriven;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.drools.brms.client.modeldriven.brxml.ActionRetractFact;
+import org.drools.brms.client.modeldriven.brxml.ActionSetField;
+import org.drools.brms.client.modeldriven.brxml.FactPattern;
+import org.drools.brms.client.modeldriven.brxml.IAction;
+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 com.thoughtworks.xstream.XStream;
+
+public class RuleModelTest extends TestCase {
+
+    public void testBoundFactFinder() {
+        RuleModel model = new RuleModel();
+        
+        assertNull(model.getBoundFact( "x" ));
+        model.lhs = new IPattern[3];
+        
+        FactPattern x = new FactPattern("Car");
+        model.lhs[0] = x;
+        x.boundName = "x";
+        
+        assertNotNull(model.getBoundFact( "x" ));
+        assertEquals(x, model.getBoundFact( "x" ));
+        
+        FactPattern y = new FactPattern("Car");
+        model.lhs[1] = y;
+        y.boundName = "y";
+        
+        FactPattern other = new FactPattern("House");
+        model.lhs[2] = other;
+        
+        assertEquals(y, model.getBoundFact( "y" ));
+        assertEquals(x, model.getBoundFact( "x" ));
+        
+        
+        model.rhs = new IAction[1];
+        ActionSetField set = new ActionSetField();
+        set.variable = "x";
+        model.rhs[0] = set;
+        
+        assertTrue(model.isBoundFactUsed( "x" ));
+        assertFalse(model.isBoundFactUsed( "y" ));
+        
+        assertEquals(3, model.lhs.length);
+        assertFalse(model.removeLhsItem( 0 ));
+        assertEquals(3, model.lhs.length);
+        
+        ActionRetractFact fact = new ActionRetractFact("q");
+        model.rhs[0] = fact;
+        assertTrue(model.isBoundFactUsed( "q" ));
+        assertFalse(model.isBoundFactUsed( "x" ));
+        
+        XStream xt = new XStream();
+        xt.alias( "rule", RuleModel.class );
+        xt.alias( "fact", FactPattern.class );
+        xt.alias( "retract", ActionRetractFact.class );
+        
+        
+        String brl = xt.toXML( model );
+        
+        System.out.println(brl);
+    }
+    
+    public void testBindingList() {
+        RuleModel model = new RuleModel();
+        
+        model.lhs = new IPattern[3];
+        FactPattern x = new FactPattern("Car");
+        model.lhs[0] = x;
+        x.boundName = "x";
+        
+        FactPattern y = new FactPattern("Car");
+        model.lhs[1] = y;
+        y.boundName = "y";
+        
+        FactPattern other = new FactPattern("House");
+        model.lhs[2] = other;
+        
+        
+        List b = model.getBoundFacts();
+        assertEquals(2, b.size());
+        
+        assertEquals("x", b.get( 0 ));
+        assertEquals("y", b.get( 1 ));
+        
+    }
+    
+    public void testRemoveItemLhs() {
+        RuleModel model = new RuleModel();
+        
+        model.lhs = new IPattern[3];
+        FactPattern x = new FactPattern("Car");
+        model.lhs[0] = x;
+        x.boundName = "x";
+        
+        FactPattern y = new FactPattern("Car");
+        model.lhs[1] = y;
+        y.boundName = "y";
+        
+        FactPattern other = new FactPattern("House");
+        model.lhs[2] = other;
+        
+        assertEquals(3, model.lhs.length);
+        assertEquals(x, model.lhs[0]);
+        
+        model.removeLhsItem( 0 );
+        
+        assertEquals(2, model.lhs.length);
+        assertEquals(y, model.lhs[0]);        
+    }
+    
+    public void testRemoveItemRhs() {
+        RuleModel model = new RuleModel();
+        
+        model.rhs = new IAction[3];
+        ActionRetractFact r0 = new ActionRetractFact("x");
+        ActionRetractFact r1 = new ActionRetractFact("y");
+        ActionRetractFact r2 = new ActionRetractFact("z");
+        
+        model.rhs[0] = r0;
+        model.rhs[1] = r1;
+        model.rhs[2] = r2;
+        
+        model.removeRhsItem(1);
+        
+        assertEquals(2, model.rhs.length);
+        assertEquals(r0, model.rhs[0]);
+        assertEquals(r2, model.rhs[1]);        
+    }
+    
+    public void testAddItemLhs() {
+        RuleModel model = new RuleModel();
+        FactPattern x = new FactPattern();
+        model.addLhsItem( x );
+        assertEquals(1, model.lhs.length);
+        
+        FactPattern y = new FactPattern();
+        model.addLhsItem( y );
+        
+        assertEquals(2, model.lhs.length);
+        assertEquals(x, model.lhs[0]);
+        assertEquals(y, model.lhs[1]);
+        
+    }
+    
+    public void testAddItemRhs() {
+        RuleModel model = new RuleModel();
+        IAction a0 = new ActionSetField();
+        IAction a1 = new ActionSetField();
+        
+        model.addRhsItem( a0 );
+        
+        assertEquals(1, model.rhs.length);
+        model.addRhsItem( a1 );
+        
+        assertEquals(2, model.rhs.length);
+        
+        assertEquals(a0, model.rhs[0]);
+        assertEquals(a1, model.rhs[1]);
+    }
+    
+    public void testAttributes() {
+        RuleModel m = new RuleModel();
+        RuleAttribute at = new RuleAttribute("salience", "42");
+        m.addAttribute(at);
+        assertEquals(1, m.attributes.length);
+        assertEquals(at, m.attributes[0]);
+        
+        RuleAttribute at2 = new RuleAttribute("agenda-group", "x");
+        m.addAttribute( at2 );
+        assertEquals(2, m.attributes.length);
+        assertEquals(at2, m.attributes[1]);
+        
+        m.removeAttribute( 0 );
+        assertEquals(1, m.attributes.length);
+        assertEquals(at2, m.attributes[0]);
+    }
+    
+    
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/RuleModelTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/package.html
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/package.html	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/package.html	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,10 @@
+<body>
+This contains utilities and widgets for the model driven/scorecard style way of
+editing a rule.
+
+This has the interesting feature of being able to work over standard DRL, no special markup needed.
+Its actually a subset of DRL, complex structures and semantics can not be supported.
+
+However, this can be augmented with DSLs which can express any construct needed.
+
+</body>
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/modeldriven/package.html
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/server/converter/BRXMLToDescrConverterTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/server/converter/BRXMLToDescrConverterTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/server/converter/BRXMLToDescrConverterTest.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -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.TYPE_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-compiler/src/test/java/org/drools/brms/server/converter/BRXMLToDescrConverterTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/server/util/BRLPersitenceTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/server/util/BRLPersitenceTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/server/util/BRLPersitenceTest.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,126 @@
+package org.drools.brms.server.util;
+
+import junit.framework.TestCase;
+
+import org.drools.brms.client.modeldriven.brxml.ActionAssertFact;
+import org.drools.brms.client.modeldriven.brxml.ActionFieldValue;
+import org.drools.brms.client.modeldriven.brxml.ActionModifyField;
+import org.drools.brms.client.modeldriven.brxml.ActionRetractFact;
+import org.drools.brms.client.modeldriven.brxml.CompositeFactPattern;
+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.RuleAttribute;
+import org.drools.brms.client.modeldriven.brxml.RuleModel;
+
+public class BRLPersitenceTest extends TestCase {
+
+    public void testGenerateEmptyXML() {
+        BRLPersistence p = BRLPersistence.getInstance();
+        String xml = p.toXML( new RuleModel() );
+        assertNotNull(xml);
+        assertFalse(xml.equals( "" ));
+        
+        assertTrue(xml.startsWith( "<rule>" ));
+        assertTrue(xml.endsWith( "</rule>" ));
+    }
+    
+    public void testBasics() {
+        BRLPersistence p = BRLPersistence.getInstance();
+        RuleModel m = new RuleModel();
+        m.addLhsItem( new FactPattern("Person") );
+        m.addLhsItem( new FactPattern("Accident") );
+        m.addAttribute( new RuleAttribute("no-loop", "true") );
+        
+        
+        
+        m.addRhsItem( new ActionAssertFact("Report") );
+        m.name = "my rule";
+        String xml = p.toXML( m );
+        assertTrue(xml.indexOf( "Person" ) > -1);
+        assertTrue(xml.indexOf( "Accident" ) > -1);
+        assertTrue(xml.indexOf( "no-loop" ) > -1);
+        assertTrue(xml.indexOf( "org.drools" ) == -1);
+        
+    }
+    
+    public void testMoreComplexRendering() {
+        BRLPersistence p = BRLPersistence.getInstance();
+        RuleModel m = getComplexModel();
+        
+        String xml = p.toXML( m );
+        System.out.println(xml);
+        
+        assertTrue(xml.indexOf( "org.drools" ) == -1);
+        
+    }
+    
+    public void testRoundTrip() {
+        RuleModel m = getComplexModel();
+        
+        String xml = BRLPersistence.getInstance().toXML( m );
+        
+        RuleModel m2 = BRLPersistence.getInstance().toModel( xml );
+        assertNotNull(m2);
+        assertEquals(m.name, m2.name);
+        assertEquals(m.lhs.length, m2.lhs.length);
+        assertEquals(m.rhs.length, m2.rhs.length);
+        assertEquals(1, m.attributes.length);
+        
+        RuleAttribute at = m.attributes[0];
+        assertEquals("no-loop", at.attributeName);
+        assertEquals("true", at.value);
+        
+        String newXML = BRLPersistence.getInstance().toXML( m2 );
+        assertEquals(xml, newXML);
+        
+    }
+
+    private RuleModel getComplexModel() {
+        RuleModel m = new RuleModel();
+        
+        m.addAttribute( new RuleAttribute("no-loop", "true") );
+        
+        FactPattern pat = new FactPattern();
+        pat.boundName = "p1";
+        pat.factType = "Person";
+        Constraint con = new Constraint();
+        con.fieldBinding = "f1";
+        con.fieldName = "age";
+        con.operator = "<";
+        con.value = "42";
+        pat.addConstraint( con );
+        
+        m.addLhsItem( pat );
+
+        CompositeFactPattern comp = new CompositeFactPattern("not");
+        comp.addFactPattern( new FactPattern("Cancel") );
+        m.addLhsItem( comp );
+        
+        ActionModifyField set = new ActionModifyField();
+        set.variable = "p1";        
+        set.addFieldValue( new ActionFieldValue("status", "rejected") );
+        m.addRhsItem( set );
+        
+        
+        ActionRetractFact ret = new ActionRetractFact("p1");
+        m.addRhsItem( ret );
+        
+        DSLSentence sen = new DSLSentence();
+        sen.sentence = "Send an email to {administrator}";
+
+        
+        
+        m.addRhsItem( sen );
+        return m;
+    }
+    
+    public void testLoadEmpty() {
+        RuleModel m = BRLPersistence.getInstance().toModel( null );
+        assertNotNull(m);
+        
+        m = BRLPersistence.getInstance().toModel( "" );
+        assertNotNull(m);
+    }
+    
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/server/util/BRLPersitenceTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/server/util/SuggestionCompletionEngineBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/server/util/SuggestionCompletionEngineBuilderTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/server/util/SuggestionCompletionEngineBuilderTest.java	2007-03-29 12:09:13 UTC (rev 10608)
@@ -0,0 +1,37 @@
+package org.drools.brms.server.util;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import junit.framework.TestCase;
+
+import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+
+public class SuggestionCompletionEngineBuilderTest extends TestCase {
+    SuggestionCompletionEngineBuilder builder = new SuggestionCompletionEngineBuilder();
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        builder.newCompletionEngine();
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    public void testAddDSLSentence() {
+        String input = "{This} is a {pattern} considered pretty \\{{easy}\\} by most \\{people\\}. What do you {say}?";
+        builder.addDSLActionSentence(  input );
+        builder.addDSLConditionSentence( "foo bar" );
+        SuggestionCompletionEngine engine = builder.getInstance();
+
+        assertEquals( 1,
+                      engine.actionDSLSentences.length );
+        assertEquals( 1,
+                      engine.conditionDSLSentences.length );
+        
+
+
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/brms/server/util/SuggestionCompletionEngineBuilderTest.java
___________________________________________________________________
Name: svn:eol-style
   + native




More information about the jboss-svn-commits mailing list