[jboss-svn-commits] JBL Code SVN: r10255 - in labs/jbossrules/trunk/drools-jbrms/src: main/java/org/drools/brms/client/common and 9 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Mar 16 04:36:24 EDT 2007


Author: michael.neale at jboss.com
Date: 2007-03-16 04:36:24 -0400 (Fri, 16 Mar 2007)
New Revision: 10255

Added:
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/common/ValidationMessageWidget.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rpc/ValidatedResponse.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rulelist/AssetBrowser.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rulelist/RuleListViewLegacy.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/public/images/attention_needed.png
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/public/images/warning.gif
Removed:
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rulelist/RuleListView.java
Modified:
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/RulesFeature.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/packages/PackageEditor.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rpc/RepositoryService.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rpc/RepositoryServiceAsync.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/JBRMSServiceServlet.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/rules/SuggestionCompletionLoader.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/util/SuggestionCompletionEngineBuilder.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/ServiceImplementationTest.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/rules/SuggestionCompletionLoaderTest.java
Log:
JBRULES-735 Validation

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/RulesFeature.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/RulesFeature.java	2007-03-16 08:35:09 UTC (rev 10254)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/RulesFeature.java	2007-03-16 08:36:24 UTC (rev 10255)
@@ -1,52 +1,13 @@
 package org.drools.brms.client;
 
-import java.util.HashMap;
-import java.util.Map;
+import org.drools.brms.client.rulelist.AssetBrowser;
 
-import org.drools.brms.client.categorynav.CategoryExplorerWidget;
-import org.drools.brms.client.categorynav.CategorySelectHandler;
-import org.drools.brms.client.common.AssetFormats;
-import org.drools.brms.client.common.GenericCallback;
-import org.drools.brms.client.common.LoadingPopup;
-import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
-import org.drools.brms.client.packages.SuggestionCompletionCache;
-import org.drools.brms.client.rpc.RepositoryServiceFactory;
-import org.drools.brms.client.rpc.RuleAsset;
-import org.drools.brms.client.rpc.TableDataResult;
-import org.drools.brms.client.ruleeditor.EditorLauncher;
-import org.drools.brms.client.ruleeditor.NewAssetWizard;
-import org.drools.brms.client.ruleeditor.RuleViewer;
-import org.drools.brms.client.rulelist.AssetItemListViewer;
-import org.drools.brms.client.rulelist.EditItemEvent;
-import org.drools.brms.client.rulelist.QuickFindWidget;
-
-import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.DeferredCommand;
-import com.google.gwt.user.client.ui.ClickListener;
-import com.google.gwt.user.client.ui.FlexTable;
-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.TabPanel;
-import com.google.gwt.user.client.ui.Widget;
-import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
-
 /**
  * This controls the "Rules manager" top level feature.
- * TODO: refactor this into a "AssetExplorer" widget, this feature should purely be 
- * for layout.
  * @author Michael Neale
  */
 public class RulesFeature extends JBRMSFeature {
 
-    public static final int       EDITOR_TAB         = 1;
-    private TabPanel tab;
-    private Map openedViewers = new HashMap();
-    private AssetItemListViewer list;
-    
-    
-    
 	public static ComponentInfo init() {
 		return new ComponentInfo("Rules", "Find and edit rules.") {
 			public JBRMSFeature createInstance() {
@@ -56,139 +17,9 @@
 		};
 	}
 
-
 	
 	public RulesFeature() {
-        tab = new TabPanel();
-        tab.setWidth("100%");
-        tab.setHeight("100%");        
-
-        FlexTable explorePanel = doExplorer();        
-        
-        tab.add(explorePanel, "Explore");
-
-        tab.selectTab(0);
-        
-		initWidget(tab);
+	    initWidget( new AssetBrowser() );
 	}
-    
-    
 
-    /** This will setup the explorer tab */
-	private FlexTable doExplorer() {
-		final FlexTable  table = new FlexTable();
-        //and the the delegate to open an editor for a rule resource when
-        //chosen to
-        list = new AssetItemListViewer(new EditItemEvent() {
-            public void open(String key) {                  
-                showLoadEditor( key );
-            }
-        });    
-        
-        
-        FlexCellFormatter formatter = table.getFlexCellFormatter();
-
-        
-        //setup the nav, which will drive the list
-		CategoryExplorerWidget nav = new CategoryExplorerWidget(new CategorySelectHandler() {
-            public void selected(final String selectedPath) {
-                Command load = getRuleListLoadingCommand( list,
-                                           selectedPath );
-                table.setWidget( 0, 1, list );
-                DeferredCommand.add( load );
-                list.setRefreshCommand(load);                
-            }
-
-        });		
-        
-        final QuickFindWidget quick = new QuickFindWidget(new EditItemEvent() {
-            public void open(String key) {                  
-                showLoadEditor( key );
-            }
-        });
-        
-        table.setWidget( 0, 0, nav );
-		table.setWidget( 0, 1, quick);
-        
-        formatter.setAlignment( 0, 1, HasHorizontalAlignment.ALIGN_LEFT, HasVerticalAlignment.ALIGN_TOP );
-        formatter.setAlignment( 0, 0, HasHorizontalAlignment.ALIGN_LEFT, HasVerticalAlignment.ALIGN_TOP );        
-        formatter.setRowSpan( 0, 1, 3 );
-        formatter.setWidth( 0, 0, "30%" );
-        formatter.setWidth( 0, 1, "70%" );
-
-        formatter.setHeight( 0, 0, "90%" );
-
-        table.setText( 2, 0, "" );
-        
-        Image newRule = new Image("images/new_rule.gif");
-        newRule.setTitle( "Create new rule" );
-
-        newRule.addClickListener( new ClickListener() {
-            public void onClick(Widget w) {
-              showNewAssetWizard();
-            }
-        });
-        
-        Image showFinder = new Image("images/find_items.gif");
-        showFinder.setTitle( "Show the name finder." );
-        showFinder.addClickListener( new ClickListener() {
-            public void onClick(Widget w) {
-                table.setWidget( 0, 1, quick );
-            }
-        } );
-        
-        HorizontalPanel actions = new HorizontalPanel();
-        actions.add( showFinder );
-        actions.add( newRule );
-        table.setWidget( 1, 0, actions);
-        formatter.setHeight( 1, 0, "5%" );
-        formatter.setAlignment( 1, 0, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_TOP);
-        formatter.setStyleName( 1, 0, "new-asset-Icons" );
-        
-		return table;
-	}
-
-    private Command getRuleListLoadingCommand(final AssetItemListViewer list,
-                                              final String selectedPath) {
-        return new Command() {
-            public void execute() {
-              RepositoryServiceFactory.getService().loadRuleListForCategories( selectedPath,
-              new GenericCallback() {
-                      public void onSuccess(Object o) {
-                          TableDataResult result = (TableDataResult) o;
-                          list.loadTableData( result );                                                                                 
-                      }
-
-                  } );                    
-              }                    
-        };
-    }
-
-    public void showLoadEditor(String uuid) {
-        EditorLauncher.showLoadEditor( openedViewers, tab, uuid, false );
-    }
-
-    private void showNewAssetWizard() {
-        int left = 70;
-          int top = 100;
-            
-          NewAssetWizard pop = new NewAssetWizard(new EditItemEvent() {
-              public void open(String key) {                  
-                  showLoadEditor( key );
-                  
-              }
-          }, true, null, "Create a new rule");
-          pop.setPopupPosition( left, top );
-          
-          pop.show();
-    }
-
-
-
-
-
-
-
-
-
 }

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/common/ValidationMessageWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/common/ValidationMessageWidget.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/common/ValidationMessageWidget.java	2007-03-16 08:36:24 UTC (rev 10255)
@@ -0,0 +1,43 @@
+package org.drools.brms.client.common;
+
+import com.google.gwt.user.client.ui.TextArea;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * This presents validation error messages to the user, from the server side.
+ * Such as validation or compile errors.
+ * 
+ * @author Michael Neale
+ */
+public class ValidationMessageWidget extends FormStylePopup {
+    
+    /**
+     * The heading is the short description in bold at the top.
+     */
+    public ValidationMessageWidget(String heading, String body) {
+
+        super("images/attention_needed.png", heading);
+        addAttribute( "Detail:", details(body) );
+        //addRow( close() );
+        
+    }
+
+//    private Widget close() {
+//        Image img = new Image("images/close.gif");
+//        img.addClickListener( new ClickListener() {
+//            public void onClick(Widget w) {
+//                hide();
+//            }
+//        } );
+//        return img;
+//    }
+
+    private Widget details(String body) {
+        TextArea area = new TextArea();
+        area.setStyleName( "editable-Surface" );
+        area.setVisibleLines( 12 );
+        area.setText( body );
+        area.setWidth( "100%" );       
+        return area;
+    }
+}


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

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/packages/PackageEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/packages/PackageEditor.java	2007-03-16 08:35:09 UTC (rev 10254)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/packages/PackageEditor.java	2007-03-16 08:36:24 UTC (rev 10255)
@@ -9,9 +9,11 @@
 import org.drools.brms.client.common.GenericCallback;
 import org.drools.brms.client.common.LoadingPopup;
 import org.drools.brms.client.common.StatusChangePopup;
+import org.drools.brms.client.common.ValidationMessageWidget;
 import org.drools.brms.client.rpc.PackageConfigData;
 import org.drools.brms.client.rpc.RepositoryServiceFactory;
 import org.drools.brms.client.rpc.SnapshotInfo;
+import org.drools.brms.client.rpc.ValidatedResponse;
 
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.Timer;
@@ -24,6 +26,7 @@
 import com.google.gwt.user.client.ui.Image;
 import com.google.gwt.user.client.ui.Label;
 import com.google.gwt.user.client.ui.RadioButton;
+import com.google.gwt.user.client.ui.SimplePanel;
 import com.google.gwt.user.client.ui.TextArea;
 import com.google.gwt.user.client.ui.TextBox;
 import com.google.gwt.user.client.ui.VerticalPanel;
@@ -38,6 +41,7 @@
 
     private PackageConfigData conf;
     private HTML status;
+    protected ValidatedResponse previousResponse;
 
     public PackageEditor(PackageConfigData data) {
         this.conf = data;
@@ -54,6 +58,10 @@
         clear();
         addHeader( "images/package_large.png", this.conf.name );
         
+
+        addRow( warnings() );
+                
+        
         addAttribute( "Description:", description() );
         addAttribute( "Header:", header() );
         addAttribute( "External URI:", externalURI() );
@@ -82,6 +90,28 @@
         addRow( saveWidgets() );
     }
 
+    private Widget warnings() {
+        if (this.previousResponse != null && this.previousResponse.hasErrors) {
+            Image img = new Image("images/warning.gif");
+            HorizontalPanel h = new HorizontalPanel();
+            h.add( img );
+            HTML msg = new HTML("<b>There were errors validating this package configuration.");
+            h.add( msg );
+            Button show = new Button("View errors");
+            show.addClickListener( new ClickListener() {
+                public void onClick(Widget w) {
+                    ValidationMessageWidget wid = new ValidationMessageWidget(previousResponse.errorHeader, previousResponse.errorMessage);
+                    wid.setPopupPosition( Window.getClientWidth()/4, w.getAbsoluteTop()  );
+                    wid.show();
+                }
+            } );
+            h.add( show );
+            return h;
+        } else {
+            return new SimplePanel();
+        }
+    }
+
     protected void showStatusChanger(Widget w) {
         final StatusChangePopup pop = new StatusChangePopup(conf.uuid, true);
         pop.setChangeStatusEvent(new Command() {
@@ -220,6 +250,8 @@
         LoadingPopup.showMessage( "Saving package configuration. Please wait ..." );
         RepositoryServiceFactory.getService().savePackage( this.conf, new GenericCallback() {
             public void onSuccess(Object data) {
+                previousResponse = (ValidatedResponse) data;
+                
                 reload();
                 SuggestionCompletionCache.getInstance().removePackage( conf.name );
                 LoadingPopup.showMessage( "Package configuration updated successfully" );

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rpc/RepositoryService.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rpc/RepositoryService.java	2007-03-16 08:35:09 UTC (rev 10254)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rpc/RepositoryService.java	2007-03-16 08:36:24 UTC (rev 10255)
@@ -89,9 +89,12 @@
     
     /**
      * Saves the package config data in place (does not create a new version of anything).
-     * @return The UUID of the saved item.
+     * @return A ValidatedReponse, with any errors to be reported.
+     * No payload is in the response. If there are any errors, the user
+     * should be given the option to review them, and correct them if needed
+     * (but a save will not be prevented this way - as its not an exception).
      */
-    public String savePackage(PackageConfigData data) throws SerializableException;
+    public ValidatedResponse savePackage(PackageConfigData data) throws SerializableException;
         
     
     /**

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rpc/RepositoryServiceAsync.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rpc/RepositoryServiceAsync.java	2007-03-16 08:35:09 UTC (rev 10254)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rpc/RepositoryServiceAsync.java	2007-03-16 08:36:24 UTC (rev 10255)
@@ -41,5 +41,4 @@
     public void removeCategory(java.lang.String p0, AsyncCallback cb);
     public void loadSuggestionCompletionEngine(java.lang.String p0, AsyncCallback cb);
     public void changeState(java.lang.String p0, java.lang.String p1, boolean p2, AsyncCallback cb);
-
 }

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rpc/ValidatedResponse.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rpc/ValidatedResponse.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rpc/ValidatedResponse.java	2007-03-16 08:36:24 UTC (rev 10255)
@@ -0,0 +1,28 @@
+package org.drools.brms.client.rpc;
+
+import com.google.gwt.user.client.rpc.IsSerializable;
+
+/**
+ * This is used for services that validate.
+ * Ie they may provide a validation error to be reported.
+ * 
+ * @author Michael Neale
+ */
+public class ValidatedResponse
+    implements
+    IsSerializable {
+
+    /**
+     * If this is true, then the errorHeader and messages should be displayed.
+     */
+    public boolean hasErrors;
+    public String errorHeader;
+    public String errorMessage;
+    
+    /**
+     * Optional payload, if some more is needed.
+     */
+    public IsSerializable payload;
+    
+    
+}


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

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rulelist/AssetBrowser.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rulelist/AssetBrowser.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rulelist/AssetBrowser.java	2007-03-16 08:36:24 UTC (rev 10255)
@@ -0,0 +1,165 @@
+package org.drools.brms.client.rulelist;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.brms.client.categorynav.CategoryExplorerWidget;
+import org.drools.brms.client.categorynav.CategorySelectHandler;
+import org.drools.brms.client.common.GenericCallback;
+import org.drools.brms.client.rpc.RepositoryServiceFactory;
+import org.drools.brms.client.rpc.TableDataResult;
+import org.drools.brms.client.ruleeditor.EditorLauncher;
+import org.drools.brms.client.ruleeditor.NewAssetWizard;
+
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.DeferredCommand;
+import com.google.gwt.user.client.ui.ClickListener;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.FlexTable;
+import com.google.gwt.user.client.ui.HasHorizontalAlignment;
+import com.google.gwt.user.client.ui.HasVerticalAlignment;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.TabPanel;
+import com.google.gwt.user.client.ui.Widget;
+import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
+
+/**
+ * This is the category based asset browser (ie it has a category tree browser, as well as 
+ * a search box).
+ * 
+ * @author Michael Neale
+ */
+public class AssetBrowser extends Composite {
+    
+    public static final int       EDITOR_TAB         = 1;
+    private TabPanel tab;
+    private Map openedViewers = new HashMap();
+    private AssetItemListViewer list;
+    
+    public AssetBrowser() {
+        tab = new TabPanel();
+        tab.setWidth("100%");
+        tab.setHeight("100%");        
+
+        FlexTable explorePanel = doExplorer();        
+        
+        tab.add(explorePanel, "Explore");
+
+        tab.selectTab(0);
+        
+        initWidget(tab);    
+    }
+    
+    /** This will setup the explorer tab */
+    private FlexTable doExplorer() {
+        final FlexTable  table = new FlexTable();
+        //and the the delegate to open an editor for a rule resource when
+        //chosen to
+        list = new AssetItemListViewer(new EditItemEvent() {
+            public void open(String key) {                  
+                showLoadEditor( key );
+            }
+        });    
+        
+        
+        FlexCellFormatter formatter = table.getFlexCellFormatter();
+
+        
+        //setup the nav, which will drive the list
+        CategoryExplorerWidget nav = new CategoryExplorerWidget(new CategorySelectHandler() {
+            public void selected(final String selectedPath) {
+                Command load = getRuleListLoadingCommand( list,
+                                           selectedPath );
+                table.setWidget( 0, 1, list );
+                DeferredCommand.add( load );
+                list.setRefreshCommand(load);                
+            }
+
+        });     
+        
+        final QuickFindWidget quick = new QuickFindWidget(new EditItemEvent() {
+            public void open(String key) {                  
+                showLoadEditor( key );
+            }
+        });
+        
+        table.setWidget( 0, 0, nav );
+        table.setWidget( 0, 1, quick);
+        
+        formatter.setAlignment( 0, 1, HasHorizontalAlignment.ALIGN_LEFT, HasVerticalAlignment.ALIGN_TOP );
+        formatter.setAlignment( 0, 0, HasHorizontalAlignment.ALIGN_LEFT, HasVerticalAlignment.ALIGN_TOP );        
+        formatter.setRowSpan( 0, 1, 3 );
+        formatter.setWidth( 0, 0, "30%" );
+        formatter.setWidth( 0, 1, "70%" );
+
+        formatter.setHeight( 0, 0, "90%" );
+
+        table.setText( 2, 0, "" );
+        
+        Image newRule = new Image("images/new_rule.gif");
+        newRule.setTitle( "Create new rule" );
+
+        newRule.addClickListener( new ClickListener() {
+            public void onClick(Widget w) {
+              showNewAssetWizard();
+            }
+        });
+        
+        Image showFinder = new Image("images/find_items.gif");
+        showFinder.setTitle( "Show the name finder." );
+        showFinder.addClickListener( new ClickListener() {
+            public void onClick(Widget w) {
+                table.setWidget( 0, 1, quick );
+            }
+        } );
+        
+        HorizontalPanel actions = new HorizontalPanel();
+        actions.add( showFinder );
+        actions.add( newRule );
+        table.setWidget( 1, 0, actions);
+        formatter.setHeight( 1, 0, "5%" );
+        formatter.setAlignment( 1, 0, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_TOP);
+        formatter.setStyleName( 1, 0, "new-asset-Icons" );
+        
+        return table;
+    }
+
+    private Command getRuleListLoadingCommand(final AssetItemListViewer list,
+                                              final String selectedPath) {
+        return new Command() {
+            public void execute() {
+              RepositoryServiceFactory.getService().loadRuleListForCategories( selectedPath,
+              new GenericCallback() {
+                      public void onSuccess(Object o) {
+                          TableDataResult result = (TableDataResult) o;
+                          list.loadTableData( result );                                                                                 
+                      }
+
+                  } );                    
+              }                    
+        };
+    }
+
+    public void showLoadEditor(String uuid) {
+        EditorLauncher.showLoadEditor( openedViewers, tab, uuid, false );
+    }
+
+    private void showNewAssetWizard() {
+        int left = 70;
+          int top = 100;
+            
+          NewAssetWizard pop = new NewAssetWizard(new EditItemEvent() {
+              public void open(String key) {                  
+                  showLoadEditor( key );
+                  
+              }
+          }, true, null, "Create a new rule");
+          pop.setPopupPosition( left, top );
+          
+          pop.show();
+    }
+    
+    
+    
+}


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

Deleted: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rulelist/RuleListView.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rulelist/RuleListView.java	2007-03-16 08:35:09 UTC (rev 10254)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rulelist/RuleListView.java	2007-03-16 08:36:24 UTC (rev 10255)
@@ -1,294 +0,0 @@
-//package org.drools.brms.client.rulelist;
-//
-//import org.drools.brms.client.rpc.RepositoryServiceAsync;
-//import org.drools.brms.client.rpc.RepositoryServiceFactory;
-//import org.drools.brms.client.rpc.TableConfig;
-//
-//import com.google.gwt.user.client.rpc.AsyncCallback;
-//import com.google.gwt.user.client.ui.ClickListener;
-//import com.google.gwt.user.client.ui.Composite;
-//import com.google.gwt.user.client.ui.Grid;
-//import com.google.gwt.user.client.ui.HTML;
-//import com.google.gwt.user.client.ui.HorizontalPanel;
-//import com.google.gwt.user.client.ui.Image;
-//import com.google.gwt.user.client.ui.SourcesTableEvents;
-//import com.google.gwt.user.client.ui.TableListener;
-//import com.google.gwt.user.client.ui.VerticalPanel;
-//import com.google.gwt.user.client.ui.Widget;
-//
-///**
-// * NOTE: this is not currently used, but it worked OK.
-// * It did NOT have sorting, but did have paging, and performed reasonably well.
-// * 
-// * SO KEEP THIS AROUND IN CASE THE OTHER ONE BLOWS CHUNKS !
-// * This one is based on the mail app example.
-// * 
-// * A composite that displays an explorer and a list view.
-// */
-//public class RuleListView extends Composite
-//    implements
-//    TableListener,
-//    ClickListener {
-//
-//    
-//    public static final String RULE_LIST_TABLE_ID = "ruleList";
-//
-//    private int                    visibleItemCount = -1;
-//
-//    private HTML                   countLabel         = new HTML();
-//    private HTML                   prevButton         = new HTML( "<a href='javascript:;'>&lt; prev</a>",
-//                                                                  true );
-//    private HTML                   nextButton         = new HTML( "<a href='javascript:;'>next &gt;</a>",
-//                                                                  true );
-//    private HTML                   editButton         = new HTML( "<a href='javascript:;'>edit</a>",
-//                                                                  true );
-//
-//    private int                    startIndex, selectedRow = -1;
-//    private Grid              table              = new Grid();
-//    private HorizontalPanel        navBar             = new HorizontalPanel();
-//    
-//    
-//    private static final RepositoryServiceAsync service = RepositoryServiceFactory.getService();
-//    private String[][] data;
-//    protected int numberOfColumns;
-//    private EditItemEvent editEvent;
-//
-//    public RuleListView(EditItemEvent event) {
-//
-//        this.editEvent = event;
-//        
-//
-//        // Setup the table.
-//        table.setCellSpacing( 0 );
-//        table.setCellPadding( 0 );
-//        table.setWidth( "100%" );
-//
-//        // Hook up events.
-//        table.addTableListener( this );
-//        prevButton.addClickListener( this );
-//        nextButton.addClickListener( this );
-//        editButton.addClickListener( this );
-//
-//        // Create the 'navigation' bar at the upper-right.
-//        HorizontalPanel innerNavBar = new HorizontalPanel();
-//        innerNavBar.setStyleName( "rule-ListNavBar" );
-//        innerNavBar.setSpacing( 8 );
-//        
-//        innerNavBar.add( prevButton );
-//        innerNavBar.add( countLabel );
-//        innerNavBar.add( nextButton );
-//        innerNavBar.add( editButton );
-//        
-//        navBar.setHorizontalAlignment( HorizontalPanel.ALIGN_RIGHT );
-//        navBar.add( innerNavBar );
-//        navBar.setWidth( "100%" );
-//
-//        //this is so we can stack controls on top of the table
-//        VerticalPanel vert = new VerticalPanel();
-//        vert.add( navBar );
-//        vert.add( table );
-//        vert.setStyleName( "rule-List" );
-//        vert.setWidth( "100%" );
-//        
-//        table.setStyleName( "rule-List" );
-//        table.setWidth( "100%" );
-//        
-//        // needed for composite to work
-//        initWidget( vert );
-//        setStyleName( "rule-List" );
-//        initTable();
-//
-//    }
-//
-//    public void onCellClicked(SourcesTableEvents sender,
-//                              int row,
-//                              int cell) {
-//        // Select the row that was clicked (-1 to account for header row).
-//        if ( row > 0 ) selectRow( row - 1 );
-//    }
-//
-//    public void onClick(Widget sender) {
-//        if ( sender == nextButton ) {
-//            // Move forward a page.
-//            startIndex += visibleItemCount;
-//            if ( startIndex >= data.length ) startIndex -= visibleItemCount;
-//            else {
-//                styleRow( selectedRow,
-//                          false );
-//                selectedRow = -1;
-//                update();
-//            }
-//        } else if ( sender == prevButton ) {
-//            // Move back a page.
-//            startIndex -= visibleItemCount;
-//            if ( startIndex < 0 ) startIndex = 0;
-//            else {
-//                styleRow( selectedRow,
-//                          false );
-//                selectedRow = -1;
-//                update();
-//            }
-//        } else if ( sender == editButton ) {
-//            openEditor();
-//        }
-//    }
-//
-//    /**
-//     * Open the editor as pertains to the selected row !
-//     */
-//    private void openEditor() {
-//        if (selectedRow < data.length) {
-//            this.editEvent.open( data[selectedRow][0] );
-//        }
-//    }
-//
-//    /**
-//     * Initializes the table. Will load the header config, initialise etc.
-//     */
-//    private void initTable() {
-//        // Create the header row.
-//
-//        table.resize( 1, 1 );
-//        table.getRowFormatter().setStyleName( 0, "rule-ListHeader" );  
-//        table.setText( 0, 0, "Please wait..." );    
-//        
-//        service.loadTableConfig( RULE_LIST_TABLE_ID, new AsyncCallback() {
-//
-//            public void onFailure(Throwable caught) {
-//                //TODO
-//            }
-//
-//            public void onSuccess(Object result) {
-//                TableConfig config = (TableConfig) result;
-//                
-//                String[] header = config.headers;
-//                numberOfColumns = header.length;                
-//                
-//                visibleItemCount = config.rowsPerPage;
-//                table.resize( visibleItemCount + 1, numberOfColumns);
-// 
-//                for ( int i = 0; i < numberOfColumns; i++ ) {
-//                    table.setText( 0, i, header[i]);
-//                }   
-//                
-//                data = new String[1][numberOfColumns];
-//                update();      
-//                
-//            }
-//            
-//        });
-//        
-//    }
-//
-//    /**
-//     * Selects the given row (relative to the current page).
-//     * 
-//     * @param row the row to be selected
-//     */
-//    private void selectRow(int row) {
-//
-//        //change the style flags
-//        styleRow( selectedRow,
-//                  false );
-//        styleRow( row,
-//                  true );
-//
-//        //mark the selected row
-//        selectedRow = row;
-//
-//        //TODO: also show "preview" view here of rule.
-//        System.out.println("[Preview rule now]");
-//    }
-//
-//    private void styleRow(int row,
-//                          boolean selected) {
-//        if ( row != -1 ) {
-//            if ( selected ) table.getRowFormatter().addStyleName( row + 1,
-//                                                                  "rule-SelectedRow" );
-//            else table.getRowFormatter().removeStyleName( row + 1,
-//                                                          "rule-SelectedRow" );
-//        }
-//    }
-//    
-//    
-//    
-//
-//    
-//
-//    private void update() {
-//                        
-//        if (this.numberOfColumns == -1) {
-//            //if it hasn't been setup, can't load data yet
-//            return;
-//        }
-//        
-//        // Update the older/newer buttons & label.
-//        int count = data.length;
-//        int max = startIndex + visibleItemCount;
-//        if ( max > count ) max = count;
-//
-//        prevButton.setVisible( startIndex != 0 );
-//        nextButton.setVisible( startIndex + visibleItemCount < count );
-//        countLabel.setText( "" + (startIndex + 1) + " - " + max + " of " + count );
-//
-//        // Show the selected emails.
-//        int i = 0;
-//        for ( ; i < visibleItemCount; ++i ) {
-//            // Don't read past the end.
-//            if ( startIndex + i >= count ) break;
-//
-//            String[] rowData = data[startIndex + i];
-//            
-//            //RuleListItem item = data.getMailItem( startIndex + i );
-//
-//            // Add a new row to the table, then set each of its columns value
-//            
-//            for ( int col = 0; col < rowData.length; col++ ) {
-//                table.setText( i + 1, col, rowData[col] );
-//            }
-//            
-////            table.setText( i + 1,
-////                           0,
-////                           item.name );
-////            table.setText( i + 1,
-////                           1,
-////                           item.status );
-////            table.setText( i + 1,
-////                           2,
-////                           item.changedBy );
-////            table.setText( i + 1,
-////                           3,
-////                           item.version );
-//        }
-//
-//        // Clear any remaining slots.
-//        for ( ; i < visibleItemCount; ++i ) {
-//            table.setHTML( i + 1, 0, "&nbsp;" );
-//        }
-//        
-//        // Select the first row if none is selected.
-//        if ( selectedRow == -1 ) selectRow( 0 );
-//        
-//    }
-//
-//    public void loadRulesForCategoryPath(String selectedPath) {
-//        service.loadRuleListForCategories( selectedPath, "", new AsyncCallback() {
-//
-//            public void onFailure(Throwable caught) {
-//                // TODO Auto-generated method stub
-//            }
-//
-//            public void onSuccess(Object result) {
-//                String[][] data = (String[][]) result;
-//                updateData(data);
-//            }
-//            
-//        });
-//        
-//    }
-//    
-//    private void updateData(String[][] data) {
-//        this.data = data;
-//        update();
-//    }
-//}

Copied: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rulelist/RuleListViewLegacy.java (from rev 10218, labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rulelist/RuleListView.java)
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rulelist/RuleListViewLegacy.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/client/rulelist/RuleListViewLegacy.java	2007-03-16 08:36:24 UTC (rev 10255)
@@ -0,0 +1,295 @@
+package org.drools.brms.client.rulelist;
+//package org.drools.brms.client.rulelist;
+//
+//import org.drools.brms.client.rpc.RepositoryServiceAsync;
+//import org.drools.brms.client.rpc.RepositoryServiceFactory;
+//import org.drools.brms.client.rpc.TableConfig;
+//
+//import com.google.gwt.user.client.rpc.AsyncCallback;
+//import com.google.gwt.user.client.ui.ClickListener;
+//import com.google.gwt.user.client.ui.Composite;
+//import com.google.gwt.user.client.ui.Grid;
+//import com.google.gwt.user.client.ui.HTML;
+//import com.google.gwt.user.client.ui.HorizontalPanel;
+//import com.google.gwt.user.client.ui.Image;
+//import com.google.gwt.user.client.ui.SourcesTableEvents;
+//import com.google.gwt.user.client.ui.TableListener;
+//import com.google.gwt.user.client.ui.VerticalPanel;
+//import com.google.gwt.user.client.ui.Widget;
+//
+///**
+// * NOTE: this is not currently used, but it worked OK.
+// * It did NOT have sorting, but did have paging, and performed reasonably well.
+// * 
+// * SO KEEP THIS AROUND IN CASE THE OTHER ONE BLOWS CHUNKS !
+// * This one is based on the mail app example.
+// * 
+// * A composite that displays an explorer and a list view.
+// */
+//public class RuleListView extends Composite
+//    implements
+//    TableListener,
+//    ClickListener {
+//
+//    
+//    public static final String RULE_LIST_TABLE_ID = "ruleList";
+//
+//    private int                    visibleItemCount = -1;
+//
+//    private HTML                   countLabel         = new HTML();
+//    private HTML                   prevButton         = new HTML( "<a href='javascript:;'>&lt; prev</a>",
+//                                                                  true );
+//    private HTML                   nextButton         = new HTML( "<a href='javascript:;'>next &gt;</a>",
+//                                                                  true );
+//    private HTML                   editButton         = new HTML( "<a href='javascript:;'>edit</a>",
+//                                                                  true );
+//
+//    private int                    startIndex, selectedRow = -1;
+//    private Grid              table              = new Grid();
+//    private HorizontalPanel        navBar             = new HorizontalPanel();
+//    
+//    
+//    private static final RepositoryServiceAsync service = RepositoryServiceFactory.getService();
+//    private String[][] data;
+//    protected int numberOfColumns;
+//    private EditItemEvent editEvent;
+//
+//    public RuleListView(EditItemEvent event) {
+//
+//        this.editEvent = event;
+//        
+//
+//        // Setup the table.
+//        table.setCellSpacing( 0 );
+//        table.setCellPadding( 0 );
+//        table.setWidth( "100%" );
+//
+//        // Hook up events.
+//        table.addTableListener( this );
+//        prevButton.addClickListener( this );
+//        nextButton.addClickListener( this );
+//        editButton.addClickListener( this );
+//
+//        // Create the 'navigation' bar at the upper-right.
+//        HorizontalPanel innerNavBar = new HorizontalPanel();
+//        innerNavBar.setStyleName( "rule-ListNavBar" );
+//        innerNavBar.setSpacing( 8 );
+//        
+//        innerNavBar.add( prevButton );
+//        innerNavBar.add( countLabel );
+//        innerNavBar.add( nextButton );
+//        innerNavBar.add( editButton );
+//        
+//        navBar.setHorizontalAlignment( HorizontalPanel.ALIGN_RIGHT );
+//        navBar.add( innerNavBar );
+//        navBar.setWidth( "100%" );
+//
+//        //this is so we can stack controls on top of the table
+//        VerticalPanel vert = new VerticalPanel();
+//        vert.add( navBar );
+//        vert.add( table );
+//        vert.setStyleName( "rule-List" );
+//        vert.setWidth( "100%" );
+//        
+//        table.setStyleName( "rule-List" );
+//        table.setWidth( "100%" );
+//        
+//        // needed for composite to work
+//        initWidget( vert );
+//        setStyleName( "rule-List" );
+//        initTable();
+//
+//    }
+//
+//    public void onCellClicked(SourcesTableEvents sender,
+//                              int row,
+//                              int cell) {
+//        // Select the row that was clicked (-1 to account for header row).
+//        if ( row > 0 ) selectRow( row - 1 );
+//    }
+//
+//    public void onClick(Widget sender) {
+//        if ( sender == nextButton ) {
+//            // Move forward a page.
+//            startIndex += visibleItemCount;
+//            if ( startIndex >= data.length ) startIndex -= visibleItemCount;
+//            else {
+//                styleRow( selectedRow,
+//                          false );
+//                selectedRow = -1;
+//                update();
+//            }
+//        } else if ( sender == prevButton ) {
+//            // Move back a page.
+//            startIndex -= visibleItemCount;
+//            if ( startIndex < 0 ) startIndex = 0;
+//            else {
+//                styleRow( selectedRow,
+//                          false );
+//                selectedRow = -1;
+//                update();
+//            }
+//        } else if ( sender == editButton ) {
+//            openEditor();
+//        }
+//    }
+//
+//    /**
+//     * Open the editor as pertains to the selected row !
+//     */
+//    private void openEditor() {
+//        if (selectedRow < data.length) {
+//            this.editEvent.open( data[selectedRow][0] );
+//        }
+//    }
+//
+//    /**
+//     * Initializes the table. Will load the header config, initialise etc.
+//     */
+//    private void initTable() {
+//        // Create the header row.
+//
+//        table.resize( 1, 1 );
+//        table.getRowFormatter().setStyleName( 0, "rule-ListHeader" );  
+//        table.setText( 0, 0, "Please wait..." );    
+//        
+//        service.loadTableConfig( RULE_LIST_TABLE_ID, new AsyncCallback() {
+//
+//            public void onFailure(Throwable caught) {
+//                //TODO
+//            }
+//
+//            public void onSuccess(Object result) {
+//                TableConfig config = (TableConfig) result;
+//                
+//                String[] header = config.headers;
+//                numberOfColumns = header.length;                
+//                
+//                visibleItemCount = config.rowsPerPage;
+//                table.resize( visibleItemCount + 1, numberOfColumns);
+// 
+//                for ( int i = 0; i < numberOfColumns; i++ ) {
+//                    table.setText( 0, i, header[i]);
+//                }   
+//                
+//                data = new String[1][numberOfColumns];
+//                update();      
+//                
+//            }
+//            
+//        });
+//        
+//    }
+//
+//    /**
+//     * Selects the given row (relative to the current page).
+//     * 
+//     * @param row the row to be selected
+//     */
+//    private void selectRow(int row) {
+//
+//        //change the style flags
+//        styleRow( selectedRow,
+//                  false );
+//        styleRow( row,
+//                  true );
+//
+//        //mark the selected row
+//        selectedRow = row;
+//
+//        //TODO: also show "preview" view here of rule.
+//        System.out.println("[Preview rule now]");
+//    }
+//
+//    private void styleRow(int row,
+//                          boolean selected) {
+//        if ( row != -1 ) {
+//            if ( selected ) table.getRowFormatter().addStyleName( row + 1,
+//                                                                  "rule-SelectedRow" );
+//            else table.getRowFormatter().removeStyleName( row + 1,
+//                                                          "rule-SelectedRow" );
+//        }
+//    }
+//    
+//    
+//    
+//
+//    
+//
+//    private void update() {
+//                        
+//        if (this.numberOfColumns == -1) {
+//            //if it hasn't been setup, can't load data yet
+//            return;
+//        }
+//        
+//        // Update the older/newer buttons & label.
+//        int count = data.length;
+//        int max = startIndex + visibleItemCount;
+//        if ( max > count ) max = count;
+//
+//        prevButton.setVisible( startIndex != 0 );
+//        nextButton.setVisible( startIndex + visibleItemCount < count );
+//        countLabel.setText( "" + (startIndex + 1) + " - " + max + " of " + count );
+//
+//        // Show the selected emails.
+//        int i = 0;
+//        for ( ; i < visibleItemCount; ++i ) {
+//            // Don't read past the end.
+//            if ( startIndex + i >= count ) break;
+//
+//            String[] rowData = data[startIndex + i];
+//            
+//            //RuleListItem item = data.getMailItem( startIndex + i );
+//
+//            // Add a new row to the table, then set each of its columns value
+//            
+//            for ( int col = 0; col < rowData.length; col++ ) {
+//                table.setText( i + 1, col, rowData[col] );
+//            }
+//            
+////            table.setText( i + 1,
+////                           0,
+////                           item.name );
+////            table.setText( i + 1,
+////                           1,
+////                           item.status );
+////            table.setText( i + 1,
+////                           2,
+////                           item.changedBy );
+////            table.setText( i + 1,
+////                           3,
+////                           item.version );
+//        }
+//
+//        // Clear any remaining slots.
+//        for ( ; i < visibleItemCount; ++i ) {
+//            table.setHTML( i + 1, 0, "&nbsp;" );
+//        }
+//        
+//        // Select the first row if none is selected.
+//        if ( selectedRow == -1 ) selectRow( 0 );
+//        
+//    }
+//
+//    public void loadRulesForCategoryPath(String selectedPath) {
+//        service.loadRuleListForCategories( selectedPath, "", new AsyncCallback() {
+//
+//            public void onFailure(Throwable caught) {
+//                // TODO Auto-generated method stub
+//            }
+//
+//            public void onSuccess(Object result) {
+//                String[][] data = (String[][]) result;
+//                updateData(data);
+//            }
+//            
+//        });
+//        
+//    }
+//    
+//    private void updateData(String[][] data) {
+//        this.data = data;
+//        update();
+//    }
+//}

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/public/images/attention_needed.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/public/images/attention_needed.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/public/images/warning.gif
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/public/images/warning.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/JBRMSServiceServlet.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/JBRMSServiceServlet.java	2007-03-16 08:35:09 UTC (rev 10254)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/JBRMSServiceServlet.java	2007-03-16 08:36:24 UTC (rev 10255)
@@ -25,6 +25,7 @@
 import org.drools.brms.client.rpc.TableConfig;
 import org.drools.brms.client.rpc.TableDataResult;
 import org.drools.brms.client.rpc.TableDataRow;
+import org.drools.brms.client.rpc.ValidatedResponse;
 import org.drools.brms.server.contenthandler.ContentHandler;
 import org.drools.brms.server.rules.SuggestionCompletionLoader;
 import org.drools.brms.server.util.MetaDataMapper;
@@ -377,7 +378,7 @@
         return data;
     }
 
-    public String savePackage(PackageConfigData data) throws SerializableException {
+    public ValidatedResponse savePackage(PackageConfigData data) throws SerializableException {
         log.info( "SAVING package [" + data.name + "]" );
         PackageItem item = getRulesRepository().loadPackage( data.name );
         
@@ -387,7 +388,22 @@
         
         item.checkin( data.description );
         
-        return item.getUUID();
+        SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
+        loader.getSuggestionEngine( item );
+        
+        ValidatedResponse res = new ValidatedResponse();
+        if (loader.hasErrors()) {
+            res.hasErrors = true;
+            String err = "";
+            for ( Iterator iter = loader.getErrors().iterator(); iter.hasNext(); ) {
+                err += (String) iter.next();
+                if (iter.hasNext()) err += "\n";
+            }
+            res.errorHeader  = "Package validation errors";
+            res.errorMessage = err;
+        }
+        
+        return res;
     }
 
     public TableDataResult listAssets(String uuid,

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/rules/SuggestionCompletionLoader.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/rules/SuggestionCompletionLoader.java	2007-03-16 08:35:09 UTC (rev 10254)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/rules/SuggestionCompletionLoader.java	2007-03-16 08:36:24 UTC (rev 10255)
@@ -17,6 +17,7 @@
 import org.drools.brms.server.util.SuggestionCompletionEngineBuilder;
 import org.drools.compiler.DrlParser;
 import org.drools.compiler.DroolsParserException;
+import org.drools.compiler.ParserError;
 import org.drools.lang.descr.FactTemplateDescr;
 import org.drools.lang.descr.FieldTemplateDescr;
 import org.drools.lang.descr.GlobalDescr;
@@ -36,8 +37,12 @@
  * This utility class loads suggestion completion stuff for the package, 
  * introspecting from models, templates etc. 
  * 
- * This also includes DSL stuff. 
+ * This also includes DSL stuff, basically, everything you need to get started with a package.
+ * It also validates the package configuration, and can provide errors.
  * 
+ * This does NOT validate assets in the package, other then to load up DSLs, models etc
+ * as needed.
+ * 
  * @author Michael Neale
  *
  */
@@ -46,52 +51,66 @@
     private SuggestionCompletionEngineBuilder builder = new SuggestionCompletionEngineBuilder();
     private DrlParser                         parser  = new DrlParser();
     private final ByteArrayClassLoader        loader;
+    private List errors;
 
     public SuggestionCompletionLoader() {
         loader = new ByteArrayClassLoader( this.getClass().getClassLoader() );
     }
 
+    /**
+     * This will validate, and generate a new engine, ready to go.
+     * If there are errors, you can get them by doing getErrors();
+     * @param pkg
+     * @return
+     */
     public SuggestionCompletionEngine getSuggestionEngine(PackageItem pkg) {
-        StringBuffer errors = new StringBuffer();
+        errors = new ArrayList();
         builder.newCompletionEngine();
 
         String header = pkg.getHeader();
 
+        if (!header.trim().equals( "" )) {
+            processPackageHeader( pkg, header );
+        }
+
+        // populating DSL sentences
+        this.populateDSLSentences( pkg );
+        
+        return builder.getInstance();
+    }
+
+    private void processPackageHeader(PackageItem pkg,
+                                      String header) {
         // get fact types from imports
         PackageDescr pkgDescr;
         try {
             pkgDescr = parser.parse( header );
         } catch ( DroolsParserException e1 ) {
-            throw new RuntimeDroolsException( "Error parsing header for package " + pkg.getName(),
-                                              e1 );
+            throw new RulesRepositoryException( "Serious error, unable to validate package " + pkg.getName(), e1 );
         }
-
+   
+        if (this.parser.hasErrors()) {
+            for ( Iterator iter = this.parser.getErrors().iterator(); iter.hasNext(); ) {
+                ParserError element = (ParserError) iter.next();
+                errors.add( element.getMessage() );
+            }            
+        }
         // populating information for the model itself
-        this.populateModelInfo( errors,
-                                pkgDescr,
+        this.populateModelInfo( pkgDescr,
                                 pkg );
-
+   
         // populating globals
-        this.populateGlobalInfo( errors,
-                                 pkgDescr,
+        this.populateGlobalInfo( pkgDescr,
                                  pkg );
+   
 
-        // populating DSL sentences
-        this.populateDSLSentences( pkg,
-                                   errors );
-
-        if ( errors.length() > 0 ) {
-            throw new RuntimeDroolsException( "Error(s) while loading suggestion completion engine: \n" + errors.toString() );
-        }
-        return builder.getInstance();
     }
 
     /**
      * @param pkg
      * @param errors
      */
-    private void populateDSLSentences(PackageItem pkg,
-                                      StringBuffer errors) {
+    private void populateDSLSentences(PackageItem pkg) {
         AssetItemIterator it = pkg.listAssetsByFormat( new String[]{AssetFormats.DSL} );
         while ( it.hasNext() ) {
             AssetItem item = (AssetItem) it.next();
@@ -109,14 +128,10 @@
                         
                     }
                 } else {
-                    errors.append( file.getErrors().toString() );
+                    errors.add( file.getErrors().toString() );
                 }
             } catch ( IOException e ) {
-                errors.append( "\tError while loading DSL mapping " );
-                errors.append( item.getBinaryContentAttachmentFileName() );
-                errors.append( " : " );
-                errors.append( e.getMessage() );
-                errors.append( "\n" );
+                errors.add( "Error while loading DSL language configuration : " + item.getBinaryContentAttachmentFileName() + " error message: " + e.getMessage() );
             }
         }
     }
@@ -124,8 +139,7 @@
     /**
      * Populate the global stuff.
      */
-    private void populateGlobalInfo(StringBuffer errors,
-                                    PackageDescr pkgDescr,
+    private void populateGlobalInfo(PackageDescr pkgDescr,
                                     PackageItem pkg) {
 
         // populating information for the globals
@@ -135,8 +149,7 @@
                 String shortTypeName = global.getType();
                 if ( !this.builder.hasFieldsForType( shortTypeName ) ) {
                     Class clazz = loadClass( pkg,
-                                             global.getType(),
-                                             errors );
+                                             global.getType() );
                     loadClassFields( clazz,
                                      shortTypeName );
 
@@ -147,11 +160,7 @@
                 builder.addGlobalType( global.getIdentifier(),
                                        shortTypeName );
             } catch ( IOException e ) {
-                errors.append( "\tError while inspecting class: " );
-                errors.append( global.getType() );
-                errors.append( " : " );
-                errors.append( e.getMessage() );
-                errors.append( "\n" );
+                errors.add( "Error while inspecting class for global: " + global.getType() + " error message: " + e.getMessage());
             }
 
         }
@@ -160,8 +169,7 @@
     /**
      * Populate the fact type data.
      */
-    private void populateModelInfo(StringBuffer errors,
-                                   PackageDescr pkgDescr,
+    private void populateModelInfo(PackageDescr pkgDescr,
                                    PackageItem pkg) {
 
         // iterating over the import list
@@ -172,8 +180,7 @@
             resolver.addImport( classname );
 
             Class clazz = loadClass( pkg,
-                                     classname,
-                                     errors );
+                                     classname );
             if ( clazz != null ) {
                 try {
                     String shortTypeName = getShortNameOfClass( clazz.getName() );
@@ -181,11 +188,7 @@
                                      shortTypeName );
                     builder.addFactType( shortTypeName );
                 } catch ( IOException e ) {
-                    errors.append( "\tError while inspecting class: " );
-                    errors.append( classname );
-                    errors.append( " : " );
-                    errors.append( e.getMessage() );
-                    errors.append( "\n" );
+                    errors.add( "Error while inspecting the class: " + classname + ". The error was: " + e.getMessage() );
                 }
             }
         }
@@ -193,8 +196,7 @@
         // iterating over templates
         populateFactTemplateTypes( pkgDescr,
                                    pkg,
-                                   resolver,
-                                   errors );
+                                   resolver );
     }
 
     /**
@@ -204,8 +206,7 @@
      */
     private void populateFactTemplateTypes(PackageDescr pkgDescr,
                                            PackageItem pkg,
-                                           ClassTypeResolver resolver,
-                                           StringBuffer errors) {
+                                           ClassTypeResolver resolver) {
         for ( Iterator it = pkgDescr.getFactTemplates().iterator(); it.hasNext(); ) {
             FactTemplateDescr templ = (FactTemplateDescr) it.next();
             String factType = templ.getName();
@@ -225,9 +226,7 @@
                 try {
                     fieldTypeClass = resolver.resolveType( fieldType );
                 } catch ( ClassNotFoundException e ) {
-                    errors.append( "\tClass not found: " );
-                    errors.append( fieldType );
-                    errors.append( "\n" );
+                    errors.add( "Fact template field type not found: " + fieldType );
                 }
                 builder.addFieldType( factType + "." + fieldDescr.getName(),
                                       getFieldType( fieldTypeClass ) );
@@ -237,6 +236,7 @@
 
     private void loadClassFields(Class clazz,
                                  String shortTypeName) throws IOException {
+        if (clazz == null) return;
         ClassFieldInspector inspector = new ClassFieldInspector( clazz );
         String[] fields = (String[]) inspector.getFieldNames().keySet().toArray( new String[inspector.getFieldNames().size()] );
 
@@ -280,8 +280,7 @@
      * @return
      */
     private Class loadClass(PackageItem pkg,
-                            String classname,
-                            StringBuffer errors) {
+                            String classname) {
         Class clazz = null;
         try {
             // check if it is already in the classpath
@@ -319,9 +318,7 @@
             } catch ( IOException e ) {
                 throw new RulesRepositoryException( e );
             } catch ( ClassNotFoundException e ) {
-                errors.append( "\tClass not found: " );
-                errors.append( classname );
-                errors.append( "\n" );
+                errors.add( "Class not found: " + classname );
             }
         }
         return clazz;
@@ -350,5 +347,19 @@
         }
         return fieldType;
     }
+    
+    /**
+     * @return true if there were errors when processing the package.
+     */
+    public boolean hasErrors() {
+        return (this.errors.size() > 0);
+    }
+    
+    /**
+     * Returns a list of String errors.
+     */
+    public List getErrors() {
+        return this.errors;
+    }
 
 }

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/util/SuggestionCompletionEngineBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/util/SuggestionCompletionEngineBuilder.java	2007-03-16 08:35:09 UTC (rev 10254)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/util/SuggestionCompletionEngineBuilder.java	2007-03-16 08:36:24 UTC (rev 10255)
@@ -20,12 +20,9 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
 import org.drools.brms.client.modeldriven.brxml.DSLSentence;
-import org.drools.lang.dsl.DSLMappingEntry;
 
 /**
  * A builder to incrementally populate a SuggestionCompletionEngine
@@ -34,24 +31,6 @@
  */
 public class SuggestionCompletionEngineBuilder {
 
-    // The following pattern is capable of spliting a DSL sentence into
-    // fragments, supporting \{ escapes. Example:
-    //
-    // {This} is a {pattern} considered pretty \{{easy}\} by most \{people\}. What do you {say}?
-    //
-    // would be parsed into the following fragments:
-    //
-    // Fragment: [{This}]
-    // Fragment: [ is a ]
-    // Fragment: [{pattern}]
-    // Fragment: [ considered pretty {]
-    // Fragment: [{easy}]
-    // Fragment: [} by most {people}. What do you ]
-    // Fragment: [{say}]
-    // Fragment: [?]
-    private final static Pattern       splitter      = Pattern.compile( "(^|[^\\\\])(\\{[(\\\\\\{)|[^\\{]]*?\\})",
-                                                                        Pattern.MULTILINE | Pattern.DOTALL );
-
     private SuggestionCompletionEngine instance      = new SuggestionCompletionEngine();
     private List                       factTypes     = new ArrayList();
     private Map                        fieldsForType = new HashMap();

Modified: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/ServiceImplementationTest.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/ServiceImplementationTest.java	2007-03-16 08:35:09 UTC (rev 10254)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/ServiceImplementationTest.java	2007-03-16 08:36:24 UTC (rev 10255)
@@ -16,6 +16,7 @@
 import org.drools.brms.client.rpc.TableConfig;
 import org.drools.brms.client.rpc.TableDataResult;
 import org.drools.brms.client.rpc.TableDataRow;
+import org.drools.brms.client.rpc.ValidatedResponse;
 import org.drools.brms.client.rulelist.AssetItemListViewer;
 import org.drools.brms.server.util.TableDisplayHandler;
 import org.drools.repository.AssetItem;
@@ -351,14 +352,19 @@
       data.externalURI = "new URI";
       
       
-      String uuid2 = impl.savePackage( data );
-      assertNotNull(uuid);
-      assertEquals(uuid, uuid2);
+      ValidatedResponse res = impl.savePackage( data );
+      assertNotNull(res);
+      assertTrue(res.hasErrors);
+      assertNotNull(res.errorMessage);
       
       data = impl.loadPackageConfig( uuid );
       assertEquals("new desc", data.description);
       assertEquals("wa", data.header);
-      assertEquals("new URI", data.externalURI);      
+      assertEquals("new URI", data.externalURI);   
+      
+      data.header = "";
+      res = impl.savePackage( data );
+      assertFalse(res.hasErrors);
   }
   
   public void testListByFormat() throws Exception {

Modified: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/rules/SuggestionCompletionLoaderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/rules/SuggestionCompletionLoaderTest.java	2007-03-16 08:35:09 UTC (rev 10254)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/rules/SuggestionCompletionLoaderTest.java	2007-03-16 08:36:24 UTC (rev 10255)
@@ -89,4 +89,26 @@
         
     }
     
+    public void testErrors() throws Exception {
+        RulesRepository repo = new RulesRepository(SessionHelper.getSession());
+        PackageItem item = repo.createPackage( "testErrorsInPackage", "to test error handling" );
+
+        SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
+        assertNotNull(loader.getSuggestionEngine( item ));
+        assertFalse(loader.hasErrors());
+        
+        item.updateHeader( "gooble de gook" );
+        loader = new SuggestionCompletionLoader();
+        loader.getSuggestionEngine( item );
+        assertTrue(loader.hasErrors());
+        
+        
+        item.updateHeader( "import foo.bar; \nglobal goo.Bar baz;" );
+        loader = new SuggestionCompletionLoader();
+        loader.getSuggestionEngine( item );
+        assertTrue(loader.hasErrors());
+        
+        
+    }
+    
 }




More information about the jboss-svn-commits mailing list