[jboss-svn-commits] JBL Code SVN: r32498 - in labs/jbossrules/trunk: drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/dt and 19 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Apr 9 18:20:53 EDT 2010


Author: baunax
Date: 2010-04-09 18:20:49 -0400 (Fri, 09 Apr 2010)
New Revision: 32498

Added:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/dt/TemplateModel.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ModellerWidgetFactory.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModelEditor.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModellerWidgetFactory.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleTemplateEditor.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/TemplateModellerWidgetFactory.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/public/images/new_template.gif
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/contenthandler/BaseXStreamContentHandler.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/contenthandler/TemplateModelHandler.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/modeldriven/
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/modeldriven/template/
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/modeldriven/template/TemplateModelDataProvider.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/util/BRDRTPersistence.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/util/BRDRTXMLPersistence.java
   labs/jbossrules/trunk/drools-guvnor/src/main/webapp/org.drools.guvnor.Guvnor/images/new_template.gif
   labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/util/BRDRTPersistenceTest.java
   labs/jbossrules/trunk/drools-templates/src/main/java/org/drools/template/objects/ArrayDataProvider.java
Removed:
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/modeldriven/template/
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/modeldriven/template/TemplateModelDataProvider.java
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/brl/ActionFieldValue.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/brl/ISingleFieldConstraint.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/brl/RuleModel.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/brl/SingleFieldConstraint.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/server/util/BRDRLPersistence.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/server/util/BRXMLPersistence.java
   labs/jbossrules/trunk/drools-guvnor/pom.xml
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/AssetFormats.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/decisiontable/GuidedDecisionTableWidget.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/PackagesPanel.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants.properties
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants_es_ES.properties
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ActionInsertFactWidget.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ActionValueEditor.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditor.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FactPatternWidget.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModeller.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/qa/FieldDataConstraintEditor.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/ActionToolbar.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/EditorLauncher.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/WorkingSetEditor.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/contenthandler/BRLContentHandler.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/contenthandler/WorkingSetHandler.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/util/RowLoader.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/util/TestEnvironmentSessionHelper.java
   labs/jbossrules/trunk/drools-guvnor/src/main/resources/contenthandler.properties
Log:
added brl templates using drools-templates.
merge with https://svn.jboss.org/repos/labs/labs/jbossrules/branches/guvnor_rules_templates_baunax_esteban_diega

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/brl/ActionFieldValue.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/brl/ActionFieldValue.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/brl/ActionFieldValue.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -46,6 +46,11 @@
     public static final int TYPE_PREDICATE = 5;
 
     /**
+     * This is for a field to be a placeholder for a template
+     */
+    public static final int TYPE_TEMPLATE = 7;
+    
+    /**
      * This is the datatype archectype (eg String, Numeric etc).
      */
     public String type;
@@ -61,8 +66,6 @@
     public ActionFieldValue() {
     }
 
-
-
     /**
      * This will return true if the value is really a "formula" - in
      * the sense of like an excel spreadsheet.
@@ -72,14 +75,7 @@
      *
      */
     public boolean isFormula() {
-        if ( this.value == null ) {
-            return false;
-        }
-        if ( this.value.trim().startsWith( "=" ) ) {
-            return true;
-        } else {
-            return false;
-        }
+        return this.value != null && this.value.trim().startsWith( "=" );
     }
 
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/brl/ISingleFieldConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/brl/ISingleFieldConstraint.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/brl/ISingleFieldConstraint.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -46,6 +46,11 @@
      * The fieldName and fieldBinding is not used in the case of a predicate.
      */
     public static final int TYPE_PREDICATE = 5;
+    
+    /**
+     * This is for a field to be a placeholder for a template
+     */
+    public static final int TYPE_TEMPLATE = 7;
 
     public String           value;
     public int              constraintValueType;

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/brl/RuleModel.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/brl/RuleModel.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/brl/RuleModel.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -5,9 +5,7 @@
 import java.util.Collections;
 import java.util.List;
 
-public class RuleModel
-        implements
-        PortableObject {
+public class RuleModel implements PortableObject {
 
     /**
      * This name is generally not used - the asset name or the
@@ -21,6 +19,8 @@
     public IPattern[] lhs = new IPattern[0];
     public IAction[] rhs = new IAction[0];
 
+    public RuleModel() {
+	}
     /**
      * This will return the fact pattern that a variable is bound to.
      *
@@ -562,16 +562,16 @@
     public boolean hasDSLSentences() {
 
         if (this.lhs != null) {
-            for (int i = 0; i < this.lhs.length; i++) {
-                if (lhs[i] instanceof DSLSentence) {
+            for (IPattern pattern : this.lhs) {
+                if (pattern instanceof DSLSentence) {
                     return true;
                 }
             }
         }
 
         if (this.rhs != null) {
-            for (int i = 0; i < this.rhs.length; i++) {
-                if (rhs[i] instanceof DSLSentence) {
+            for (IAction action : this.rhs) {
+                if (action instanceof DSLSentence) {
                     return true;
                 }
             }

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/brl/SingleFieldConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/brl/SingleFieldConstraint.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/brl/SingleFieldConstraint.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -2,7 +2,7 @@
 
 
 /**
- * This represents a contraint on a fact - involving a SINGLE FIELD.
+ * This represents a constraint on a fact - involving a SINGLE FIELD.
  * 
  * Can also include optional "connective constraints" that extend the options for matches.
  * @author Michael Neale
@@ -17,7 +17,7 @@
 
     /**
      * Used instead of "value" when constraintValueType = TYPE_EXPR_BUILDER.
-     * Eteban Aliverti
+     * Esteban Aliverti
      */
     private ExpressionFormLine expression = new ExpressionFormLine();
 
@@ -62,11 +62,7 @@
      * Returns true of there is a field binding.
      */
     public boolean isBound() {
-        if ( this.fieldBinding != null && !"".equals( this.fieldBinding ) ) {
-            return true;
-        } else {
-            return false;
-        }
+        return this.fieldBinding != null && this.fieldBinding.length() > 0 ;
     }
 
     public ExpressionFormLine getExpression() {
@@ -76,7 +72,4 @@
     public void setExpression(ExpressionFormLine expression) {
         this.expression = expression;
     }
-
-    
-
 }

Copied: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/dt/TemplateModel.java (from rev 32495, labs/jbossrules/branches/guvnor_rules_templates_baunax_esteban_diega/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/dt/TemplateModel.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/dt/TemplateModel.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/dt/TemplateModel.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -0,0 +1,138 @@
+package org.drools.guvnor.client.modeldriven.dt;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.guvnor.client.modeldriven.brl.ActionFieldValue;
+import org.drools.guvnor.client.modeldriven.brl.ActionInsertFact;
+import org.drools.guvnor.client.modeldriven.brl.FactPattern;
+import org.drools.guvnor.client.modeldriven.brl.FieldConstraint;
+import org.drools.guvnor.client.modeldriven.brl.IAction;
+import org.drools.guvnor.client.modeldriven.brl.IPattern;
+import org.drools.guvnor.client.modeldriven.brl.ISingleFieldConstraint;
+import org.drools.guvnor.client.modeldriven.brl.PortableObject;
+import org.drools.guvnor.client.modeldriven.brl.RuleModel;
+
+public class TemplateModel extends RuleModel implements PortableObject {
+	private Map<String, List<String>> table = new HashMap<String, List<String>>();
+	private int rowsCount = 0;
+	
+	public int getColsCount() {
+		return getInterpolationVariables().size();
+	}
+	
+	public int getRowsCount() {
+		return rowsCount;
+	}
+
+	public void addRow(String[] row) {
+		Map<String, Integer> vars = getInterpolationVariables();
+		if (row.length != vars.size()) {
+			throw new IllegalArgumentException("Invalid numbers of columns: " + 
+					row.length + " expected: " + vars.size());
+		}
+		for (Map.Entry<String, Integer> entry : vars.entrySet()) {
+			List<String> list = table.get(entry.getKey());
+			if (list == null) {
+				list = new ArrayList<String>();
+				table.put(entry.getKey(), list);
+			}
+			if (rowsCount != list.size() ) {
+				throw new IllegalArgumentException("invalid list size for " + entry.getKey() + ", expected: " + rowsCount + " was: " + list.size());
+			}
+			list.add(row[entry.getValue()]);
+		}
+		rowsCount++;
+	}
+	
+	public void removeRow(int row) {
+		if (row >= 0 && row < rowsCount) {
+			for (List<String> col : table.values()) {
+				col.remove(row);
+			}
+			rowsCount--;
+		} else {
+			throw new ArrayIndexOutOfBoundsException(row);
+		}
+	}
+	
+	public void putInSync() {
+		Map<String, Integer> vars = getInterpolationVariables();
+		table.keySet().retainAll(vars.keySet());
+		
+		vars.keySet().removeAll(table.keySet());
+		
+		List<String> aux = new ArrayList<String>(rowsCount);
+		for (int i = 0; i < rowsCount; i++) {
+			aux.add("");
+		}
+		for (String varName : vars.keySet()) {
+			table.put(varName, new ArrayList<String>(aux));
+		}
+	}
+	
+	public String[] getInterpolationVariablesList() {
+		Map<String, Integer> vars = getInterpolationVariables();
+		String[] ret = new String[vars.size()];
+		for (Map.Entry<String, Integer> entry: vars.entrySet()) {
+			ret[entry.getValue()] = entry.getKey();
+		}
+		return ret;
+	}
+	
+	public Map<String, Integer> getInterpolationVariables() {
+		Map<String, Integer> result = new HashMap<String, Integer>();
+        for (IPattern pattern : this.lhs) {
+            if (pattern instanceof FactPattern) {
+                FactPattern fact = (FactPattern) pattern;
+                for (FieldConstraint fc : fact.getFieldConstraints()) {
+                    if (fc instanceof ISingleFieldConstraint) {
+                        ISingleFieldConstraint con = (ISingleFieldConstraint) fc;
+                        if (ISingleFieldConstraint.TYPE_TEMPLATE == con.constraintValueType && !result.containsKey(con.value)) {
+                            result.put(con.value, result.size());
+                        }
+                    }
+                }
+            }
+        }
+        for (IAction action : this.rhs) {
+            if (action instanceof ActionInsertFact) {
+                ActionInsertFact fact = (ActionInsertFact) action;
+                for (ActionFieldValue afv : fact.fieldValues) {
+                	if (afv.nature == ActionFieldValue.TYPE_TEMPLATE && !result.containsKey(afv.value)) {
+                		result.put(afv.value, result.size());
+                	}
+                }
+            }
+        }
+        return result;
+	}
+
+	public Map<String, List<String>> getTable() {
+		return table;
+	}
+
+	public String[][] getTableAsArray() {
+		if (rowsCount <= 0) {
+			return new String[0][0];
+		}
+		String[][] ret = new String[rowsCount][table.size()];
+		Map<String, Integer> vars = getInterpolationVariables();
+		for (Map.Entry<String, Integer> entry : vars.entrySet()) {
+			String varName = entry.getKey();
+			int idx = entry.getValue();
+			for (int row = 0; row < rowsCount; row++) {
+				ret[row][idx] = table.get(varName).get(row);
+			}
+		}
+		return ret;
+	}
+
+	public void setValue(String varName, int rowIndex, String newValue) {
+		getTable().get(varName).set(rowIndex, newValue);
+	}
+	
+	
+}

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/server/util/BRDRLPersistence.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/server/util/BRDRLPersistence.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/server/util/BRDRLPersistence.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -13,7 +13,7 @@
 
     private static final BRLPersistence INSTANCE = new BRDRLPersistence();
 
-    private BRDRLPersistence() {
+    protected BRDRLPersistence() {
     }
 
     public static BRLPersistence getInstance() {
@@ -28,15 +28,14 @@
      * .client.modeldriven.brl.RuleModel)
      */
     public String marshal(RuleModel model) {
-        boolean isDSLEnhanced = model.hasDSLSentences();
+        return marshalRule(model);
+    }
+    
+    protected String marshalRule(RuleModel model) {
+    	boolean isDSLEnhanced = model.hasDSLSentences();
 
         StringBuilder buf = new StringBuilder();
-        buf.append("rule \"" + model.name + "\"");
-        if (null != model.parentName && model.parentName.length() > 0) {
-            buf.append(" extends \"" + model.parentName + "\"\n");
-        } else {
-            buf.append("\n");
-        }
+        this.marshalHeader(model, buf);
         this.marshalMetadata(buf, model);
         this.marshalAttributes(buf, model);
 
@@ -44,13 +43,28 @@
         this.marshalLHS(buf, model, isDSLEnhanced);
         buf.append("\tthen\n");
         this.marshalRHS(buf, model, isDSLEnhanced);
-        buf.append("end\n");
+        this.marshalFooter(buf);
         return buf.toString();
-    }
+	}
 
-    /*
-     * (non-Javadoc)
-     *
+	protected void marshalFooter(StringBuilder buf) {
+		buf.append("end\n");
+	}
+
+	protected void marshalHeader(RuleModel model, StringBuilder buf) {
+		buf.append("rule \"" + marshalRuleName(model) + "\"");
+        if (null != model.parentName && model.parentName.length() > 0) {
+            buf.append(" extends \"" + model.parentName + "\"\n");
+        } else {
+            buf.append('\n');
+        }
+	}
+
+	protected String marshalRuleName(RuleModel model) {
+		return model.name;
+	}
+
+    /**
      * @see
      * org.drools.guvnor.server.util.BRLPersistence#unmarshal(java.lang.String)
      */
@@ -109,22 +123,22 @@
      */
     private void marshalLHS(StringBuilder buf, RuleModel model,
             boolean isDSLEnhanced) {
-        IPattern[] lhs = model.lhs;
-        LHSPatternVisitor visitor = new LHSPatternVisitor(isDSLEnhanced, buf);
-        for (int i = 0; i < lhs.length; i++) {
-            final IPattern cond = lhs[i];
-            visitor.visit(cond);
-        }
+		if (model.lhs != null) {
+			LHSPatternVisitor visitor = new LHSPatternVisitor(isDSLEnhanced, buf);
+			for (IPattern cond : model.lhs) {
+				visitor.visit(cond);
+			}
+		}
     }
 
     private void marshalRHS(StringBuilder buf, RuleModel model,
             boolean isDSLEnhanced) {
-        IAction[] rhs = model.rhs;
-        RHSActionVisitor visitor = new RHSActionVisitor(isDSLEnhanced, buf);
-        for (int i = 0; i < rhs.length; i++) {
-            final IAction action = rhs[i];
-            visitor.visit(action);
-        }
+		if (model.rhs != null) {
+			RHSActionVisitor visitor = new RHSActionVisitor(isDSLEnhanced, buf);
+			for (IAction action : model.rhs) {
+				visitor.visit(action);
+			}
+		}
     }
 
     public static class LHSPatternVisitor extends ReflectiveVisitor {
@@ -438,6 +452,15 @@
                         buf.append(expression.getText());
                     }
                     break;
+                case ISingleFieldConstraint.TYPE_TEMPLATE:
+                	if (operator.equals("in")) {
+                        buf.append(value);
+                    } else {
+                        buf.append("\"@{");
+                        buf.append(value);
+                        buf.append("}\"");
+                    }
+                	break;
                 default:
                     buf.append(value);
             }
@@ -601,15 +624,22 @@
                     buf.append(fieldValues[i].value.substring(1));
                 } else if (SuggestionCompletionEngine.TYPE_STRING.equals(fieldValues[i].type)) {
                     buf.append("\"");
-                    buf.append(fieldValues[i].value);
+                    buf.append(generateFieldValue(fieldValues[i]));
                     buf.append("\"");
                 } else {
-                    buf.append(fieldValues[i].value);
+                    buf.append(generateFieldValue(fieldValues[i]));
                 }
                 buf.append(" );\n");
             }
         }
 
+		private String generateFieldValue(final ActionFieldValue fieldValue) {
+			if (fieldValue.nature == ActionFieldValue.TYPE_TEMPLATE) {
+				return "@{" + fieldValue.value + "}";
+			}
+			return fieldValue.value;
+		}
+
         private void generateSetMethodCallsMethod(final ActionCallMethod action,
                 final ActionFieldValue[] fieldValues) {
             buf.append("\t\t");

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/server/util/BRXMLPersistence.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/server/util/BRXMLPersistence.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/server/util/BRXMLPersistence.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -19,7 +19,7 @@
     private XStream                     xt;
     private static final BRLPersistence INSTANCE = new BRXMLPersistence();
 
-    private BRXMLPersistence() {
+    protected BRXMLPersistence() {
         this.xt = new XStream( new DomDriver() );
 
         this.xt.alias( "rule",
@@ -108,12 +108,9 @@
      * @see org.drools.guvnor.server.util.BRLPersistence#toModel(java.lang.String)
      */
     public RuleModel unmarshal(final String xml) {
-        if ( xml == null ) {
-            return new RuleModel();
+        if ( xml == null || xml.trim().length() == 0) {
+            return createEmptyModel();
         }
-        if ( xml.trim().equals( "" ) ) {
-            return new RuleModel();
-        }
         RuleModel rm = (RuleModel) this.xt.fromXML( xml );
         //Fixme , hack for a upgrade to add Metadata
         if ( rm.metadataList == null ) {
@@ -125,6 +122,10 @@
         return rm;
     }
 
+	protected RuleModel createEmptyModel() {
+		return new RuleModel();
+	}
+
     /**
      * 
      * The way method calls are done changed after 5.0.0.CR1 so every rule done before that needs to be updated.

Modified: labs/jbossrules/trunk/drools-guvnor/pom.xml
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/pom.xml	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-guvnor/pom.xml	2010-04-09 22:20:49 UTC (rev 32498)
@@ -160,6 +160,10 @@
       </dependency>
       <dependency>
          <groupId>org.drools</groupId>
+         <artifactId>drools-templates</artifactId>
+      </dependency>
+      <dependency>
+         <groupId>org.drools</groupId>
          <artifactId>drools-doc</artifactId>
       </dependency>
       <dependency>

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/AssetFormats.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/AssetFormats.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/AssetFormats.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -76,10 +76,12 @@
 
     public static final String WORKING_SET = "workingset";
     
+    public static final String RULE_TEMPLATE = "template";
+    
     /**
      * The following group the assets together for lists, helpers etc...
      */
-    public static final String[] BUSINESS_RULE_FORMATS = new String[]{AssetFormats.BUSINESS_RULE, AssetFormats.DSL_TEMPLATE_RULE, AssetFormats.DECISION_SPREADSHEET_XLS, AssetFormats.DECISION_TABLE_GUIDED};
+    public static final String[] BUSINESS_RULE_FORMATS = new String[]{AssetFormats.BUSINESS_RULE, AssetFormats.DSL_TEMPLATE_RULE, AssetFormats.DECISION_SPREADSHEET_XLS, AssetFormats.DECISION_TABLE_GUIDED, AssetFormats.RULE_TEMPLATE};
 
     /**
      * These define assets that are really package level "things". Used to decide when to flush any caches.
@@ -91,13 +93,11 @@
      * Package dependencies are needed before the package is validated, and any rule assets are processed.
      */
     public static boolean isPackageDependency(String format) {
-        for ( int i = 0; i < PACKAGE_DEPENCENCIES.length; i++ ) {
-            if (PACKAGE_DEPENCENCIES[i].equals( format )) {
+        for (String dep : PACKAGE_DEPENCENCIES) {
+            if (dep.equals( format )) {
                 return true;
             }
         }
         return false;
     }
-
-
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/decisiontable/GuidedDecisionTableWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/decisiontable/GuidedDecisionTableWidget.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/decisiontable/GuidedDecisionTableWidget.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -98,7 +98,7 @@
     private VerticalPanel              conditionsConfigWidget;
     private String                     packageName;
     private VerticalPanel              actionsConfigWidget;
-    private Map                        colMap;
+    private Map<String, DTColumnConfig> colMap;
     private SuggestionCompletionEngine sce;
     private GroupingStore              store;
     private Constants                  constants = ((Constants) GWT.create( Constants.class ));
@@ -152,44 +152,35 @@
 
         list.addItem( constants.Description(),
                       "desc" ); //NON-NLS
-        if ( dt.getMetadataCols() == null ) {
-            dt.setMetadataCols( new ArrayList<MetadataCol>() );
-        }
-        for ( Iterator iterator = dt.getMetadataCols().iterator(); iterator.hasNext(); ) {
-            MetadataCol c = (MetadataCol) iterator.next();
-            list.addItem( c.attr,
-                          c.attr );
-            if ( c.attr.equals( dt.groupField ) ) {
-                list.setSelectedIndex( list.getItemCount() - 1 );
-            }
-        }
-        for ( Iterator iterator = dt.attributeCols.iterator(); iterator.hasNext(); ) {
-            AttributeCol c = (AttributeCol) iterator.next();
-            list.addItem( c.attr,
-                          c.attr );
-            if ( c.attr.equals( dt.groupField ) ) {
-                list.setSelectedIndex( list.getItemCount() - 1 );
-            }
-        }
-        for ( Iterator iterator = dt.conditionCols.iterator(); iterator.hasNext(); ) {
-            ConditionCol c = (ConditionCol) iterator.next();
-            list.addItem( c.header,
-                          c.header );
-            if ( c.header.equals( dt.groupField ) ) {
-                list.setSelectedIndex( list.getItemCount() - 1 );
-            }
-        }
-        for ( Iterator iterator = dt.actionCols.iterator(); iterator.hasNext(); ) {
-            ActionCol c = (ActionCol) iterator.next();
-            list.addItem( c.header,
-                          c.header );
-            if ( c.header.equals( dt.groupField ) ) {
-                list.setSelectedIndex( list.getItemCount() - 1 );
-            }
-        }
+		if (dt.getMetadataCols() == null) {
+			dt.setMetadataCols(new ArrayList<MetadataCol>());
+		}
+		for (MetadataCol c : dt.getMetadataCols()) {
+			list.addItem(c.attr, c.attr);
+			if (c.attr.equals(dt.groupField)) {
+				list.setSelectedIndex(list.getItemCount() - 1);
+			}
+		}
+		for (AttributeCol c : dt.attributeCols) {
+			list.addItem(c.attr, c.attr);
+			if (c.attr.equals(dt.groupField)) {
+				list.setSelectedIndex(list.getItemCount() - 1);
+			}
+		}
+		for (ConditionCol c : dt.conditionCols) {
+			list.addItem(c.header, c.header);
+			if (c.header.equals(dt.groupField)) {
+				list.setSelectedIndex(list.getItemCount() - 1);
+			}
+		}
+		for (ActionCol c : dt.actionCols) {
+			list.addItem(c.header, c.header);
+			if (c.header.equals(dt.groupField)) {
+				list.setSelectedIndex(list.getItemCount() - 1);
+			}
+		}
 
-        list.addItem( constants.none(),
-                      "" );
+		list.addItem(constants.none(), "");
         if ( dt.groupField == null ) {
             list.setSelectedIndex( list.getItemCount() - 1 );
         }
@@ -220,8 +211,7 @@
 
     private void refreshActionsWidget() {
         this.actionsConfigWidget.clear();
-        for ( int i = 0; i < dt.actionCols.size(); i++ ) {
-            ActionCol c = (ActionCol) dt.actionCols.get( i );
+        for (ActionCol c : dt.actionCols) {
             HorizontalPanel hp = new HorizontalPanel();
             hp.add( removeAction( c ) );
             hp.add( editAction( c ) );
@@ -229,7 +219,6 @@
             actionsConfigWidget.add( hp );
         }
         actionsConfigWidget.add( newAction() );
-
     }
 
     private Widget editAction(final ActionCol c) {
@@ -469,8 +458,7 @@
             hp.add( new SmallLabel( constants.Metadata() ) );
             attributeConfigWidget.add( hp );
         }
-        for ( int i = 0; i < dt.getMetadataCols().size(); i++ ) {
-            MetadataCol at = (MetadataCol) dt.getMetadataCols().get( i );
+        for (MetadataCol at : dt.getMetadataCols()) {
             HorizontalPanel hp = new HorizontalPanel();
             hp.add( new HTML( "&nbsp;&nbsp;&nbsp;&nbsp;" ) ); //NON-NLS
             hp.add( removeMeta( at ) );
@@ -484,9 +472,8 @@
             attributeConfigWidget.add( hp );
         }
 
-        for ( int i = 0; i < dt.attributeCols.size(); i++ ) {
-
-            final AttributeCol at = dt.attributeCols.get( i );
+        for (AttributeCol atc : dt.attributeCols) {
+        	final AttributeCol at = atc;
             HorizontalPanel hp = new HorizontalPanel();
 
             hp.add( new SmallLabel( at.attr ) );
@@ -578,9 +565,9 @@
                                                }
 
                                                private boolean hasAttribute(String at,
-                                                                            List attributeCols) {
-                                                   for ( Iterator iterator = attributeCols.iterator(); iterator.hasNext(); ) {
-                                                       AttributeCol c = (AttributeCol) iterator.next();
+                                                                            List<AttributeCol> attributeCols) {
+                                                   for ( Iterator<AttributeCol> iterator = attributeCols.iterator(); iterator.hasNext(); ) {
+                                                       AttributeCol c = iterator.next();
                                                        if ( c.attr.equals( at ) ) {
                                                            return true;
                                                        }
@@ -713,7 +700,7 @@
 
         fds = new FieldDef[dt.getMetadataCols().size() + dt.attributeCols.size() + dt.actionCols.size() + dt.conditionCols.size() + 2]; //its +2 as we have counter and description data
 
-        colMap = new HashMap();
+        colMap = new HashMap<String, DTColumnConfig>();
 
         fds[0] = new IntegerFieldDef( "num" ); //NON-NLS
         fds[1] = new StringFieldDef( "desc" ); //NON-NLS
@@ -770,8 +757,7 @@
 
                 }
             };
-            colMap.put( attr.attr,
-                        attr );
+            colMap.put( attr.attr, attr );
             colCount++;
         }
 
@@ -892,7 +878,7 @@
  					  boolean hidden) {
  				     final String dta = cm.getDataIndex(colIndex);        		
          			if (colMap.containsKey(dta)) {
-         				DTColumnConfig col = (DTColumnConfig) colMap.get(dta);
+         				DTColumnConfig col = colMap.get(dta);
          				col.hideColumn = hidden;
          			}
          		}  	
@@ -964,7 +950,7 @@
                 final String dataIdx = grid.getColumnModel().getDataIndex( colIndex );
                 final Record r = store.getAt( rowIndex );
                 String val = r.getAsString( dataIdx );
-                DTColumnConfig colConf = (DTColumnConfig) colMap.get( dataIdx );
+                DTColumnConfig colConf = colMap.get( dataIdx );
                 String[] vals = dt.getValueList( colConf,
                                                  getSCE() );
                 if ( vals.length == 0 ) {
@@ -994,7 +980,7 @@
                     dt.descriptionWidth = newSize;
                 } else {
                     if ( colMap.containsKey( dta ) ) {
-                        DTColumnConfig col = (DTColumnConfig) colMap.get( dta );
+                        DTColumnConfig col = colMap.get( dta );
                         col.width = newSize;
                     }
                 }
@@ -1294,18 +1280,15 @@
 
     }
 
-    private void changeRowPositions(Record from,
-                                    Record to) {
-        int fromNum = from.getAsInteger( "num" );
-        int toNum = to.getAsInteger( "num" );
-        from.set( "num",
-                  toNum );
-        to.set( "num",
-                fromNum );
+	private void changeRowPositions(Record from, Record to) {
+		int fromNum = from.getAsInteger("num");
+		int toNum = to.getAsInteger("num");
+		from.set("num", toNum);
+		to.set("num", fromNum);
 
-        scrapeData( -1 );
+		scrapeData(-1);
 
-        refreshGrid();
-    }
+		refreshGrid();
+	}
 
 }

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/PackagesPanel.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/PackagesPanel.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/PackagesPanel.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -201,6 +201,13 @@
             }
         }, "images/refresh.gif")); //NON-NLS
 
+        m.addItem(new Item(constants.NewRuleTemplate(), new BaseItemListenerAdapter() {
+            @Override
+            public void onClick(BaseItem item, EventObject e) {
+                launchWizard(AssetFormats.RULE_TEMPLATE, constants.NewRuleTemplate(), true);
+            }
+        }, "images/new_template.gif")); //NON-NLS
+        
         return m;
     }
 

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -2081,4 +2081,6 @@
     String EditRulesVerificationConfiguration();
     String AutomaticVerification();
     String Enabled();
+    String NewRuleTemplate();
+    String TemplateKey();
 }

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants.properties
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants.properties	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants.properties	2010-04-09 22:20:49 UTC (rev 32498)
@@ -1021,3 +1021,5 @@
 EditRulesVerificationConfiguration=Edit Rules Verification Configuration
 AutomaticVerification=Automatic Verification
 Enabled=Enabled
+NewRuleTemplate=New rule template
+TemplateKey=Template key
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants_es_ES.properties
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants_es_ES.properties	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants_es_ES.properties	2010-04-09 22:20:49 UTC (rev 32498)
@@ -926,4 +926,6 @@
 RulesVerificationManager=Administraci\u00F3n de Verificaci\u00F3n de Reglas
 EditRulesVerificationConfiguration=Editar la Configuraci\u00F3n de la Verificaci\u00F3n de Reglas
 AutomaticVerification=Verificaci\u00F3n Autom\u00E1tica
-Enabled=Activado
\ No newline at end of file
+Enabled=Activado
+NewRuleTemplate=Nueva plantilla de regla
+TemplateKey=Clave en plantilla
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ActionInsertFactWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ActionInsertFactWidget.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ActionInsertFactWidget.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -47,16 +47,18 @@
     private final String factType;
     private Constants constants = GWT.create(Constants.class);
     private boolean readOnly;
+	private boolean template;
 
     public ActionInsertFactWidget(RuleModeller mod, ActionInsertFact set) {
         this(mod, set, null);
     }
 
-    public ActionInsertFactWidget(RuleModeller mod, ActionInsertFact set,Boolean readOnly) {
+    public ActionInsertFactWidget(RuleModeller mod, ActionInsertFact set,Boolean readOnly, boolean template) {
         super(mod);
         this.model = set;
         this.layout = new DirtyableFlexTable();
         this.factType = set.factType;
+        this.template = template;
 
         SuggestionCompletionEngine completions = this.getModeller().getSuggestionCompletions();
         this.fieldCompletions = completions.getFieldCompletions( FieldAccessorsAndMutators.MUTATOR,
@@ -77,9 +79,14 @@
         doLayout();
 
         initWidget(this.layout);
+    
+	}
+
+    public ActionInsertFactWidget(RuleModeller mod, ActionInsertFact set,Boolean readOnly) {
+		this(mod, set, readOnly, false);
     }
 
-    private void doLayout() {
+	private void doLayout() {
         layout.clear();
         layout.setWidget( 0, 0, getAssertLabel() );
         layout.setWidget( 1, 0, new HTML("&nbsp;&nbsp;&nbsp;&nbsp;"));
@@ -117,7 +124,7 @@
     private Widget valueEditor(final ActionFieldValue val) {
         SuggestionCompletionEngine completions = this.getModeller().getSuggestionCompletions();
     	DropDownData enums = completions.getEnums(this.factType, this.model.fieldValues, val.field);
-    	return new ActionValueEditor(val, enums,this.getModeller(),val.type,this.readOnly);
+    	return new ActionValueEditor(val, enums,this.getModeller(),val.type,this.readOnly, isTemplate());
     }
 
     private Widget fieldSelector(final ActionFieldValue val) {
@@ -211,6 +218,10 @@
         return this.readOnly;
     }
 
+	public boolean isTemplate() {
+		return template;
+	}
 
 
+
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ActionValueEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ActionValueEditor.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ActionValueEditor.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -1,9 +1,13 @@
 package org.drools.guvnor.client.modeldriven.ui;
 
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.ui.*;
-import org.drools.guvnor.client.common.*;
+import java.util.List;
+
+import org.drools.guvnor.client.common.DirtyableComposite;
+import org.drools.guvnor.client.common.DropDownValueChanged;
+import org.drools.guvnor.client.common.FieldEditListener;
+import org.drools.guvnor.client.common.FormStylePopup;
+import org.drools.guvnor.client.common.InfoPopup;
+import org.drools.guvnor.client.common.SmallLabel;
 import org.drools.guvnor.client.messages.Constants;
 import org.drools.guvnor.client.modeldriven.DropDownData;
 import org.drools.guvnor.client.modeldriven.SuggestionCompletionEngine;
@@ -11,7 +15,19 @@
 import org.drools.guvnor.client.modeldriven.brl.ActionInsertFact;
 import org.drools.guvnor.client.modeldriven.brl.FactPattern;
 
-import java.util.List;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.ChangeListener;
+import com.google.gwt.user.client.ui.ClickListener;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.KeyboardListener;
+import com.google.gwt.user.client.ui.ListBox;
+import com.google.gwt.user.client.ui.SimplePanel;
+import com.google.gwt.user.client.ui.TextBox;
+import com.google.gwt.user.client.ui.Widget;
 
 /**
  * This provides for editing of fields in the RHS of a rule.
@@ -28,20 +44,11 @@
     private RuleModeller model = null;
     private String variableType = null;
     private boolean readOnly;
+	private boolean template;
 
     public ActionValueEditor(final ActionFieldValue val,
             final DropDownData enums, boolean readOnly) {
-        this.readOnly = readOnly;
-        if (val.type.equals(SuggestionCompletionEngine.TYPE_BOOLEAN)) {
-            this.enums = DropDownData.create(new String[]{"true", "false"});
-        } else {
-            this.enums = enums;
-        }
-        this.root = new SimplePanel();
-        this.value = val;
-
-        refresh();
-        initWidget(root);
+        this(val, enums, null, null, readOnly, false);
     }
 
     public ActionValueEditor(final ActionFieldValue val,
@@ -56,10 +63,15 @@
         this(val, enums, model, variableType, false);
     }
 
+    public ActionValueEditor(ActionFieldValue val, DropDownData enums,
+			RuleModeller model, String type, boolean readOnly) {
+    	this(val, enums, model, type, readOnly, false);
+	}
+
     public ActionValueEditor(final ActionFieldValue val,
             final DropDownData enums,
             RuleModeller model,
-            String variableType, boolean readOnly) {
+            String variableType, boolean readOnly, boolean template) {
 
         this.readOnly = readOnly;
 
@@ -72,11 +84,12 @@
         this.value = val;
         this.model = model;
         this.variableType = variableType;
+        this.template = template;
         refresh();
         initWidget(root);
     }
 
-    private void refresh() {
+	private void refresh() {
         root.clear();
         if (enums != null && (enums.fixedList != null || enums.queryExpression != null)) {
             //enum
@@ -103,6 +116,10 @@
                 if (value.nature == ActionFieldValue.TYPE_VARIABLE) {
                     Widget list = boundVariable(value);
                     root.add(list);
+                } else if(value.nature == ActionFieldValue.TYPE_TEMPLATE){
+                	value.type = SuggestionCompletionEngine.TYPE_STRING;
+                    Widget box = boundTextBox(this.value);
+                    root.add(box);
                 } else {
                     //formula and literal
                     Widget box = boundTextBox(this.value);
@@ -273,7 +290,6 @@
         } else {
             Image clickme = new Image("images/edit.gif");
             clickme.addClickListener(new ClickListener() {
-
                 public void onClick(Widget w) {
                     showTypeChoice(w);
                 }
@@ -301,6 +317,23 @@
                 widgets(lit,
                 new InfoPopup(constants.Literal(),
                 constants.ALiteralValueMeansTheValueAsTypedInIeItsNotACalculation())));
+        
+        if(isTemplate()){
+	        Button templateButton = new Button(constants.TemplateKey(), new ClickListener() {
+	            public void onClick(Widget arg0) {
+	                value.nature = ActionFieldValue.TYPE_TEMPLATE;
+	                value.value = " ";
+	                makeDirty();
+	                refresh();
+	                form.hide();
+	            }
+	        });
+	        form.addAttribute(constants.TemplateKey() + ":",
+	                widgets(templateButton,
+	                new InfoPopup(constants.Literal(),
+	                constants.ALiteralValueMeansTheValueAsTypedInIeItsNotACalculation())));
+        }
+        
         form.addRow(new HTML("<hr/>"));
         form.addRow(new SmallLabel(constants.AdvancedSection()));
 
@@ -380,4 +413,8 @@
         h.add(popup);
         return h;
     }
+    
+    public boolean isTemplate(){
+    	return this.template;
+    }
 }

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditor.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditor.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -42,7 +42,6 @@
 import com.google.gwt.user.client.ui.SimplePanel;
 import com.google.gwt.user.client.ui.TextBox;
 import com.google.gwt.user.client.ui.Widget;
-import org.drools.guvnor.client.modeldriven.brl.ExpressionFormLine;
 
 /**
  * This is an editor for constraint values.
@@ -66,6 +65,7 @@
     private Constants constants = ((Constants) GWT.create(Constants.class));
     private String fieldType;
     private boolean readOnly;
+	private boolean template;
 
     /**
      * @param con The constraint being edited.
@@ -76,19 +76,30 @@
             RuleModeller modeller,
             String valueType /* eg is numeric */,
             boolean readOnly) {
+    	this(pattern, fieldName, con, modeller, valueType, readOnly, false);
+    }
+
+    public ConstraintValueEditor(FactPattern pattern, String fieldName,
+    		ISingleFieldConstraint con, RuleModeller modeller, String valueType,
+			boolean readOnly, boolean template) {
         this.pattern = pattern;
         this.fieldName = fieldName;
+        this.sce = modeller.getSuggestionCompletions();
         this.constraint = con;
-        this.readOnly = readOnly;
-        this.sce = modeller.getSuggestionCompletions();
-        valueType = sce.getFieldType(pattern.factType,
-                fieldName);
+        this.panel = new SimplePanel();
+        this.model = modeller.getModel();
+        this.modeller = modeller;
+        this.template = template;
+
+        valueType = sce.getFieldType(pattern.factType, fieldName);
         this.fieldType = valueType;
         if (SuggestionCompletionEngine.TYPE_NUMERIC.equals(valueType)) {
             this.numericValue = true;
         } else {
             this.numericValue = false;
         }
+        
+        this.readOnly = readOnly;
         if (SuggestionCompletionEngine.TYPE_BOOLEAN.equals(valueType)) {
             this.dropDownData = DropDownData.create(new String[]{"true", "false"}); //NON-NLS
         } else {
@@ -96,17 +107,14 @@
                     fieldName);
         }
 
-        this.model = modeller.getModel();
-        this.modeller = modeller;
-
-        panel = new SimplePanel();
         refreshEditor();
         initWidget(panel);
 
     }
 
-    private void refreshEditor() {
+	private void refreshEditor() {
         panel.clear();
+        Widget constraintWidget = null;
         if (constraint.constraintValueType == SingleFieldConstraint.TYPE_UNDEFINED) {
             Image clickme = new Image("images/edit.gif"); //NON-NLS
             clickme.addClickListener(new ClickListener() {
@@ -116,15 +124,15 @@
                             constraint);
                 }
             });
-            panel.add(clickme);
+            constraintWidget = clickme;
         } else {
             switch (constraint.constraintValueType) {
                 case SingleFieldConstraint.TYPE_LITERAL:
                     if (this.dropDownData != null) {
-                        panel.add(new EnumDropDownLabel(this.pattern,
+                        constraintWidget = new EnumDropDownLabel(this.pattern,
                                 this.fieldName,
                                 this.sce,
-                                this.constraint));
+                                this.constraint);
                     } else if (SuggestionCompletionEngine.TYPE_DATE.equals(this.fieldType)) {
 
                         DatePickerLabel datePicker = new DatePickerLabel(constraint.value);
@@ -140,32 +148,36 @@
                                 }
                             });
 
-                            panel.add(datePicker);
+                            constraintWidget =  datePicker;
                         } else {
-                            panel.add(new SmallLabel(this.constraint.value));
+                        	constraintWidget = new SmallLabel(this.constraint.value);
                         }
                     } else {
                         if (!this.readOnly) {
-                            panel.add(new DefaultLiteralEditor(this.constraint,
-                                    this.numericValue));
+                        	constraintWidget = new DefaultLiteralEditor(this.constraint,
+                                    this.numericValue);
                         } else {
-                            panel.add(new SmallLabel(this.constraint.value));
+                        	constraintWidget = new SmallLabel(this.constraint.value);
                         }
                     }
                     break;
                 case SingleFieldConstraint.TYPE_RET_VALUE:
-                    panel.add(returnValueEditor());
+                	constraintWidget = returnValueEditor();
                     break;
                 case SingleFieldConstraint.TYPE_EXPR_BUILDER:
-                    panel.add(expressionEditor());
+                	constraintWidget = expressionEditor();
                     break;
                 case SingleFieldConstraint.TYPE_VARIABLE:
-                    panel.add(variableEditor());
+                	constraintWidget = variableEditor();
                     break;
+                case ISingleFieldConstraint.TYPE_TEMPLATE:
+                	constraintWidget = new DefaultLiteralEditor(this.constraint, false);
+                    break;
                 default:
                     break;
             }
         }
+        panel.add(constraintWidget);
     }
 
     private Widget variableEditor() {
@@ -263,6 +275,22 @@
                 new InfoPopup(constants.LiteralValue(),
                 constants.LiteralValTip())));
 
+        if(isTemplate()){
+	        String templateKeyLabel = constants.TemplateKey();
+	        Button templateKeyButton = new Button(templateKeyLabel);
+	        templateKeyButton.addClickListener(new ClickListener() {
+	            public void onClick(Widget arg0) {
+	                con.constraintValueType = ISingleFieldConstraint.TYPE_TEMPLATE;
+	                doTypeChosen(form);
+	            }
+	        });
+	
+	        form.addAttribute(templateKeyLabel + ":",
+	                widgets(templateKeyButton,
+	                new InfoPopup(templateKeyLabel,
+	                constants.LiteralValTip())));
+        }
+        
         form.addRow(new HTML("<hr/>"));
         form.addRow(new SmallLabel(constants.AdvancedOptions()));
 
@@ -353,4 +381,8 @@
     public boolean isDirty() {
         return super.isDirty();
     }
+
+	public boolean isTemplate() {
+		return template;
+	}
 }

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FactPatternWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FactPatternWidget.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FactPatternWidget.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -56,6 +56,7 @@
     private Constants constants = ((Constants) GWT.create(Constants.class));
     private String customLabel;
     private boolean readOnly;
+	private boolean template;
 
     public FactPatternWidget(RuleModeller mod, IPattern p,
             boolean canBind) {
@@ -85,11 +86,22 @@
      */
     public FactPatternWidget(RuleModeller mod, IPattern p,
             String customLabel, boolean canBind, Boolean readOnly) {
+    	this(mod, p, customLabel, canBind, readOnly, false);
+    }
+
+    public FactPatternWidget(RuleModeller ruleModeller, IPattern pattern,
+			boolean canBind, Boolean readOnly, boolean template) {
+    	this(ruleModeller, pattern, null, canBind, readOnly, template);
+	}
+
+    public FactPatternWidget(RuleModeller mod, IPattern p,
+            String customLabel, boolean canBind, Boolean readOnly, boolean template) {
         super(mod);
         this.pattern = (FactPattern) p;
         this.completions = mod.getSuggestionCompletions();
         this.bindable = canBind;
-
+        this.template = template;
+        
         this.connectives = new Connectives();
         this.connectives.setCompletions(completions);
         this.connectives.setModeller(mod);
@@ -115,7 +127,7 @@
         formatter.setAlignment(0, 0, HasHorizontalAlignment.ALIGN_LEFT, HasVerticalAlignment.ALIGN_BOTTOM);
         formatter.setStyleName(0, 0, "modeller-fact-TypeHeader");
 
-        ArrayList sortedConst = sortConstraints(pattern.getFieldConstraints());
+        List<FieldConstraint> sortedConst = sortConstraints(pattern.getFieldConstraints());
         pattern.setFieldConstraints(sortedConst);
         drawConstraints(sortedConst);
 
@@ -132,7 +144,8 @@
 
     }
 
-    /**
+    
+	/**
      * Render a hierarchy of constraints, hierarchy here means constraints that may
      * themselves depend on members of constraint objects. With this code, the GUI
      * enables clicking rules of the form:
@@ -141,10 +154,10 @@
      *
      * @param sortedConst a sorted list of constraints to display.
      * */
-    private void drawConstraints(ArrayList sortedConst) {
+    private void drawConstraints(List<FieldConstraint> sortedConst) {
         final DirtyableFlexTable table = new DirtyableFlexTable();
         layout.setWidget(1, 0, table);
-        List parents = new ArrayList();
+        List<FieldConstraint> parents = new ArrayList<FieldConstraint>();
 
         for (int i = 0; i < sortedConst.size(); i++) {
             int tabs = -1;
@@ -199,8 +212,8 @@
      * @param constraints the list of inheriting constraints to sort.
      * @return a sorted list of constraints ready for display.
      * */
-    private ArrayList sortConstraints(FieldConstraint[] constraints) {
-        ArrayList sortedConst = new ArrayList(constraints.length);
+    private List<FieldConstraint> sortConstraints(FieldConstraint[] constraints) {
+        List<FieldConstraint> sortedConst = new ArrayList<FieldConstraint>(constraints.length);
         for (int i = 0; i < constraints.length; i++) {
             FieldConstraint current = constraints[i];
             if (current instanceof SingleFieldConstraint) {
@@ -225,7 +238,7 @@
      * @param sortedConst the array to fill.
      * @param fieldConst the constraint to investigate.
      * */
-    private void insertSingleFieldConstraint(SingleFieldConstraint fieldConst, ArrayList sortedConst) {
+    private void insertSingleFieldConstraint(SingleFieldConstraint fieldConst, List<FieldConstraint> sortedConst) {
         if (fieldConst.parent instanceof SingleFieldConstraint) {
             insertSingleFieldConstraint((SingleFieldConstraint) fieldConst.parent, sortedConst);
         }
@@ -423,7 +436,7 @@
 
     private Widget valueEditor(final SingleFieldConstraint c, String factType) {
         //String type = this.modeller.getSuggestionCompletions().getFieldType( factType, c.fieldName );
-        return new ConstraintValueEditor(pattern, c.fieldName, c, this.getModeller(), c.fieldType,this.readOnly);
+        return new ConstraintValueEditor(pattern, c.fieldName, c, this.getModeller(), c.fieldType,this.readOnly, isTemplate());
     }
 
     private Widget operatorDropDown(final SingleFieldConstraint c) {
@@ -516,4 +529,8 @@
         return this.readOnly;
     }
 
+	public boolean isTemplate() {
+		return template;
+	}
+
 }

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ModellerWidgetFactory.java (from rev 32495, labs/jbossrules/branches/guvnor_rules_templates_baunax_esteban_diega/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ModellerWidgetFactory.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ModellerWidgetFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ModellerWidgetFactory.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -0,0 +1,28 @@
+package org.drools.guvnor.client.modeldriven.ui;
+
+import org.drools.guvnor.client.modeldriven.brl.IAction;
+import org.drools.guvnor.client.modeldriven.brl.IPattern;
+
+public interface ModellerWidgetFactory {
+
+	/**
+	 * Used for get widgets for RHS
+	 * @param ruleModeller
+	 * @param action
+	 * @param readOnly
+	 * @return
+	 */
+	public abstract RuleModellerWidget getWidget(RuleModeller ruleModeller,
+			IAction action, Boolean readOnly);
+
+	/**
+	 * Used for get widgets for LHS
+	 * @param ruleModeller
+	 * @param pattern
+	 * @param readOnly
+	 * @return
+	 */
+	public abstract RuleModellerWidget getWidget(RuleModeller ruleModeller,
+			IPattern pattern, Boolean readOnly);
+
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModelEditor.java (from rev 32495, labs/jbossrules/branches/guvnor_rules_templates_baunax_esteban_diega/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModelEditor.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModelEditor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModelEditor.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -0,0 +1,5 @@
+package org.drools.guvnor.client.modeldriven.ui;
+
+public interface RuleModelEditor {
+	public RuleModeller getRuleModeller();
+}

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModeller.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModeller.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModeller.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -15,10 +15,13 @@
  * limitations under the License.
  */
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.drools.guvnor.client.common.ClickableLabel;
 import org.drools.guvnor.client.common.DirtyableComposite;
@@ -29,6 +32,7 @@
 import org.drools.guvnor.client.common.FormStylePopup;
 import org.drools.guvnor.client.common.ImageButton;
 import org.drools.guvnor.client.common.InfoPopup;
+import org.drools.guvnor.client.common.LoadingPopup;
 import org.drools.guvnor.client.common.SmallLabel;
 import org.drools.guvnor.client.explorer.ExplorerLayoutManager;
 import org.drools.guvnor.client.messages.Constants;
@@ -43,7 +47,6 @@
 import org.drools.guvnor.client.modeldriven.brl.ActionUpdateField;
 import org.drools.guvnor.client.modeldriven.brl.CompositeFactPattern;
 import org.drools.guvnor.client.modeldriven.brl.DSLSentence;
-import org.drools.guvnor.client.modeldriven.brl.ExpressionFormLine;
 import org.drools.guvnor.client.modeldriven.brl.FactPattern;
 import org.drools.guvnor.client.modeldriven.brl.FreeFormLine;
 import org.drools.guvnor.client.modeldriven.brl.FromAccumulateCompositeFactPattern;
@@ -55,6 +58,10 @@
 import org.drools.guvnor.client.modeldriven.brl.RuleMetadata;
 import org.drools.guvnor.client.modeldriven.brl.RuleModel;
 import org.drools.guvnor.client.packages.SuggestionCompletionCache;
+import org.drools.guvnor.client.packages.WorkingSetManager;
+import org.drools.guvnor.client.rpc.AnalysisReport;
+import org.drools.guvnor.client.rpc.AnalysisReportLine;
+import org.drools.guvnor.client.rpc.RepositoryServiceFactory;
 import org.drools.guvnor.client.rpc.RuleAsset;
 import org.drools.guvnor.client.ruleeditor.RuleViewer;
 import org.drools.guvnor.client.security.Capabilities;
@@ -80,14 +87,6 @@
 import com.google.gwt.user.client.ui.Widget;
 import com.gwtext.client.core.ExtElement;
 import com.gwtext.client.util.Format;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Set;
-import org.drools.guvnor.client.common.LoadingPopup;
-import org.drools.guvnor.client.packages.WorkingSetManager;
-import org.drools.guvnor.client.rpc.AnalysisReport;
-import org.drools.guvnor.client.rpc.AnalysisReportLine;
-import org.drools.guvnor.client.rpc.RepositoryServiceFactory;
 
 /**
  * This is the parent widget that contains the model based rule builder.
@@ -95,7 +94,7 @@
  * @author Michael Neale
  *
  */
-public class RuleModeller extends DirtyableComposite {
+public class RuleModeller extends DirtyableComposite implements RuleModelEditor {
 
     private DirtyableFlexTable layout;
     private RuleModel model;
@@ -104,16 +103,19 @@
     private int currentLayoutRow = 0;
     private String packageName;
     private RuleAsset asset;
+    private ModellerWidgetFactory widgetFactory;
     
-    public RuleModeller(RuleAsset asset, RuleViewer viewer) {
-        this(asset);
+    public RuleModeller(RuleAsset asset, RuleViewer viewer, ModellerWidgetFactory widgetFactory) {
+        this(asset, widgetFactory);
     }
 
-    public RuleModeller(RuleAsset asset) {
-        this.asset = asset;
+    public RuleModeller(RuleAsset asset, ModellerWidgetFactory widgetFactory) {
+		this.asset = asset;
         this.model = (RuleModel) asset.content;
         this.packageName = asset.metaData.packageName;
 
+        this.widgetFactory = widgetFactory;
+        
         layout = new DirtyableFlexTable();
 
         initWidget();
@@ -357,23 +359,7 @@
             //if lockRHS() set the widget RO, otherwise let them decide.
             Boolean readOnly = this.lockRHS()?true:null;
 
-            RuleModellerWidget w = null;
-            if (action instanceof ActionCallMethod) {
-                w = new ActionCallMethodWidget(this, (ActionCallMethod) action,readOnly);
-            } else if (action instanceof ActionSetField) {
-                w = new ActionSetFieldWidget(this, (ActionSetField) action,readOnly);
-            } else if (action instanceof ActionInsertFact) {
-                w = new ActionInsertFactWidget(this, (ActionInsertFact) action, readOnly);
-            } else if (action instanceof ActionRetractFact) {
-                w = new ActionRetractFactWidget(this, (ActionRetractFact) action, readOnly);
-            } else if (action instanceof DSLSentence) {
-                w = new DSLSentenceWidget(this,(DSLSentence) action, readOnly);
-                w.addStyleName("model-builderInner-Background"); //NON-NLS
-            } else if (action instanceof FreeFormLine) {
-                w = new FreeFormLineWidget(this, (FreeFormLine) action, readOnly);
-            } else if (action instanceof ActionGlobalCollectionAdd) {
-                w = new GlobalCollectionAddWidget(this, (ActionGlobalCollectionAdd) action, readOnly);
-            } 
+            RuleModellerWidget w = getWidgetFactory().getWidget(this, action, readOnly);
 
             w.setWidth( "100%" );
             widget.add(spacerWidget());
@@ -502,7 +488,7 @@
         // The list of facts
         //
         final String[] facts = completions.getFactTypes();
-        if (facts != null && facts.length > 0) {
+        if (facts.length > 0) {
             choices.addItem("..................");
 
             for (int i = 0; i < facts.length; i++) {
@@ -651,7 +637,6 @@
         popup.setWidth(-1);
         popup.setTitle(constants.AddANewAction());
 
-
         final ListBox positionCbo = new ListBox();
         if (position == null) {
             positionCbo.addItem(constants.Bottom(), String.valueOf(this.model.rhs.length));
@@ -665,10 +650,6 @@
             positionCbo.setSelectedIndex(0);
         }
 
-
-
-
-
         final ListBox choices = new ListBox(true);
         final Map<String, Command> cmds = new HashMap<String, Command>();
 
@@ -976,26 +957,8 @@
             Boolean readOnly = this.lockLHS()?true:null;
 
             IPattern pattern = model.lhs[i];
-            RuleModellerWidget w = null;
-            if (pattern instanceof FactPattern) {
-                w = new FactPatternWidget(this, pattern, true, readOnly);
-            } else if (pattern instanceof CompositeFactPattern) {
-                w = new CompositeFactPatternWidget(this, (CompositeFactPattern) pattern, readOnly);
-            } else if (pattern instanceof FromAccumulateCompositeFactPattern) {
-                w = new FromAccumulateCompositeFactPatternWidget(this, (FromAccumulateCompositeFactPattern) pattern, readOnly);
-            } else if (pattern instanceof FromCollectCompositeFactPattern) {
-                w = new FromCollectCompositeFactPatternWidget(this, (FromCollectCompositeFactPattern) pattern, readOnly);
-            } else if (pattern instanceof FromCompositeFactPattern) {
-                w = new FromCompositeFactPatternWidget(this, (FromCompositeFactPattern) pattern, readOnly);
-            } else if (pattern instanceof DSLSentence) {
-                w = new DSLSentenceWidget(this,(DSLSentence) pattern, readOnly);
-            } else if (pattern instanceof FreeFormLine) {
-                w = new FreeFormLineWidget(this, (FreeFormLine)pattern, readOnly);
-            } else if (pattern instanceof ExpressionFormLine) {
-                w = new ExpressionBuilder(this, (ExpressionFormLine) pattern, readOnly);
-            } else {
-                throw new RuntimeException("I don't know what type of pattern it is: "+pattern);
-            }
+            
+            RuleModellerWidget w = getWidgetFactory().getWidget(this, pattern, readOnly);
 
             vert.add(wrapLHSWidget(model, i, w));
             vert.add(spacerWidget());
@@ -1259,4 +1222,16 @@
     public boolean hasVerifierWarnings(){
         return this.warnings != null && this.warnings.size() > 0;
     }
+
+	public ModellerWidgetFactory getWidgetFactory() {
+		return widgetFactory;
+	}
+
+	public void setWidgetFactory(ModellerWidgetFactory widgetFactory) {
+		this.widgetFactory = widgetFactory;
+	}
+
+	public RuleModeller getRuleModeller() {
+		return this;
+	}
 }

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModellerWidgetFactory.java (from rev 32495, labs/jbossrules/branches/guvnor_rules_templates_baunax_esteban_diega/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModellerWidgetFactory.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModellerWidgetFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModellerWidgetFactory.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -0,0 +1,86 @@
+package org.drools.guvnor.client.modeldriven.ui;
+
+import org.drools.guvnor.client.modeldriven.brl.ActionCallMethod;
+import org.drools.guvnor.client.modeldriven.brl.ActionGlobalCollectionAdd;
+import org.drools.guvnor.client.modeldriven.brl.ActionInsertFact;
+import org.drools.guvnor.client.modeldriven.brl.ActionRetractFact;
+import org.drools.guvnor.client.modeldriven.brl.ActionSetField;
+import org.drools.guvnor.client.modeldriven.brl.CompositeFactPattern;
+import org.drools.guvnor.client.modeldriven.brl.DSLSentence;
+import org.drools.guvnor.client.modeldriven.brl.ExpressionFormLine;
+import org.drools.guvnor.client.modeldriven.brl.FactPattern;
+import org.drools.guvnor.client.modeldriven.brl.FreeFormLine;
+import org.drools.guvnor.client.modeldriven.brl.FromAccumulateCompositeFactPattern;
+import org.drools.guvnor.client.modeldriven.brl.FromCollectCompositeFactPattern;
+import org.drools.guvnor.client.modeldriven.brl.FromCompositeFactPattern;
+import org.drools.guvnor.client.modeldriven.brl.IAction;
+import org.drools.guvnor.client.modeldriven.brl.IPattern;
+
+public class RuleModellerWidgetFactory implements ModellerWidgetFactory {
+	
+	/* (non-Javadoc)
+	 * @see org.drools.guvnor.client.modeldriven.ui.ModellerWidgetFactory#getWidget(org.drools.guvnor.client.modeldriven.ui.RuleModeller, org.drools.guvnor.client.modeldriven.brl.IAction, boolean)
+	 */
+	public RuleModellerWidget getWidget(RuleModeller ruleModeller, IAction action, Boolean readOnly){
+        if (action instanceof ActionCallMethod) {
+            return new ActionCallMethodWidget(ruleModeller, (ActionCallMethod) action, readOnly);
+        }
+        if (action instanceof ActionSetField) {
+            return new ActionSetFieldWidget(ruleModeller, (ActionSetField) action,readOnly);
+        } 
+        if (action instanceof ActionInsertFact) {
+            return new ActionInsertFactWidget(ruleModeller, (ActionInsertFact) action, readOnly, isTemplate());
+        } 
+        if (action instanceof ActionRetractFact) {
+            return new ActionRetractFactWidget(ruleModeller, (ActionRetractFact) action, readOnly);
+        }
+        if (action instanceof DSLSentence) {
+        	RuleModellerWidget w = new DSLSentenceWidget(ruleModeller,(DSLSentence) action, readOnly);
+            w.addStyleName("model-builderInner-Background"); //NON-NLS
+            return w;
+        } 
+        if (action instanceof FreeFormLine) {
+            return new FreeFormLineWidget(ruleModeller, (FreeFormLine) action, readOnly);
+        } 
+        if (action instanceof ActionGlobalCollectionAdd) {
+             return new GlobalCollectionAddWidget(ruleModeller, (ActionGlobalCollectionAdd) action, readOnly);
+        } 
+        throw new RuntimeException("I don't know what type of action is: " + action); //NON-NLS
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.drools.guvnor.client.modeldriven.ui.ModellerWidgetFactory#getWidget(org.drools.guvnor.client.modeldriven.ui.RuleModeller, org.drools.guvnor.client.modeldriven.brl.IPattern, boolean)
+	 */
+	public RuleModellerWidget getWidget(RuleModeller ruleModeller, IPattern pattern, Boolean readOnly){
+        if (pattern instanceof FactPattern) {
+            return new FactPatternWidget(ruleModeller, pattern, true, readOnly, isTemplate());
+        } 
+        if (pattern instanceof CompositeFactPattern) {
+            return new CompositeFactPatternWidget(ruleModeller, (CompositeFactPattern) pattern, readOnly);
+        }
+        if (pattern instanceof FromAccumulateCompositeFactPattern) {
+            return new FromAccumulateCompositeFactPatternWidget(ruleModeller, (FromAccumulateCompositeFactPattern) pattern, readOnly);
+        }
+        if (pattern instanceof FromCollectCompositeFactPattern) {
+            return new FromCollectCompositeFactPatternWidget(ruleModeller, (FromCollectCompositeFactPattern) pattern, readOnly);
+        }
+        if (pattern instanceof FromCompositeFactPattern) {
+            return new FromCompositeFactPatternWidget(ruleModeller, (FromCompositeFactPattern) pattern, readOnly);
+        }
+        if (pattern instanceof DSLSentence) {
+            return new DSLSentenceWidget(ruleModeller,(DSLSentence) pattern, readOnly);
+        }
+        if (pattern instanceof FreeFormLine) {
+            return new FreeFormLineWidget(ruleModeller, (FreeFormLine)pattern, readOnly);
+        }
+        if (pattern instanceof ExpressionFormLine) {
+            return new ExpressionBuilder(ruleModeller, (ExpressionFormLine) pattern, readOnly);
+        }
+        throw new RuntimeException("I don't know what type of pattern is: "+pattern);
+
+	}
+
+	protected boolean isTemplate(){
+		return false;
+	}
+}

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleTemplateEditor.java (from rev 32495, labs/jbossrules/branches/guvnor_rules_templates_baunax_esteban_diega/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleTemplateEditor.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleTemplateEditor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleTemplateEditor.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -0,0 +1,182 @@
+package org.drools.guvnor.client.modeldriven.ui;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.drools.guvnor.client.common.DirtyableComposite;
+import org.drools.guvnor.client.messages.Constants;
+import org.drools.guvnor.client.modeldriven.dt.TemplateModel;
+import org.drools.guvnor.client.rpc.RuleAsset;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.Widget;
+import com.gwtext.client.core.EventObject;
+import com.gwtext.client.data.ArrayReader;
+import com.gwtext.client.data.FieldDef;
+import com.gwtext.client.data.GroupingStore;
+import com.gwtext.client.data.MemoryProxy;
+import com.gwtext.client.data.Record;
+import com.gwtext.client.data.RecordDef;
+import com.gwtext.client.data.StringFieldDef;
+import com.gwtext.client.widgets.Panel;
+import com.gwtext.client.widgets.TabPanel;
+import com.gwtext.client.widgets.Toolbar;
+import com.gwtext.client.widgets.ToolbarMenuButton;
+import com.gwtext.client.widgets.event.TabPanelListenerAdapter;
+import com.gwtext.client.widgets.form.TextField;
+import com.gwtext.client.widgets.grid.ColumnConfig;
+import com.gwtext.client.widgets.grid.ColumnModel;
+import com.gwtext.client.widgets.grid.EditorGridPanel;
+import com.gwtext.client.widgets.grid.GridEditor;
+import com.gwtext.client.widgets.grid.GridPanel;
+import com.gwtext.client.widgets.grid.GroupingView;
+import com.gwtext.client.widgets.grid.event.EditorGridListenerAdapter;
+import com.gwtext.client.widgets.menu.BaseItem;
+import com.gwtext.client.widgets.menu.Item;
+import com.gwtext.client.widgets.menu.Menu;
+import com.gwtext.client.widgets.menu.event.BaseItemListenerAdapter;
+
+public class RuleTemplateEditor extends DirtyableComposite implements RuleModelEditor {
+
+	private TemplateModel model;
+	private GroupingStore store;
+	private RuleModeller ruleModeller;
+	private Constants constants = ((Constants) GWT.create(Constants.class));
+
+	public RuleTemplateEditor(RuleAsset asset) {
+		model = (TemplateModel) asset.content;
+		TabPanel tPanel = new TabPanel();
+		tPanel.setAutoWidth(true);
+		tPanel.setAutoHeight(true);
+		
+		Panel pnl = new Panel();
+		pnl.setAutoWidth(true);
+		pnl.setClosable(false);
+		pnl.setTitle("Template Editor");
+		pnl.setAutoHeight(true);
+		ruleModeller = new RuleModeller(asset, new TemplateModellerWidgetFactory());
+		pnl.add(ruleModeller);
+		tPanel.add(pnl);
+
+		pnl = new Panel();
+		pnl.setAutoWidth(true);
+		pnl.setClosable(false);
+		pnl.setTitle("Template Data");
+		pnl.setAutoHeight(true);
+		pnl.add(buildTemplateTable());
+		pnl.setId("tplTable");
+		tPanel.add(pnl);
+		
+		tPanel.addListener(new TabPanelListenerAdapter() {
+			
+			@Override
+			public boolean doBeforeTabChange(TabPanel source, Panel newPanel, Panel oldPanel) {
+				if ("tplTable".equals(newPanel.getId())) {
+					Set<String> keySet = new HashSet<String>(model.getTable().keySet());
+					model.putInSync();
+					if (!keySet.equals(model.getTable().keySet())) {
+						newPanel.clear();
+						newPanel.add(buildTemplateTable());
+					}
+				}
+				return true;
+			}
+		});
+
+		tPanel.setActiveTab(0);
+		initWidget(tPanel);
+	}
+
+	private Widget buildTemplateTable() {
+
+		final Map<String, Integer> vars = model.getInterpolationVariables();
+		if (vars.isEmpty()) {
+			return new Label("");
+		}
+
+		FieldDef[] fds = new FieldDef[vars.size()];
+		ColumnConfig[] cols = new ColumnConfig[fds.length];
+
+		for (Map.Entry<String, Integer> entry: vars.entrySet()) {
+			int idx = entry.getValue();
+			String var = entry.getKey();
+			
+			cols[idx] = new ColumnConfig();
+			cols[idx].setHeader(var);
+			cols[idx].setDataIndex(var);
+			cols[idx].setSortable(false);
+			cols[idx].setWidth(50);
+			cols[idx].setResizable(true);
+			cols[idx].setEditor(new GridEditor(new TextField()));
+			fds[idx] = new StringFieldDef(var);
+		}
+		final RecordDef recordDef = new RecordDef(fds);
+		ArrayReader reader = new ArrayReader(recordDef);
+		
+		MemoryProxy proxy = new MemoryProxy(model.getTableAsArray());
+
+		ColumnModel cm = new ColumnModel(cols);
+		
+		for (int i = 0; i < cm.getColumnCount(); i++) {
+			cm.setEditable(i, true);
+		}
+		store = new GroupingStore(proxy, reader);
+		store.load();
+		EditorGridPanel grid = new EditorGridPanel(store, cm);
+		grid.setStripeRows(true);
+
+		GroupingView gv = new GroupingView();
+
+		// to stretch it out
+		gv.setForceFit(true);
+		gv.setGroupTextTpl("{text} ({[values.rs.length]} {[values.rs.length > 1 ? \"" // NON-NLS
+				+ constants.Items() + "\" : \"" + constants.Item() + "\"]})");
+
+		grid.setView(gv);
+
+		grid.setStore(store);
+		grid.setAutoWidth(true);
+		grid.setAutoHeight(true);
+
+		Toolbar tb = new Toolbar();
+		Menu menu = new Menu();
+
+		menu.addItem(new Item(constants.AddRow(), new BaseItemListenerAdapter() {
+			public void onClick(BaseItem item, EventObject e) {
+				String[] rowData = new String[recordDef.getFields().length];
+				for (int i = 0; i < rowData.length; i++) {
+					rowData[i] = "";
+				}
+				store.add(recordDef.createRecord(rowData));
+				model.addRow(rowData);
+			}
+		}));
+
+		ToolbarMenuButton tbb = new ToolbarMenuButton(constants.Modify(), menu);
+		tb.addButton(tbb);
+		grid.add(tb);
+
+		grid.addEditorGridListener(new EditorGridListenerAdapter() {
+			@Override
+			public void onAfterEdit(GridPanel grid, Record record, String field, Object newValue, Object oldValue,
+					int rowIndex, int colIndex) {
+				model.setValue(field, rowIndex, (String) newValue);
+			}
+		});
+
+		return grid;
+	}
+	
+	@Override
+	public void resetDirty() {
+		super.resetDirty();
+		store.commitChanges();
+		
+	}
+
+	public RuleModeller getRuleModeller() {
+		return ruleModeller;
+	}
+}

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/TemplateModellerWidgetFactory.java (from rev 32495, labs/jbossrules/branches/guvnor_rules_templates_baunax_esteban_diega/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/TemplateModellerWidgetFactory.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/TemplateModellerWidgetFactory.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/TemplateModellerWidgetFactory.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -0,0 +1,9 @@
+package org.drools.guvnor.client.modeldriven.ui;
+
+public class TemplateModellerWidgetFactory extends RuleModellerWidgetFactory {
+
+	@Override
+	protected boolean isTemplate() {
+		return true;
+	}
+}

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/qa/FieldDataConstraintEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/qa/FieldDataConstraintEditor.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/qa/FieldDataConstraintEditor.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -1,9 +1,16 @@
 package org.drools.guvnor.client.qa;
 
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.user.client.ui.*;
-import com.gwtext.client.util.Format;
-import org.drools.guvnor.client.common.*;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.guvnor.client.common.DirtyableComposite;
+import org.drools.guvnor.client.common.DirtyableHorizontalPane;
+import org.drools.guvnor.client.common.DropDownValueChanged;
+import org.drools.guvnor.client.common.FormStylePopup;
+import org.drools.guvnor.client.common.ImageButton;
+import org.drools.guvnor.client.common.InfoPopup;
+import org.drools.guvnor.client.common.SmallLabel;
+import org.drools.guvnor.client.common.ValueChanged;
 import org.drools.guvnor.client.messages.Constants;
 import org.drools.guvnor.client.modeldriven.DropDownData;
 import org.drools.guvnor.client.modeldriven.SuggestionCompletionEngine;
@@ -14,8 +21,20 @@
 import org.drools.guvnor.client.modeldriven.ui.ActionValueEditor;
 import org.drools.guvnor.client.modeldriven.ui.EnumDropDown;
 
-import java.util.List;
-import java.util.Map;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.ChangeListener;
+import com.google.gwt.user.client.ui.ClickListener;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.ListBox;
+import com.google.gwt.user.client.ui.Panel;
+import com.google.gwt.user.client.ui.SimplePanel;
+import com.google.gwt.user.client.ui.TextBox;
+import com.google.gwt.user.client.ui.VerticalPanel;
+import com.google.gwt.user.client.ui.Widget;
+import com.gwtext.client.util.Format;
 
 /**
  * Constraint editor for the FieldData in the Given Section
@@ -281,26 +300,18 @@
     }
 
     private void calculateValueFromList() {
+        if (this.field.collectionFieldList == null || this.field.collectionFieldList.isEmpty()) {
+            this.field.value = "=[]";
+            return;
+        }
         StringBuffer listContent = new StringBuffer();
-        listContent.append("=[");
-        boolean isFirst = true;
         for (final FieldData f : this.field.collectionFieldList) {
-            if (isFirst == true){
-                isFirst = false;
-                 if (f.value!=null){
-                    listContent.append(f.value.substring(1));
-                 }
-            } else{
-                if (f.value==null){
-                    listContent.append(",");
-                }else{
-                    listContent.append(","+f.value.substring(1));
-                }
+            listContent.append(',');
+            if (f.value != null) {
+                listContent.append(f.value.substring(1));
             }
         }
-        listContent.append("]");
-        this.field.value = listContent.toString();
-
+        this.field.value = "=[" + listContent.substring(1) + "]";
     }
 
     private void showTypeChoice(Widget w,

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/ActionToolbar.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/ActionToolbar.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/ActionToolbar.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -41,6 +41,7 @@
 import org.drools.guvnor.client.rpc.RuleAsset;
 import org.drools.guvnor.client.rpc.BuilderResult;
 import org.drools.guvnor.client.explorer.ExplorerLayoutManager;
+import org.drools.guvnor.client.modeldriven.ui.RuleModelEditor;
 import org.drools.guvnor.client.modeldriven.ui.RuleModeller;
 import org.drools.guvnor.client.security.Capabilities;
 import org.drools.guvnor.client.packages.PackageBuilderWidget;
@@ -53,9 +54,9 @@
  */
 public class ActionToolbar extends Composite {
 
-    static String[]         VALIDATING_FORMATS = new String[]{BUSINESS_RULE, DSL_TEMPLATE_RULE, DECISION_SPREADSHEET_XLS, DRL, ENUMERATION, DECISION_TABLE_GUIDED, DRL_MODEL, DSL, FUNCTION};
+    static String[]         VALIDATING_FORMATS = new String[]{BUSINESS_RULE, DSL_TEMPLATE_RULE, DECISION_SPREADSHEET_XLS, DRL, ENUMERATION, DECISION_TABLE_GUIDED, DRL_MODEL, DSL, FUNCTION, RULE_TEMPLATE};
 
-    static String[]         VERIFY_FORMATS     = new String[]{BUSINESS_RULE, DECISION_SPREADSHEET_XLS, DRL, DECISION_TABLE_GUIDED, DRL_MODEL};
+    static String[]         VERIFY_FORMATS     = new String[]{BUSINESS_RULE, DECISION_SPREADSHEET_XLS, DRL, DECISION_TABLE_GUIDED, DRL_MODEL, RULE_TEMPLATE};
 
     private Toolbar         toolbar;
     private CheckinAction   checkinAction;
@@ -224,17 +225,16 @@
 
         if ( isValidatorTypeAsset() ) {
 
-            if (editor instanceof RuleModeller){
-                ToolbarButton workingSets = new ToolbarButton();
-                workingSets.setText( constants.SelectWorkingSets() );
-                workingSets.addListener( new ButtonListenerAdapter() {
-                    public void onClick(com.gwtext.client.widgets.Button button,
-                                        EventObject e) {
-                        showWorkingSetsSelection((RuleModeller)editor);
-                    }
-                } );
-                toolbar.addButton( workingSets );
-            }
+			if (editor instanceof RuleModelEditor) {
+				ToolbarButton workingSets = new ToolbarButton();
+				workingSets.setText(constants.SelectWorkingSets());
+				workingSets.addListener(new ButtonListenerAdapter() {
+					public void onClick(com.gwtext.client.widgets.Button button, EventObject e) {
+						showWorkingSetsSelection(((RuleModelEditor) editor).getRuleModeller());
+					}
+				});
+				toolbar.addButton(workingSets);
+			}
 
             ToolbarButton validate = new ToolbarButton();
             validate.setText( constants.Validate() );

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/EditorLauncher.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/EditorLauncher.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/EditorLauncher.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -27,6 +27,8 @@
 import org.drools.guvnor.client.explorer.Preferences;
 import org.drools.guvnor.client.factmodel.FactModelWidget;
 import org.drools.guvnor.client.modeldriven.ui.RuleModeller;
+import org.drools.guvnor.client.modeldriven.ui.RuleModellerWidgetFactory;
+import org.drools.guvnor.client.modeldriven.ui.RuleTemplateEditor;
 import org.drools.guvnor.client.packages.ModelAttachmentFileWidget;
 import org.drools.guvnor.client.qa.ScenarioWidget;
 import org.drools.guvnor.client.rpc.RuleAsset;
@@ -56,7 +58,7 @@
 		RulePackageSelector.currentlySelectedPackage = asset.metaData.packageName;
 		// depending on the format, load the appropriate editor
 		if (asset.metaData.format.equals(AssetFormats.BUSINESS_RULE)) {
-			return new RuleModeller(asset);
+			return new RuleModeller(asset, new RuleModellerWidgetFactory());
 		} else if (asset.metaData.format.equals(AssetFormats.DSL_TEMPLATE_RULE)) {
 			return new RuleValidatorWrapper(new DSLRuleEditor(asset), asset);
 		} else if (asset.metaData.format.equals(AssetFormats.BPEL_PACKAGE)
@@ -90,6 +92,8 @@
 			return new FunctionEditor(asset);
 		} else if (asset.metaData.format.equals(AssetFormats.WORKING_SET)) {
 			return new WorkingSetEditor(asset);
+        } else if (asset.metaData.format.equals(AssetFormats.RULE_TEMPLATE)) {
+            return new RuleTemplateEditor(asset);
 		} else {
 			return new DefaultContentUploadEditor(asset, viewer);
 		}

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/WorkingSetEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/WorkingSetEditor.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/WorkingSetEditor.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -73,7 +73,7 @@
 		Panel pnl = new Panel();
         pnl.setAutoWidth(true);
         pnl.setClosable(false);
-        pnl.setTitle("WS Definition");
+        pnl.setTitle("WS Definition"); //TODO {bauna} i18n
         pnl.setAutoHeight(true);
         pnl.add(buildDoubleList(wsData));
 		tPanel.add(pnl);
@@ -81,7 +81,7 @@
 		pnl = new Panel();
         pnl.setAutoWidth(true);
         pnl.setClosable(false);
-        pnl.setTitle("WS Constraints");
+        pnl.setTitle("WS Constraints"); //TODO {bauna} i18n
         pnl.setAutoHeight(true);
         pnl.add(buildFactsConstraintsEditor(tPanel));
 		tPanel.add(pnl);

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/public/images/new_template.gif (from rev 32495, labs/jbossrules/branches/guvnor_rules_templates_baunax_esteban_diega/drools-guvnor/src/main/java/org/drools/guvnor/public/images/new_template.gif)
===================================================================
(Binary files differ)

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/contenthandler/BRLContentHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/contenthandler/BRLContentHandler.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/contenthandler/BRLContentHandler.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -25,6 +25,7 @@
 import org.drools.guvnor.server.builder.BRMSPackageBuilder;
 import org.drools.guvnor.server.builder.ContentPackageAssembler;
 import org.drools.guvnor.server.util.BRDRLPersistence;
+import org.drools.guvnor.server.util.BRLPersistence;
 import org.drools.guvnor.server.util.BRXMLPersistence;
 import org.drools.repository.AssetItem;
 import org.drools.repository.PackageItem;
@@ -32,16 +33,13 @@
 import com.google.gwt.user.client.rpc.SerializableException;
 
 public class BRLContentHandler extends ContentHandler
-    implements
-    IRuleAsset {
+		implements IRuleAsset {
 
-    public void retrieveAssetContent(RuleAsset asset,
+
+	public void retrieveAssetContent(RuleAsset asset,
                                      PackageItem pkg,
                                      AssetItem item) throws SerializableException {
-        RuleModel model = BRXMLPersistence.getInstance().unmarshal( item.getContent() );
-
-        asset.content = model;
-
+        asset.content = getBrlXmlPersistence().unmarshal( item.getContent() );
     }
 
     public void storeAssetContent(RuleAsset asset,
@@ -50,7 +48,7 @@
         if ( data.name == null ) {
             data.name = repoAsset.getName();
         }
-        repoAsset.updateContent( BRXMLPersistence.getInstance().marshal( data ) );
+        repoAsset.updateContent( getBrlXmlPersistence().marshal( data ) );
     }
 
     public void compile(BRMSPackageBuilder builder,
@@ -71,21 +69,33 @@
 
     private String getSourceDRL(AssetItem asset,
                                 BRMSPackageBuilder builder) {
-        RuleModel model = BRXMLPersistence.getInstance().unmarshal( asset.getContent() );
-        model.name = asset.getName();
-        model.parentName = this.parentNameFromCategory( asset,
-                                                        model.parentName );
+        RuleModel model = buildModelFromAsset(asset);
 
-        String drl = BRDRLPersistence.getInstance().marshal( model );
+        String drl = getBrlDrlPersistence().marshal( model );
         if ( builder.hasDSL() && model.hasDSLSentences() ) {
             drl = builder.getDSLExpander().expand( drl );
         }
         return drl;
     }
 
+	protected RuleModel buildModelFromAsset(AssetItem asset) {
+		RuleModel model = getBrlXmlPersistence().unmarshal(asset.getContent());
+		model.name = asset.getName();
+		model.parentName = this.parentNameFromCategory(asset, model.parentName);
+		return model;
+	}
+
     public String getRawDRL(AssetItem asset) {
-        RuleModel model = BRXMLPersistence.getInstance().unmarshal( asset.getContent() );
+        RuleModel model = getBrlXmlPersistence().unmarshal( asset.getContent() );
 
-        return BRDRLPersistence.getInstance().marshal( model );
+        return getBrlDrlPersistence().marshal( model );
     }
+    
+    protected BRLPersistence getBrlDrlPersistence() {
+		return BRDRLPersistence.getInstance();
+	}
+
+    protected BRLPersistence getBrlXmlPersistence() {
+		return BRXMLPersistence.getInstance();
+	}
 }
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/contenthandler/BaseXStreamContentHandler.java (from rev 32495, labs/jbossrules/branches/guvnor_rules_templates_baunax_esteban_diega/drools-guvnor/src/main/java/org/drools/guvnor/server/contenthandler/BaseXStreamContentHandler.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/contenthandler/BaseXStreamContentHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/contenthandler/BaseXStreamContentHandler.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -0,0 +1,46 @@
+package org.drools.guvnor.server.contenthandler;
+
+import org.drools.guvnor.client.modeldriven.brl.PortableObject;
+import org.drools.guvnor.client.rpc.RuleAsset;
+import org.drools.guvnor.client.rpc.WorkingSetConfigData;
+import org.drools.repository.AssetItem;
+import org.drools.repository.PackageItem;
+import org.drools.repository.RulesRepositoryException;
+import org.slf4j.Logger;
+
+import com.google.gwt.user.client.rpc.SerializableException;
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomDriver;
+
+public abstract class BaseXStreamContentHandler<T extends PortableObject> extends ContentHandler {
+	protected final Logger log = org.slf4j.LoggerFactory.getLogger(getClass());
+
+	private static final XStream xt = new XStream(new DomDriver());
+
+	protected XStream getXStream() {
+		return xt;
+	}
+
+	@SuppressWarnings("unchecked")
+	public void retrieveAssetContent(RuleAsset asset, PackageItem pkg, AssetItem item) throws SerializableException {
+		if (item.getContent() != null && item.getContent().length() > 0) {
+			try {
+				asset.content = (T) getXStream().fromXML(item.getContent());
+			} catch (RulesRepositoryException e) {
+				log.error("error marshalling asset content: " + asset.metaData.name, e);
+				throw new SerializableException(e.getMessage());
+			}
+		} else {
+			asset.content = new WorkingSetConfigData();
+		}
+	}
+
+	public void storeAssetContent(RuleAsset asset, AssetItem repoAsset) throws SerializableException {
+		try {
+			repoAsset.updateContent(getXStream().toXML(asset.content));
+		} catch (Exception e) {
+			log.error("error marshalling asset content: " + asset.metaData.name, e);
+			throw new SerializableException(e.getMessage());
+		}
+	}
+}

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/contenthandler/TemplateModelHandler.java (from rev 32495, labs/jbossrules/branches/guvnor_rules_templates_baunax_esteban_diega/drools-guvnor/src/main/java/org/drools/guvnor/server/contenthandler/TemplateModelHandler.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/contenthandler/TemplateModelHandler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/contenthandler/TemplateModelHandler.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -0,0 +1,19 @@
+package org.drools.guvnor.server.contenthandler;
+
+import org.drools.guvnor.server.util.BRDRTPersistence;
+import org.drools.guvnor.server.util.BRDRTXMLPersistence;
+import org.drools.guvnor.server.util.BRLPersistence;
+
+public class TemplateModelHandler extends BRLContentHandler {
+
+	@Override
+	protected BRLPersistence getBrlDrlPersistence() {
+		return BRDRTPersistence.getInstance();
+	}
+	
+	@Override
+	protected BRLPersistence getBrlXmlPersistence() {
+		return BRDRTXMLPersistence.getInstance();
+	}
+	
+}

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/contenthandler/WorkingSetHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/contenthandler/WorkingSetHandler.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/contenthandler/WorkingSetHandler.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -1,46 +1,9 @@
 package org.drools.guvnor.server.contenthandler;
 
-import org.apache.log4j.spi.LoggerFactory;
-import org.drools.guvnor.client.rpc.RuleAsset;
 import org.drools.guvnor.client.rpc.WorkingSetConfigData;
-import org.drools.repository.AssetItem;
-import org.drools.repository.PackageItem;
-import org.drools.repository.RulesRepositoryException;
-import org.slf4j.Logger;
 
-import com.google.gwt.user.client.rpc.SerializableException;
-import com.thoughtworks.xstream.XStream;
-import com.thoughtworks.xstream.io.xml.DomDriver;
-
 /**
  *
  */
-public class WorkingSetHandler extends ContentHandler {
-	private static final Logger log = org.slf4j.LoggerFactory.getLogger(WorkingSetHandler.class);
-	
-	private static final XStream xt = new XStream( new DomDriver() );
-	
-    public void retrieveAssetContent(RuleAsset asset, PackageItem pkg, AssetItem item)
-            throws SerializableException {
-        if (item.getContent() != null && item.getContent().length() > 0) {
-            try {
-				asset.content = (WorkingSetConfigData) xt.fromXML(item.getContent());
-			} catch (RulesRepositoryException e) {
-				log.error("error marshalling working set: " + asset.metaData.name, e);
-				throw new SerializableException(e.getMessage());
-			}
-        } else {
-        	asset.content = new WorkingSetConfigData();
-        }
-    }
-
-    public void storeAssetContent(RuleAsset asset, AssetItem repoAsset) throws SerializableException {
-    	try {
-			WorkingSetConfigData wsData = (WorkingSetConfigData) asset.content;
-			repoAsset.updateContent(xt.toXML(wsData));
-		} catch (Exception e) {
-			log.error("error marshalling working set: " + asset.metaData.name, e);
-			throw new SerializableException(e.getMessage());
-		}
-    }
+public class WorkingSetHandler extends BaseXStreamContentHandler<WorkingSetConfigData> {
 }

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/modeldriven (from rev 32495, labs/jbossrules/branches/guvnor_rules_templates_baunax_esteban_diega/drools-guvnor/src/main/java/org/drools/guvnor/server/modeldriven)

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/modeldriven/template (from rev 32495, labs/jbossrules/branches/guvnor_rules_templates_baunax_esteban_diega/drools-guvnor/src/main/java/org/drools/guvnor/server/modeldriven/template)

Deleted: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/modeldriven/template/TemplateModelDataProvider.java
===================================================================
--- labs/jbossrules/branches/guvnor_rules_templates_baunax_esteban_diega/drools-guvnor/src/main/java/org/drools/guvnor/server/modeldriven/template/TemplateModelDataProvider.java	2010-04-09 21:14:41 UTC (rev 32495)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/modeldriven/template/TemplateModelDataProvider.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -1,24 +0,0 @@
-package org.drools.guvnor.server.modeldriven.template;
-
-import org.drools.guvnor.client.modeldriven.dt.TemplateModel;
-import org.drools.template.DataProvider;
-
-public class TemplateModelDataProvider implements DataProvider {
-
-	private String[][] rows;
-	private int rowsCount;
-	private int currRow = 0;
-
-	public TemplateModelDataProvider(TemplateModel model) {
-		this.rows = model.getTableAsArray();
-		rowsCount = model.getRowsCount();
-	}
-	
-	public boolean hasNext() {
-		return rowsCount != -1 && currRow < rowsCount;
-	}
-
-	public String[] next() {
-		return rows[currRow++];
-	}
-}

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/modeldriven/template/TemplateModelDataProvider.java (from rev 32495, labs/jbossrules/branches/guvnor_rules_templates_baunax_esteban_diega/drools-guvnor/src/main/java/org/drools/guvnor/server/modeldriven/template/TemplateModelDataProvider.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/modeldriven/template/TemplateModelDataProvider.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/modeldriven/template/TemplateModelDataProvider.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -0,0 +1,24 @@
+package org.drools.guvnor.server.modeldriven.template;
+
+import org.drools.guvnor.client.modeldriven.dt.TemplateModel;
+import org.drools.template.DataProvider;
+
+public class TemplateModelDataProvider implements DataProvider {
+
+	private String[][] rows;
+	private int rowsCount;
+	private int currRow = 0;
+
+	public TemplateModelDataProvider(TemplateModel model) {
+		this.rows = model.getTableAsArray();
+		rowsCount = model.getRowsCount();
+	}
+	
+	public boolean hasNext() {
+		return rowsCount != -1 && currRow < rowsCount;
+	}
+
+	public String[] next() {
+		return rows[currRow++];
+	}
+}

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/util/BRDRTPersistence.java (from rev 32495, labs/jbossrules/branches/guvnor_rules_templates_baunax_esteban_diega/drools-guvnor/src/main/java/org/drools/guvnor/server/util/BRDRTPersistence.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/util/BRDRTPersistence.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/util/BRDRTPersistence.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -0,0 +1,95 @@
+package org.drools.guvnor.server.util;
+
+import java.io.ByteArrayInputStream;
+
+import org.drools.guvnor.client.modeldriven.brl.RuleModel;
+import org.drools.guvnor.client.modeldriven.dt.TemplateModel;
+import org.drools.template.DataProvider;
+import org.drools.template.DataProviderCompiler;
+import org.drools.template.objects.ArrayDataProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class persists a {@link TemplateModel} to DRL template 
+ * 
+ * @author baunax
+ */
+public class BRDRTPersistence extends BRDRLPersistence {
+	private static final Logger log = LoggerFactory.getLogger(BRDRTPersistence.class);
+    private static final BRLPersistence INSTANCE = new BRDRTPersistence();
+    private static final String PACKAGE_DECLARATION = "\npackage __template_dummy_package__\n";
+
+    private BRDRTPersistence() {
+    	super();
+    }
+
+    public static BRLPersistence getInstance() {
+        return INSTANCE;
+    }
+    
+    @Override
+    public String marshal(RuleModel model) {
+    	TemplateModel tplModel = (TemplateModel) model;
+    	String ruleTemplate = super.marshalRule(model);
+    	log.debug("ruleTemplate:\n{}", ruleTemplate);
+    	DataProviderCompiler tplCompiler = new DataProviderCompiler();
+    	DataProvider dataProvider; 
+    	if (tplModel.getRowsCount() > 0) {
+    		dataProvider = new ArrayDataProvider(tplModel.getTableAsArray());
+    	} else {
+    		dataProvider = new ArrayDataProvider(generateEmptyIterator(tplModel));
+    	}
+    	
+    	String generatedDRl = tplCompiler.compile(dataProvider, new ByteArrayInputStream(ruleTemplate.getBytes()))
+    		.substring(PACKAGE_DECLARATION.length()).trim();
+    	
+    	log.debug("generated drl:\n{}", generatedDRl);
+		return generatedDRl;
+    }
+    
+	private String[][] generateEmptyIterator(TemplateModel tplModel) {
+		String[][] rows = new String[1][];
+
+		String[] interpolationVariables = tplModel.getInterpolationVariablesList();
+		if (interpolationVariables == null || interpolationVariables.length == 0) {
+			rows[0] = new String[] { "" };
+		} else {
+			for (int i = 0; i < interpolationVariables.length; i++) {
+				interpolationVariables[i] += "_na";
+			}
+			rows[0] = interpolationVariables;
+		}
+		return rows;
+	}
+
+	@Override
+    protected void marshalHeader(RuleModel model, StringBuilder buf) {
+    	TemplateModel tplModel = (TemplateModel) model;
+    	buf.append("template header\n");
+    	
+    	String[] interpolationVariables = tplModel.getInterpolationVariablesList();
+		if (interpolationVariables.length == 0) {
+			buf.append("test_var").append('\n');
+		} else {
+			for (String var : interpolationVariables) {
+				buf.append(var).append('\n');
+			}
+		}
+		buf.append(PACKAGE_DECLARATION)
+    		.append("\ntemplate \"" + super.marshalRuleName(tplModel) + "\"\n\n");
+    	super.marshalHeader(model, buf);
+    }
+    
+    @Override
+    protected String marshalRuleName(RuleModel model) {
+    	return super.marshalRuleName(model) + "_@{row.rowNumber}";
+    }
+    
+    @Override
+    protected void marshalFooter(StringBuilder buf) {
+    	super.marshalFooter(buf);
+    	buf.append("\nend template");
+    }
+    
+}

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/util/BRDRTXMLPersistence.java (from rev 32495, labs/jbossrules/branches/guvnor_rules_templates_baunax_esteban_diega/drools-guvnor/src/main/java/org/drools/guvnor/server/util/BRDRTXMLPersistence.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/util/BRDRTXMLPersistence.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/util/BRDRTXMLPersistence.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -0,0 +1,43 @@
+package org.drools.guvnor.server.util;
+
+import org.drools.guvnor.client.modeldriven.brl.RuleModel;
+import org.drools.guvnor.client.modeldriven.dt.TemplateModel;
+
+/**
+ * This class persists the template rule model to XML and back.
+ *
+ * This is the 'brl' xml format (Business Rule Language).
+ *
+ * @author baunax at gmail.com
+ * @author dieguitoll at gmail.com
+ */
+public class BRDRTXMLPersistence extends BRXMLPersistence {
+	
+	private static final BRLPersistence INSTANCE = new BRDRTXMLPersistence();
+	
+	private BRDRTXMLPersistence() {
+		super();
+	}
+	
+	public static BRLPersistence getInstance() {
+		return INSTANCE;
+	}
+	
+	@Override
+	public String marshal(RuleModel model) {
+		((TemplateModel) model).putInSync();
+		return super.marshal(model);
+	}
+	
+	@Override
+	public TemplateModel unmarshal(String xml) {
+		TemplateModel model = (TemplateModel) super.unmarshal(xml);
+		model.putInSync();
+		return model;
+	}
+	
+	@Override
+	protected RuleModel createEmptyModel() {
+		return new TemplateModel();
+	}
+}

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/util/RowLoader.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/util/RowLoader.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/util/RowLoader.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -5,7 +5,6 @@
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.lang.reflect.Method;
-import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.List;
@@ -15,12 +14,9 @@
 import org.drools.repository.RulesRepositoryException;
 
 public class RowLoader {
-
-
-    private static SimpleDateFormat DF = new SimpleDateFormat("yyyy-MM-dd");
     private String[] headers;
     private String[] headerTypes;
-    List             extractors;
+    List<Method>             extractors;
 
     public String[] getHeaders() {
         return headers;
@@ -30,11 +26,10 @@
         return headerTypes;
     }
 
-
     public String[] getRow(AssetItem item) {
         String[] row = new String[headers.length];
         for ( int i = 0; i < row.length; i++ ) {
-            Method meth = (Method) extractors.get( i );
+            Method meth = extractors.get( i );
             try {
                 Object val = meth.invoke( item,
                                           (Object[]) null );
@@ -63,10 +58,13 @@
     public RowLoader(String resourcename) {
 
         InputStream in = RowLoader.class.getResourceAsStream( "/" + resourcename + ".properties" );
+        if (in == null) {
+        	throw new IllegalStateException("can't find resource name: /" + resourcename + ".properties");
+        }
         BufferedReader reader = new BufferedReader( new InputStreamReader( in ) );
         List<String> fields = new ArrayList<String>();
         List<String> fieldTypes = new ArrayList<String>();
-        extractors = new ArrayList();
+        extractors = new ArrayList<Method>();
         String line;
 
         try {
@@ -96,8 +94,8 @@
         } finally {
             closeStream( reader );
         }
-        headers = (String[]) fields.toArray( new String[fields.size()] );
-        headerTypes = (String[]) fieldTypes.toArray( new String[fieldTypes.size()] );
+        headers = fields.toArray( new String[fields.size()] );
+        headerTypes = fieldTypes.toArray( new String[fieldTypes.size()] );
     }
 
     private void closeStream(BufferedReader reader) {

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/util/TestEnvironmentSessionHelper.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/util/TestEnvironmentSessionHelper.java	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/util/TestEnvironmentSessionHelper.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -18,6 +18,8 @@
 
 
 import java.io.File;
+import java.io.FileOutputStream;
+import java.io.PrintWriter;
 
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
@@ -60,26 +62,63 @@
                 String home = System.getProperty("guvnor.repository.dir");
 	            repository = config.getJCRRepository(home);
 
-	            Session testSession = repository.login(
-	                                                                     new SimpleCredentials("alan_parsons", "password".toCharArray()));
+	            Session testSession = repository.login(new SimpleCredentials("alan_parsons", "password".toCharArray()));
 
 	            RulesRepositoryAdministrator admin = new RulesRepositoryAdministrator(testSession);
 	            if (erase && admin.isRepositoryInitialized()) {
-
 	                admin.clearRulesRepository( );
 	            }
 	            config.setupRulesRepository( testSession );
+	            PrintWriter out = new PrintWriter(new FileOutputStream("/tmp/pepe.txt"));
+				//dump(testSession.getRootNode(), out);
+//	            OutputStream out = new FileOutputStream("/tmp/pepe.txt");
+//	            testSession.exportSystemView("/", out, true, false);
+				out.close();
 	            return testSession;
 	        } else {
-	            return repository.login(
-	                             new SimpleCredentials("alan_parsons", "password".toCharArray()));
+	            return repository.login(new SimpleCredentials("alan_parsons", "password".toCharArray()));
 	        }
-    	} catch (RepositoryException e) {
+    	} catch (Exception e) {
     		throw new IllegalStateException(e);
     	}
 
     }
 
+	/** Recursively outputs the contents of the given node. */
+//	private static void dump(Node node, PrintWriter out) throws Exception {
+//		
+//		// First output the node path
+//		out.println(node.getPath());
+//		// Skip the virtual (and large!) jcr:system subtree
+//		if (node.getName().equals("jcr:system")) {
+//			return;
+//		}
+//
+//		// Then output the properties
+//		PropertyIterator properties = node.getProperties();
+//		while (properties.hasNext()) {
+//			Property property = properties.nextProperty();
+//			if (property.getDefinition().isMultiple()) {
+//				// A multi-valued property, print all values
+//				Value[] values = property.getValues();
+//				for (int i = 0; i < values.length; i++) {
+//					out.println(property.getPath() + " = "
+//							+ values[i].getString());
+//				}
+//			} else {
+//				// A single-valued property
+//				out.println(property.getPath() + " = "
+//						+ property.getString());
+//			}
+//		}
+//
+//		// Finally output all the child nodes recursively
+//		NodeIterator nodes = node.getNodes();
+//		while (nodes.hasNext()) {
+//			dump(nodes.nextNode(), out);
+//		}
+//	}
+    
     /**
      * Uses the given user name.
      */

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/resources/contenthandler.properties
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/resources/contenthandler.properties	2010-04-09 21:51:33 UTC (rev 32497)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/resources/contenthandler.properties	2010-04-09 22:20:49 UTC (rev 32498)
@@ -36,4 +36,5 @@
 xml=org.drools.guvnor.server.contenthandler.XmlFileHandler
 #Working_Set
 workingset=org.drools.guvnor.server.contenthandler.WorkingSetHandler
-
+#Rule Template
+template=org.drools.guvnor.server.contenthandler.TemplateModelHandler

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/webapp/org.drools.guvnor.Guvnor/images/new_template.gif (from rev 32495, labs/jbossrules/branches/guvnor_rules_templates_baunax_esteban_diega/drools-guvnor/src/main/webapp/org.drools.guvnor.Guvnor/images/new_template.gif)
===================================================================
(Binary files differ)

Copied: labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/util/BRDRTPersistenceTest.java (from rev 32495, labs/jbossrules/branches/guvnor_rules_templates_baunax_esteban_diega/drools-guvnor/src/test/java/org/drools/guvnor/server/util/BRDRTPersistenceTest.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/util/BRDRTPersistenceTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/util/BRDRTPersistenceTest.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -0,0 +1,224 @@
+package org.drools.guvnor.server.util;
+
+import java.util.HashSet;
+
+import junit.framework.TestCase;
+
+import org.drools.guvnor.client.modeldriven.brl.ActionFieldValue;
+import org.drools.guvnor.client.modeldriven.brl.ActionInsertFact;
+import org.drools.guvnor.client.modeldriven.brl.FactPattern;
+import org.drools.guvnor.client.modeldriven.brl.IAction;
+import org.drools.guvnor.client.modeldriven.brl.IPattern;
+import org.drools.guvnor.client.modeldriven.brl.ISingleFieldConstraint;
+import org.drools.guvnor.client.modeldriven.brl.SingleFieldConstraint;
+import org.drools.guvnor.client.modeldriven.dt.TemplateModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BRDRTPersistenceTest extends TestCase {
+	private static final Logger log = LoggerFactory.getLogger(BRDRTPersistenceTest.class); 
+	private BRLPersistence p;
+
+	@Override
+	protected void setUp() throws Exception {
+		p = BRDRTPersistence.getInstance();
+	}
+
+	@Override
+	protected void tearDown() throws Exception {
+		p = null;
+	}
+	
+	public void testGenerateEmptyDRL() {
+		String expected = 
+				"rule \"null_0\"\n" + 
+				"	dialect \"mvel\"\n" + 
+				"	when\n" + 
+				"	then\n" + 
+				"end";
+
+		final String drl = p.marshal(new TemplateModel());
+		log.info("drl :\n{}", drl);
+
+		assertNotNull(drl);
+		assertEquals(expected, drl);
+	}
+
+	public void testEmptyData() {
+		String expected = 
+				"rule \"with composite_0\"\n" + 
+				"	dialect \"mvel\"\n" + 
+				"	when\n" + 
+				"		$p : Person( name == \"name_na\" )\n" + 
+				"	then\n" + 
+				"end";
+        TemplateModel m = new TemplateModel();
+        m.name = "with composite";
+        m.lhs = new IPattern[1];
+        m.rhs = new IAction[0];
+
+        FactPattern fp = new FactPattern("Person");
+        fp.boundName = "$p";
+        
+        SingleFieldConstraint sfc = new SingleFieldConstraint("name");
+        sfc.fieldName = "name";
+        sfc.value = "name";
+        sfc.operator = "==";
+        	
+        sfc.constraintValueType = ISingleFieldConstraint.TYPE_TEMPLATE;
+        fp.addConstraint(sfc);
+        
+        m.lhs[0] = fp;
+        final String drl = p.marshal(m);
+		log.info("drl :\n{}", drl);
+        assertNotNull(drl);
+        assertEquals(expected, drl);
+	}
+
+	public void testEmptyDataWithRHS() {
+		String expected = 
+				"rule \"with composite_1\"\n" + 
+				"	dialect \"mvel\"\n" + 
+				"	when\n" + 
+				"		$p : Person( name == \"diegoll\" )\n" + 
+				"	then\n" + 
+				"		Person fact0 = new Person();\n" + 
+				"		fact0.setAge( 87 );\n" + 
+				"		insert(fact0 );\n" + 
+				"end\n" + 
+				"\n" + 
+				"rule \"with composite_0\"\n" + 
+				"	dialect \"mvel\"\n" + 
+				"	when\n" + 
+				"		$p : Person( name == \"baunax\" )\n" + 
+				"	then\n" + 
+				"		Person fact0 = new Person();\n" + 
+				"		fact0.setAge( 34 );\n" + 
+				"		insert(fact0 );\n" + 
+				"end";
+
+		TemplateModel m = new TemplateModel();
+        m.name = "with composite";
+        m.lhs = new IPattern[1];
+        m.rhs = new IAction[1];
+
+        FactPattern fp = new FactPattern("Person");
+        fp.boundName = "$p";
+        
+        SingleFieldConstraint sfc = new SingleFieldConstraint("name");
+        sfc.fieldName = "name";
+        sfc.value = "name";
+        sfc.operator = "==";
+        	
+        sfc.constraintValueType = ISingleFieldConstraint.TYPE_TEMPLATE;
+        fp.addConstraint(sfc);
+        
+        m.lhs[0] = fp;
+        
+        ActionInsertFact aif = new ActionInsertFact("Person");
+        ActionFieldValue afv = new ActionFieldValue("age", "age", ""); 
+        afv.nature = ActionFieldValue.TYPE_TEMPLATE;
+        
+        aif.addFieldValue(afv);
+        m.rhs[0] = aif;
+        
+        m.addRow(new String[] {"baunax", "34"});
+        m.addRow(new String[] {"diegoll", "87"});
+        final String drl = p.marshal(m);
+		log.info("drl :\n{}", drl);
+		
+        assertNotNull(drl);
+        assertEquals(expected, drl);
+	}
+	
+	public void testWithData() {
+		String expected = 
+				"rule \"with composite_1\"\n" + 
+				"	dialect \"mvel\"\n" + 
+				"	when\n" + 
+				"		$p : Person( name == \"diegoll\" )\n" + 
+				"	then\n" + 
+				"end\n" + 
+				"\n" + 
+				"rule \"with composite_0\"\n" + 
+				"	dialect \"mvel\"\n" + 
+				"	when\n" + 
+				"		$p : Person( name == \"baunax\" )\n" + 
+				"	then\n" + 
+				"end";
+		
+        TemplateModel m = new TemplateModel();
+        m.name = "with composite";
+        m.lhs = new IPattern[1];
+        m.rhs = new IAction[0];
+
+        FactPattern fp = new FactPattern("Person");
+        fp.boundName = "$p";
+        
+        SingleFieldConstraint sfc = new SingleFieldConstraint("name");
+        sfc.fieldName = "name";
+        sfc.value = "name";
+        sfc.operator = "==";
+        	
+        sfc.constraintValueType = ISingleFieldConstraint.TYPE_TEMPLATE;
+        fp.addConstraint(sfc);
+        
+        m.lhs[0] = fp;
+        
+        m.addRow(new String[] {"baunax"});
+        m.addRow(new String[] {"diegoll"});
+        
+        final String drl = p.marshal(m);
+		log.info("drl :\n{}", drl);
+        assertNotNull(drl);
+        assertEquals(expected, drl);
+
+	}
+	
+	public void testWithDataAndSync() {
+        TemplateModel m = new TemplateModel();
+        m.name = "with composite";
+        m.lhs = new IPattern[1];
+        m.rhs = new IAction[0];
+
+        FactPattern fp = new FactPattern("Person");
+        fp.boundName = "$p";
+        
+        SingleFieldConstraint sfc = new SingleFieldConstraint("name");
+        sfc.fieldName = "name";
+        sfc.value = "name";
+        sfc.operator = "==";
+        sfc.constraintValueType = ISingleFieldConstraint.TYPE_TEMPLATE;
+        
+        fp.addConstraint(sfc);
+        
+        sfc = new SingleFieldConstraint("age");
+        sfc.fieldName = "age";
+        sfc.value = "age";
+        sfc.operator = "==";
+        sfc.constraintValueType = ISingleFieldConstraint.TYPE_TEMPLATE;
+        
+        fp.addConstraint(sfc);
+        
+        m.lhs[0] = fp;
+
+        m.putInSync();
+        HashSet<String> expected = new HashSet<String>();
+        expected.add("name");
+        expected.add("age");
+        assertEquals(expected, m.getTable().keySet());
+        
+        fp.removeConstraint(1);
+        m.putInSync();
+        
+        expected.remove("age");
+        assertEquals(expected, m.getTable().keySet());
+        
+        fp.addConstraint(sfc);
+        m.putInSync();
+        
+        expected.add("age");
+        assertEquals(expected, m.getTable().keySet());
+        
+	}
+}

Copied: labs/jbossrules/trunk/drools-templates/src/main/java/org/drools/template/objects/ArrayDataProvider.java (from rev 32495, labs/jbossrules/branches/guvnor_rules_templates_baunax_esteban_diega/drools-templates/src/main/java/org/drools/template/objects/ArrayDataProvider.java)
===================================================================
--- labs/jbossrules/trunk/drools-templates/src/main/java/org/drools/template/objects/ArrayDataProvider.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-templates/src/main/java/org/drools/template/objects/ArrayDataProvider.java	2010-04-09 22:20:49 UTC (rev 32498)
@@ -0,0 +1,29 @@
+package org.drools.template.objects;
+
+import org.drools.template.DataProvider;
+
+public class ArrayDataProvider implements DataProvider {
+
+	private String[][] rows;
+	private int currRow;
+	private int rowsCount;
+	
+	public ArrayDataProvider(String[][] rows) {
+		if (rows == null) {
+			this.rows = new String[0][0];
+		} else {
+			this.rows = rows;
+		}
+		this.currRow = 0;
+		this.rowsCount = this.rows.length;
+	}
+	
+	public boolean hasNext() {
+		return currRow < rowsCount;
+	}
+
+	public String[] next() {
+		return rows[currRow++];
+	}
+
+}



More information about the jboss-svn-commits mailing list