[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