[jboss-svn-commits] JBL Code SVN: r28774 - 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 21:55:21 EDT 2009


Author: michael.neale at jboss.com
Date: 2009-08-03 21:55:21 -0400 (Mon, 03 Aug 2009)
New Revision: 28774

Modified:
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/CategoriesPanel.java
   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/ruleeditor/DiscussionWidget.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rulelist/AssetItemGrid.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/ServiceImplementation.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/files/FeedServlet.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/files/FeedServletTest.java
Log:
GUVNOR-302 atom feed for comments

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/CategoriesPanel.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/CategoriesPanel.java	2009-08-04 01:34:24 UTC (rev 28773)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/CategoriesPanel.java	2009-08-04 01:55:21 UTC (rev 28774)
@@ -106,8 +106,9 @@
 
     /**
      * The URL that will be used to open up assets in a feed.
+     * (by tacking asset id on the end, of course !). 
      */
-    static String getSelfURL() {
+    public static String getSelfURL() {
         String selfURL = Window.Location.getHref();
         if (selfURL.contains("#")) {
             selfURL = selfURL.substring(0, selfURL.indexOf("#"));

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-04 01:34:24 UTC (rev 28773)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/DiscussionRecord.java	2009-08-04 01:55:21 UTC (rev 28774)
@@ -7,7 +7,9 @@
 import java.util.Date;
 
 /**
- * This is a discussion record item.
+ * This is a discussion record item - persisted via Discussion.java (xstream) to XML, as a
+ * a property on an AssetItem.
+ * 
  * @author Michael Neale
  */
 public class DiscussionRecord implements IsSerializable {

Modified: 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	2009-08-04 01:34:24 UTC (rev 28773)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/DiscussionWidget.java	2009-08-04 01:55:21 UTC (rev 28774)
@@ -13,6 +13,7 @@
 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.google.gwt.http.client.URL;
 import com.gwtext.client.util.Format;
 import com.gwtext.client.widgets.Panel;
 import org.drools.guvnor.client.common.GenericCallback;
@@ -22,6 +23,7 @@
 import org.drools.guvnor.client.rpc.RepositoryServiceFactory;
 import org.drools.guvnor.client.rpc.RuleAsset;
 import org.drools.guvnor.client.explorer.ExplorerLayoutManager;
+import org.drools.guvnor.client.explorer.CategoriesPanel;
 import org.drools.guvnor.client.security.Capabilities;
 
 import java.util.Date;
@@ -39,7 +41,6 @@
     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;
 
@@ -52,6 +53,7 @@
         discussionPanel.setBodyBorder(false);
 
         commentList.setWidth("100%");
+        VerticalPanel discussionLayout = new VerticalPanel();
         discussionLayout.setWidth("100%");
 
         discussionPanel.add(discussionLayout);
@@ -61,10 +63,8 @@
         refreshDiscussion();
 
 
-        if (!asset.isreadonly) {
-            discussionLayout.add(newCommentLayout);
-            showNewCommentButton();
-        }
+        discussionLayout.add(newCommentLayout);
+        showNewCommentButton();
 
         initWidget(discussionPanel);
     }
@@ -107,6 +107,7 @@
         hp.add(createNewComment);
 
 
+
         if (ExplorerLayoutManager.shouldShow(Capabilities.SHOW_ADMIN)) {
             Button adminClearAll = new Button(constants.EraseAllComments());
             hp.add(adminClearAll);
@@ -124,6 +125,11 @@
             
         }
 
+
+        String feedURL = GWT.getModuleBaseURL() + "feed/discussion?package=" + asset.metaData.packageName+
+                "&assetName=" + URL.encode(asset.metaData.name) + "&viewUrl=" + CategoriesPanel.getSelfURL();
+        hp.add(new HTML("<a href='" + feedURL + "' target='_blank'><img src='images/feed.png'/></a>"));
+
         newCommentLayout.add(hp);
         
         newCommentLayout.setCellHorizontalAlignment(hp, HasHorizontalAlignment.ALIGN_RIGHT);

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rulelist/AssetItemGrid.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rulelist/AssetItemGrid.java	2009-08-04 01:34:24 UTC (rev 28773)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rulelist/AssetItemGrid.java	2009-08-04 01:55:21 UTC (rev 28774)
@@ -92,8 +92,8 @@
         this.layout = new SimplePanel();
         if ( !columnConfigs.containsKey( tableConfig ) ) {
             RepositoryServiceFactory.getService().loadTableConfig( tableConfig,
-                                                                   new GenericCallback() {
-                                                                       public void onSuccess(Object data) {
+                                                                   new GenericCallback<TableConfig>() {
+                                                                       public void onSuccess(TableConfig data) {
                                                                            TableConfig conf = (TableConfig) data;
                                                                            ColumnModel cm = createColumnModel( conf );
                                                                            columnConfigs.put( tableConfig,

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-04 01:34:24 UTC (rev 28773)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/ServiceImplementation.java	2009-08-04 01:55:21 UTC (rev 28774)
@@ -136,6 +136,7 @@
 /**
  * This is the implementation of the repository service to drive the GWT based
  * front end.
+ * Generally requests for this are passed through from RepositoryServiceServlet - and Seam manages instances of this. 
  *
  * @author Michael Neale
  */
@@ -2359,7 +2360,7 @@
 
     @Restrict("#{identity.loggedIn}")
     public List<DiscussionRecord> loadDiscussionForAsset(String assetId) {
-        return new Discussion().fromString(getRulesRepository().loadAssetByUUID(assetId).getStringProperty("discussion"));
+        return new Discussion().fromString(getRulesRepository().loadAssetByUUID(assetId).getStringProperty(Discussion.DISCUSSION_PROPERTY_KEY));
     }
 
     @Restrict("#{identity.loggedIn}")
@@ -2367,9 +2368,9 @@
         RulesRepository repo = getRulesRepository();
         AssetItem asset = repo.loadAssetByUUID(assetId);
         Discussion dp = new Discussion();
-        List<DiscussionRecord> discussion = dp.fromString(asset.getStringProperty("discussion"));
+        List<DiscussionRecord> discussion = dp.fromString(asset.getStringProperty(Discussion.DISCUSSION_PROPERTY_KEY));
         discussion.add(new DiscussionRecord(repo.getSession().getUserID(), comment));
-        asset.updateStringProperty(dp.toString(discussion), "discussion");
+        asset.updateStringProperty(dp.toString(discussion), Discussion.DISCUSSION_PROPERTY_KEY);
         repo.save();        
         return discussion;
     }

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/files/FeedServlet.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/files/FeedServlet.java	2009-08-04 01:34:24 UTC (rev 28773)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/files/FeedServlet.java	2009-08-04 01:55:21 UTC (rev 28774)
@@ -3,6 +3,8 @@
 import org.drools.guvnor.server.security.PackageNameType;
 import org.drools.guvnor.server.security.RoleTypes;
 import org.drools.guvnor.server.security.CategoryPathType;
+import org.drools.guvnor.server.util.Discussion;
+import org.drools.guvnor.client.rpc.DiscussionRecord;
 import org.drools.repository.AssetItem;
 import org.drools.repository.PackageItem;
 import org.drools.repository.AssetPageList;
@@ -43,6 +45,12 @@
                         doCategoryFeed(request, response);
                     }
                 });
+            } else if (url.indexOf("feed/discussion")  > -1) {
+                doAuthorizedAction(request, response, new A() {
+                    public void a() throws Exception {
+                        doDiscussionFeed(request, response);
+                    }
+                });
             }
         } catch (AuthorizationException e) {
             response.setHeader("WWW-Authenticate", "BASIC realm=\"users\"");
@@ -51,8 +59,28 @@
 
     }
 
+    private void doDiscussionFeed(HttpServletRequest request, HttpServletResponse response) throws IOException {
+        String assetName = request.getParameter("assetName");
+        String packageName = request.getParameter("package");
+        AssetItem asset = getFileManager().getRepository().loadPackage(packageName).loadAsset(assetName);
+        checkPackageReadPermission(asset.getPackageName());
 
+        List<AtomFeed.AtomEntry> entries = new ArrayList<AtomFeed.AtomEntry>();
+        entries.add(new AtomFeed.AtomEntry(request,  asset));
+        List<DiscussionRecord> drs = new Discussion().fromString(asset.getStringProperty(Discussion.DISCUSSION_PROPERTY_KEY));
+        for (DiscussionRecord dr : drs) {
+            entries.add(new AtomFeed.AtomEntry(request, asset, dr));
+        }
+        AtomFeed feed = new AtomFeed("Discussion of: " + packageName + "/" + assetName,
+                Calendar.getInstance(),
+                request.getServerName() + "/" + packageName + "/" + assetName,
+                request.getParameter(VIEW_URL),
+                request.getRequestURL().toString(), entries, "A list of updated discussion content.");
+        response.setContentType("application/atom+xml");
+        response.getOutputStream().print(feed.getAtom());
+    }
 
+
     private void doCategoryFeed(HttpServletRequest request, HttpServletResponse response) throws IOException {
         String cat = request.getParameter("name");
         String status = request.getParameter("status");
@@ -178,6 +206,9 @@
             private String format;
 
 
+            /**
+             * We are creating an entry for each asset.
+             */
             public AtomEntry(HttpServletRequest req, AssetItem asset) {
                 this.name = asset.getName();
                 this.format = asset.getFormat();
@@ -191,6 +222,23 @@
                 this.checkinComment = asset.getCheckinComment();
             }
 
+            /** We are creating entries for each discussion record */
+            public AtomEntry(HttpServletRequest req, AssetItem asset, DiscussionRecord discussionRec) {
+                this.name = asset.getName();
+                this.format = asset.getFormat();
+                this.webURL = req.getParameter(VIEW_URL) + "#asset=" + asset.getUUID() + "&nochrome";
+                this.id = asset.getUUID() + "&discussion=" + discussionRec.timestamp + "&author=" + discussionRec.author;
+                Calendar c = Calendar.getInstance();
+                c.setTime(new Date(discussionRec.timestamp));
+                this.updated = ISO8601.format(c);
+                this.published = ISO8601.format(c);
+                this.author = discussionRec.author;
+                this.contributor = asset.getLastContributor();
+                this.description = "Discussion comment was added by: " + discussionRec.author;
+                this.checkinComment = discussionRec.note;
+
+            }
+
             public String getName() {
                 return name;
             }

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-04 01:34:24 UTC (rev 28773)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/util/Discussion.java	2009-08-04 01:55:21 UTC (rev 28774)
@@ -8,10 +8,13 @@
 import java.util.ArrayList;
 
 /**
+ * Utility methods for persisting discussion data as a property on an asset.
  * @author Michael Neale
  */
 public class Discussion {
 
+    public static final String DISCUSSION_PROPERTY_KEY = "discussion";
+
     private XStream xs = getXStream();
 
     public String toString(List<DiscussionRecord> recs) {

Modified: labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/files/FeedServletTest.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/files/FeedServletTest.java	2009-08-04 01:34:24 UTC (rev 28773)
+++ labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/files/FeedServletTest.java	2009-08-04 01:55:21 UTC (rev 28774)
@@ -162,6 +162,62 @@
 
     }
 
+
+
+    public void testDiscussionFeed() throws Exception {
+        RulesRepository repo = new RulesRepository( TestEnvironmentSessionHelper.getSession( true ) );
+        PackageItem pkg = repo.createPackage("testDiscussionFeed", "");
+        AssetItem asset = pkg.addAsset("asset1", "desc");
+        asset.updateFormat("drl");
+        asset.checkin("");
+
+        ServiceImplementation impl = new ServiceImplementation();
+        impl.repository = repo;
+        impl.addToDiscussionForAsset(asset.getUUID(), "This is a comment");
+        impl.addToDiscussionForAsset(asset.getUUID(), "This is another comment");
+
+        Map<String, String> headers = new HashMap<String, String>() {
+            {
+                put("Irrelevant", "garbage");
+            }
+        };
+
+        MockHTTPRequest req = new MockHTTPRequest("/org.foo/feed/discussion?package=...", headers);
+        FeedServlet fs = new FeedServlet();
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        MockHTTPResponse res = new MockHTTPResponse(out);
+        fs.doGet(req, res);
+        assertEquals(HttpServletResponse.SC_UNAUTHORIZED, res.errorCode);
+
+        headers = new HashMap<String, String>() {
+            {
+                put("Authorization", "BASIC " + new String(Base64.encode("test:password".getBytes())));
+            }
+        };
+
+
+        req = new MockHTTPRequest("/org.foo/feed/discussion", headers, new HashMap<String, String>() {
+            {
+                put("package", "testDiscussionFeed");
+                put("assetName", "asset1");
+            }
+        });
+        fs = new FeedServlet();
+        out = new ByteArrayOutputStream();
+        res = new MockHTTPResponse(out);
+        fs.doGet(req, res);
+
+        String r = new String(out.toByteArray());
+        assertNotNull(r);
+        assertTrue(r.indexOf("This is a comment") > -1);
+        assertTrue(r.indexOf("This is another comment") > r.indexOf("This is a comment"));
+        System.err.println(r);
+
+
+
+    }
+
+
     class MockFeedServlet extends FeedServlet {
         boolean throwAuthException = false;
         @Override



More information about the jboss-svn-commits mailing list