[jboss-svn-commits] JBL Code SVN: r28740 - in labs/jbossrules/trunk/drools-guvnor/src: main/java/org/drools/guvnor/client/rpc and 6 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Aug 3 02:50:32 EDT 2009


Author: michael.neale at jboss.com
Date: 2009-08-03 02:50:32 -0400 (Mon, 03 Aug 2009)
New Revision: 28740

Added:
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/DiscussionWidget.java
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.properties
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/DiscussionRecord.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/ruleeditor/RuleDocumentWidget.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/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/java/org/drools/guvnor/server/util/Discussion.java
   labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/ServiceImplementationTest.java
   labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/util/DiscussionTest.java
Log:
GUVNOR-302 Discussion feature

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	2009-08-03 06:45:09 UTC (rev 28739)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants.java	2009-08-03 06:50:32 UTC (rev 28740)
@@ -1892,4 +1892,14 @@
     String FreezeAreasForEditing();
 
     String Conditions();
+
+    String smallCommentBy0On1Small();
+
+    String AddADiscussionComment();
+
+    String EraseAllComments();
+
+    String EraseAllCommentsWarning();
+
+    String Discussion();
 }

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	2009-08-03 06:45:09 UTC (rev 28739)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants.properties	2009-08-03 06:50:32 UTC (rev 28740)
@@ -898,4 +898,9 @@
 FrozenAreas=Frozen areas...
 FrozenExplanation=Frozen areas mean that the rule can only have its fields edited, no extra conditions added or removed or the structure changed.
 FreezeAreasForEditing=Freeze areas for editing:
-Conditions=Conditions
\ No newline at end of file
+Conditions=Conditions
+smallCommentBy0On1Small=<small>Comment by {0} on {1}:</small>
+AddADiscussionComment=Add a discussion comment
+EraseAllComments=Erase all comments
+EraseAllCommentsWarning=Erase ALL discussion items? NOTE that this CAN NOT be undone. Are you sure?
+Discussion=Discussion
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/DiscussionRecord.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/DiscussionRecord.java	2009-08-03 06:45:09 UTC (rev 28739)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/DiscussionRecord.java	2009-08-03 06:50:32 UTC (rev 28740)
@@ -1,5 +1,7 @@
 package org.drools.guvnor.client.rpc;
 
+import com.google.gwt.user.client.rpc.IsSerializable;
+
 import java.io.Serializable;
 import java.util.Calendar;
 import java.util.Date;
@@ -8,7 +10,13 @@
  * This is a discussion record item.
  * @author Michael Neale
  */
-public class DiscussionRecord implements Serializable {
+public class DiscussionRecord implements IsSerializable {
+
+    public DiscussionRecord() {}
+    public DiscussionRecord(String userName, String note) {
+        this.author = userName;
+        this.note = note;
+    }
     public long timestamp = (new Date()).getTime();
     public String note;
     public String author;

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	2009-08-03 06:45:09 UTC (rev 28739)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryService.java	2009-08-03 06:50:32 UTC (rev 28740)
@@ -490,4 +490,21 @@
      */
     public void installSampleRepository() throws SerializableException;
 
+
+    /**
+     * Return a list of discussion items for a given asset...
+     */
+    public List<DiscussionRecord> loadDiscussionForAsset(String assetId);
+
+
+    /**
+     * Append a discussion item for the current user.
+     */
+    public List<DiscussionRecord> addToDiscussionForAsset(String assetId, String comment);
+
+
+    /** Only for admins, they can nuke it from orbit to clear it out */
+    public void clearAllDiscussionsForAsset(String assetId);
+
+
 }
\ 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	2009-08-03 06:45:09 UTC (rev 28739)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryServiceAsync.java	2009-08-03 06:50:32 UTC (rev 28740)
@@ -20,6 +20,8 @@
 import com.google.gwt.user.client.rpc.AsyncCallback;
 import com.google.gwt.user.client.rpc.RemoteService;
 
+import java.util.List;
+
 /**
 
  * This is what the remote service will implement, as a servlet.
@@ -98,6 +100,9 @@
 	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(String assetId, AsyncCallback<List<DiscussionRecord>> dr);
+    public void addToDiscussionForAsset(String assetId, String comment,  AsyncCallback<List<DiscussionRecord>> response);
+    public void clearAllDiscussionsForAsset(String assetId, AsyncCallback cb);
 
 
 }
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/DiscussionWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/DiscussionWidget.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/DiscussionWidget.java	2009-08-03 06:50:32 UTC (rev 28740)
@@ -0,0 +1,174 @@
+package org.drools.guvnor.client.ruleeditor;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.ClickListener;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.HasHorizontalAlignment;
+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.TextArea;
+import com.google.gwt.user.client.ui.VerticalPanel;
+import com.google.gwt.user.client.ui.Widget;
+import com.google.gwt.user.client.Window;
+import com.gwtext.client.util.Format;
+import com.gwtext.client.widgets.Panel;
+import org.drools.guvnor.client.common.GenericCallback;
+import org.drools.guvnor.client.common.SmallLabel;
+import org.drools.guvnor.client.messages.Constants;
+import org.drools.guvnor.client.rpc.DiscussionRecord;
+import org.drools.guvnor.client.rpc.RepositoryServiceFactory;
+import org.drools.guvnor.client.rpc.RuleAsset;
+
+import java.util.Date;
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * 
+ * Does the discussion panel for assets.
+ * 
+ * @author Michael Neale
+ */
+public class DiscussionWidget extends Composite {
+
+    private static Constants constants = ((Constants) GWT.create(Constants.class));
+
+    private VerticalPanel commentList = new VerticalPanel();
+    private VerticalPanel discussionLayout = new VerticalPanel();
+    private VerticalPanel newCommentLayout = new VerticalPanel();
+    private RuleAsset asset;
+
+
+    public DiscussionWidget(RuleAsset asset) {
+        this.asset = asset;
+        final Panel discussionPanel = new Panel();
+        discussionPanel.setCollapsible( true );
+        discussionPanel.setTitle(constants.Discussion() + ":" );
+        discussionPanel.setBodyBorder(false);
+
+        commentList.setWidth("100%");
+        discussionLayout.setWidth("100%");
+
+        discussionPanel.add(discussionLayout);
+        discussionLayout.add(commentList);
+        newCommentLayout.setWidth("100%");
+
+        refreshDiscussion();
+
+
+        if (!asset.isreadonly) {
+            discussionLayout.add(newCommentLayout);
+            showNewCommentButton();
+        }
+
+        initWidget(discussionPanel);
+    }
+
+
+
+    /** Hit up the server */
+    public void refreshDiscussion() {
+        RepositoryServiceFactory.getService().loadDiscussionForAsset(asset.uuid, new GenericCallback<List<DiscussionRecord>>() {
+            public void onSuccess(List<DiscussionRecord> result) {
+                updateCommentList(result);
+            }
+        });
+    }
+
+    private void updateCommentList(List<DiscussionRecord> ls) {
+        commentList.clear();
+        for(DiscussionRecord dr: ls) {
+            appendComment(dr);
+        }
+    }
+
+    private void appendComment(DiscussionRecord r) {
+        SmallLabel hrd = new SmallLabel(Format.format(constants.smallCommentBy0On1Small(), r.author, new Date(r.timestamp).toString()));
+        hrd.addStyleName("discussion-header");
+        commentList.add(hrd);
+        Label lbl = new Label(r.note);
+        lbl.setStyleName("x-form-field");
+        commentList.add(lbl);
+        commentList.add(new HTML("<br/>"));
+    }
+
+
+    private void showNewCommentButton() {
+        newCommentLayout.clear();
+
+        HorizontalPanel hp = new HorizontalPanel();
+
+        Button createNewComment = new Button(constants.AddADiscussionComment());
+        hp.add(createNewComment);
+
+        Button adminClearAll = new Button(constants.EraseAllComments());
+        hp.add(adminClearAll);
+
+        newCommentLayout.add(hp);
+        
+        newCommentLayout.setCellHorizontalAlignment(hp, HasHorizontalAlignment.ALIGN_RIGHT);
+        createNewComment.addClickListener(new ClickListener() {
+            public void onClick(Widget sender) {
+                showAddNewComment();
+            }
+        });
+        adminClearAll.addClickListener(new ClickListener() {
+            public void onClick(Widget sender) {
+                if (Window.confirm(constants.EraseAllCommentsWarning())) {
+                    RepositoryServiceFactory.getService().clearAllDiscussionsForAsset(asset.uuid, new GenericCallback() {
+                        public void onSuccess(Object result) {
+                            updateCommentList(new ArrayList<DiscussionRecord>());
+                        }
+                    });
+                }
+            }
+        });
+    }
+
+    private void showAddNewComment() {
+        newCommentLayout.clear();
+        final TextArea comment = new TextArea();
+        comment.setWidth("100%");
+        newCommentLayout.add(comment);
+
+        Button ok = new Button(constants.OK());
+        Button cancel = new Button(constants.Cancel());
+
+        ok.addClickListener(new ClickListener() {
+            public void onClick(Widget sender) {
+                sendNewComment(comment.getText());
+            }
+        });
+
+        cancel.addClickListener(new ClickListener() {
+            public void onClick(Widget sender) {
+                showNewCommentButton();
+            }
+        });
+
+        HorizontalPanel hp = new HorizontalPanel();
+        hp.add(ok); hp.add(cancel);
+
+        newCommentLayout.add(hp);
+        
+        comment.setFocus(true);
+
+    }
+
+    private void sendNewComment(String text) {
+        newCommentLayout.clear();
+        newCommentLayout.add(new Image("images/spinner.gif"));
+        RepositoryServiceFactory.getService().addToDiscussionForAsset(asset.uuid, text, new GenericCallback<List<DiscussionRecord>>() {
+            public void onSuccess(List<DiscussionRecord> result) {
+                showNewCommentButton();
+                updateCommentList(result);
+            }
+        });
+
+    }
+
+
+}

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/RuleDocumentWidget.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/RuleDocumentWidget.java	2009-08-03 06:45:09 UTC (rev 28739)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/RuleDocumentWidget.java	2009-08-03 06:50:32 UTC (rev 28740)
@@ -18,12 +18,15 @@
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.user.client.ui.*;
+import com.google.gwt.user.client.DeferredCommand;
+import com.google.gwt.user.client.Command;
 import com.gwtext.client.widgets.Toolbar;
 import com.gwtext.client.widgets.ToolbarTextItem;
 import com.gwtext.client.widgets.Panel;
 import org.drools.guvnor.client.common.DirtyableComposite;
 import org.drools.guvnor.client.messages.Constants;
 import org.drools.guvnor.client.rpc.MetaData;
+import org.drools.guvnor.client.rpc.RuleAsset;
 
 /**
  * This holds the editor and viewer for rule documentation.
@@ -36,7 +39,8 @@
 	private TextArea text;
     private Constants constants = ((Constants) GWT.create(Constants.class));
 
-    public RuleDocumentWidget(MetaData data) {
+    public RuleDocumentWidget(final RuleAsset asset) {
+        MetaData data = asset.metaData;
 		text = new TextArea();
         text.setWidth( "100%" );
         text.setVisibleLines( 5 );
@@ -54,23 +58,15 @@
             p.setCollapsed(true);
         }
         p.add(text);
-        
 
-
-
-        Label lbl = new Label("This is a comment");
-        lbl.setStyleName("x-form-field");
-
-
-
-
-
-
-
-
-        VerticalPanel vp = new VerticalPanel();
+        final VerticalPanel vp = new VerticalPanel();
         vp.add(p);
 
+        DeferredCommand.addCommand(new Command() {
+            public void execute() {
+                vp.add(new DiscussionWidget(asset));
+            }
+        });
 
         vp.setWidth("100%");
 

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	2009-08-03 06:45:09 UTC (rev 28739)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/RuleViewer.java	2009-08-03 06:50:32 UTC (rev 28740)
@@ -166,7 +166,7 @@
         layout.add( hsp );
 
         //the document widget
-        doco = new RuleDocumentWidget( asset.metaData );
+        doco = new RuleDocumentWidget( asset );
 
         VerticalPanel vert = new VerticalPanel();
         vert.add( editor );

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	2009-08-03 06:45:09 UTC (rev 28739)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/public/Guvnor.css	2009-08-03 06:50:32 UTC (rev 28740)
@@ -479,6 +479,11 @@
 .rule-ListEvenRow,.DatePicker .weekheader {
 	background:#FFFFF0;
 }
+
+.discussion-header {
+    background: #FFFFF0;    
+}
+
 .DatePicker,.DatePicker .cell .gwt-HTML,.DatePicker .day .gwt-HTML {
 	border: 1px solid #aa9;
 }

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	2009-08-03 06:45:09 UTC (rev 28739)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/RepositoryServiceServlet.java	2009-08-03 06:50:32 UTC (rev 28740)
@@ -9,6 +9,7 @@
 import org.apache.log4j.Logger;
 import org.drools.guvnor.client.rpc.DetailedSerializableException;
 import org.drools.guvnor.client.rpc.RepositoryService;
+import org.drools.guvnor.client.rpc.DiscussionRecord;
 import org.drools.guvnor.server.util.LoggingHelper;
 import org.drools.guvnor.server.util.TestEnvironmentSessionHelper;
 import org.drools.repository.RulesRepository;
@@ -21,7 +22,8 @@
 import com.google.gwt.user.server.rpc.RemoteServiceServlet;
 
 /**
- * GWT RPC service endpoint for Repository service. A place to hang some exception handling, but mostly just passing on through.
+ * GWT RPC service endpoint for Repository service. A place to hang some exception handling mainly.
+ * This passes on all requests unmolested to the underlying ServiceImplemention class. 
  *
  * @author Michael Neale
  */
@@ -303,5 +305,17 @@
         getService().installSampleRepository();
     }
 
+    public List<DiscussionRecord> loadDiscussionForAsset(String assetId) {
+        return getService().loadDiscussionForAsset(assetId);
+    }
 
+    public List<DiscussionRecord> addToDiscussionForAsset(String assetId, String comment) {
+        return getService().addToDiscussionForAsset(assetId, comment);
+    }
+
+    public void clearAllDiscussionsForAsset(String assetId) {
+        getService().clearAllDiscussionsForAsset(assetId);
+    }
+
+
 }

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	2009-08-03 06:45:09 UTC (rev 28739)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/ServiceImplementation.java	2009-08-03 06:50:32 UTC (rev 28740)
@@ -32,6 +32,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.Arrays;
 import java.util.jar.JarEntry;
 import java.util.jar.JarInputStream;
 
@@ -74,6 +75,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.DiscussionRecord;
 import org.drools.guvnor.server.builder.AuditLogReporter;
 import org.drools.guvnor.server.builder.BRMSPackageBuilder;
 import org.drools.guvnor.server.builder.ContentAssemblyError;
@@ -95,6 +97,7 @@
 import org.drools.guvnor.server.util.MetaDataMapper;
 import org.drools.guvnor.server.util.TableDisplayHandler;
 import org.drools.guvnor.server.util.VerifierRunner;
+import org.drools.guvnor.server.util.Discussion;
 import org.drools.lang.descr.PackageDescr;
 import org.drools.lang.descr.RuleDescr;
 import org.drools.lang.descr.TypeDeclarationDescr;
@@ -2348,15 +2351,44 @@
 
     @Restrict("#{identity.loggedIn}")
     public void installSampleRepository() throws SerializableException {
-        if ( Contexts.isApplicationContextActive() ) {
-            Identity.instance().checkPermission( new AdminType(),
-                                                 RoleTypes.ADMIN );
-        }
+        checkIfADMIN();
         repository.importRepository( this.getClass().getResourceAsStream( "/mortgage-sample-repository.xml" ) );
         this.rebuildPackages();
         this.rebuildSnapshots();
     }
 
+    @Restrict("#{identity.loggedIn}")
+    public List<DiscussionRecord> loadDiscussionForAsset(String assetId) {
+        return new Discussion().fromString(getRulesRepository().loadAssetByUUID(assetId).getStringProperty("discussion"));
+    }
+
+    @Restrict("#{identity.loggedIn}")
+    public List<DiscussionRecord> addToDiscussionForAsset(String assetId, String comment) {
+        RulesRepository repo = getRulesRepository();
+        AssetItem asset = repo.loadAssetByUUID(assetId);
+        Discussion dp = new Discussion();
+        List<DiscussionRecord> discussion = dp.fromString(asset.getStringProperty("discussion"));
+        discussion.add(new DiscussionRecord(repo.getSession().getUserID(), comment));
+        asset.updateStringProperty(dp.toString(discussion), "discussion");
+        repo.save();        
+        return discussion;
+    }
+
+    @Restrict("#{identity.loggedIn}")
+    public void clearAllDiscussionsForAsset(String assetId) {
+        checkIfADMIN();
+        RulesRepository repo = getRulesRepository();
+        AssetItem asset = repo.loadAssetByUUID(assetId);
+        asset.updateStringProperty("", "discussion");
+        repo.save();
+    }
+
+    private void checkIfADMIN() {
+        if ( Contexts.isApplicationContextActive() ) {
+            Identity.instance().checkPermission( new AdminType(), RoleTypes.ADMIN );
+        }
+    }
+
     public String cleanHTML(String s) {
         return s.replace( "<",
                           "&lt;" ).replace( ">",

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/util/Discussion.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/util/Discussion.java	2009-08-03 06:45:09 UTC (rev 28739)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/util/Discussion.java	2009-08-03 06:50:32 UTC (rev 28740)
@@ -3,6 +3,10 @@
 import org.drools.guvnor.client.rpc.DiscussionRecord;
 import com.thoughtworks.xstream.XStream;
 
+import java.util.List;
+import java.util.Collections;
+import java.util.ArrayList;
+
 /**
  * @author Michael Neale
  */
@@ -10,20 +14,20 @@
 
     private XStream xs = getXStream();
 
-    public String toString(DiscussionRecord[] recs) {
+    public String toString(List<DiscussionRecord> recs) {
         return xs.toXML(recs);
     }
 
-    public DiscussionRecord[] fromString(String data) {
-        if (data == null || data.equals("")) return new DiscussionRecord[0];
-        return (DiscussionRecord[]) xs.fromXML(data);
+    public List<DiscussionRecord> fromString(String data) {
+        if (data == null || data.equals("")) return new ArrayList<DiscussionRecord>();
+        return (List<DiscussionRecord>) xs.fromXML(data);
     }
 
 
     public XStream getXStream() {
         XStream xs = new XStream();
         xs.alias("discussion-record", DiscussionRecord.class);
-        xs.alias("discussion", DiscussionRecord[].class);
+        xs.alias("discussion", List.class);
         return xs;
     }
 }

Modified: labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/ServiceImplementationTest.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/ServiceImplementationTest.java	2009-08-03 06:45:09 UTC (rev 28739)
+++ labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/ServiceImplementationTest.java	2009-08-03 06:50:32 UTC (rev 28740)
@@ -66,6 +66,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.DiscussionRecord;
 import org.drools.guvnor.client.rulelist.AssetItemGrid;
 import org.drools.guvnor.server.security.MockIdentity;
 import org.drools.guvnor.server.util.BRXMLPersistence;
@@ -1213,8 +1214,69 @@
 	}
 
 
+    public void testDiscussion() throws Exception {
+        ServiceImplementation impl = getService();
+        RulesRepository repo = impl.repository;
 
+        PackageItem pkg = repo.createPackage("testDiscussionFeature", "");
+        AssetItem rule1 = pkg.addAsset("rule_1", "");
+        rule1.updateFormat(AssetFormats.DRL);
+        rule1.updateContent("rule 'rule1' \n when \np : Person() \n then \np.setAge(42); \n end");
+        rule1.checkin("");
+        repo.save();
 
+        List<DiscussionRecord> dr = impl.loadDiscussionForAsset(rule1.getUUID());
+        assertEquals(0, dr.size());
+
+        List<DiscussionRecord> dr_ = impl.addToDiscussionForAsset(rule1.getUUID(), "This is a note");
+        assertEquals(1, dr_.size()) ;
+        assertNotNull(dr_.get(0).author);
+        assertEquals("This is a note", dr_.get(0).note);
+        Thread.sleep(100);
+        impl.addToDiscussionForAsset(rule1.getUUID(), "This is a note2");
+
+
+        List<DiscussionRecord> d_ = impl.loadDiscussionForAsset(rule1.getUUID());
+        assertEquals(2, d_.size());
+
+        assertEquals("This is a note", d_.get(0).note);
+        assertEquals("This is a note2", d_.get(1).note);
+        assertTrue(d_.get(1).timestamp > d_.get(0).timestamp);
+
+
+
+        rule1.updateContent("some more content");
+        rule1.checkin("");
+
+
+        impl.addToDiscussionForAsset(rule1.getUUID(), "This is a note2");
+        d_ = impl.loadDiscussionForAsset(rule1.getUUID());
+        assertEquals(3, d_.size());
+
+        assertEquals("This is a note", d_.get(0).note);
+        assertEquals("This is a note2", d_.get(1).note);
+
+        impl.clearAllDiscussionsForAsset(rule1.getUUID());
+        d_ = impl.loadDiscussionForAsset(rule1.getUUID());
+        assertEquals(0, d_.size());
+
+        impl.addToDiscussionForAsset(rule1.getUUID(), "This is a note2");
+        d_ = impl.loadDiscussionForAsset(rule1.getUUID());
+        assertEquals(1, d_.size());
+
+
+
+
+
+
+
+
+
+
+    }
+
+
+
 	/**
 	 * This will test creating a package, check it compiles, and can exectute
 	 * rules, then take a snapshot, and check that it reports errors.

Modified: labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/util/DiscussionTest.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/util/DiscussionTest.java	2009-08-03 06:45:09 UTC (rev 28739)
+++ labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/util/DiscussionTest.java	2009-08-03 06:50:32 UTC (rev 28740)
@@ -3,6 +3,9 @@
 import org.drools.guvnor.client.rpc.DiscussionRecord;
 import junit.framework.TestCase;
 
+import java.util.List;
+import java.util.ArrayList;
+
 /**
  * @author Michael Neale
  */
@@ -20,20 +23,34 @@
         Thread.sleep(100);
 
         Discussion d = new Discussion();
-        String xml = d.toString(new DiscussionRecord[] {dr, dr2});
+        List<DiscussionRecord> drs = new ArrayList<DiscussionRecord>();
+        drs.add(dr);
+        drs.add(dr2);
+        String xml = d.toString(drs);
         System.err.println(xml);
 
-        DiscussionRecord[] res = d.fromString(xml);
-        assertEquals(2, res.length);
+        List<DiscussionRecord> res = d.fromString(xml);
+        assertEquals(2, res.size());
 
-        assertEquals("mic", res[0].author);
+        assertEquals("mic", res.get(0).author);
 
-        assertEquals(dr.timestamp, res[0].timestamp);
+        assertEquals(dr.timestamp, res.get(0).timestamp);
         
 
         assertNotNull(d.fromString(null));
         assertNotNull(d.fromString(""));
 
+        DiscussionRecord dr3 = new DiscussionRecord();
+        dr3.author = "sam";
+        dr3.note = "yeah !";
+        res.add(dr3);
+
+        assertTrue(d.toString(res).indexOf("sam") > -1);
+        List<DiscussionRecord> d_ = d.fromString(d.toString(res));
+        assertEquals(3, d_.size());
+        assertEquals("sam", d_.get(2).author);
+
+
     }
 
 }



More information about the jboss-svn-commits mailing list