[jboss-svn-commits] JBL Code SVN: r5294 - in labs/shotoku/trunk: shotoku-base/src/java/org/jboss/shotoku/tools shotoku-feeds shotoku-feeds/src shotoku-feeds/src/etc shotoku-feeds/src/etc/META-INF shotoku-feeds/src/java/org/jboss/shotoku/feeds shotoku-feeds/src/java/org/jboss/shotoku/feeds/comments shotoku-feeds/src/java/org/jboss/shotoku/feeds/data shotoku-feeds/src/java/org/jboss/shotoku/feeds/service shotoku-feeds/src/java/org/jboss/shotoku/feeds/tag shotoku-user/src/java/org/jboss/shotoku/user shotoku-user/src/java/org/jboss/shotoku/user/service

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Jul 26 12:03:27 EDT 2006


Author: adamw
Date: 2006-07-26 12:03:22 -0400 (Wed, 26 Jul 2006)
New Revision: 5294

Added:
   labs/shotoku/trunk/shotoku-feeds/src/etc/
   labs/shotoku/trunk/shotoku-feeds/src/etc/META-INF/
   labs/shotoku/trunk/shotoku-feeds/src/etc/META-INF/persistence.xml
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/comments/CommentEntity.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/CommentableFeed.java
Modified:
   labs/shotoku/trunk/shotoku-base/src/java/org/jboss/shotoku/tools/Tools.java
   labs/shotoku/trunk/shotoku-feeds/project.xml
   labs/shotoku/trunk/shotoku-feeds/shotoku-feeds.iml
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/FeedsDescriptor.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/FeedsService.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/comments/CommentsServlet.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/ConcreteTagFeed.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/Feed.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/FileBasedFeed.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/Rss2TagFeed.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/TagFeed.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/service/FeedsServiceImpl.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tag/ShotokuFeedTagHandler.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tag/TagFeedTagHandler.java
   labs/shotoku/trunk/shotoku-user/src/java/org/jboss/shotoku/user/UserService.java
   labs/shotoku/trunk/shotoku-user/src/java/org/jboss/shotoku/user/service/UserServiceImpl.java
Log:
http://jira.jboss.org/jira/browse/JBSHOTOKU-38

Modified: labs/shotoku/trunk/shotoku-base/src/java/org/jboss/shotoku/tools/Tools.java
===================================================================
--- labs/shotoku/trunk/shotoku-base/src/java/org/jboss/shotoku/tools/Tools.java	2006-07-26 14:26:52 UTC (rev 5293)
+++ labs/shotoku/trunk/shotoku-base/src/java/org/jboss/shotoku/tools/Tools.java	2006-07-26 16:03:22 UTC (rev 5294)
@@ -275,6 +275,20 @@
     }
 
     /**
+     * Converts the given object to a String in a null-safe way.
+     * Never returns a null.
+     * @param o Object to convert.
+     * @return Result of o.toString() or an emptys tring if o is null.
+     */
+    public static String toStringNotNull(Object o) {
+        if (o == null) {
+            return "";
+        }
+
+        return o.toString();
+    }
+
+    /**
      * Checks if two objects are equal - either both null, or
      * their equals method returns true.
      * @param obj1 First object to compare.

Modified: labs/shotoku/trunk/shotoku-feeds/project.xml
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/project.xml	2006-07-26 14:26:52 UTC (rev 5293)
+++ labs/shotoku/trunk/shotoku-feeds/project.xml	2006-07-26 16:03:22 UTC (rev 5294)
@@ -31,6 +31,12 @@
 
         <dependency>
             <groupId>shotoku</groupId>
+            <artifactId>shotoku-user</artifactId>
+            <jar>shotoku-user.jar</jar>
+        </dependency>
+
+        <dependency>
+            <groupId>shotoku</groupId>
             <artifactId>shotoku-aop</artifactId>
             <jar>shotoku-aop.jar</jar>
         </dependency>
@@ -65,6 +71,27 @@
             <artifactId>junit</artifactId>
             <version>3.8.1</version>
         </dependency>
+
+        <dependency>
+            <groupId>jboss</groupId>
+            <artifactId>ejb3-persistence</artifactId>
+            <jar>ejb3-persistence.jar</jar>
+        </dependency>
+        <dependency>
+            <groupId>jboss</groupId>
+            <artifactId>jboss-ejb3x</artifactId>
+            <jar>jboss-ejb3x.jar</jar>
+        </dependency>
+        <dependency>
+            <groupId>jboss</groupId>
+            <artifactId>jboss-j2ee</artifactId>
+            <jar>jboss-j2ee.jar</jar>
+        </dependency>
+        <dependency>
+            <groupId>jboss</groupId>
+            <artifactId>jboss-annotations-ejb3</artifactId>
+            <jar>jboss-annotations-ejb3.jar</jar>
+        </dependency>
     </dependencies>
 
     <build>

Modified: labs/shotoku/trunk/shotoku-feeds/shotoku-feeds.iml
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/shotoku-feeds.iml	2006-07-26 14:26:52 UTC (rev 5293)
+++ labs/shotoku/trunk/shotoku-feeds/shotoku-feeds.iml	2006-07-26 16:03:22 UTC (rev 5294)
@@ -16,6 +16,7 @@
     <orderEntry type="library" name="velocity" level="application" />
     <orderEntry type="module" module-name="shotoku-tags" />
     <orderEntry type="library" name="junit" level="application" />
+    <orderEntry type="module" module-name="shotoku-user" />
     <orderEntryProperties />
   </component>
 </module>

Added: labs/shotoku/trunk/shotoku-feeds/src/etc/META-INF/persistence.xml
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/etc/META-INF/persistence.xml	2006-07-26 14:26:52 UTC (rev 5293)
+++ labs/shotoku/trunk/shotoku-feeds/src/etc/META-INF/persistence.xml	2006-07-26 16:03:22 UTC (rev 5294)
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<persistence>
+    <persistence-unit name="feeds">
+        <jta-data-source>java:/LabsDS</jta-data-source>
+        <properties>
+            <property name="hibernate.hbm2ddl.auto" value="update"/>
+            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
+        </properties>
+    </persistence-unit>
+
+    <persistence-unit name="feeds-noauto">
+        <jta-data-source>java:/LabsDS</jta-data-source>
+        <properties>
+            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
+        </properties>
+    </persistence-unit>
+</persistence>

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/FeedsDescriptor.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/FeedsDescriptor.java	2006-07-26 14:26:52 UTC (rev 5293)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/FeedsDescriptor.java	2006-07-26 16:03:22 UTC (rev 5294)
@@ -34,6 +34,7 @@
 import org.jboss.shotoku.feeds.data.NormalFeed;
 import org.jboss.shotoku.feeds.data.SpecialFeed;
 import org.jboss.shotoku.feeds.data.Feed;
+import org.jboss.shotoku.feeds.data.CommentableFeed;
 import org.jboss.shotoku.feeds.variables.VariableResolverManager;
 import org.jboss.shotoku.feeds.tag.FeedTagHandler;
 import org.jboss.shotoku.feeds.tag.FeedTagHandlerManager;
@@ -70,6 +71,12 @@
     private Map<String, Map<String, SpecialFeed>> specialFeeds;
 
     /**
+     * Commentable feeds: feed name prefix -> (feed type ->
+     * commentable feed).
+     */
+    private Map<String, Map<String, CommentableFeed>> commentableFeeds;
+
+    /**
      * Properties: sets of attributes which can be used in
      * feeds.
      */
@@ -115,6 +122,7 @@
         // Creating the maps that will hold the feeds.
         feeds = new HashMap<String, Map<String, NormalFeed>>();
         specialFeeds = new HashMap<String, Map<String, SpecialFeed>>();
+        commentableFeeds = new HashMap<String, Map<String, CommentableFeed>>();
         attributes = new HashMap<String, Map<String, Object>>();
 
         // Looking for file containing feed definitons and filling the maps.
@@ -194,6 +202,25 @@
     }
 
     /**
+     * Adds a ready commentable feed of the given name and type.
+     * @param name
+     * @param type
+     * @param feed
+     */
+    public void addCommentableFeed(String name, String type,
+                                   CommentableFeed feed) {
+        Map<String, CommentableFeed> typesMap = commentableFeeds.get(name);
+        if (typesMap == null) {
+            typesMap = new HashMap<String, CommentableFeed>();
+            commentableFeeds.put(name, typesMap);
+        }
+
+        typesMap.put(type, feed);
+
+        addFeed(name, type, feed);
+    }
+
+    /**
      * Adds a ready special feed of the given name and type.
      * @param name
      * @param type
@@ -263,6 +290,21 @@
     }
 
     /**
+     * Gets a commentable feed of the given type and name.
+     * @param name Name of the feed to get.
+     * @param type Type of the feed to get.
+     * @return Commentable feed with the given name and type.
+     */
+    public CommentableFeed getCommentableFeed(String name, String type) {
+        Map<String, CommentableFeed> feedTypes = commentableFeeds.get(name);
+        if (feedTypes == null) {
+            return null;
+        }
+
+        return feedTypes.get(type);
+    }
+
+    /**
      * Gets a feed (any - special or normal) of the given type and name.
      * @param name Name of the feed to get.
      * @param type Type of the feed to get.

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/FeedsService.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/FeedsService.java	2006-07-26 14:26:52 UTC (rev 5293)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/FeedsService.java	2006-07-26 16:03:22 UTC (rev 5294)
@@ -3,6 +3,8 @@
 import org.jboss.shotoku.service.AdministratedService;
 import org.jboss.shotoku.feeds.data.Feed;
 import org.jboss.shotoku.feeds.comments.FeedDoesNotExistException;
+import org.jboss.shotoku.feeds.comments.CommentsNotAvialableException;
+import org.jboss.shotoku.feeds.comments.UnauthorizedToCommentException;
 
 /**
  * @author Adam Warski (adamw at aster.pl)
@@ -12,7 +14,9 @@
 
     public void addComment(String feedId, String feedName, String feedElement,
                            String feedType, String username, String title,
-                           String content) throws FeedDoesNotExistException;
+                           String content, String userIp)
+            throws FeedDoesNotExistException, CommentsNotAvialableException,
+            UnauthorizedToCommentException;
 
     /*
      * SERVICE MANAGEMENT METHODS

Added: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/comments/CommentEntity.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/comments/CommentEntity.java	2006-07-26 14:26:52 UTC (rev 5293)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/comments/CommentEntity.java	2006-07-26 16:03:22 UTC (rev 5294)
@@ -0,0 +1,106 @@
+package org.jboss.shotoku.feeds.comments;
+
+import javax.persistence.*;
+
+/**
+ * @author Adam Warski (adamw at aster.pl)
+ */
+ at Entity
+ at Table(name = "ShotokuComments")
+public class CommentEntity {
+    private int id;
+    private String feedId;
+    private String feedName;
+    private String feedType;
+    private String feedElement;
+    private String username;
+    private String title;
+    private String content;
+
+    public CommentEntity() {
+    }
+
+    public CommentEntity(String feedId, String feedName, String feedType,
+                         String feedElement, String username, String title,
+                         String content) {
+        this.feedId = feedId;
+        this.feedName = feedName;
+        this.feedType = feedType;
+        this.feedElement = feedElement;
+        this.username = username;
+        this.title = title;
+        this.content = content;
+    }
+
+    @Id
+    @GeneratedValue
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    @Column(length = 32)
+    public String getFeedId() {
+        return feedId;
+    }
+
+    public void setFeedId(String feedId) {
+        this.feedId = feedId;
+    }
+
+    @Column(length = 128)
+    public String getFeedName() {
+        return feedName;
+    }
+
+    public void setFeedName(String feedName) {
+        this.feedName = feedName;
+    }
+
+    @Column(length = 8)
+    public String getFeedType() {
+        return feedType;
+    }
+
+    public void setFeedType(String feedType) {
+        this.feedType = feedType;
+    }
+
+    @Column(length = 256)
+    public String getFeedElement() {
+        return feedElement;
+    }
+
+    public void setFeedElement(String feedElement) {
+        this.feedElement = feedElement;
+    }
+
+    @Column(length = 32)
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    @Column(length = 256)
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+}

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/comments/CommentsServlet.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/comments/CommentsServlet.java	2006-07-26 14:26:52 UTC (rev 5293)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/comments/CommentsServlet.java	2006-07-26 16:03:22 UTC (rev 5294)
@@ -13,8 +13,11 @@
 import javax.servlet.ServletException;
 import javax.servlet.ServletConfig;
 import java.io.IOException;
+import java.util.Enumeration;
 
 /**
+ * A servlet which captures requests for adding comments to feeds. The
+ * requests are passed to FeedsService.
  * @author Adam Warski (adamw at aster.pl)
  */
 public class CommentsServlet extends HttpServlet {
@@ -26,6 +29,10 @@
                            HttpServletResponse response)
             throws ServletException, IOException {
         try {
+            Enumeration e = request.getSession().getAttributeNames();
+            System.out.println("Attributes:");
+
+
             // Getting the comment parameters.
             String feedId = request.getParameter("id");
             String feedName = request.getParameter("name");
@@ -62,15 +69,16 @@
 
             // Adding the comment.
             FeedsTools.getService().addComment(feedId, feedName, feedType,
-                    feedElement, request.getRemoteUser(), title, description);
+                    feedElement, request.getRemoteUser(), title, description,
+                    request.getRemoteHost());
 
             response.setStatus(200);
         } catch (CommentsNotAvialableException e) {
-            // TODO
+            response.sendError(404, e.getMessage());
         } catch (UnauthorizedToCommentException e) {
-            // TODO
+            response.sendError(403, e.getMessage());
         } catch (FeedDoesNotExistException e) {
-            // TODO
+            response.sendError(404, e.getMessage());
         } catch (Exception e) {
             response.sendError(400, e.getMessage());
         }

Added: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/CommentableFeed.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/CommentableFeed.java	2006-07-26 14:26:52 UTC (rev 5293)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/CommentableFeed.java	2006-07-26 16:03:22 UTC (rev 5294)
@@ -0,0 +1,120 @@
+package org.jboss.shotoku.feeds.data;
+
+import org.jboss.shotoku.NodeList;
+import org.jboss.shotoku.Node;
+import org.jboss.shotoku.tools.Tools;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.net.URL;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Writer;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.Arrays;
+import java.util.Map;
+
+/**
+ * @author Adam Warski (adamw at aster.pl)
+ */
+public class CommentableFeed implements NormalFeed {
+    private NormalFeed nf;
+
+    private boolean commentsEnabled;
+    private List<String> groupsAllowedToModerate;
+    private boolean commentsModerated;
+    private NodeList feedElements;
+
+    public CommentableFeed(NormalFeed nf, NodeList feedElements) {
+        this.nf = nf;
+        this.feedElements = feedElements;
+
+        commentsEnabled = Tools.isTrue(
+                Tools.toString(getAttributes().get("commentsEnabled")));
+        commentsModerated = Tools.isTrue(
+                Tools.toString(getAttributes().get("commentsModerated")));
+        groupsAllowedToModerate = Arrays.asList(
+                Tools.toStringNotNull(
+                        getAttributes().get("moderators")).split("[,]"));
+    }
+
+    /*
+     * Comments methods.
+     */
+
+    public boolean getCommentsEnabled() {
+        return commentsEnabled;
+    }
+
+    public boolean getCommentsModerated() {
+        return commentsModerated;
+    }
+
+    public List<String> getGroupsAllowedToModerateComments() {
+        return groupsAllowedToModerate;
+    }
+
+    public Node getNodeForFeedElement(String feedElement) {
+        String path = Tools.normalizeSlashes(feedElement, false);
+        for (Node n : feedElements) {
+            if (n.getFullName().equals(path)) {
+                return n;
+            }
+        }
+
+        return null;
+    }
+
+    /*
+     * Delegating all non-comments methods.
+     */
+
+    public Map<String, Object> getAttributes() {
+        return nf.getAttributes();
+    }
+
+    public void generate(URL url) throws IOException {
+        nf.generate(url);
+    }
+
+    public void generate(InputStream is) throws IOException {
+        nf.generate(is);
+    }
+
+    public Writer getWriter() throws IOException {
+        return nf.getWriter();
+    }
+
+    public void generate(NormalFeed[] feeds, String title, String description, String author, String link) throws IllegalArgumentException, IOException {
+        nf.generate(feeds, title, description, author, link);
+    }
+
+    public InputStream getInputStream() {
+        return nf.getInputStream();
+    }
+
+    public void write(OutputStream os, HttpServletRequest request) throws IOException {
+        nf.write(os, request);
+    }
+
+    public void write(HttpServletResponse response, HttpServletRequest request) throws IOException {
+        nf.write(response, request);
+    }
+
+    public String getName() {
+        return nf.getName();
+    }
+
+    public String getDisplayName() {
+        return nf.getDisplayName();
+    }
+
+    public String getType() {
+        return nf.getType();
+    }
+
+    public void release() {
+        nf.release();
+    }
+}

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/ConcreteTagFeed.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/ConcreteTagFeed.java	2006-07-26 14:26:52 UTC (rev 5293)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/ConcreteTagFeed.java	2006-07-26 16:03:22 UTC (rev 5294)
@@ -5,6 +5,7 @@
 import java.io.OutputStream;
 import java.io.IOException;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author Adam Warski (adamw at aster.pl)
@@ -44,19 +45,7 @@
         tagFeed.release();
     }
 
-    /*
-     * Comments are not available for concretized feeds.
-     */
-
-    public boolean getCommentsEnabled() {
-        return false;
+    public Map<String, Object> getAttributes() {
+        return tagFeed.getAttributes();
     }
-
-    public boolean getCommentsModerated() {
-        return false;
-    }
-
-    public List<String> getGroupsAllowedToModerateComments() {
-        return null;
-    }
 }

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/Feed.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/Feed.java	2006-07-26 14:26:52 UTC (rev 5293)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/Feed.java	2006-07-26 16:03:22 UTC (rev 5294)
@@ -4,7 +4,7 @@
 import javax.servlet.http.HttpServletRequest;
 import java.io.OutputStream;
 import java.io.IOException;
-import java.util.List;
+import java.util.Map;
 
 /**
  * A base interface for feeds.
@@ -50,26 +50,8 @@
     public void release();
 
     /**
-     * Checks if comments are enabled for this feed. Should return true only if
-     * this is a Shotoku feed.
-     * @return True iff comments are enabled for this feed.
+     *
+     * @return Attributes of this feed.
      */
-    public boolean getCommentsEnabled();
-
-    /**
-     * Checks if comments need to be approved by a moderator to be visible
-     * publicly.
-     * @return True iff comments need to be approved by a moderator to be
-     * visible publicly.
-     */
-    public boolean getCommentsModerated();
-
-    /**
-     * Gets the groups that can moderate comments of elements of that feed.
-     * Should return a non-empty and non-null list only when this is a
-     * Shotoku feed.
-     * @return A list of group names that are allowed to moderate Shotoku
-     * comments of that feed's elements.
-     */
-    public List<String> getGroupsAllowedToModerateComments();
+    public Map<String, Object> getAttributes();
 }

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/FileBasedFeed.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/FileBasedFeed.java	2006-07-26 14:26:52 UTC (rev 5293)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/FileBasedFeed.java	2006-07-26 16:03:22 UTC (rev 5294)
@@ -36,8 +36,6 @@
 import java.io.Writer;
 import java.net.URL;
 import java.util.Map;
-import java.util.List;
-import java.util.Arrays;
 
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletRequest;
@@ -47,24 +45,15 @@
     private String name;
     private String displayName;
     private String type;
+    private Map<String, Object> attributes;
 
-    private boolean commentsEnabled;
-    private List<String> groupsAllowedToModerate;
-    private boolean commentsModerated;
-
     public FileBasedFeed(String name, String displayName, String type,
                          File file, Map<String, Object> attributes) {
         this.name = name;
         this.displayName = displayName;
         this.type = type;
         this.file = file;
-
-        commentsEnabled = Tools.isTrue(
-                Tools.toString(attributes.get("commentsEnabled")));
-        commentsModerated = Tools.isTrue(
-                Tools.toString(attributes.get("commentsModerated")));
-        groupsAllowedToModerate = Arrays.asList(
-                Tools.toString(attributes.get("moderators")).split("[,]"));
+        this.attributes = attributes;
     }
 
     public void generate(URL url) throws IOException {
@@ -152,19 +141,7 @@
         file.delete();
     }
 
-    /*
-     * Comments.
-     */
-
-    public boolean getCommentsEnabled() {
-        return commentsEnabled;
+    public Map<String, Object> getAttributes() {
+        return attributes;
     }
-
-    public boolean getCommentsModerated() {
-        return commentsModerated;
-    }
-
-    public List<String> getGroupsAllowedToModerateComments() {
-        return groupsAllowedToModerate;
-    }
 }

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/Rss2TagFeed.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/Rss2TagFeed.java	2006-07-26 14:26:52 UTC (rev 5293)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/Rss2TagFeed.java	2006-07-26 16:03:22 UTC (rev 5294)
@@ -10,7 +10,7 @@
  */
 public class Rss2TagFeed extends TagFeed {
     public Rss2TagFeed(String name, String type,
-                       Map<String, String> attributes, VelocityContext vc) {
+                       Map<String, Object> attributes, VelocityContext vc) {
         super(name, type, attributes, vc);
     }
 

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/TagFeed.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/TagFeed.java	2006-07-26 14:26:52 UTC (rev 5293)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/TagFeed.java	2006-07-26 16:03:22 UTC (rev 5294)
@@ -2,6 +2,7 @@
 
 import org.apache.velocity.VelocityContext;
 import org.jboss.shotoku.ContentManager;
+import org.jboss.shotoku.tools.Tools;
 import org.jboss.shotoku.tags.Tag;
 import org.jboss.shotoku.tags.TagService;
 import org.jboss.shotoku.tags.tools.TagTools;
@@ -23,7 +24,7 @@
 public abstract class TagFeed implements SpecialFeed {
     private String name;
     private String type;
-    Map<String, String> attributes;
+    Map<String, Object> attributes;
     private VelocityContext vcOriginal;
 
     private int limit;
@@ -31,18 +32,19 @@
     private ContentManager cm;
 
     public TagFeed(String name, String type,
-                   Map<String, String> attributes, VelocityContext vc) {
+                   Map<String, Object> attributes, VelocityContext vc) {
         this.name = name;
         this.type = type;
         this.attributes = attributes;
         this.vcOriginal = vc;
 
         nameLength = name.length();
-        cm = ContentManager.getContentManager(attributes.get("id"),
-                attributes.get("prefix"));
+        cm = ContentManager.getContentManager(
+                Tools.toString(attributes.get("id")),
+                Tools.toString(attributes.get("prefix")));
 
         try {
-            limit = Integer.parseInt(attributes.get("limit"));
+            limit = Integer.parseInt(Tools.toString(attributes.get("limit")));
         } catch (NumberFormatException e) {
             limit = 0;
         }
@@ -104,7 +106,7 @@
 
         String infoDataDecoded = infoTokens[1];
         infoDataDecoded = URLDecoder.decode(infoDataDecoded, "UTF-8");
-        String template = attributes.get("template");
+        String template = Tools.toString(attributes.get("template"));
 
         List<Tag> tags;
         TagService service = TagTools.getService();
@@ -219,19 +221,7 @@
 
     }
 
-    /*
-     * No comments allowed on tag feeds.
-     */
-
-    public boolean getCommentsEnabled() {
-        return false;
+    public Map<String, Object> getAttributes() {
+        return attributes;
     }
-
-    public boolean getCommentsModerated() {
-        return false;
-    }
-
-    public List<String> getGroupsAllowedToModerateComments() {
-        return null;
-    }
 }

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/service/FeedsServiceImpl.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/service/FeedsServiceImpl.java	2006-07-26 14:26:52 UTC (rev 5293)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/service/FeedsServiceImpl.java	2006-07-26 16:03:22 UTC (rev 5294)
@@ -7,16 +7,26 @@
 import org.jboss.shotoku.feeds.FeedsDescriptor;
 import org.jboss.shotoku.feeds.FeedsConfigurationWatcher;
 import org.jboss.shotoku.feeds.comments.FeedDoesNotExistException;
+import org.jboss.shotoku.feeds.comments.CommentsNotAvialableException;
+import org.jboss.shotoku.feeds.comments.UnauthorizedToCommentException;
+import org.jboss.shotoku.feeds.comments.CommentEntity;
 import org.jboss.shotoku.feeds.data.Feed;
+import org.jboss.shotoku.feeds.data.CommentableFeed;
 import org.jboss.shotoku.feeds.tools.FeedsConstants;
 import org.jboss.shotoku.feeds.tools.FeedsTools;
 import org.jboss.shotoku.service.AdministratedServiceImpl;
 import org.jboss.shotoku.service.AdministratedService;
 import org.jboss.shotoku.ContentManager;
+import org.jboss.shotoku.Node;
+import org.jboss.shotoku.user.UserNotFoundException;
+import org.jboss.shotoku.user.tools.UserConstants;
+import org.jboss.shotoku.tags.tools.UserTools;
 import org.jboss.shotoku.tools.Constants;
 import org.jboss.shotoku.aop.CacheItem;
 
 import javax.ejb.Local;
+import javax.persistence.PersistenceContext;
+import javax.persistence.EntityManager;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
@@ -25,7 +35,7 @@
 @Service(objectName = FeedsConstants.FEEDS_SERVICE_NAME)
 @Local(FeedsServiceLocal.class)
 @Management(FeedsService.class)
- at Depends(Constants.SHOTOKU_SERVICE_NAME)
+ at Depends({UserConstants.USER_SERVICE_NAME,Constants.SHOTOKU_SERVICE_NAME})
 public class FeedsServiceImpl extends AdministratedServiceImpl
         implements FeedsService, FeedsServiceLocal {
     /*
@@ -39,7 +49,11 @@
     private ConcurrentHashMap<String, FeedsDescriptor> fds;
     public static final Object synchronizer = new Object();
 
-    public Feed getFeed(String id, String name, String type) {
+    @SuppressWarnings({"UNUSED_SYMBOL"})
+    @PersistenceContext(unitName="feeds")
+    private EntityManager manager;
+
+    private FeedsDescriptor getFeedsDescriptor(String id) {
         if (!fds.contains(id)) {
             synchronized(synchronizer) {
                 if (!fds.contains(id)) {
@@ -48,13 +62,18 @@
             }
         }
 
-        return fds.get(id).getFeed(name, type);
+        return fds.get(id);
     }
 
+    public Feed getFeed(String id, String name, String type) {
+       return getFeedsDescriptor(id).getFeed(name, type);
+    }
+
     public void addComment(String feedId, String feedName, String feedType,
                            String feedElement, String username,
-                           String title, String content)
-            throws FeedDoesNotExistException {
+                           String title, String content, String userIp)
+            throws FeedDoesNotExistException, CommentsNotAvialableException,
+            UnauthorizedToCommentException {
         System.out.println("ADD COMMENT:");
         System.out.println("feedId = " + feedId);
         System.out.println("feedName = " + feedName);
@@ -64,11 +83,36 @@
         System.out.println("title = " + title);
         System.out.println("content = " + content);
 
-        Feed feed = getFeed(feedId, feedName, feedType);
+        // Getting the feed and checking if it exists.
+        CommentableFeed feed = getFeedsDescriptor(feedId).getCommentableFeed(
+                feedName, feedType);
 
         if (feed == null) {
             throw new FeedDoesNotExistException();
         }
+
+        // Checking if comments are enabled for this feed.
+        if (!feed.getCommentsEnabled()) {
+            throw new CommentsNotAvialableException();
+        }
+
+        // Checking if there is a user logged in and if it is a valid user.
+        try {
+            UserTools.getService().getUser(username);
+        } catch (UserNotFoundException e) {
+            throw new UnauthorizedToCommentException(e);
+        }
+
+        // Checking if the commented item exists in the content manager.
+        Node commentedElement = feed.getNodeForFeedElement(feedElement);
+
+        if (commentedElement == null) {
+            throw new FeedDoesNotExistException("Invalid feed element.");
+        }
+
+        // Saving the comment for later addition to Shotoku.
+        manager.persist(new CommentEntity(feedId, feedName, feedType,
+                feedElement, username, title, content));
     }
 
     /*

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tag/ShotokuFeedTagHandler.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tag/ShotokuFeedTagHandler.java	2006-07-26 14:26:52 UTC (rev 5293)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tag/ShotokuFeedTagHandler.java	2006-07-26 16:03:22 UTC (rev 5294)
@@ -7,6 +7,7 @@
 import org.jboss.shotoku.tools.Tools;
 import org.jboss.shotoku.feeds.tools.FeedsTools;
 import org.jboss.shotoku.feeds.data.NormalFeed;
+import org.jboss.shotoku.feeds.data.CommentableFeed;
 import org.jboss.shotoku.feeds.FeedFactory;
 import org.jboss.shotoku.feeds.FeedsDescriptor;
 import org.jboss.shotoku.feeds.tools.FeedsConstants;
@@ -127,6 +128,7 @@
         FeedsTools.prepareVelocityContext(attributes, vc);
 
         NodeList feedNodeChildren = getDefinition().getChildNodes();
+        org.jboss.shotoku.NodeList nodesNodeList = null;
         for (int i = 0; i < feedNodeChildren.getLength(); i++) {
             // For each search node, generating and performing the
             // search, placing it under the demanded attribute in
@@ -146,6 +148,10 @@
 
                     vc.put(searchNameAttr, list);
 
+                    if ("nodes".equals(searchNameAttr)) {
+                        nodesNodeList = list;
+                    }
+
                     // Calculating the age of the youngest node and putting it into the context.
                     long youngestNode = 0;
                     if (list.size() > 0) {
@@ -178,7 +184,8 @@
             w.close();
 
             // And add the feed.
-            fd.addFeed(feedName, feedType, newFeed);
+            fd.addCommentableFeed(feedName, feedType,
+                    new CommentableFeed(newFeed, nodesNodeList));
         } catch (Exception e) {
             log.error("Cannot merge template " + template + " for "
                     + feedName + ".", e);

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tag/TagFeedTagHandler.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tag/TagFeedTagHandler.java	2006-07-26 14:26:52 UTC (rev 5293)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tag/TagFeedTagHandler.java	2006-07-26 16:03:22 UTC (rev 5294)
@@ -41,7 +41,8 @@
         try {
             fd.addSpecialFeed(feedName, feedType,
                     (SpecialFeed) feedClass.getConstructor(String.class,
-                            String.class, Map.class, VelocityContext.class).newInstance(feedName,
+                            String.class, Map.class, VelocityContext.class).newInstance(
+                            feedName,
                             feedType, attributes, vc));
         } catch (Exception e) {
             return false;

Modified: labs/shotoku/trunk/shotoku-user/src/java/org/jboss/shotoku/user/UserService.java
===================================================================
--- labs/shotoku/trunk/shotoku-user/src/java/org/jboss/shotoku/user/UserService.java	2006-07-26 14:26:52 UTC (rev 5293)
+++ labs/shotoku/trunk/shotoku-user/src/java/org/jboss/shotoku/user/UserService.java	2006-07-26 16:03:22 UTC (rev 5294)
@@ -1,5 +1,6 @@
 package org.jboss.shotoku.user;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 
 /**
@@ -10,6 +11,7 @@
     public Group getGroup(String groupName) throws GroupNotFoundException;
     public List<User> getUsersInGroup(String groupName) throws GroupNotFoundException;
     public List<Group> getGroupsOfUser(String userName) throws UserNotFoundException;
+    public String getUserName(HttpServletRequest request);
 
     /*
      * SERVICE MANAGEMENT METHODS

Modified: labs/shotoku/trunk/shotoku-user/src/java/org/jboss/shotoku/user/service/UserServiceImpl.java
===================================================================
--- labs/shotoku/trunk/shotoku-user/src/java/org/jboss/shotoku/user/service/UserServiceImpl.java	2006-07-26 14:26:52 UTC (rev 5293)
+++ labs/shotoku/trunk/shotoku-user/src/java/org/jboss/shotoku/user/service/UserServiceImpl.java	2006-07-26 16:03:22 UTC (rev 5294)
@@ -32,6 +32,7 @@
 import org.apache.log4j.Logger;
 
 import javax.ejb.Local;
+import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 import java.util.ArrayList;
 
@@ -60,6 +61,10 @@
 
     public User getUser(String userName) throws UserNotFoundException {
         try {
+            if (userName == null) {
+                throw new UserNotFoundException("Null user name.");
+            }
+
             return new JBossPortalUser(um.findUserByUserName(userName));
         } catch (ModuleException e) {
             throw new UserNotFoundException(e);
@@ -68,6 +73,10 @@
 
     public Group getGroup(String groupName) throws GroupNotFoundException {
         try {
+            if (groupName == null) {
+                throw new GroupNotFoundException("Null group name.");
+            }
+
             return new JBossPortalGroup(rm.findRoleByName(groupName));
         } catch (ModuleException e) {
             throw new GroupNotFoundException(e);
@@ -106,6 +115,10 @@
         }
     }
 
+    public String getUserName(HttpServletRequest request) {
+        return null;
+    }
+
     /*
     * Service lifecycle management.
     */




More information about the jboss-svn-commits mailing list