[jboss-svn-commits] JBL Code SVN: r7854 - in labs/jbossrules/trunk/drools-jbrms/src: main/java/org/drools/brms/client main/java/org/drools/brms/client/modeldriven main/java/org/drools/brms/client/modeldriven/ui test/java/org/drools/brms/client test/java/org/drools/brms/client/modeldriven

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Nov 27 12:58:11 EST 2006


Author: michael.neale at jboss.com
Date: 2006-11-27 12:58:05 -0500 (Mon, 27 Nov 2006)
New Revision: 7854

Added:
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/SuggestionCompletionEngine.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/package.html
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/ui/
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/ui/ConstraintWidget.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/ui/FactTypeWidget.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/ui/PatternWidget.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/ui/RuleScorecardWidget.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/client/modeldriven/
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/client/modeldriven/SuggestionCompletionTest.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/client/modeldriven/package.html
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/client/modeldriven/ui/
Log:
new model driven rule editor

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/SuggestionCompletionEngine.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/SuggestionCompletionEngine.java	2006-11-27 17:57:22 UTC (rev 7853)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/SuggestionCompletionEngine.java	2006-11-27 17:58:05 UTC (rev 7854)
@@ -0,0 +1,164 @@
+package org.drools.brms.client.modeldriven;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * An suggestion completion processor. This should be usable in both GWT/Web and the IDE.
+ *  
+ * @author Michael Neale
+ */
+public class SuggestionCompletionEngine {
+
+    
+    private Map factToFields = new HashMap();
+    private Map factFieldToOperator = new HashMap();
+    private Map factFieldToConnectiveOperator = new HashMap();
+    private Map boundFacts = new HashMap();
+    private List boundFields = new ArrayList();
+    private Map globals = new HashMap();
+
+    /**
+     * 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[]).
+                                      
+     */
+    public void load( 
+                      Map factToFields, 
+                      Map factFieldToOperator, 
+                      Map factFieldToConnectiveOperator,
+                      Map globals                                     
+                    ) {
+        this.factToFields = factToFields;
+        this.factFieldToOperator = factFieldToOperator;
+        this.factFieldToConnectiveOperator = factFieldToConnectiveOperator;
+        this.globals = globals;
+        
+    }
+    
+    public SuggestionCompletionEngine() {        
+    }
+    
+    
+    /**
+     * Add a fact, with the applicable fields.
+     */
+    public void addFact(String factType, String[] fields) {
+        this.factToFields.put(factType, fields);
+    }
+
+    /**
+     * add an operator, to the applicable fact/field combination.
+     */
+    public void addOperators(String factType, String fieldName, String[] operators) {
+        this.factFieldToOperator.put( factType + "." + fieldName, operators );
+    }
+    
+    /**
+     * add a connective operator (as they are generally a subset of the full set of operators).
+     */
+    public void addConnectiveOperators(String factType, String fieldName, String[] operators) {
+        this.factFieldToConnectiveOperator.put( factType + "." + fieldName, operators );
+    }
+    
+    
+    /**
+     * Add a global with the specified fields.
+     */
+    public void addGlobal(String global, String[] fields) {
+        this.globals.put( global, fields );
+    }
+
+    public String[] getConditionalElements() {       
+        return new String[] {"not", "exists", "or"};
+    }
+
+    public String[] getConnectiveOperatorCompletions(String factType,
+                                                     String fieldName) {
+        return (String[]) this.factFieldToConnectiveOperator.get( factType + "." + fieldName );
+    }
+
+    public String[] getFactTypes() {
+        return toStringArray( this.factToFields.keySet() );
+    }
+
+    public String[] getFieldCompletions(String factType) {
+        
+        return (String[]) this.factToFields.get( factType );
+    }
+
+    public String[] getOperatorCompletions(String factType,
+                                           String fieldName) {
+        return (String[]) this.factFieldToOperator.get( factType + "." + fieldName );        
+    }
+
+
+
+    /**
+     * This adds a bound field which may be used later on (fields values cannot be set this way).
+     */
+    public void addBoundField(String fieldName) {
+        this.boundFields.add(fieldName);
+    }
+    
+    public String[] getBoundFacts() {
+        return toStringArray( boundFacts.keySet() );
+    }
+    
+    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;                
+    }
+
+
+    private String[] toStringArray(List list) { 
+        String[] result = new String[list.size()];    
+        for(int i = 0; i < list.size(); i ++) {
+            result[i] = (String) list.get( i );
+        }
+        return result;
+    }
+
+
+    public String[] getBoundFields() {
+        return toStringArray( boundFields );
+    }
+
+
+    public void addBoundFact(String varName,
+                             String factType) {        
+        this.boundFacts.put(varName, factType);
+    }
+
+
+    public String[] getFieldCompletionsForBoundFact(String varName) {
+        String factType = (String) this.boundFacts.get( varName );
+        return this.getFieldCompletions( factType );
+    }
+
+
+    public String[] getFieldCompletionsForGlobalVariable(String varName) {        
+        return (String[]) this.globals.get( varName );
+    }
+
+
+    public String[] getGlobalVariables() { 
+        return toStringArray( this.globals.keySet() );
+    }
+
+}

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/package.html
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/package.html	2006-11-27 17:57:22 UTC (rev 7853)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/package.html	2006-11-27 17:58:05 UTC (rev 7854)
@@ -0,0 +1,4 @@
+<body>
+This is the model driven GUI builder which is really a superset of the breditor.
+
+</body>
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/ui/ConstraintWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/ui/ConstraintWidget.java	2006-11-27 17:57:22 UTC (rev 7853)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/ui/ConstraintWidget.java	2006-11-27 17:58:05 UTC (rev 7854)
@@ -0,0 +1,200 @@
+package org.drools.brms.client.modeldriven.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+
+import com.google.gwt.user.client.ui.ChangeListener;
+import com.google.gwt.user.client.ui.ClickListener;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.FlexTable;
+import com.google.gwt.user.client.ui.HasHorizontalAlignment;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.ListBox;
+import com.google.gwt.user.client.ui.TextBox;
+import com.google.gwt.user.client.ui.Widget;
+import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
+
+/**
+ * This contains all the constraints that are placed on a fact class.
+ * 
+ * @author Michael Neale
+ */
+public class ConstraintWidget extends Composite {
+
+    private FlexTable outer;
+    public FlexTable layout;
+    private List rowData = new ArrayList();
+    private final SuggestionCompletionEngine completions;
+    private String factType;
+    
+    
+    /**
+     * 
+     * @param factType The type of the fact (needed for lists)
+     * @param com The suggestion completion.
+     * @param constraints A list of ConstraintAtom's, which apply to the fact.
+     */
+    public ConstraintWidget(String factType, SuggestionCompletionEngine com, List constraints) {
+        this.completions = com;
+        this.factType = factType;
+        this.rowData = constraints;
+        outer = new FlexTable();
+        doTable();
+        
+        
+        
+        initWidget( outer );
+    }
+    
+    
+    
+    private void doTable() {
+        layout = new FlexTable();
+        outer.setWidget( 0, 0, layout);
+        
+        //firstly to add a row
+        Image add = new Image("images/new_item.gif");
+        add.setTitle( "Add a new constraint on this fact." );
+        add.addClickListener( new ClickListener() {
+            public void onClick(Widget w) {
+                rowData.add( new ConstraintAtom() );
+                doTable();                
+            }            
+        });
+        
+        int addRow = rowData.size() + 1;
+        layout.setWidget( addRow, 0, add );
+        FlexCellFormatter formatter = layout.getFlexCellFormatter();
+        formatter.setColSpan( addRow, 0, 5 );
+        formatter.setHorizontalAlignment( addRow, 0, HasHorizontalAlignment.ALIGN_CENTER );
+        
+        
+        //now to do the rows:
+        for ( int i = 0; i < rowData.size(); i++ ) {
+            ConstraintAtom row = (ConstraintAtom) rowData.get( i );
+            layout.setWidget( i, 0, doFieldDropDown(row, i));
+            layout.setWidget( i, 1, doOperatorDropDown(row) );
+            layout.setWidget( i, 2, doValueEditor(row) );
+            //TODO: add in connectives here...
+            
+            Image remove = new Image("images/clear_item.gif");
+            final int idx = i;
+            remove.addClickListener( new ClickListener() {
+
+                public void onClick(Widget w) {
+                    rowData.remove( idx );
+                    doTable();
+                }
+                
+            });
+            layout.setWidget( i, 4, remove );
+        }
+        
+        
+    }
+
+
+
+    private Widget doValueEditor(final ConstraintAtom row) {
+        final TextBox text = new TextBox();
+        text.setText( row.value );
+        text.addChangeListener( new ChangeListener() {
+            public void onChange(Widget w) {
+                row.value = text.getText();
+            }            
+        });
+        return text;
+    }
+
+
+
+    /**
+     * Builds the list of valid operators based on the field selected.
+     */
+    private ListBox doOperatorDropDown(final ConstraintAtom row) {
+        final ListBox box = new ListBox();
+        String[] oprs = completions.getOperatorCompletions( factType, row.field.field );
+        if (oprs != null) {
+            for ( int i = 0; i < oprs.length; i++ ) {
+                box.addItem( oprs[i] );
+                if (oprs[i].equals( row.operator )) {
+                    box.setSelectedIndex( i );
+                }
+
+            }
+            
+            box.addChangeListener( new ChangeListener() {
+                public void onChange(Widget w) {
+                    row.operator = box.getItemText( box.getSelectedIndex() );                
+                }            
+            });
+        
+        }
+        
+        if (row.operator == null) {
+            box.addItem( "..." );  
+            
+        }
+        
+        return box;
+    }
+
+
+
+    /** 
+     * Creates the field list drop down, and selects the item.
+     */
+    private ListBox doFieldDropDown(final ConstraintAtom row, final int rowNumberInLayout) {
+        
+        final ListBox box = new ListBox();
+        
+        String[] com = completions.getFieldCompletions( factType );
+        for ( int i = 0; i < com.length; i++ ) {
+            box.addItem( com[i] );
+            if (com[i].equals( row.field.field )) {
+                box.setSelectedIndex( i );
+            }
+
+        }
+        
+        box.addChangeListener( new ChangeListener() {
+
+            public void onChange(Widget w) {
+                row.field.field = box.getItemText( box.getSelectedIndex() );    
+                layout.setWidget( rowNumberInLayout, 1, doOperatorDropDown( row ) );
+            }
+            
+        });
+        
+        if (row.field.field == null) {
+            box.addItem( "..." );
+        }
+        
+        return box;
+        
+    }
+
+
+    /**
+     * These classes are for containing the values.
+     */
+    class ConstraintAtom {
+        public ConstraintField field = new ConstraintField();
+        public String operator;
+        public String value;
+        public ConnectiveConstraint[] connectives;         
+    }
+    
+    class ConstraintField {
+        public String field;
+        public String boundVariableName;
+    }
+    
+    class ConnectiveConstraint {
+        public String operator;
+        public String value;
+    }
+    
+}

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/ui/FactTypeWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/ui/FactTypeWidget.java	2006-11-27 17:57:22 UTC (rev 7853)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/ui/FactTypeWidget.java	2006-11-27 17:58:05 UTC (rev 7854)
@@ -0,0 +1,91 @@
+package org.drools.brms.client.modeldriven.ui;
+
+import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.ui.ChangeListener;
+import com.google.gwt.user.client.ui.ClickListener;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.ListBox;
+import com.google.gwt.user.client.ui.PopupPanel;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * This is the widget for choosing/viewing the fact type.
+ * 
+ * @author Michael Neale
+ *
+ */
+public class FactTypeWidget extends Composite {
+
+    private final HorizontalPanel widget = new HorizontalPanel();
+    private SuggestionCompletionEngine completion;
+    private Label type;
+    private Command onChange;
+    
+    public FactTypeWidget(String factType, SuggestionCompletionEngine com, Command onChange) {        
+        this.completion = com;
+        this.onChange = onChange;
+        
+        type = new Label(factType);
+        Image edit = new Image("images/edit_tiny.gif");
+        edit.addClickListener( new ClickListener() {
+
+            public void onClick(Widget w) {
+                FactTypeList list = new FactTypeList();
+                list.setPopupPosition( w.getAbsoluteLeft(), w.getAbsoluteTop() );
+                list.show();
+                
+            }
+            
+        });
+        
+        widget.add( edit );
+        widget.add( type );
+        
+        initWidget( widget );
+    }
+    
+    /**
+     * This returns the current fact type.
+     */
+    public String getFactType() {
+        return type.getText();
+    }
+    
+    /**
+     * The popup for choosing a fact type.
+     * 
+     * @author Michael Neale
+     */
+    class FactTypeList extends PopupPanel {
+        
+        public FactTypeList() {
+            super(true);
+            final ListBox box = new ListBox();
+            String[] types = completion.getFactTypes();
+            box.addItem( "-- please choose --" );
+            for ( int i = 0; i < types.length; i++ ) {
+                box.addItem( types[i] );
+            }
+            
+            
+            box.addChangeListener( new ChangeListener() {
+
+                public void onChange(Widget w) {
+                    type.setText(box.getValue( box.getSelectedIndex()));
+                    onChange.execute();
+                    hide();
+                }
+                
+            });
+            
+            add( box );
+        }
+        
+    }
+    
+}

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/ui/PatternWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/ui/PatternWidget.java	2006-11-27 17:57:22 UTC (rev 7853)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/ui/PatternWidget.java	2006-11-27 17:58:05 UTC (rev 7854)
@@ -0,0 +1,56 @@
+package org.drools.brms.client.modeldriven.ui;
+
+import java.util.ArrayList;
+
+import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.FlexTable;
+import com.google.gwt.user.client.ui.HasVerticalAlignment;
+
+/**
+ * This is the containing widgets for applying constraints to a pattern. 
+ * 
+ * eg: <code>Person(age < 42)</code> would be covered by this widget.
+ *  
+ * @author Michael Neale
+ */
+public class PatternWidget extends Composite {
+
+    private final FlexTable layout;
+    private String factTypeSelected;
+    private FactTypeWidget factWidget;
+    private SuggestionCompletionEngine completions;
+    
+    public PatternWidget(SuggestionCompletionEngine com, String factType) {
+        
+        this.completions = com;
+        layout = new FlexTable();
+        this.factTypeSelected = factType;
+                             
+        layout.setStyleName( "model-builder-Background" );
+        
+        
+        factWidget = new FactTypeWidget(factTypeSelected, com, new Command() {
+            public void execute() {
+                selectedFactType();
+            }            
+        });
+        layout.setWidget( 0, 0, factWidget );
+        layout.getFlexCellFormatter().setVerticalAlignment( 0, 0, HasVerticalAlignment.ALIGN_MIDDLE );
+       
+        //TODO: add loading up of existing data if its passed in here.
+        
+        
+        initWidget( layout );
+        
+    }
+
+
+    protected void selectedFactType() {
+        factTypeSelected = factWidget.getFactType();   
+        layout.setWidget(0, 1, new ConstraintWidget(factTypeSelected, completions, new ArrayList()) );
+    }
+    
+}

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/ui/RuleScorecardWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/ui/RuleScorecardWidget.java	2006-11-27 17:57:22 UTC (rev 7853)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/modeldriven/ui/RuleScorecardWidget.java	2006-11-27 17:58:05 UTC (rev 7854)
@@ -0,0 +1,56 @@
+package org.drools.brms.client.modeldriven.ui;
+
+import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+
+import com.google.gwt.user.client.ui.ClickListener;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.FlexTable;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.VerticalPanel;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * This is the parent widget that contains the model based rule builder.
+ * 
+ * @author Michael Neale
+ *
+ */
+public class RuleScorecardWidget extends Composite {
+
+    private FlexTable layout;
+    private SuggestionCompletionEngine completions;
+    
+    public RuleScorecardWidget(SuggestionCompletionEngine com) {
+        this.completions = com;
+        
+        layout = new FlexTable();
+        layout.setStyleName( "model-builder-Background" );
+        
+        initWidget( layout );
+        final VerticalPanel lhsPanel = new VerticalPanel();
+        
+        Image addPattern = new Image( "images/new_item.gif" );
+        addPattern.addClickListener( new ClickListener() {
+
+            public void onClick(Widget w) {
+                lhsPanel.add( new PatternWidget(completions, "") );
+                
+            }
+            
+        });
+        
+        
+        
+        layout.setWidget( 0, 0, new Label("IF") );
+        layout.setWidget( 0, 2, addPattern );
+        
+        layout.setWidget( 1, 1, lhsPanel );
+        
+        
+    }
+    
+    
+    
+    
+}

Added: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/client/modeldriven/SuggestionCompletionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/client/modeldriven/SuggestionCompletionTest.java	2006-11-27 17:57:22 UTC (rev 7853)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/client/modeldriven/SuggestionCompletionTest.java	2006-11-27 17:58:05 UTC (rev 7854)
@@ -0,0 +1,131 @@
+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.load(
+                     new HashMap() {{
+                         put( "Person", new String[] {"age", "name"} );
+                         put( "Vehicle", new String[] {"type", "make"} );
+                     }},
+                     new HashMap() {{
+                         put( "Person.name", new String[] {"==", "!="});
+                         put( "Person.age", new String[] {"==", "!=", "<", ">"});
+                         
+                     }},
+                     new HashMap() {{
+                         put("Vehicle.make", new String[] {"|="});  
+                     }},
+                     new HashMap() {{
+                         put("foo", new String[] {"bar", "baz"});
+                     }}
+        );
+        
+        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(2, c.length);
+        assertEquals("==", c[0]);
+        assertEquals( "!=", c[1] );
+        
+        
+        c = com.getOperatorCompletions( "Person", "age" );
+        assertEquals(4, c.length);
+        assertEquals(c[0], "==");
+        assertEquals(c[1], "!=");
+        assertEquals(c[2], "<" );
+        assertEquals(c[3], ">" );
+
+        c = com.getConnectiveOperatorCompletions( "Vehicle", "make" );
+        assertEquals(1, c.length);
+        assertEquals("|=", c[0]);
+        
+        c = com.getGlobalVariables();
+        assertEquals(1, c.length);
+        assertEquals("foo", c[0]);
+        
+        c = com.getFieldCompletionsForGlobalVariable( "foo" );
+        assertEquals(2, c.length);
+        assertEquals("bar", c[0]);
+        assertEquals("baz", c[1]);
+        
+        com.addBoundFact( "myFact", "Person" );
+        
+        c = com.getFieldCompletionsForBoundFact( "myFact" );
+        assertEquals(2, c.length);
+        assertEquals("age", c[0]);
+        assertEquals("name", c[1]);
+        
+    }
+    
+    public void testAdd() {
+        SuggestionCompletionEngine com = new SuggestionCompletionEngine();
+        com.addFact( "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 testBoundVariables() {
+        SuggestionCompletionEngine com = new SuggestionCompletionEngine();
+        com.addBoundFact( "foo", "Person" );
+        com.addBoundFact( "bar", "Vehicle" );
+        assertEquals(0, com.getBoundFields().length);
+        assertEquals(2, com.getBoundFacts().length);
+        
+        com.addBoundField( "x" );
+        assertEquals(1, com.getBoundFields().length);
+        
+        assertEquals( "foo", com.getBoundFacts()[0]);
+        assertEquals( "bar", com.getBoundFacts()[1]);
+        
+        assertEquals( "x", com.getBoundFields()[0]);
+        
+        
+        
+    }
+    
+    
+    
+}

Added: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/client/modeldriven/package.html
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/client/modeldriven/package.html	2006-11-27 17:57:22 UTC (rev 7853)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/client/modeldriven/package.html	2006-11-27 17:58:05 UTC (rev 7854)
@@ -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




More information about the jboss-svn-commits mailing list