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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Mar 25 15:26:33 EDT 2010


Author: baunax
Date: 2010-03-25 15:26:29 -0400 (Thu, 25 Mar 2010)
New Revision: 32217

Added:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/FactTypeFilter.java
   labs/jbossrules/trunk/drools-factconstraint/
   labs/jbossrules/trunk/drools-factconstraint/pom.xml
   labs/jbossrules/trunk/drools-factconstraint/src/
   labs/jbossrules/trunk/drools-factconstraint/src/main/
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/factconstraint/
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/factconstraint/dataprovider/
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/dataprovider/
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/dataprovider/predefined/
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/helper/
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/helper/ConstraintsContainer.java
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/predefined/
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/predefined/IntegerConstraint.java
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/predefined/NotNullConstraint.java
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/predefined/RangeConstraint.java
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/ArgumentNotSetException.java
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/Constraint.java
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/DefaultConstraintImpl.java
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/ValidationResult.java
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/dataprovider/
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/dataprovider/DefaultFieldDataProviderImpl.java
   labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/dataprovider/FieldDataProvider.java
   labs/jbossrules/trunk/drools-factconstraint/src/main/resources/
   labs/jbossrules/trunk/drools-factconstraint/src/test/
   labs/jbossrules/trunk/drools-factconstraint/src/test/java/
   labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/
   labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/
   labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/
   labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/IntegerConstraintTest.java
   labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/NotNullConstraintTest.java
   labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/RangeConstraintTest.java
   labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/helper/
   labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/helper/ConstraintsConstrainerTest.java
   labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/model/
   labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/model/Person.java
   labs/jbossrules/trunk/drools-factconstraint/src/test/resources/
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FreeFormLineWidget.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/GlobalCollectionAddWidget.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModellerWidget.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/NewSubPackageWizard.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/WorkingSetManager.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/WorkingSetConfigData.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/ConstraintEditor.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/client/ruleeditor/WorkingSetSelectorPopup.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/public/images/workingset.gif
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/contenthandler/WorkingSetHandler.java
   labs/jbossrules/trunk/drools-guvnor/src/main/resources/workingsetList.properties
   labs/jbossrules/trunk/drools-guvnor/src/main/webapp/org.drools.guvnor.Guvnor/images/workingset.gif
Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/SuggestionCompletionEngine.java
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/brl/ExpressionFormLine.java
   labs/jbossrules/trunk/drools-guvnor/build.xml
   labs/jbossrules/trunk/drools-guvnor/pom.xml
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/Guvnor.gwt.xml
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/admin/StateManager.java
   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/DirtyableHorizontalPane.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/DirtyableVerticalPane.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/RulePackageSelector.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/DeploymentPanel.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/ExplorerNodeConfig.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/ExplorerViewCenterPanel.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/ActionCallMethodWidget.java
   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/ActionRetractFactWidget.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ActionSetFieldWidget.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/CompositeFactPatternWidget.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/DSLSentenceWidget.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ExpressionBuilder.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/FromAccumulateCompositeFactPatternWidget.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FromCollectCompositeFactPatternWidget.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FromCompositeFactPatternWidget.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/modeldriven/ui/factPattern/Connectives.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/factPattern/PopupCreator.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/PackageEditor2.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/SuggestionCompletionCache.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/MetaData.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/PackageConfigData.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/PushResponse.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryService.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryServiceAsync.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryServiceFactory.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/NewAssetWizard.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/RuleViewer.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rulelist/AssetItemGrid.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/public/Guvnor.css
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/RepositoryServiceServlet.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/ServiceImplementation.java
   labs/jbossrules/trunk/drools-guvnor/src/main/resources/contenthandler.properties
   labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/PopulateDataTest.java
   labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/PackageItem.java
   labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/PackageIterator.java
   labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RepositorySessionUtil.java
   labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RulesRepository.java
   labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/VersionableItem.java
   labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/PackageItemTest.java
   labs/jbossrules/trunk/pom.xml
Log:
merge with https://svn.jboss.org/repos/labs/labs/jbossrules/branches/factsConstraints_baunax_esteban
- Added drools-factconstraint module to hosts constraints for facts' fields.
- Added 3 constraint impls  as an example.
- Added new WorkingSet Asset for configuring valid Facts and constraints over its fields.

Guvnor: 
- Show components as read-only for Facts not contained inside active WorkingSets.
- Use constraint rules during rule verification.

Copied: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/FactTypeFilter.java (from rev 32184, labs/jbossrules/branches/factsConstraints_baunax_esteban/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/FactTypeFilter.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/FactTypeFilter.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/FactTypeFilter.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,15 @@
+package org.drools.guvnor.client.modeldriven;
+
+/**
+ *
+ * @author esteban.aliverti at gmail.com
+ */
+public interface FactTypeFilter {
+
+    /**
+     * Indicates if a fact should be filtered or not.
+     * @param originalFact the fact.
+     * @return if a fact should be filtered or not.
+     */
+    public boolean filter(String originalFact);
+}

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/SuggestionCompletionEngine.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/SuggestionCompletionEngine.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/SuggestionCompletionEngine.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -662,6 +662,15 @@
         }
     }
 
+    public void filterFactTypes(FactTypeFilter filter){
+
+        for (String factType : this.getFactTypes()) {
+            if (filter.filter(factType)){
+                this.modelFields.remove(factType);
+            }
+        }
+    }
+
     public void setFieldsForTypes(Map<String,ModelField[]> fieldsForType){
     	this.modelFields.clear();
         this.modelFields.putAll(fieldsForType);
@@ -677,6 +686,10 @@
 		return types;
     }
 
+    public boolean containsFactType(String modelClassName){
+        return this.modelFields.containsKey(modelClassName);
+    }
+
     private ModelField getField(String modelClassName, String fieldName){
         ModelField[] fields = this.modelFields.get(modelClassName);
 

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/brl/ExpressionFormLine.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/brl/ExpressionFormLine.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/guvnor/client/modeldriven/brl/ExpressionFormLine.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -23,7 +23,6 @@
 
 	public String getText() {
 		return new ToStringVisitor().buildString(getRootExpression());
-		//return parts.isEmpty() ? "" : parts.getFirst().getText();
 	}
 	
 	public void appendPart(ExpressionPart part) {


Property changes on: labs/jbossrules/trunk/drools-factconstraint
___________________________________________________________________
Name: svn:ignore
   + target


Added: labs/jbossrules/trunk/drools-factconstraint/pom.xml
===================================================================
--- labs/jbossrules/trunk/drools-factconstraint/pom.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-factconstraint/pom.xml	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,27 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+      <artifactId>drools</artifactId>
+      <groupId>org.drools</groupId>
+      <version>5.1.0.SNAPSHOT</version>
+   </parent>
+  <artifactId>drools-factconstraint</artifactId>
+  <packaging>jar</packaging>
+  <name>Drools :: Fact Constraint</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.7</version>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+        <groupId>org.drools</groupId>
+        <artifactId>drools-verifier</artifactId>
+        <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>


Property changes on: labs/jbossrules/trunk/drools-factconstraint/pom.xml
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/helper/ConstraintsContainer.java
===================================================================
--- labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/helper/ConstraintsContainer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/helper/ConstraintsContainer.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,63 @@
+package org.drools.guvnor.client.factconstraints.helper;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.guvnor.client.factcontraints.Constraint;
+
+public class ConstraintsContainer {
+	Map<String, List<Constraint>> constraints = new HashMap<String, List<Constraint>>();
+	
+	public ConstraintsContainer(Constraint[] constraints) {
+		this(Arrays.asList(constraints));
+	}
+	
+	public ConstraintsContainer(Collection<Constraint> constraints) {
+		if (constraints != null && !constraints.isEmpty()) {
+			for (Constraint c : constraints) {
+				addConstraint(c);
+			}
+		}
+	}
+
+	public ConstraintsContainer() {
+		
+	}
+	
+	public  void addConstraint(Constraint c) {
+		List<Constraint> list = constraints.get(c.getFactType());
+		if (list == null) {
+			list = new LinkedList<Constraint>();
+			constraints.put(c.getFactType(), list);
+		}
+		list.add(c);
+	}
+
+	public List<Constraint> getConstraints(String factType) {
+		return Collections.unmodifiableList(constraints.get(factType));
+	}
+	
+	public List<Constraint> getConstraints(String factType, String fieldName) {
+		
+		List<Constraint> list = constraints.get(factType);
+		if (list == null || list.isEmpty()) {
+			return Collections.emptyList();
+		}
+		List<Constraint> res = new LinkedList<Constraint>();
+		for (Constraint c : list) {
+			if (fieldName.equals(c.getFieldName())) {
+				res.add(c);
+			}
+		} 
+		return res;
+	}
+	
+	public boolean hasConstraints(String FactType) {
+		return constraints.containsKey(FactType);
+	}
+}


Property changes on: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/helper/ConstraintsContainer.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/predefined/IntegerConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/predefined/IntegerConstraint.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/predefined/IntegerConstraint.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,52 @@
+package org.drools.guvnor.client.factconstraints.predefined;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.guvnor.client.factcontraints.DefaultConstraintImpl;
+import org.drools.guvnor.client.factcontraints.ValidationResult;
+
+/**
+ *
+ * @author esteban.aliverti at gmail.com
+ */
+public class IntegerConstraint extends DefaultConstraintImpl {
+
+
+    public IntegerConstraint(){
+    }
+
+    @Override
+    public String getVerifierRule() {
+        List<String> constraints = new ArrayList<String>();
+        constraints.add("valueType != Field.INT");
+
+        return this.createVerifierRuleTemplate("Integer_Field_Constraint", constraints, "The value must be an integer"); //I18N
+    }
+
+    @Override
+    public ValidationResult validate(Object value) {
+        ValidationResult result = new ValidationResult();
+
+        if (value == null){
+            result.setSuccess(false);
+            result.setMessage("The value is null"); //TODO: I18N
+        }else if (value instanceof Integer){
+            result.setSuccess(true);
+        }else if (value instanceof String){
+            try{
+                Integer.parseInt((String)value);
+                result.setSuccess(true);
+            } catch(NumberFormatException ex){
+                result.setSuccess(false);
+                result.setMessage(ex.getMessage()); //TODO: I18N
+            }
+        }else{
+            result.setSuccess(false);
+            result.setMessage("Invalid value type "+value.getClass().getName()); //TODO: I18N
+        }
+
+        return result;
+    }
+    
+}


Property changes on: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/predefined/IntegerConstraint.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/predefined/NotNullConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/predefined/NotNullConstraint.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/predefined/NotNullConstraint.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,41 @@
+package org.drools.guvnor.client.factconstraints.predefined;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.guvnor.client.factcontraints.DefaultConstraintImpl;
+import org.drools.guvnor.client.factcontraints.ValidationResult;
+
+/**
+ *
+ * @author esteban.aliverti at gmail.com
+ */
+public class NotNullConstraint extends DefaultConstraintImpl {
+
+
+    public NotNullConstraint(){
+    }
+
+    @Override
+    public String getVerifierRule() {
+        List<String> constraints = new ArrayList<String>();
+        constraints.add("valueType == Field.UNKNOWN");
+
+        return this.createVerifierRuleTemplate("Not_null_Field_Constraint", constraints, "The value could not be null"); //I18N
+    }
+
+    @Override
+    public ValidationResult validate(Object value) {
+        ValidationResult result = new ValidationResult();
+
+        if (value == null){
+            result.setSuccess(false);
+            result.setMessage("The value could not be null"); //TODO: I18N
+        }else {
+            result.setSuccess(true);
+        }
+
+        return result;
+    }
+    
+}


Property changes on: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/predefined/NotNullConstraint.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/predefined/RangeConstraint.java
===================================================================
--- labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/predefined/RangeConstraint.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/predefined/RangeConstraint.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,89 @@
+package org.drools.guvnor.client.factconstraints.predefined;
+
+import org.drools.guvnor.client.factcontraints.ArgumentNotSetException;
+import org.drools.guvnor.client.factcontraints.DefaultConstraintImpl;
+import org.drools.guvnor.client.factcontraints.ValidationResult;
+
+/**
+ *
+ * @author esteban.aliverti at gmail.com
+ */
+public class RangeConstraint extends DefaultConstraintImpl {
+
+    public static final String RANGE_CONSTRAINT_MIN = "Min.value";
+    public static final String RANGE_CONSTRAINT_MAX = "Max.value";
+
+    public RangeConstraint() {
+        //set default values
+        this.setArgumentValue(RANGE_CONSTRAINT_MIN, "0");
+        this.setArgumentValue(RANGE_CONSTRAINT_MAX, "0");
+    }
+
+    @Override
+    public String getVerifierRule() {
+    	return this.createVerifierRuleTemplate("Range_Field_Constraint", null, "The value must be between " + getMin() + " and " + getMax()); //I18N
+    }
+
+    @Override
+    public ValidationResult validate(Object value) {
+        ValidationResult result = new ValidationResult();
+
+        try {
+            if (value == null || !(value instanceof Number || value instanceof String)) {
+                result.setSuccess(false);
+                if (value == null) {
+                    result.setMessage("The value is null"); //TODO: I18N
+                } else {
+                    result.setMessage("Invalid value type " + value.getClass().getName()); //TODO: I18N
+                }
+            } else {
+            	double min = Double.parseDouble(getMin()) ;
+                double max = Double.parseDouble(getMax());
+                double d = Double.parseDouble(value.toString());
+                result.setSuccess(d > min && d < max);
+                if (!result.isSuccess()) {
+                    result.setMessage("The value should be between " + min + " and " + max); //TODO: I18N
+                }
+            }
+        } catch (Throwable t) {
+            result.setSuccess(false);
+            result.setMessage(t.getMessage()); //TODO: I18N
+        }
+
+        return result;
+    }
+
+    public String getMin() {
+    	try {
+			return (String) this.getMandatoryArgument(RANGE_CONSTRAINT_MIN);
+		} catch (ArgumentNotSetException e) {
+			throw new IllegalStateException(e);
+		}
+    }
+    
+    public String getMax() {
+    	try {
+			return (String) this.getMandatoryArgument(RANGE_CONSTRAINT_MAX);
+		} catch (ArgumentNotSetException e) {
+			throw new IllegalStateException(e);
+		}
+    }
+    
+    @Override
+    protected String getVerifierRestrictionPatternTemplate() {
+        StringBuilder restrictionPattern = new StringBuilder();
+
+        restrictionPattern.append("      ($restriction :LiteralRestriction(\n");
+        restrictionPattern.append("            fieldGuid == $field.guid,\n");
+        restrictionPattern.append("            valueType == Field.INT,\n");
+        restrictionPattern.append("            intValue < " + getMin() + " || > " + getMax() + "\n");
+        restrictionPattern.append("      ) OR\n");
+        restrictionPattern.append("      $restriction :LiteralRestriction(\n");
+        restrictionPattern.append("            fieldGuid == $field.guid,\n");
+        restrictionPattern.append("            valueType == Field.DOUBLE,\n");
+        restrictionPattern.append("            doubleValue < " + getMin() + " || > " + getMax() + "\n");
+        restrictionPattern.append("      ))\n");
+
+        return restrictionPattern.toString();
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factconstraints/predefined/RangeConstraint.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/ArgumentNotSetException.java
===================================================================
--- labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/ArgumentNotSetException.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/ArgumentNotSetException.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,16 @@
+package org.drools.guvnor.client.factcontraints;
+
+/**
+ *
+ * @author esteban.aliverti at gmail.com
+ */
+public class ArgumentNotSetException extends Exception {
+
+    public ArgumentNotSetException(String message) {
+        super(message);
+    }
+
+    public ArgumentNotSetException() {
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/ArgumentNotSetException.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/Constraint.java
===================================================================
--- labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/Constraint.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/Constraint.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,23 @@
+package org.drools.guvnor.client.factcontraints;
+
+import java.io.Serializable;
+import java.util.Set;
+
+/**
+ *
+ * @author esteban.aliverti at gmail.com
+ * @author baunax at gmail.com
+ */
+public interface Constraint extends Serializable {
+	public String getFactType();
+    public void setFactType(String factType);
+    public String getFieldName();
+    public void setFieldName(String fieldName);
+    public Set<String> getArgumentKeys();
+    public Object getArgumentValue(String key);
+    public void setArgumentValue(String key, String value);
+
+    public ValidationResult validate(Object value);
+    public String getVerifierRule();
+	public String getConstraintName();
+}


Property changes on: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/Constraint.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/DefaultConstraintImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/DefaultConstraintImpl.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/DefaultConstraintImpl.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,316 @@
+package org.drools.guvnor.client.factcontraints;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ *
+ * @author esteban.aliverti at gmail.com
+ * @author baunax at gmail.com
+ */
+public abstract class DefaultConstraintImpl implements Constraint {
+	private long ruleNum = 0;
+    private String factType;
+    private String fieldName;
+    private Map<String, String> arguments = new HashMap<String, String>();
+    private String verifierPackageTemplate = "";
+    private String verifierImportsTemplate = "";
+    private String verifierGlobalsTemplate = "";
+    private String verifierRuleNameTemplate = "";
+    private String verifierRuleWhenTemplate = "";
+    private String verifierFieldPatternTemplate = "";
+    private String verifierRestrictionPatternTemplate = "";
+    private String verifierRuleThenTemplate = "";
+    private String verifierActionTemplate = "";
+    private String verifierRuleEndTemplate = "";
+
+    /**
+     * Fills the rule's template sections. Subclasses of DefaultConstraintImpl
+     * can modify these templates, use the ${} or both.
+     */
+    public DefaultConstraintImpl() {
+
+        this.verifierPackageTemplate += "package org.drools.verifier.consequence\n";
+
+        this.verifierImportsTemplate += "import org.drools.verifier.components.*;\n";
+        this.verifierImportsTemplate += "import java.util.Map;\n";
+        this.verifierImportsTemplate += "import java.util.HashMap;\n";
+        this.verifierImportsTemplate += "import org.drools.verifier.report.components.VerifierMessage;\n";
+        this.verifierImportsTemplate += "import org.drools.verifier.data.VerifierReport;\n";
+        this.verifierImportsTemplate += "import org.drools.verifier.report.components.Severity;\n";
+        this.verifierImportsTemplate += "import org.drools.verifier.report.components.MessageType;\n";
+
+
+        this.verifierGlobalsTemplate += "global VerifierReport result;\n";
+
+
+        this.verifierRuleNameTemplate += "rule \"${ruleName}\"\n";
+
+        this.verifierRuleWhenTemplate += "  when\n";
+
+        this.verifierFieldPatternTemplate += "      $field :Field(\n";
+        this.verifierFieldPatternTemplate += "          objectTypeName == \"${factType}\",\n";
+        this.verifierFieldPatternTemplate += "          name == \"${fieldName}\"\n";
+        this.verifierFieldPatternTemplate += "      )\n";
+
+        this.verifierRestrictionPatternTemplate += "      $restriction :LiteralRestriction(\n";
+        this.verifierRestrictionPatternTemplate += "            fieldGuid == $field.guid,\n";
+        this.verifierRestrictionPatternTemplate += "            ${constraints}\n";
+        this.verifierRestrictionPatternTemplate += "      )\n";
+
+        this.verifierRuleThenTemplate += "  then\n";
+
+        this.verifierActionTemplate += "      Map<String,String> impactedRules = new HashMap<String,String>();\n";
+        this.verifierActionTemplate += "      impactedRules.put( $restriction.getRuleGuid(), $restriction.getRuleName());\n";
+        this.verifierActionTemplate += "      result.add(new VerifierMessage(\n";
+        //this.verifierActionTemplate += "                        impactedRules,\n";
+        this.verifierActionTemplate += "                        Severity.ERROR,\n";
+        this.verifierActionTemplate += "                        MessageType.NOT_SPECIFIED,\n";
+        this.verifierActionTemplate += "                        $restriction,\n";
+        this.verifierActionTemplate += "                        \"${message}\" ) );\n";
+
+        //this.verifierActionTemplate += "      System.out.println(\"doubleValue= \"+$restriction.getDoubleValue());\n";
+        //this.verifierActionTemplate += "      System.out.println(\"intValue= \"+$restriction.getIntValue());\n";
+
+        this.verifierRuleEndTemplate += "end\n";
+    }
+
+    private String concatRule() {
+        StringBuilder rule = new StringBuilder();
+
+        rule.append(this.getVerifierPackagePrefixTemplate());
+        rule.append(this.getVerifierPackageTemplate());
+        rule.append(this.getVerifierPackageSufixTemplate());
+
+        rule.append(this.getVerifierImportsPrefixTemplate());
+        rule.append(this.getVerifierImportsTemplate());
+        rule.append(this.getVerifierImportsSufixTemplate());
+
+        rule.append(this.getVerifierGlobalsPrefixTemplate());
+        rule.append(this.getVerifierGlobalsTemplate());
+        rule.append(this.getVerifierGlobalsSufixTemplate());
+
+        rule.append(this.getVerifierRuleNamePrefixTemplate());
+        rule.append(this.getVerifierRuleNameTemplate());
+        rule.append(this.getVerifierRuleNameSufixTemplate());
+
+        rule.append(this.getVerifierRuleWhenTemplate());
+
+        rule.append(this.getVerifierFieldPatternPrefixTemplate());
+        rule.append(this.getVerifierFieldPatternTemplate());
+        rule.append(this.getVerifierFieldPatternSufixTemplate());
+
+        rule.append(this.getVerifierRestrictionPatternPrefixTemplate());
+        rule.append(this.getVerifierRestrictionPatternTemplate());
+        rule.append(this.getVerifierRestrictionPatternSufixTemplate());
+
+        rule.append(this.getVerifierRuleThenTemplate());
+
+        rule.append(this.getVerifierActionPrefixTemplate());
+        rule.append(this.getVerifierActionTemplate());
+        rule.append(this.getVerifierActionSufixTemplate());
+
+        rule.append(this.getVerifierRuleEndTemplate());
+        rule.append(this.getVerifierRuleEndSufixTemplate());
+
+
+        return rule.toString();
+
+    }
+
+    protected String createVerifierRuleTemplate(String ruleName, List<String> constraints, String message) {
+        if (ruleName == null) {
+            ruleName = "Constraint_rule";
+            
+        }
+        ruleName += "_" + ruleNum++; 
+        String rule = this.concatRule().replace("${ruleName}", ruleName);
+        rule = rule.replace("${factType}", this.getFactType());
+        rule = rule.replace("${fieldName}", this.getFieldName());
+        if (constraints != null && !constraints.isEmpty()) {
+            String constraintsTxt = "";
+            String delimiter = "";
+            for (String c : constraints) {
+                constraintsTxt += delimiter + c + "\n";
+                if (delimiter.equals("")) {
+                    delimiter = ",";
+                }
+            }
+            rule = rule.replace("${constraints}", constraintsTxt);
+        }
+        rule = rule.replace("${message}", (message == null || message.equals("")) ? "Invalid Value" : message);
+
+        return rule;
+    }
+
+    protected Object getMandatoryArgument(String key) throws ArgumentNotSetException {
+        if (!this.arguments.containsKey(key)) {
+            throw new ArgumentNotSetException("The argument " + key + " doesn't exist.");
+        }
+
+        Object value = this.getArgumentValue(key);
+
+        if (value == null) {
+            throw new ArgumentNotSetException("The argument " + key + " is null.");
+        }
+
+        return value;
+    }
+
+    public void setFactType(String factType) {
+        this.factType = factType;
+    }
+
+    public void setFieldName(String fieldName) {
+        this.fieldName = fieldName;
+    }
+
+    public String getFactType() {
+        return factType;
+    }
+
+    public String getFieldName() {
+        return fieldName;
+    }
+
+    public Set<String> getArgumentKeys() {
+        return this.arguments.keySet();
+    }
+
+    public Object getArgumentValue(String key) {
+        return this.arguments.get(key);
+    }
+
+    public void setArgumentValue(String key, String value) {
+        this.arguments.put(key, value);
+    }
+
+    public ValidationResult validate(Object value) {
+        ValidationResult result = new ValidationResult();
+        result.setSuccess(true);
+
+        return result;
+    }
+
+    public String getVerifierRule() {
+        return null;
+    }
+
+    public String getConstraintName() {
+    	return getClass().getName().substring(getClass().getName().lastIndexOf('.') + 1);
+    }
+    
+    /* Action */
+    protected String getVerifierActionTemplate() {
+        return verifierActionTemplate;
+    }
+
+    protected String getVerifierActionPrefixTemplate() {
+        return "";
+    }
+
+    protected String getVerifierActionSufixTemplate() {
+        return "";
+    }
+
+    /* Field Pattern */
+    protected String getVerifierFieldPatternTemplate() {
+        return verifierFieldPatternTemplate;
+    }
+
+    protected String getVerifierFieldPatternPrefixTemplate() {
+        return "";
+    }
+
+    protected String getVerifierFieldPatternSufixTemplate() {
+        return "";
+    }
+
+    /* Globals*/
+    protected String getVerifierGlobalsTemplate() {
+        return verifierGlobalsTemplate;
+    }
+
+    protected String getVerifierGlobalsPrefixTemplate() {
+        return "";
+    }
+
+    protected String getVerifierGlobalsSufixTemplate() {
+        return "";
+    }
+
+    /* Imports */
+    protected String getVerifierImportsTemplate() {
+        return verifierImportsTemplate;
+    }
+
+    protected String getVerifierImportsPrefixTemplate() {
+        return "";
+    }
+
+    protected String getVerifierImportsSufixTemplate() {
+        return "";
+    }
+
+    /* Package (mmmh... sounds useless) */
+    protected String getVerifierPackageTemplate() {
+        return verifierPackageTemplate;
+    }
+
+    protected String getVerifierPackagePrefixTemplate() {
+        return "";
+    }
+
+    protected String getVerifierPackageSufixTemplate() {
+        return "";
+    }
+
+    /* Restriction Pattern */
+    protected String getVerifierRestrictionPatternTemplate() {
+        return verifierRestrictionPatternTemplate;
+    }
+
+    protected String getVerifierRestrictionPatternPrefixTemplate() {
+        return "";
+    }
+
+    protected String getVerifierRestrictionPatternSufixTemplate() {
+        return "";
+    }
+
+    /* end */
+    protected String getVerifierRuleEndTemplate() {
+        return verifierRuleEndTemplate;
+    }
+
+    protected String getVerifierRuleEndSufixTemplate() {
+        return "";
+    }
+
+    /* Rule Name */
+    protected String getVerifierRuleNameTemplate() {
+        return verifierRuleNameTemplate;
+    }
+
+    protected String getVerifierRuleNamePrefixTemplate() {
+        return "";
+    }
+
+    protected String getVerifierRuleNameSufixTemplate() {
+        return "";
+    }
+
+    /* then */
+    protected String getVerifierRuleThenTemplate() {
+        return verifierRuleThenTemplate;
+    }
+
+    /* when */
+    protected String getVerifierRuleWhenTemplate() {
+        return verifierRuleWhenTemplate;
+    }
+
+    
+}


Property changes on: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/DefaultConstraintImpl.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/ValidationResult.java
===================================================================
--- labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/ValidationResult.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/ValidationResult.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,30 @@
+package org.drools.guvnor.client.factcontraints;
+
+/**
+ *
+ * @author esteban.aliverti at gmail.com
+ */
+public class ValidationResult {
+    private boolean success;
+    private String message;
+
+    public boolean isSuccess() {
+        return success;
+    }
+
+    public void setSuccess(boolean success) {
+        this.success = success;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    
+
+    
+}


Property changes on: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/ValidationResult.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/dataprovider/DefaultFieldDataProviderImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/dataprovider/DefaultFieldDataProviderImpl.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/dataprovider/DefaultFieldDataProviderImpl.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,64 @@
+package org.drools.guvnor.client.factcontraints.dataprovider;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.guvnor.client.factcontraints.ArgumentNotSetException;
+
+/**
+ *
+ * @author esteban.aliverti at gmail.com
+ */
+public abstract class DefaultFieldDataProviderImpl implements FieldDataProvider {
+
+    private String factType;
+    private String fieldName;
+    private Map<String, Object> arguments = new HashMap<String, Object>();
+
+    public DefaultFieldDataProviderImpl() {
+
+    }
+
+    protected Object getMandatoryArgument(String key) throws ArgumentNotSetException {
+        if (!this.arguments.containsKey(key)) {
+            throw new ArgumentNotSetException("The argument " + key + " doesn't exist.");
+        }
+
+        Object value = this.getArgumentValue(key);
+
+        if (value == null) {
+            throw new ArgumentNotSetException("The argument " + key + " is null.");
+        }
+
+        return value;
+    }
+
+    public void setFactType(String factType) {
+        this.factType = factType;
+    }
+
+    public void setFieldName(String fieldName) {
+        this.fieldName = fieldName;
+    }
+
+    public String getFactType() {
+        return factType;
+    }
+
+    public String getFieldName() {
+        return fieldName;
+    }
+
+    public String[] getArgumentKeys() {
+        return this.arguments.keySet().toArray(new String[this.arguments.size()]);
+    }
+
+    public Object getArgumentValue(String key) {
+        return this.arguments.get(key);
+    }
+
+    public void setArgumentValue(String key, Object value) {
+        this.arguments.put(key, value);
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/dataprovider/DefaultFieldDataProviderImpl.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/dataprovider/FieldDataProvider.java
===================================================================
--- labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/dataprovider/FieldDataProvider.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/dataprovider/FieldDataProvider.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,19 @@
+package org.drools.guvnor.client.factcontraints.dataprovider;
+
+import java.util.Map;
+
+/**
+ *
+ * @author esteban.aliverti at gmail.com
+ */
+public interface FieldDataProvider {
+    public void setFactTYpe(String factType);
+    public void setFieldName(String fieldName);
+    
+    public String[] getArgumentKeys();
+    public Object getArgumentValue(String key);
+    public void setArgumentValue(String key, Object value);
+
+    public Map<Object,String> getData();
+    public Object getDefault();
+}


Property changes on: labs/jbossrules/trunk/drools-factconstraint/src/main/java/org/drools/guvnor/client/factcontraints/dataprovider/FieldDataProvider.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/IntegerConstraintTest.java
===================================================================
--- labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/IntegerConstraintTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/IntegerConstraintTest.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,161 @@
+package org.drools.factconstraint;
+
+import java.util.Collection;
+
+import org.drools.builder.ResourceType;
+import org.drools.guvnor.client.factconstraints.predefined.IntegerConstraint;
+import org.drools.guvnor.client.factcontraints.Constraint;
+import org.drools.guvnor.client.factcontraints.ValidationResult;
+import org.drools.io.ResourceFactory;
+import org.drools.verifier.Verifier;
+import org.drools.verifier.VerifierConfiguration;
+import org.drools.verifier.VerifierConfigurationImpl;
+import org.drools.verifier.VerifierError;
+import org.drools.verifier.builder.VerifierBuilder;
+import org.drools.verifier.builder.VerifierBuilderFactory;
+import org.drools.verifier.data.VerifierReport;
+import org.drools.verifier.report.components.Severity;
+import org.drools.verifier.report.components.VerifierMessageBase;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ *
+ * @author esteban.aliverti at gmail.com
+ */
+public class IntegerConstraintTest {
+
+    private Constraint cons;
+
+    @Before
+    public void setup() {
+        cons = new IntegerConstraint();
+        cons.setFactType("Person");
+        cons.setFieldName("age");
+
+
+        System.out.println("Validation Rule:\n" + cons.getVerifierRule() + "\n\n");
+
+    }
+
+    @Test
+    public void testValidConstraint() {
+
+        ValidationResult result = cons.validate(12);
+        Assert.assertTrue(result.isSuccess());
+
+        result = cons.validate(new Integer("12"));
+        Assert.assertTrue(result.isSuccess());
+
+        result = cons.validate("12");
+        Assert.assertTrue(result.isSuccess());
+
+    }
+
+    @Test
+    public void testInvalidConstraint() {
+
+        ValidationResult result = cons.validate(new Object());
+        Assert.assertFalse(result.isSuccess());
+        System.out.println("Message: " + result.getMessage());
+
+        result = cons.validate("");
+        Assert.assertFalse(result.isSuccess());
+        System.out.println("Message: " + result.getMessage());
+
+        result = cons.validate("ABC");
+        Assert.assertFalse(result.isSuccess());
+        System.out.println("Message: " + result.getMessage());
+
+        result = cons.validate(null);
+        Assert.assertFalse(result.isSuccess());
+        System.out.println("Message: " + result.getMessage());
+
+        result = cons.validate(new Long("12"));
+        Assert.assertFalse(result.isSuccess());
+        System.out.println("Message: " + result.getMessage());
+
+        result = cons.validate(12L);
+        Assert.assertFalse(result.isSuccess());
+        System.out.println("Message: " + result.getMessage());
+
+        result = cons.validate(12.8);
+        Assert.assertFalse(result.isSuccess());
+        System.out.println("Message: " + result.getMessage());
+
+
+    }
+
+    @Test
+    public void testUsingVerifier() {
+
+        String ruleToVerify = "";
+
+        //FAIL
+        ruleToVerify += "package org.drools.factconstraint.test\n\n";
+        ruleToVerify += "import org.drools.factconstraint.model.*\n";
+        ruleToVerify += "rule \"rule1\"\n";
+        ruleToVerify += "   when\n";
+        ruleToVerify += "       Person(age == 'abc')\n";
+        ruleToVerify += "   then\n";
+        ruleToVerify += "       System.out.println(\"Rule fired\");\n";
+        ruleToVerify += "end\n\n";
+
+        //OK
+        ruleToVerify += "rule \"rule2\"\n";
+        ruleToVerify += "   when\n";
+        ruleToVerify += "       Person(age == 12)\n";
+        ruleToVerify += "   then\n";
+        ruleToVerify += "       System.out.println(\"Rule fired\");\n";
+        ruleToVerify += "end\n\n";
+
+        //FAIL
+        ruleToVerify += "rule \"rule3\"\n";
+        ruleToVerify += "   when\n";
+        ruleToVerify += "       Person(age == '')\n";
+        ruleToVerify += "   then\n";
+        ruleToVerify += "       System.out.println(\"Rule fired\");\n";
+        ruleToVerify += "end\n";
+
+
+        VerifierBuilder vBuilder = VerifierBuilderFactory.newVerifierBuilder();
+
+        //VerifierConfiguration conf = new DefaultVerifierConfiguration();
+        VerifierConfiguration conf = new VerifierConfigurationImpl();
+
+        conf.getVerifyingResources().put(ResourceFactory.newByteArrayResource(cons.getVerifierRule().getBytes()), ResourceType.DRL);
+
+        Verifier verifier = vBuilder.newVerifier(conf);
+
+        verifier.addResourcesToVerify(ResourceFactory.newByteArrayResource(ruleToVerify.getBytes()),
+                ResourceType.DRL);
+
+        if (verifier.hasErrors()) {
+            for (VerifierError error : verifier.getErrors()) {
+                System.out.println(error.getMessage());
+            }
+            throw new RuntimeException("Error building verifier");
+        }
+
+        Assert.assertFalse(verifier.hasErrors());
+
+        boolean noProblems = verifier.fireAnalysis();
+        Assert.assertTrue(noProblems);
+
+        VerifierReport result = verifier.getResult();
+
+        Collection<VerifierMessageBase> warnings = result.getBySeverity(Severity.ERROR);
+
+        int counter = 0;
+        for (VerifierMessageBase message : warnings) {
+            System.out.println(message);
+            counter++;
+        }
+
+        Assert.assertEquals(2,
+                counter);
+
+        verifier.dispose();
+    }
+}


Property changes on: labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/IntegerConstraintTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/NotNullConstraintTest.java
===================================================================
--- labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/NotNullConstraintTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/NotNullConstraintTest.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,145 @@
+package org.drools.factconstraint;
+
+import java.util.Collection;
+import org.drools.builder.ResourceType;
+import org.drools.guvnor.client.factconstraints.predefined.NotNullConstraint;
+import org.drools.guvnor.client.factcontraints.Constraint;
+import org.drools.guvnor.client.factcontraints.ValidationResult;
+import org.drools.io.ResourceFactory;
+import org.drools.verifier.Verifier;
+import org.drools.verifier.VerifierConfiguration;
+import org.drools.verifier.VerifierConfigurationImpl;
+import org.drools.verifier.VerifierError;
+import org.drools.verifier.builder.VerifierBuilder;
+import org.drools.verifier.builder.VerifierBuilderFactory;
+import org.drools.verifier.data.VerifierReport;
+import org.drools.verifier.report.components.Severity;
+import org.drools.verifier.report.components.VerifierMessageBase;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ *
+ * @author esteban.aliverti at gmail.com
+ */
+public class NotNullConstraintTest {
+
+    private Constraint cons;
+
+    @Before
+    public void setup() {
+        cons = new NotNullConstraint();
+        cons.setFactType("Person");
+        cons.setFieldName("name");
+        System.out.println("Validation Rule:\n" + cons.getVerifierRule() + "\n\n");
+
+    }
+
+    @Test
+    public void testValidConstraint(){
+
+        ValidationResult result = cons.validate(new Object());
+        Assert.assertTrue(result.isSuccess());
+
+        result = cons.validate("");
+        Assert.assertTrue(result.isSuccess());
+
+        result = cons.validate("ABC");
+        Assert.assertTrue(result.isSuccess());
+
+        result = cons.validate(new Long("12"));
+        Assert.assertTrue(result.isSuccess());
+
+        result = cons.validate(12L);
+        Assert.assertTrue(result.isSuccess());
+
+        result = cons.validate(12.8);
+        Assert.assertTrue(result.isSuccess());
+
+
+
+    }
+
+    @Test
+    public void testInvalidConstraint(){
+
+        ValidationResult result = cons.validate(null);
+        Assert.assertFalse(result.isSuccess());
+        System.out.println("Message: "+result.getMessage());
+
+    }
+
+    @Test
+    public void testUsingVerifier() {
+
+        String ruleToVerify = "";
+
+        //OK
+        ruleToVerify += "package org.drools.factconstraint.test\n\n";
+        ruleToVerify += "import org.drools.factconstraint.model.*\n";
+        ruleToVerify += "rule \"rule1\"\n";
+        ruleToVerify += "   when\n";
+        ruleToVerify += "       Person(name == 'John McClane')\n";
+        ruleToVerify += "   then\n";
+        ruleToVerify += "       System.out.println(\"Rule fired\");\n";
+        ruleToVerify += "end\n\n";
+
+        //FAIL
+        ruleToVerify += "rule \"rule2\"\n";
+        ruleToVerify += "   when\n";
+        ruleToVerify += "       Person(name == null)\n";
+        ruleToVerify += "   then\n";
+        ruleToVerify += "       System.out.println(\"Rule fired\");\n";
+        ruleToVerify += "end\n\n";
+
+        //OK
+        ruleToVerify += "rule \"rule3\"\n";
+        ruleToVerify += "   when\n";
+        ruleToVerify += "       Person(name == '')\n";
+        ruleToVerify += "   then\n";
+        ruleToVerify += "       System.out.println(\"Rule fired\");\n";
+        ruleToVerify += "end\n";
+
+
+        VerifierBuilder vBuilder = VerifierBuilderFactory.newVerifierBuilder();
+
+        //VerifierConfiguration conf = new DefaultVerifierConfiguration();
+        VerifierConfiguration conf = new VerifierConfigurationImpl();
+
+        conf.getVerifyingResources().put(ResourceFactory.newByteArrayResource(cons.getVerifierRule().getBytes()), ResourceType.DRL);
+
+        Verifier verifier = vBuilder.newVerifier(conf);
+
+        verifier.addResourcesToVerify(ResourceFactory.newByteArrayResource(ruleToVerify.getBytes()),
+                ResourceType.DRL);
+
+        if (verifier.hasErrors()) {
+            for (VerifierError error : verifier.getErrors()) {
+                System.out.println(error.getMessage());
+            }
+            throw new RuntimeException("Error building verifier");
+        }
+
+        Assert.assertFalse(verifier.hasErrors());
+
+        boolean noProblems = verifier.fireAnalysis();
+        Assert.assertTrue(noProblems);
+
+        VerifierReport result = verifier.getResult();
+
+        Collection<VerifierMessageBase> warnings = result.getBySeverity(Severity.ERROR);
+
+        int counter = 0;
+        for (VerifierMessageBase message : warnings) {
+            System.out.println(message);
+            counter++;
+        }
+
+        Assert.assertEquals(1,
+                counter);
+
+        verifier.dispose();
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/NotNullConstraintTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/RangeConstraintTest.java
===================================================================
--- labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/RangeConstraintTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/RangeConstraintTest.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,256 @@
+package org.drools.factconstraint;
+
+import java.util.Collection;
+import org.drools.builder.ResourceType;
+import org.drools.guvnor.client.factconstraints.predefined.RangeConstraint;
+import org.drools.guvnor.client.factcontraints.Constraint;
+import org.drools.guvnor.client.factcontraints.ValidationResult;
+import org.drools.io.ResourceFactory;
+import org.drools.verifier.Verifier;
+import org.drools.verifier.VerifierConfiguration;
+import org.drools.verifier.VerifierConfigurationImpl;
+import org.drools.verifier.VerifierError;
+import org.drools.verifier.builder.VerifierBuilder;
+import org.drools.verifier.builder.VerifierBuilderFactory;
+import org.drools.verifier.data.VerifierReport;
+import org.drools.verifier.report.components.Severity;
+import org.drools.verifier.report.components.VerifierMessageBase;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ *
+ * @author esteban.aliverti at gmail.com
+ */
+public class RangeConstraintTest {
+
+    private Constraint cons;
+
+    @Before
+    public void setup() {
+        cons = new RangeConstraint();
+        cons.setFactType("Person");
+        cons.setFieldName("age");
+
+        System.out.println("Validation Rule:\n" + cons.getVerifierRule() + "\n\n");
+
+    }
+
+    @Test
+    public void testValidConstraint(){
+
+        cons.setArgumentValue(RangeConstraint.RANGE_CONSTRAINT_MIN, "-0.5");
+        cons.setArgumentValue(RangeConstraint.RANGE_CONSTRAINT_MAX, "100");
+        
+        ValidationResult result = cons.validate(12);
+        Assert.assertTrue(result.isSuccess());
+
+        result = cons.validate(new Integer("12"));
+        Assert.assertTrue(result.isSuccess());
+
+        result = cons.validate("12");
+        Assert.assertTrue(result.isSuccess());
+
+        result = cons.validate(0.6);
+        Assert.assertTrue(result.isSuccess());
+
+        result = cons.validate(new Float("-0.3"));
+        Assert.assertTrue(result.isSuccess());
+
+        result = cons.validate("90.76");
+        Assert.assertTrue(result.isSuccess());
+
+    }
+
+    @Test
+    public void testInvalidConstraint(){
+
+        cons.setArgumentValue(RangeConstraint.RANGE_CONSTRAINT_MIN, "-0.5");
+        cons.setArgumentValue(RangeConstraint.RANGE_CONSTRAINT_MAX, "100");
+
+        ValidationResult result = cons.validate(new Object());
+        Assert.assertFalse(result.isSuccess());
+        System.out.println("Message: "+result.getMessage());
+
+        result = cons.validate(null);
+        Assert.assertFalse(result.isSuccess());
+        System.out.println("Message: "+result.getMessage());
+
+        result = cons.validate("");
+        Assert.assertFalse(result.isSuccess());
+        System.out.println("Message: "+result.getMessage());
+
+        result = cons.validate("ABC");
+        Assert.assertFalse(result.isSuccess());
+        System.out.println("Message: "+result.getMessage());
+
+        result = cons.validate(new Long("-100"));
+        Assert.assertFalse(result.isSuccess());
+        System.out.println("Message: "+result.getMessage());
+
+        result = cons.validate(-0.5);
+        Assert.assertFalse(result.isSuccess());
+        System.out.println("Message: "+result.getMessage());
+
+        result = cons.validate(100);
+        Assert.assertFalse(result.isSuccess());
+        System.out.println("Message: "+result.getMessage());
+
+
+    }
+
+    @Test
+    public void testUsingVerifier() {
+
+        //age constraint
+        cons.setArgumentValue(RangeConstraint.RANGE_CONSTRAINT_MIN, "0");
+        cons.setArgumentValue(RangeConstraint.RANGE_CONSTRAINT_MAX, "120");
+        System.out.println("Validation Rule:\n" + cons.getVerifierRule() + "\n\n");
+
+        //salary constraint
+        Constraint salaryCons = new RangeConstraint();
+        salaryCons.setFactType("Person");
+        salaryCons.setFieldName("salary");
+        salaryCons.setArgumentValue(RangeConstraint.RANGE_CONSTRAINT_MIN, "0");
+        salaryCons.setArgumentValue(RangeConstraint.RANGE_CONSTRAINT_MAX, "1000.6");
+
+        System.out.println("Validation Rule:\n" + salaryCons.getVerifierRule() + "\n\n");
+
+
+        String ruleToVerify = "";
+
+        //OK
+        ruleToVerify += "package org.drools.factconstraint.test\n\n";
+        ruleToVerify += "import org.drools.factconstraint.model.*\n";
+        ruleToVerify += "rule \"rule1\"\n";
+        ruleToVerify += "   when\n";
+        ruleToVerify += "       Person(age == 10)\n";
+        ruleToVerify += "   then\n";
+        ruleToVerify += "       System.out.println(\"Rule fired\");\n";
+        ruleToVerify += "end\n\n";
+
+        //FAIL - 1
+        ruleToVerify += "rule \"rule2\"\n";
+        ruleToVerify += "   when\n";
+        ruleToVerify += "       Person(age == -5)\n";
+        ruleToVerify += "   then\n";
+        ruleToVerify += "       System.out.println(\"Rule fired\");\n";
+        ruleToVerify += "end\n\n";
+
+        //OK
+        ruleToVerify += "rule \"rule3\"\n";
+        ruleToVerify += "   when\n";
+        ruleToVerify += "       Person(age == 100)\n";
+        ruleToVerify += "   then\n";
+        ruleToVerify += "       System.out.println(\"Rule fired\");\n";
+        ruleToVerify += "end\n";
+
+        //OK
+        ruleToVerify += "rule \"rule4\"\n";
+        ruleToVerify += "   when\n";
+        ruleToVerify += "       Person(salary == 100)\n";
+        ruleToVerify += "   then\n";
+        ruleToVerify += "       System.out.println(\"Rule fired\");\n";
+        ruleToVerify += "end\n";
+
+        //OK
+        ruleToVerify += "rule \"rule5\"\n";
+        ruleToVerify += "   when\n";
+        ruleToVerify += "       Person(salary == 89.67)\n";
+        ruleToVerify += "   then\n";
+        ruleToVerify += "       System.out.println(\"Rule fired\");\n";
+        ruleToVerify += "end\n";
+
+        //FAIL - 2
+        ruleToVerify += "rule \"rule6\"\n";
+        ruleToVerify += "   when\n";
+        ruleToVerify += "       Person(salary == 1000.7)\n";
+        ruleToVerify += "   then\n";
+        ruleToVerify += "       System.out.println(\"Rule fired\");\n";
+        ruleToVerify += "end\n";
+
+        //FAIL - 3
+        ruleToVerify += "rule \"rule7\"\n";
+        ruleToVerify += "   when\n";
+        ruleToVerify += "       Person(salary == 1001)\n";
+        ruleToVerify += "   then\n";
+        ruleToVerify += "       System.out.println(\"Rule fired\");\n";
+        ruleToVerify += "end\n";
+
+        //OK
+        ruleToVerify += "rule \"rule8\"\n";
+        ruleToVerify += "   when\n";
+        ruleToVerify += "       Person(age == 40, salary == 1000)\n";
+        ruleToVerify += "   then\n";
+        ruleToVerify += "       System.out.println(\"Rule fired\");\n";
+        ruleToVerify += "end\n";
+
+        //FAIL: age - 4
+        ruleToVerify += "rule \"rule9\"\n";
+        ruleToVerify += "   when\n";
+        ruleToVerify += "       Person(age == 400, salary == 1000)\n";
+        ruleToVerify += "   then\n";
+        ruleToVerify += "       System.out.println(\"Rule fired\");\n";
+        ruleToVerify += "end\n";
+
+        //FAIL salary - 5
+        ruleToVerify += "rule \"rule10\"\n";
+        ruleToVerify += "   when\n";
+        ruleToVerify += "       Person(age == 40, salary == 1003)\n";
+        ruleToVerify += "   then\n";
+        ruleToVerify += "       System.out.println(\"Rule fired\");\n";
+        ruleToVerify += "end\n";
+
+        //FAIL both (creates 2 warnings) - 6,7
+        ruleToVerify += "rule \"rule11\"\n";
+        ruleToVerify += "   when\n";
+        ruleToVerify += "       Person(age == 400, salary == 1003)\n";
+        ruleToVerify += "   then\n";
+        ruleToVerify += "       System.out.println(\"Rule fired\");\n";
+        ruleToVerify += "end\n";
+
+        //FAIL both (creates 2 warnings) - 8,9
+        ruleToVerify += "rule \"rule11\"\n";
+        ruleToVerify += "   when\n";
+        ruleToVerify += "       Person(age == 400, salary == -0.69)\n";
+        ruleToVerify += "   then\n";
+        ruleToVerify += "       System.out.println(\"Rule fired\");\n";
+        ruleToVerify += "end\n";
+
+        VerifierBuilder vBuilder = VerifierBuilderFactory.newVerifierBuilder();
+
+        //VerifierConfiguration conf = new DefaultVerifierConfiguration();
+        VerifierConfiguration conf = new VerifierConfigurationImpl();
+
+        conf.getVerifyingResources().put(ResourceFactory.newByteArrayResource(cons.getVerifierRule().getBytes()), ResourceType.DRL);
+        conf.getVerifyingResources().put(ResourceFactory.newByteArrayResource(salaryCons.getVerifierRule().getBytes()), ResourceType.DRL);
+
+        Verifier verifier = vBuilder.newVerifier(conf);
+
+        verifier.addResourcesToVerify(ResourceFactory.newByteArrayResource(ruleToVerify.getBytes()),
+                ResourceType.DRL);
+
+        if (verifier.hasErrors()) {
+            for (VerifierError error : verifier.getErrors()) {
+                System.out.println(error.getMessage());
+            }
+            throw new RuntimeException("Error building verifier");
+        }
+
+        Assert.assertFalse(verifier.hasErrors());
+
+        boolean noProblems = verifier.fireAnalysis();
+        Assert.assertTrue(noProblems);
+
+        VerifierReport result = verifier.getResult();
+
+        Collection<VerifierMessageBase> warnings = result.getBySeverity(Severity.ERROR);
+
+        System.out.println(warnings);
+
+        Assert.assertEquals(9, warnings.size());
+        verifier.dispose();
+    }
+
+}


Property changes on: labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/RangeConstraintTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/helper/ConstraintsConstrainerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/helper/ConstraintsConstrainerTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/helper/ConstraintsConstrainerTest.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,51 @@
+package org.drools.factconstraint.helper;
+
+import java.util.LinkedList;
+
+import org.drools.guvnor.client.factconstraints.helper.ConstraintsContainer;
+import org.drools.guvnor.client.factconstraints.predefined.IntegerConstraint;
+import org.drools.guvnor.client.factconstraints.predefined.NotNullConstraint;
+import org.drools.guvnor.client.factcontraints.Constraint;
+
+import static org.junit.Assert.*;
+import org.junit.Test;
+
+
+public class ConstraintsConstrainerTest {
+
+	@Test
+	public void test() {
+		LinkedList<Constraint> list = new LinkedList<Constraint>();
+		Constraint cons = new IntegerConstraint();
+        cons.setFactType("Person");
+        cons.setFieldName("age");
+        
+        list.add(cons);
+		ConstraintsContainer cc = new ConstraintsContainer(list);
+		assertTrue(cc.hasConstraints("Person"));
+		assertFalse(cc.hasConstraints("Person3"));
+		
+		assertEquals(1, cc.getConstraints("Person").size());
+		
+		cons = new NotNullConstraint();
+        cons.setFactType("Person");
+        cons.setFieldName("name");
+        
+        cc.addConstraint(cons);
+        assertEquals(2, cc.getConstraints("Person").size());
+        assertEquals(1, cc.getConstraints("Person", "age").size());
+        assertSame(cons, cc.getConstraints("Person", "name").get(0));
+        assertEquals(0, cc.getConstraints("Person", "toothCount").size());
+        
+        cons = new NotNullConstraint();
+        cons.setFactType("Pet");
+        cons.setFieldName("name");
+		
+        cc.addConstraint(cons);
+        
+        assertEquals(1, cc.getConstraints("Pet").size());
+        
+        assertEquals(1, cc.getConstraints("Pet", "name").size());
+	}
+	
+}


Property changes on: labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/helper/ConstraintsConstrainerTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/model/Person.java
===================================================================
--- labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/model/Person.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/model/Person.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,45 @@
+package org.drools.factconstraint.model;
+
+/**
+ *
+ * @author esteban.aliverti at gmail.com
+ */
+public class Person {
+    private String name;
+    private int age;
+    private double salary;
+
+    public Person(String name, int age,double salary) {
+        this.name = name;
+        this.age = age;
+        this.salary = salary;
+    }
+
+    public int getAge() {
+        return age;
+    }
+
+    public void setAge(int age) {
+        this.age = age;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public double getSalary() {
+        return salary;
+    }
+
+    public void setSalary(double salary) {
+        this.salary = salary;
+    }
+
+    
+
+    
+}


Property changes on: labs/jbossrules/trunk/drools-factconstraint/src/test/java/org/drools/factconstraint/model/Person.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: labs/jbossrules/trunk/drools-guvnor/build.xml
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/build.xml	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/build.xml	2010-03-25 19:26:29 UTC (rev 32217)
@@ -56,7 +56,7 @@
 		<gwt:compile outDir="target/gwt-compiled-output"
 			gwtHome="${gwt.home}"
 			classBase="org.drools.guvnor.Guvnor"
-			sourceclasspath="src/main/java; ../drools-compiler/src/main/java; ../lib/gwtext.jar; ../lib/gwt-diagrams-0.1.jar; ../lib/cobogw-1.0.jar"/>
+			sourceclasspath="src/main/java; ../drools-compiler/src/main/java; ../drools-factconstraint/src/main/java; ../lib/gwtext.jar; ../lib/gwt-diagrams-0.1.jar; ../lib/cobogw-1.0.jar"/>
 		<!-- get rid of old -->
 	 	 <delete>
 	      <fileset dir="src/main/webapp/org.drools.guvnor.Guvnor" includes="*.gwt.rpc *.cache.html *.cache.js *.cache.xml *.cache.png"/>

Modified: labs/jbossrules/trunk/drools-guvnor/pom.xml
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/pom.xml	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/pom.xml	2010-03-25 19:26:29 UTC (rev 32217)
@@ -167,6 +167,10 @@
          <artifactId>drools-verifier</artifactId>
       </dependency>
       <dependency>
+         <groupId>org.drools</groupId>
+         <artifactId>drools-factconstraint</artifactId>
+      </dependency>
+      <dependency>
          <groupId>wsdl4j</groupId>
          <artifactId>wsdl4j</artifactId>
          <version>1.6.2</version>

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/Guvnor.gwt.xml
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/Guvnor.gwt.xml	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/Guvnor.gwt.xml	2010-03-25 19:26:29 UTC (rev 32217)
@@ -3,11 +3,11 @@
 	<!-- Inherit the core Web Toolkit stuff.                  -->
 
     <inherits name="com.google.gwt.i18n.I18N"/>
-    <inherits name='com.google.gwt.user.User'/>
+    <inherits name="com.google.gwt.user.User"/>
     <inherits name="com.gwtext.GwtExt"/>
     <inherits name="com.gwtext.Pagebus"/>
-	<inherits name='pl.balon.gwt.diagrams.Diagrams'/>
-	<inherits name='org.cobogw.gwt.user.User'/>
+	<inherits name="pl.balon.gwt.diagrams.Diagrams"/>
+	<inherits name="org.cobogw.gwt.user.User"/>
 
 
     <!-- Here we put different locales (translations)

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/admin/StateManager.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/admin/StateManager.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/admin/StateManager.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -107,17 +107,16 @@
         initWidget( form );
     }
 
-    private void removeStatus() {
-        String name = currentStatuses.getItemText( currentStatuses.getSelectedIndex() );
+	private void removeStatus() {
+		String name = currentStatuses.getItemText(currentStatuses.getSelectedIndex());
 
-        RepositoryServiceFactory.getService().removeState( name,
-                                                           new GenericCallback() {
-                                                               public void onSuccess(Object data) {
-                                                                   Window.alert(constants.StatusRemoved());
-                                                                   refreshList();
-                                                               }
-                                                           } );
-    }
+		RepositoryServiceFactory.getService().removeState(name, new GenericCallback() {
+			public void onSuccess(Object data) {
+				Window.alert(constants.StatusRemoved());
+				refreshList();
+			}
+		});
+	}
 
     private void renameSelected() {
 
@@ -126,20 +125,18 @@
 
         String oldName = currentStatuses.getItemText( currentStatuses.getSelectedIndex() );
 
-        if ( newName != null ) {
-        	if (!NewAssetWizard.validatePathPerJSR170(newName)) {
-        		return;
-        	}
-            RepositoryServiceFactory.getService().renameState( oldName,
-                                                               newName,
-                                                               new GenericCallback<Object>() {
-                                                                   public void onSuccess(Object data) {
-                                                                       Window.alert(constants.StatusRenamed());
-                                                                       refreshList();
-                                                                   }
-                                                               } );
-        }
-    }
+		if (newName != null) {
+			if (!NewAssetWizard.validatePathPerJSR170(newName)) {
+				return;
+			}
+			RepositoryServiceFactory.getService().renameState(oldName, newName, new GenericCallback<Void>() {
+				public void onSuccess(Void data) {
+					Window.alert(constants.StatusRenamed());
+					refreshList();
+				}
+			});
+		}
+	}
 
     private void refreshList() {
         LoadingPopup.showMessage(constants.LoadingStatuses());

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-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/AssetFormats.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -74,6 +74,8 @@
     
     public static final String PROPERTIES = "properties";
 
+    public static final String WORKING_SET = "workingset";
+    
     /**
      * The following group the assets together for lists, helpers etc...
      */
@@ -82,9 +84,8 @@
     /**
      * These define assets that are really package level "things". Used to decide when to flush any caches.
      */
-    private static final String[] PACKAGE_DEPENCENCIES = new String[] {AssetFormats.FUNCTION, AssetFormats.DSL, AssetFormats.MODEL, AssetFormats.ENUMERATION, AssetFormats.DRL_MODEL};
+    private static final String[] PACKAGE_DEPENCENCIES = new String[] {AssetFormats.FUNCTION, AssetFormats.DSL, AssetFormats.MODEL, AssetFormats.ENUMERATION, AssetFormats.DRL_MODEL, AssetFormats.WORKING_SET};
 
-
     /**
      * Will return true if the given asset format is a package dependency (eg a function, DSL, model etc).
      * Package dependencies are needed before the package is validated, and any rule assets are processed.

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/DirtyableHorizontalPane.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/DirtyableHorizontalPane.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/DirtyableHorizontalPane.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -31,7 +31,7 @@
         Widget element;
         
         for ( int i = 0; i < widNumber; i++ ) {
-            element =  (Widget) getWidget(i);
+            element = getWidget(i);
             if ((element instanceof DirtyableWidget && ((DirtyableWidget) element).isDirty()) || 
             		(element instanceof DirtyableContainer && ((DirtyableContainer) element).hasDirty())) 
                 return true;

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/DirtyableVerticalPane.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/DirtyableVerticalPane.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/DirtyableVerticalPane.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -30,7 +30,7 @@
         Widget element;
         
         for ( int i = 0; i < widNumber; i++ ) {
-            element =  (Widget) getWidget(i);
+            element = getWidget(i);
             if (element instanceof DirtyableWidget) 
                 if ( ((DirtyableWidget) element).isDirty() ) return true;
             if (element instanceof DirtyableContainer)

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/RulePackageSelector.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/RulePackageSelector.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/RulePackageSelector.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -49,7 +49,6 @@
 			}
         });
 
-
         initWidget( packageList );
     }
 
@@ -58,7 +57,7 @@
 
             public void onSuccess(PackageConfigData[] list) {
                 for ( int i = 0; i < list.length; i++ ) {
-                    packageList.addItem( list[i].name );
+                    packageList.addItem( list[i].name, list[i].uuid );
                     if (currentlySelectedPackage != null &&
                             list[i].name.equals( currentlySelectedPackage )) {
                         packageList.setSelectedIndex( i );
@@ -69,9 +68,7 @@
                          currentlySelectedPackage = getSelectedPackage();                       
                     }
                 });
-
             }
-
         });
 	}
 
@@ -82,5 +79,10 @@
         return packageList.getItemText( packageList.getSelectedIndex() );
     }
 
-
+    /**
+     * Returns the selected package.
+     */
+    public String getSelectedPackageUUID() {
+        return packageList.getValue( packageList.getSelectedIndex() );
+    }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/DeploymentPanel.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/DeploymentPanel.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/DeploymentPanel.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -1,18 +1,17 @@
 package org.drools.guvnor.client.explorer;
 
 import org.drools.guvnor.client.common.GenericCallback;
+import org.drools.guvnor.client.messages.Constants;
 import org.drools.guvnor.client.packages.SnapshotView;
 import org.drools.guvnor.client.rpc.PackageConfigData;
 import org.drools.guvnor.client.rpc.RepositoryServiceFactory;
 import org.drools.guvnor.client.rpc.SnapshotInfo;
-import org.drools.guvnor.client.messages.Constants;
 
+import com.google.gwt.core.client.GWT;
 import com.google.gwt.user.client.ui.VerticalPanel;
 import com.google.gwt.user.client.ui.Widget;
-import com.google.gwt.core.client.GWT;
 import com.gwtext.client.core.EventObject;
 import com.gwtext.client.data.Node;
-import com.gwtext.client.data.NodeTraversalCallback;
 import com.gwtext.client.widgets.Button;
 import com.gwtext.client.widgets.Panel;
 import com.gwtext.client.widgets.Toolbar;
@@ -115,27 +114,27 @@
                 }
             }
 
-            public void onExpandNode(final TreeNode node) {
-                if (node.getId().equals("snapshotRoot")) { //NON-NLS
-                    return;
-                }
-                final PackageConfigData conf = (PackageConfigData) node.getUserObject();
-                if (conf != null) {
-                    RepositoryServiceFactory.getService().listSnapshots(conf.name, new GenericCallback() {
-                        public void onSuccess(Object data) {
-                            final SnapshotInfo[] snaps = (SnapshotInfo[]) data;
-                            for (final SnapshotInfo snapInfo : snaps) {
-                                TreeNode snap = new TreeNode();
-                                snap.setTooltip(snapInfo.comment);
-                                snap.setText(snapInfo.name);
-                                snap.setUserObject(new Object[]{snapInfo, conf});
-                                node.appendChild(snap);
-                            }
-                            node.removeChild(node.getFirstChild());
-                        }
-                    });
-                }
-            }
+			public void onExpandNode(final TreeNode node) {
+				if (node.getId().equals("snapshotRoot")) { // NON-NLS
+					return;
+				}
+				final PackageConfigData conf = (PackageConfigData) node.getUserObject();
+				if (conf != null) {
+					RepositoryServiceFactory.getService().listSnapshots(conf.name,
+							new GenericCallback<SnapshotInfo[]>() {
+								public void onSuccess(SnapshotInfo[] snaps) {
+									for (final SnapshotInfo snapInfo : snaps) {
+										TreeNode snap = new TreeNode();
+										snap.setTooltip(snapInfo.comment);
+										snap.setText(snapInfo.name);
+										snap.setUserObject(new Object[] { snapInfo, conf });
+										node.appendChild(snap);
+									}
+									node.removeChild(node.getFirstChild());
+								}
+							});
+				}
+			}
 
             public void onClick(TreeNode node, EventObject e) {
 
@@ -165,25 +164,22 @@
         return PackagesPanel.wrapScroll(panel);
     }
 
-    private void deploymentListPackages(final TreeNode root) {
-        RepositoryServiceFactory.getService().listPackages(
-                new GenericCallback() {
-                    public void onSuccess(Object data) {
-                        PackageConfigData[] value = (PackageConfigData[]) data;
-                        PackageHierarchy ph = new PackageHierarchy();
+	private void deploymentListPackages(final TreeNode root) {
+		RepositoryServiceFactory.getService().listPackages(new GenericCallback<PackageConfigData[]>() {
+			public void onSuccess(PackageConfigData[] values) {
+				PackageHierarchy ph = new PackageHierarchy();
 
-                        for (PackageConfigData val : value) {
-                            ph.addPackage(val);
-                        }
-                        for (PackageHierarchy.Folder hf : ph.root.children) {
-                            buildDeploymentTree(root, hf);
-                        }
+				for (PackageConfigData val : values) {
+					ph.addPackage(val);
+				}
+				for (PackageHierarchy.Folder hf : ph.root.children) {
+					buildDeploymentTree(root, hf);
+				}
+				root.expand();
+			}
+		});
+	}
 
-                        root.expand();
-                    }
-                });
-    }
-
     private void buildDeploymentTree(TreeNode root, PackageHierarchy.Folder fldr) {
         if (fldr.conf != null) {
             TreeNode pkg = new TreeNode(fldr.conf.name);

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/ExplorerNodeConfig.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/ExplorerNodeConfig.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/ExplorerNodeConfig.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -8,6 +8,7 @@
 import org.drools.guvnor.client.qa.ScenarioPackageView;
 import org.drools.guvnor.client.rpc.PackageConfigData;
 import org.drools.guvnor.client.rpc.RepositoryServiceFactory;
+import org.drools.guvnor.client.rpc.WorkingSetConfigData;
 import org.drools.guvnor.client.ruleeditor.MultiViewRow;
 import org.drools.guvnor.client.rulelist.EditItemEvent;
 import org.drools.guvnor.client.security.Capabilities;
@@ -84,6 +85,8 @@
                                    "images/new_file.gif",
                                    new String[0] ) );
 
+		pkg.appendChild(makeItem(constants.WorkingSets(), "images/workingset.gif", new String[] {AssetFormats.WORKING_SET}));
+		
         return pkg;
     }
 
@@ -102,17 +105,21 @@
         TreeNode adminNode = new TreeNode( constants.Admin() );
         //adminNode.setAttribute("icon", "images/managment.gif");
 
-        String[][] adminStructure = new String[][]{{constants.Category(), "images/category_small.gif", "0"}, {constants.Status(), "images/tag.png", "2"}, {constants.Archive(), "images/backup_small.gif", "1"},
-                {constants.EventLog(), "images/error.gif", "4"}, {constants.UserPermission(), "images/icoUsers.gif", "5"}, {constants.ImportExport(), "images/save_edit.gif", "3"}, {constants.About(), "images/information.gif", "6"}};
+		String[][] adminStructure = new String[][] {
+				{ constants.Category(), "images/category_small.gif", "0"},
+                { constants.Status(), "images/tag.png", "2" },
+				{ constants.Archive(), "images/backup_small.gif", "1" }, 
+                { constants.EventLog(), "images/error.gif", "4" },
+                { constants.UserPermission(), "images/icoUsers.gif", "5" },
+				{ constants.ImportExport(), "images/save_edit.gif", "3" },
+				{ constants.About(), "images/information.gif", "6" }};
 
         for ( int i = 0; i < adminStructure.length; i++ ) {
 
             String[] packageData = adminStructure[i];
             TreeNode localChildNode = new TreeNode( packageData[0] );
-            localChildNode.setAttribute( "icon",
-                                         packageData[1] ); //NON-NLS
-            localChildNode.setAttribute( "id",
-                                         packageData[2] );
+			localChildNode.setAttribute("icon", packageData[1]);   //NON-NLS
+			localChildNode.setAttribute("id", packageData[2]);
 
             adminNode.appendChild( localChildNode );
         }

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/ExplorerViewCenterPanel.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/ExplorerViewCenterPanel.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/ExplorerViewCenterPanel.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -203,9 +203,8 @@
             this.tp.activate( tpi.getId() );
 
             return true;
-        } else {
-            return false;
-        }
+        } 
+        return false;
     }
 
     public void close(String key) {
@@ -217,73 +216,70 @@
     /**
      * Open an asset if it is not already open.
      */
-    public void openAsset(final String uuid) {
-        if ( uuid.contains( "<" ) ) {
-            return;
-        }
-        History.newItem( "asset=" + uuid ); //NON-NLS
+	public void openAsset(final String uuid) {
+		if (uuid.contains("<")) {
+			return;
+		}
+		History.newItem("asset=" + uuid); // NON-NLS
 
-        if ( !showIfOpen( uuid ) ) {
+		if (!showIfOpen(uuid)) {
 
-            final boolean[] loading = {true};
+			final boolean[] loading = { true };
 
-            Timer t = new Timer() {
-                public void run() {
-                    if ( loading[0] ) LoadingPopup.showMessage( constants.LoadingAsset() );
-                }
-            };
-            t.schedule( 200 );
+			Timer t = new Timer() {
+				public void run() {
+					if (loading[0]) {
+						LoadingPopup.showMessage(constants.LoadingAsset());
+					}
+				}
+			};
+			t.schedule(200);
 
-            RepositoryServiceFactory.getService().loadRuleAsset( uuid,
-                                                                 new GenericCallback<RuleAsset>() {
-                                                                     public void onSuccess(final RuleAsset a) {
-                                                                         SuggestionCompletionCache.getInstance().doAction( a.metaData.packageName,
-                                                                                                                           new Command() {
-                                                                                                                               public void execute() {
-                                                                                                                                   loading[0] = false;
-                                                                                                                                   EditItemEvent edit = new EditItemEvent() {
-                                                                                                                                       public void open(String key) {
-                                                                                                                                           openAsset( key );
-                                                                                                                                       }
+			RepositoryServiceFactory.getService().loadRuleAsset(uuid, new GenericCallback<RuleAsset>() {
+				public void onSuccess(final RuleAsset a) {
+					SuggestionCompletionCache.getInstance().doAction(a.metaData.packageName, new Command() {
+						public void execute() {
+							loading[0] = false;
+							EditItemEvent edit = new EditItemEvent() {
+								public void open(String key) {
+									openAsset(key);
+								}
 
-                                                                                                                                       public void open(MultiViewRow[] rows) {
-                                                                                                                                           for ( MultiViewRow row : rows ) {
-                                                                                                                                               openAsset( row.uuid );
-                                                                                                                                           }
-                                                                                                                                       }
-                                                                                                                                   };
-                                                                                                                                   RuleViewer rv = new RuleViewer( a,
-                                                                                                                                                                   edit );
-                                                                                                                                   addTab( a.metaData.name,
-                                                                                                                                           true,
-                                                                                                                                           rv,
-                                                                                                                                           uuid );
-                                                                                                                                   rv.setCloseCommand( new Command() {
-                                                                                                                                       public void execute() {
-                                                                                                                                           close( uuid );
-                                                                                                                                       }
-                                                                                                                                   } );
+								public void open(MultiViewRow[] rows) {
+									for (MultiViewRow row : rows) {
+										openAsset(row.uuid);
+									}
+								}
+							};
+							RuleViewer rv = new RuleViewer(a, edit);
+							addTab(a.metaData.name, true, rv, uuid);
+							rv.setCloseCommand(new Command() {
+								public void execute() {
+									close(uuid);
+								}
+							});
 
-                                                                                                                                   // When model is saved update the package view it is opened.
-                                                                                                                                   if ( a.metaData.format.equals( AssetFormats.MODEL ) ) {
-                                                                                                                                       rv.setCheckedInCommand( new Command() {
-                                                                                                                                           public void execute() {
-                                                                                                                                               PackageEditor2 packageEditor = openedPackageEditors.get( a.metaData.packageName );
-                                                                                                                                               if ( packageEditor != null ) {
-                                                                                                                                                   packageEditor.reload();
-                                                                                                                                               }
-                                                                                                                                           }
-                                                                                                                                       } );
-                                                                                                                                   }
+							// When model is saved update the package view it is
+							// opened.
+							if (a.metaData.format.equals(AssetFormats.MODEL)) {
+								rv.setCheckedInCommand(new Command() {
+									public void execute() {
+										PackageEditor2 packageEditor = openedPackageEditors.get(a.metaData.packageName);
+										if (packageEditor != null) {
+											packageEditor.reload();
+										}
+									}
+								});
+							}
 
-                                                                                                                                   LoadingPopup.close();
-                                                                                                                               }
-                                                                                                                           } );
+							LoadingPopup.close();
+						}
+					});
 
-                                                                     }
-                                                                 } );
-        }
-    }
+				}
+			});
+		}
+	}
 
     public void openAssets(MultiViewRow[] rows) {
 
@@ -338,41 +334,33 @@
     /**
      * Open a package editor if it is not already open.
      */
-    public void openPackageEditor(final String uuid,
-                                  final Command refPackageList) {
+	public void openPackageEditor(final String uuid, final Command refPackageList) {
 
-        if ( !showIfOpen( uuid ) ) {
-            LoadingPopup.showMessage( constants.LoadingPackageInformation() );
-            RepositoryServiceFactory.getService().loadPackageConfig( uuid,
-                                                                     new GenericCallback<PackageConfigData>() {
-                                                                         public void onSuccess(PackageConfigData conf) {
-                                                                             PackageEditor2 ed = new PackageEditor2( conf,
-                                                                                                                     new Command() {
-                                                                                                                         public void execute() {
-                                                                                                                             close( uuid );
-                                                                                                                         }
-                                                                                                                     },
-                                                                                                                     refPackageList,
-                                                                                                                     new EditItemEvent() {
-                                                                                                                         public void open(String uuid) {
-                                                                                                                             openAsset( uuid );
-                                                                                                                         }
+		if (!showIfOpen(uuid)) {
+			LoadingPopup.showMessage(constants.LoadingPackageInformation());
+			RepositoryServiceFactory.getService().loadPackageConfig(uuid, new GenericCallback<PackageConfigData>() {
+				public void onSuccess(PackageConfigData conf) {
+					PackageEditor2 ed = new PackageEditor2(conf, new Command() {
+						public void execute() {
+							close(uuid);
+						}
+					}, refPackageList, new EditItemEvent() {
+						public void open(String uuid) {
+							openAsset(uuid);
+						}
 
-                                                                                                                         public void open(MultiViewRow[] rows) {
-                                                                                                                             for ( MultiViewRow row : rows ) {
-                                                                                                                                 openAsset( row.uuid );
-                                                                                                                             }
-                                                                                                                         }
-                                                                                                                     } );
-                                                                             addTab( conf.name,
-                                                                                     true,
-                                                                                     ed,
-                                                                                     conf.uuid );
-                                                                             LoadingPopup.close();
-                                                                         }
-                                                                     } );
-        }
-    }
+						public void open(MultiViewRow[] rows) {
+							for (MultiViewRow row : rows) {
+								openAsset(row.uuid);
+							}
+						}
+					});
+					addTab(conf.name, true, ed, conf.uuid);
+					LoadingPopup.close();
+				}
+			});
+		}
+	}
 
     public void openFind() {
         if ( !showIfOpen( "FIND" ) ) { //NON-NLS

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-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/PackagesPanel.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -4,25 +4,26 @@
 import org.drools.guvnor.client.common.GenericCallback;
 import org.drools.guvnor.client.common.LoadingPopup;
 import org.drools.guvnor.client.common.RulePackageSelector;
+import org.drools.guvnor.client.messages.Constants;
 import org.drools.guvnor.client.packages.NewPackageWizard;
 import org.drools.guvnor.client.rpc.PackageConfigData;
+import org.drools.guvnor.client.rpc.PushClient;
+import org.drools.guvnor.client.rpc.PushResponse;
 import org.drools.guvnor.client.rpc.RepositoryServiceFactory;
-import org.drools.guvnor.client.rpc.PushClient;
 import org.drools.guvnor.client.rpc.ServerPushNotification;
-import org.drools.guvnor.client.rpc.PushResponse;
+import org.drools.guvnor.client.rpc.TableDataResult;
 import org.drools.guvnor.client.ruleeditor.MultiViewRow;
 import org.drools.guvnor.client.rulelist.AssetItemGrid;
 import org.drools.guvnor.client.rulelist.AssetItemGridDataLoader;
 import org.drools.guvnor.client.rulelist.EditItemEvent;
-import org.drools.guvnor.client.messages.Constants;
 
+import com.google.gwt.core.client.GWT;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.WindowResizeListener;
 import com.google.gwt.user.client.ui.ScrollPanel;
 import com.google.gwt.user.client.ui.VerticalPanel;
 import com.google.gwt.user.client.ui.Widget;
-import com.google.gwt.core.client.GWT;
 import com.gwtext.client.core.EventObject;
 import com.gwtext.client.data.Node;
 import com.gwtext.client.widgets.Button;
@@ -47,7 +48,7 @@
 
     private VerticalPanel packagesPanel;
     private boolean packagesLoaded = false;
-    private static Constants constants = ((Constants) GWT.create(Constants.class));
+    private static final Constants constants = ((Constants) GWT.create(Constants.class));
 
     public PackagesPanel(ExplorerViewCenterPanel tabbedPanel) {
         super(constants.KnowledgeBases(), tabbedPanel);
@@ -101,6 +102,24 @@
             }
         }, "images/new_package.gif")); //NON-NLS
 
+        //SubPackage are currently not used.
+//        m.addItem(new Item(constants.NewSubPackage(), new BaseItemListenerAdapter() {
+//            public void onClick(BaseItem item, EventObject e) {
+//                NewSubPackageWizard wiz = new NewSubPackageWizard(new Command() {
+//                    public void execute() {
+//                        refreshPackageTree();
+//                    }
+//                });
+//                wiz.show();
+//            }
+//        }, "images/new_package.gif")); //NON-NLS
+        
+        m.addItem(new Item(constants.NewWorkingSet(), new BaseItemListenerAdapter() {
+            public void onClick(BaseItem item, EventObject e) {
+                launchWizard(AssetFormats.WORKING_SET, constants.NewWorkingSet(), false);
+            }
+        }, "images/new_package.gif"));          //NON-NLS
+        
         m.addItem(new Item(constants.NewRule(), new BaseItemListenerAdapter() {
             public void onClick(BaseItem item, EventObject e) {
                 launchWizard(null, constants.NewRule(), true);
@@ -172,8 +191,8 @@
             public void onClick(BaseItem item, EventObject e) {
                 if (Window.confirm(constants.RebuildConfirmWarning())) {
                     LoadingPopup.showMessage(constants.RebuildingPackageBinaries());
-                    RepositoryServiceFactory.getService().rebuildPackages(new GenericCallback() {
-                        public void onSuccess(Object data) {
+                    RepositoryServiceFactory.getService().rebuildPackages(new GenericCallback<Void>() {
+                        public void onSuccess(Void data) {
                             LoadingPopup.close();
                         }
                     });
@@ -190,82 +209,84 @@
         packagesPanel.add(packageExplorer(centertabbedPanel));
     }
 
-    private Widget packageExplorer(final ExplorerViewCenterPanel tabPanel) {
+	private Widget packageExplorer(final ExplorerViewCenterPanel tabPanel) {
 		TreeNode rootNode = new TreeNode(constants.Admin());
 
-		
-        TreeNode packageRootNode = new TreeNode(constants.Packages());
-        packageRootNode.setAttribute("icon", "images/silk/chart_organisation.gif"); //NON-NLS
-        loadPackages(packageRootNode);
-        
-/*		TreeNode globalRootNode = new TreeNode("Global area");
-		globalRootNode.setAttribute("icon", "images/silk/chart_organisation.gif");   //NON-NLS
-		globalRootNode.setAttribute("id", "globalarea");*/
+		TreeNode packageRootNode = new TreeNode(constants.Packages());
+		packageRootNode.setAttribute("icon", "images/silk/chart_organisation.gif"); // NON-NLS
+		loadPackages(packageRootNode);
+
+		/*
+		 * TreeNode globalRootNode = new TreeNode("Global area");
+		 * globalRootNode.setAttribute("icon",
+		 * "images/silk/chart_organisation.gif"); //NON-NLS
+		 * globalRootNode.setAttribute("id", "globalarea");
+		 */
 		loadGlobal(rootNode);
-		
+
 		rootNode.appendChild(packageRootNode);
-		//rootNode.appendChild(globalRootNode);
-		
-        final TreePanel panel = genericExplorerWidget(rootNode);
-        panel.setRootVisible(false);
+		// rootNode.appendChild(globalRootNode);
 
-        
-        TreePanelListener treePanelListener = new TreePanelListenerAdapter() {
-            public void onClick(TreeNode node, EventObject e) {
-                if (node.getUserObject() instanceof PackageConfigData && !"global".equals(((PackageConfigData)node.getUserObject()).name)) {
-                    PackageConfigData pc = (PackageConfigData) node.getUserObject();
-                    RulePackageSelector.currentlySelectedPackage = pc.name;
+		final TreePanel panel = genericExplorerWidget(rootNode);
+		panel.setRootVisible(false);
 
-                    String uuid = pc.uuid;
-                    centertabbedPanel.openPackageEditor(uuid, new Command() {
-                        public void execute() {
-                            //refresh the package tree.
-                            refreshPackageTree();
-                        }
-                    });
-                } else if (node.getUserObject() instanceof Object[]) {
-                    Object[] uo = (Object[]) node.getUserObject();
-                    final String[] fmts = (String[]) uo[0];
-                    final PackageConfigData pc = (PackageConfigData) node.getParentNode().getUserObject();
-                    RulePackageSelector.currentlySelectedPackage = pc.name;
-                    String key = key(fmts, pc);
-                    if (!centertabbedPanel.showIfOpen(key)) {
+		TreePanelListener treePanelListener = new TreePanelListenerAdapter() {
+			public void onClick(TreeNode node, EventObject e) {
+				if (node.getUserObject() instanceof PackageConfigData
+						&& !"global".equals(((PackageConfigData) node.getUserObject()).name)) {
+					PackageConfigData pc = (PackageConfigData) node.getUserObject();
+					RulePackageSelector.currentlySelectedPackage = pc.name;
 
-                        final AssetItemGrid list = new AssetItemGrid(new EditItemEvent() {
-                            public void open(String uuid) {
-                                centertabbedPanel.openAsset(uuid);
-                            }
-                            public void open(MultiViewRow[] rows) {
-                                centertabbedPanel.openAssets( rows );
-                            }
-                        },
-                                AssetItemGrid.PACKAGEVIEW_LIST_TABLE_ID,
-                                new AssetItemGridDataLoader() {
-                                    public void loadData(int skip, int numRows, GenericCallback cb) {
-                                        RepositoryServiceFactory.getService().listAssets(pc.uuid, fmts, skip, numRows, AssetItemGrid.PACKAGEVIEW_LIST_TABLE_ID, cb);
-                                    }
-                                }
-                        , GWT.getModuleBaseURL() + "feed/package?name=" + pc.name + "&viewUrl=" + CategoriesPanel.getSelfURL() + "&status=*");
-                        tabPanel.addTab(uo[1] + " [" + pc.name + "]", true, list, key);
-                        
-                        final ServerPushNotification sub = new ServerPushNotification() {
-                            public void messageReceived(PushResponse response) {
-                                if (response.messageType.equals("packageChange") && response.message.equals(pc.name)) {
-                                    list.refreshGrid();
-                                }
-                            }
-                        };
-                        PushClient.instance().subscribe(sub);
-                        list.addUnloadListener(new Command() {
-                            public void execute() {
-                                PushClient.instance().unsubscribe(sub);
-                            }
-                        });
-                    }
-                }
-            }
+					String uuid = pc.uuid;
+					centertabbedPanel.openPackageEditor(uuid, new Command() {
+						public void execute() {
+							// refresh the package tree.
+							refreshPackageTree();
+						}
+					});
+				} else if (node.getUserObject() instanceof Object[]) {
+					Object[] uo = (Object[]) node.getUserObject();
+					final String[] fmts = (String[]) uo[0];
+					final PackageConfigData pc = (PackageConfigData) node.getParentNode().getUserObject();
+					RulePackageSelector.currentlySelectedPackage = pc.name;
+					String key = key(fmts, pc);
+					if (!centertabbedPanel.showIfOpen(key)) {
 
+						final AssetItemGrid list = new AssetItemGrid(new EditItemEvent() {
+							public void open(String uuid) {
+								centertabbedPanel.openAsset(uuid);
+							}
 
+							public void open(MultiViewRow[] rows) {
+								centertabbedPanel.openAssets(rows);
+							}
+						}, AssetItemGrid.PACKAGEVIEW_LIST_TABLE_ID, new AssetItemGridDataLoader() {
+							public void loadData(int startRow, int numberOfRows, GenericCallback<TableDataResult> cb) {
+								RepositoryServiceFactory.getService().listAssets(pc.uuid, fmts, startRow, numberOfRows,
+										AssetItemGrid.PACKAGEVIEW_LIST_TABLE_ID, cb);
+							}
+						}, GWT.getModuleBaseURL() + "feed/package?name=" + pc.name + "&viewUrl="
+								+ CategoriesPanel.getSelfURL() + "&status=*");
+						tabPanel.addTab(uo[1] + " [" + pc.name + "]", true, list, key);
+
+						final ServerPushNotification sub = new ServerPushNotification() {
+							public void messageReceived(PushResponse response) {
+								if (response.messageType.equals("packageChange") && response.message.equals(pc.name)) {
+									list.refreshGrid();
+								}
+							}
+						};
+						PushClient.instance().subscribe(sub);
+						list.addUnloadListener(new Command() {
+							public void execute() {
+								PushClient.instance().unsubscribe(sub);
+							}
+						});
+					}
+				}
+			}
+
+
             @Override
             public void onCollapseNode(final TreeNode node) {
                 if (node.getText().equals(constants.Packages())) {
@@ -353,6 +374,9 @@
 
     private TreeNode loadPackage(String name, PackageConfigData conf) {
         TreeNode pn = ExplorerNodeConfig.getPackageItemStructure(name, conf.uuid);
+//        TreeNode wsNode = new TreeNode(constants.WorkingSets(), "images/workingset.gif");
+//        ExplorerNodeConfig.getWorkingSetItemsStructure(wsNode, conf.workingsets);
+//        pn.appendChild(wsNode);
         pn.setUserObject(conf);
         return pn;
     }

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-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -18,42 +18,24 @@
 
     String ChooseAPatternThatThisColumnAddsDataTo();
 
-
     String Assets();
 
-
     String Category();
     
     String CategoryColon();
 
     String AddAnotherFieldToThisSoYouCanSetItsValue();
 
-
     String ChooseAMethodToInvoke();
 
     String AddField();
 
-
-
-
-
-
-
-
-
-
     String OK();
 
     String pleaseChooseFactType();
 
-
-
-
     String NewFactSelectTheType();
 
-
-
-
     String ColumnConfigurationSetAFieldOnAFact();
 
     String ChooseABoundFactThatThisColumnPertainsTo();
@@ -96,7 +78,6 @@
 
     String DeleteAreYouSure();
 
-
     String ChangeStatusTip();
 
     String CopyThisItem();
@@ -297,7 +278,6 @@
 
     String FailureOverall();
 
-
     String RuleCoveragePercent();
 
     String RulesCovered();
@@ -908,7 +888,9 @@
 
     String CreateANewPackage();
 
+    String CreateANewSubPackage();
     
+    String ParentPackage();
 
     String ImportDRLDesc1();
 
@@ -1148,8 +1130,9 @@
     String CreateNew();
 
     String NewPackage1();
+    
+    String NewSubPackage();
 
-
     String NewRule();
 
     String UploadPOJOModelJar();
@@ -1832,7 +1815,6 @@
 
     String December();
 
-
     String SorryAnItemOfThatNameAlreadyExistsInTheRepositoryPleaseChooseAnother();
 
     String ALiteralValueMeansTheValueAsTypedInIeItsNotACalculation();
@@ -2065,4 +2047,22 @@
 
     String ImpactedRules();
 
+    String SelectWorkingSets();
+    
+    String ErrorLoadingRules();
+    
+    String WorkingSets();
+    String NewWorkingSet();
+    String CreateWorkingSet();
+    String WorkingSetName();
+    String CopyTheWorkingSet();
+    String CopyTheWorkingSetTip();
+    String NewWorkingSetNameIs();
+    String NotAValidWorkingSetName();
+    String WorkingSetCopiedSuccessfully();
+    String RenameTheWorkingSet();
+    String RenameTheWorkingSetTip();
+    String WorkingSetRenamedSuccessfully();
+    String ConstraintsSection();
+    String AddNewConstrain();
 }

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-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants.properties	2010-03-25 19:26:29 UTC (rev 32217)
@@ -433,6 +433,8 @@
 emptyNameIsNotAllowed=empty name is not allowed
 NonValidJCRName='{0}' is not valid. '{1}' is not a valid name character
 CreateANewPackage=Create a new package
+CreateANewSubPackage=Create a new subpackage
+ParentPackage=Parent Package
 ImportDRLDesc1=Importing a package from an existing DRL will create the package in the BRMS if it does not already exist. If it does exist, any new rules found will be merged into the package.
 ImportDRLDesc2=Any new rules created will not have any categories assigned initially, but rules and functions will be stored individually (ie normalised). Queries, imports etc will show up in the package configuration.
 ImportDRLDesc3=Any DSLs or models required by the imported package will need to be uploaded separately.
@@ -549,6 +551,7 @@
 YouMustEnterAGlobalVariableName=You must enter a global variable name.
 Packages=Packages
 NewPackage1=New Package
+NewSubPackage=New SubPackage
 NewRule=New Rule
 UploadPOJOModelJar=Upload POJO Model jar
 NewModelArchiveJar=New model archive (jar)
@@ -985,4 +988,21 @@
 VerificationReport=Verification report
 CanNotSwitchToBasicView=There are errors in this view. Can not switch to guided mode until the errors are resolved
 Causes=Causes
-ImpactedRules=Impacted rules
\ No newline at end of file
+ImpactedRules=Impacted rules
+SelectWorkingSets=Select Working Sets
+VerificationReport=Verification report
+WorkingSets=WorkingSets
+NewWorkingSet=New WorkingSet
+CreateWorkingSet=Create a WorkingSet
+ErrorLoadingRules=Error loading rules.
+WorkingSetName=WorkingSet name
+CopyTheWorkingSet=Copy the WorkingSet
+CopyTheWorkingSetTip=<i>Copy the WorkingSet and all its facts and restrictions. A new unique name is required.</i>
+NewWorkingSetNameIs=New WorkingSet name:
+NotAValidWorkingSetName=Not a valid WorkingSet name.
+WorkingSetCopiedSuccessfully=WorkingSet copied successfully.
+RenameTheWorkingSet=Rename the WorkingSet.
+RenameTheWorkingSetTip=<i>Rename the WorkingSet. A new unique name is required.</i>
+WorkingSetRenamedSuccessfully=WorkingSet successfully renamed.
+ConstraintsSection=Constraints Section
+AddNewConstrain=Add New Constraint
\ 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-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants_es_ES.properties	2010-03-25 19:26:29 UTC (rev 32217)
@@ -436,6 +436,8 @@
 emptyNameIsNotAllowed=el nombre vac\u00EDo no est\u00E1 permitido
 NonValidJCRName='{0}' no es v\u00E1lido. '{1}' no es un nombre de caracter v\u00E1lido.
 CreateANewPackage=Crear un nuevo paquete
+CreateANewSubPackage=Crear un nuevo subpaquete
+ParentPackage=Paquete Padre
 CreateNewPackage=<i><small>Crear un nuevo paquete en el BRMS</small></i>
 ImportDRLDesc1=Importando un paquete desde un DRL existente crear\u00E1 el paquete en el BRMS si no existe todavia. Si existe, cualquier regla encontrada ser\u00E1 fusionada en el paquete.
 ImportDRLDesc2=Cualquier regla creada no tendr\u00E1 ninguna categor\u00EDa asignada inicialmente, pero las reglas y la funciones van a ser guardadas individualmente (normalizadas). Consultas, importaciones,  etc. se mostrar\u00E1n en el paquete de configuraci\u00F3n.
@@ -553,6 +555,7 @@
 YouMustEnterAGlobalVariableName=Debe ingresar un nombre para la variable global.
 Packages=Paquetes
 NewPackage1=Nuevo Paquete
+NewSubPackage=Nuevo SubPaquete
 NewRule=Nueva Regla
 UploadPOJOModelJar=Subir un modelo de POJOs (Plain Old Java Object) en un archivo jar.
 NewModelArchiveJar=Nuevo archivo de modelo (jar)
@@ -899,4 +902,21 @@
 ConditionPositionExplanation=Seleccione la posici\u00F3n donde la Condici\u00F3n ser\u00E1 agregada.
 ActionPositionExplanation=Seleccione la posici\u00F3n donde la Acci\u00F3n ser\u00E1 agregada.
 AddAConditionBelow=Agregar una condici\u00F3n debajo.
-AddAnActionBelow=Agregar una acci\u00F3n debajo.
\ No newline at end of file
+AddAnActionBelow=Agregar una acci\u00F3n debajo.
+SelectWorkingSets=Seleccionar Working Sets
+AddAnActionBelow=Agregar una acci\u00F3n debajo.
+WorkingSets=WorkingSets
+NewWorkingSet=Nuevo WorkingSet
+CreateWorkingSet=Crear el WorkingSet
+WorkingSetName=Nombre del WorkingSet
+CopyTheWorkingSet=Copiar el WorkingSet
+CopyTheWorkingSetTip=<i>Copia el WorkingSet con todos sus facts y restricciones. Debe proveer un nombre \u00F4nico.</i>
+NewWorkingSetNameIs=Nuevo nombre de WorkingSet:
+NotAValidWorkingSetame=No es un nombre de WorkingSet v\u00E1lido.
+WorkingSetCopiedSuccessfully=WorkingSet copiado correctamente.
+RenameTheWorkingSet=Renombrar el WorkingSet.
+RenameTheWorkingSetTip=<i>Renombrar el WorkingSet. Se requiere un nombre \u00FAnico.</i>
+WorkingSetRenamedSuccessfully=WorkingSet renombrado correctamente.
+ErrorLoadingRules=Error al cargar las reglas.
+ConstraintsSection=Secci\u00F3n de Restricciones
+AddNewConstrain=Agregar nueva Restricci\u00F3n 
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ActionCallMethodWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ActionCallMethodWidget.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ActionCallMethodWidget.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -5,7 +5,6 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
 import org.drools.guvnor.client.common.DirtyableComposite;
 import org.drools.guvnor.client.common.DirtyableFlexTable;
@@ -38,10 +37,9 @@
  * @author isabel
  * 
  */
-public class ActionCallMethodWidget extends DirtyableComposite {
+public class ActionCallMethodWidget extends RuleModellerWidget {
 
     final private ActionCallMethod           model;
-    final private SuggestionCompletionEngine completions;
     final private DirtyableFlexTable         layout;
     private boolean                          isBoundFact = false;
 
@@ -51,15 +49,22 @@
     private String                           variableClass;
     private Constants                        constants   = GWT.create( Constants.class );
 
+    private boolean readOnly;
+
     public ActionCallMethodWidget(RuleModeller mod,
-                                  ActionCallMethod set,
-                                  SuggestionCompletionEngine com) {
+                                  ActionCallMethod set) {
+        this(mod, set, null);
+    }
+
+    public ActionCallMethodWidget(RuleModeller mod,
+                                  ActionCallMethod set, Boolean readOnly) {
         this.model = set;
-        this.completions = com;
         this.layout = new DirtyableFlexTable();
         this.modeller = mod;
 
         layout.setStyleName( "model-builderInner-Background" ); // NON-NLS
+
+        SuggestionCompletionEngine completions = modeller.getSuggestionCompletions();
         if ( completions.isGlobalVariable( set.variable ) ) {
 
             List<MethodInfo> infos = completions.getMethodInfosForGlobalVariable( set.variable );
@@ -107,6 +112,18 @@
                 }
             }
         }
+
+        if (readOnly == null){
+           this.readOnly = !completions.containsFactType(this.variableClass);
+        }else{
+           this.readOnly = readOnly;
+        }
+
+        if (this.readOnly){
+            layout.addStyleName("editor-disabled-widget");
+        }
+
+
         doLayout();
         initWidget( this.layout );
     }
@@ -156,7 +173,9 @@
                 }
             } );
             horiz.add( new SmallLabel( HumanReadable.getActionDisplayName( "call" ) + " [" + model.variable + "]" ) ); // NON-NLS
-            horiz.add( edit );
+            if (!this.readOnly){
+                horiz.add( edit );
+            }
         } else {
             horiz.add( new SmallLabel( HumanReadable.getActionDisplayName( "call" ) + " [" + model.variable + "." + model.methodName + "]" ) ); // NON-NLS
         }
@@ -165,6 +184,9 @@
     }
 
     protected void showAddFieldPopup(Widget w) {
+
+        final SuggestionCompletionEngine completions = modeller.getSuggestionCompletions();
+
         final FormStylePopup popup = new FormStylePopup( "images/newex_wiz.gif",
                                                          constants.ChooseAMethodToInvoke() ); // NON-NLS
         final ListBox box = new ListBox();
@@ -214,9 +236,11 @@
 
     private Widget valueEditor(final ActionFieldFunction val) {
 
+        SuggestionCompletionEngine completions = modeller.getSuggestionCompletions();
+
         String type = "";
-        if ( this.completions.isGlobalVariable( this.model.variable ) ) {
-            type = (String) this.completions.getGlobalVariable( this.model.variable );
+        if ( completions.isGlobalVariable( this.model.variable ) ) {
+            type = (String) completions.getGlobalVariable( this.model.variable );
         } else {
             if ( this.modeller.getModel().getBoundFact( this.model.variable ) != null ) {
                 type = this.modeller.getModel().getBoundFact( this.model.variable ).factType;
@@ -227,7 +251,7 @@
             }
         }
 
-        DropDownData enums = this.completions.getEnums( type,
+        DropDownData enums = completions.getEnums( type,
                                                         this.model.fieldValues,
                                                         val.field );
         return new MethodParameterValueEditor( val,
@@ -272,9 +296,11 @@
     }
 
     private Widget actionSelector(final ActionFieldFunction val) {
+        SuggestionCompletionEngine completions = modeller.getSuggestionCompletions();
+        
         final ListBox box = new ListBox();
         final String fieldType = val.type;
-        final String[] modifiers = this.completions.getModifiers( fieldType );
+        final String[] modifiers = completions.getModifiers( fieldType );
 
         if ( modifiers != null ) {
             for ( int i = 0; i < modifiers.length; i++ ) {
@@ -303,4 +329,9 @@
         return layout.hasDirty();
     }
 
+    @Override
+    public boolean isReadOnly() {
+        return this.readOnly;
+    }
+
 }
\ 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-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ActionInsertFactWidget.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -39,27 +39,42 @@
  * @author Michael Neale
  *
  */
-public class ActionInsertFactWidget extends DirtyableComposite {
+public class ActionInsertFactWidget extends RuleModellerWidget {
 
     private final DirtyableFlexTable layout;
     private final ActionInsertFact model;
-    private final SuggestionCompletionEngine completions;
     private final String[] fieldCompletions;
     private final RuleModeller modeller;
     private final String factType;
     private Constants constants = GWT.create(Constants.class);
+    private boolean readOnly;
 
-    public ActionInsertFactWidget(RuleModeller mod, ActionInsertFact set, SuggestionCompletionEngine com) {
+    public ActionInsertFactWidget(RuleModeller mod, ActionInsertFact set) {
+        this(mod, set, null);
+    }
+
+    public ActionInsertFactWidget(RuleModeller mod, ActionInsertFact set,Boolean readOnly) {
         this.model = set;
-        this.completions = com;
         this.layout = new DirtyableFlexTable();
         this.modeller = mod;
         this.factType = set.factType;
-        this.fieldCompletions = this.completions.getFieldCompletions( FieldAccessorsAndMutators.MUTATOR,
+
+        SuggestionCompletionEngine completions = modeller.getSuggestionCompletions();
+        this.fieldCompletions = completions.getFieldCompletions( FieldAccessorsAndMutators.MUTATOR,
                                                                       set.factType );
 
         layout.setStyleName( "model-builderInner-Background" );  //NON-NLS
 
+        if (readOnly == null) {
+            this.readOnly = !completions.containsFactType(set.factType);
+        } else {
+            this.readOnly = readOnly;
+        }
+
+        if (this.readOnly) {
+            layout.addStyleName("editor-disabled-widget");
+        }
+
         doLayout();
 
         initWidget(this.layout);
@@ -89,7 +104,7 @@
                 	};
                 }
             });
-            if (!this.modeller.lockRHS()) {
+            if (!this.readOnly) {
                 inner.setWidget( i, 2 + col, remove );
             }
 
@@ -101,8 +116,9 @@
     }
 
     private Widget valueEditor(final ActionFieldValue val) {
-    	DropDownData enums = this.completions.getEnums(this.factType, this.model.fieldValues, val.field);
-    	return new ActionValueEditor(val, enums,modeller,val.type);
+        SuggestionCompletionEngine completions = modeller.getSuggestionCompletions();
+    	DropDownData enums = completions.getEnums(this.factType, this.model.fieldValues, val.field);
+    	return new ActionValueEditor(val, enums,modeller,val.type,this.readOnly);
     }
 
     private Widget fieldSelector(final ActionFieldValue val) {
@@ -128,11 +144,12 @@
         if (this.model.fieldValues != null && model.fieldValues.length > 0 ) {
             lbl = lbl + ":";
         }
-        return new ClickableLabel( lbl, cl, !this.modeller.lockRHS() );
+        return new ClickableLabel( lbl, cl, !this.readOnly );
 
     }
 
     protected void showAddFieldPopup(Widget w) {
+        final SuggestionCompletionEngine completions = modeller.getSuggestionCompletions();
         final FormStylePopup popup = new FormStylePopup( "images/newex_wiz.gif",
                                                          constants.AddAField() );
         final ListBox box = new ListBox();
@@ -190,4 +207,11 @@
 
     }
 
+    @Override
+    public boolean isReadOnly() {
+        return this.readOnly;
+    }
+
+
+
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ActionRetractFactWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ActionRetractFactWidget.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ActionRetractFactWidget.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -19,35 +19,53 @@
 
 import org.drools.guvnor.client.common.SmallLabel;
 import org.drools.guvnor.client.modeldriven.HumanReadable;
-import org.drools.guvnor.client.modeldriven.SuggestionCompletionEngine;
 import org.drools.guvnor.client.modeldriven.brl.ActionRetractFact;
-import org.drools.guvnor.client.modeldriven.brl.RuleModel;
 
-import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.FlexTable;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.HorizontalPanel;
 
 /**
  * This is used when you want to retract a fact. It will provide a list of
  * bound facts for you to retract.
  * @author Michael Neale
  */
-public class ActionRetractFactWidget extends Composite {
+public class ActionRetractFactWidget extends RuleModellerWidget {
 
-    private FlexTable layout;
+    private HorizontalPanel layout;
+    private boolean readOnly;
 
+    public ActionRetractFactWidget(RuleModeller modeller, ActionRetractFact model) {
+        this(modeller, model, null);
+    }
 
-    public ActionRetractFactWidget(SuggestionCompletionEngine com, ActionRetractFact model, RuleModel ruleModel) {
-        layout = new FlexTable();
+    public ActionRetractFactWidget(RuleModeller modeller, ActionRetractFact model, Boolean readOnly) {
 
+        layout = new HorizontalPanel();
+        layout.setWidth("100%");
         layout.setStyleName( "model-builderInner-Background" );
 
-        layout.setWidget( 0, 0, new SmallLabel(HumanReadable.getActionDisplayName( "retract" ))  );
+        if (readOnly == null) {
+            this.readOnly = !modeller.getSuggestionCompletions().containsFactType(modeller.getModel().getBoundFact(model.variableName).factType);
+        } else {
+            this.readOnly = readOnly;
+        }
 
-        String desc = ruleModel.getBoundFact(model.variableName).factType + " [" + model.variableName + "]";
-        layout.setWidget( 0, 1, new SmallLabel("<b>"  + desc  + "</b>") );
+        if (this.readOnly) {
+            layout.addStyleName("editor-disabled-widget");
+        }
 
+        String desc = modeller.getModel().getBoundFact(model.variableName).factType + " [" + model.variableName + "]";
+        layout.add(new SmallLabel(HumanReadable.getActionDisplayName( "retract" )+"&nbsp;<b>"  + desc  + "</b>"));
+
         initWidget( layout );
     }
 
+    @Override
+    public boolean isReadOnly() {
+        return this.readOnly;
+    }
 
+
+
+
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ActionSetFieldWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ActionSetFieldWidget.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ActionSetFieldWidget.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -15,8 +15,6 @@
  * limitations under the License.
  */
 
-
-
 import org.drools.guvnor.client.common.*;
 import org.drools.guvnor.client.modeldriven.DropDownData;
 import org.drools.guvnor.client.modeldriven.FieldAccessorsAndMutators;
@@ -40,59 +38,71 @@
 import com.google.gwt.core.client.GWT;
 import com.gwtext.client.util.Format;
 
-
 /**
  * This widget is for setting fields on a bound fact or global variable.
  *
  * @author Michael Neale
  */
-public class ActionSetFieldWidget extends DirtyableComposite {
+public class ActionSetFieldWidget extends RuleModellerWidget {
 
     final private ActionSetField model;
-    final private SuggestionCompletionEngine completions;
     final private DirtyableFlexTable layout;
     private boolean isBoundFact = false;
-
     private String[] fieldCompletions;
     final private RuleModeller modeller;
     private String variableClass;
     private Constants constants = GWT.create(Constants.class);
+    private boolean readOnly;
 
+    public ActionSetFieldWidget(RuleModeller mod, ActionSetField set) {
+        this(mod, set, null);
+    }
 
-    public ActionSetFieldWidget(RuleModeller mod,  ActionSetField set, SuggestionCompletionEngine com) {
+    public ActionSetFieldWidget(RuleModeller mod, ActionSetField set, Boolean readOnly) {
         this.model = set;
-        this.completions = com;
         this.layout = new DirtyableFlexTable();
         this.modeller = mod;
 
-        layout.setStyleName( "model-builderInner-Background" );
-        if (completions.isGlobalVariable( set.variable )) {
-            this.fieldCompletions = completions.getFieldCompletionsForGlobalVariable( set.variable );
-            this.variableClass = (String) completions.getGlobalVariable( set.variable );
+        layout.setStyleName("model-builderInner-Background");
+
+        SuggestionCompletionEngine completions = modeller.getSuggestionCompletions();
+
+        if (completions.isGlobalVariable(set.variable)) {
+            this.fieldCompletions = completions.getFieldCompletionsForGlobalVariable(set.variable);
+            this.variableClass = (String) completions.getGlobalVariable(set.variable);
         } else {
-            FactPattern pattern = mod.getModel().getBoundFact( set.variable );
-            if ( pattern != null ) {
-                this.fieldCompletions = completions.getFieldCompletions( FieldAccessorsAndMutators.MUTATOR,
-                                                                         pattern.factType );
+            FactPattern pattern = mod.getModel().getBoundFact(set.variable);
+            if (pattern != null) {
+                this.fieldCompletions = completions.getFieldCompletions(FieldAccessorsAndMutators.MUTATOR,
+                        pattern.factType);
                 this.variableClass = pattern.factType;
                 this.isBoundFact = true;
             } else {
-                ActionInsertFact patternRhs = mod.getModel().getRhsBoundFact( set.variable );
-                if ( patternRhs != null ) {
-                    this.fieldCompletions = completions.getFieldCompletions( FieldAccessorsAndMutators.MUTATOR,
-                                                                             patternRhs.factType );
+                ActionInsertFact patternRhs = mod.getModel().getRhsBoundFact(set.variable);
+                if (patternRhs != null) {
+                    this.fieldCompletions = completions.getFieldCompletions(FieldAccessorsAndMutators.MUTATOR,
+                            patternRhs.factType);
                     this.variableClass = patternRhs.factType;
                     this.isBoundFact = true;
                 }
             }
         }
 
+        if (readOnly == null) {
+            this.readOnly = !completions.containsFactType(this.variableClass);
+        } else {
+            this.readOnly = readOnly;
+        }
+
+        if (this.readOnly) {
+            layout.addStyleName("editor-disabled-widget");
+        }
+
         doLayout();
 
-        initWidget( this.layout );
+        initWidget(this.layout);
     }
 
-
     private void doLayout() {
         layout.clear();
 
@@ -100,25 +110,29 @@
 
         //DirtyableFlexTable inner = new DirtyableFlexTable();
 
-        for ( int i = 0; i < model.fieldValues.length; i++ ) {
+        for (int i = 0; i < model.fieldValues.length; i++) {
             ActionFieldValue val = model.fieldValues[i];
 
             layout.setWidget(i, 0, getSetterLabel());
-            layout.setWidget( i, 1, fieldSelector(val) );
-            layout.setWidget( i, 2, valueEditor(val) );
+            layout.setWidget(i, 1, fieldSelector(val));
+            layout.setWidget(i, 2, valueEditor(val));
             final int idx = i;
             Image remove = new ImageButton("images/delete_faded.gif"); //NON-NLS
             //Image remove = new ImageButton("images/delete_item_fade.gif"); //NON-NLS
-            remove.addClickListener( new ClickListener() {
+            remove.addClickListener(new ClickListener() {
+
                 public void onClick(Widget w) {
-                	if (Window.confirm(constants.RemoveThisItem())) {
-                            model.removeField( idx );
-                            modeller.refreshWidget();
-                	}
+                    if (Window.confirm(constants.RemoveThisItem())) {
+                        model.removeField(idx);
+                        modeller.refreshWidget();
+                    }
                 }
             });
-            if (!modeller.lockRHS()) layout.setWidget( i, 3, remove );
+            if (!this.readOnly) {
+                layout.setWidget(i, 3, remove);
+            }
             remove.addMouseListener(new MouseListenerAdapter() {
+
                 @Override
                 public void onMouseEnter(Widget sender) {
                     super.onMouseEnter(sender);    //To change body of overridden methods use File | Settings | File Templates.
@@ -134,11 +148,14 @@
         if (model.fieldValues.length == 0) {
             HorizontalPanel h = new HorizontalPanel();
             h.add(getSetterLabel());
-            h.add(new ImageButton("images/edit_tiny.gif", constants.AddFirstNewField(), new ClickListener() {
-                public void onClick(Widget sender) {
-                    showAddFieldPopup(sender);
-                }
-            }));
+            if (!this.readOnly) {
+                h.add(new ImageButton("images/edit_tiny.gif", constants.AddFirstNewField(), new ClickListener() {
+
+                    public void onClick(Widget sender) {
+                        showAddFieldPopup(sender);
+                    }
+                }));
+            }
             layout.setWidget(0, 0, h);
         }
 
@@ -147,12 +164,12 @@
 
     }
 
-
     private Widget getSetterLabel() {
 
 
 
-        ClickListener clk =  new ClickListener() {
+        ClickListener clk = new ClickListener() {
+
             public void onClick(Widget w) {
                 showAddFieldPopup(w);
             }
@@ -166,32 +183,33 @@
 
         FactPattern fp = this.modeller.getModel().getBoundFact(model.variable);
 
-        String descFact = (fp != null)? this.modeller.getModel().getBoundFact(model.variable).factType + " <b>[" + model.variable + "]</b>" : model.variable;
+        String descFact = (fp != null) ? this.modeller.getModel().getBoundFact(model.variable).factType + " <b>[" + model.variable + "]</b>" : model.variable;
 
-        String sl = Format.format(constants.setterLabel(), new String[] {HumanReadable.getActionDisplayName(modifyType), descFact});
-        return new ClickableLabel(sl, clk, !modeller.lockRHS());//HumanReadable.getActionDisplayName(modifyType) + " value of <b>[" + model.variable + "]</b>", clk);
+        String sl = Format.format(constants.setterLabel(), new String[]{HumanReadable.getActionDisplayName(modifyType), descFact});
+        return new ClickableLabel(sl, clk, !this.readOnly);//HumanReadable.getActionDisplayName(modifyType) + " value of <b>[" + model.variable + "]</b>", clk);
     }
 
-
     protected void showAddFieldPopup(Widget w) {
+        final SuggestionCompletionEngine completions = modeller.getSuggestionCompletions();
         final FormStylePopup popup = new FormStylePopup("images/newex_wiz.gif", constants.AddAField());
 
         final ListBox box = new ListBox();
-        box.addItem( "..." );
+        box.addItem("...");
 
-        for ( int i = 0; i < fieldCompletions.length; i++ ) {
-            box.addItem( fieldCompletions[i] );
+        for (int i = 0; i < fieldCompletions.length; i++) {
+            box.addItem(fieldCompletions[i]);
         }
 
-        box.setSelectedIndex( 0 );
+        box.setSelectedIndex(0);
 
-        popup.addAttribute(constants.AddField(), box );
-        box.addChangeListener( new ChangeListener() {
+        popup.addAttribute(constants.AddField(), box);
+        box.addChangeListener(new ChangeListener() {
+
             public void onChange(Widget w) {
-                String fieldName = box.getItemText( box.getSelectedIndex() );
+                String fieldName = box.getItemText(box.getSelectedIndex());
 
-                String fieldType = completions.getFieldType( variableClass, fieldName );
-                model.addFieldValue( new ActionFieldValue( fieldName, "", fieldType ) );
+                String fieldType = completions.getFieldType(variableClass, fieldName);
+                model.addFieldValue(new ActionFieldValue(fieldName, "", fieldType));
                 modeller.refreshWidget();
                 popup.hide();
             }
@@ -202,30 +220,25 @@
 
     }
 
-
     private Widget valueEditor(final ActionFieldValue val) {
+        SuggestionCompletionEngine completions = modeller.getSuggestionCompletions();
+        String type = "";
+        if (completions.isGlobalVariable(this.model.variable)) {
+            type = (String) completions.getGlobalVariable(this.model.variable);
+        } else {
+            type = this.modeller.getModel().getBoundFact(this.model.variable).factType;
+            /*
+             * to take in account if the using a rhs bound variable
+             */
+            if (type == null) {
+                type = this.modeller.getModel().getRhsBoundFact(this.model.variable).factType;
+            }
+        }
 
-    	String type = "";
-    	if (this.completions.isGlobalVariable(this.model.variable)) {
-    		type = (String) this.completions.getGlobalVariable(this.model.variable);
-    	} else {
-    		type = this.modeller.getModel().getBoundFact(this.model.variable).factType;
-    		/*
-    		 * to take in account if the using a rhs bound variable
-    		 */
-    		if (type==null){
-        		type = this.modeller.getModel().getRhsBoundFact(this.model.variable).factType;
-    		}
-    	}
-
-    	DropDownData enums = this.completions.getEnums(type, this.model.fieldValues, val.field);
-    	return new ActionValueEditor(val, enums,modeller,val.type);
+        DropDownData enums = completions.getEnums(type, this.model.fieldValues, val.field);
+        return new ActionValueEditor(val, enums, modeller, val.type, this.readOnly);
     }
 
-
-
-
-
     private Widget fieldSelector(final ActionFieldValue val) {
         return new SmallLabel(val.field);
     }
@@ -241,4 +254,8 @@
         return layout.hasDirty();
     }
 
-}
\ No newline at end of file
+    @Override
+    public boolean isReadOnly() {
+        return this.readOnly;
+    }
+}

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-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ActionValueEditor.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -22,16 +22,18 @@
 public class ActionValueEditor extends DirtyableComposite {
 
     private ActionFieldValue value;
-    private DropDownData     enums;
-    private SimplePanel      root;
-    private Constants        constants    = GWT.create( Constants.class );
-    private RuleModeller     model        = null;
-    private String           variableType = null;
+    private DropDownData enums;
+    private SimplePanel root;
+    private Constants constants = GWT.create(Constants.class);
+    private RuleModeller model = null;
+    private String variableType = null;
+    private boolean readOnly;
 
     public ActionValueEditor(final ActionFieldValue val,
-                             final DropDownData enums) {
-        if ( val.type.equals( SuggestionCompletionEngine.TYPE_BOOLEAN ) ) {
-            this.enums = DropDownData.create( new String[]{"true", "false"} );
+            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;
         }
@@ -39,15 +41,30 @@
         this.value = val;
 
         refresh();
-        initWidget( root );
+        initWidget(root);
     }
 
     public ActionValueEditor(final ActionFieldValue val,
-                             final DropDownData enums,
-                             RuleModeller model,
-                             String variableType) {
-        if ( val.type.equals( SuggestionCompletionEngine.TYPE_BOOLEAN ) ) {
-            this.enums = DropDownData.create( new String[]{"true", "false"} );
+            final DropDownData enums) {
+        this(val, enums, false);
+    }
+
+    public ActionValueEditor(final ActionFieldValue val,
+            final DropDownData enums,
+            RuleModeller model,
+            String variableType) {
+        this(val, enums, model, variableType, false);
+    }
+
+    public ActionValueEditor(final ActionFieldValue val,
+            final DropDownData enums,
+            RuleModeller model,
+            String variableType, boolean readOnly) {
+
+        this.readOnly = readOnly;
+
+        if (val.type.equals(SuggestionCompletionEngine.TYPE_BOOLEAN)) {
+            this.enums = DropDownData.create(new String[]{"true", "false"});
         } else {
             this.enums = enums;
         }
@@ -56,45 +73,40 @@
         this.model = model;
         this.variableType = variableType;
         refresh();
-        initWidget( root );
+        initWidget(root);
     }
 
     private void refresh() {
         root.clear();
-        if ( enums != null && (enums.fixedList != null || enums.queryExpression != null) ) {
-            root.add( new EnumDropDown( value.value,
-                                        new DropDownValueChanged() {
-                                            public void valueChanged(String newText,
-                                                                     String newValue) {
-                                                value.value = newValue;
-                                                makeDirty();
-                                            }
-                                        },
-                                        enums ) );
+        if (enums != null && (enums.fixedList != null || enums.queryExpression != null)) {
+            //enum
+            Widget list = boundEnum(value);
+            root.add(list);
         } else {
             // FIX nheron il faut ajouter les autres choix pour appeller les
             // bons editeurs suivant le type
             // si la valeur vaut 0 il faut mettre un stylo (
 
-            if ( value.value != null && value.value.length() > 0 && value.nature == ActionFieldValue.TYPE_UNDEFINED ) {
+            if (value.value != null && value.value.length() > 0 && value.nature == ActionFieldValue.TYPE_UNDEFINED) {
                 ///JBDS-894
-                if ( value.value.charAt( 0 ) == '=' ) {
+                if (value.value.charAt(0) == '=') {
                     value.nature = ActionFieldValue.TYPE_VARIABLE;
                 } else {
                     value.nature = ActionFieldValue.TYPE_LITERAL;
                 }
             }
-            if ( value.nature == ActionFieldValue.TYPE_UNDEFINED ) {
+            if (value.nature == ActionFieldValue.TYPE_UNDEFINED) {
                 // we have a blank slate..
                 // have to give them a choice
-                root.add( choice() );
+                root.add(choice());
             } else {
-                if ( value.nature == ActionFieldValue.TYPE_VARIABLE ) {
-                    ListBox list = boundVariable( value );
-                    root.add( list );
+                if (value.nature == ActionFieldValue.TYPE_VARIABLE) {
+                    Widget list = boundVariable(value);
+                    root.add(list);
                 } else {
-                    TextBox box = boundTextBox( this.value );
-                    root.add( box );
+                    //formula and literal
+                    Widget box = boundTextBox(this.value);
+                    root.add(box);
                 }
 
             }
@@ -102,101 +114,127 @@
         }
     }
 
-    private ListBox boundVariable(final ActionFieldValue c) {
+    private Widget boundVariable(final ActionFieldValue c) {
         /*
          * If there is a bound variable that is the same type of the current
          * variable type, then propose a list
          */
         ListBox listVariable = new ListBox();
         List<String> vars = model.getModel().getBoundFacts();
-        for ( String v : vars ) {
-            FactPattern factPattern = model.getModel().getBoundFact( v );
-            String fv = model.getModel().getFieldConstraint( v );
+        for (String v : vars) {
+            FactPattern factPattern = model.getModel().getBoundFact(v);
+            String fv = model.getModel().getFieldConstraint(v);
 
-            if ( (factPattern != null && factPattern.factType.equals( this.variableType )) || (fv != null) ) {
+            if ((factPattern != null && factPattern.factType.equals(this.variableType)) || (fv != null)) {
                 // First selection is empty
-                if ( listVariable.getItemCount() == 0 ) {
-                    listVariable.addItem( "..." );
+                if (listVariable.getItemCount() == 0) {
+                    listVariable.addItem("...");
                 }
 
-                listVariable.addItem( v );
+                listVariable.addItem(v);
             }
         }
         /*
          * add the bound variable of the rhs
          */
         List<String> vars2 = model.getModel().getRhsBoundFacts();
-        for ( String v : vars2 ) {
-            ActionInsertFact factPattern = model.getModel().getRhsBoundFact( v );
-            if ( factPattern.factType.equals( this.variableType ) ) {
+        for (String v : vars2) {
+            ActionInsertFact factPattern = model.getModel().getRhsBoundFact(v);
+            if (factPattern.factType.equals(this.variableType)) {
                 // First selection is empty
-                if ( listVariable.getItemCount() == 0 ) {
-                    listVariable.addItem( "..." );
+                if (listVariable.getItemCount() == 0) {
+                    listVariable.addItem("...");
                 }
 
-                listVariable.addItem( v );
+                listVariable.addItem(v);
             }
         }
-        if ( value.value.equals( "=" ) ) {
-            listVariable.setSelectedIndex( 0 );
+        if (value.value.equals("=")) {
+            listVariable.setSelectedIndex(0);
         } else {
-            for ( int i = 0; i < listVariable.getItemCount(); i++ ) {
-                if ( listVariable.getItemText( i ).equals( value.value.substring( 1 ) ) ) {
-                    listVariable.setSelectedIndex( i );
+            for (int i = 0; i < listVariable.getItemCount(); i++) {
+                if (listVariable.getItemText(i).equals(value.value.substring(1))) {
+                    listVariable.setSelectedIndex(i);
                 }
             }
         }
-        if ( listVariable.getItemCount() > 0 ) {
+        if (listVariable.getItemCount() > 0) {
 
-            listVariable.addChangeListener( new ChangeListener() {
+            listVariable.addChangeListener(new ChangeListener() {
+
                 public void onChange(Widget arg0) {
                     ListBox w = (ListBox) arg0;
-                    value.value = "=" + w.getValue( w.getSelectedIndex() );
+                    value.value = "=" + w.getValue(w.getSelectedIndex());
                     makeDirty();
                     refresh();
                 }
+            });
+        }
 
-            } );
+        if (this.readOnly) {
+            return new SmallLabel(listVariable.getItemText(listVariable.getSelectedIndex()));
         }
+
         return listVariable;
     }
 
-    private TextBox boundTextBox(final ActionFieldValue c) {
+    private Widget boundEnum(final ActionFieldValue c) {
+        EnumDropDown enumDropDown = new EnumDropDown(value.value, new DropDownValueChanged() {
+
+            public void valueChanged(String newText, String newValue) {
+                value.value = newValue;
+                makeDirty();
+            }
+        }, enums);
+
+        if (this.readOnly) {
+            return new SmallLabel(enumDropDown.getItemText(enumDropDown.getSelectedIndex()));
+        } else {
+            return enumDropDown;
+        }
+    }
+
+    private Widget boundTextBox(final ActionFieldValue c) {
         final TextBox box = new TextBox();
-        box.setStyleName( "constraint-value-Editor" );
-        if ( c.value == null ) {
-            box.setText( "" );
+        box.setStyleName("constraint-value-Editor");
+        if (c.value == null) {
+            box.setText("");
         } else {
-            if ( c.value.trim().equals( "" ) ) {
+            if (c.value.trim().equals("")) {
                 c.value = "";
             }
-            box.setText( c.value );
+            box.setText(c.value);
         }
 
-        if ( c.value == null || c.value.length() < 5 ) {
-            box.setVisibleLength( 6 );
+        if (c.value == null || c.value.length() < 5) {
+            box.setVisibleLength(6);
         } else {
-            box.setVisibleLength( c.value.length() - 1 );
+            box.setVisibleLength(c.value.length() - 1);
         }
 
-        box.addChangeListener( new ChangeListener() {
+        box.addChangeListener(new ChangeListener() {
+
             public void onChange(Widget w) {
                 c.value = box.getText();
                 makeDirty();
             }
+        });
 
-        } );
+        box.addKeyboardListener(new FieldEditListener(new Command() {
 
-        box.addKeyboardListener( new FieldEditListener( new Command() {
             public void execute() {
-                box.setVisibleLength( box.getText().length() );
+                box.setVisibleLength(box.getText().length());
             }
-        } ) );
+        }));
 
-        if ( value.type.equals( SuggestionCompletionEngine.TYPE_NUMERIC ) ) {
-            box.addKeyboardListener( getNumericFilter( box ) );
+        if (value.type.equals(SuggestionCompletionEngine.TYPE_NUMERIC)) {
+            box.addKeyboardListener(getNumericFilter(box));
         }
 
+        if (this.readOnly) {
+            return new SmallLabel(box.getText());
+        }
+
         return box;
     }
 
@@ -210,42 +248,46 @@
         return new KeyboardListener() {
 
             public void onKeyDown(Widget arg0,
-                                  char arg1,
-                                  int arg2) {
-
+                    char arg1,
+                    int arg2) {
             }
 
             public void onKeyPress(Widget w,
-                                   char c,
-                                   int i) {
-                if ( Character.isLetter( c ) && c != '=' && !(box.getText().startsWith( "=" )) ) {
+                    char c,
+                    int i) {
+                if (Character.isLetter(c) && c != '=' && !(box.getText().startsWith("="))) {
                     ((TextBox) w).cancelKey();
                 }
             }
 
             public void onKeyUp(Widget arg0,
-                                char arg1,
-                                int arg2) {
+                    char arg1,
+                    int arg2) {
             }
-
         };
     }
 
     private Widget choice() {
-        Image clickme = new Image( "images/edit.gif" );
-        clickme.addClickListener( new ClickListener() {
-            public void onClick(Widget w) {
-                showTypeChoice( w );
-            }
-        } );
-        return clickme;
+        if (this.readOnly) {
+            return new HTML();
+        } else {
+            Image clickme = new Image("images/edit.gif");
+            clickme.addClickListener(new ClickListener() {
+
+                public void onClick(Widget w) {
+                    showTypeChoice(w);
+                }
+            });
+            return clickme;
+        }
     }
 
     protected void showTypeChoice(Widget w) {
-        final FormStylePopup form = new FormStylePopup( "images/newex_wiz.gif",
-                                                        constants.FieldValue() );
-        Button lit = new Button( constants.LiteralValue() );
-        lit.addClickListener( new ClickListener() {
+        final FormStylePopup form = new FormStylePopup("images/newex_wiz.gif",
+                constants.FieldValue());
+        Button lit = new Button(constants.LiteralValue());
+        lit.addClickListener(new ClickListener() {
+
             public void onClick(Widget w) {
                 value.nature = ActionFieldValue.TYPE_LITERAL;
                 value.value = " ";
@@ -253,19 +295,18 @@
                 refresh();
                 form.hide();
             }
+        });
 
-        } );
+        form.addAttribute(constants.LiteralValue() + ":",
+                widgets(lit,
+                new InfoPopup(constants.Literal(),
+                constants.ALiteralValueMeansTheValueAsTypedInIeItsNotACalculation())));
+        form.addRow(new HTML("<hr/>"));
+        form.addRow(new SmallLabel(constants.AdvancedSection()));
 
-        form.addAttribute( constants.LiteralValue() + ":",
-                           widgets( lit,
-                                    new InfoPopup( constants.Literal(),
-                                                   constants.ALiteralValueMeansTheValueAsTypedInIeItsNotACalculation() ) ) );
-        form.addRow( new HTML( "<hr/>" ) );
-        form.addRow( new SmallLabel( constants.AdvancedSection() ) );
+        Button formula = new Button(constants.Formula());
+        formula.addClickListener(new ClickListener() {
 
-        Button formula = new Button( constants.Formula() );
-        formula.addClickListener( new ClickListener() {
-
             public void onClick(Widget w) {
                 value.nature = ActionFieldValue.TYPE_FORMULA;
                 value.value = "=";
@@ -273,36 +314,35 @@
                 refresh();
                 form.hide();
             }
+        });
 
-        } );
-
         /*
          * If there is a bound variable that is the same type of the current
          * variable type, then show abutton
          */
         List<String> vars = model.getModel().getBoundFacts();
         List<String> vars2 = model.getModel().getRhsBoundFacts();
-        for ( String i : vars2 ) {
-            vars.add( i );
+        for (String i : vars2) {
+            vars.add(i);
         }
-        for ( String v : vars ) {
+        for (String v : vars) {
             boolean createButton = false;
-            Button variable = new Button( constants.BoundVariable() );
-            if ( vars2.contains( v ) == false ) {
-                FactPattern factPattern = model.getModel().getBoundFact( v );
-                if ( factPattern.factType.equals( this.variableType ) ) {
+            Button variable = new Button(constants.BoundVariable());
+            if (vars2.contains(v) == false) {
+                FactPattern factPattern = model.getModel().getBoundFact(v);
+                if (factPattern.factType.equals(this.variableType)) {
                     createButton = true;
                 }
             } else {
-                ActionInsertFact factPattern = model.getModel().getRhsBoundFact( v );
-                if ( factPattern.factType.equals( this.variableType ) ) {
+                ActionInsertFact factPattern = model.getModel().getRhsBoundFact(v);
+                if (factPattern.factType.equals(this.variableType)) {
                     createButton = true;
                 }
             }
-            if ( createButton == true ) {
-                form.addAttribute( constants.BoundVariable() + ":",
-                                   variable );
-                variable.addClickListener( new ClickListener() {
+            if (createButton == true) {
+                form.addAttribute(constants.BoundVariable() + ":",
+                        variable);
+                variable.addClickListener(new ClickListener() {
 
                     public void onClick(Widget w) {
                         value.nature = ActionFieldValue.TYPE_VARIABLE;
@@ -311,16 +351,15 @@
                         refresh();
                         form.hide();
                     }
-
-                } );
+                });
                 break;
             }
         }
 
-        form.addAttribute( constants.Formula() + ":",
-                           widgets( formula,
-                                    new InfoPopup( constants.Formula(),
-                                                   constants.FormulaTip() ) ) );
+        form.addAttribute(constants.Formula() + ":",
+                widgets(formula,
+                new InfoPopup(constants.Formula(),
+                constants.FormulaTip())));
 
         // if (model != null){
         // for (int i=0;i< model.lhs.length;i++){
@@ -335,11 +374,10 @@
     }
 
     private Widget widgets(Button lit,
-                           InfoPopup popup) {
+            InfoPopup popup) {
         HorizontalPanel h = new HorizontalPanel();
-        h.add( lit );
-        h.add( popup );
+        h.add(lit);
+        h.add(popup);
         return h;
     }
-
 }

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/CompositeFactPatternWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/CompositeFactPatternWidget.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/CompositeFactPatternWidget.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -18,11 +18,9 @@
 
 
 import org.drools.guvnor.client.common.ClickableLabel;
-import org.drools.guvnor.client.common.DirtyableComposite;
 import org.drools.guvnor.client.common.DirtyableFlexTable;
 import org.drools.guvnor.client.common.DirtyableVerticalPane;
 import org.drools.guvnor.client.common.FormStylePopup;
-import org.drools.guvnor.client.common.ImageButton;
 import org.drools.guvnor.client.modeldriven.HumanReadable;
 import org.drools.guvnor.client.modeldriven.SuggestionCompletionEngine;
 import org.drools.guvnor.client.modeldriven.brl.CompositeFactPattern;
@@ -39,16 +37,23 @@
  * @author Michael Neale
  *
  */
-public class CompositeFactPatternWidget extends DirtyableComposite {
+public class CompositeFactPatternWidget extends RuleModellerWidget {
 
     protected final SuggestionCompletionEngine completions;
     protected CompositeFactPattern             pattern;
     protected DirtyableFlexTable                             layout;
     protected RuleModeller                     modeller;
     protected Constants constants = ((Constants) GWT.create(Constants.class));
+    protected boolean readOnly;
 
     public CompositeFactPatternWidget(RuleModeller modeller,
                                       CompositeFactPattern pattern) {
+        this(modeller, pattern, null);
+    }
+
+    public CompositeFactPatternWidget(RuleModeller modeller,
+                                      CompositeFactPattern pattern,
+                                      Boolean readOnly) {
         this.completions = modeller.getSuggestionCompletions();
         this.pattern = pattern;
         this.modeller = modeller;
@@ -56,6 +61,25 @@
         this.layout = new DirtyableFlexTable();
         this.layout.setStyleName( "model-builderInner-Background" );
 
+        if (readOnly != null){
+            this.readOnly = readOnly;
+        }else{
+            this.readOnly = false;
+            if (this.pattern != null && this.pattern.patterns != null){
+                for (int i = 0; i < this.pattern.patterns.length; i++) {
+                    FactPattern factPattern = this.pattern.patterns[i];
+                    if (!completions.containsFactType(factPattern.factType)){
+                        this.readOnly = true;
+                        break;
+                    }
+                }
+            }
+        }
+
+        if (this.readOnly){
+            layout.addStyleName("editor-disabled-widget");
+        }
+
         doLayout();
         initWidget( layout );
     }
@@ -76,7 +100,7 @@
             for ( int i = 0; i < facts.length; i++ ) {
                 vert.add( new FactPatternWidget( modeller,
                                                  facts[i],
-                                                 false ) );
+                                                 false,this.readOnly ) );
             }
             this.layout.setWidget( 1,
                                    1,
@@ -97,7 +121,7 @@
             lbl += " <font color='red'>" + constants.clickToAddPatterns() + "</font>";
         }
 
-        return new ClickableLabel( lbl + ":", click, !this.modeller.lockLHS() ) ;
+        return new ClickableLabel( lbl + ":", click, !this.readOnly ) ;
     }
 
     /**
@@ -133,4 +157,9 @@
         return layout.hasDirty();
     }
 
+    @Override
+    public boolean isReadOnly() {
+        return this.readOnly;
+    }
+
 }
\ No newline at end of file

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-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ConstraintValueEditor.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -15,7 +15,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 import java.util.List;
 
 import org.drools.guvnor.client.common.DirtyableComposite;
@@ -55,43 +54,46 @@
  */
 public class ConstraintValueEditor extends DirtyableComposite {
 
-    private final FactPattern                pattern;
-    private final String                     fieldName;
+    private final FactPattern pattern;
+    private final String fieldName;
     private final SuggestionCompletionEngine sce;
-    private final ISingleFieldConstraint     constraint;
-    private final Panel                      panel;
-    private final RuleModel                  model;
-    private final RuleModeller               modeller;
-    private final boolean                    numericValue;
-    private DropDownData                     dropDownData;
-    private Constants                        constants = ((Constants) GWT.create( Constants.class ));
-    private String                           fieldType;
+    private final ISingleFieldConstraint constraint;
+    private final Panel panel;
+    private final RuleModel model;
+    private final RuleModeller modeller;
+    private final boolean numericValue;
+    private DropDownData dropDownData;
+    private Constants constants = ((Constants) GWT.create(Constants.class));
+    private String fieldType;
+    private boolean readOnly;
 
     /**
      * @param con The constraint being edited.
      */
     public ConstraintValueEditor(FactPattern pattern,
-                                 String fieldName,
-                                 ISingleFieldConstraint con,
-                                 RuleModeller modeller,
-                                 String valueType /* eg is numeric */) {
+            String fieldName,
+            ISingleFieldConstraint con,
+            RuleModeller modeller,
+            String valueType /* eg is numeric */,
+            boolean readOnly) {
         this.pattern = pattern;
         this.fieldName = fieldName;
         this.constraint = con;
+        this.readOnly = readOnly;
         this.sce = modeller.getSuggestionCompletions();
-        valueType = sce.getFieldType( pattern.factType,
-                                      fieldName );
+        valueType = sce.getFieldType(pattern.factType,
+                fieldName);
         this.fieldType = valueType;
-        if ( SuggestionCompletionEngine.TYPE_NUMERIC.equals( valueType ) ) {
+        if (SuggestionCompletionEngine.TYPE_NUMERIC.equals(valueType)) {
             this.numericValue = true;
         } else {
             this.numericValue = false;
         }
-        if ( SuggestionCompletionEngine.TYPE_BOOLEAN.equals( valueType ) ) {
-            this.dropDownData = DropDownData.create( new String[]{"true", "false"} ); //NON-NLS
+        if (SuggestionCompletionEngine.TYPE_BOOLEAN.equals(valueType)) {
+            this.dropDownData = DropDownData.create(new String[]{"true", "false"}); //NON-NLS
         } else {
-            this.dropDownData = sce.getEnums( pattern,
-                                              fieldName );
+            this.dropDownData = sce.getEnums(pattern,
+                    fieldName);
         }
 
         this.model = modeller.getModel();
@@ -99,104 +101,118 @@
 
         panel = new SimplePanel();
         refreshEditor();
-        initWidget( panel );
+        initWidget(panel);
 
     }
 
     private void refreshEditor() {
         panel.clear();
+        if (constraint.constraintValueType == SingleFieldConstraint.TYPE_UNDEFINED) {
+            Image clickme = new Image("images/edit.gif"); //NON-NLS
+            clickme.addClickListener(new ClickListener() {
 
-        if ( constraint.constraintValueType == SingleFieldConstraint.TYPE_UNDEFINED ) {
-            Image clickme = new Image( "images/edit.gif" ); //NON-NLS
-            clickme.addClickListener( new ClickListener() {
                 public void onClick(Widget w) {
-                    showTypeChoice( w,
-                                    constraint );
+                    showTypeChoice(w,
+                            constraint);
                 }
-            } );
-            panel.add( clickme );
+            });
+            panel.add(clickme);
         } else {
-            switch ( constraint.constraintValueType ) {
-                case SingleFieldConstraint.TYPE_LITERAL :
-                    if ( this.dropDownData != null ) {
-                        panel.add( new EnumDropDownLabel( this.pattern,
-                                                          this.fieldName,
-                                                          this.sce,
-                                                          this.constraint ) );
-                    } else if ( SuggestionCompletionEngine.TYPE_DATE.equals( this.fieldType ) ) {
+            switch (constraint.constraintValueType) {
+                case SingleFieldConstraint.TYPE_LITERAL:
+                    if (this.dropDownData != null) {
+                        panel.add(new EnumDropDownLabel(this.pattern,
+                                this.fieldName,
+                                this.sce,
+                                this.constraint));
+                    } else if (SuggestionCompletionEngine.TYPE_DATE.equals(this.fieldType)) {
 
-                        DatePickerLabel datePicker = new DatePickerLabel( constraint.value );
+                        DatePickerLabel datePicker = new DatePickerLabel(constraint.value);
 
                         // Set the default time
                         this.constraint.value = datePicker.getDateString();
 
-                        datePicker.addValueChanged( new ValueChanged() {
-                            public void valueChanged(String newValue) {
-                                constraint.value = newValue;
-                            }
-                        } );
+                        if (!this.readOnly) {
+                            datePicker.addValueChanged(new ValueChanged() {
 
-                        panel.add( datePicker );
+                                public void valueChanged(String newValue) {
+                                    constraint.value = newValue;
+                                }
+                            });
 
+                            panel.add(datePicker);
+                        } else {
+                            panel.add(new SmallLabel(this.constraint.value));
+                        }
                     } else {
-                        panel.add( new DefaultLiteralEditor( this.constraint,
-                                                             this.numericValue ) );
+                        if (!this.readOnly) {
+                            panel.add(new DefaultLiteralEditor(this.constraint,
+                                    this.numericValue));
+                        } else {
+                            panel.add(new SmallLabel(this.constraint.value));
+                        }
                     }
                     break;
-                case SingleFieldConstraint.TYPE_RET_VALUE :
-                    panel.add( returnValueEditor() );
+                case SingleFieldConstraint.TYPE_RET_VALUE:
+                    panel.add(returnValueEditor());
                     break;
-                case SingleFieldConstraint.TYPE_EXPR_BUILDER :
-                    panel.add( expressionEditor() );
+                case SingleFieldConstraint.TYPE_EXPR_BUILDER:
+                    panel.add(expressionEditor());
                     break;
-                case SingleFieldConstraint.TYPE_VARIABLE :
-                    panel.add( variableEditor() );
+                case SingleFieldConstraint.TYPE_VARIABLE:
+                    panel.add(variableEditor());
                     break;
-                default :
+                default:
                     break;
             }
         }
     }
 
     private Widget variableEditor() {
-        List vars = this.model.getBoundVariablesInScope( this.constraint );
 
+        if (this.readOnly){
+            return new SmallLabel(this.constraint.value);
+        }
+
+        List vars = this.model.getBoundVariablesInScope(this.constraint);
+
         final ListBox box = new ListBox();
 
-        if ( this.constraint.value == null ) {
-            box.addItem( constants.Choose() );
+        if (this.constraint.value == null) {
+            box.addItem(constants.Choose());
         }
 
         int j = 0;
-        for ( int i = 0; i < vars.size(); i++ ) {
-            String var = (String) vars.get( i );
-            FactPattern f = model.getBoundFact( var );
-            String fv = model.getFieldConstraint( var );
-            if ( (f != null && f.factType.equals( this.fieldType )) || (fv != null && fv.equals( this.fieldType )) ) {
-                box.addItem( var );
-                if ( this.constraint.value != null && this.constraint.value.equals( var ) ) {
-                    box.setSelectedIndex( j );
+        for (int i = 0; i < vars.size(); i++) {
+            String var = (String) vars.get(i);
+            FactPattern f = model.getBoundFact(var);
+            String fv = model.getFieldConstraint(var);
+            if ((f != null && f.factType.equals(this.fieldType)) || (fv != null && fv.equals(this.fieldType))) {
+                box.addItem(var);
+                if (this.constraint.value != null && this.constraint.value.equals(var)) {
+                    box.setSelectedIndex(j);
                 }
                 j++;
             } else {
                 // for collection, present the list of possible bound variable
-                String factCollectionType = sce.getParametricFieldType( pattern.factType,
-                                                                        this.fieldName );
-                if ( (f != null && factCollectionType != null && f.factType.equals( factCollectionType )) || (factCollectionType != null && factCollectionType.equals( fv )) ) {
-                    box.addItem( var );
-                    if ( this.constraint.value != null && this.constraint.value.equals( var ) ) {
-                        box.setSelectedIndex( j );
+                String factCollectionType = sce.getParametricFieldType(pattern.factType,
+                        this.fieldName);
+                if ((f != null && factCollectionType != null && f.factType.equals(factCollectionType)) || (factCollectionType != null && factCollectionType.equals(fv))) {
+                    box.addItem(var);
+                    if (this.constraint.value != null && this.constraint.value.equals(var)) {
+                        box.setSelectedIndex(j);
                     }
                     j++;
                 }
             }
         }
 
-        box.addChangeListener( new ChangeListener() {
+        box.addChangeListener(new ChangeListener() {
+
             public void onChange(Widget w) {
-                constraint.value = box.getItemText( box.getSelectedIndex() );
+                constraint.value = box.getItemText(box.getSelectedIndex());
             }
-        } );
+        });
 
         return box;
     }
@@ -205,24 +221,24 @@
      * An editor for the retval "formula" (expression).
      */
     private Widget returnValueEditor() {
-        TextBox box = new BoundTextBox( constraint );
+        TextBox box = new BoundTextBox(constraint);
         String msg = constants.FormulaEvaluateToAValue();
-        Image img = new Image( "images/function_assets.gif" ); //NON-NLS
-        img.setTitle( msg );
-        box.setTitle( msg );
-        Widget ed = widgets( img,
-                             box );
+        Image img = new Image("images/function_assets.gif"); //NON-NLS
+        img.setTitle(msg);
+        box.setTitle(msg);
+        Widget ed = widgets(img,
+                box);
         return ed;
     }
 
     private Widget expressionEditor() {
-        if (!(this.constraint instanceof SingleFieldConstraint)){
-            throw new IllegalArgumentException("Expected SingleFieldConstraint, but "+constraint.getClass().getName()+" found.");
+        if (!(this.constraint instanceof SingleFieldConstraint)) {
+            throw new IllegalArgumentException("Expected SingleFieldConstraint, but " + constraint.getClass().getName() + " found.");
         }
-        ExpressionBuilder builder = new ExpressionBuilder(this.modeller, ((SingleFieldConstraint)this.constraint).getExpression());
+        ExpressionBuilder builder = new ExpressionBuilder(this.modeller, ((SingleFieldConstraint) this.constraint).getExpression());
         String msg = constants.ExpressionEditor();
-        Widget ed = widgets( new HTML("&nbsp;"),
-                             builder );
+        Widget ed = widgets(new HTML("&nbsp;"),
+                builder);
         return ed;
     }
 
@@ -230,88 +246,91 @@
      * Show a list of possibilities for the value type.
      */
     private void showTypeChoice(Widget w,
-                                final ISingleFieldConstraint con) {
-        final FormStylePopup form = new FormStylePopup( "images/newex_wiz.gif",
-                                                        constants.FieldValue() );
+            final ISingleFieldConstraint con) {
+        final FormStylePopup form = new FormStylePopup("images/newex_wiz.gif",
+                constants.FieldValue());
 
-        Button lit = new Button( constants.LiteralValue() );
-        lit.addClickListener( new ClickListener() {
+        Button lit = new Button(constants.LiteralValue());
+        lit.addClickListener(new ClickListener() {
+
             public void onClick(Widget w) {
                 con.constraintValueType = SingleFieldConstraint.TYPE_LITERAL;
-                doTypeChosen( form );
+                doTypeChosen(form);
             }
+        });
+        form.addAttribute(constants.LiteralValue() + ":",
+                widgets(lit,
+                new InfoPopup(constants.LiteralValue(),
+                constants.LiteralValTip())));
 
-        } );
-        form.addAttribute( constants.LiteralValue() + ":",
-                           widgets( lit,
-                                    new InfoPopup( constants.LiteralValue(),
-                                                   constants.LiteralValTip() ) ) );
+        form.addRow(new HTML("<hr/>"));
+        form.addRow(new SmallLabel(constants.AdvancedOptions()));
 
-        form.addRow( new HTML( "<hr/>" ) );
-        form.addRow( new SmallLabel( constants.AdvancedOptions() ) );
-
         //only want to show variables if we have some !
-        if ( this.model.getBoundVariablesInScope( this.constraint ).size() > 0 || SuggestionCompletionEngine.TYPE_COLLECTION.equals( this.fieldType ) ) {
+        if (this.model.getBoundVariablesInScope(this.constraint).size() > 0 || SuggestionCompletionEngine.TYPE_COLLECTION.equals(this.fieldType)) {
             List vars = this.model.getBoundFacts();
             boolean foundABouncVariableThatMatches = false;
-            for ( int i = 0; i < vars.size(); i++ ) {
-                String var = (String) vars.get( i );
-                FactPattern f = model.getBoundFact( var );
-                String fieldConstraint = model.getFieldConstraint( var );
+            for (int i = 0; i < vars.size(); i++) {
+                String var = (String) vars.get(i);
+                FactPattern f = model.getBoundFact(var);
+                String fieldConstraint = model.getFieldConstraint(var);
 
-                if ( (f != null && f.factType.equals( this.fieldType )) || this.fieldType.equals( fieldConstraint ) ) {
+                if ((f != null && f.factType.equals(this.fieldType)) || this.fieldType.equals(fieldConstraint)) {
                     foundABouncVariableThatMatches = true;
                     break;
                 } else {
                     // for collection, present the list of possible bound variable
-                    String factCollectionType = sce.getParametricFieldType( pattern.factType,
-                                                                            this.fieldName );
-                    if ( (f != null && factCollectionType != null && f.factType.equals( factCollectionType )) || (factCollectionType != null && factCollectionType.equals( fieldConstraint )) ) {
+                    String factCollectionType = sce.getParametricFieldType(pattern.factType,
+                            this.fieldName);
+                    if ((f != null && factCollectionType != null && f.factType.equals(factCollectionType)) || (factCollectionType != null && factCollectionType.equals(fieldConstraint))) {
                         foundABouncVariableThatMatches = true;
                         break;
                     }
                 }
             }
-            if ( foundABouncVariableThatMatches == true ) {
-                Button variable = new Button( constants.BoundVariable() );
-                variable.addClickListener( new ClickListener() {
+            if (foundABouncVariableThatMatches == true) {
+                Button variable = new Button(constants.BoundVariable());
+                variable.addClickListener(new ClickListener() {
+
                     public void onClick(Widget w) {
                         con.constraintValueType = SingleFieldConstraint.TYPE_VARIABLE;
-                        doTypeChosen( form );
+                        doTypeChosen(form);
                     }
-                } );
-                form.addAttribute( constants.AVariable(),
-                                   widgets( variable,
-                                            new InfoPopup( constants.ABoundVariable(),
-                                                           constants.BoundVariableTip() ) ) );
+                });
+                form.addAttribute(constants.AVariable(),
+                        widgets(variable,
+                        new InfoPopup(constants.ABoundVariable(),
+                        constants.BoundVariableTip())));
             }
         }
 
-        Button formula = new Button( constants.NewFormula() );
-        formula.addClickListener( new ClickListener() {
+        Button formula = new Button(constants.NewFormula());
+        formula.addClickListener(new ClickListener() {
+
             public void onClick(Widget w) {
                 con.constraintValueType = SingleFieldConstraint.TYPE_RET_VALUE;
-                doTypeChosen( form );
+                doTypeChosen(form);
             }
-        } );
+        });
 
-        form.addAttribute( constants.AFormula() + ":",
-                           widgets( formula,
-                                    new InfoPopup( constants.AFormula(),
-                                                   constants.FormulaExpressionTip() ) ) );
+        form.addAttribute(constants.AFormula() + ":",
+                widgets(formula,
+                new InfoPopup(constants.AFormula(),
+                constants.FormulaExpressionTip())));
 
-        Button expression = new Button( constants.ExpressionEditor() );
-        expression.addClickListener( new ClickListener() {
+        Button expression = new Button(constants.ExpressionEditor());
+        expression.addClickListener(new ClickListener() {
+
             public void onClick(Widget w) {
                 con.constraintValueType = SingleFieldConstraint.TYPE_EXPR_BUILDER;
-                doTypeChosen( form );
+                doTypeChosen(form);
             }
-        } );
+        });
 
-        form.addAttribute( constants.ExpressionEditor() + ":",
-                           widgets( expression,
-                                    new InfoPopup(  constants.ExpressionEditor(),
-                                                    constants.ExpressionEditor() ) ) );
+        form.addAttribute(constants.ExpressionEditor() + ":",
+                widgets(expression,
+                new InfoPopup(constants.ExpressionEditor(),
+                constants.ExpressionEditor())));
 
 
         form.show();
@@ -323,16 +342,15 @@
     }
 
     private Panel widgets(Widget left,
-                          Widget right) {
+            Widget right) {
         HorizontalPanel panel = new HorizontalPanel();
-        panel.add( left );
-        panel.add( right );
-        panel.setWidth( "100%" );
+        panel.add(left);
+        panel.add(right);
+        panel.setWidth("100%");
         return panel;
     }
 
     public boolean isDirty() {
         return super.isDirty();
     }
-
 }

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/DSLSentenceWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/DSLSentenceWidget.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/DSLSentenceWidget.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -46,28 +46,44 @@
  * 
  * @author Michael Neale
  */
-public class DSLSentenceWidget extends Composite {
+public class DSLSentenceWidget extends RuleModellerWidget {
 
     private static final String        ENUM_TAG    = "ENUM";
     private static final String        DATE_TAG    = "DATE";
     private static final String        BOOLEAN_TAG = "BOOLEAN";
     private final List                 widgets;
     private final DSLSentence          sentence;
-    private SuggestionCompletionEngine completions;
     private final VerticalPanel        layout;
     private HorizontalPanel            currentRow;
+    private RuleModeller               modeller;
+    private boolean readOnly;
 
-    public DSLSentenceWidget(DSLSentence sentence,
-                             SuggestionCompletionEngine completions) {
+    public DSLSentenceWidget(RuleModeller modeller, DSLSentence sentence) {
+        this(modeller, sentence, null);
+    }
+
+    public DSLSentenceWidget(RuleModeller modeller, DSLSentence sentence, Boolean readOnly) {
         widgets = new ArrayList();
+        this.modeller = modeller;
         this.sentence = sentence;
-        this.completions = completions;
+
+        if (readOnly == null){
+            this.readOnly = false;
+        }else{
+            this.readOnly = readOnly;
+        }
+
         this.layout = new VerticalPanel();
         this.currentRow = new HorizontalPanel();
         this.layout.add( currentRow );
         this.layout.setCellWidth( currentRow,
                                   "100%" );
         this.layout.setWidth( "100%" );
+
+        if (this.readOnly) {
+            this.layout.addStyleName("editor-disabled-widget");
+        }
+
         init();
     }
 
@@ -336,7 +352,7 @@
     }
 
     class DSLDropDown extends DirtyableComposite {
-
+        final SuggestionCompletionEngine completions = modeller.getSuggestionCompletions();
         ListBox        resultWidget = null;
         // Format for the dropdown def is <varName>:<type>:<Fact.field>
         private String varName      = "";
@@ -495,4 +511,9 @@
             return DATE_TAG;
         }
     }
+
+    @Override
+    public boolean isReadOnly() {
+        return this.readOnly;
+    }
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ExpressionBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ExpressionBuilder.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/ExpressionBuilder.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -5,7 +5,6 @@
 import java.util.List;
 import java.util.Map;
 
-import org.drools.guvnor.client.common.DirtyableComposite;
 import org.drools.guvnor.client.messages.Constants;
 import org.drools.guvnor.client.modeldriven.MethodInfo;
 import org.drools.guvnor.client.modeldriven.SuggestionCompletionEngine;
@@ -23,305 +22,332 @@
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.user.client.ui.ChangeListener;
-import com.google.gwt.user.client.ui.FlowPanel;
+import com.google.gwt.user.client.ui.HorizontalPanel;
 import com.google.gwt.user.client.ui.ListBox;
 import com.google.gwt.user.client.ui.Widget;
 import com.gwtext.client.widgets.form.Label;
+import org.drools.guvnor.client.common.SmallLabel;
 
-public class ExpressionBuilder extends DirtyableComposite {
+public class ExpressionBuilder extends RuleModellerWidget {
 
-	private static final String DELETE_VALUE = "_delete_";
-	private static final String FIElD_VALUE_PREFIX = "fl";
-	private static final String VARIABLE_VALUE_PREFIX = "va";
-	private static final String GLOBAL_COLLECTION_VALUE_PREFIX = "gc";
-	private static final String GLOBAL_VARIABLE_VALUE_PREFIX = "gv";
-	private static final String METHOD_VALUE_PREFIX = "mt";
+    private static final String DELETE_VALUE = "_delete_";
+    private static final String FIElD_VALUE_PREFIX = "fl";
+    private static final String VARIABLE_VALUE_PREFIX = "va";
+    private static final String GLOBAL_COLLECTION_VALUE_PREFIX = "gc";
+    private static final String GLOBAL_VARIABLE_VALUE_PREFIX = "gv";
+    private static final String METHOD_VALUE_PREFIX = "mt";
+    private Constants constants = ((Constants) GWT.create(Constants.class));
+    //private FlowPanel panel = new FlowPanel();
+    private HorizontalPanel panel = new HorizontalPanel();
+    private RuleModeller modeller;
+    private ExpressionFormLine expression;
+    private boolean readOnly;
 
-	private Constants constants = ((Constants) GWT.create(Constants.class));
-	private FlowPanel panel = new FlowPanel();
+    public ExpressionBuilder(RuleModeller modeller,
+            ExpressionFormLine expression) {
+        this(modeller, expression, false);
+    }
 
-	private RuleModeller modeller;
-	private ExpressionFormLine expression;
+    public ExpressionBuilder(RuleModeller modeller,
+            ExpressionFormLine expression, Boolean readOnly) {
+        super();
 
-	public ExpressionBuilder(RuleModeller modeller,
-			ExpressionFormLine expression) {
-		super();
-		this.expression = expression;
-		this.modeller = modeller;
-		if (expression == null || expression.getText().length() == 0) {
-			panel.add(createStartPointWidget());
-		} else {
-			panel.add(new Label(expression.getText()));
-			panel.add(getWidgetForCurrentType());
-		}
-		initWidget(panel);
-	}
+        if (readOnly == null){
+            this.readOnly = !modeller.getSuggestionCompletions().containsFactType(modeller.getSuggestionCompletions().getFactNameFromType(this.expression.getRootExpression().getClassType()));
+        }else{
+            this.readOnly = readOnly;
+        }
 
-	private Widget createStartPointWidget() {
-		ListBox startPoint = new ListBox();
-		panel.add(startPoint);
+        this.expression = expression;
+        this.modeller = modeller;
+        if (expression == null || expression.getText().length() == 0) {
+            if (this.readOnly) {
+                panel.add(new SmallLabel("<b>-</b"));
+            } else {
+                panel.add(createStartPointWidget());
+            }
+        } else {
+            if (this.readOnly) {
+                panel.add(new SmallLabel("<b>" + expression.getText() + "</b"));
+            } else {
+                panel.add(new SmallLabel("<b>" + expression.getText() + ".</b"));
+                panel.add(getWidgetForCurrentType());
+            }
+        }
+        initWidget(panel);
+    }
 
-		startPoint.addItem(constants.ChooseDotDotDot(), "");
+    private Widget createStartPointWidget() {
+        ListBox startPoint = new ListBox();
+        panel.add(startPoint);
 
-		//TODO {baunax} uncomment when global collections is implemented.
+        startPoint.addItem(constants.ChooseDotDotDot(), "");
+
+        //TODO {baunax} uncomment when global collections is implemented.
 //		for (String gc : getCompletionEngine().getGlobalCollections()) {
 //			startPoint.addItem(gc, GLOBAL_COLLECTION_VALUE_PREFIX + "." + gc);
 //		}
 
-		for (String gv : getCompletionEngine().getGlobalVariables()) {
-			startPoint.addItem(gv, GLOBAL_VARIABLE_VALUE_PREFIX + "." + gv);
-		}
+        for (String gv : getCompletionEngine().getGlobalVariables()) {
+            startPoint.addItem(gv, GLOBAL_VARIABLE_VALUE_PREFIX + "." + gv);
+        }
 
-		for (String v : getRuleModel().getBoundFacts()) {
-			startPoint.addItem(v, VARIABLE_VALUE_PREFIX + "." + v);
-		}
+        for (String v : getRuleModel().getBoundFacts()) {
+            startPoint.addItem(v, VARIABLE_VALUE_PREFIX + "." + v);
+        }
 
-		startPoint.setVisibleItemCount(1);
-		startPoint.addChangeListener(new ChangeListener() {
-			public void onChange(Widget sender) {
-				ListBox lb = (ListBox) sender;
-				int index = lb.getSelectedIndex();
-				if (index > 0) {
-					ExpressionBuilder.this.makeDirty();
-					startPointChange(lb.getValue(index));
-				}
-			}
-		});
-		return startPoint;
-	}
+        startPoint.setVisibleItemCount(1);
+        startPoint.addChangeListener(new ChangeListener() {
 
-	private void startPointChange(String value) {
-		panel.clear();
-		Widget w;
-		int dotPos = value.indexOf('.');
-		String prefix = value.substring(0, dotPos);
-		String attrib = value.substring(dotPos + 1);
-		if (prefix.equals(VARIABLE_VALUE_PREFIX)) {
-			FactPattern fact = getRuleModel().getBoundFact(attrib);
-			ExpressionVariable variable = new ExpressionVariable(fact);
-			expression.appendPart(variable);
-			
-		} 
-		else if (prefix.equals(GLOBAL_VARIABLE_VALUE_PREFIX)) {
-			String globalVarType = getCompletionEngine().getGlobalVariable(attrib);
-			ExpressionGlobalVariable variable = new ExpressionGlobalVariable(attrib, globalVarType, globalVarType);
-			expression.appendPart(variable);
-		}
-		w = getWidgetForCurrentType();
+            public void onChange(Widget sender) {
+                ListBox lb = (ListBox) sender;
+                int index = lb.getSelectedIndex();
+                if (index > 0) {
+                    ExpressionBuilder.this.makeDirty();
+                    startPointChange(lb.getValue(index));
+                }
+            }
+        });
+        return startPoint;
+    }
 
-		if (!expression.isEmpty()) {
-			panel.add(new Label(expression.getText()));
-		}
-		if (w != null) {
-			panel.add(w);
-		}
-		// panel.add(getWidgetFor(startPoint.getValue(index)));
-		// ExpressionBuilder.this.expression.appendText(v);
-	}
+    private void startPointChange(String value) {
+        panel.clear();
+        Widget w;
+        int dotPos = value.indexOf('.');
+        String prefix = value.substring(0, dotPos);
+        String attrib = value.substring(dotPos + 1);
+        if (prefix.equals(VARIABLE_VALUE_PREFIX)) {
+            FactPattern fact = getRuleModel().getBoundFact(attrib);
+            ExpressionVariable variable = new ExpressionVariable(fact);
+            expression.appendPart(variable);
 
-	private Widget getWidgetForCurrentType() {
-		if (expression.isEmpty()) {
-			return createStartPointWidget();
-		}
-		String factName = getCompletionEngine().getFactNameFromType(
-				getCurrentClassType());
-		if (factName != null) {
-			ListBox lb = new ListBox();
-			lb.setVisibleItemCount(1);
-			lb.addItem(constants.ChooseDotDotDot(), "");
-			lb.addItem("<==" + constants.DeleteItem(), DELETE_VALUE);
-			for (Map.Entry<String, String> entry : getCompletionsForCurrentType()
-					.entrySet()) {
-				lb.addItem(entry.getKey(), entry.getValue());
-			}
+        } else if (prefix.equals(GLOBAL_VARIABLE_VALUE_PREFIX)) {
+            String globalVarType = getCompletionEngine().getGlobalVariable(attrib);
+            ExpressionGlobalVariable variable = new ExpressionGlobalVariable(attrib, globalVarType, globalVarType);
+            expression.appendPart(variable);
+        }
+        w = getWidgetForCurrentType();
 
-			lb.addChangeListener(new ChangeListener() {
-				public void onChange(Widget sender) {
-					ListBox box = (ListBox) sender;
-					panel.remove(box);
-					if (box.getSelectedIndex() > 0) {
-						onChangeSelection(box.getValue(box.getSelectedIndex()));
-					}
-				}
-			});
-			return lb;
-		} else {//if (SuggestionCompletionEngine.TYPE_COLLECTION.equals(getCurrentGenericType())) {
-			ListBox lb = new ListBox();
-			lb.setVisibleItemCount(1);
-			lb.addItem(constants.ChooseDotDotDot(), "");
-			lb.addItem("<==" + constants.DeleteItem(), DELETE_VALUE);
-			for (Map.Entry<String, String> entry : getCompletionsForCurrentType().entrySet()) {
-				lb.addItem(entry.getKey(), entry.getValue());
-			}
-			lb.addChangeListener(new ChangeListener() {
-				public void onChange(Widget sender) {
-					ListBox box = (ListBox) sender;
-					panel.remove(box);
-					if (box.getSelectedIndex() > 0) {
-						onChangeSelection(box.getValue(box.getSelectedIndex()));
-					}
-				}
-			});
-			return lb;
-		}
+        if (!expression.isEmpty()) {
+            panel.add(new Label(expression.getText()));
+        }
+        if (w != null) {
+            panel.add(w);
+        }
+
+        // panel.add(getWidgetFor(startPoint.getValue(index)));
+        // ExpressionBuilder.this.expression.appendText(v);
+    }
+
+    private Widget getWidgetForCurrentType() {
+        if (expression.isEmpty()) {
+            return createStartPointWidget();
+        }
+        String factName = getCompletionEngine().getFactNameFromType(
+                getCurrentClassType());
+        if (factName != null) {
+            ListBox lb = new ListBox();
+            lb.setVisibleItemCount(1);
+            lb.addItem(constants.ChooseDotDotDot(), "");
+            lb.addItem("<==" + constants.DeleteItem(), DELETE_VALUE);
+            for (Map.Entry<String, String> entry : getCompletionsForCurrentType().entrySet()) {
+                lb.addItem(entry.getKey(), entry.getValue());
+            }
+
+            lb.addChangeListener(new ChangeListener() {
+
+                public void onChange(Widget sender) {
+                    ListBox box = (ListBox) sender;
+                    panel.remove(box);
+                    if (box.getSelectedIndex() > 0) {
+                        onChangeSelection(box.getValue(box.getSelectedIndex()));
+                    }
+                }
+            });
+            return lb;
+        } else {//if (SuggestionCompletionEngine.TYPE_COLLECTION.equals(getCurrentGenericType())) {
+            ListBox lb = new ListBox();
+            lb.setVisibleItemCount(1);
+            lb.addItem(constants.ChooseDotDotDot(), "");
+            lb.addItem("<==" + constants.DeleteItem(), DELETE_VALUE);
+            for (Map.Entry<String, String> entry : getCompletionsForCurrentType().entrySet()) {
+                lb.addItem(entry.getKey(), entry.getValue());
+            }
+            lb.addChangeListener(new ChangeListener() {
+
+                public void onChange(Widget sender) {
+                    ListBox box = (ListBox) sender;
+                    panel.remove(box);
+                    if (box.getSelectedIndex() > 0) {
+                        onChangeSelection(box.getValue(box.getSelectedIndex()));
+                    }
+                }
+            });
+            return lb;
+        }
 //		return null;
-	}
+    }
 
-	private void onCollectionChange(String value) {
-		if ("size".contains(value)) {
-			expression.appendPart(new ExpressionMethod("size", "int", SuggestionCompletionEngine.TYPE_NUMERIC));
-		} else if ("isEmpty".equals(value)) {
-			expression.appendPart(new ExpressionMethod("isEmpty", "boolean", SuggestionCompletionEngine.TYPE_BOOLEAN));
-		} else {
-			ExpressionCollectionIndex collectionIndex;
-			String factName = getCompletionEngine().getFactNameFromType(getCurrentParametricType());
-			if (getCurrentParametricType() != null && factName != null) {
-				collectionIndex = new ExpressionCollectionIndex("get", getCurrentParametricType(), factName);
-			} else {
-				collectionIndex = new ExpressionCollectionIndex("get", "java.lang.Object", SuggestionCompletionEngine.TYPE_OBJECT);
-			}
-			if ("first".equals(value)) {
-				collectionIndex.putParam("index", new ExpressionFormLine(new ExpressionText("0")));
-				expression.appendPart(collectionIndex);
-			} else if ("last".equals(value)) {
-				ExpressionFormLine index = new ExpressionFormLine(expression);
-				index.appendPart(new ExpressionMethod("size", "int", SuggestionCompletionEngine.TYPE_NUMERIC));
-				index.appendPart(new ExpressionText("-1"));
-				
-				collectionIndex.putParam("index", index);
-				expression.appendPart(collectionIndex);
-			} 
-		}
-	}
-	
-	private void onChangeSelection(String value) {
-		String prevFactName = null;
-		if (DELETE_VALUE.equals(value)) {
-			expression.removeLast();
-		} else if (SuggestionCompletionEngine.TYPE_COLLECTION.equals(getCurrentGenericType())) {
-			onCollectionChange(value);
-		} else if (SuggestionCompletionEngine.TYPE_STRING.equals(getCurrentGenericType())) {
-			if ("size".equals(value)) {
-				expression.appendPart(new ExpressionMethod("size", "int", SuggestionCompletionEngine.TYPE_NUMERIC));
-			} else if ("isEmpty".equals(value)) {
-				expression.appendPart(new ExpressionText(".size() == 0", "", SuggestionCompletionEngine.TYPE_NUMERIC));
-			}
-		} else {
-			int dotPos = value.indexOf('.');
-			String prefix = value.substring(0, dotPos);
-			String attrib = value.substring(dotPos + 1);
+    private void onCollectionChange(String value) {
+        if ("size".contains(value)) {
+            expression.appendPart(new ExpressionMethod("size", "int", SuggestionCompletionEngine.TYPE_NUMERIC));
+        } else if ("isEmpty".equals(value)) {
+            expression.appendPart(new ExpressionMethod("isEmpty", "boolean", SuggestionCompletionEngine.TYPE_BOOLEAN));
+        } else {
+            ExpressionCollectionIndex collectionIndex;
+            String factName = getCompletionEngine().getFactNameFromType(getCurrentParametricType());
+            if (getCurrentParametricType() != null && factName != null) {
+                collectionIndex = new ExpressionCollectionIndex("get", getCurrentParametricType(), factName);
+            } else {
+                collectionIndex = new ExpressionCollectionIndex("get", "java.lang.Object", SuggestionCompletionEngine.TYPE_OBJECT);
+            }
+            if ("first".equals(value)) {
+                collectionIndex.putParam("index", new ExpressionFormLine(new ExpressionText("0")));
+                expression.appendPart(collectionIndex);
+            } else if ("last".equals(value)) {
+                ExpressionFormLine index = new ExpressionFormLine(expression);
+                index.appendPart(new ExpressionMethod("size", "int", SuggestionCompletionEngine.TYPE_NUMERIC));
+                index.appendPart(new ExpressionText("-1"));
 
-			prevFactName = getCompletionEngine().getFactNameFromType(
-					getCurrentClassType());
+                collectionIndex.putParam("index", index);
+                expression.appendPart(collectionIndex);
+            }
+        }
+    }
+
+    private void onChangeSelection(String value) {
+        String prevFactName = null;
+        if (DELETE_VALUE.equals(value)) {
+            expression.removeLast();
+        } else if (SuggestionCompletionEngine.TYPE_COLLECTION.equals(getCurrentGenericType())) {
+            onCollectionChange(value);
+        } else if (SuggestionCompletionEngine.TYPE_STRING.equals(getCurrentGenericType())) {
+            if ("size".equals(value)) {
+                expression.appendPart(new ExpressionMethod("size", "int", SuggestionCompletionEngine.TYPE_NUMERIC));
+            } else if ("isEmpty".equals(value)) {
+                expression.appendPart(new ExpressionText(".size() == 0", "", SuggestionCompletionEngine.TYPE_NUMERIC));
+            }
+        } else {
+            int dotPos = value.indexOf('.');
+            String prefix = value.substring(0, dotPos);
+            String attrib = value.substring(dotPos + 1);
+
+            prevFactName = getCompletionEngine().getFactNameFromType(
+                    getCurrentClassType());
 //			String genericType = SuggestionCompletionEngine.TYPE_OBJECT;
-			if (FIElD_VALUE_PREFIX.equals(prefix)) {
-				String fieldClassName = getCompletionEngine().getFieldClassName(prevFactName, attrib);
-				String fieldGenericType = getCompletionEngine().getFieldType(prevFactName, attrib);
-				if (SuggestionCompletionEngine.TYPE_COLLECTION.equals(fieldGenericType)) {
-					String fieldParametricType = getCompletionEngine().getParametricFieldType(prevFactName, attrib);
-					expression.appendPart(new ExpressionCollection(attrib, fieldClassName, fieldGenericType, fieldParametricType));
-				} else {
-					expression.appendPart(new ExpressionField(attrib, fieldClassName, fieldGenericType));
-				}
-			} else if (METHOD_VALUE_PREFIX.equals(prefix)) {
-				MethodInfo mi = getCompletionEngine().getMethodinfo(prevFactName, attrib);
-				if (SuggestionCompletionEngine.TYPE_COLLECTION.equals(mi.getGenericType())) {
-					expression.appendPart(new ExpressionCollection(attrib, mi.getReturnClassType(), mi.getGenericType(), mi.getParametricReturnType()));
-				} else {
-					expression.appendPart( new ExpressionMethod(mi.getName(), mi.getReturnClassType(), mi.getGenericType()));
-				}
-			}
-		}
-		Widget w = getWidgetForCurrentType();
+            if (FIElD_VALUE_PREFIX.equals(prefix)) {
+                String fieldClassName = getCompletionEngine().getFieldClassName(prevFactName, attrib);
+                String fieldGenericType = getCompletionEngine().getFieldType(prevFactName, attrib);
+                if (SuggestionCompletionEngine.TYPE_COLLECTION.equals(fieldGenericType)) {
+                    String fieldParametricType = getCompletionEngine().getParametricFieldType(prevFactName, attrib);
+                    expression.appendPart(new ExpressionCollection(attrib, fieldClassName, fieldGenericType, fieldParametricType));
+                } else {
+                    expression.appendPart(new ExpressionField(attrib, fieldClassName, fieldGenericType));
+                }
+            } else if (METHOD_VALUE_PREFIX.equals(prefix)) {
+                MethodInfo mi = getCompletionEngine().getMethodinfo(prevFactName, attrib);
+                if (SuggestionCompletionEngine.TYPE_COLLECTION.equals(mi.getGenericType())) {
+                    expression.appendPart(new ExpressionCollection(attrib, mi.getReturnClassType(), mi.getGenericType(), mi.getParametricReturnType()));
+                } else {
+                    expression.appendPart(new ExpressionMethod(mi.getName(), mi.getReturnClassType(), mi.getGenericType()));
+                }
+            }
+        }
+        Widget w = getWidgetForCurrentType();
 
-		panel.clear();
-		if (!expression.isEmpty()) {
-			panel.add(new Label(expression.getText()));
-		}
-		if (w != null) {
-			panel.add(w);
-		}
-	}
+        panel.clear();
+        if (!expression.isEmpty()) {
+            panel.add(new Label(expression.getText()));
+        }
+        if (w != null) {
+            panel.add(w);
+        }
+    }
 
-	private Map<String, String> getCompletionsForCurrentType() {
-		Map<String, String> completions = new LinkedHashMap<String, String>();
-		
-		if (SuggestionCompletionEngine.TYPE_COLLECTION.equals(getCurrentGenericType())) {
-			completions.put("size()", "size");
-			completions.put("first()","first");
-			completions.put("last()", "last");
-			completions.put("isEmpty()", "isEmpty");
-			return completions;
-		}
-		
-		if (SuggestionCompletionEngine.TYPE_STRING.equals(getCurrentGenericType())) {
-			completions.put("size()", "size");
-			completions.put("isEmpty()", "isEmpty");
-			return completions;
-		}
-		
-		if (SuggestionCompletionEngine.TYPE_BOOLEAN.equals(getCurrentGenericType()) || 
-				SuggestionCompletionEngine.TYPE_NUMERIC.equals(getCurrentGenericType()) ||
-				SuggestionCompletionEngine.TYPE_DATE.equals(getCurrentGenericType()) ||
-				SuggestionCompletionEngine.TYPE_OBJECT.equals(getCurrentGenericType())) {
-			return completions;
-		}
-		
-		String factName = getCompletionEngine().getFactNameFromType(getCurrentClassType());
-		if (factName != null) {
-			//we currently only support 0 param method calls
-			List<String> methodNames = getCompletionEngine()
-					.getMethodFullNames(factName, 0);
+    private Map<String, String> getCompletionsForCurrentType() {
+        Map<String, String> completions = new LinkedHashMap<String, String>();
 
-			for (String field : getCompletionEngine().getFieldCompletions(
-					factName)) {
-				boolean changed = false;
-				for (Iterator<String> i = methodNames.iterator(); i.hasNext();) {
-					String method = i.next();
-					if (method.startsWith(field)) {
-						completions.put(method, METHOD_VALUE_PREFIX + "." + method);
-						i.remove();
-						changed = true;
-					}
-				}
-				if (!changed) {
-					completions.put(field, FIElD_VALUE_PREFIX + "." + field);
-				}
-			}
-		} 
-		//else {We don't know anything about this type, so return empty map}
-		return completions;
-	}
+        if (SuggestionCompletionEngine.TYPE_COLLECTION.equals(getCurrentGenericType())) {
+            completions.put("size()", "size");
+            completions.put("first()", "first");
+            completions.put("last()", "last");
+            completions.put("isEmpty()", "isEmpty");
+            return completions;
+        }
 
-	private String getCurrentPartName() {
-		return expression.getCurrentName();
-	}
+        if (SuggestionCompletionEngine.TYPE_STRING.equals(getCurrentGenericType())) {
+            completions.put("size()", "size");
+            completions.put("isEmpty()", "isEmpty");
+            return completions;
+        }
 
-	private RuleModel getRuleModel() {
-		return modeller.getModel();
-	}
+        if (SuggestionCompletionEngine.TYPE_BOOLEAN.equals(getCurrentGenericType())
+                || SuggestionCompletionEngine.TYPE_NUMERIC.equals(getCurrentGenericType())
+                || SuggestionCompletionEngine.TYPE_DATE.equals(getCurrentGenericType())
+                || SuggestionCompletionEngine.TYPE_OBJECT.equals(getCurrentGenericType())) {
+            return completions;
+        }
 
-	private SuggestionCompletionEngine getCompletionEngine() {
-		return modeller.getSuggestionCompletions();
-	}
+        String factName = getCompletionEngine().getFactNameFromType(getCurrentClassType());
+        if (factName != null) {
+            //we currently only support 0 param method calls
+            List<String> methodNames = getCompletionEngine().getMethodFullNames(factName, 0);
 
-	private String getCurrentClassType() {
-		return expression.getClassType();
-	}
-	
-	private String getCurrentGenericType() {
-		return expression.getGenericType();
-	}
-	
-	private String getCurrentParametricType() {
-		return expression.getParametricType();
-	}
-	
-	private String getPreviousClassType() {
-		return expression.getPreviousType();
-	}
-	
-	private ExpressionPart getRootExpression() {
-		return expression.getRootExpression();
-	}
+            for (String field : getCompletionEngine().getFieldCompletions(
+                    factName)) {
+                boolean changed = false;
+                for (Iterator<String> i = methodNames.iterator(); i.hasNext();) {
+                    String method = i.next();
+                    if (method.startsWith(field)) {
+                        completions.put(method, METHOD_VALUE_PREFIX + "." + method);
+                        i.remove();
+                        changed = true;
+                    }
+                }
+                if (!changed) {
+                    completions.put(field, FIElD_VALUE_PREFIX + "." + field);
+                }
+            }
+        }
+        //else {We don't know anything about this type, so return empty map}
+        return completions;
+    }
+
+    private String getCurrentPartName() {
+        return expression.getCurrentName();
+    }
+
+    private RuleModel getRuleModel() {
+        return modeller.getModel();
+    }
+
+    private SuggestionCompletionEngine getCompletionEngine() {
+        return modeller.getSuggestionCompletions();
+    }
+
+    private String getCurrentClassType() {
+        return expression.getClassType();
+    }
+
+    private String getCurrentGenericType() {
+        return expression.getGenericType();
+    }
+
+    private String getCurrentParametricType() {
+        return expression.getParametricType();
+    }
+
+    private String getPreviousClassType() {
+        return expression.getPreviousType();
+    }
+
+    private ExpressionPart getRootExpression() {
+        return expression.getRootExpression();
+    }
+    
+    @Override
+    public boolean isReadOnly() {
+        return this.readOnly;
+    }
 }

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-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FactPatternWidget.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -15,13 +15,10 @@
  * limitations under the License.
  */
 
-
-
 import java.util.ArrayList;
 import java.util.List;
 
 import org.drools.guvnor.client.common.ClickableLabel;
-import org.drools.guvnor.client.common.DirtyableComposite;
 import org.drools.guvnor.client.common.DirtyableFlexTable;
 import org.drools.guvnor.client.common.ImageButton;
 import org.drools.guvnor.client.common.SmallLabel;
@@ -48,26 +45,47 @@
  * @author Michael Neale
  *
  */
-public class FactPatternWidget extends DirtyableComposite {
+public class FactPatternWidget extends RuleModellerWidget {
 
-    private FactPattern                pattern;
+    private FactPattern pattern;
     private SuggestionCompletionEngine completions;
-    private RuleModeller               modeller;
-    private DirtyableFlexTable         layout = new DirtyableFlexTable();
-    private Connectives                connectives;
-    private PopupCreator               popupCreator;
-    private boolean                    bindable;
+    private RuleModeller modeller;
+    private DirtyableFlexTable layout = new DirtyableFlexTable();
+    private Connectives connectives;
+    private PopupCreator popupCreator;
+    private boolean bindable;
     private Constants constants = ((Constants) GWT.create(Constants.class));
-
     private String customLabel;
+    private boolean readOnly;
 
     public FactPatternWidget(RuleModeller mod, IPattern p,
             boolean canBind) {
-        this(mod, p, null, canBind);
+        this(mod, p, null, canBind,null);
     }
 
     public FactPatternWidget(RuleModeller mod, IPattern p,
+            boolean canBind, Boolean readOnly) {
+        this(mod, p, null, canBind, readOnly);
+    }
+
+     public FactPatternWidget(RuleModeller mod, IPattern p,
             String customLabel, boolean canBind) {
+         this(mod, p, null, canBind, null);
+     }
+
+    
+
+    /**
+     * Creates a new FactPatternWidget
+     * @param mod
+     * @param p
+     * @param customLabel
+     * @param canBind
+     * @param readOnly if the widget should be in RO mode. If this parameter
+     * is null, the readOnly attribute is calculated.
+     */
+    public FactPatternWidget(RuleModeller mod, IPattern p,
+            String customLabel, boolean canBind, Boolean readOnly) {
         this.pattern = (FactPattern) p;
         this.completions = mod.getSuggestionCompletions();
         this.modeller = mod;
@@ -86,19 +104,33 @@
 
         this.customLabel = customLabel;
 
-        layout.setWidget( 0, 0, getPatternLabel() );
+        //if readOnly == null, the RO attribute is calculated.
+        if (readOnly == null){
+            this.readOnly = !completions.containsFactType(this.pattern.factType);
+        }else{
+            this.readOnly = readOnly;
+        }
+
+        layout.setWidget(0, 0, getPatternLabel());
         FlexCellFormatter formatter = layout.getFlexCellFormatter();
-        formatter.setAlignment( 0, 0, HasHorizontalAlignment.ALIGN_LEFT, HasVerticalAlignment.ALIGN_BOTTOM );
-        formatter.setStyleName( 0, 0, "modeller-fact-TypeHeader" );
+        formatter.setAlignment(0, 0, HasHorizontalAlignment.ALIGN_LEFT, HasVerticalAlignment.ALIGN_BOTTOM);
+        formatter.setStyleName(0, 0, "modeller-fact-TypeHeader");
 
         ArrayList sortedConst = sortConstraints(pattern.getFieldConstraints());
         pattern.setFieldConstraints(sortedConst);
         drawConstraints(sortedConst);
 
+        
 
-        if ( bindable ) layout.setStyleName( "modeller-fact-pattern-Widget" );
-        initWidget( layout );
+        if (this.readOnly){
+            layout.addStyleName("editor-disabled-widget");
+        }
 
+        if (bindable) {
+            layout.addStyleName("modeller-fact-pattern-Widget");
+        }
+        initWidget(layout);
+
     }
 
     /**
@@ -112,7 +144,7 @@
      * */
     private void drawConstraints(ArrayList sortedConst) {
         final DirtyableFlexTable table = new DirtyableFlexTable();
-        layout.setWidget( 1, 0, table );
+        layout.setWidget(1, 0, table);
         List parents = new ArrayList();
 
         for (int i = 0; i < sortedConst.size(); i++) {
@@ -126,7 +158,7 @@
                     FieldConstraint storedParent = (FieldConstraint) parents.get(j);
                     if (storedParent != null && storedParent.equals(parent)) {
                         tabs = j + 1;
-                        for(int k = j + 1; k < parents.size(); k++) {
+                        for (int k = j + 1; k < parents.size(); k++) {
                             parents.remove(j + 1);
                         }
                         parents.add(current);
@@ -143,19 +175,20 @@
 
             //now the clear icon
             final int currentRow = i;
-            Image clear = new ImageButton( "images/delete_faded.gif" );//NON-NLS
+            Image clear = new ImageButton("images/delete_faded.gif");//NON-NLS
             clear.setTitle(constants.RemoveThisWholeRestriction());
-            clear.addClickListener( new ClickListener() {
+            clear.addClickListener(new ClickListener() {
+
                 public void onClick(Widget w) {
                     if (Window.confirm(constants.RemoveThisItem())) {
-                        pattern.removeConstraint( currentRow );
+                        pattern.removeConstraint(currentRow);
                         modeller.refreshWidget();
                     }
                 }
-            } );
+            });
 
-            if (!this.modeller.lockLHS()) {
-                table.setWidget( currentRow, 5, clear );
+            if (!this.readOnly) {
+                table.setWidget(currentRow, 5, clear);
             }
 
         }
@@ -176,7 +209,7 @@
                 int index = sortedConst.indexOf(single.parent);
                 if (single.parent == null) {
                     sortedConst.add(single);
-                } else if (index >= 0){
+                } else if (index >= 0) {
                     sortedConst.add(index + 1, single);
                 } else {
                     insertSingleFieldConstraint(single, sortedConst);
@@ -207,10 +240,10 @@
     private void renderFieldConstraint(final DirtyableFlexTable inner, int row, FieldConstraint constraint, boolean showBinding, int tabs) {
         //if nesting, or predicate, then it will need to span 5 cols.
         if (constraint instanceof SingleFieldConstraint) {
-            renderSingleFieldConstraint( modeller, inner, row, (SingleFieldConstraint) constraint, showBinding, tabs );
+            renderSingleFieldConstraint(modeller, inner, row, (SingleFieldConstraint) constraint, showBinding, tabs);
         } else if (constraint instanceof CompositeFieldConstraint) {
-            inner.setWidget( row, 1, compositeFieldConstraintEditor((CompositeFieldConstraint) constraint) );
-            inner.getFlexCellFormatter().setColSpan( row, 1, 5 );
+            inner.setWidget(row, 1, compositeFieldConstraintEditor((CompositeFieldConstraint) constraint));
+            inner.getFlexCellFormatter().setColSpan(row, 1, 5);
             inner.setWidget(row, 0, new HTML("&nbsp;&nbsp;&nbsp;&nbsp;")); //NON-NLS
         }
     }
@@ -224,10 +257,10 @@
 
 
         ClickListener click = new ClickListener() {
+
             public void onClick(Widget w) {
-                popupCreator.showPatternPopupForComposite( w, constraint );
+                popupCreator.showPatternPopupForComposite(w, constraint);
             }
-
         };
 
         if (constraint.compositeJunctionType.equals(CompositeFieldConstraint.COMPOSITE_TYPE_AND)) {
@@ -236,30 +269,33 @@
             desc = constants.AnyOf() + ":";
         }
 
-        t.setWidget(0, 0, new ClickableLabel(desc, click, !modeller.lockLHS()));
+        t.setWidget(0, 0, new ClickableLabel(desc, click, !this.readOnly));
         t.getFlexCellFormatter().setColSpan(0, 0, 2);
         //t.getFlexCellFormatter().setWidth(0, 0, "15%");
 
         FieldConstraint[] nested = constraint.constraints;
         DirtyableFlexTable inner = new DirtyableFlexTable();
-        inner.setStyleName( "modeller-inner-nested-Constraints" ); //NON-NLS
+        inner.setStyleName("modeller-inner-nested-Constraints"); //NON-NLS
         if (nested != null) {
-            for ( int i = 0; i < nested.length; i++ ) {
-                this.renderFieldConstraint( inner, i, nested[i], false, 0 );
+            for (int i = 0; i < nested.length; i++) {
+                this.renderFieldConstraint(inner, i, nested[i], false, 0);
                 //add in remove icon here...
                 final int currentRow = i;
-                Image clear = new ImageButton( "images/delete_faded.gif" ); //NON-NLS
+                Image clear = new ImageButton("images/delete_faded.gif"); //NON-NLS
                 clear.setTitle(constants.RemoveThisNestedRestriction());
 
-                clear.addClickListener( new ClickListener() {
+                clear.addClickListener(new ClickListener() {
+
                     public void onClick(Widget w) {
                         if (Window.confirm(constants.RemoveThisItemFromNestedConstraint())) {
-                            constraint.removeConstraint( currentRow );
+                            constraint.removeConstraint(currentRow);
                             modeller.refreshWidget();
                         }
                     }
-                } );
-                if (!modeller.lockLHS()) inner.setWidget( i, 5, clear );
+                });
+                if (!this.readOnly) {
+                    inner.setWidget(i, 5, clear);
+                }
             }
         }
 
@@ -268,8 +304,6 @@
         return t;
     }
 
-
-
     /**
      * Applies a single field constraint to the given table, and start row.
      */
@@ -283,25 +317,28 @@
         inner.setWidget(row, 0, new HTML("&nbsp;&nbsp;&nbsp;&nbsp;"));
         //inner.getFlexCellFormatter().setWidth(row, 0, "15%");
         //DOCNHERON
-        if ( constraint.constraintValueType != SingleFieldConstraint.TYPE_PREDICATE ) {
+        if (constraint.constraintValueType != SingleFieldConstraint.TYPE_PREDICATE) {
 
-            inner.setWidget( row, 0 + col, fieldLabel(constraint, showBinding, tabs * 20));
-            inner.setWidget( row, 1+ col, operatorDropDown( constraint ) );
-            inner.setWidget( row, 2+ col, valueEditor( constraint, constraint.fieldType ) );
-            inner.setWidget( row, 3+ col, connectives.connectives( constraint, constraint.fieldType ) );
-            Image addConnective = new ImageButton( "images/add_connective.gif" ); //NON-NLS
+            inner.setWidget(row, 0 + col, fieldLabel(constraint, showBinding, tabs * 20));
+            inner.setWidget(row, 1 + col, operatorDropDown(constraint));
+            inner.setWidget(row, 2 + col, valueEditor(constraint, constraint.fieldType));
+            inner.setWidget(row, 3 + col, connectives.connectives(constraint, constraint.fieldType));
+            Image addConnective = new ImageButton("images/add_connective.gif"); //NON-NLS
             addConnective.setTitle(constants.AddMoreOptionsToThisFieldsValues());
-            addConnective.addClickListener( new ClickListener() {
+            addConnective.addClickListener(new ClickListener() {
+
                 public void onClick(Widget w) {
                     constraint.addNewConnective();
                     modeller.refreshWidget();
                 }
-            } );
+            });
 
-            if (!modeller.lockLHS()) inner.setWidget( row, 4+ col, addConnective );
+            if (!this.readOnly) {
+                inner.setWidget(row, 4 + col, addConnective);
+            }
         } else if (constraint.constraintValueType == SingleFieldConstraint.TYPE_PREDICATE) {
-            inner.setWidget( row, 0+ col, predicateEditor(constraint) );
-            inner.getFlexCellFormatter().setColSpan( row, 0, 5 );
+            inner.setWidget(row, 0 + col, predicateEditor(constraint));
+            inner.getFlexCellFormatter().setColSpan(row, 0, 5);
         }
     }
 
@@ -311,54 +348,64 @@
     private Widget predicateEditor(final SingleFieldConstraint c) {
 
         HorizontalPanel pred = new HorizontalPanel();
-        pred.setWidth( "100%" );
+        pred.setWidth("100%");
         Image img = new Image("images/function_assets.gif"); //NON-NLS
         img.setTitle(constants.FormulaBooleanTip());
 
-        pred.add( img );
+        pred.add(img);
         if (c.value == null) {
-        	c.value = "";
+            c.value = "";
         }
+
         final TextBox box = new TextBox();
-        box.setText( c.value );
-        box.addChangeListener( new ChangeListener() {
-            public void onChange(Widget w) {
-                c.value = box.getText();
-                modeller.makeDirty();
-            }
-        });
+        box.setText(c.value);
 
-        box.setWidth( "100%" );
-        pred.add( box );
+        if (!this.readOnly) {
+            box.addChangeListener(new ChangeListener() {
+
+                public void onChange(Widget w) {
+                    c.value = box.getText();
+                    modeller.makeDirty();
+                }
+            });
+            box.setWidth("100%");
+            pred.add(box);
+        } else {
+            pred.add(new SmallLabel(c.value));
+        }
+
+
+
+
         return pred;
     }
 
-
     /**
      * This returns the pattern label.
      */
     private Widget getPatternLabel() {
         ClickListener click = new ClickListener() {
+
             public void onClick(Widget w) {
-                popupCreator.showPatternPopup( w, pattern.factType, null );
+                popupCreator.showPatternPopup(w, pattern.factType, null);
             }
         };
 
-        String patternName = (pattern.boundName != null) ? pattern.factType  + " <b>[" + pattern.boundName + "]</b>" : pattern.factType;
+        String patternName = (pattern.boundName != null) ? pattern.factType + " <b>[" + pattern.boundName + "]</b>" : pattern.factType;
 
         String desc = this.getCustomLabel();
-        if (desc == null){
+        if (desc == null) {
             if (pattern.constraintList != null && pattern.constraintList.constraints.length > 0) {
                 desc = Format.format(constants.ThereIsAAn0With(), patternName);
             } else {
                 desc = Format.format(constants.ThereIsAAn0(), patternName);
             }
             desc = anA(desc, patternName);
-        }else{
+        } else {
             desc = Format.format(desc, patternName);
         }
 
-        return  new ClickableLabel( desc , click, !modeller.lockLHS()) ;
+        return new ClickableLabel(desc, click, !this.readOnly);
     }
 
     /** Change to an/a depending on context - only for english */
@@ -377,31 +424,40 @@
 
     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.modeller,  c.fieldType);
+        return new ConstraintValueEditor(pattern, c.fieldName, c, this.modeller, c.fieldType,this.readOnly);
     }
 
     private Widget operatorDropDown(final SingleFieldConstraint c) {
-        String[] ops = completions.getOperatorCompletions( pattern.factType, c.fieldName );
-        final ListBox box = new ListBox();
-        box.addItem(constants.pleaseChoose(), "" );
-        for ( int i = 0; i < ops.length; i++ ) {
-            String op = ops[i];
-            box.addItem( HumanReadable.getOperatorDisplayName( op ), op );
-            if ( op.equals( c.operator ) ) {
-                box.setSelectedIndex( i + 1 );
+        if (!this.readOnly) {
+            String[] ops = completions.getOperatorCompletions(pattern.factType, c.fieldName);
+            final ListBox box = new ListBox();
+            box.addItem(constants.pleaseChoose(), "");
+            for (int i = 0; i < ops.length; i++) {
+                String op = ops[i];
+                box.addItem(HumanReadable.getOperatorDisplayName(op), op);
+                if (op.equals(c.operator)) {
+                    box.setSelectedIndex(i + 1);
+                }
+
             }
 
+            box.addChangeListener(new ChangeListener() {
+
+                public void onChange(Widget w) {
+                    c.operator = box.getValue(box.getSelectedIndex());
+                    if (c.operator.equals("")) {
+                        c.operator = null;
+                    }
+                    modeller.makeDirty();
+                }
+            });
+
+            return box;
+        } else {
+            SmallLabel sl = new SmallLabel("<b>"+(c.operator==null?constants.pleaseChoose():HumanReadable.getOperatorDisplayName(c.operator))+"</b>");
+            return sl;
         }
 
-        box.addChangeListener( new ChangeListener() {
-            public void onChange(Widget w) {
-                c.operator = box.getValue( box.getSelectedIndex() );
-                if (c.operator.equals("")) c.operator = null;
-                modeller.makeDirty();
-            }
-        } );
-
-        return box;
     }
 
     /**
@@ -411,32 +467,33 @@
      */
     private Widget fieldLabel(final SingleFieldConstraint con, boolean showBinding, int padding) {//, final Command onChange) {
         HorizontalPanel ab = new HorizontalPanel();
-        ab.setStyleName( "modeller-field-Label" );
+        ab.setStyleName("modeller-field-Label");
 
         if (!con.isBound()) {
-            if (bindable && showBinding) {
+            if (bindable && showBinding && !this.readOnly) {
 
-            	ClickListener click = new ClickListener() {
+                ClickListener click = new ClickListener() {
+
                     public void onClick(Widget w) {
-                        String[] fields = completions.getFieldCompletions( con.fieldType );
+                        String[] fields = completions.getFieldCompletions(con.fieldType);
                         popupCreator.showBindFieldPopup(w, con, fields, popupCreator);
                     }
                 };
 
-                Image bind = new ImageButton( "images/edit_tiny.gif", constants.GiveFieldVarName()); //NON-NLS
+                Image bind = new ImageButton("images/edit_tiny.gif", constants.GiveFieldVarName()); //NON-NLS
 
-                bind.addClickListener( click);
-                ClickableLabel cl = new ClickableLabel(con.fieldName, click, !modeller.lockLHS());
+                bind.addClickListener(click);
+                ClickableLabel cl = new ClickableLabel(con.fieldName, click, !this.readOnly);
                 DOM.setStyleAttribute(cl.getElement(), "marginLeft", "" + padding + "pt"); //NON-NLS
-                ab.add( cl );
+                ab.add(cl);
                 //ab.add( bind );
             } else {
                 ab.add(new SmallLabel(con.fieldName));
             }
-            
+
         } else {
-        	ab.add(new SmallLabel(con.fieldName));
-            ab.add( new SmallLabel(" <b>[" + con.fieldBinding + "]</b>") );       //NON-NLS
+            ab.add(new SmallLabel(con.fieldName));
+            ab.add(new SmallLabel(" <b>[" + con.fieldBinding + "]</b>"));       //NON-NLS
         }
 
 
@@ -451,12 +508,13 @@
         this.customLabel = customLabel;
     }
 
-
-    
-
     public boolean isDirty() {
         return layout.hasDirty();
     }
 
+    @Override
+    public boolean isReadOnly() {
+        return this.readOnly;
+    }
 
-}
\ No newline at end of file
+}

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FreeFormLineWidget.java (from rev 32184, labs/jbossrules/branches/factsConstraints_baunax_esteban/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FreeFormLineWidget.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FreeFormLineWidget.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FreeFormLineWidget.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,99 @@
+package org.drools.guvnor.client.modeldriven.ui;
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+import org.drools.guvnor.client.common.DirtyableFlexTable;
+import org.drools.guvnor.client.messages.Constants;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.ui.*;
+import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
+import org.drools.guvnor.client.modeldriven.brl.FreeFormLine;
+
+/**
+ * Free form DRL line widget
+ * @author esteban.aliverti at gmail.com
+ *
+ */
+public class FreeFormLineWidget extends RuleModellerWidget {
+
+    private FreeFormLine action;
+    private DirtyableFlexTable layout = new DirtyableFlexTable();
+    private Constants constants = ((Constants) GWT.create(Constants.class));
+    private boolean readOnly;
+
+    public FreeFormLineWidget(RuleModeller mod, FreeFormLine p) {
+        this(mod, p, null);
+    }
+
+    /**
+     * Creates a new FactPatternWidget
+     * @param mod
+     * @param p
+     * @param readOnly if the widget should be in RO mode. If this parameter
+     * is null, the readOnly attribute is calculated.
+     */
+    public FreeFormLineWidget(RuleModeller mod, FreeFormLine p,
+            Boolean readOnly) {
+        this.action = p;
+
+        if (readOnly == null){
+            this.readOnly = false;
+        }else{
+            this.readOnly = readOnly;
+        }
+
+        layout.setWidget(0, 0, createTextBox());
+        FlexCellFormatter formatter = layout.getFlexCellFormatter();
+        formatter.setAlignment(0, 0, HasHorizontalAlignment.ALIGN_LEFT, HasVerticalAlignment.ALIGN_BOTTOM);
+
+        if (this.readOnly) {
+            this.layout.addStyleName("editor-disabled-widget");
+        }
+
+        initWidget(layout);
+
+    }
+
+    private Widget createTextBox() {
+        final TextBox tb = new TextBox();
+        tb.setText(this.action.text);
+        tb.setTitle(constants.ThisIsADrlExpressionFreeForm());
+
+        if (!this.readOnly){
+        tb.addChangeListener(new ChangeListener() {
+
+            public void onChange(Widget arg0) {
+                action.text = tb.getText();
+            }
+        });
+        } else{
+            tb.setEnabled(false);
+        }
+        return tb;
+    }
+
+    @Override
+    public boolean isDirty() {
+        return layout.hasDirty();
+    }
+
+    @Override
+    public boolean isReadOnly() {
+        return this.readOnly;
+    }
+}

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FromAccumulateCompositeFactPatternWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FromAccumulateCompositeFactPatternWidget.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FromAccumulateCompositeFactPatternWidget.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -14,6 +14,7 @@
 import org.drools.guvnor.client.common.DirtyableFlexTable;
 import org.drools.guvnor.client.common.FormStylePopup;
 import org.drools.guvnor.client.modeldriven.HumanReadable;
+import org.drools.guvnor.client.modeldriven.SuggestionCompletionEngine;
 import org.drools.guvnor.client.modeldriven.brl.FactPattern;
 import org.drools.guvnor.client.modeldriven.brl.FromAccumulateCompositeFactPattern;
 import org.drools.guvnor.client.modeldriven.brl.FromCollectCompositeFactPattern;
@@ -27,6 +28,11 @@
 public class FromAccumulateCompositeFactPatternWidget extends FromCompositeFactPatternWidget {
 
     public FromAccumulateCompositeFactPatternWidget(RuleModeller modeller,
+            FromAccumulateCompositeFactPattern pattern, Boolean readOnly) {
+        super(modeller, pattern, readOnly);
+    }
+
+    public FromAccumulateCompositeFactPatternWidget(RuleModeller modeller,
             FromAccumulateCompositeFactPattern pattern) {
         super(modeller, pattern);
     }
@@ -57,26 +63,26 @@
         int r = 0;
 
         if (pattern.getFactPattern() == null) {
-            panel.setWidget(r++, 0, new ClickableLabel("<br> <font color='red'>" + constants.clickToAddPattern() + "</font>", leftPatternclick, !this.modeller.lockLHS()));
+            panel.setWidget(r++, 0, new ClickableLabel("<br> <font color='red'>" + constants.clickToAddPattern() + "</font>", leftPatternclick, !this.readOnly));
         }
 
 
         panel.setWidget(r++, 0, new HTML(lbl));
 
         if (this.getFromAccumulatePattern().getSourcePattern() == null) {
-            panel.setWidget(r++, 0, new ClickableLabel("<br> <font color='red'>" + constants.clickToAddPattern() + "</font>", sourcePatternClick, !this.modeller.lockLHS()));
+            panel.setWidget(r++, 0, new ClickableLabel("<br> <font color='red'>" + constants.clickToAddPattern() + "</font>", sourcePatternClick, !this.readOnly));
         } else {
             IPattern rPattern = this.getFromAccumulatePattern().getSourcePattern();
 
             Widget patternWidget = null;
             if (rPattern instanceof FactPattern) {
-                patternWidget = new FactPatternWidget(modeller, rPattern, constants.All0with(), true);
+                patternWidget = new FactPatternWidget(modeller, rPattern, constants.All0with(), true,this.readOnly);
             } else if (rPattern instanceof FromAccumulateCompositeFactPattern) {
-                patternWidget = new FromAccumulateCompositeFactPatternWidget(modeller, (FromAccumulateCompositeFactPattern) rPattern);
+                patternWidget = new FromAccumulateCompositeFactPatternWidget(modeller, (FromAccumulateCompositeFactPattern) rPattern,this.readOnly);
             } else if (rPattern instanceof FromCollectCompositeFactPattern) {
-                patternWidget = new FromCollectCompositeFactPatternWidget(modeller, (FromCollectCompositeFactPattern) rPattern);
+                patternWidget = new FromCollectCompositeFactPatternWidget(modeller, (FromCollectCompositeFactPattern) rPattern,this.readOnly);
             } else if (rPattern instanceof FromCompositeFactPattern) {
-                patternWidget = new FromCompositeFactPatternWidget(modeller, (FromCompositeFactPattern) rPattern);
+                patternWidget = new FromCompositeFactPatternWidget(modeller, (FromCompositeFactPattern) rPattern,this.readOnly);
             } else {
                 throw new IllegalArgumentException("Unsuported pattern " + rPattern + " for right side of FROM ACCUMULATE");
             }
@@ -132,6 +138,7 @@
         codePanel.setTitle("Custom Code");
         codePanel.setAutoHeight(true);
         codePanel.add(codeTable);
+        codePanel.setDisabled(this.readOnly);
         tPanel.add(codePanel);
 
         DirtyableFlexTable functionTable = new DirtyableFlexTable();
@@ -150,6 +157,7 @@
         functionPanel.setTitle("Function");
         functionPanel.setAutoHeight(true);
         functionPanel.add(functionTable);
+        functionPanel.setDisabled(this.readOnly);
         tPanel.add(functionPanel);
 
         ChangeListener changeListener = new ChangeListener() {
@@ -201,6 +209,7 @@
         tPanel.setBodyBorder(false);
         tPanel.setWidth(200);
 
+        tPanel.setDisabled(this.readOnly);
 
 //        functionTable.setVisible(useFunction);
 //        codeTable.setVisible(!useFunction);
@@ -216,6 +225,7 @@
     @Override
     protected void showFactTypeSelector(final Widget w) {
         final ListBox box = new ListBox();
+        SuggestionCompletionEngine completions = modeller.getSuggestionCompletions();
         String[] facts = completions.getFactTypes();
 
         box.addItem(constants.Choose());
@@ -247,6 +257,7 @@
      */
     protected void showSourcePatternSelector(final Widget w) {
         final ListBox box = new ListBox();
+        SuggestionCompletionEngine completions = modeller.getSuggestionCompletions();
         String[] facts = completions.getFactTypes();
 
         box.addItem(constants.Choose());
@@ -309,4 +320,6 @@
     private FromAccumulateCompositeFactPattern getFromAccumulatePattern() {
         return (FromAccumulateCompositeFactPattern) this.pattern;
     }
+
+
 }

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FromCollectCompositeFactPatternWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FromCollectCompositeFactPatternWidget.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FromCollectCompositeFactPatternWidget.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -11,6 +11,7 @@
 import org.drools.guvnor.client.common.DirtyableFlexTable;
 import org.drools.guvnor.client.common.FormStylePopup;
 import org.drools.guvnor.client.modeldriven.HumanReadable;
+import org.drools.guvnor.client.modeldriven.SuggestionCompletionEngine;
 import org.drools.guvnor.client.modeldriven.brl.FactPattern;
 import org.drools.guvnor.client.modeldriven.brl.FromAccumulateCompositeFactPattern;
 import org.drools.guvnor.client.modeldriven.brl.FromCollectCompositeFactPattern;
@@ -28,6 +29,11 @@
         super(modeller, pattern);
     }
 
+    public FromCollectCompositeFactPatternWidget(RuleModeller modeller,
+            FromCollectCompositeFactPattern pattern,Boolean readOnly) {
+        super(modeller, pattern, readOnly);
+    }
+
     @Override
     protected Widget getCompositeLabel() {
 
@@ -53,26 +59,26 @@
         int r = 0;
 
         if (pattern.getFactPattern() == null) {
-            panel.setWidget(r++, 0, new ClickableLabel("<br> <font color='red'>" + constants.clickToAddPatterns() + "</font>", leftPatternclick, !this.modeller.lockLHS()));
+            panel.setWidget(r++, 0, new ClickableLabel("<br> <font color='red'>" + constants.clickToAddPatterns() + "</font>", leftPatternclick, !this.readOnly));
         }
 
 
         panel.setWidget(r++, 0, new HTML(lbl));
 
         if (this.getFromCollectPattern().getRightPattern() == null) {
-            panel.setWidget(r++, 0, new ClickableLabel("<br> <font color='red'>" + constants.clickToAddPatterns() + "</font>", rightPatternclick, !this.modeller.lockLHS()));
+            panel.setWidget(r++, 0, new ClickableLabel("<br> <font color='red'>" + constants.clickToAddPatterns() + "</font>", rightPatternclick, !this.readOnly));
         } else {
             IPattern rPattern = this.getFromCollectPattern().getRightPattern();
 
             Widget patternWidget = null;
             if (rPattern instanceof FactPattern) {
-                patternWidget = new FactPatternWidget(modeller, rPattern, constants.All0with(), true);
+                patternWidget = new FactPatternWidget(modeller, rPattern, constants.All0with(), true, this.readOnly);
             } else if (rPattern instanceof FromAccumulateCompositeFactPattern) {
-                patternWidget = new FromAccumulateCompositeFactPatternWidget(modeller, (FromAccumulateCompositeFactPattern) rPattern);
+                patternWidget = new FromAccumulateCompositeFactPatternWidget(modeller, (FromAccumulateCompositeFactPattern) rPattern,this.readOnly);
             } else if (rPattern instanceof FromCollectCompositeFactPattern) {
-                patternWidget = new FromCollectCompositeFactPatternWidget(modeller, (FromCollectCompositeFactPattern) rPattern);
+                patternWidget = new FromCollectCompositeFactPatternWidget(modeller, (FromCollectCompositeFactPattern) rPattern,this.readOnly);
             } else if (rPattern instanceof FromCompositeFactPattern) {
-                patternWidget = new FromCompositeFactPatternWidget(modeller, (FromCompositeFactPattern) rPattern);
+                patternWidget = new FromCompositeFactPatternWidget(modeller, (FromCompositeFactPattern) rPattern,this.readOnly);
             } else {
                 throw new IllegalArgumentException("Unsuported pattern " + rPattern + " for right side of FROM COLLECT");
             }
@@ -135,6 +141,7 @@
      */
     protected void showRightPatternSelector(final Widget w) {
         final ListBox box = new ListBox();
+        SuggestionCompletionEngine completions = modeller.getSuggestionCompletions();
         String[] facts = completions.getFactTypes();
 
         box.addItem(constants.Choose());

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FromCompositeFactPatternWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FromCompositeFactPatternWidget.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/FromCompositeFactPatternWidget.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -9,7 +9,6 @@
 import com.google.gwt.user.client.ui.ListBox;
 import com.google.gwt.user.client.ui.Widget;
 import org.drools.guvnor.client.common.ClickableLabel;
-import org.drools.guvnor.client.common.DirtyableComposite;
 import org.drools.guvnor.client.common.DirtyableFlexTable;
 import org.drools.guvnor.client.common.DirtyableHorizontalPane;
 import org.drools.guvnor.client.common.FormStylePopup;
@@ -24,22 +23,37 @@
  *
  * @author esteban
  */
-public class FromCompositeFactPatternWidget extends DirtyableComposite {
+public class FromCompositeFactPatternWidget extends RuleModellerWidget {
 
-    protected final SuggestionCompletionEngine completions;
     protected FromCompositeFactPattern pattern;
     protected DirtyableFlexTable layout;
     protected RuleModeller modeller;
     protected Constants constants = ((Constants) GWT.create(Constants.class));
+    protected boolean readOnly;
 
     public FromCompositeFactPatternWidget(RuleModeller modeller,
             FromCompositeFactPattern pattern) {
-        this.completions = modeller.getSuggestionCompletions();
+        this(modeller, pattern, null);
+    }
+
+    public FromCompositeFactPatternWidget(RuleModeller modeller,
+            FromCompositeFactPattern pattern, Boolean readOnly) {
         this.pattern = pattern;
         this.modeller = modeller;
 
+        //if readOnly is null, the readOnly attribute is calculated.
+        if (readOnly == null) {
+            this.calculateReadOnly();
+        }else{
+            this.readOnly = readOnly;
+        }
+
+
         this.layout = new DirtyableFlexTable();
-        this.layout.setStyleName("model-builderInner-Background");
+        if (this.readOnly) {
+            this.layout.addStyleName("editor-disabled-widget");
+        }
+        this.layout.addStyleName("model-builderInner-Background");
 
         doLayout();
         initWidget(layout);
@@ -52,19 +66,27 @@
         if (pattern.getFactPattern() != null) {
             FactPattern fact = pattern.getFactPattern();
             if (fact != null) {
-                this.layout.setWidget(r,
-                        0,
-                        addRemoveButton(new FactPatternWidget(modeller,
-                        fact,
-                        true), new ClickListener() {
 
-                    public void onClick(Widget w) {
-                        if (Window.confirm(constants.RemoveThisEntireConditionQ())) {
-                            pattern.setFactPattern(null);
-                            modeller.refreshWidget();
+
+                if (this.readOnly) {
+                    //creates a new read-only FactPatternWidget
+                    FactPatternWidget factPatternWidget = new FactPatternWidget(modeller, fact, false, true);
+                    this.layout.setWidget(r,
+                            0, factPatternWidget);
+                } else {
+                    FactPatternWidget factPatternWidget = new FactPatternWidget(modeller, fact, true);
+                    this.layout.setWidget(r,
+                            0,
+                            addRemoveButton(factPatternWidget, new ClickListener() {
+
+                        public void onClick(Widget w) {
+                            if (Window.confirm(constants.RemoveThisEntireConditionQ())) {
+                                pattern.setFactPattern(null);
+                                modeller.refreshWidget();
+                            }
                         }
-                    }
-                }));
+                    }));
+                }
                 r++;
             }
         }
@@ -90,13 +112,13 @@
         int r = 0;
 
         if (pattern.getFactPattern() == null) {
-            panel.setWidget(r, 0, new ClickableLabel("<br> <font color='red'>" + constants.clickToAddPatterns() + "</font>", click, !this.modeller.lockLHS()));
+            panel.setWidget(r, 0, new ClickableLabel("<br> <font color='red'>" + constants.clickToAddPatterns() + "</font>", click, !this.readOnly));
             r++;
         }
 
 
         panel.setWidget(r, 0, new HTML(lbl));
-        panel.setWidget(r, 1, new ExpressionBuilder(modeller, this.pattern.getExpression()));
+        panel.setWidget(r, 1, new ExpressionBuilder(modeller, this.pattern.getExpression(), this.readOnly));
 
 
         return panel;
@@ -106,6 +128,7 @@
      * Pops up the fact selector.
      */
     protected void showFactTypeSelector(final Widget w) {
+        SuggestionCompletionEngine completions = modeller.getSuggestionCompletions();
         final ListBox box = new ListBox();
         String[] facts = completions.getFactTypes();
 
@@ -145,14 +168,24 @@
         w.setWidth("100%");
 
         horiz.add(w);
-        if (!modeller.lockLHS()) {
+        if (!this.readOnly) {
             horiz.add(remove);
         }
-
         return horiz;
     }
 
     public boolean isDirty() {
         return layout.hasDirty();
     }
+
+    protected void calculateReadOnly() {
+        if (this.pattern.factPattern != null) {
+            this.readOnly = !modeller.getSuggestionCompletions().containsFactType(this.pattern.factPattern.factType);
+        }
+    }
+
+    @Override
+    public boolean isReadOnly() {
+        return this.readOnly;
+    }
 }

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/GlobalCollectionAddWidget.java (from rev 32184, labs/jbossrules/branches/factsConstraints_baunax_esteban/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/GlobalCollectionAddWidget.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/GlobalCollectionAddWidget.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/GlobalCollectionAddWidget.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,82 @@
+package org.drools.guvnor.client.modeldriven.ui;
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.drools.guvnor.client.common.DirtyableFlexTable;
+import org.drools.guvnor.client.messages.Constants;
+
+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.SmallLabel;
+import org.drools.guvnor.client.modeldriven.brl.ActionGlobalCollectionAdd;
+
+/**
+ * Add Variable to global collection Widget
+ * @author esteban.aliverti at gmail.com
+ *
+ */
+public class GlobalCollectionAddWidget extends RuleModellerWidget {
+
+    private DirtyableFlexTable layout = new DirtyableFlexTable();
+    private Constants constants = ((Constants) GWT.create(Constants.class));
+    private boolean readOnly;
+
+    public GlobalCollectionAddWidget(RuleModeller mod, ActionGlobalCollectionAdd action) {
+        this(mod, action, null);
+    }
+
+    /**
+     * Creates a new FactPatternWidget
+     * @param mod
+     * @param p
+     * @param readOnly if the widget should be in RO mode. If this parameter
+     * is null, the readOnly attribute is calculated.
+     */
+    public GlobalCollectionAddWidget(RuleModeller modeller, ActionGlobalCollectionAdd action,
+            Boolean readOnly) {
+
+        if (readOnly == null) {
+            this.readOnly = !modeller.getSuggestionCompletions().containsFactType(modeller.getModel().getBoundFact(action.factName).factType);
+        } else {
+            this.readOnly = readOnly;
+        }
+
+        ActionGlobalCollectionAdd gca = (ActionGlobalCollectionAdd) action;
+        SimplePanel sp = new SimplePanel();
+        sp.setStyleName("model-builderInner-Background"); //NON-NLS
+        sp.add(new SmallLabel("&nbsp;" + Format.format(constants.AddXToListY(), gca.factName, gca.globalName)));
+
+        if (this.readOnly) {
+            this.layout.addStyleName("editor-disabled-widget");
+            sp.addStyleName("editor-disabled-widget");
+        }
+
+        layout.setWidget(0, 0, sp);
+        initWidget(layout);
+
+    }
+
+    @Override
+    public boolean isDirty() {
+        return layout.hasDirty();
+    }
+
+    @Override
+    public boolean isReadOnly() {
+        return this.readOnly;
+    }
+}

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-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModeller.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -15,23 +15,69 @@
  * limitations under the License.
  */
 
-import java.util.*;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 
-import org.drools.guvnor.client.common.*;
+import org.drools.guvnor.client.common.ClickableLabel;
+import org.drools.guvnor.client.common.DirtyableComposite;
+import org.drools.guvnor.client.common.DirtyableFlexTable;
+import org.drools.guvnor.client.common.DirtyableHorizontalPane;
+import org.drools.guvnor.client.common.DirtyableVerticalPane;
+import org.drools.guvnor.client.common.ErrorPopup;
+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.explorer.ExplorerLayoutManager;
+import org.drools.guvnor.client.messages.Constants;
 import org.drools.guvnor.client.modeldriven.HumanReadable;
 import org.drools.guvnor.client.modeldriven.SuggestionCompletionEngine;
-import org.drools.guvnor.client.modeldriven.brl.*;
+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.ActionInsertLogicalFact;
+import org.drools.guvnor.client.modeldriven.brl.ActionRetractFact;
+import org.drools.guvnor.client.modeldriven.brl.ActionSetField;
+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;
+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;
+import org.drools.guvnor.client.modeldriven.brl.RuleAttribute;
+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.rpc.RuleAsset;
 import org.drools.guvnor.client.ruleeditor.RuleViewer;
 import org.drools.guvnor.client.security.Capabilities;
-import org.drools.guvnor.client.messages.Constants;
 
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.ui.*;
-import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.rpc.SerializationException;
+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.FocusPanel;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.HasHorizontalAlignment;
+import com.google.gwt.user.client.ui.HasVerticalAlignment;
+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.KeyboardListenerAdapter;
+import com.google.gwt.user.client.ui.ListBox;
+import com.google.gwt.user.client.ui.MouseListenerAdapter;
+import com.google.gwt.user.client.ui.TextBox;
+import com.google.gwt.user.client.ui.Widget;
 import com.gwtext.client.core.ExtElement;
 import com.gwtext.client.util.Format;
 
@@ -44,21 +90,20 @@
 public class RuleModeller extends DirtyableComposite {
 
     private DirtyableFlexTable layout;
-    private SuggestionCompletionEngine completions;
     private RuleModel model;
     private Constants constants = ((Constants) GWT.create(Constants.class));
     private boolean showingOptions = false;
     private int currentLayoutRow = 0;
-
+    private String packageName;
+    
     public RuleModeller(RuleAsset asset, RuleViewer viewer) {
         this(asset);
     }
 
     public RuleModeller(RuleAsset asset) {
         this.model = (RuleModel) asset.content;
+        this.packageName = asset.metaData.packageName;
 
-        this.completions = SuggestionCompletionCache.getInstance().getEngineFromCache(asset.metaData.packageName);
-
         layout = new DirtyableFlexTable();
 
         initWidget();
@@ -294,43 +339,35 @@
 
         for (int i = 0; i < model.rhs.length; i++) {
             DirtyableVerticalPane widget = new DirtyableVerticalPane();
+            widget.setWidth("100%");
             IAction action = model.rhs[i];
 
-            Widget w = null;
+            //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, completions);
+                w = new ActionCallMethodWidget(this, (ActionCallMethod) action,readOnly);
             } else if (action instanceof ActionSetField) {
-                w = new ActionSetFieldWidget(this, (ActionSetField) action, completions);
+                w = new ActionSetFieldWidget(this, (ActionSetField) action,readOnly);
             } else if (action instanceof ActionInsertFact) {
-                w = new ActionInsertFactWidget(this, (ActionInsertFact) action, completions);
+                w = new ActionInsertFactWidget(this, (ActionInsertFact) action, readOnly);
             } else if (action instanceof ActionRetractFact) {
-                w = new ActionRetractFactWidget(this.completions, (ActionRetractFact) action, this.getModel());
+                w = new ActionRetractFactWidget(this, (ActionRetractFact) action, readOnly);
             } else if (action instanceof DSLSentence) {
-                w = new DSLSentenceWidget((DSLSentence) action, this.completions);
-                w.setStyleName("model-builderInner-Background"); //NON-NLS
+                w = new DSLSentenceWidget(this,(DSLSentence) action, readOnly);
+                w.addStyleName("model-builderInner-Background"); //NON-NLS
             } else if (action instanceof FreeFormLine) {
-                final TextBox tb = new TextBox();
-                final FreeFormLine ffl = (FreeFormLine) action;
-                tb.setText(ffl.text);
-                tb.addChangeListener(new ChangeListener() {
-
-                    public void onChange(Widget arg0) {
-                        ffl.text = tb.getText();
-                    }
-                });
-                w = tb;
+                w = new FreeFormLineWidget(this, (FreeFormLine) action, readOnly);
             } else if (action instanceof ActionGlobalCollectionAdd) {
-                ActionGlobalCollectionAdd gca = (ActionGlobalCollectionAdd) action;
-                SimplePanel sp = new SimplePanel();
-                sp.setStyleName("model-builderInner-Background"); //NON-NLS
-                w = sp;
-                sp.add(new SmallLabel("&nbsp;" + Format.format(constants.AddXToListY(), gca.factName, gca.globalName)));
-            }
+                w = new GlobalCollectionAddWidget(this, (ActionGlobalCollectionAdd) action, readOnly);
+            } 
 
-            //w.setWidth( "100%" );
+            w.setWidth( "100%" );
             widget.add(spacerWidget());
 
             DirtyableHorizontalPane horiz = new DirtyableHorizontalPane();
+            horiz.setWidth("100%");
             //horiz.setBorderWidth(2);
 
             Image remove = new ImageButton("images/delete_faded.gif"); //NON-NLS
@@ -368,9 +405,10 @@
             layout.setWidget(currentLayoutRow, 1, widget);
             layout.getFlexCellFormatter().setHorizontalAlignment(currentLayoutRow, 1, HasHorizontalAlignment.ALIGN_LEFT);
             layout.getFlexCellFormatter().setVerticalAlignment(currentLayoutRow, 1, HasVerticalAlignment.ALIGN_TOP);
+            layout.getFlexCellFormatter().setWidth(currentLayoutRow, 1, "100%");
 
             final int index = i;
-            if (!lockRHS()) {
+            if (!(this.lockRHS() || w.isReadOnly())) {
                 this.addActionsButtonsToLayout(constants.AddAnActionBelow(), new ClickListener() {
 
                     public void onClick(Widget w) {
@@ -432,6 +470,7 @@
         //
         // The list of DSL sentences
         //
+        SuggestionCompletionEngine completions = SuggestionCompletionCache.getInstance().getEngineFromCache(packageName);
         if (completions.getDSLConditions().length > 0) {
             for (int i = 0; i < completions.getDSLConditions().length; i++) {
                 final DSLSentence sen = completions.getDSLConditions()[i];
@@ -624,9 +663,10 @@
         //
         // First load up the stuff to do with bound variables or globals
         //
+        SuggestionCompletionEngine completions = SuggestionCompletionCache.getInstance().getEngineFromCache(packageName);
         List<String> vars = model.getBoundFacts();
         List<String> vars2 = model.getRhsBoundFacts();
-        String[] globals = this.completions.getGlobalVariables();
+        String[] globals = completions.getGlobalVariables();
 
 
         //
@@ -918,37 +958,31 @@
 
         for (int i = 0; i < model.lhs.length; i++) {
             DirtyableVerticalPane vert = new DirtyableVerticalPane();
+            vert.setWidth("100%");
+
+            //if lockLHS() set the widget RO, otherwise let them decide.
+            Boolean readOnly = this.lockLHS()?true:null;
+
             IPattern pattern = model.lhs[i];
-            Widget w = null;
+            RuleModellerWidget w = null;
             if (pattern instanceof FactPattern) {
-                w = new FactPatternWidget(this, pattern, true);
+                w = new FactPatternWidget(this, pattern, true, readOnly);
             } else if (pattern instanceof CompositeFactPattern) {
-                w = new CompositeFactPatternWidget(this, (CompositeFactPattern) pattern);
+                w = new CompositeFactPatternWidget(this, (CompositeFactPattern) pattern, readOnly);
             } else if (pattern instanceof FromAccumulateCompositeFactPattern) {
-                w = new FromAccumulateCompositeFactPatternWidget(this, (FromAccumulateCompositeFactPattern) pattern);
+                w = new FromAccumulateCompositeFactPatternWidget(this, (FromAccumulateCompositeFactPattern) pattern, readOnly);
             } else if (pattern instanceof FromCollectCompositeFactPattern) {
-                w = new FromCollectCompositeFactPatternWidget(this, (FromCollectCompositeFactPattern) pattern);
+                w = new FromCollectCompositeFactPatternWidget(this, (FromCollectCompositeFactPattern) pattern, readOnly);
             } else if (pattern instanceof FromCompositeFactPattern) {
-                w = new FromCompositeFactPatternWidget(this, (FromCompositeFactPattern) pattern);
+                w = new FromCompositeFactPatternWidget(this, (FromCompositeFactPattern) pattern, readOnly);
             } else if (pattern instanceof DSLSentence) {
-                w = new DSLSentenceWidget((DSLSentence) pattern, completions);
+                w = new DSLSentenceWidget(this,(DSLSentence) pattern, readOnly);
             } else if (pattern instanceof FreeFormLine) {
-                final FreeFormLine ffl = (FreeFormLine) pattern;
-                final TextBox tb = new TextBox();
-                tb.setText(ffl.text);
-                tb.setTitle(constants.ThisIsADrlExpressionFreeForm());
-                tb.addChangeListener(new ChangeListener() {
-
-                    public void onChange(Widget arg0) {
-                        ffl.text = tb.getText();
-                    }
-                });
-                w = tb;
+                w = new FreeFormLineWidget(this, (FreeFormLine)pattern, readOnly);
             } else if (pattern instanceof ExpressionFormLine) {
-                ExpressionFormLine efl = (ExpressionFormLine) pattern;
-                w = new ExpressionBuilder(this, efl);
+                w = new ExpressionBuilder(this, (ExpressionFormLine) pattern, readOnly);
             } else {
-                throw new RuntimeException("I don't know what type of pattern that is.");
+                throw new RuntimeException("I don't know what type of pattern it is: "+pattern);
             }
 
             vert.add(wrapLHSWidget(model, i, w));
@@ -962,9 +996,10 @@
             layout.setWidget(currentLayoutRow, 1, vert);
             layout.getFlexCellFormatter().setHorizontalAlignment(currentLayoutRow, 1, HasHorizontalAlignment.ALIGN_LEFT);
             layout.getFlexCellFormatter().setVerticalAlignment(currentLayoutRow, 1, HasVerticalAlignment.ALIGN_TOP);
+            layout.getFlexCellFormatter().setWidth(currentLayoutRow, 1, "100%");
 
             final int index = i;
-            if (!lockLHS()) {
+            if (!(this.lockLHS() || w.isReadOnly())) {
                 this.addActionsButtonsToLayout(constants.AddAConditionBelow(), new ClickListener() {
 
                     public void onClick(Widget w) {
@@ -1003,7 +1038,7 @@
      */
     private Widget wrapLHSWidget(final RuleModel model,
             int i,
-            Widget w) {
+            RuleModellerWidget w) {
         DirtyableHorizontalPane horiz = new DirtyableHorizontalPane();
 
         final Image remove = new ImageButton("images/delete_faded.gif"); //NON-NLS
@@ -1027,7 +1062,7 @@
         w.setWidth("100%");
 
         horiz.add(w);
-        if (!lockLHS()) {
+        if (!(this.lockLHS() || w.isReadOnly())) {
             horiz.add(remove);
         }
 
@@ -1080,12 +1115,8 @@
         layout.setWidget(currentLayoutRow, 2, actionPanel);
         layout.getFlexCellFormatter().setHorizontalAlignment(currentLayoutRow, 2, HasHorizontalAlignment.ALIGN_CENTER);
         layout.getFlexCellFormatter().setVerticalAlignment(currentLayoutRow, 2, HasVerticalAlignment.ALIGN_MIDDLE);
-        
-
-
     }
 
-
     public RuleModel getModel() {
         return model;
     }
@@ -1095,15 +1126,16 @@
      * either by the rule, or as a global.
      */
     public boolean isVariableNameUsed(String name) {
-
+        SuggestionCompletionEngine completions = SuggestionCompletionCache.getInstance().getEngineFromCache(packageName);
         return model.isVariableNameUsed(name) || completions.isGlobalVariable(name);
     }
 
+    @Override
     public boolean isDirty() {
         return (layout.hasDirty() || dirtyflag);
     }
 
     public SuggestionCompletionEngine getSuggestionCompletions() {
-        return this.completions;
+        return SuggestionCompletionCache.getInstance().getEngineFromCache(packageName);
     }
 }

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModellerWidget.java (from rev 32184, labs/jbossrules/branches/factsConstraints_baunax_esteban/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModellerWidget.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModellerWidget.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/RuleModellerWidget.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,18 @@
+package org.drools.guvnor.client.modeldriven.ui;
+
+import org.drools.guvnor.client.common.DirtyableComposite;
+
+/**
+ * A superclass for the widgets present in RuleModeller. 
+ * @author esteban.aliverti at gmail.com
+ */
+public abstract class RuleModellerWidget extends DirtyableComposite {
+
+    /**
+     * Dictates if the widget's state is RO or not. Sometimes RuleModeller will
+     * force this state (i.e. when lockLHS() or lockRHS()), but some other times,
+     * the widget itself is responsible to autodetect its state.
+     * @return
+     */
+    public abstract boolean isReadOnly();
+}

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/factPattern/Connectives.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/factPattern/Connectives.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/factPattern/Connectives.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -83,7 +83,7 @@
 
     private Widget connectiveValueEditor(final ISingleFieldConstraint con, String factClass, String fieldName) {
         String typeNumeric = this.modeller.getSuggestionCompletions().getFieldType( factClass, fieldName );
-        return new ConstraintValueEditor(pattern, fieldName, con, this.modeller, typeNumeric);
+        return new ConstraintValueEditor(pattern, fieldName, con, this.modeller, typeNumeric,false);
     }
 
     private Widget connectiveOperatorDropDown(final ConnectiveConstraint con, String fieldName) {

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/factPattern/PopupCreator.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/factPattern/PopupCreator.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/modeldriven/ui/factPattern/PopupCreator.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -13,7 +13,6 @@
 import org.drools.guvnor.client.messages.Constants;
 
 import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.ui.AbsolutePanel;
 import com.google.gwt.user.client.ui.Button;
 import com.google.gwt.user.client.ui.ChangeListener;
 import com.google.gwt.user.client.ui.ClickListener;

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/NewSubPackageWizard.java (from rev 32184, labs/jbossrules/branches/factsConstraints_baunax_esteban/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/NewSubPackageWizard.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/NewSubPackageWizard.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/NewSubPackageWizard.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,243 @@
+package org.drools.guvnor.client.packages;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.drools.guvnor.client.common.ErrorPopup;
+import org.drools.guvnor.client.common.FormStyleLayout;
+import org.drools.guvnor.client.common.FormStylePopup;
+import org.drools.guvnor.client.common.GenericCallback;
+import org.drools.guvnor.client.common.HTMLFileManagerFields;
+import org.drools.guvnor.client.common.ImageButton;
+import org.drools.guvnor.client.common.LoadingPopup;
+import org.drools.guvnor.client.common.RulePackageSelector;
+import org.drools.guvnor.client.messages.Constants;
+import org.drools.guvnor.client.rpc.RepositoryServiceFactory;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.ClickListener;
+import com.google.gwt.user.client.ui.FileUpload;
+import com.google.gwt.user.client.ui.FormHandler;
+import com.google.gwt.user.client.ui.FormPanel;
+import com.google.gwt.user.client.ui.FormSubmitCompleteEvent;
+import com.google.gwt.user.client.ui.FormSubmitEvent;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.RadioButton;
+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;
+
+/**
+ * This is the wizard used when creating new packages or importing them.
+ *
+ * @author Michael Neale
+ */
+public class NewSubPackageWizard extends FormStylePopup {
+
+    private TextBox               nameBox;
+    private TextBox               descBox;
+    private RulePackageSelector   parentPackage;
+    private final FormStyleLayout importLayout     = new FormStyleLayout();
+    private final FormStyleLayout newPackageLayout = new FormStyleLayout();
+    private static Constants      constants        = ((Constants) GWT.create( Constants.class ));
+
+    public NewSubPackageWizard(final Command afterCreatedEvent) {
+        super( "images/new_wiz.gif",
+               constants.CreateANewSubPackage() ); //NON-NLS
+        nameBox = new TextBox();
+        descBox = new TextBox();
+        parentPackage = new RulePackageSelector();
+
+        //newPackageLayout.addRow( new HTML(constants.CreateNewPackage()) );
+
+        newPackageLayout.addAttribute( constants.NameColon(),
+                                       nameBox );
+        newPackageLayout.addAttribute( constants.DescriptionColon(),
+                                       descBox );
+        newPackageLayout.addAttribute(constants.ParentPackage(), parentPackage);
+
+        nameBox.setTitle( constants.PackageNameTip() );
+
+        RadioButton newPackage = new RadioButton( "action",
+                                                  constants.CreateNewPackageRadio() ); //NON-NLS
+        RadioButton importPackage = new RadioButton( "action",
+                                                     constants.ImportFromDrlRadio() ); //NON-NLS
+        newPackage.setChecked( true );
+        newPackageLayout.setVisible( true );
+
+        newPackage.addClickListener( new ClickListener() {
+            public void onClick(Widget w) {
+                newPackageLayout.setVisible( true );
+                importLayout.setVisible( false );
+            }
+        } );
+
+        this.setAfterShow( new Command() {
+            public void execute() {
+                nameBox.setFocus( true );
+            }
+        } );
+
+        importLayout.setVisible( false );
+
+        importPackage.addClickListener( new ClickListener() {
+            public void onClick(Widget arg0) {
+                newPackageLayout.setVisible( false );
+                importLayout.setVisible( true );
+            }
+        } );
+        VerticalPanel ab = new VerticalPanel();
+        ab.add( newPackage );
+        ab.add( importPackage );
+        addAttribute( "",
+                      ab );
+
+        addRow( newPackageLayout );
+        addRow( importLayout );
+
+        importLayout.addAttribute( constants.DRLFileToImport(),
+                                   newImportWidget( afterCreatedEvent,
+                                                    this ) );
+
+        importLayout.addRow( new HTML( "<br/><b>" + constants.NoteNewPackageDrlImportWarning() + "</b>" ) );
+        importLayout.addRow( new HTML( constants.ImportDRLDesc1() ) );
+        importLayout.addRow( new HTML( constants.ImportDRLDesc2() ) );
+        importLayout.addRow( new HTML( constants.ImportDRLDesc3() ) );
+
+        Button create = new Button( constants.CreatePackage() );
+        create.addClickListener( new ClickListener() {
+            public void onClick(Widget w) {
+                if ( PackageNameValidator.validatePackageName( nameBox.getText() ) ) {
+                    createSubPackageAction( nameBox.getText(),
+                                         descBox.getText(),
+                                         parentPackage.getSelectedPackage(),
+                                         afterCreatedEvent );
+                    hide();
+                } else {
+                    nameBox.setText( "" );
+                    Window.alert( constants.PackageNameCorrectHint() );
+                }
+            }
+        } );
+
+        newPackageLayout.addAttribute( "",
+                                       create );
+
+    }
+
+    private void createSubPackageAction(final String name,
+                                     final String descr,
+                                     String parentPackage, final Command refresh) {
+        LoadingPopup.showMessage( constants.CreatingPackagePleaseWait() );
+        RepositoryServiceFactory.getService().createSubPackage( name,
+                                                             descr,
+                                                             parentPackage,
+                                                             new GenericCallback<String>() {
+                                                                 public void onSuccess(String data) {
+                                                                     RulePackageSelector.currentlySelectedPackage = name;
+                                                                     LoadingPopup.close();
+                                                                     refresh.execute();
+                                                                 }
+                                                             } );
+    }
+
+    public static Widget newImportWidget(final Command afterCreatedEvent,
+                                         final FormStylePopup parent) {
+
+        final FormPanel uploadFormPanel = new FormPanel();
+        uploadFormPanel.setAction( GWT.getModuleBaseURL() + "package" );
+        uploadFormPanel.setEncoding( FormPanel.ENCODING_MULTIPART );
+        uploadFormPanel.setMethod( FormPanel.METHOD_POST );
+
+        HorizontalPanel panel = new HorizontalPanel();
+        uploadFormPanel.setWidget( panel );
+
+        final FileUpload upload = new FileUpload();
+        upload.setName( HTMLFileManagerFields.CLASSIC_DRL_IMPORT );
+        panel.add( upload );
+
+        panel.add( new Label( constants.upload() ) );
+        ImageButton ok = new ImageButton( "images/upload.gif",
+                                          constants.Import() ); //NON-NLS
+        ClickListener okClickListener = new ClickListener() {
+            public void onClick(Widget sender) {
+                if ( Window.confirm( constants.ImportMergeWarning() ) ) {
+                    LoadingPopup.showMessage( constants.ImportingDRLPleaseWait() );
+                    uploadFormPanel.submit();
+                }
+            }
+
+        };
+        ok.addClickListener( okClickListener );
+
+        panel.add( ok );
+
+        final FormStylePopup packageNamePopup = new FormStylePopup( "images/package_large.png",
+                                                                    constants.PackageName() );
+        HorizontalPanel packageNamePanel = new HorizontalPanel();
+        packageNamePopup.addRow( new Label( constants.ImportedDRLContainsNoNameForThePackage() ) );
+
+        final TextBox packageName = new TextBox();
+        packageNamePanel.add( new Label( constants.PackageName() + ":" ) );
+        packageNamePanel.add( packageName );
+        Button uploadWithNameButton = new Button( constants.OK() );
+        uploadWithNameButton.addClickListener( okClickListener );
+        packageNamePanel.add( uploadWithNameButton );
+        packageNamePopup.addRow( packageNamePanel );
+
+        uploadFormPanel.addFormHandler( new FormHandler() {
+            public void onSubmitComplete(FormSubmitCompleteEvent event) {
+                if ( event.getResults().indexOf( "OK" ) > -1 ) { //NON-NLS
+                    Window.alert( constants.PackageWasImportedSuccessfully() );
+                    afterCreatedEvent.execute();
+                    parent.hide();
+                    if ( packageNamePopup != null ) {
+                        packageNamePopup.hide();
+                    }
+                } else if ( event.getResults().indexOf( "Missing package name." ) > -1 ) {
+                    LoadingPopup.close();
+                    packageNamePopup.show();
+                } else {
+                    ErrorPopup.showMessage( Format.format( constants.UnableToImportIntoThePackage0(),
+                                                           event.getResults() ) );
+                }
+                LoadingPopup.close();
+            }
+
+            public void onSubmit(FormSubmitEvent event) {
+                if ( upload.getFilename().length() == 0 ) {
+                    Window.alert( constants.YouDidNotChooseADrlFileToImport() );
+                    event.setCancelled( true );
+                } else if ( !upload.getFilename().endsWith( ".drl" ) ) { //NON-NLS
+                    Window.alert( constants.YouCanOnlyImportDrlFiles() );
+                    event.setCancelled( true );
+                } else if ( packageName.getText() != null && !packageName.getText().equals( "" ) ) {
+                    uploadFormPanel.setAction( uploadFormPanel.getAction() + "?packageName=" + packageName.getText() );
+                }
+
+            }
+        } );
+
+        return uploadFormPanel;
+    }
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/PackageEditor2.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/PackageEditor2.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/PackageEditor2.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -64,9 +64,6 @@
  * @author Michael Neale
  */
 public class PackageEditor2 extends PrettyFormLayout {
-
-
-
     private PackageConfigData conf;
     private HTML status;
     protected ValidatedResponse previousResponse;
@@ -112,11 +109,6 @@
         addAttribute(constants.CategoryRules(), getAddCatRules() );
         addAttribute( "", getShowCatRules() );
 
-
-
-
-
-
         if (!conf.isSnapshot) {
             Button save = new Button(constants.SaveAndValidateConfiguration());
             save.addClickListener( new ClickListener() {
@@ -262,14 +254,12 @@
     	}
 
     }
+
     protected void showCatRuleSelector(Widget w) {
         final FormStylePopup pop = new FormStylePopup("images/config.png", constants.AddACategoryRuleToThePackage()); //NON-NLS
         final Button addbutton = new Button(constants.OK());
         final TextBox ruleName = new TextBox();
 
-
-
-
         final CategoryExplorerWidget exw = new CategoryExplorerWidget(new CategorySelectHandler(){
 			public void selected(String selectedPath) { //not needed
 			}
@@ -296,7 +286,6 @@
         pop.show();
     }
 
-
 	private String getDateString(Date d) {
 		if (d != null)
 			return d.toLocaleString();
@@ -430,8 +419,6 @@
         return horiz;
     }
 
-
-
     private void showRenameDialog() {
         final FormStylePopup pop = new FormStylePopup("images/new_wiz.gif", constants.RenameThePackage());
         pop.addRow( new HTML(constants.RenamePackageTip()) );
@@ -442,8 +429,8 @@
 
         ok.addClickListener( new ClickListener() {
             public void onClick(Widget w) {
-                RepositoryServiceFactory.getService().renamePackage( conf.uuid, name.getText(), new GenericCallback() {
-                    public void onSuccess(Object data) {
+                RepositoryServiceFactory.getService().renamePackage( conf.uuid, name.getText(), new GenericCallback<String>() {
+                    public void onSuccess(String data) {
                         refreshPackageList.execute();
                         conf.name = name.getText();
                         refreshWidgets();
@@ -457,8 +444,6 @@
         pop.show();
     }
 
-
-
     /**
      * Will show a copy dialog for copying the whole package.
      */
@@ -477,8 +462,8 @@
                     return;
                 }
                 LoadingPopup.showMessage(constants.PleaseWaitDotDotDot());
-                RepositoryServiceFactory.getService().copyPackage( conf.name, name.getText(), new GenericCallback() {
-                    public void onSuccess(Object data) {
+                RepositoryServiceFactory.getService().copyPackage( conf.name, name.getText(), new GenericCallback<Void>() {
+                    public void onSuccess(Void data) {
                         refreshPackageList.execute();
                         Window.alert(constants.PackageCopiedSuccessfully());
                         pop.hide();
@@ -492,18 +477,12 @@
 
     }
 
-    protected void doCopyPackage(String name) {
-
-    }
-
     private void doSaveAction(final Command refresh) {
         LoadingPopup.showMessage(constants.SavingPackageConfigurationPleaseWait());
 
-        RepositoryServiceFactory.getService().savePackage( this.conf, new GenericCallback() {
-            public void onSuccess(Object data) {
-
-                previousResponse = (ValidatedResponse) data;
-
+        RepositoryServiceFactory.getService().savePackage( this.conf, new GenericCallback<ValidatedResponse>() {
+            public void onSuccess(ValidatedResponse data) {
+                previousResponse = data;
                 reload();
                 LoadingPopup.showMessage(constants.PackageConfigurationUpdatedSuccessfullyRefreshingContentCache());
 
@@ -515,17 +494,10 @@
                         LoadingPopup.close();
                     }
                 });
-
-
-
-
             }
         });
-
     }
 
-
-
     /**
      * Will refresh all the data.
      */

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/SuggestionCompletionCache.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/SuggestionCompletionCache.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/SuggestionCompletionCache.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -30,6 +30,7 @@
 import com.google.gwt.user.client.Command;
 import com.google.gwt.core.client.GWT;
 import com.gwtext.client.util.Format;
+import org.drools.guvnor.client.modeldriven.FactTypeFilter;
 
 /**
  * This utility cache will maintain a cache of suggestion completion engines,
@@ -44,9 +45,7 @@
 
     private static SuggestionCompletionCache INSTANCE = null;
 
-    
-
-    Map cache = new HashMap();
+    Map<String, SuggestionCompletionEngine> cache = new HashMap<String, SuggestionCompletionEngine>();
     private final Constants constants;
 
 
@@ -55,7 +54,6 @@
         return INSTANCE;
     }
 
-
     private SuggestionCompletionCache() {
         constants = GWT.create(Constants.class);
     }
@@ -79,8 +77,6 @@
         } else {
             command.execute();
         }
-
-
     }
 
     public SuggestionCompletionEngine getEngineFromCache(String packageName) {
@@ -96,6 +92,7 @@
     public void loadPackage(final String packageName, final Command command) {
 
         LoadingPopup.showMessage(Format.format(constants.InitialisingInfoFor0PleaseWait(), packageName));
+
         RepositoryServiceFactory.getService().loadSuggestionCompletionEngine( packageName, new GenericCallback<SuggestionCompletionEngine>() {
             public void onSuccess(SuggestionCompletionEngine engine) {
                 cache.put( packageName, engine );
@@ -110,7 +107,6 @@
         });
     }
 
-
     /**
      * Removed the package from the cache, causing it to be loaded the next time.
      */
@@ -121,7 +117,20 @@
         } else {
             done.execute();
         }
+    }
 
+    /**
+     * Reloads a package and then applies the given filter.
+     * @param packageName the package name.
+     * @param filter the filter.
+     * @param done the command to be executed after the filter is applied.
+     */
+    public void applyFactFilter(final String packageName,final FactTypeFilter filter, final Command done){
+        this.refreshPackage(packageName, new Command() {
+            public void execute() {
+                getEngineFromCache(packageName).filterFactTypes(filter);
+                done.execute();
+            }
+        });
     }
-
 }
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/WorkingSetManager.java (from rev 32184, labs/jbossrules/branches/factsConstraints_baunax_esteban/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/WorkingSetManager.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/WorkingSetManager.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/packages/WorkingSetManager.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,210 @@
+package org.drools.guvnor.client.packages;
+
+import com.google.gwt.user.client.Command;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.drools.guvnor.client.common.GenericCallback;
+import org.drools.guvnor.client.factcontraints.Constraint;
+import org.drools.guvnor.client.modeldriven.FactTypeFilter;
+import org.drools.guvnor.client.rpc.RepositoryServiceFactory;
+import org.drools.guvnor.client.rpc.RuleAsset;
+import org.drools.guvnor.client.rpc.WorkingSetConfigData;
+
+/**
+ *
+ * @author esteban.aliverti at gmail.com
+ */
+public class WorkingSetManager {
+
+    private static WorkingSetManager INSTANCE = null;
+    Map<String, Set<RuleAsset>> activeWorkingSets = new HashMap<String, Set<RuleAsset>>();
+
+    public synchronized static WorkingSetManager getInstance() {
+        if (INSTANCE == null) {
+            INSTANCE = new WorkingSetManager();
+        }
+        return INSTANCE;
+    }
+
+    /**
+     * Convenient method to call {@link #applyWorkingSets(java.lang.String, java.util.Set, com.google.gwt.user.client.Command) }
+     * when you have the WorkingSets' UUID instead of the WorkingSetConfigData
+     * objects
+     * @param packageName the package name.
+     * @param wsUUIDs the set of WorkingSets' UUIDs
+     * @param done the command to execute after the SCE and internal map are
+     * refreshed.
+     * @see #applyWorkingSets(java.lang.String, java.util.Set, com.google.gwt.user.client.Command)
+     */
+    public void applyWorkingSets(final String packageName, final String[] wsUUIDs, final Command done) {
+        RepositoryServiceFactory.getService().loadRuleAssets(wsUUIDs, new GenericCallback<RuleAsset[]>() {
+
+            public void onSuccess(RuleAsset[] result) {
+                final Set<RuleAsset> wss = new HashSet<RuleAsset>();
+                wss.addAll(Arrays.asList(result));
+
+                applyWorkingSets(packageName, wss, done);
+            }
+        });
+
+    }
+
+    /**
+     * Applies the workingSets' valid facts to SCE. This method updates the
+     * internal activeWorkingSets map. If no workingSet is supplied, the
+     * SCE is refreshed to remove any existing filter.
+     * @param packageName the package name.
+     * @param wss the WorkingSet' assets list
+     * @param done the command to execute after the SCE and internal map are
+     * refreshed.
+     */
+    public void applyWorkingSets(final String packageName, final Set<RuleAsset> wss, final Command done) {
+
+        Command cmd = new Command() {
+
+            public void execute() {
+                //update the map
+                activeWorkingSets.remove(packageName);
+                if (wss != null && !wss.isEmpty()){
+                    activeWorkingSets.put(packageName, wss);
+                }
+                
+                if (done != null) {
+                    done.execute();
+                }
+            }
+        };
+
+
+        if (wss == null || wss.isEmpty()) {
+            //if no WS, we refresh the SCE (release any filter)
+            SuggestionCompletionCache.getInstance().refreshPackage(packageName, cmd);
+            //update the map
+            this.activeWorkingSets.remove(packageName);
+            return;
+        } else {
+
+            final Set<String> validFacts = new HashSet<String>();
+            for (RuleAsset asset : wss) {
+                WorkingSetConfigData wsConfig = (WorkingSetConfigData) asset.content;
+                validFacts.addAll(Arrays.asList(wsConfig.validFacts));
+            }
+
+            FactTypeFilter filter = new FactTypeFilter() {
+
+                public boolean filter(String originalFact) {
+                    return !validFacts.contains(originalFact);
+                }
+            };
+
+            SuggestionCompletionCache.getInstance().applyFactFilter(packageName, filter, cmd);
+        }
+
+    }
+
+    /**
+     * Returns the active WorkingSets for a package (as RuleAsset), or null if any.
+     * @param packageName the package name
+     * @return the active WorkingSets for a package (as RuleAsset), or null if any.
+     */
+    public Set<RuleAsset> getActiveAssets(String packageName){
+        return this.activeWorkingSets.get(packageName);
+    }
+    
+    public Set<String> getActiveAssetUUIDs(String packageName){
+    	Set<RuleAsset> assets = this.activeWorkingSets.get(packageName);
+    	if (assets == null) {
+    		return null;
+    	}
+    	Set<String> uuids = new HashSet<String>(assets.size());
+        for (RuleAsset asset : assets) {
+			uuids.add(asset.uuid);
+		}
+		return uuids;
+    }
+
+    /**
+     * Returns the active WorkingSets for a package, or null if any.
+     * @param packageName the package name
+     * @return the active WorkingSets for a package, or null if any.
+     */
+    public Set<WorkingSetConfigData> getActiveWorkingSets(String packageName){
+        Set<RuleAsset> assets = this.activeWorkingSets.get(packageName);
+        if (assets == null){
+            return null;
+        }
+
+        Set<WorkingSetConfigData> result = new HashSet<WorkingSetConfigData>();
+        for (RuleAsset ruleAsset : assets) {
+            result.add((WorkingSetConfigData) ruleAsset.content);
+        }
+
+        return result;
+    }
+
+    /**
+     * Returns whether the given (WorkingSet) RuleSet is active in a package or not.
+     * @param packageName the package name.
+     * @param workingSetAsset the (WorkingSet) RuleSet
+     * @return whether the given (WorkingSet) RuleSet is active in a package or not.
+     */
+    public boolean isWorkingSetActive(String packageName, RuleAsset workingSetAsset){
+        return this.isWorkingSetActive(packageName, workingSetAsset.uuid);
+    }
+
+    /**
+     * Returns whether the given (WorkingSet) RuleSet is active in a package or not.
+     * @param packageName the package name.
+     * @param workingSetAsset the (WorkingSet) RuleSet
+     * @return whether the given (WorkingSet) RuleSet is active in a package or not.
+     */
+    public boolean isWorkingSetActive(String packageName, String ruleAssetUUID){
+        if (!this.activeWorkingSets.containsKey(packageName)){
+            return false;
+        }
+
+        Set<RuleAsset> wss = this.activeWorkingSets.get(packageName);
+        for (RuleAsset asset : wss) {
+            if (asset.uuid.equals(ruleAssetUUID)){
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+
+    /**
+     * Returns a Set of Constraints for a Fact Type's field. This method uses
+     * the active Working Sets of the package in order to get the Constraints.
+     * @param packageName the package name.
+     * @param factType the Fact Type (Short class name)
+     * @param fieldName the field name
+     * @return a Set of Constraints for a Fact Type's field.
+     */
+    public Set<Constraint> getFieldContraints(String packageName, String factType, String fieldName ){
+
+        Set<Constraint> result = new HashSet<Constraint>();
+
+        //TODO: Change this with a centralized way of Constraint Administration.
+        Set<RuleAsset> activeAssets = this.getActiveAssets(packageName);
+        if (activeAssets != null){
+            for (RuleAsset ruleAsset : activeAssets) {
+                List<Constraint> constraints = ((WorkingSetConfigData)ruleAsset.content).constraints;
+                if (constraints != null) {
+                	for (Constraint constraint : constraints) {
+                		if (constraint.getFactType().equals(factType) && constraint.getFieldName().equals(fieldName)){
+                			result.add(constraint);
+                		}
+                	}
+                }
+            }
+        }
+
+        return result;
+    }
+}

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/MetaData.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/MetaData.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/MetaData.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -41,6 +41,7 @@
     public Date     createdDate;
 
     public String   packageName      = "";
+    public String   packageUUID      = "";
     public String[] categories       = new String[0];
 
     public String   format           = "";

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/PackageConfigData.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/PackageConfigData.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/PackageConfigData.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -15,8 +15,6 @@
  * limitations under the License.
  */
 
-
-
 import java.util.Date;
 import java.util.HashMap;
 
@@ -27,11 +25,10 @@
  * @author Michael Neale
  *
  */
-public class PackageConfigData
-    implements
-    IsSerializable {
+public class PackageConfigData implements IsSerializable {
 
 	public PackageConfigData() {}
+	
 	public PackageConfigData(String name) {
 		this.name = name;
 	}
@@ -50,4 +47,6 @@
     public Date dateCreated;
     public String checkinComment;
     public HashMap<String,String> catRules;
+    
+    public PackageConfigData[] subPackages;
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/PushResponse.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/PushResponse.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/PushResponse.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -4,17 +4,19 @@
 
 /**
  * A response packet that is sent back to the client.
- * messageType is to allow filtering on the clinet, message data itself contains the message.
+ * messageType is to allow filtering on the client, message data itself contains the message.
  * @author Michael Neale
  */
 public class PushResponse implements IsSerializable {
 
-    public PushResponse() {}
+    public PushResponse() {
+    	this("", "");
+    }
     public PushResponse(String key, String message) {
         this.messageType = key;
         this.message = message;
     }
-    public String messageType = "";
-    public String message = "";
+    public String messageType;
+    public String message;
 
 }

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryService.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryService.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryService.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -20,14 +20,13 @@
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.drools.guvnor.client.modeldriven.SuggestionCompletionEngine;
 import org.drools.guvnor.client.modeldriven.testing.Scenario;
 
-import com.google.gwt.user.client.rpc.AsyncCallback;
 import com.google.gwt.user.client.rpc.RemoteService;
 import com.google.gwt.user.client.rpc.SerializableException;
-import com.google.gwt.user.client.rpc.IsSerializable;
 
 /**
  * This is what the remote service will implement, as a servlet.
@@ -151,6 +150,12 @@
      * @return UUID of the created item.
      */
     public String createPackage(String name, String description) throws SerializableException;
+    
+    /**
+     * This creates a package of the given name, and checks it in.
+     * @return UUID of the created item.
+     */
+    public String createSubPackage(String name, String description, String parentPackage) throws SerializableException;
 
     /**
      * Loads a package by its uuid.
@@ -569,5 +574,5 @@
                                           String firstSnapshotName,
                                           String secondSnapshotName);
     
-    public AnalysisReport verifyAsset(RuleAsset asset) throws SerializableException;
+    public AnalysisReport verifyAsset(RuleAsset asset, Set<String> activeWorkingSets) throws SerializableException;
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryServiceAsync.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryServiceAsync.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryServiceAsync.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -17,105 +17,101 @@
 
 
 
-import com.google.gwt.user.client.rpc.AsyncCallback;
+import org.drools.guvnor.client.common.GenericCallback;
+
 import com.google.gwt.user.client.rpc.RemoteService;
 
 /**
-
+ * 
  * This is what the remote service will implement, as a servlet.
-
- * (in hosted/debug mode, you could also use an implementation that was in-process).
-
+ * 
+ * (in hosted/debug mode, you could also use an implementation that was
+ * in-process).
  */
 
-public interface RepositoryServiceAsync
-    extends
-    RemoteService {
+public interface RepositoryServiceAsync extends RemoteService {
 
     /** PLACE THE FOLLOWING IN RepositoryServiceAsync.java **/
 
     /** Generated by AsyncInterfaceGenerator hackery */
-    public void loadChildCategories(java.lang.String p0, AsyncCallback<java.lang.String[]> cb);
-    public void loadRuleListForCategories(java.lang.String p0, int p1, int p2, java.lang.String p3, AsyncCallback<org.drools.guvnor.client.rpc.TableDataResult> cb);
-    public void loadRuleListForState(java.lang.String p0, int p1, int p2, java.lang.String p3, AsyncCallback<org.drools.guvnor.client.rpc.TableDataResult> cb);
-    public void loadTableConfig(java.lang.String p0, AsyncCallback<org.drools.guvnor.client.rpc.TableConfig> cb);
-    public void createCategory(java.lang.String p0, java.lang.String p1, java.lang.String p2, AsyncCallback<java.lang.Boolean> cb);
-    public void createNewRule(java.lang.String p0, java.lang.String p1, java.lang.String p2, java.lang.String p3, java.lang.String p4, AsyncCallback<java.lang.String> cb);
-    public void createNewImportedRule(java.lang.String p0, java.lang.String p1, AsyncCallback<java.lang.String> cb);
-    public void deleteUncheckedRule(java.lang.String p0, java.lang.String p1, AsyncCallback cb);
-    public void clearRulesRepository(AsyncCallback cb);
-    public void listPackages(AsyncCallback<org.drools.guvnor.client.rpc.PackageConfigData[]> cb);
-    public void loadGlobalPackage(AsyncCallback<org.drools.guvnor.client.rpc.PackageConfigData> cb);
-    public void listArchivedPackages(AsyncCallback<org.drools.guvnor.client.rpc.PackageConfigData[]> cb);
-    public void loadRuleAsset(java.lang.String p0, AsyncCallback<org.drools.guvnor.client.rpc.RuleAsset> cb);
-    public void loadRuleAssets(java.lang.String[] p0, AsyncCallback<org.drools.guvnor.client.rpc.RuleAsset[]> cb);
-    public void loadAssetHistory(java.lang.String p0, AsyncCallback<org.drools.guvnor.client.rpc.TableDataResult> cb);
-    public void loadArchivedAssets(int p0, int p1, AsyncCallback<org.drools.guvnor.client.rpc.TableDataResult> cb);
-    public void checkinVersion(org.drools.guvnor.client.rpc.RuleAsset p0, AsyncCallback<java.lang.String> cb);
-    public void restoreVersion(java.lang.String p0, java.lang.String p1, java.lang.String p2, AsyncCallback cb);
-    public void createPackage(java.lang.String p0, java.lang.String p1, AsyncCallback<java.lang.String> cb);
-    public void loadPackageConfig(java.lang.String p0, AsyncCallback<org.drools.guvnor.client.rpc.PackageConfigData> cb);
-    public void savePackage(org.drools.guvnor.client.rpc.PackageConfigData p0, AsyncCallback<org.drools.guvnor.client.rpc.ValidatedResponse> cb);
-    public void listAssets(java.lang.String p0, java.lang.String[] p1, int p2, int p3, java.lang.String p4, AsyncCallback<org.drools.guvnor.client.rpc.TableDataResult> cb);
-    public void listStates(AsyncCallback<java.lang.String[]> cb);
-    public void createState(java.lang.String p0, AsyncCallback<java.lang.String> cb);
-    public void renameState(java.lang.String p0, java.lang.String p1, AsyncCallback cb);
-    public void removeState(java.lang.String p0, AsyncCallback cb);
-    public void changeState(java.lang.String p0, java.lang.String p1, boolean p2, AsyncCallback cb);
-    public void changeAssetPackage(java.lang.String p0, java.lang.String p1, java.lang.String p2, AsyncCallback cb);
-    public void promoteAssetToGlobalArea(java.lang.String p0, AsyncCallback cb);
-    public void copyAsset(java.lang.String p0, java.lang.String p1, java.lang.String p2, AsyncCallback<java.lang.String> cb);
-    public void copyPackage(java.lang.String p0, java.lang.String p1, AsyncCallback cb);
-    public void listSnapshots(java.lang.String p0, AsyncCallback<org.drools.guvnor.client.rpc.SnapshotInfo[]> cb);
-    public void createPackageSnapshot(java.lang.String p0, java.lang.String p1, boolean p2, java.lang.String p3, AsyncCallback cb);
-    public void copyOrRemoveSnapshot(java.lang.String p0, java.lang.String p1, boolean p2, java.lang.String p3, AsyncCallback cb);
-    public void quickFindAsset(java.lang.String p0, boolean p1, int p2, int p3, AsyncCallback<org.drools.guvnor.client.rpc.TableDataResult> cb);
-    public void removeCategory(java.lang.String p0, AsyncCallback cb);
-    public void loadSuggestionCompletionEngine(java.lang.String p0, AsyncCallback<org.drools.guvnor.client.modeldriven.SuggestionCompletionEngine> cb);
-    public void buildPackage(java.lang.String p0, boolean p1, java.lang.String p2, java.lang.String p3, java.lang.String p4, boolean p5, java.lang.String p6, java.lang.String p7, boolean p8, java.lang.String p9, AsyncCallback<org.drools.guvnor.client.rpc.BuilderResult> cb);
-    public void getCustomSelectors(AsyncCallback<java.lang.String[]> cb);
-    public void buildPackageSource(java.lang.String p0, AsyncCallback<java.lang.String> cb);
-    public void buildAssetSource(org.drools.guvnor.client.rpc.RuleAsset p0, AsyncCallback<java.lang.String> cb);
-    public void buildAsset(org.drools.guvnor.client.rpc.RuleAsset p0, AsyncCallback<org.drools.guvnor.client.rpc.BuilderResult> cb);
-    public void renameAsset(java.lang.String p0, java.lang.String p1, AsyncCallback<java.lang.String> cb);
-    public void renameCategory(java.lang.String p0, java.lang.String p1, AsyncCallback cb);
-    public void archiveAsset(java.lang.String p0, boolean p1, AsyncCallback cb);
-    public void archiveAssets(java.lang.String[] p0, boolean p1, AsyncCallback cb);
-    public void removeAsset(java.lang.String p0, AsyncCallback cb);
-    public void removeAssets(java.lang.String[] p0, AsyncCallback cb);
-    public void removePackage(java.lang.String p0, AsyncCallback cb);
-    public void renamePackage(java.lang.String p0, java.lang.String p1, AsyncCallback<java.lang.String> cb);
-    public void rebuildSnapshots(AsyncCallback cb);
-    public void rebuildPackages(AsyncCallback cb);
-    public void listRulesInPackage(java.lang.String p0, AsyncCallback<java.lang.String[]> cb);
-    public void runScenario(java.lang.String p0, org.drools.guvnor.client.modeldriven.testing.Scenario p1, AsyncCallback<org.drools.guvnor.client.rpc.SingleScenarioResult> cb);
-    public void runScenariosInPackage(java.lang.String p0, AsyncCallback<org.drools.guvnor.client.rpc.BulkTestRunResult> cb);
-    public void analysePackage(java.lang.String p0, AsyncCallback<org.drools.guvnor.client.rpc.AnalysisReport> cb);
-    public void listTypesInPackage(java.lang.String p0, AsyncCallback<java.lang.String[]> cb);
-    public void showLog(AsyncCallback<org.drools.guvnor.client.rpc.LogEntry[]> cb);
-    public void cleanLog(AsyncCallback cb);
-    public void loadDropDownExpression(java.lang.String[] p0, java.lang.String p1, AsyncCallback<java.lang.String[]> cb);
-    public void queryFullText(java.lang.String p0, boolean p1, int p2, int p3, AsyncCallback<org.drools.guvnor.client.rpc.TableDataResult> cb);
-    public void queryMetaData(org.drools.guvnor.client.rpc.MetaDataQuery[] p0, java.util.Date p1, java.util.Date p2, java.util.Date p3, java.util.Date p4, boolean p5, int p6, int p7, AsyncCallback<org.drools.guvnor.client.rpc.TableDataResult> cb);
-    public void listUserPermissions(AsyncCallback cb);
-    public void retrieveUserPermissions(java.lang.String p0, AsyncCallback cb);
-    public void updateUserPermissions(java.lang.String p0, java.util.Map p1, AsyncCallback cb);
-    public void listAvailablePermissionTypes(AsyncCallback<java.lang.String[]> cb);
-    public void deleteUser(java.lang.String p0, AsyncCallback cb);
-    public void createUser(java.lang.String p0, AsyncCallback cb);
-    public void getAssetLockerUserName(java.lang.String p0, AsyncCallback<java.lang.String> cb);
-    public void lockAsset(java.lang.String p0, AsyncCallback cb);
-    public void unLockAsset(java.lang.String p0, AsyncCallback cb);
-    public void installSampleRepository(AsyncCallback cb);
-    public void loadDiscussionForAsset(java.lang.String p0, AsyncCallback cb);
-    public void addToDiscussionForAsset(java.lang.String p0, java.lang.String p1, AsyncCallback cb);
-    public void clearAllDiscussionsForAsset(java.lang.String p0, AsyncCallback cb);
-    public void subscribe(AsyncCallback cb);
-    public void loadInbox(java.lang.String p0, AsyncCallback<org.drools.guvnor.client.rpc.TableDataResult> cb);
-    public void compareSnapshots(java.lang.String p0, java.lang.String p1, java.lang.String p2, AsyncCallback<org.drools.guvnor.client.rpc.SnapshotDiffs> cb);
-    public void verifyAsset(RuleAsset asset,
-                            AsyncCallback<AnalysisReport> asyncCallback);
-
-
-
+	void addToDiscussionForAsset(java.lang.String assetId, java.lang.String comment, com.google.gwt.user.client.rpc.AsyncCallback<java.util.List<org.drools.guvnor.client.rpc.DiscussionRecord>> arg3);
+	void analysePackage(java.lang.String packageUUID, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.AnalysisReport> arg2);
+	void archiveAsset(java.lang.String uuid, boolean value, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg3);
+	void archiveAssets(java.lang.String[] uuids, boolean value, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg3);
+	void buildAsset(org.drools.guvnor.client.rpc.RuleAsset asset, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.BuilderResult> arg2);
+	void buildAssetSource(org.drools.guvnor.client.rpc.RuleAsset asset, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.String> arg2);
+	void buildPackage(java.lang.String packageUUID, boolean force, java.lang.String buildMode, java.lang.String operator, java.lang.String statusDescriptionValue, boolean enableStatusSelector, java.lang.String categoryOperator, java.lang.String category, boolean enableCategorySelector, java.lang.String customSelectorName, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.BuilderResult> arg11);
+	void buildPackageSource(java.lang.String packageUUID, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.String> arg2);
+	void changeAssetPackage(java.lang.String uuid, java.lang.String newPackage, java.lang.String comment, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg4);
+	void changeState(java.lang.String uuid, java.lang.String newState, boolean wholePackage, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg4);
+	void checkinVersion(org.drools.guvnor.client.rpc.RuleAsset asset, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.String> arg2);
+	void cleanLog(com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg1);
+	void clearAllDiscussionsForAsset(java.lang.String assetId, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg2);
+	void clearRulesRepository(com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg1);
+	void compareSnapshots(java.lang.String packageName, java.lang.String firstSnapshotName, java.lang.String secondSnapshotName, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.SnapshotDiffs> arg4);
+	void copyAsset(java.lang.String assetUUID, java.lang.String newPackage, java.lang.String newName, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.String> arg4);
+	void copyOrRemoveSnapshot(java.lang.String packageName, java.lang.String snapshotName, boolean delete, java.lang.String newSnapshotName, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg5);
+	void copyPackage(java.lang.String sourcePackageName, java.lang.String destPackageName, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg3);
+	void createCategory(java.lang.String path, java.lang.String name, java.lang.String description, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Boolean> arg4);
+	void createNewImportedRule(java.lang.String sharedAssetName, java.lang.String initialPackage, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.String> arg3);
+	void createNewRule(java.lang.String ruleName, java.lang.String description, java.lang.String initialCategory, java.lang.String initialPackage, java.lang.String format, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.String> arg6);
+	void createPackage(java.lang.String name, java.lang.String description, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.String> arg3);
+	void createPackageSnapshot(java.lang.String packageName, java.lang.String snapshotName, boolean replaceExisting, java.lang.String comment, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg5);
+	void createState(java.lang.String name, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.String> arg2);
+	void createSubPackage(java.lang.String name, java.lang.String description, java.lang.String parentPackage, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.String> arg4);
+	void createUser(java.lang.String userName, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg2);
+	void deleteUncheckedRule(java.lang.String ruleName, java.lang.String initialPackage, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg3);
+	void deleteUser(java.lang.String userName, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg2);
+	void getAssetLockerUserName(java.lang.String uuid, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.String> arg2);
+	void getCustomSelectors(com.google.gwt.user.client.rpc.AsyncCallback<java.lang.String[]> arg1);
+	void installSampleRepository(com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg1);
+	void listArchivedPackages(com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.PackageConfigData[]> arg1);
+	void listAssets(java.lang.String packageUUID, java.lang.String[] formats, int skip, int numRows, java.lang.String tableConfig, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.TableDataResult> arg6);
+	void listAvailablePermissionTypes(com.google.gwt.user.client.rpc.AsyncCallback<java.lang.String[]> arg1);
+	void listPackages(com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.PackageConfigData[]> arg1);
+	void listRulesInPackage(java.lang.String packageName, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.String[]> arg2);
+	void listSnapshots(java.lang.String packageName, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.SnapshotInfo[]> arg2);
+	void listStates(com.google.gwt.user.client.rpc.AsyncCallback<java.lang.String[]> arg1);
+	void listTypesInPackage(java.lang.String packageUUID, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.String[]> arg2);
+	void listUserPermissions(com.google.gwt.user.client.rpc.AsyncCallback<java.util.Map<java.lang.String, java.util.List<java.lang.String>>> arg1);
+	void loadArchivedAssets(int skip, int numRows, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.TableDataResult> arg3);
+	void loadAssetHistory(java.lang.String uuid, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.TableDataResult> arg2);
+	void loadChildCategories(java.lang.String categoryPath, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.String[]> arg2);
+	void loadDiscussionForAsset(java.lang.String assetId, com.google.gwt.user.client.rpc.AsyncCallback<java.util.List<org.drools.guvnor.client.rpc.DiscussionRecord>> arg2);
+	void loadDropDownExpression(java.lang.String[] valuePairs, java.lang.String expression, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.String[]> arg3);
+	void loadGlobalPackage(com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.PackageConfigData> arg1);
+	void loadInbox(java.lang.String inboxName, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.TableDataResult> arg2);
+	void loadPackageConfig(java.lang.String uuid, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.PackageConfigData> arg2);
+	void loadRuleAsset(java.lang.String UUID, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.RuleAsset> arg2);
+	void loadRuleAssets(java.lang.String[] UUIDs, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.RuleAsset[]> arg2);
+	void loadRuleListForCategories(java.lang.String categoryPath, int skip, int numRows, java.lang.String tableConfig, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.TableDataResult> arg5);
+	void loadRuleListForState(java.lang.String state, int skip, int numRows, java.lang.String tableConfig, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.TableDataResult> arg5);
+	void loadSuggestionCompletionEngine(java.lang.String packageName, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.modeldriven.SuggestionCompletionEngine> arg2);
+	void loadTableConfig(java.lang.String listName, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.TableConfig> arg2);
+	void lockAsset(java.lang.String uuid, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg2);
+	void promoteAssetToGlobalArea(java.lang.String assetUUID, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg2);
+	void queryFullText(java.lang.String text, boolean seekArchived, int skip, int numRows, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.TableDataResult> arg5);
+	void queryMetaData(org.drools.guvnor.client.rpc.MetaDataQuery[] qr, java.util.Date createdAfter, java.util.Date createdBefore, java.util.Date modifiedAfter, java.util.Date modifiedBefore, boolean seekArchived, int skip, int numRows, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.TableDataResult> arg9);
+	void quickFindAsset(java.lang.String searchText, boolean searchArchived, int skip, int numRows, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.TableDataResult> arg5);
+	void rebuildPackages(com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg1);
+	void rebuildSnapshots(com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg1);
+	void removeAsset(java.lang.String uuid, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg2);
+	void removeAssets(java.lang.String[] uuids, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg2);
+	void removeCategory(java.lang.String categoryPath, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg2);
+	void removePackage(java.lang.String uuid, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg2);
+	void removeState(java.lang.String name, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg2);
+	void renameAsset(java.lang.String uuid, java.lang.String newName, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.String> arg3);
+	void renameCategory(java.lang.String fullPathAndName, java.lang.String newName, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg3);
+	void renamePackage(java.lang.String uuid, java.lang.String newName, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.String> arg3);
+	void renameState(java.lang.String oldName, java.lang.String newName, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg3);
+	void restoreVersion(java.lang.String versionUUID, java.lang.String assetUUID, java.lang.String comment, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg4);
+	void retrieveUserPermissions(java.lang.String userName, com.google.gwt.user.client.rpc.AsyncCallback<java.util.Map<java.lang.String, java.util.List<java.lang.String>>> arg2);
+	void runScenario(java.lang.String packageName, org.drools.guvnor.client.modeldriven.testing.Scenario scenario, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.SingleScenarioResult> arg3);
+	void runScenariosInPackage(java.lang.String packageUUID, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.BulkTestRunResult> arg2);
+	void savePackage(org.drools.guvnor.client.rpc.PackageConfigData data, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.ValidatedResponse> arg2);
+	void showLog(com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.LogEntry[]> arg1);
+	void subscribe(com.google.gwt.user.client.rpc.AsyncCallback<java.util.List<org.drools.guvnor.client.rpc.PushResponse>> arg1);
+	void unLockAsset(java.lang.String uuid, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg2);
+	void updateUserPermissions(java.lang.String userName, java.util.Map<java.lang.String, java.util.List<java.lang.String>> perms, com.google.gwt.user.client.rpc.AsyncCallback<java.lang.Void> arg3);
+	void verifyAsset(org.drools.guvnor.client.rpc.RuleAsset asset, java.util.Set<String> sactiveWorkingSets, com.google.gwt.user.client.rpc.AsyncCallback<org.drools.guvnor.client.rpc.AnalysisReport> arg2);
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryServiceFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryServiceFactory.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryServiceFactory.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -29,32 +29,29 @@
 
     public static RepositoryServiceAsync SERVICE;
 
-    public static RepositoryServiceAsync getService() {
-        if (SERVICE == null) {
-            loadService();
-        }
-        return SERVICE;
+	public static RepositoryServiceAsync getService() {
+		if (SERVICE == null) {
+			loadService();
+		}
+		return SERVICE;
 
-    }
+	}
 
-    private static void loadService() {
-            SERVICE = getRealService();
-    }
+	private static void loadService() {
+		SERVICE = getRealService();
+	}
 
+	private static RepositoryServiceAsync getRealService() {
+		// define the service you want to call
+		RepositoryServiceAsync svc = (RepositoryServiceAsync) GWT.create(RepositoryService.class);
+		ServiceDefTarget endpoint = (ServiceDefTarget) svc;
 
+		String endpointURL = GWT.getModuleBaseURL() + "guvnorService";
 
-    private static RepositoryServiceAsync getRealService() {
-        // define the service you want to call
-        RepositoryServiceAsync svc =
-            (RepositoryServiceAsync) GWT.create(RepositoryService.class);
-        ServiceDefTarget endpoint = (ServiceDefTarget) svc;
+		endpoint.setServiceEntryPoint(endpointURL);
+		return svc;
+	}
 
-        String endpointURL = GWT.getModuleBaseURL() + "guvnorService";
-
-        endpoint.setServiceEntryPoint(endpointURL);
-        return svc;
-    }
-
     /**
      * Perform the login.
      */

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/WorkingSetConfigData.java (from rev 32184, labs/jbossrules/branches/factsConstraints_baunax_esteban/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/WorkingSetConfigData.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/WorkingSetConfigData.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/WorkingSetConfigData.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,21 @@
+package org.drools.guvnor.client.rpc;
+
+import java.util.List;
+
+import org.drools.guvnor.client.factcontraints.Constraint;
+import org.drools.guvnor.client.modeldriven.brl.PortableObject;
+
+import com.google.gwt.user.client.rpc.IsSerializable;
+
+/**
+ * 
+ * @author bauna
+ */
+public class WorkingSetConfigData implements PortableObject, IsSerializable {
+	public String name;
+	public String description;
+	public List<Constraint> constraints;
+	
+	public String[] validFacts;
+	public WorkingSetConfigData[] workingSets;	
+}

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-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/ActionToolbar.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -16,6 +16,8 @@
  * limitations under the License.
  */
 
+import java.util.Set;
+
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.Timer;
@@ -39,8 +41,10 @@
 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.RuleModeller;
 import org.drools.guvnor.client.security.Capabilities;
 import org.drools.guvnor.client.packages.PackageBuilderWidget;
+import org.drools.guvnor.client.packages.WorkingSetManager;
 
 /**
  * This contains the widgets used to action a rule asset
@@ -219,6 +223,19 @@
                                                         moreMenu );
 
         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 );
+            }
+
             ToolbarButton validate = new ToolbarButton();
             validate.setText( constants.Validate() );
             validate.addListener( new ButtonListenerAdapter() {
@@ -282,7 +299,9 @@
     private void doVerify() {
         onSave();
         LoadingPopup.showMessage( constants.VerifyingItemPleaseWait() );
-        RepositoryServiceFactory.getService().verifyAsset( asset,
+        Set<String> activeWorkingSets = null;
+        activeWorkingSets = WorkingSetManager.getInstance().getActiveAssetUUIDs(asset.metaData.packageName);
+        RepositoryServiceFactory.getService().verifyAsset( asset, activeWorkingSets, 
                                                            new AsyncCallback<AnalysisReport>() {
 
                                                                public void onSuccess(AnalysisReport report) {
@@ -386,6 +405,22 @@
         pop.show();
     }
 
+    protected void showWorkingSetsSelection(RuleModeller modeller) {
+        final WorkingSetSelectorPopup pop = new WorkingSetSelectorPopup(modeller,asset);
+
+
+        /*
+        pop.setCommand( new Command() {
+            public void execute() {
+                checkinAction.doCheckin( pop.getCheckinComment() );
+                if ( afterCheckinEvent != null ) afterCheckinEvent.execute();
+            }
+        } );
+
+         */
+        pop.show();
+    }
+
     public static interface CheckinAction {
         void doCheckin(String comment);
     }

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/ConstraintEditor.java (from rev 32184, labs/jbossrules/branches/factsConstraints_baunax_esteban/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/ConstraintEditor.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/ConstraintEditor.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/ConstraintEditor.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,78 @@
+package org.drools.guvnor.client.ruleeditor;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.MissingResourceException;
+
+import org.drools.guvnor.client.factcontraints.Constraint;
+import org.drools.guvnor.client.messages.Constants;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.ui.ChangeListener;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.Grid;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.TextBox;
+import com.google.gwt.user.client.ui.Widget;
+
+public class ConstraintEditor extends Composite {
+	private Constants constants =  GWT.create(Constants.class);
+	private Constraint constraint;
+
+	public ConstraintEditor(Constraint constraint) {
+		this.constraint = constraint;
+		
+		Grid confGrid = new Grid(constraint.getArgumentKeys().size(), 2);
+		
+		ArrayList<String> list = new ArrayList<String>();
+		Map<String, String> argI18N = new HashMap<String, String>();
+		for (String arg : constraint.getArgumentKeys()) {
+			String i18n = getI18NText(arg);
+			list.add(i18n);
+			argI18N.put(i18n, arg);
+		}
+		Collections.sort(list);
+		
+		int row = 0;
+		for (String arg : list) {
+			TextBox argTB = new TextBox();
+			argTB.setText(getConstraint().getArgumentValue(arg).toString());
+			argTB.setName(argI18N.get(arg));
+			argTB.setTitle(arg);
+			argTB.addChangeListener(new ChangeListener() {
+				public void onChange(Widget sender) {
+					TextBox argTB = (TextBox) sender;
+					getConstraint().setArgumentValue(argTB.getName(), argTB.getText());
+				}
+			});
+			
+			confGrid.setWidget(row, 0, new Label(arg + ":"));
+			confGrid.setWidget(row, 1, argTB);
+			row++;
+		}
+		
+		initWidget(confGrid);
+	}
+	
+	private String getI18NText(String s) {
+		try {
+			return constants.getString("constraint." + getConstraintName() + "." + s);
+		} catch (MissingResourceException e) {
+			return s;
+		}
+	}
+
+	public Constraint getConstraint() {
+		return constraint;
+	}
+
+	public void setConstraint(Constraint constraint) {
+		this.constraint = constraint;
+	}
+	
+	public String getConstraintName() {
+		return getConstraint().getConstraintName();
+	}
+ }

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-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/EditorLauncher.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -52,60 +52,50 @@
     /**
      * This will return the appropriate viewer for the asset.
      */
-    public static Widget getEditorViewer(RuleAsset asset,
-                                         RuleViewer viewer) {
-        RulePackageSelector.currentlySelectedPackage = asset.metaData.packageName;
-        //depending on the format, load the appropriate editor
-        if ( asset.metaData.format.equals( AssetFormats.BUSINESS_RULE ) ) {
+	public static Widget getEditorViewer(RuleAsset asset, RuleViewer viewer) {
+		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);
+		} 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)
+				&& Preferences.getBooleanPref("flex-bpel-editor")) {
+			return new BPELWrapper(asset, viewer);
+		} else if (asset.metaData.format.equals(AssetFormats.MODEL)) {
+			return new ModelAttachmentFileWidget(asset, viewer);
+		} else if (asset.metaData.format.equals(AssetFormats.DECISION_SPREADSHEET_XLS)) {
+			return new DecisionTableXLSWidget(asset, viewer);
+		} else if (asset.metaData.format.equals(AssetFormats.RULE_FLOW_RF)) {
+			return new RuleFlowWrapper(asset, viewer);
+		} else if (asset.metaData.format.equals(AssetFormats.BPMN2_PROCESS)) {
+			return new RuleFlowWrapper(asset, viewer);
+		} else if (asset.metaData.format.equals(AssetFormats.DRL)) {
+			return new DrlEditor(asset);
+		} else if (asset.metaData.format.equals(AssetFormats.ENUMERATION)) {
+			return new DefaultRuleContentWidget(asset);
+		} else if (asset.metaData.format.equals(AssetFormats.TEST_SCENARIO)) {
+			return new ScenarioWidget(asset);
+		} else if (asset.metaData.format.equals(AssetFormats.DECISION_TABLE_GUIDED)) {
+			return new GuidedDecisionTableWidget(asset);
+		} else if (asset.metaData.format.equals(AssetFormats.DRL_MODEL)) {
+			return new FactModelWidget(asset);
+		} else if (asset.metaData.format.equals(AssetFormats.DSL)) {
+			return new DefaultRuleContentWidget(asset);
+		} else if (asset.metaData.format.equals(AssetFormats.PROPERTIES)) {
+			return new PropertiesWidget(asset, viewer);
+		} else if (asset.metaData.format.equals(AssetFormats.XML)) {
+			return new XmlFileWidget(asset, viewer);
+		} else if (asset.metaData.format.equals(AssetFormats.FUNCTION)) {
+			return new FunctionEditor(asset);
+		} else if (asset.metaData.format.equals(AssetFormats.WORKING_SET)) {
+			return new WorkingSetEditor(asset);
+		} else {
+			return new DefaultContentUploadEditor(asset, viewer);
+		}
 
-            return new RuleModeller( asset );
-            //return new RuleModeller( asset  );
-        } 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 ) && Preferences.getBooleanPref( "flex-bpel-editor" ) ) {
-            return new BPELWrapper( asset,
-                                    viewer );
-        } else if ( asset.metaData.format.equals( AssetFormats.MODEL ) ) {
-            return new ModelAttachmentFileWidget( asset,
-                                                  viewer );
-        } else if ( asset.metaData.format.equals( AssetFormats.DECISION_SPREADSHEET_XLS ) ) {
-            return new DecisionTableXLSWidget( asset,
-                                               viewer );
+	}
 
-        } else if ( asset.metaData.format.equals( AssetFormats.RULE_FLOW_RF ) ) {
-            return new RuleFlowWrapper( asset,
-                                        viewer );
-        } else if ( asset.metaData.format.equals( AssetFormats.BPMN2_PROCESS ) ) {
-            return new RuleFlowWrapper( asset,
-                                        viewer );
-        } else if ( asset.metaData.format.equals( AssetFormats.DRL ) ) {
-            return new DrlEditor( asset );
-        } else if ( asset.metaData.format.equals( AssetFormats.ENUMERATION ) ) {
-            return new DefaultRuleContentWidget( asset );
-        } else if ( asset.metaData.format.equals( AssetFormats.TEST_SCENARIO ) ) {
-            return new ScenarioWidget( asset );
-        } else if ( asset.metaData.format.equals( AssetFormats.DECISION_TABLE_GUIDED ) ) {
-            return new GuidedDecisionTableWidget( asset );
-        } else if ( asset.metaData.format.equals( AssetFormats.DRL_MODEL ) ) {
-            return new FactModelWidget( asset );
-        } else if ( asset.metaData.format.equals( AssetFormats.DSL ) ) {
-            return new DefaultRuleContentWidget( asset );
-        } else if ( asset.metaData.format.equals( AssetFormats.PROPERTIES ) ) {
-            return new PropertiesWidget( asset,
-                                         viewer );
-        } else if ( asset.metaData.format.equals( AssetFormats.XML ) ) {
-            return new XmlFileWidget( asset,
-                                      viewer );
-        } else if ( asset.metaData.format.equals( AssetFormats.FUNCTION ) ) {
-            return new FunctionEditor( asset );
-        } else {
-            return new DefaultContentUploadEditor( asset,
-                                                   viewer );
-        }
-
-    }
-
     private static Map<String, String> getTypeImages() {
         Map<String, String> result = new HashMap<String, String>();
 

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/NewAssetWizard.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/NewAssetWizard.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/NewAssetWizard.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -26,11 +26,11 @@
 import org.drools.guvnor.client.common.GlobalAreaAssetSelector;
 import org.drools.guvnor.client.common.LoadingPopup;
 import org.drools.guvnor.client.common.RulePackageSelector;
+import org.drools.guvnor.client.messages.Constants;
 import org.drools.guvnor.client.rpc.RepositoryServiceFactory;
 import org.drools.guvnor.client.rulelist.EditItemEvent;
-import org.drools.guvnor.client.messages.Constants;
-import org.drools.guvnor.client.modeldriven.brl.ISingleFieldConstraint;
 
+import com.google.gwt.core.client.GWT;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.ui.Button;
@@ -45,7 +45,6 @@
 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.google.gwt.core.client.GWT;
 import com.gwtext.client.util.Format;
 
 /**
@@ -57,7 +56,7 @@
     private Constants constants = GWT.create(Constants.class);
     
     private TextBox                name        = new TextBox();
-    private TextBox                importedAssetName        = new TextBox();
+//    private TextBox                importedAssetName        = new TextBox();
     private TextArea               description = new TextArea();
     private String                 initialCategory;
     
@@ -109,15 +108,15 @@
 
 		addRow(newAssetLayout);
 		addRow(importAssetLayout); 
-			
         
 		//layout for new asset.
 		newAssetLayout.addAttribute( constants.NameColon(), name );        	
 
-        this.setAfterShow(new Command() {
+		this.setAfterShow(new Command() {
 			public void execute() {
-				name.setFocus(true);			}
-        });
+				name.setFocus(true);
+			}
+		});
 
         if (showCats) {
         	newAssetLayout.addAttribute(constants.InitialCategory(), getCatChooser());
@@ -125,7 +124,7 @@
 
         if (format == null) {
         	newAssetLayout.addAttribute(constants.TypeFormatOfRule(), this.formatChooser );
-        } else if (format == "*") { //NON-NLS
+        } else if ("*".equals(format)) { //NON-NLS
         	final TextBox fmt = new TextBox();
         	newAssetLayout.addAttribute(constants.FileExtensionTypeFormat(), fmt);
         	fmt.addChangeListener(new ChangeListener() {
@@ -142,7 +141,6 @@
 		newAssetLayout.addAttribute("", hp);
 		newAssetLayout.addAttribute("", createInGlobalButton);
 
-		
         //newAssetLayout.addAttribute(constants.Package() + ":", packageSelector);
 
         description.setVisibleLines( 4 );
@@ -156,26 +154,25 @@
 
         newAssetLayout.addAttribute(constants.InitialDescription(), description);
 
-        Button ok = new Button( constants.OK() );
-        ok.addClickListener( new ClickListener() {
-            public void onClick(Widget arg0) {
-                ok();
-            }
-        } );
+		Button ok = new Button(constants.OK());
+		ok.addClickListener(new ClickListener() {
+			public void onClick(Widget arg0) {
+				ok();
+			}
+		});
 
-        newAssetLayout.addAttribute( "", ok );
+		newAssetLayout.addAttribute("", ok);
         
         //layout for importing share asset from global area.
         importAssetLayout.addAttribute(constants.AssetToImport(), globalAreaAssetSelector);
         importAssetLayout.addAttribute(constants.Package() + ":", importedPackageSelector);
 
-        Button linkedAssetOKButton = new Button( constants.OK() );
-        linkedAssetOKButton.addClickListener( new ClickListener() {
-            public void onClick(Widget arg0) {
-                importOK();
-            }
-
-        } );
+		Button linkedAssetOKButton = new Button(constants.OK());
+		linkedAssetOKButton.addClickListener(new ClickListener() {
+			public void onClick(Widget arg0) {
+				importOK();
+			}
+		});
         importAssetLayout.addAttribute( "", linkedAssetOKButton );
         importAssetLayout.addRow( new HTML( "<br/><b>" + constants.NoteNewLinkedAsset() + "</b>" ) );
         importAssetLayout.addRow( new HTML( constants.NewLinkedAssetDesc1() ) );
@@ -223,64 +220,55 @@
 		}
 
         String fmt = getFormat();
-        if (fmt == null || fmt.equals("*")) {
+        if ("*".equals(fmt)) {
         	Window.alert(constants.PleaseEnterAFormatFileType());
         	return;
         }
-
         
-        GenericCallback cb = new GenericCallback() {
-            public void onSuccess(Object result) {
-            		String uuid = (String) result;
-            		if (uuid.startsWith("DUPLICATE")) { //NON-NLS
-            			LoadingPopup.close();
-            			Window.alert(constants.AssetNameAlreadyExistsPickAnother());
-            		} else {
-            			openEditor((String) result);
-            			hide();
-            		}
-            }
-        };
+		GenericCallback<String> cb = new GenericCallback<String>() {
+			public void onSuccess(String uuid) {
+				if (uuid.startsWith("DUPLICATE")) { // NON-NLS
+					LoadingPopup.close();
+					Window.alert(constants.AssetNameAlreadyExistsPickAnother());
+				} else {
+					openEditor(uuid);
+					hide();
+				}
+			}
+		};
         
-        String selectedPackage;
-        if (createInGlobalButton.isChecked()) {
-        	selectedPackage = "globalArea";
-        } else {
-        	selectedPackage = packageSelector.getSelectedPackage();
-        }
+		String selectedPackage;
+		if (createInGlobalButton.isChecked()) {
+			selectedPackage = "globalArea";
+		} else {
+			selectedPackage = packageSelector.getSelectedPackage();
+		}
 
-
-        LoadingPopup.showMessage( constants.PleaseWaitDotDotDot() );
-        RepositoryServiceFactory.getService().createNewRule( name.getText(),
-                                                          description.getText(),
-                                                          initialCategory,
-                                                          selectedPackage,
-                                                          getFormat(),
-                                                          cb );
+		LoadingPopup.showMessage(constants.PleaseWaitDotDotDot());
+		RepositoryServiceFactory.getService().createNewRule(name.getText(), description.getText(), initialCategory,
+				selectedPackage, getFormat(), cb);
     }
 
     /**
      * When Import OK is pressed, it will update the repository with the imported asset.
      */
-    void importOK() {
-        GenericCallback cb = new GenericCallback() {
-            public void onSuccess(Object result) {
-            		String uuid = (String) result;
-            		if (uuid.startsWith("DUPLICATE")) { //NON-NLS
-            			LoadingPopup.close();
-            			Window.alert(constants.AssetNameAlreadyExistsPickAnother());
-            		} else {
-            			openEditor((String) result);
-            			hide();
-            		}
-            }
-        };
+	void importOK() {
+		GenericCallback<String> cb = new GenericCallback<String>() {
+			public void onSuccess(String uuid) {
+				if (uuid.startsWith("DUPLICATE")) { // NON-NLS
+					LoadingPopup.close();
+					Window.alert(constants.AssetNameAlreadyExistsPickAnother());
+				} else {
+					openEditor(uuid);
+					hide();
+				}
+			}
+		};
 
-        LoadingPopup.showMessage( constants.PleaseWaitDotDotDot() );
-        RepositoryServiceFactory.getService().createNewImportedRule(globalAreaAssetSelector.getSelectedAsset(),
-                                                          importedPackageSelector.getSelectedPackage(),
-                                                          cb );
-    }
+		LoadingPopup.showMessage(constants.PleaseWaitDotDotDot());
+		RepositoryServiceFactory.getService().createNewImportedRule(globalAreaAssetSelector.getSelectedAsset(),
+				importedPackageSelector.getSelectedPackage(), cb);
+	}
 
     private String getFormat() {
         if (format != null) return format;
@@ -303,10 +291,9 @@
 	 * @param jsrPath
 	 */
 	public static boolean validatePathPerJSR170(String jsrPath) {
-		int len = jsrPath == null ? 0 : jsrPath.length();
-
+		int len = jsrPath == null ? 0 : jsrPath.trim().length();
 		if (len == 0) {
-			Window.alert(((Constants) GWT.create(Constants.class)).emptyNameIsNotAllowed());
+			Window.alert(GWT.<Constants>create(Constants.class).emptyNameIsNotAllowed());
 			return false;
 		}
 
@@ -324,7 +311,7 @@
 			case '*':
 			case '\'':
 			case '\"':
-                Window.alert(Format.format(((Constants) GWT.create(Constants.class)).NonValidJCRName(), jsrPath, ""+ c));
+				Window.alert(Format.format(GWT.<Constants>create(Constants.class).NonValidJCRName(), jsrPath, ""+ c));
 				return false;
 			default:
 			}

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/RuleViewer.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/RuleViewer.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/RuleViewer.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -478,8 +478,8 @@
         }
         if (Window.confirm(constants.PromoteAreYouSure()) ) {
             RepositoryServiceFactory.getService().promoteAssetToGlobalArea(asset.uuid,
-                    new GenericCallback<String>() {
-                        public void onSuccess(String data) {
+                    new GenericCallback<Void>() {
+                        public void onSuccess(Void data) {
                             Window.alert(constants.Promoted());
                             refreshMetaWidgetOnly();
                         }

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/WorkingSetEditor.java (from rev 32184, labs/jbossrules/branches/factsConstraints_baunax_esteban/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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/WorkingSetEditor.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,463 @@
+package org.drools.guvnor.client.ruleeditor;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.drools.guvnor.client.common.AssetFormats;
+import org.drools.guvnor.client.common.FormStylePopup;
+import org.drools.guvnor.client.common.ImageButton;
+import org.drools.guvnor.client.factconstraints.helper.ConstraintsContainer;
+import org.drools.guvnor.client.factconstraints.predefined.IntegerConstraint;
+import org.drools.guvnor.client.factconstraints.predefined.NotNullConstraint;
+import org.drools.guvnor.client.factconstraints.predefined.RangeConstraint;
+import org.drools.guvnor.client.factcontraints.Constraint;
+import org.drools.guvnor.client.messages.Constants;
+import org.drools.guvnor.client.modeldriven.SuggestionCompletionEngine;
+import org.drools.guvnor.client.packages.SuggestionCompletionCache;
+import org.drools.guvnor.client.rpc.RuleAsset;
+import org.drools.guvnor.client.rpc.WorkingSetConfigData;
+
+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.Composite;
+import com.google.gwt.user.client.ui.FlexTable;
+import com.google.gwt.user.client.ui.Grid;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.ListBox;
+import com.google.gwt.user.client.ui.VerticalPanel;
+import com.google.gwt.user.client.ui.Widget;
+import com.gwtext.client.widgets.Component;
+import com.gwtext.client.widgets.Panel;
+import com.gwtext.client.widgets.TabPanel;
+import com.gwtext.client.widgets.event.PanelListenerAdapter;
+
+public class WorkingSetEditor extends Composite {
+	private Constants constants =  GWT.create(Constants.class);
+	private RuleAsset workingSet;
+	
+	private ListBox availFacts = new ListBox(true);
+	private ListBox validFacts = new ListBox(true);
+	private ListBox factsCombo = new ListBox(false);
+	private boolean validFactsChanged = true;
+	private SuggestionCompletionEngine sce;
+	private ConstraintsContainer cc;
+	
+	public WorkingSetEditor(RuleAsset asset) {
+		if (!AssetFormats.WORKING_SET.equals(asset.metaData.format)) {
+			throw new IllegalArgumentException("asset must a be a workingset not a: " + asset.metaData.format);
+		}
+		workingSet = asset;
+		sce = SuggestionCompletionCache.getInstance().getEngineFromCache(asset.metaData.packageName);
+		WorkingSetConfigData wsData = (WorkingSetConfigData) workingSet.content;
+		cc = new ConstraintsContainer(wsData.constraints);
+		refreshWidgets();
+		setWidth( "100%" );
+	}
+	
+	private void refreshWidgets() {
+        WorkingSetConfigData wsData = (WorkingSetConfigData) workingSet.content;
+		
+		TabPanel tPanel = new TabPanel();
+		Panel pnl = new Panel();
+        pnl.setAutoWidth(true);
+        pnl.setClosable(false);
+        pnl.setTitle("WS Definition");
+        pnl.setAutoHeight(true);
+        pnl.add(buildDoubleList(wsData));
+		tPanel.add(pnl);
+		
+		pnl = new Panel();
+        pnl.setAutoWidth(true);
+        pnl.setClosable(false);
+        pnl.setTitle("WS Constraints");
+        pnl.setAutoHeight(true);
+        pnl.add(buildFactsConstraintsEditor(tPanel));
+		tPanel.add(pnl);
+		
+		tPanel.setActiveTab(0);
+		initWidget(tPanel);
+	}
+
+	private int lastSelectedFact = -1;
+	private int lastSelectedField = -1;
+	private int lastSelectedConstraint = -1;
+	private Widget buildFactsConstraintsEditor(TabPanel tPanel) {
+		
+		final ListBox fieldsCombo = new ListBox(false);
+		final ListBox constraintsCombo = new ListBox(false);
+		final VerticalPanel vpConstraintConf = new VerticalPanel();
+		
+		factsCombo.setVisibleItemCount(1);
+		fieldsCombo.setVisibleItemCount(1);
+		constraintsCombo.setVisibleItemCount(5);
+		
+		tPanel.addListener(new PanelListenerAdapter() {
+			@Override
+			public boolean doBeforeShow(Component component) {
+				fillSelectedFacts(factsCombo);
+				return true;
+			}
+		});
+		
+		factsCombo.addChangeListener(new ChangeListener() {
+			public void onChange(Widget sender) {
+				fillSelectedFactFields(factsCombo, fieldsCombo);
+			}
+		});
+		
+		fieldsCombo.addChangeListener(new ChangeListener() {
+			public void onChange(Widget sender) {
+				fillFieldConstrains(factsCombo, fieldsCombo, constraintsCombo, vpConstraintConf);
+			}
+		});
+		
+		Image addNewConstraint = new ImageButton("images/new_item.gif");
+        addNewConstraint.setTitle(constants.AddNewConstrain());
+
+        addNewConstraint.addClickListener( new ClickListener() {
+            public void onClick(Widget w) {
+                showNewConstrainPop(factsCombo, fieldsCombo, constraintsCombo);
+            }
+        });
+		
+        final FlexTable table = new FlexTable();
+        
+		VerticalPanel vp = new VerticalPanel();
+		vp.add(new Label(constants.FactTypes()));
+		vp.add(factsCombo);
+		table.setWidget(0, 0, vp);
+		
+		vp = new VerticalPanel();
+		vp.add(new Label(constants.Field()));
+		vp.add(fieldsCombo);
+		table.setWidget(1, 0, vp);
+		
+		vp = new VerticalPanel();
+		HorizontalPanel hp = new HorizontalPanel();
+		vp.add(new Label(constants.ConstraintsSection()));
+		hp.add(constraintsCombo);
+		hp.add(addNewConstraint);
+		vp.add(hp);
+		table.setWidget(2, 0, vp);
+		table.getFlexCellFormatter().setRowSpan(2, 0, 3);
+		
+		constraintsCombo.addChangeListener(new ChangeListener() {
+			public void onChange(Widget sender) {
+				showConstraintConfig(constraintsCombo, vpConstraintConf);
+			}
+		});
+		
+		vpConstraintConf.add(new Label(constants.ConstraintsSection()));
+		vpConstraintConf.add(new Label(""));
+		table.setWidget(0, 1, vpConstraintConf);
+		table.getFlexCellFormatter().setRowSpan(0, 1, 5);
+	
+		fillSelectedFacts(factsCombo);
+		fillSelectedFactFields(factsCombo, fieldsCombo);
+		fillFieldConstrains(factsCombo, fieldsCombo, constraintsCombo, vpConstraintConf);
+		showConstraintConfig(constraintsCombo, vpConstraintConf);
+		return table;
+	}
+
+	private void showConstraintConfig(ListBox constraintsCombo, VerticalPanel vpConstraintConf) {
+		if (constraintsCombo.getItemCount() == 0) {
+			vpConstraintConf.remove(vpConstraintConf.getWidgetCount() - 1);
+			vpConstraintConf.add(new Label());
+			return;
+		}
+		if (lastSelectedConstraint != constraintsCombo.getSelectedIndex()) {
+			Constraint c = contraintsMap.get(constraintsCombo.getValue(constraintsCombo.getSelectedIndex()));
+			ConstraintEditor editor = new ConstraintEditor(c);
+			vpConstraintConf.remove(vpConstraintConf.getWidgetCount() - 1);
+			vpConstraintConf.add(editor);
+			lastSelectedConstraint = constraintsCombo.getSelectedIndex();
+		}
+	}
+
+	private void showNewConstrainPop(final ListBox factsCombo, final ListBox fieldsCombo, final ListBox constraintsCombo) {
+        final FormStylePopup pop = new FormStylePopup("images/config.png", constants.AddNewConstrain()); //NON-NLS
+        final Button addbutton = new Button(constants.OK());
+        final ListBox consDefsCombo = new ListBox(false);
+
+        consDefsCombo.setVisibleItemCount(5);
+
+        addbutton.setTitle(constants.AddNewConstrain());
+        
+        consDefsCombo.addItem("NotNull");
+        consDefsCombo.addItem("Range");
+        consDefsCombo.addItem("Integer");
+        
+        addbutton.addClickListener( new ClickListener() {
+            public void onClick(Widget w) {
+            	String consDef = consDefsCombo.getItemText(consDefsCombo.getSelectedIndex());
+            	Constraint cons = null;
+            	if ("NotNull".equals(consDef)) {
+            		cons = new NotNullConstraint();
+            	} else if ("Range".equals(consDef)) {
+            		cons = new RangeConstraint();
+            	} else if ("Integer".equals(consDef)) {
+            		cons = new IntegerConstraint();
+            	}
+            	if (cons != null) {
+            		String factName = factsCombo.getItemText(lastSelectedFact);
+            		String fieldName = fieldsCombo.getItemText(lastSelectedField);
+            		cons.setFactType(factName);
+            		cons.setFieldName(fieldName);
+            		if (((WorkingSetConfigData) workingSet.content).constraints == null) {
+            			((WorkingSetConfigData) workingSet.content).constraints = new ArrayList<Constraint>();
+            		}
+            		((WorkingSetConfigData) workingSet.content).constraints.add(cons);
+            		constraintsCombo.addItem(cons.getConstraintName(), addContrainsMap(cons));
+            		getConstraintsConstrainer().addConstraint(cons);
+            		
+            	}
+            	pop.hide();
+
+            }
+        });
+
+        pop.addAttribute(constants.WillExtendTheFollowingRuleCalled(), consDefsCombo );
+        pop.addAttribute("", addbutton);
+
+        pop.show();
+	}
+
+	private void fillSelectedFacts(final ListBox factsCombo) {
+		if (validFactsChanged) {
+			String s = factsCombo.getSelectedIndex() != -1 ? factsCombo.getItemText(factsCombo.getSelectedIndex()) : "";
+			factsCombo.clear();
+			validFactsChanged = false;
+			for (int i = 0; i < validFacts.getItemCount(); i++) {
+				String itemText = validFacts.getItemText(i);
+				factsCombo.addItem(itemText);
+				if (s.equals(itemText)) {
+					factsCombo.setSelectedIndex(i);
+				}
+			}
+			lastSelectedFact = -1;
+		}
+	}
+
+	private void fillSelectedFactFields(final ListBox factsCombo, final ListBox fieldsCombo) {
+		if (lastSelectedFact != factsCombo.getSelectedIndex()) {
+			lastSelectedFact = factsCombo.getSelectedIndex();
+			String fact = factsCombo.getItemText(lastSelectedFact);
+			fieldsCombo.clear();
+			for(String field : getCompletionEngine().getFieldCompletions(fact)) {
+				fieldsCombo.addItem(field);
+			}
+			lastSelectedField = -1;
+		}
+	}
+
+	private Map<String, Constraint> contraintsMap = new HashMap<String, Constraint>();
+	private void fillFieldConstrains(final ListBox factsCombo, final ListBox fieldsCombo, final ListBox constraintsCombo, VerticalPanel vpConstraintConf) {
+		if (lastSelectedField != fieldsCombo.getSelectedIndex()) {
+			lastSelectedField = fieldsCombo.getSelectedIndex();
+			String fieldName = fieldsCombo.getItemText(lastSelectedField);
+			String factField = factsCombo.getItemText(lastSelectedFact);
+			constraintsCombo.clear();
+			contraintsMap.clear();
+			for (Constraint c : getConstraintsConstrainer().getConstraints(factField, fieldName)) {
+				constraintsCombo.addItem(c.getConstraintName(), addContrainsMap(c));
+			}
+			vpConstraintConf.remove(vpConstraintConf.getWidgetCount() - 1);
+			vpConstraintConf.add(new Label());
+			lastSelectedConstraint = -1;
+		}
+	}
+	
+	private String addContrainsMap(Constraint c) {
+		String id = "" + contraintsMap.size();
+		contraintsMap.put(id, c);
+		return id;
+	}
+	
+	private Grid buildDoubleList(WorkingSetConfigData wsData) {
+		Grid grid = new Grid(1, 3);
+		
+		SuggestionCompletionEngine sce = SuggestionCompletionCache.getInstance().getEngineFromCache(workingSet.metaData.packageName);
+		
+		Set<String> elem = new HashSet<String>();
+
+		availFacts.setVisibleItemCount(10);
+		validFacts.setVisibleItemCount(10);
+		
+		if (wsData.validFacts != null) {
+			elem.addAll(Arrays.asList(wsData.validFacts));
+			for (String factName : wsData.validFacts) {
+				validFacts.addItem(factName);
+			}
+		}
+			
+		for (String factName : sce.getFactTypes()) {
+			if (!elem.contains(factName)) {
+				availFacts.addItem(factName);
+			}
+		}
+		
+		Grid btnsPanel = new Grid(2,1);
+		
+		btnsPanel.setWidget(0, 0, new Button(">", new ClickListener() {
+			public void onClick(Widget sender) {
+				copySelected(availFacts, validFacts);
+				updateAsset(validFacts);
+				fillSelectedFacts(factsCombo);
+			}
+		}));
+
+		btnsPanel.setWidget(1, 0, new Button("&lt;", new ClickListener() {
+			public void onClick(Widget sender) {
+				copySelected(validFacts, availFacts);
+				updateAsset(validFacts);
+				fillSelectedFacts(factsCombo);
+			}
+		}));
+
+		grid.setWidget(0, 0, availFacts);
+		grid.setWidget(0, 1, btnsPanel);
+		grid.setWidget(0, 2, validFacts);
+		
+		grid.getColumnFormatter().setWidth(0, "45%");
+		grid.getColumnFormatter().setWidth(0, "10%");
+		grid.getColumnFormatter().setWidth(0, "45%");
+		return grid;
+	}
+	
+	/**
+     * This will get the save widgets.
+     */
+//    private Widget modifyWidgets() {
+//
+//        HorizontalPanel horiz = new HorizontalPanel();
+//
+//        Button copy = new Button(constants.Copy());
+//        copy.addClickListener( new ClickListener() {
+//            public void onClick(Widget w) {
+//                showCopyDialog();
+//            }
+//        } );
+//        horiz.add( copy );
+//
+//        Button rename = new Button(constants.Rename());
+//        rename.addClickListener( new ClickListener() {
+//            public void onClick(Widget w) {
+//                showRenameDialog();
+//            }
+//        } );
+//        horiz.add( rename );
+//
+//
+//        Button archive = new Button(constants.Archive());
+//        archive.addClickListener(new ClickListener() {
+//            public void onClick(Widget w) {
+//                if ( Window.confirm(constants.AreYouSureYouWantToArchiveRemoveThisPackage()) ) {
+////                    conf.archived = true;
+//                    Command ref = new Command() {
+//						public void execute() {
+////		                    close.execute();
+////		                    refreshPackageList.execute();
+//						}
+//                    };
+////                    doSaveAction(ref);
+//                }
+//            }
+//        });
+//        horiz.add(archive);
+//
+//        return horiz;
+//    }
+	
+	private void updateAsset(ListBox availFacts) {
+		List<String> l = new ArrayList<String>(availFacts.getItemCount()); 
+		for (int i = 0; i < availFacts.getItemCount(); i++) {
+			l.add(availFacts.getItemText(i));
+		}
+		((WorkingSetConfigData) workingSet.content).validFacts = l.toArray(new String[l.size()]);
+	}
+
+	private void copySelected(final ListBox from, final ListBox to) {
+		int selected;
+		while ((selected = from.getSelectedIndex()) != -1) {
+			to.addItem(from.getItemText(selected));
+			from.removeItem(selected);
+			validFactsChanged = true;
+		}
+	}
+	
+	/**
+	 * Will show a copy dialog for copying the whole package.
+	 */
+//	private void showCopyDialog() {
+//		final FormStylePopup pop = new FormStylePopup("images/new_wiz.gif", constants.CopyTheWorkingSet()); // NON-NLS
+//		pop.addRow(new HTML(constants.CopyTheWorkingSetTip()));
+//		final TextBox name = new TextBox();
+//		pop.addAttribute(constants.NewWorkingSetNameIs(), name);
+//		Button ok = new Button(constants.OK());
+//		pop.addAttribute("", ok);
+//
+//		ok.addClickListener(new ClickListener() {
+//			public void onClick(Widget w) {
+//				if (!PackageNameValidator.validatePackageName(name.getText())) {
+//					Window.alert(constants.NotAValidWorkingSetName());
+//					return;
+//				}
+//				LoadingPopup.showMessage(constants.PleaseWaitDotDotDot());
+//				RepositoryServiceFactory.getService().copyAsset(workingSet.uuid, workingSet.metaData.packageName, name.getText(), 
+//						new GenericCallback<String>() {
+//							public void onSuccess(String uuid) {
+//								//TODO {bauna} refreshPackageList.execute();
+//								Window.alert(constants.WorkingSetCopiedSuccessfully());
+//								pop.hide();
+//								LoadingPopup.close();
+//							}
+//					
+//				});
+//			}
+//		});
+//
+//		pop.show();
+//	}
+	
+//	private void showRenameDialog() {
+//		final FormStylePopup pop = new FormStylePopup("images/new_wiz.gif", constants.RenameTheWorkingSet());
+//		pop.addRow(new HTML(constants.RenameTheWorkingSetTip()));
+//		final TextBox name = new TextBox();
+//		pop.addAttribute(constants.NewWorkingSetNameIs(), name);
+//		Button ok = new Button(constants.OK());
+//		pop.addAttribute("", ok);
+//
+//		ok.addClickListener(new ClickListener() {
+//			public void onClick(Widget w) {
+//				LoadingPopup.showMessage(constants.PleaseWaitDotDotDot());
+//				RepositoryServiceFactory.getService().renameAsset(workingSet.uuid, name.getText(),
+//						new GenericCallback<String>() {
+//							public void onSuccess(String uuid) {
+//								Window.alert(constants.WorkingSetRenamedSuccessfully());
+//								pop.hide();
+//								LoadingPopup.close();
+//							}
+//						});
+//			}
+//		});
+//
+//		pop.show();
+//	}
+
+	public SuggestionCompletionEngine getCompletionEngine() {
+		return sce;
+	}
+	
+	public ConstraintsContainer getConstraintsConstrainer() {
+		return cc;
+	}
+}

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/WorkingSetSelectorPopup.java (from rev 32184, labs/jbossrules/branches/factsConstraints_baunax_esteban/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/WorkingSetSelectorPopup.java)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/WorkingSetSelectorPopup.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/WorkingSetSelectorPopup.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,113 @@
+package org.drools.guvnor.client.ruleeditor;
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+import org.drools.guvnor.client.common.AssetFormats;
+import org.drools.guvnor.client.common.FormStylePopup;
+import org.drools.guvnor.client.common.GenericCallback;
+import org.drools.guvnor.client.common.LoadingPopup;
+import org.drools.guvnor.client.messages.Constants;
+import org.drools.guvnor.client.rpc.RepositoryServiceFactory;
+import org.drools.guvnor.client.rpc.RuleAsset;
+import org.drools.guvnor.client.rpc.TableDataResult;
+
+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.ClickListener;
+import com.google.gwt.user.client.ui.Widget;
+import com.gwtext.client.widgets.tree.TreeNode;
+import com.gwtext.client.widgets.tree.TreePanel;
+import org.drools.guvnor.client.modeldriven.ui.RuleModeller;
+import org.drools.guvnor.client.packages.WorkingSetManager;
+
+public class WorkingSetSelectorPopup {
+
+    private final RuleModeller modeller;
+    private final RuleAsset asset;
+    private TreePanel treePanel;
+    private Button save;
+    private FormStylePopup pop;
+    private Constants constants = ((Constants) GWT.create(Constants.class));
+
+    public WorkingSetSelectorPopup(RuleModeller m, RuleAsset a) {
+
+        this.modeller = m;
+        this.asset = a;
+
+        pop = new FormStylePopup();
+        pop.setTitle(constants.SelectWorkingSets());
+
+        treePanel = new TreePanel();
+        treePanel.setWidth("100%");
+        treePanel.setHeight("100%");
+        final TreeNode root = new TreeNode("ROOT");
+        root.setChecked(false);
+        treePanel.setRootNode(root);
+        treePanel.setRootVisible(false);
+
+
+        RepositoryServiceFactory.getService().listAssets(asset.metaData.packageUUID, new String[]{AssetFormats.WORKING_SET}, 0, -1, "workingsetList", new GenericCallback<TableDataResult>() {
+
+            public void onSuccess(TableDataResult result) {
+
+                for (int i = 0; i < result.data.length; i++) {
+                    TreeNode node = new TreeNode(result.data[i].getDisplayName());
+                    node.setUserObject(result.data[i].id);
+                    node.setChecked(WorkingSetManager.getInstance().isWorkingSetActive(asset.metaData.packageName, result.data[i].id));
+                    root.appendChild(node);
+                }
+            }
+        });
+
+        save = new Button(constants.SaveAndClose());
+        save.addClickListener(new ClickListener() {
+
+            public void onClick(Widget widget) {
+                TreeNode[] checked = treePanel.getChecked();
+
+                String[] wsUUIDs = new String[checked.length];
+                for (int i = 0; i < checked.length; i++) {
+                    TreeNode treeNode = checked[i];
+                    wsUUIDs[i] = (String) treeNode.getUserObject();
+                }
+
+
+                WorkingSetManager.getInstance().applyWorkingSets(asset.metaData.packageName, wsUUIDs, new Command() {
+
+                        public void execute() {
+                            LoadingPopup.close();
+                            pop.hide();
+                            modeller.refreshWidget();
+                        }
+                    });
+            }
+        });
+
+        treePanel.setHeight(100);
+        treePanel.setAutoScroll(true);
+        treePanel.expandAll();
+        pop.addRow(treePanel);
+        pop.addRow(save);
+    }
+
+    public void show() {
+        treePanel.expandAll();
+        pop.show();
+
+    }
+}

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rulelist/AssetItemGrid.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rulelist/AssetItemGrid.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rulelist/AssetItemGrid.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -72,9 +72,9 @@
     public static final String  RULE_LIST_TABLE_ID          = "rulelist";
     public static final String  PACKAGEVIEW_LIST_TABLE_ID   = "packageviewlist";
     public static final String  ARCHIVED_RULE_LIST_TABLE_ID = "archivedrulelist";
-    private static final Map<String, ColumnModel>    columnConfigs               = new HashMap();
-    private static final Map<String, RecordDef>    recordDefs                  = new HashMap();
-    private static final Map<String, Integer>    rowsPerPage                 = new HashMap();
+    private static final Map<String, ColumnModel>    columnConfigs               = new HashMap<String, ColumnModel>();
+    private static final Map<String, RecordDef>    recordDefs                  = new HashMap<String, RecordDef>();
+    private static final Map<String, Integer>    rowsPerPage                 = new HashMap<String, Integer>();
 
     private final EditItemEvent editEvent;
     private SimplePanel         layout;

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/public/Guvnor.css
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/public/Guvnor.css	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/public/Guvnor.css	2010-03-25 19:26:29 UTC (rev 32217)
@@ -518,3 +518,8 @@
 }
 
 div.smallish-progress-wrapper { /* Don't change the following lines. */ position: relative; border: 1px solid black; } div.smallish-progress-bar { /* Don't change the following lines. */ position: absolute; top: 0; left: 0; height: 100%; } div.smallish-progress-text { /* Don't change the following lines. */ text-align: center; position: relative; /* Add your customizations after this line. */ }
+
+.editor-disabled-widget{
+    background-color: #F7F7F8;
+    color: #868686;
+}
\ No newline at end of file

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

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/RepositoryServiceServlet.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/RepositoryServiceServlet.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/RepositoryServiceServlet.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -1,23 +1,26 @@
 package org.drools.guvnor.server;
 
-import com.google.gwt.user.client.rpc.SerializableException;
-import com.google.gwt.user.server.rpc.RemoteServiceServlet;
+import java.io.IOException;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletResponse;
+
 import org.apache.log4j.Logger;
-import org.drools.guvnor.client.rpc.*;
+import org.drools.guvnor.client.rpc.AnalysisReport;
+import org.drools.guvnor.client.rpc.RepositoryService;
+import org.drools.guvnor.client.rpc.RuleAsset;
+import org.drools.guvnor.server.repository.MailboxService;
+import org.drools.guvnor.server.repository.RepositoryStartupService;
 import org.drools.guvnor.server.util.LoggingHelper;
 import org.drools.guvnor.server.util.TestEnvironmentSessionHelper;
-import org.drools.guvnor.server.repository.MailboxService;
-import org.drools.guvnor.server.repository.RepositoryStartupService;
 import org.drools.repository.RulesRepository;
 import org.drools.repository.RulesRepositoryException;
 import org.jboss.seam.Component;
 import org.jboss.seam.contexts.Contexts;
 import org.jboss.seam.security.AuthorizationException;
 
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
+import com.google.gwt.user.client.rpc.SerializableException;
+import com.google.gwt.user.server.rpc.RemoteServiceServlet;
 
 /**
  * GWT RPC service endpoint for Repository service. A place to hang some exception handling mainly.
@@ -102,10 +105,10 @@
     public java.lang.String[] loadChildCategories(java.lang.String p0)  {
          return getService().loadChildCategories( p0);
     }
-    public org.drools.guvnor.client.rpc.TableDataResult loadRuleListForCategories(java.lang.String p0, int p1, int p2, java.lang.String p3) throws com.google.gwt.user.client.rpc.SerializableException {
+    public org.drools.guvnor.client.rpc.TableDataResult loadRuleListForCategories(java.lang.String p0, int p1, int p2, java.lang.String p3) throws SerializableException {
          return getService().loadRuleListForCategories( p0,  p1,  p2,  p3);
     }
-    public org.drools.guvnor.client.rpc.TableDataResult loadRuleListForState(java.lang.String p0, int p1, int p2, java.lang.String p3) throws com.google.gwt.user.client.rpc.SerializableException {
+    public org.drools.guvnor.client.rpc.TableDataResult loadRuleListForState(java.lang.String p0, int p1, int p2, java.lang.String p3) throws SerializableException {
          return getService().loadRuleListForState( p0,  p1,  p2,  p3);
     }
     public org.drools.guvnor.client.rpc.TableConfig loadTableConfig(java.lang.String p0)  {
@@ -114,10 +117,10 @@
     public java.lang.Boolean createCategory(java.lang.String p0, java.lang.String p1, java.lang.String p2)  {
          return getService().createCategory( p0,  p1,  p2);
     }
-    public java.lang.String createNewRule(java.lang.String p0, java.lang.String p1, java.lang.String p2, java.lang.String p3, java.lang.String p4) throws com.google.gwt.user.client.rpc.SerializableException {
+    public java.lang.String createNewRule(java.lang.String p0, java.lang.String p1, java.lang.String p2, java.lang.String p3, java.lang.String p4) throws SerializableException {
          return getService().createNewRule( p0,  p1,  p2,  p3,  p4);
     }
-    public java.lang.String createNewImportedRule(java.lang.String p0, java.lang.String p1) throws com.google.gwt.user.client.rpc.SerializableException {
+    public java.lang.String createNewImportedRule(java.lang.String p0, java.lang.String p1) throws SerializableException {
          return getService().createNewImportedRule( p0,  p1);
     }
     public void deleteUncheckedRule(java.lang.String p0, java.lang.String p1)  {
@@ -135,46 +138,52 @@
     public org.drools.guvnor.client.rpc.PackageConfigData[] listArchivedPackages()  {
          return getService().listArchivedPackages();
     }
-    public org.drools.guvnor.client.rpc.RuleAsset loadRuleAsset(java.lang.String p0) throws com.google.gwt.user.client.rpc.SerializableException {
+    public org.drools.guvnor.client.rpc.RuleAsset loadRuleAsset(java.lang.String p0) throws SerializableException {
          return getService().loadRuleAsset( p0);
     }
-    public org.drools.guvnor.client.rpc.RuleAsset[] loadRuleAssets(java.lang.String[] p0) throws com.google.gwt.user.client.rpc.SerializableException {
+    public org.drools.guvnor.client.rpc.RuleAsset[] loadRuleAssets(java.lang.String[] p0) throws SerializableException {
          return getService().loadRuleAssets( p0);
     }
-    public org.drools.guvnor.client.rpc.TableDataResult loadAssetHistory(java.lang.String p0) throws com.google.gwt.user.client.rpc.SerializableException {
+    public org.drools.guvnor.client.rpc.TableDataResult loadAssetHistory(java.lang.String p0) throws SerializableException {
          return getService().loadAssetHistory( p0);
     }
-    public org.drools.guvnor.client.rpc.TableDataResult loadArchivedAssets(int p0, int p1) throws com.google.gwt.user.client.rpc.SerializableException {
+    public org.drools.guvnor.client.rpc.TableDataResult loadArchivedAssets(int p0, int p1) throws SerializableException {
          return getService().loadArchivedAssets( p0,  p1);
     }
-    public java.lang.String checkinVersion(org.drools.guvnor.client.rpc.RuleAsset p0) throws com.google.gwt.user.client.rpc.SerializableException {
+    public java.lang.String checkinVersion(org.drools.guvnor.client.rpc.RuleAsset p0) throws SerializableException {
          return getService().checkinVersion( p0);
     }
     public void restoreVersion(java.lang.String p0, java.lang.String p1, java.lang.String p2)  {
         getService().restoreVersion( p0,  p1,  p2);
     }
-    public java.lang.String createPackage(java.lang.String p0, java.lang.String p1) throws com.google.gwt.user.client.rpc.SerializableException {
+    public java.lang.String createPackage(java.lang.String p0, java.lang.String p1) throws SerializableException {
          return getService().createPackage( p0,  p1);
     }
+    
+	public java.lang.String createSubPackage(java.lang.String p0, java.lang.String p1, String parentPackage)
+			throws SerializableException {
+		return getService().createSubPackage(p0, p1, parentPackage);
+	}
+
     public org.drools.guvnor.client.rpc.PackageConfigData loadPackageConfig(java.lang.String p0)  {
          return getService().loadPackageConfig( p0);
     }
-    public org.drools.guvnor.client.rpc.ValidatedResponse savePackage(org.drools.guvnor.client.rpc.PackageConfigData p0) throws com.google.gwt.user.client.rpc.SerializableException {
+    public org.drools.guvnor.client.rpc.ValidatedResponse savePackage(org.drools.guvnor.client.rpc.PackageConfigData p0) throws SerializableException {
          return getService().savePackage( p0);
     }
-    public org.drools.guvnor.client.rpc.TableDataResult listAssets(java.lang.String p0, java.lang.String[] p1, int p2, int p3, java.lang.String p4) throws com.google.gwt.user.client.rpc.SerializableException {
+    public org.drools.guvnor.client.rpc.TableDataResult listAssets(java.lang.String p0, java.lang.String[] p1, int p2, int p3, java.lang.String p4) throws SerializableException {
          return getService().listAssets( p0,  p1,  p2,  p3,  p4);
     }
-    public java.lang.String[] listStates() throws com.google.gwt.user.client.rpc.SerializableException {
+    public java.lang.String[] listStates() throws SerializableException {
          return getService().listStates();
     }
-    public java.lang.String createState(java.lang.String p0) throws com.google.gwt.user.client.rpc.SerializableException {
+    public java.lang.String createState(java.lang.String p0) throws SerializableException {
          return getService().createState( p0);
     }
-    public void renameState(java.lang.String p0, java.lang.String p1) throws com.google.gwt.user.client.rpc.SerializableException {
+    public void renameState(java.lang.String p0, java.lang.String p1) throws SerializableException {
         getService().renameState( p0,  p1);
     }
-    public void removeState(java.lang.String p0) throws com.google.gwt.user.client.rpc.SerializableException {
+    public void removeState(java.lang.String p0) throws SerializableException {
         getService().removeState( p0);
     }
     public void changeState(java.lang.String p0, java.lang.String p1, boolean p2)  {
@@ -189,7 +198,7 @@
     public java.lang.String copyAsset(java.lang.String p0, java.lang.String p1, java.lang.String p2)  {
          return getService().copyAsset( p0,  p1,  p2);
     }
-    public void copyPackage(java.lang.String p0, java.lang.String p1) throws com.google.gwt.user.client.rpc.SerializableException {
+    public void copyPackage(java.lang.String p0, java.lang.String p1) throws SerializableException {
         getService().copyPackage( p0,  p1);
     }
     public org.drools.guvnor.client.rpc.SnapshotInfo[] listSnapshots(java.lang.String p0)  {
@@ -198,31 +207,31 @@
     public void createPackageSnapshot(java.lang.String p0, java.lang.String p1, boolean p2, java.lang.String p3)  {
         getService().createPackageSnapshot( p0,  p1,  p2,  p3);
     }
-    public void copyOrRemoveSnapshot(java.lang.String p0, java.lang.String p1, boolean p2, java.lang.String p3) throws com.google.gwt.user.client.rpc.SerializableException {
+    public void copyOrRemoveSnapshot(java.lang.String p0, java.lang.String p1, boolean p2, java.lang.String p3) throws SerializableException {
         getService().copyOrRemoveSnapshot( p0,  p1,  p2,  p3);
     }
-    public org.drools.guvnor.client.rpc.TableDataResult quickFindAsset(java.lang.String p0, boolean p1, int p2, int p3) throws com.google.gwt.user.client.rpc.SerializableException {
+    public org.drools.guvnor.client.rpc.TableDataResult quickFindAsset(java.lang.String p0, boolean p1, int p2, int p3) throws SerializableException {
          return getService().quickFindAsset( p0,  p1,  p2,  p3);
     }
-    public void removeCategory(java.lang.String p0) throws com.google.gwt.user.client.rpc.SerializableException {
+    public void removeCategory(java.lang.String p0) throws SerializableException {
         getService().removeCategory( p0);
     }
-    public org.drools.guvnor.client.modeldriven.SuggestionCompletionEngine loadSuggestionCompletionEngine(java.lang.String p0) throws com.google.gwt.user.client.rpc.SerializableException {
+    public org.drools.guvnor.client.modeldriven.SuggestionCompletionEngine loadSuggestionCompletionEngine(java.lang.String p0) throws SerializableException {
          return getService().loadSuggestionCompletionEngine( p0);
     }
-    public org.drools.guvnor.client.rpc.BuilderResult buildPackage(java.lang.String p0, boolean p1, java.lang.String p2, java.lang.String p3, java.lang.String p4, boolean p5, java.lang.String p6, java.lang.String p7, boolean p8, java.lang.String p9) throws com.google.gwt.user.client.rpc.SerializableException {
+    public org.drools.guvnor.client.rpc.BuilderResult buildPackage(java.lang.String p0, boolean p1, java.lang.String p2, java.lang.String p3, java.lang.String p4, boolean p5, java.lang.String p6, java.lang.String p7, boolean p8, java.lang.String p9) throws SerializableException {
          return getService().buildPackage( p0,  p1,  p2,  p3,  p4,  p5,  p6,  p7,  p8,  p9);
     }
-    public java.lang.String[] getCustomSelectors() throws com.google.gwt.user.client.rpc.SerializableException {
+    public java.lang.String[] getCustomSelectors() throws SerializableException {
          return getService().getCustomSelectors();
     }
-    public java.lang.String buildPackageSource(java.lang.String p0) throws com.google.gwt.user.client.rpc.SerializableException {
+    public java.lang.String buildPackageSource(java.lang.String p0) throws SerializableException {
          return getService().buildPackageSource( p0);
     }
-    public java.lang.String buildAssetSource(org.drools.guvnor.client.rpc.RuleAsset p0) throws com.google.gwt.user.client.rpc.SerializableException {
+    public java.lang.String buildAssetSource(org.drools.guvnor.client.rpc.RuleAsset p0) throws SerializableException {
          return getService().buildAssetSource( p0);
     }
-    public org.drools.guvnor.client.rpc.BuilderResult buildAsset(org.drools.guvnor.client.rpc.RuleAsset p0) throws com.google.gwt.user.client.rpc.SerializableException {
+    public org.drools.guvnor.client.rpc.BuilderResult buildAsset(org.drools.guvnor.client.rpc.RuleAsset p0) throws SerializableException {
          return getService().buildAsset( p0);
     }
     public java.lang.String renameAsset(java.lang.String p0, java.lang.String p1)  {
@@ -249,25 +258,25 @@
     public java.lang.String renamePackage(java.lang.String p0, java.lang.String p1)  {
          return getService().renamePackage( p0,  p1);
     }
-    public void rebuildSnapshots() throws com.google.gwt.user.client.rpc.SerializableException {
+    public void rebuildSnapshots() throws SerializableException {
         getService().rebuildSnapshots();
     }
-    public void rebuildPackages() throws com.google.gwt.user.client.rpc.SerializableException {
+    public void rebuildPackages() throws SerializableException {
         getService().rebuildPackages();
     }
-    public java.lang.String[] listRulesInPackage(java.lang.String p0) throws com.google.gwt.user.client.rpc.SerializableException {
+    public java.lang.String[] listRulesInPackage(java.lang.String p0) throws SerializableException {
          return getService().listRulesInPackage( p0);
     }
-    public org.drools.guvnor.client.rpc.SingleScenarioResult runScenario(java.lang.String p0, org.drools.guvnor.client.modeldriven.testing.Scenario p1) throws com.google.gwt.user.client.rpc.SerializableException {
+    public org.drools.guvnor.client.rpc.SingleScenarioResult runScenario(java.lang.String p0, org.drools.guvnor.client.modeldriven.testing.Scenario p1) throws SerializableException {
          return getService().runScenario( p0,  p1);
     }
-    public org.drools.guvnor.client.rpc.BulkTestRunResult runScenariosInPackage(java.lang.String p0) throws com.google.gwt.user.client.rpc.SerializableException {
+    public org.drools.guvnor.client.rpc.BulkTestRunResult runScenariosInPackage(java.lang.String p0) throws SerializableException {
          return getService().runScenariosInPackage( p0);
     }
-    public org.drools.guvnor.client.rpc.AnalysisReport analysePackage(java.lang.String p0) throws com.google.gwt.user.client.rpc.SerializableException {
+    public org.drools.guvnor.client.rpc.AnalysisReport analysePackage(java.lang.String p0) throws SerializableException {
          return getService().analysePackage( p0);
     }
-    public java.lang.String[] listTypesInPackage(java.lang.String p0) throws com.google.gwt.user.client.rpc.SerializableException {
+    public java.lang.String[] listTypesInPackage(java.lang.String p0) throws SerializableException {
          return getService().listTypesInPackage( p0);
     }
     public org.drools.guvnor.client.rpc.LogEntry[] showLog()  {
@@ -279,10 +288,10 @@
     public java.lang.String[] loadDropDownExpression(java.lang.String[] p0, java.lang.String p1)  {
          return getService().loadDropDownExpression( p0,  p1);
     }
-    public org.drools.guvnor.client.rpc.TableDataResult queryFullText(java.lang.String p0, boolean p1, int p2, int p3) throws com.google.gwt.user.client.rpc.SerializableException {
+    public org.drools.guvnor.client.rpc.TableDataResult queryFullText(java.lang.String p0, boolean p1, int p2, int p3) throws SerializableException {
          return getService().queryFullText( p0,  p1,  p2,  p3);
     }
-    public org.drools.guvnor.client.rpc.TableDataResult queryMetaData(org.drools.guvnor.client.rpc.MetaDataQuery[] p0, java.util.Date p1, java.util.Date p2, java.util.Date p3, java.util.Date p4, boolean p5, int p6, int p7) throws com.google.gwt.user.client.rpc.SerializableException {
+    public org.drools.guvnor.client.rpc.TableDataResult queryMetaData(org.drools.guvnor.client.rpc.MetaDataQuery[] p0, java.util.Date p1, java.util.Date p2, java.util.Date p3, java.util.Date p4, boolean p5, int p6, int p7) throws SerializableException {
          return getService().queryMetaData( p0,  p1,  p2,  p3,  p4,  p5,  p6,  p7);
     }
     public java.util.Map listUserPermissions() throws org.drools.guvnor.client.rpc.DetailedSerializableException {
@@ -312,7 +321,7 @@
     public void unLockAsset(java.lang.String p0)  {
         getService().unLockAsset( p0);
     }
-    public void installSampleRepository() throws com.google.gwt.user.client.rpc.SerializableException {
+    public void installSampleRepository() throws SerializableException {
         getService().installSampleRepository();
     }
     public java.util.List loadDiscussionForAsset(java.lang.String p0)  {
@@ -334,8 +343,8 @@
          return getService().compareSnapshots( p0,  p1,  p2);
     }
 
-    public AnalysisReport verifyAsset(RuleAsset asset) throws SerializableException {
-        return getService().verifyAsset( asset );
+    public AnalysisReport verifyAsset(RuleAsset asset, Set<String> activeWorkingSets) throws SerializableException {
+        return getService().verifyAsset( asset, activeWorkingSets );
     }
 
     

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/ServiceImplementation.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/ServiceImplementation.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/ServiceImplementation.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -24,6 +24,7 @@
 import java.io.ObjectOutput;
 import java.text.DateFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Collection;
 import java.util.Collections;
@@ -32,6 +33,7 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -59,6 +61,7 @@
 import org.drools.core.util.DroolsStreamUtils;
 import org.drools.guvnor.client.common.AssetFormats;
 import org.drools.guvnor.client.common.Inbox;
+import org.drools.guvnor.client.factcontraints.Constraint;
 import org.drools.guvnor.client.modeldriven.SuggestionCompletionEngine;
 import org.drools.guvnor.client.modeldriven.testing.Scenario;
 import org.drools.guvnor.client.rpc.AnalysisReport;
@@ -84,6 +87,7 @@
 import org.drools.guvnor.client.rpc.TableDataResult;
 import org.drools.guvnor.client.rpc.TableDataRow;
 import org.drools.guvnor.client.rpc.ValidatedResponse;
+import org.drools.guvnor.client.rpc.WorkingSetConfigData;
 import org.drools.guvnor.server.builder.AuditLogReporter;
 import org.drools.guvnor.server.builder.BRMSPackageBuilder;
 import org.drools.guvnor.server.builder.ContentAssemblyError;
@@ -273,7 +277,7 @@
             if ( e.getCause() instanceof ItemExistsException ) {
                 return "DUPLICATE";
             } else {
-                log.error( "An error occurred creating new asset" + ruleName + "] in package [" + initialPackage + "]: " + e.getMessage() );
+                log.error( "An error occurred creating new asset" + ruleName + "] in package [" + initialPackage + "]: ", e);
                 throw new SerializableException( e.getMessage() );
             }
         }
@@ -300,11 +304,12 @@
             repository.save();
 
             return asset.getUUID();
-        } catch ( RulesRepositoryException e ) {
+        } 
+        catch ( RulesRepositoryException e ) {
             if ( e.getCause() instanceof ItemExistsException ) {
                 return "DUPLICATE";
             } else {
-                log.error( "An error occurred creating shared asset" + sharedAssetName + "] in package [" + initialPackage + "]: " + e.getMessage() );
+                log.error( "An error occurred creating shared asset" + sharedAssetName + "] in package [" + initialPackage + "]: ", e);
                 throw new SerializableException( e.getMessage() );
             }
         }
@@ -386,47 +391,74 @@
         data.lasContributor = item.getLastContributor();
         data.state = item.getStateDescription();
         data.isSnapshot = item.isSnapshot();
+
         if ( data.isSnapshot ) {
             data.snapshotName = item.getSnapshotName();
         }
 
         return data;
     }
-
+    
     private PackageConfigData[] listPackages(boolean archive,
                                              RepositoryFilter filter) {
         List<PackageConfigData> result = new ArrayList<PackageConfigData>();
         PackageIterator pkgs = repository.listPackages();
         pkgs.setArchivedIterator( archive );
         while ( pkgs.hasNext() ) {
-            PackageItem pkg = (PackageItem) pkgs.next();
+            PackageItem pkg = pkgs.next();
 
             PackageConfigData data = new PackageConfigData();
             data.uuid = pkg.getUUID();
             data.name = pkg.getName();
             data.archived = pkg.isArchived();
-            if ( !archive && (filter == null || filter.accept( data,
-                                                               RoleTypes.PACKAGE_READONLY )) ) {
+            if ( !archive && 
+            		(filter == null || filter.accept( data, RoleTypes.PACKAGE_READONLY )) ) {
                 result.add( data );
-            } else if ( archive && data.archived && (filter == null || filter.accept( data,
-                                                                                      RoleTypes.PACKAGE_READONLY )) ) {
+            } else if ( archive && data.archived && 
+            		(filter == null || filter.accept( data, RoleTypes.PACKAGE_READONLY )) ) {
                 result.add( data );
             }
+            
+            data.subPackages = listSubPackages(pkg, archive, filter);
         }
 
         sortPackages( result );
-        PackageConfigData[] resultArr = result.toArray( new PackageConfigData[result.size()] );
-        return resultArr;
+        return result.toArray( new PackageConfigData[result.size()] );
     }
 
+	private PackageConfigData[] listSubPackages(PackageItem parentPkg, boolean archive, RepositoryFilter filter) {
+    	List<PackageConfigData> children = new LinkedList<PackageConfigData>();
+    	
+    	PackageIterator pkgs = parentPkg.listSubPackages();
+        pkgs.setArchivedIterator( archive );
+        while ( pkgs.hasNext() ) {
+            PackageItem pkg = pkgs.next();
+
+            PackageConfigData data = new PackageConfigData();
+            data.uuid = pkg.getUUID();
+            data.name = pkg.getName();
+            data.archived = pkg.isArchived();
+            if ( !archive && 
+            		(filter == null || filter.accept( data, RoleTypes.PACKAGE_READONLY )) ) {
+                children.add( data );
+            } else if ( archive && data.archived && 
+            		(filter == null || filter.accept( data, RoleTypes.PACKAGE_READONLY )) ) {
+            	children.add( data );
+            }
+            
+            data.subPackages = listSubPackages(pkg, archive, filter);
+        }
+    	
+    	sortPackages( children );
+        return children.toArray( new PackageConfigData[children.size()] );
+    }
+    
     void sortPackages(List<PackageConfigData> result) {
         Collections.sort( result,
-                          new Comparator<Object>() {
+                          new Comparator<PackageConfigData>() {
 
-                              public int compare(final Object o1,
-                                                 final Object o2) {
-                                  final PackageConfigData d1 = (PackageConfigData) o1;
-                                  final PackageConfigData d2 = (PackageConfigData) o2;
+                              public int compare(final PackageConfigData d1,
+                                                 final PackageConfigData d2) {
                                   return d1.name.compareTo( d2.name );
                               }
 
@@ -582,7 +614,13 @@
     @WebRemote
     @Restrict("#{identity.loggedIn}")
     public RuleAsset[] loadRuleAssets(String[] uuids) throws SerializableException {
-
+       return loadRuleAssets(Arrays.asList(uuids));
+    }
+    
+    private RuleAsset[] loadRuleAssets(Collection<String> uuids) throws SerializableException {
+    	if (uuids == null) {
+    		return null;
+    	}
         Collection<RuleAsset> assets = new HashSet<RuleAsset>();
 
         for ( String uuid : uuids ) {
@@ -590,7 +628,7 @@
         }
 
         return assets.toArray( new RuleAsset[assets.size()] );
-    }
+    }    
 
     private RuleAsset loadAsset(AssetItem item) throws SerializableException {
 
@@ -631,7 +669,9 @@
      */
     MetaData populateMetaData(AssetItem item) {
         MetaData meta = populateMetaData( (VersionableItem) item );
+        
         meta.packageName = item.getPackageName();
+        meta.packageUUID = item.getPackage().getUUID();
 
         List cats = item.getCategories();
         meta.categories = new String[cats.size()];
@@ -840,13 +880,13 @@
 
     @WebRemote
     public String createPackage(String name,
-                                String description) throws SerializableException {
+                                String description) throws RulesRepositoryException {
         if ( Contexts.isSessionContextActive() ) {
             Identity.instance().checkPermission( new AdminType(),
                                                  RoleTypes.ADMIN );
         }
 
-        log.info( "USER:" + getCurrentUserName() + " CREATING package [" + name + "]" );
+        log.info( "USER: " + getCurrentUserName() + " CREATING package [" + name + "]" );
         PackageItem item = repository.createPackage( name,
                                                      description );
 
@@ -854,6 +894,18 @@
     }
 
     @WebRemote
+    public String createSubPackage(String name, String description, String parentNode) throws SerializableException {
+        //XXX bauna
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(new AdminType(), RoleTypes.ADMIN);
+		}
+	
+        log.info( "USER: " + getCurrentUserName() + " CREATING subPackage [" + name + "], parent [" + parentNode + "]");
+		PackageItem item = repository.createSubPackage(name, description, parentNode);
+        return item.getUUID();
+    }
+    
+    @WebRemote
     @Restrict("#{identity.loggedIn}")
     public PackageConfigData loadPackageConfig(String uuid) {
         PackageItem item = repository.loadPackageByUUID( uuid );
@@ -1239,7 +1291,7 @@
                     }
                 } catch ( RulesRepositoryException e ) {
                     // This was not a rule asset
-                } catch ( SerializableException e ) {
+                } catch ( Exception e ) {
                     // This was not a rule asset
                 }
 
@@ -1404,8 +1456,6 @@
             search += "%";
         }
 
-        TableDataResult result = new TableDataResult();
-
         List<AssetItem> resultList = new ArrayList<AssetItem>();
 
         long start = System.currentTimeMillis();
@@ -1622,7 +1672,7 @@
     }
 
     private void updateBinaryPackage(PackageItem item,
-                                     ContentPackageAssembler asm) throws Exception {
+                                     ContentPackageAssembler asm) throws SerializableException {
         item.updateBinaryUpToDate( true );
         RuleBaseConfiguration conf = new RuleBaseConfiguration();
         // setting the MapBackedClassloader that is the parent of the builder classloader as the parent
@@ -2115,7 +2165,7 @@
                     throw new DetailedSerializableException( "Unable to reload knowledgebase.",
                                                              e.getMessage() );
                 }
-            } catch ( SerializableException e1 ) {
+            } catch ( Exception e1 ) {
                 log.error( "Unable to rebuild the rulebase: " + e.getMessage() );
                 throw new DetailedSerializableException( "Unable to rebuild the rulebase.",
                                                          "" );
@@ -2197,7 +2247,7 @@
     }
 
     public BulkTestRunResult runScenariosInPackage(PackageItem item) throws DetailedSerializableException,
-                                                                    SerializableException {
+    		SerializableException {
         ClassLoader originalCL = Thread.currentThread().getContextClassLoader();
         ClassLoader cl = null;
 
@@ -2665,7 +2715,7 @@
         try {
             return backchannel.await( getCurrentUserName() );
         } catch ( InterruptedException e ) {
-            return new ArrayList();
+            return new ArrayList<PushResponse>();
         }
     }
 
@@ -2777,25 +2827,43 @@
         return diffs;
     }
 
-    @WebRemote
-    @Restrict("#{identity.loggedIn}")
-    public AnalysisReport verifyAsset(RuleAsset asset) throws SerializableException {
-        if ( Contexts.isSessionContextActive() ) {
-            Identity.instance().checkPermission( new PackageNameType( asset.metaData.packageName ),
-                                                 RoleTypes.PACKAGE_DEVELOPER );
-        }
+	@WebRemote
+	@Restrict("#{identity.loggedIn}")
+	public AnalysisReport verifyAsset(RuleAsset asset, Set<String> activeWorkingSets) throws SerializableException {
+		if (Contexts.isSessionContextActive()) {
+			Identity.instance().checkPermission(new PackageNameType(asset.metaData.packageName),
+					RoleTypes.PACKAGE_DEVELOPER);
+		}
 
-        String drl = "package " + asset.metaData.packageName + "\n" + getDroolsHeader( repository.loadPackage( asset.metaData.packageName ) ) + "\n" + this.buildAssetSource( asset );
+		String drl = "package " + asset.metaData.packageName + "\n"
+				+ getDroolsHeader(repository.loadPackage(asset.metaData.packageName)) + "\n"
+				+ this.buildAssetSource(asset);
 
         VerifierRunner runner = new VerifierRunner();
 
-        if ( asset.metaData.format.equals( AssetFormats.DECISION_TABLE_GUIDED ) || asset.metaData.format.equals( AssetFormats.DECISION_SPREADSHEET_XLS ) ) {
+		RuleAsset[] workingSets = loadRuleAssets(activeWorkingSets);
+		List<String> constraintRules = new LinkedList<String>();
+		if (workingSets != null) {
+			for (RuleAsset ws : workingSets) {
+				WorkingSetConfigData wsConfig = (WorkingSetConfigData) ws.content;
+				if (wsConfig.constraints != null) {
+					for (Constraint cons : wsConfig.constraints) {
+						constraintRules.add(cons.getVerifierRule());
+					}
+				}
+			}
+		}
+		if (log.isDebugEnabled()) {
+			log.debug("constraints rules: " + constraintRules);
+		}
+        if ( AssetFormats.DECISION_TABLE_GUIDED.equals(asset.metaData.format) || AssetFormats.DECISION_SPREADSHEET_XLS.equals(asset.metaData.format) ) {
             return runner.verify( drl,
-                                  VerifierConfiguration.VERIFYING_SCOPE_DECISION_TABLE );
+                                  VerifierConfiguration.VERIFYING_SCOPE_DECISION_TABLE,
+                                  constraintRules );
         } else {
             return runner.verify( drl,
-                                  VerifierConfiguration.VERIFYING_SCOPE_SINGLE_RULE );
+                                  VerifierConfiguration.VERIFYING_SCOPE_SINGLE_RULE,
+                                  constraintRules );
         }
-
     }
 }

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/contenthandler/WorkingSetHandler.java (from rev 32184, labs/jbossrules/branches/factsConstraints_baunax_esteban/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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/contenthandler/WorkingSetHandler.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,46 @@
+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());
+		}
+    }
+}

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/resources/contenthandler.properties
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/resources/contenthandler.properties	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/resources/contenthandler.properties	2010-03-25 19:26:29 UTC (rev 32217)
@@ -34,3 +34,6 @@
 properties=org.drools.guvnor.server.contenthandler.PropertiesHandler
 #xml attachment
 xml=org.drools.guvnor.server.contenthandler.XmlFileHandler
+#Working_Set
+workingset=org.drools.guvnor.server.contenthandler.WorkingSetHandler
+

Copied: labs/jbossrules/trunk/drools-guvnor/src/main/resources/workingsetList.properties (from rev 32184, labs/jbossrules/branches/factsConstraints_baunax_esteban/drools-guvnor/src/main/resources/workingsetList.properties)
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/resources/workingsetList.properties	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/resources/workingsetList.properties	2010-03-25 19:26:29 UTC (rev 32217)
@@ -0,0 +1,25 @@
+#
+# This is the configuration for the asset list table.
+# It can access any field on the AssetItem object by the method name.
+# It will intelligently convert types as appropriate.
+#
+#
+#
+# If you wish to customise, you can put your own properties ahead of the
+# repository on the classpath.
+#
+# NOTE: the key value is the key from the Constants.properties localisation bundle (which contains the display names
+#for the respective languages.
+#
+# @author Pablo Nussembaum
+#
+#
+
+#these must stay the same.
+Name=getName
+Description=getDescription
+
+#you can modify the following...
+LastModified=getLastModified
+Status=getStateDescription
+Package=getPackageName
\ No newline at end of file

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

Modified: labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/PopulateDataTest.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/PopulateDataTest.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/PopulateDataTest.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -73,7 +73,7 @@
 
     private void createPermissions(ServiceImplementation serv) {
     	Map<String, List<String>> perms = new HashMap<String, List<String>>();
-    	perms.put(RoleTypes.ADMIN, new ArrayList());
+    	perms.put(RoleTypes.ADMIN, new ArrayList<String>());
 		serv.updateUserPermissions("woozle1", perms);
 
 		perms = new HashMap<String, List<String>>();
@@ -142,10 +142,6 @@
         uuid = serv.createNewRule( "Fibreglass supplier selection", "This defines XXX.", "Manufacturing/Boards", "com.billasurf.manufacturing", AssetFormats.BUSINESS_RULE );
         uuid = serv.createNewRule( "Recommended wax", "This defines XXX.", "Manufacturing/Boards", "com.billasurf.manufacturing", AssetFormats.BUSINESS_RULE );
         uuid = serv.createNewRule( "SomeDSL", "Ignore me.", "Manufacturing/Boards", "com.billasurf.manufacturing", AssetFormats.DSL );
-
-
-
-
     }
 
     private void createPackages(ServiceImplementation serv) throws SerializableException {

Modified: labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/PackageItem.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/PackageItem.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/PackageItem.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -7,16 +7,24 @@
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.StringTokenizer;
 
-import javax.jcr.*;
+import javax.jcr.ItemExistsException;
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.Workspace;
 import javax.jcr.nodetype.NodeType;
 import javax.jcr.query.Query;
 import javax.jcr.query.QueryResult;
-import javax.jcr.query.RowIterator;
 
-import org.apache.log4j.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * A PackageItem object aggregates a set of assets (for example, rules). This is advantageous for systems using the JBoss Rules
@@ -29,7 +37,7 @@
  * @author btruitt
  */
 public class PackageItem extends VersionableItem {
-    private static Logger      log                              = Logger.getLogger( PackageItem.class );
+	private static final Logger log = LoggerFactory.getLogger(PackageItem.class);
 
     /**
      * This is the name of the rules "subfolder" where rules are kept
@@ -124,7 +132,7 @@
     		node.checkout();
 			node.setProperty("drools:binaryUpToDate", status);
 		} catch (RepositoryException e) {
-			log.error(e);
+			log.error("fail to update drools:binaryUpToDate of " + getName(), e);
 		}
     }
 
@@ -140,7 +148,7 @@
 				return false;
 			}
 		} catch (RepositoryException e) {
-			log.error(e);
+			log.error("fail to get drools:binaryUpToDate of " + getName(), e);
 			throw new RulesRepositoryException(e);
 		}
     }
@@ -161,8 +169,7 @@
     public AssetItem addAsset(String assetName, String description) {
         return addAsset(assetName, description, null, null);
     }
-
-
+    
     /**
      * This adds a rule to the current physical package (you can move it later).
      * With the given category.
@@ -516,15 +523,17 @@
     /**
      * This will load an iterator for assets of the given format type.
      */
-    public AssetItemIterator listAssetsByFormat(String[] formats) {
+    public AssetItemIterator listAssetsByFormat(String... formats) {
 
         if (formats.length == 1) {
-            return queryAssets( "drools:format='" + formats[0] + "'" );
+            return queryAssets( FORMAT_PROPERTY_NAME + "='" + formats[0] + "'" );
         } else {
             String predicate = " ( ";
             for ( int i = 0; i < formats.length; i++ ) {
-                predicate = predicate + "drools:format='" + formats[i] + "'";
-                if (!(i == formats.length -1 )) { predicate =  predicate + " OR "; }
+                predicate = predicate + FORMAT_PROPERTY_NAME + "='" + formats[i] + "'";
+                if (i != formats.length -1) { 
+                	predicate =  predicate + " OR "; 
+                }
             }
             predicate = predicate + " ) ";
             return queryAssets( predicate );
@@ -597,34 +606,32 @@
         }
     }
 
-    public VersionableItem getPrecedingVersion() throws RulesRepositoryException {
-        try {
-            Node precedingVersionNode = this.getPrecedingVersionNode();
-            if ( precedingVersionNode != null ) {
-                return new PackageItem( this.rulesRepository,
-                                            precedingVersionNode );
-            } else {
-                return null;
-            }
-        } catch ( Exception e ) {
-            log.error( "Caught exception",
-                       e );
-            throw new RulesRepositoryException( e );
-        }
-    }
+	@Override
+	public PackageItem getPrecedingVersion() throws RulesRepositoryException {
+		try {
+			Node precedingVersionNode = this.getPrecedingVersionNode();
+			if (precedingVersionNode != null) {
+				return new PackageItem(this.rulesRepository, precedingVersionNode);
+			} else {
+				return null;
+			}
+		} catch (Exception e) {
+			log.error("Caught exception", e);
+			throw new RulesRepositoryException(e);
+		}
+	}
 
-    public VersionableItem getSucceedingVersion() throws RulesRepositoryException {
+    @Override
+    public PackageItem getSucceedingVersion() throws RulesRepositoryException {
         try {
             Node succeedingVersionNode = this.getSucceedingVersionNode();
             if ( succeedingVersionNode != null ) {
-                return new PackageItem( this.rulesRepository,
-                                            succeedingVersionNode );
+				return new PackageItem(this.rulesRepository, succeedingVersionNode);
             } else {
                 return null;
             }
         } catch ( Exception e ) {
-            log.error( "Caught exception",
-                       e );
+			log.error("Caught exception", e);
             throw new RulesRepositoryException( e );
         }
     }
@@ -646,11 +653,9 @@
      *  @param ignoreState The statuses to not include in the results (it will look
      *  at the status of the latest one).
      */
-    public Iterator getAssetsWithStatus(final StateItem state, final StateItem ignoreState) {
-        final Iterator rules = getAssets();
-
-        List result = new ArrayList();
-        while(rules.hasNext()) {
+    public Iterator<AssetItem> getAssetsWithStatus(final StateItem state, final StateItem ignoreState) {
+        List<AssetItem> result = new LinkedList<AssetItem>();
+        for (Iterator<AssetItem> rules = getAssets(); rules.hasNext();) {
             AssetItem head = (AssetItem) rules.next();
             if (head.sameState( state )) {
                 result.add( head );
@@ -658,20 +663,18 @@
                 //ignore this one
             }
             else {
-                List fullHistory = new ArrayList();
-                for ( Iterator iter = head.getHistory(); iter.hasNext(); ) {
-                    AssetItem element = (AssetItem) iter.next();
+                List<AssetItem> fullHistory = new LinkedList<AssetItem>();
+                for ( Iterator<AssetItem> iter = head.getHistory(); iter.hasNext(); ) {
+                    AssetItem element = iter.next();
                     if (!(element.getVersionNumber() == 0)) {
                         fullHistory.add( element );
                     }
                 }
 
                 sortHistoryByVersionNumber( fullHistory );
-
-
-                Iterator prev = fullHistory.iterator();
-                while (prev.hasNext()) {
-                    AssetItem prevRule = (AssetItem) prev.next();
+                
+                for (Iterator<AssetItem> prev = fullHistory.iterator(); prev.hasNext(); ) {
+                    AssetItem prevRule = prev.next();
                     if (prevRule.sameState( state )) {
                         result.add( prevRule );
                         break;
@@ -683,21 +686,13 @@
     }
 
 
-    void sortHistoryByVersionNumber(List fullHistory) {
-        Collections.sort( fullHistory, new Comparator() {
-
-            public int compare(Object o1,
-                               Object o2) {
-                AssetItem a1 = (AssetItem) o1;
-                AssetItem a2 = (AssetItem) o2;
+    void sortHistoryByVersionNumber(List<AssetItem> fullHistory) {
+        Collections.sort( fullHistory, new Comparator<AssetItem>() {
+            public int compare(AssetItem a1, AssetItem a2) {
                 long la1 = a1.getVersionNumber();
                 long la2 = a2.getVersionNumber();
-                if (la1 == la2) return 0;
-                else if (la1 < la2) return 1;
-                else return -1;
-
+                return la1 == la2 ? 0 : (la1 < la2 ? 1 : -1); 
             }
-
         });
     }
 
@@ -711,7 +706,7 @@
      * version with the appropriate state, and can't find one,
      * that asset is not included in the result.
      */
-    public Iterator getAssetsWithStatus(final StateItem state) {
+    public Iterator<AssetItem> getAssetsWithStatus(final StateItem state) {
         return getAssetsWithStatus( state, null );
     }
 
@@ -751,20 +746,20 @@
             this.updateStringProperty(values,CATEGORY_RULE_VALUES_PROPERTY_NAME);
             
         } catch ( Exception e ) {
-            log.error( "Caught Exception",
-                       e );
+			log.error("Caught Exception", e);
             throw new RulesRepositoryException( e );
         }
     }
     
-    private static HashMap convertFromObjectGraphs(final String[] keys, final String[] values){
-		HashMap hash = new HashMap();
+    private static HashMap<String, String> convertFromObjectGraphs(final String[] keys, final String[] values){
+		HashMap<String, String> hash = new HashMap<String, String>();
 		
 		for(int i=0; i < keys.length; i++){
 			hash.put(keys[i], values[i]);
 		}
 		return hash;
     }
+    
     public String[] convertStringToArray(String tagName){
     		//System.out.println("(convertStringToArray) Tags: " + tagName);
             List<String> list = new ArrayList<String>();
@@ -805,9 +800,8 @@
     public void changeStatus(String newState) {
         StateItem stateItem = rulesRepository.getState( newState );
         updateState( stateItem );
-        for ( Iterator iter = getAssets(); iter.hasNext(); ) {
-            AssetItem element = (AssetItem) iter.next();
-            element.updateState( stateItem );
+        for ( Iterator<AssetItem> iter = getAssets(); iter.hasNext(); ) {
+            iter.next().updateState( stateItem );
         }
     }
 
@@ -862,7 +856,7 @@
                 return null;
             }
         } catch ( Exception e ) {
-            log.error( e );
+            log.error( e.getMessage(), e );
             if (e instanceof RuntimeException) throw (RuntimeException) e;
             throw new RulesRepositoryException( e );
         }
@@ -871,30 +865,48 @@
     /**
      * Creates a nested package.
      */
-	public PackageItem createPackage(String subPackageName) throws RepositoryException {
+	public PackageItem createSubPackage(String subPackageName) throws RepositoryException {
 
 		node.checkout();
-        log.info( "USER:" + getCurrentUserName() + " CREATEING package [" + subPackageName + "]" );
-		
-        Node rulePackageNode = node.addNode( subPackageName, PackageItem.RULE_PACKAGE_TYPE_NAME );
+        log.info( "USER: {} CREATEING subpackage [{}] under [{}]", new Object[] {getCurrentUserName(), subPackageName, getName() });
+		Node subPkgsNode;
+        try {
+			subPkgsNode = node.getNode(RulesRepository.RULE_PACKAGE_AREA);
+		} catch (PathNotFoundException e) {
+			subPkgsNode = node.addNode(RulesRepository.RULE_PACKAGE_AREA, "nt:folder");
+		}
+//		subPkgsNode.checkout();
+        Node ruleSubPackageNode = subPkgsNode.addNode( subPackageName, PackageItem.RULE_PACKAGE_TYPE_NAME );
 
-        rulePackageNode.addNode( PackageItem.ASSET_FOLDER_NAME, "drools:versionableAssetFolder" );
+        ruleSubPackageNode.addNode( PackageItem.ASSET_FOLDER_NAME, "drools:versionableAssetFolder" );
 
-        rulePackageNode.setProperty( PackageItem.TITLE_PROPERTY_NAME, subPackageName );
+        ruleSubPackageNode.setProperty( PackageItem.TITLE_PROPERTY_NAME, subPackageName );
 
-        rulePackageNode.setProperty( AssetItem.DESCRIPTION_PROPERTY_NAME, "" );
-        rulePackageNode.setProperty( AssetItem.FORMAT_PROPERTY_NAME, PackageItem.PACKAGE_FORMAT );
-        rulePackageNode.setProperty( PackageItem.CREATOR_PROPERTY_NAME, this.rulesRepository.getSession().getUserID() );
+        ruleSubPackageNode.setProperty( AssetItem.DESCRIPTION_PROPERTY_NAME, "" );
+        ruleSubPackageNode.setProperty( AssetItem.FORMAT_PROPERTY_NAME, PackageItem.PACKAGE_FORMAT );
+        ruleSubPackageNode.setProperty( PackageItem.CREATOR_PROPERTY_NAME, this.rulesRepository.getSession().getUserID() );
         Calendar lastModified = Calendar.getInstance();
-        rulePackageNode.setProperty( PackageItem.LAST_MODIFIED_PROPERTY_NAME, lastModified );
+        ruleSubPackageNode.setProperty( PackageItem.LAST_MODIFIED_PROPERTY_NAME, lastModified );
+        ruleSubPackageNode.setProperty( PackageItem.CONTENT_PROPERTY_ARCHIVE_FLAG, false );
 
+		return new PackageItem(this.rulesRepository, ruleSubPackageNode);
+	}
 
-		return new PackageItem(this.rulesRepository, rulePackageNode);
+	/**
+	 * Returns a {@link PackageIterator} of its children
+	 * @return a {@link PackageIterator} of its children
+	 */
+	public PackageIterator listSubPackages() {
+		try {
+			return new PackageIterator(getRulesRepository(), node.getNode(RulesRepository.RULE_PACKAGE_AREA).getNodes());
+		} catch (PathNotFoundException e) {
+			return new PackageIterator();
+		} catch (RepositoryException e) {
+			throw new RulesRepositoryException(e);
+		}
 	}
-
+	
     private String getCurrentUserName() {
         return this.rulesRepository.getSession().getUserID();
     }
-
-
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/PackageIterator.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/PackageIterator.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/PackageIterator.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -11,29 +11,33 @@
  * This wraps a node iterator, and provides PackageItems when requested. This
  * supports lazy loading if needed.
  */
-public class PackageIterator implements Iterator {
-	
-	
-
+public class PackageIterator implements Iterator<PackageItem> {
 	private final NodeIterator packageNodeIterator;
 	private final RulesRepository repository;
 	private boolean searchArchived = false;
 	private Node current = null;
 	private Node next = null;
 
+	public PackageIterator() {
+		this(null, null);
+	}
+	
 	public PackageIterator(RulesRepository repository, NodeIterator packageNodes) {
 		this.packageNodeIterator = packageNodes;
 		this.repository = repository;
 	}
 
 	public boolean hasNext() {
+		if (packageNodeIterator == null) {
+			return false;
+		}
 		boolean hasnext = false;
 		if (this.next == null) {
 			while (this.packageNodeIterator.hasNext()) {
 				Node element = (Node) this.packageNodeIterator.next();
 				try {
 					//Do not return Global Area
-					if ((searchArchived || !element.getProperty("drools:archive").getBoolean()) && !RulesRepository.RULE_GLOBAL_AREA.equals(element.getName())) {
+					if ((searchArchived || !element.getProperty(VersionableItem.CONTENT_PROPERTY_ARCHIVE_FLAG).getBoolean()) && !RulesRepository.RULE_GLOBAL_AREA.equals(element.getName())) {
 						hasnext = true;
 						this.next = element;
 						break;
@@ -48,7 +52,7 @@
 		return hasnext;
 	}
 
-	public Object next() {
+	public PackageItem next() {
 		if (this.next == null) {
 			this.hasNext();
 		}

Modified: labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RepositorySessionUtil.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RepositorySessionUtil.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RepositorySessionUtil.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -18,17 +18,16 @@
  */
 public class RepositorySessionUtil {
 
-    private static ThreadLocal repo = new ThreadLocal();
+    private static ThreadLocal<RulesRepository> repo = new ThreadLocal<RulesRepository>();
 
-    private static final Logger log = Logger.getLogger( RepositorySessionUtil.class );
+//    private static final Logger log = Logger.getLogger( RepositorySessionUtil.class );
 
     public static boolean deleteDir(File dir) {
 
         if (dir.isDirectory()) {
             String[] children = dir.list();
             for (int i=0; i<children.length; i++) {
-                boolean success = deleteDir(new File(dir, children[i]));
-                if (!success) {
+                if (!deleteDir(new File(dir, children[i]))) {
                     return false;
                 }
             }
@@ -40,7 +39,7 @@
 
 
     public static RulesRepository getRepository() throws RulesRepositoryException {
-        Object repoInstance = repo.get();
+    	RulesRepository repoInstance = repo.get();
     	System.out.println("----------getRepository");
         if ( repoInstance == null ) {
         	
@@ -78,7 +77,7 @@
             }
         }
 
-        return (RulesRepository) repoInstance;
+        return repoInstance;
     }
 
 }

Modified: labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RulesRepository.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RulesRepository.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RulesRepository.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -1,6 +1,10 @@
 package org.drools.repository;
 
-import java.io.*;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Iterator;
@@ -10,14 +14,24 @@
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
-import javax.jcr.*;
+import javax.jcr.ImportUUIDBehavior;
+import javax.jcr.InvalidItemStateException;
+import javax.jcr.ItemExistsException;
+import javax.jcr.ItemNotFoundException;
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.Property;
+import javax.jcr.PropertyIterator;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
 import javax.jcr.query.Query;
 import javax.jcr.query.QueryResult;
-import javax.jcr.version.Version;
 
-import org.apache.log4j.Logger;
+import org.drools.repository.events.StorageEventManager;
 import org.drools.repository.migration.MigrateDroolsPackage;
-import org.drools.repository.events.StorageEventManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * RulesRepository is the class that defines the bahavior for the JBoss Rules
@@ -56,7 +70,7 @@
 
     public static final String  DROOLS_URI            = "http://www.jboss.org/drools-repository/1.0";
 
-    private static final Logger log                   = Logger.getLogger( RulesRepository.class );
+    private static final Logger log                   = LoggerFactory.getLogger( RulesRepository.class );
 
     /**
      * The name of the rulepackage area of the repository
@@ -134,8 +148,7 @@
         } catch ( PathNotFoundException e ) {
             // it doesn't exist yet, so create it
             try {
-                log.debug( new StringBuilder().append( "Adding new node of type: " ).append( type ).append( " named: " ).append( nodeName ).append( " to parent node named " ).append( parent.getName() ) );
-
+				log.debug("Adding new node of type: {} named: {} to parent node named {}", new Object[] {type, nodeName, parent.getName()});
                 node = parent.addNode( nodeName,
                                        type );
             } catch ( Exception e1 ) {
@@ -144,8 +157,7 @@
                 throw new RulesRepositoryException( e1 );
             }
         } catch ( Exception e ) {
-            log.error( "Caught Exception",
-                       e );
+            log.error( "Caught Exception", e );
             throw new RulesRepositoryException( e );
         }
         return node;
@@ -433,7 +445,7 @@
             Node n = areaNode.getNode( packageName );
             return n.hasNode( snapshotName );
         } catch ( RepositoryException e ) {
-            log.error( e );
+            log.error( e.getMessage(), e );
             throw new RulesRepositoryException( e );
         }
     }
@@ -445,7 +457,7 @@
             return new PackageItem( this,
                                     n );
         } catch ( RepositoryException e ) {
-            log.error( e );
+            log.error( e.getMessage(), e );
             throw new RulesRepositoryException( e );
         }
     }
@@ -636,7 +648,7 @@
             return new AssetItem( this,
                                   rulePackageNode );
         } catch (ItemNotFoundException e) {
-          log.warn(e);
+          log.warn(e.getMessage(), e);
           throw new RulesRepositoryException("That item does not exist.");
         } catch ( RepositoryException e ) {
 
@@ -704,12 +716,61 @@
     }
 
     /**
+     * Adds a Sub package to the repository.
+     *
+     * @param name
+     *            what to name the node added
+     * @param description
+     *            what description to use for the node
+     * @param parentPackage
+     * 			  parent node under which this new package will be created
+     * @return a PackageItem, encapsulating the created node
+     * @throws RulesRepositoryException
+     */	
+	public PackageItem createSubPackage(String name, String description, String parentPackage)
+			throws RulesRepositoryException {
+
+		try {
+			PackageItem pkg = loadPackage(parentPackage);
+			PackageItem subPkg = pkg.createSubPackage(name);
+
+			// create the node - see section 6.7.22.6 of the spec
+//			Node rulePackageNode = subPkg.node; // folderNode.addNode( name,
+												// PackageItem.RULE_PACKAGE_TYPE_NAME
+												// );
+
+//			rulePackageNode.addNode(PackageItem.ASSET_FOLDER_NAME, "drools:versionableAssetFolder");
+
+//			rulePackageNode.setProperty(PackageItem.TITLE_PROPERTY_NAME, name);
+//			rulePackageNode.setProperty(AssetItem.DESCRIPTION_PROPERTY_NAME, description);
+//			rulePackageNode.setProperty(AssetItem.FORMAT_PROPERTY_NAME, PackageItem.PACKAGE_FORMAT);
+//			rulePackageNode.setProperty(PackageItem.CREATOR_PROPERTY_NAME, this.session.getUserID());
+//
+//			Calendar lastModified = Calendar.getInstance();
+//			rulePackageNode.setProperty(PackageItem.LAST_MODIFIED_PROPERTY_NAME, lastModified);
+
+			subPkg.checkin("Initial");
+
+			if (StorageEventManager.hasSaveEvent()) {
+				StorageEventManager.getSaveEvent().onPackageCreate(subPkg);
+			}
+
+			return subPkg;
+		} catch (ItemExistsException e) {
+			throw new RulesRepositoryException("A package name must be unique.", e);
+		} catch (RepositoryException e) {
+			log.error("Error when creating a new rule package", e);
+			throw new RulesRepositoryException(e);
+		}
+	}
+    
+    /**
      * Gets a StateItem for the specified state name. If a node for the
      * specified state does not yet exist, one is first created.
      *
      * @param name
      *            the name of the state to get
-     * @return a StateItem object encapsulating the retreived node
+     * @return a StateItem object encapsulating the retrieved node
      * @throws RulesRepositoryException
      */
     public StateItem getState(String name) throws RulesRepositoryException {
@@ -724,7 +785,7 @@
             return new StateItem( this,
                                   stateNode );
         } catch ( Exception e ) {
-            log.error( e );
+            log.error( e.getMessage(), e );
             throw new RulesRepositoryException( e );
         }
     }
@@ -742,7 +803,7 @@
             return new StateItem( this,
                                   stateNode );
         } catch ( Exception e ) {
-            log.error( e );
+            log.error( e.getMessage(), e );
             throw new RulesRepositoryException( e );
         }
     }
@@ -890,10 +951,8 @@
             Node parentNode = ruleLink.getParent();
             if ( isNotSnapshot( parentNode ) && parentNode.getPrimaryNodeType().getName().equals( AssetItem.RULE_NODE_TYPE_NAME ) ) {
                 if ( seekArchivedAsset || !parentNode.getProperty( AssetItem.CONTENT_PROPERTY_ARCHIVE_FLAG ).getBoolean() ) {
-                    AssetItem ai = new AssetItem( this,
-                                                  parentNode );
-                    if ( filter == null || filter.accept( ai,
-                                                          "package.readonly" ) ) {
+                    AssetItem ai = new AssetItem( this, parentNode );
+                    if ( filter == null || filter.accept( ai, "package.readonly")) {
                         results.add( ai );
                         rows++;
                     }
@@ -901,8 +960,7 @@
             }
         }
 
-        return new AssetPageList( results,
-                                  it );
+        return new AssetPageList(results, it);
     }
 
     public AssetPageList findAssetsByCategory(String categoryTag,
@@ -922,7 +980,7 @@
                                       false,
                                       false );
         } catch (Exception e) {
-            log.error(e);
+            log.error(e.getMessage(), e);
             throw new RulesRepositoryException(e);
         }
 
@@ -996,10 +1054,10 @@
                        e );
             throw new RulesRepositoryException( message );
         } catch ( RepositoryException e ) {
-            log.error(e);
+            log.error(e.getMessage(), e);
             throw new RulesRepositoryException("Repository error when importing from stream.", e);
         } catch ( IOException e ) {
-            log.error(e);
+            log.error(e.getMessage(), e);
             throw new RulesRepositoryException(e);
 
         }
@@ -1027,10 +1085,10 @@
                 mig.migrate( this );
             }
         } catch ( RepositoryException e ) {
-            log.error(e);
+            log.error(e.getMessage(), e);
             throw new RulesRepositoryException(e);
         } catch ( IOException e ) {
-            log.error(e);
+            log.error(e.getMessage(), e);
             throw new RulesRepositoryException(e);
         }
     }
@@ -1150,7 +1208,7 @@
             itemOriginal.checkin( "Renamed asset " + itemOriginal.getName() );
             return itemOriginal.getUUID();
         } catch ( RepositoryException e ) {
-            log.error( e );
+            log.error( e.getMessage(), e );
             throw new RulesRepositoryException( e );
         }
     }
@@ -1171,7 +1229,7 @@
                                destPath );
             save();
         } catch ( RepositoryException e ) {
-            log.error( e );
+            log.error( e.getMessage(), e );
             throw new RulesRepositoryException( e );
         }
     }
@@ -1187,7 +1245,7 @@
                                destPath );
             save();
         } catch ( RepositoryException e ) {
-            log.error( e );
+            log.error( e.getMessage(), e );
             throw new RulesRepositoryException( e );
         }
     }
@@ -1222,7 +1280,7 @@
 
             return itemOriginal.getUUID();
         } catch ( RepositoryException e ) {
-            log.error( e );
+            log.error( e.getMessage(), e );
             throw new RulesRepositoryException( e );
         }
     }
@@ -1420,7 +1478,7 @@
                                            it.nextNode() ) );
             }
         } catch ( RepositoryException e ) {
-            log.error( e );
+            log.error( e.getMessage(), e );
             throw new RulesRepositoryException( e );
         }
         return (StateItem[]) states.toArray( new StateItem[states.size()] );
@@ -1455,7 +1513,7 @@
             save();
 
         } catch ( RepositoryException e ) {
-            log.error( e );
+            log.error( e.getMessage(), e );
             throw new RulesRepositoryException( e );
         }
 

Modified: labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/VersionableItem.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/VersionableItem.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/VersionableItem.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -1,12 +1,8 @@
 package org.drools.repository;
 
-import org.drools.repository.events.StorageEventManager;
-
 import java.util.ArrayList;
 import java.util.Calendar;
-import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 
 import javax.jcr.InvalidItemStateException;
 import javax.jcr.Node;
@@ -15,7 +11,10 @@
 import javax.jcr.RepositoryException;
 import javax.jcr.UnsupportedRepositoryOperationException;
 import javax.jcr.Value;
+import javax.jcr.lock.LockException;
 
+import org.drools.repository.events.StorageEventManager;
+
 /**
  * This is the parent class for versionable assets.
  * Contains standard fields based on Dublin Core, and
@@ -39,7 +38,6 @@
     public static final String VERSION_NUMBER_PROPERTY_NAME   = "drools:versionNumber";
     public static final String CONTENT_PROPERTY_ARCHIVE_FLAG  = "drools:archive";
 
-
     /** Dublin core based fields. */
     public static final String LAST_CONTRIBUTOR_PROPERTY_NAME = "drools:lastContributor";
     public static final String CREATOR_PROPERTY_NAME          = "drools:creator";
@@ -51,8 +49,6 @@
     public static final String COVERAGE_PROPERTY_NAME         = "drools:coverage";
     public static final String PUBLISHER_PROPERTY_NAME        = "drools:publisher";
 
-
-
     /**
      * The name of the state property on the rule node type
      */
@@ -63,7 +59,6 @@
      */
     public static final String CATEGORY_PROPERTY_NAME         = "drools:categoryReference";
 
-
     /**
      * The possible formats for the format property of the node
      */
@@ -109,40 +104,40 @@
 
 
     /**
-     * @return the predessor node of this node in the version history, or null if no predecessor version exists
+     * @return the predecessor node of this node in the version history, or null if no predecessor version exists
      * @throws RulesRepositoryException
      */
-    protected Node getPrecedingVersionNode() throws RulesRepositoryException {
-        try {
-            Node versionNode;
-            if ( this.node.getPrimaryNodeType().getName().equals( "nt:version" ) ) {
-                versionNode = this.node;
-            } else {
-                versionNode = this.node.getBaseVersion();
-            }
+	protected Node getPrecedingVersionNode() throws RulesRepositoryException {
+		try {
+			Node versionNode;
+			if (this.node.getPrimaryNodeType().getName().equals("nt:version")) {
+				versionNode = this.node;
+			} else {
+				versionNode = this.node.getBaseVersion();
+			}
 
-            Property predecessorsProperty = versionNode.getProperty( "jcr:predecessors" );
-            Value[] predecessorValues = predecessorsProperty.getValues();
+			Property predecessorsProperty = versionNode.getProperty("jcr:predecessors");
+			Value[] predecessorValues = predecessorsProperty.getValues();
 
-            if ( predecessorValues.length > 0 ) {
-                Node predecessorNode = this.node.getSession().getNodeByUUID( predecessorValues[0].getString() );
+			if (predecessorValues.length > 0) {
+				Node predecessorNode = this.node.getSession().getNodeByUUID(predecessorValues[0].getString());
 
-                //we don't want to return the root node - it isn't a true predecessor
-                if ( predecessorNode.getName().equals( "jcr:rootVersion" ) ) {
-                    return null;
-                }
+				// we don't want to return the root node - it isn't a true
+				// predecessor
+				if (predecessorNode.getName().equals("jcr:rootVersion")) {
+					return null;
+				}
 
-                return predecessorNode;
-            }
-        } catch ( PathNotFoundException e ) {
-            //do nothing - this will happen if no predecessors exits
-        } catch ( Exception e ) {
-            log.error( "Caught exception",
-                       e );
-            throw new RulesRepositoryException( e );
-        }
-        return null;
-    }
+				return predecessorNode;
+			}
+		} catch (PathNotFoundException e) {
+			// do nothing - this will happen if no predecessors exits
+		} catch (Exception e) {
+			log.error("Caught exception", e);
+			throw new RulesRepositoryException(e);
+		}
+		return null;
+	}
 
     /**
      * @return the successor node of this node in the version history
@@ -327,9 +322,36 @@
         }
     }
 
+	/**
+	 * optionally update last updated...
+	 */
+	public void updateStringArrayProperty(String[] value, String prop, boolean setLastUpdated) {
+		try {
+			checkIsUpdateable();
 
+			if (value == null) {
+				return;
+			}
 
+			node.checkout();
+			node.setProperty(prop, value);
+			if (setLastUpdated) {
+				Calendar lastModified = Calendar.getInstance();
+				this.node.setProperty(LAST_MODIFIED_PROPERTY_NAME, lastModified);
+				this.node.setProperty(LAST_CONTRIBUTOR_PROPERTY_NAME, node.getSession().getUserID());
+			}
 
+		} catch (RulesRepositoryException e) {
+			throw new RulesRepositoryException(e);
+		} catch (UnsupportedRepositoryOperationException e) {
+			throw new RulesRepositoryException(e);
+		} catch (LockException e) {
+			throw new RulesRepositoryException(e);
+		} catch (RepositoryException e) {
+			throw new RulesRepositoryException(e);
+		}
+	}
+
     /**
      * See the Dublin Core documentation for more
      * explanation: http://dublincore.org/documents/dces/
@@ -417,7 +439,7 @@
     
     /**
      * This returns the format of an item.
-     * This is analagous to a file extension
+     * This is analogous to a file extension
      * if the resource was a file (it may contain more information
      * then a pure file extension could, however).
      *
@@ -427,18 +449,17 @@
      * @return the format of this object's node
      * @throws RulesRepositoryException
      */
-    public String getFormat() throws RulesRepositoryException {
-        try {
-            Node theNode = getVersionContentNode();
+	public String getFormat() throws RulesRepositoryException {
+		try {
+			Node theNode = getVersionContentNode();
 
-            Property data = theNode.getProperty( FORMAT_PROPERTY_NAME );
-            return data.getValue().getString();
-        } catch ( Exception e ) {
-            log.error( "Caught Exception",
-                       e );
-            throw new RulesRepositoryException( e );
-        }
-    }
+			Property data = theNode.getProperty(FORMAT_PROPERTY_NAME);
+			return data.getValue().getString();
+		} catch (Exception e) {
+			log.error("Caught Exception", e);
+			throw new RulesRepositoryException(e);
+		}
+	}
 
     /**
      * This sets the format (or "file extension" of the resource).
@@ -468,26 +489,25 @@
     /**
      * This deals with a node which *may* be a version, if it is, it grabs the frozen copy.
      */
-    protected Node getRealContentFromVersion(Node node) throws RepositoryException,
-                                            PathNotFoundException {
-        if ( node.getPrimaryNodeType().getName().equals( "nt:version" ) ) {
-            return node.getNode( "jcr:frozenNode" );
-        } else {
-            return node;
-        }
-    }
+	protected Node getRealContentFromVersion(Node node) throws RepositoryException, PathNotFoundException {
+		if (node.getPrimaryNodeType().getName().equals("nt:version")) {
+			return node.getNode("jcr:frozenNode");
+		} else {
+			return node;
+		}
+	}
 
     /**
      * Need to get the name from the content node, not the version node
      * if it is in fact a version !
      */
-    public String getName() {
-        try {
-                return getVersionContentNode().getName();
-        } catch ( RepositoryException e ) {
-            throw new RulesRepositoryException( e );
-        }
-    }
+	public String getName() {
+		try {
+			return getVersionContentNode().getName();
+		} catch (RepositoryException e) {
+			throw new RulesRepositoryException(e);
+		}
+	}
 
     /**
      * This will check out the node prior to editing.

Modified: labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/PackageItemTest.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/PackageItemTest.java	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/PackageItemTest.java	2010-03-25 19:26:29 UTC (rev 32217)
@@ -74,7 +74,7 @@
         repo.save();
 
 
-        PackageItem pkgNested = p.createPackage("NestedGoodness");
+        PackageItem pkgNested = p.createSubPackage("NestedGoodness");
         assertNotNull(pkgNested);
 
         int n = iteratorToList(repo.listPackages()).size();

Modified: labs/jbossrules/trunk/pom.xml
===================================================================
--- labs/jbossrules/trunk/pom.xml	2010-03-25 19:13:02 UTC (rev 32216)
+++ labs/jbossrules/trunk/pom.xml	2010-03-25 19:26:29 UTC (rev 32217)
@@ -255,6 +255,7 @@
 <module>drools-ant</module>
 <module>drools-repository</module>
 <module>drools-guvnor</module>
+<module>drools-factconstraint</module>
 <module>drools-planner</module>
 <module>drools-container/drools-mc</module>
 <!--module>drools-agent-jini</module-->
@@ -345,6 +346,7 @@
             <module>drools-ant</module>
             <module>drools-repository</module>
             <module>drools-guvnor</module>
+            <module>drools-factconstraint</module>
             <module>drools-planner</module>
             <module>drools-container/drools-mc</module>
          </modules>
@@ -448,6 +450,7 @@
             <module>drools-ant</module>
             <module>drools-repository</module>
             <module>drools-guvnor</module>
+            <module>drools-factconstraint</module>
             <!--module>drools-planner</module-->
             <module>drools-container/drools-mc</module>
          </modules>
@@ -660,6 +663,7 @@
             <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>cobertura-maven-plugin</artifactId>
+               <version>2.3</version>
                <configuration>
                   <instrumentation>
                      <excludes>
@@ -1018,6 +1022,11 @@
          </dependency>
          <dependency>
             <groupId>org.drools</groupId>
+            <artifactId>drools-factconstraint</artifactId>
+            <version>${project.version}</version>
+         </dependency>
+         <dependency>
+            <groupId>org.drools</groupId>
             <artifactId>drools-guvnor</artifactId>
             <type>test-jar</type>
             <version>${project.version}</version>
@@ -1108,12 +1117,6 @@
 		</dependency>
 
 		<dependency>
-			<groupId>org.milyn</groupId>
-			<artifactId>milyn-smooks-javabean</artifactId>
-			<version>1.1</version>
-		</dependency>	
-
-		<dependency>
 			<groupId>javax.jms</groupId>
 			<artifactId>jms</artifactId>
 			<version>1.1</version>



More information about the jboss-svn-commits mailing list