[jboss-svn-commits] JBL Code SVN: r5369 - in labs/shotoku/trunk: shotoku-base/src/java/org/jboss/shotoku/tools shotoku-feeds shotoku-feeds/src/java/org/jboss/shotoku/feeds shotoku-feeds/src/java/org/jboss/shotoku/feeds/data shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/model shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special shotoku-feeds/src/java/org/jboss/shotoku/feeds/service shotoku-feeds/src/java/org/jboss/shotoku/feeds/tag shotoku-feeds/src/java/org/jboss/shotoku/feeds/tools shotoku-feeds/src/java/org/jboss/shotoku/feeds/view shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/getter shotoku-feeds/src/web/WEB-INF

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Jul 31 17:06:37 EDT 2006


Author: adamw
Date: 2006-07-31 17:05:54 -0400 (Mon, 31 Jul 2006)
New Revision: 5369

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/ShotokuCommentableFeed.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/model/DummyFeedEntries.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/BasicBean.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/FeedBean.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/ViewConfigurationBean.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/getter/
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/getter/BlankFeedGetter.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/getter/StandardFeedGetter.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/getter/ViewFeedGetter.java
Removed:
   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/CommentsService.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/FeedFactory.java
   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/data/AtomFeed.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/InformaBasedFeed.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/RdfFeed.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/RomeBasedFeed.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/Rss2Feed.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/CommentFeed.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/ConcreteCommentFeed.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/ConcreteTagFeed.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/Rss2CommentFeed.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/Rss2TagFeed.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/TagFeed.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/service/CommentsServiceImpl.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/AggregatedFeedTagHandler.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tag/RemoteFeedTagHandler.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/tools/FeedsConstants.java
   labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tools/VelocityContextAttributes.java
   labs/shotoku/trunk/shotoku-feeds/src/web/WEB-INF/faces-config.xml
Log:
http://jira.jboss.org/jira/browse/JBSHOTOKU-36

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-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-base/src/java/org/jboss/shotoku/tools/Tools.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -141,28 +141,28 @@
     }
 
     /**
-	 * Reads all attributes of the given node and returns them as a map. Only
-	 * signle-value attributes are supported.
-	 * @param root Node from which to read the attributes.
-	 * @return A map holding all attributes of the given node.
-	 */
-	public static Map<String, String> getMapFromNodeAttributes(Node root) {
-		Map<String, String> properties = new HashMap<String, String>();
-		NamedNodeMap nnm = root.getAttributes();
+     * Reads all attributes of the given node and returns them as a map. Only
+     * signle-value attributes are supported.
+     * @param root Node from which to read the attributes.
+     * @return A map holding all attributes of the given node.
+     */
+    public static Map<String, String> getMapFromNodeAttributes(Node root) {
+        Map<String, String> properties = new HashMap<String, String>();
+        NamedNodeMap nnm = root.getAttributes();
 
-		if (nnm != null) {
-			Node n;
+        if (nnm != null) {
+            Node n;
 
-			for (int i=0; i<nnm.getLength(); i++) {
-				n = nnm.item(i);
-				if (n.getNodeType() == Node.ATTRIBUTE_NODE) {
-					properties.put(n.getNodeName(), Tools.unmarshallText(n));
-				}
-			}
-		}
+            for (int i=0; i<nnm.getLength(); i++) {
+                n = nnm.item(i);
+                if (n.getNodeType() == Node.ATTRIBUTE_NODE) {
+                    properties.put(n.getNodeName(), Tools.unmarshallText(n));
+                }
+            }
+        }
 
-		return properties;
-	}
+        return properties;
+    }
 
     /**
      * From the given string, removes unnecessary / in the middle and
@@ -332,6 +332,18 @@
     }
 
     /**
+     * Checks if the link is an outside link.
+     * @param link Link to check.
+     * @return True iff the given link is an outside link.
+     */
+    public static boolean isOutsideLink(String link) {
+        link = link.trim();
+        return link.startsWith("http:") || link.startsWith("ftp:")
+                || link.startsWith("https:") || link.startsWith("mailto:")
+                || link.startsWith("news:") || link.startsWith("file:");
+    }
+
+    /**
      * Transferes all bytes from the given input stream to the given output
      * stream.
      *
@@ -424,7 +436,7 @@
     public static String getFileString(File file) throws IOException {
         return Charset.forName(
                 System.getProperty("file.encoding")).decode(
-                        getFileBytes(file)).toString();
+                getFileBytes(file)).toString();
     }
 
     /**

Modified: labs/shotoku/trunk/shotoku-feeds/project.xml
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/project.xml	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/project.xml	2006-07-31 21:05:54 UTC (rev 5369)
@@ -93,6 +93,12 @@
             <artifactId>jboss-annotations-ejb3</artifactId>
             <jar>jboss-annotations-ejb3.jar</jar>
         </dependency>
+
+        <dependency>
+            <groupId>myfaces</groupId>
+            <artifactId>myfaces-all</artifactId>
+            <version>1.1.1</version>
+        </dependency>
     </dependencies>
 
     <build>

Modified: labs/shotoku/trunk/shotoku-feeds/shotoku-feeds.iml
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/shotoku-feeds.iml	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/shotoku-feeds.iml	2006-07-31 21:05:54 UTC (rev 5369)
@@ -17,6 +17,7 @@
     <orderEntry type="module" module-name="shotoku-tags" />
     <orderEntry type="library" name="junit" level="application" />
     <orderEntry type="module" module-name="shotoku-user" />
+    <orderEntry type="library" name="myfaces" level="application" />
     <orderEntryProperties />
   </component>
 </module>

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/CommentsService.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/CommentsService.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/CommentsService.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -18,7 +18,7 @@
             throws FeedDoesNotExistException, CommentsNotAvialableException,
             UnauthorizedToCommentException;
 
-    public String getCommentFeedLink(String feedId, String feedName,
+    public String getCommentFeedLink(String feedName,
                                      String feedElement, String feedType,
                                      String type);
 

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/FeedFactory.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/FeedFactory.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/FeedFactory.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -71,8 +71,8 @@
      * @param type Type of feed to create.
      * @return A new instance of a feed of the given type.
      */
-    public static NormalFeed getNewNormalFeed(String name, String displayName,
-                                              String type,
+    public static NormalFeed getNewNormalFeed(String id, String name,
+                                              String displayName, String type,
                                               Map<String, Object> attributes) {
         Class feedClass = feedClasses.get(type);
         if (feedClass == null) return null;
@@ -84,9 +84,9 @@
 
         try {
             File file = File.createTempFile("shotoku-feeds" + nextInt, type);
-            return (NormalFeed) feedClass.getConstructor(
+            return (NormalFeed) feedClass.getConstructor(String.class,
                     String.class, String.class, String.class, File.class,
-                    Map.class).newInstance(name, displayName, type, file,
+                    Map.class).newInstance(id, name, displayName, type, file,
                         attributes);
         } catch (Exception e) {
             return null;

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-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/FeedsDescriptor.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -111,18 +111,14 @@
                 ContentManager.getProperty(FeedsConstants.CONFIGID, ""),
                 ContentManager.getProperty(FeedsConstants.CONFIGDIR, ""));
 
-        // From the global Shotoku configuration, reading the config file
-        // location in Shotoku repositories.
-        Properties props = getProperties();
-
         // From attributes read from Shotoku, getting the content manager
         // configuration for this feeds id.
         ContentManager cm = ContentManager.getContentManager(
-                props.getProperty(id + FeedsConstants.FEEDID),
-                props.getProperty(id + FeedsConstants.FEEDDIR)
+                getProperty(FeedsConstants.FEEDID),
+                getProperty(FeedsConstants.FEEDDIR)
         );
 
-        vrm = new VariableResolverManager(id, props);
+        vrm = new VariableResolverManager(id, getProperties());
         feedTagHandlers = new HashMap<String, Map<String, FeedTagHandler>>();
 
         // Creating the maps that will hold the feeds.
@@ -153,10 +149,14 @@
         }
     }
 
-    public Properties getProperties() {
+    private Properties getProperties() {
         return fcw.get(confKey);
     }
 
+    public String getProperty(String name) {
+        return getProperties().getProperty(id + name);
+    }
+
     private void addFeedDefinitions(org.jboss.shotoku.Node node) throws SAXException, IOException {
         DOMParser parser = new DOMParser();
         // Parse the descriptor at the given Shotoku node.

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-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/FeedsService.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -8,6 +8,7 @@
  * @author Adam Warski (adamw at aster.pl)
  */
 public interface FeedsService extends AdministratedService {
+    public String getProperty(String id, String name);
     public Feed getFeed(String id, String name, String type);
     public CommentableFeed getCommentableFeed(String id, String name,
                                               String type);

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/AtomFeed.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/AtomFeed.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/AtomFeed.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -28,9 +28,10 @@
 import org.jboss.shotoku.feeds.tools.FeedsConstants;
 
 public class AtomFeed extends RomeBasedFeed {
-    public AtomFeed(String name, String displayName, String type, File file,
+    public AtomFeed(String id, String name, String displayName, String type,
+                    File file,
                     Map<String, Object> attributes) {
-        super(name, displayName, type, file, attributes);
+        super(id, name, displayName, type, file, attributes);
     }
 
     @Override

Deleted: 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-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/CommentableFeed.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -1,125 +0,0 @@
-package org.jboss.shotoku.feeds.data;
-
-import org.jboss.shotoku.NodeList;
-import org.jboss.shotoku.Node;
-import org.jboss.shotoku.feeds.data.model.FeedEntries;
-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();
-    }
-
-    public FeedEntries getFeedEntries() {
-        return nf.getFeedEntries();
-    }
-}

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-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/CommentableFeed.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -0,0 +1,21 @@
+package org.jboss.shotoku.feeds.data;
+
+import org.jboss.shotoku.feeds.comments.UnauthorizedToCommentException;
+import org.jboss.shotoku.feeds.comments.CommentsNotAvialableException;
+import org.jboss.shotoku.feeds.comments.FeedDoesNotExistException;
+
+import java.util.List;
+
+/**
+ * @author Adam Warski (adamw at aster.pl)
+ */
+public interface CommentableFeed extends NormalFeed {
+    public boolean getCommentsEnabled();
+    public boolean getCommentsModerated();
+    public List<String> getGroupsAllowedToModerateComments();
+    public boolean getFeedElementExists(String feedElement);
+    public void addComment(String feedElement, String username, String title,
+                           String content, String userIp)
+            throws UnauthorizedToCommentException,
+            CommentsNotAvialableException, FeedDoesNotExistException;
+}

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-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/Feed.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -46,6 +46,13 @@
      */
     public String getType();
     /**
+     * Gets the id of the feed configuration group in which this feed
+     * was defined.
+     * @return Id of the feed configuration group to which this feed
+     * belongs.
+     */
+    public String getId();
+    /**
      * Called when this feed is no longer needed, so that any resources can
      * be released (like temporary files).
      */

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-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/FileBasedFeed.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -41,14 +41,16 @@
 import javax.servlet.http.HttpServletRequest;
 
 public abstract class FileBasedFeed implements NormalFeed {
+    private String id;
     private File file;
     private String name;
     private String displayName;
     private String type;
     private Map<String, Object> attributes;
 
-    public FileBasedFeed(String name, String displayName, String type,
-                         File file, Map<String, Object> attributes) {
+    public FileBasedFeed(String id, String name, String displayName,
+                         String type, File file, Map<String, Object> attributes) {
+        this.id = id;
         this.name = name;
         this.displayName = displayName;
         this.type = type;
@@ -137,6 +139,10 @@
         return type;
     }
 
+    public String getId() {
+        return id;
+    }
+
     public void release() {
         file.delete();
     }

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/InformaBasedFeed.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/InformaBasedFeed.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/InformaBasedFeed.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -16,9 +16,10 @@
 import org.jboss.shotoku.feeds.data.model.FeedEntry;
 
 public abstract class InformaBasedFeed extends FileBasedFeed {
-    public InformaBasedFeed(String name, String displayName, String type,
-                            File file, Map<String, Object> attributes) {
-        super(name, displayName, type, file, attributes);
+    public InformaBasedFeed(String id, String name, String displayName,
+                            String type, File file,
+                            Map<String, Object> attributes) {
+        super(id, name, displayName, type, file, attributes);
     }
 
     protected abstract ChannelExporterIF getExporter() throws IOException;

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/RdfFeed.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/RdfFeed.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/RdfFeed.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -30,9 +30,9 @@
 import org.jboss.shotoku.feeds.tools.FeedsConstants;
 
 public class RdfFeed extends InformaBasedFeed {
-    public RdfFeed(String name, String displayName, String type, File file,
+    public RdfFeed(String id, String name, String displayName, String type, File file,
                    Map<String, Object> attributes) {
-        super(name, displayName, type, file, attributes);
+        super(id, name, displayName, type, file, attributes);
     }
 
     protected ChannelExporterIF getExporter() throws IOException {

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/RomeBasedFeed.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/RomeBasedFeed.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/RomeBasedFeed.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -37,9 +37,10 @@
 import org.jboss.shotoku.feeds.rome.CommentRssModule;
 
 public abstract class RomeBasedFeed extends FileBasedFeed {
-    public RomeBasedFeed(String name, String displayName, String type,
-                         File file, Map<String, Object> attributes){
-        super(name, displayName, type, file, attributes);
+    public RomeBasedFeed(String id, String name, String displayName,
+                         String type, File file,
+                         Map<String, Object> attributes){
+        super(id, name, displayName, type, file, attributes);
     }
 
     protected abstract void setFeedType(SyndFeed feed);

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/Rss2Feed.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/Rss2Feed.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/Rss2Feed.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -28,9 +28,9 @@
 import org.jboss.shotoku.feeds.tools.FeedsConstants;
 
 public class Rss2Feed extends RomeBasedFeed {
-    public Rss2Feed(String name, String displayName, String type,
+    public Rss2Feed(String id, String name, String displayName, String type,
                     File file, Map<String, Object> attributes) {
-        super(name, displayName, type, file, attributes);
+        super(id, name, displayName, type, file, attributes);
     }
 
     @Override

Copied: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/ShotokuCommentableFeed.java (from rev 5347, 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-28 20:45:47 UTC (rev 5347)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/ShotokuCommentableFeed.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -0,0 +1,159 @@
+package org.jboss.shotoku.feeds.data;
+
+import org.jboss.shotoku.NodeList;
+import org.jboss.shotoku.Node;
+import org.jboss.shotoku.feeds.data.model.FeedEntries;
+import org.jboss.shotoku.feeds.tools.FeedsTools;
+import org.jboss.shotoku.feeds.comments.UnauthorizedToCommentException;
+import org.jboss.shotoku.feeds.comments.CommentsNotAvialableException;
+import org.jboss.shotoku.feeds.comments.FeedDoesNotExistException;
+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 ShotokuCommentableFeed implements CommentableFeed {
+    private NormalFeed nf;
+
+    private boolean commentsEnabled;
+    private List<String> groupsAllowedToModerate;
+    private boolean commentsModerated;
+    private NodeList feedElements;
+
+    public ShotokuCommentableFeed(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 boolean getFeedElementExists(String feedElement) {
+        return getNodeForFeedElement(feedElement) != null;
+    }
+
+    public Node getNodeForFeedElement(String feedElement) {
+        String path = Tools.normalizeSlashes(feedElement, false);
+        for (Node n : feedElements) {
+            if (n.getFullName().equals(path)) {
+                return n;
+            }
+        }
+
+        return null;
+    }
+
+    public void addComment(String feedElement, String username, String title,
+                           String content, String userIp)
+            throws UnauthorizedToCommentException,
+            CommentsNotAvialableException, FeedDoesNotExistException {
+        // It may be possible that the feed element is a full URL,
+        // so we have to cut off the unnecessary part.
+        if (Tools.isOutsideLink(feedElement)) {
+            try {
+                int i = feedElement.indexOf(':');
+                feedElement = feedElement.substring(i+3);
+                i = feedElement.indexOf('/');
+                feedElement = feedElement.substring(i+1);
+            } catch (IndexOutOfBoundsException e) {
+                throw new FeedDoesNotExistException("Invalid feed element.");
+            }
+        }
+
+        FeedsTools.getCommentsService().addComment(nf.getId(),
+                nf.getName(), feedElement, nf.getType(), username,
+                title, content, userIp);
+    }
+
+    /*
+     * 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();
+    }
+
+    public FeedEntries getFeedEntries() {
+        return nf.getFeedEntries();
+    }
+
+    public String getId() {
+        return nf.getId();
+    }
+}

Added: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/model/DummyFeedEntries.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/model/DummyFeedEntries.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/model/DummyFeedEntries.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -0,0 +1,14 @@
+package org.jboss.shotoku.feeds.data.model;
+
+import java.util.Date;
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * @author Adam Warski (adamw at aster.pl)
+ */
+public class DummyFeedEntries extends FeedEntries {
+    public DummyFeedEntries() {
+        super("", "", "", null, "", new ArrayList<FeedEntry>());
+    }
+}

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/CommentFeed.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/CommentFeed.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/CommentFeed.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -2,9 +2,9 @@
 
 import org.apache.velocity.VelocityContext;
 import org.jboss.shotoku.ContentManager;
-import org.jboss.shotoku.Node;
 import org.jboss.shotoku.NodeList;
 import org.jboss.shotoku.Directory;
+import org.jboss.shotoku.Node;
 import org.jboss.shotoku.search.Search;
 import org.jboss.shotoku.search.DirectoryIncludeParameter;
 import org.jboss.shotoku.search.DateSortParameter;
@@ -12,6 +12,7 @@
 import org.jboss.shotoku.exceptions.ResourceDoesNotExist;
 import org.jboss.shotoku.feeds.data.Feed;
 import org.jboss.shotoku.feeds.data.CommentableFeed;
+import org.jboss.shotoku.feeds.data.ShotokuCommentableFeed;
 import org.jboss.shotoku.feeds.data.model.FeedEntries;
 import org.jboss.shotoku.feeds.tools.FeedsTools;
 import org.jboss.shotoku.feeds.tools.NodesFeedsProperties;
@@ -31,6 +32,7 @@
  * @author Adam Warski (adamw at aster.pl)
  */
 public abstract class CommentFeed implements SpecialFeed {
+    private String id;
     private String name;
     private String type;
     Map<String, Object> attributes;
@@ -39,8 +41,9 @@
     private int nameLength;
     private ContentManager cm;
 
-    public CommentFeed(String name, String type,
+    public CommentFeed(String id, String name, String type,
                        Map<String, Object> attributes, VelocityContext vc) {
+        this.id = id;
         this.name = name;
         this.type = type;
         this.attributes = attributes;
@@ -71,22 +74,24 @@
         check(fullName.length() >= nameLength+1);
 
         String info = fullName.substring(nameLength+1);
-        String[] infoTokens = info.split("[/]");
-        check(infoTokens.length == 4);
 
-        String feedId = Tools.decodeURL(infoTokens[0]);
-        String feedName = Tools.decodeURL(infoTokens[1]);
-        String feedElement = Tools.decodeURL(infoTokens[2]);
-        String feedType = Tools.decodeURL(infoTokens[3]);
+        int lastSlash = info.lastIndexOf('/');
+        check(lastSlash != -1);
+        String feedName = info.substring(0, lastSlash);
+        String feedElement = info.substring(lastSlash+1);
 
         CommentableFeed feed = FeedsTools.getService().getCommentableFeed(
-                feedId, feedName, feedType);
+                id, feedName, type);
 
         check(feed != null);
         //noinspection ConstantConditions
         check(feed.getCommentsEnabled());
+        check(feed instanceof ShotokuCommentableFeed);
 
-        Node commentedNode = feed.getNodeForFeedElement(feedElement);
+        //noinspection ConstantConditions
+        ShotokuCommentableFeed scf = (ShotokuCommentableFeed) feed;
+        Node commentedNode = scf.getNodeForFeedElement(feedElement);
+
         check(commentedNode != null);
 
         NodeList comments;
@@ -177,4 +182,8 @@
     public FeedEntries getFeedEntries() {
         throw new RuntimeException("Can't get entries of a special feed");
     }
+
+    public String getId() {
+        return id;
+    }
 }

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/ConcreteCommentFeed.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/ConcreteCommentFeed.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/ConcreteCommentFeed.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -54,4 +54,8 @@
     public FeedEntries getFeedEntries() {
         return commentFeed.getFeedEntries();
     }
+
+    public String getId() {
+        return commentFeed.getId();
+    }
 }

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/ConcreteTagFeed.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/ConcreteTagFeed.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/ConcreteTagFeed.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -54,4 +54,8 @@
     public FeedEntries getFeedEntries() {
         return tagFeed.getFeedEntries();
     }
+
+    public String getId() {
+        return tagFeed.getId();
+    }
 }

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/Rss2CommentFeed.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/Rss2CommentFeed.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/Rss2CommentFeed.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -9,9 +9,9 @@
  * @author Adam Warski (adamw at aster.pl)
  */
 public class Rss2CommentFeed extends CommentFeed {
-    public Rss2CommentFeed(String name, String type,
+    public Rss2CommentFeed(String id, String name, String type,
                            Map<String, Object> attributes, VelocityContext vc) {
-        super(name, type, attributes, vc);
+        super(id, name, type, attributes, vc);
     }
 
     public String getContentType() {

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/Rss2TagFeed.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/Rss2TagFeed.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/Rss2TagFeed.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -1,7 +1,6 @@
 package org.jboss.shotoku.feeds.data.special;
 
 import org.jboss.shotoku.feeds.tools.FeedsConstants;
-import org.jboss.shotoku.feeds.data.special.TagFeed;
 import org.apache.velocity.VelocityContext;
 
 import java.util.Map;
@@ -10,9 +9,9 @@
  * @author Adam Warski (adamw at aster.pl)
  */
 public class Rss2TagFeed extends TagFeed {
-    public Rss2TagFeed(String name, String type,
+    public Rss2TagFeed(String id, String name, String type,
                        Map<String, Object> attributes, VelocityContext vc) {
-        super(name, type, attributes, vc);
+        super(id, name, type, attributes, vc);
     }
 
     public String getContentType() {

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/TagFeed.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/TagFeed.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/data/special/TagFeed.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -26,6 +26,7 @@
  * @author Adam Warski (adamw at aster.pl)
  */
 public abstract class TagFeed implements SpecialFeed {
+    private String id;
     private String name;
     private String type;
     Map<String, Object> attributes;
@@ -35,8 +36,9 @@
     private int nameLength;
     private ContentManager cm;
 
-    public TagFeed(String name, String type,
+    public TagFeed(String id, String name, String type,
                    Map<String, Object> attributes, VelocityContext vc) {
+        this.id = id;
         this.name = name;
         this.type = type;
         this.attributes = attributes;
@@ -233,4 +235,8 @@
     public FeedEntries getFeedEntries() {
         throw new RuntimeException("Can't get entries of a special feed");
     }
+
+    public String getId() {
+        return id;
+    }
 }

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/service/CommentsServiceImpl.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/service/CommentsServiceImpl.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/service/CommentsServiceImpl.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -12,6 +12,7 @@
 import org.jboss.shotoku.feeds.comments.UnauthorizedToCommentException;
 import org.jboss.shotoku.feeds.comments.CommentEntity;
 import org.jboss.shotoku.feeds.data.CommentableFeed;
+import org.jboss.shotoku.feeds.data.ShotokuCommentableFeed;
 import org.jboss.shotoku.user.tools.UserConstants;
 import org.jboss.shotoku.user.UserNotFoundException;
 import org.jboss.shotoku.tools.Constants;
@@ -91,9 +92,7 @@
         }
 
         // Checking if the commented item exists in the content manager.
-        Node commentedElement = feed.getNodeForFeedElement(feedElement);
-
-        if (commentedElement == null) {
+        if (!feed.getFeedElementExists(feedElement)) {
             throw new FeedDoesNotExistException("Invalid feed element.");
         }
 
@@ -107,14 +106,11 @@
         }
     }
 
-    public String getCommentFeedLink(String feedId, String feedName,
+    public String getCommentFeedLink(String feedName,
                                      String feedElement, String feedType,
                                      String type) {
-        return "/feeds/comment/" +
-                Tools.encodeURL(feedId) + "/" +
-                Tools.encodeURL(feedName) + "/" +
-                Tools.encodeURL(feedElement) + "/" +
-                Tools.encodeURL(feedType) + "/" + type;
+        return "/feeds/comments/" + feedName + "/" +
+                Tools.encodeURL(feedElement) + "/" + type;
     }
 
     private String getCommentsDirectoryName(Node commentedNode) {
@@ -193,12 +189,15 @@
                                     ce.getFeedName(), ce.getFeedType());
 
                     // Checking if the feed exists.
-                    if (feed == null || !feed.getCommentsEnabled()) {
+                    if (feed == null || !feed.getCommentsEnabled() ||
+                            !(feed instanceof ShotokuCommentableFeed)) {
                         failedComments.add(ce);
                         continue;
                     }
 
-                    Node commentedElement = feed.getNodeForFeedElement(
+                    ShotokuCommentableFeed scf = (ShotokuCommentableFeed) feed;
+
+                    Node commentedElement = scf.getNodeForFeedElement(
                             ce.getFeedElement());
 
                     // Checking if the commented element exists.

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-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/service/FeedsServiceImpl.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -52,6 +52,10 @@
         return fds.get(id);
     }
 
+    public String getProperty(String id, String name) {
+        return getFeedsDescriptor(id).getProperty(name);
+    }
+
     public Feed getFeed(String id, String name, String type) {
         return getFeedsDescriptor(id).getFeed(name, type);
     }

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tag/AggregatedFeedTagHandler.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tag/AggregatedFeedTagHandler.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tag/AggregatedFeedTagHandler.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -75,7 +75,7 @@
             return false;
         }
 
-        NormalFeed feed = FeedFactory.getNewNormalFeed(feedName,
+        NormalFeed feed = FeedFactory.getNewNormalFeed(fd.getId(), feedName,
                 Tools.toString(attributes.get(FeedDefAttributes.DISP_NAME)),
                 feedType, attributes);
 

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tag/RemoteFeedTagHandler.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tag/RemoteFeedTagHandler.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tag/RemoteFeedTagHandler.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -30,8 +30,8 @@
                 FeedDefAttributes.DISP_NAME));
 
         try {
-            NormalFeed feed = FeedFactory.getNewNormalFeed(feedName,
-                    displayName, feedType, getAttributes());
+            NormalFeed feed = FeedFactory.getNewNormalFeed(fd.getId(), 
+                    feedName, displayName, feedType, getAttributes());
             feed.generate(new URL(address));
             fd.addFeed(feedName, feedType, feed);
         } catch (Exception e) {

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-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tag/ShotokuFeedTagHandler.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -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.ShotokuCommentableFeed;
 import org.jboss.shotoku.feeds.data.CommentableFeed;
 import org.jboss.shotoku.feeds.FeedFactory;
 import org.jboss.shotoku.feeds.FeedsDescriptor;
@@ -172,17 +173,16 @@
 
         String feedName = getFeedName();
         String feedType = getFeedType();
-        NormalFeed newFeed = FeedFactory.getNewNormalFeed(feedName,
+        NormalFeed newFeed = FeedFactory.getNewNormalFeed(fd.getId(), feedName,
                 displayName, feedType, attributes);
         try {
             vc.put(VelocityContextAttributes.LINK,
                     generateFeedLink(fd, true, feedName, feedType));
 
-            CommentableFeed cf = new CommentableFeed(newFeed, nodesNodeList);
+            CommentableFeed cf =
+                    new ShotokuCommentableFeed(newFeed, nodesNodeList);
 
             if (cf.getCommentsEnabled()) {
-                vc.put(VelocityContextAttributes.FEED_ID, fd.getId());
-                vc.put(VelocityContextAttributes.FEED_TYPE, getFeedType());
                 vc.put(VelocityContextAttributes.COMMENTS_SERVICE,
                         FeedsTools.getCommentsService());
             }

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tools/FeedsConstants.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tools/FeedsConstants.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tools/FeedsConstants.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -56,6 +56,11 @@
      */
     public static final String PROPERTY_INTERVAL = Constants.PROPERTIES_INTERNAL + ".feeds.service.interval";
 
+    /**
+     * Property name suffix, under which the fully qualified class name of a
+     * ViewFeedGetter implementation to use can be found.
+     */
+    public static final String VIEW_FEED_GETTER = ".view.getter";
 
     /*
      * Property name suffixes, under which content manager id and name

Modified: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tools/VelocityContextAttributes.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tools/VelocityContextAttributes.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/tools/VelocityContextAttributes.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -24,12 +24,12 @@
     /**
      * Generated feed id (id of feeds configuration).
      */
-    public static final String FEED_ID  = "feedId";
+    //public static final String FEED_ID  = "feedId";
 
     /**
      * Generated feed type.
      */
-    public static final String FEED_TYPE = "feedType";
+    //public static final String FEED_TYPE = "feedType";
 
     /**
      * Author of a feed.

Added: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/BasicBean.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/BasicBean.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/BasicBean.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -0,0 +1,14 @@
+package org.jboss.shotoku.feeds.view;
+
+import javax.faces.context.FacesContext;
+import javax.faces.application.FacesMessage;
+
+/**
+ * @author Adam Warski (adamw at aster.pl)
+ */
+public abstract class BasicBean {
+    protected void addMessage(String msg) {
+        FacesContext.getCurrentInstance().addMessage(null,
+                new FacesMessage(msg));
+    }
+}

Added: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/FeedBean.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/FeedBean.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/FeedBean.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -0,0 +1,126 @@
+package org.jboss.shotoku.feeds.view;
+
+import org.jboss.shotoku.feeds.data.Feed;
+import org.jboss.shotoku.feeds.data.CommentableFeed;
+import org.jboss.shotoku.feeds.data.model.FeedEntries;
+import org.jboss.shotoku.feeds.data.model.DummyFeedEntries;
+import org.jboss.shotoku.feeds.data.model.FeedEntry;
+import org.jboss.shotoku.feeds.tools.FeedsTools;
+
+import java.util.List;
+import java.util.Date;
+
+/**
+ * @author Adam Warski (adamw at aster.pl)
+ */
+public class FeedBean extends BasicBean {
+    private ViewConfigurationBean vcb;
+    private String name;
+    private String type;
+    private String entry;
+    private int from;
+
+    private void setFeedData() {
+        String fgName = vcb.getFeedGetter().getName();
+        if (fgName != null) { setName(fgName); }
+
+        String fgType = vcb.getFeedGetter().getType();
+        if (fgType != null) { setType(fgType); }
+
+        String fgEntry = vcb.getFeedGetter().getEntry();
+        if (fgEntry != null) { setEntry(fgEntry); }
+
+        Integer fgFrom = vcb.getFeedGetter().getFrom();
+        if (fgFrom != null) { setFrom(fgFrom); }
+    }
+
+    private Feed getFeed() {
+        setFeedData();
+        return FeedsTools.getService().getFeed(vcb.getFeedId(),
+                getName(), getType());
+    }
+
+    private CommentableFeed getCommentableFeed() {
+        setFeedData();
+        return FeedsTools.getService().getCommentableFeed(vcb.getFeedId(),
+                getName(), getType());
+    }
+
+    private FeedEntries getFeedEntries() {
+        Feed feed = getFeed();
+        if (feed == null) {
+            addMessage("The requested feed does not exist.");
+            return new DummyFeedEntries();
+        }
+
+        return feed.getFeedEntries();
+    }
+
+    public List<FeedEntry> getEntries() {
+        return getFeedEntries().getEntries();
+    }
+
+    public String getTitle() {
+        return getFeedEntries().getTitle();
+    }
+
+    public String getAuthor() {
+        return getFeedEntries().getAuthor();
+    }
+
+    public String getDescription() {
+        return getFeedEntries().getDescription();
+    }
+
+    public String getLink() {
+        return getFeedEntries().getLink();
+    }
+
+    public Date getCreated() {
+        return getFeedEntries().getCreated();
+    }
+
+    /*
+    * Getters and setters.
+    */
+
+    public ViewConfigurationBean getConfiguration() {
+        return vcb;
+    }
+
+    public void setConfiguration(ViewConfigurationBean vcb) {
+        this.vcb = vcb;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getEntry() {
+        return entry;
+    }
+
+    public void setEntry(String entry) {
+        this.entry = entry;
+    }
+
+    public int getFrom() {
+        return from;
+    }
+
+    public void setFrom(int from) {
+        this.from = from;
+    }
+}

Added: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/ViewConfigurationBean.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/ViewConfigurationBean.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/ViewConfigurationBean.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -0,0 +1,37 @@
+package org.jboss.shotoku.feeds.view;
+
+import org.jboss.shotoku.feeds.tools.FeedsConstants;
+import org.jboss.shotoku.feeds.tools.FeedsTools;
+import org.jboss.shotoku.feeds.FeedsDescriptor;
+import org.jboss.shotoku.feeds.view.getter.BlankFeedGetter;
+import org.jboss.shotoku.feeds.view.getter.ViewFeedGetter;
+import org.apache.log4j.Logger;
+
+/**
+ * @author Adam Warski (adamw at aster.pl)
+ */
+public class ViewConfigurationBean {
+    private static final Logger log = Logger.getLogger(FeedsDescriptor.class);
+
+    private ViewFeedGetter vfg;
+
+    public String getFeedId() {
+        return "default";
+    }
+
+    public ViewFeedGetter getFeedGetter() {
+        if (vfg == null) {
+            try {
+                vfg = (ViewFeedGetter) Class.forName(FeedsTools.getService().
+                        getProperty(getFeedId(),
+                        FeedsConstants.VIEW_FEED_GETTER
+                )).newInstance();
+            } catch (Exception e) {
+                log.error("View feed getter class not found.", e);
+                vfg = new BlankFeedGetter();
+            }
+        }
+
+        return vfg;
+    }
+}

Added: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/getter/BlankFeedGetter.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/getter/BlankFeedGetter.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/getter/BlankFeedGetter.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -0,0 +1,22 @@
+package org.jboss.shotoku.feeds.view.getter;
+
+/**
+ * @author Adam Warski (adamw at aster.pl)
+ */
+public class BlankFeedGetter implements ViewFeedGetter {
+    public String getName() {
+        return null;
+    }
+
+    public String getType() {
+        return null;
+    }
+
+    public String getEntry() {
+        return null;
+    }
+
+    public Integer getFrom() {
+        return 0;
+    }
+}

Added: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/getter/StandardFeedGetter.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/getter/StandardFeedGetter.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/getter/StandardFeedGetter.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -0,0 +1,35 @@
+package org.jboss.shotoku.feeds.view.getter;
+
+import javax.faces.context.FacesContext;
+import java.util.Map;
+
+/**
+ * @author Adam Warski (adamw at aster.pl)
+ */
+public class StandardFeedGetter implements ViewFeedGetter {
+    private Map<String, String> getParameters() {
+        //noinspection unchecked
+        return FacesContext.getCurrentInstance().
+                getExternalContext().getRequestParameterMap();
+    }
+
+    public String getName() {
+         return getParameters().get("name");
+    }
+
+    public String getType() {
+         return getParameters().get("type");
+    }
+
+    public String getEntry() {
+        return getParameters().get("entry");
+    }
+
+    public Integer getFrom() {
+        try {
+            return Integer.parseInt(getParameters().get("from"));
+        } catch (NumberFormatException e) {
+            return null;
+        }
+    }
+}

Added: labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/getter/ViewFeedGetter.java
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/getter/ViewFeedGetter.java	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/java/org/jboss/shotoku/feeds/view/getter/ViewFeedGetter.java	2006-07-31 21:05:54 UTC (rev 5369)
@@ -0,0 +1,11 @@
+package org.jboss.shotoku.feeds.view.getter;
+
+/**
+ * @author Adam Warski (adamw at aster.pl)
+ */
+public interface ViewFeedGetter {
+    public String getName();
+    public String getType();
+    public String getEntry();
+    public Integer getFrom();
+}

Modified: labs/shotoku/trunk/shotoku-feeds/src/web/WEB-INF/faces-config.xml
===================================================================
--- labs/shotoku/trunk/shotoku-feeds/src/web/WEB-INF/faces-config.xml	2006-07-31 21:00:05 UTC (rev 5368)
+++ labs/shotoku/trunk/shotoku-feeds/src/web/WEB-INF/faces-config.xml	2006-07-31 21:05:54 UTC (rev 5369)
@@ -40,7 +40,23 @@
 			<to-view-id>/repo-access/shotoku-test/blog/main3.jsp</to-view-id>
 		</navigation-case>
     </navigation-rule>
-    
+
+    <managed-bean>
+		<managed-bean-name>configuration</managed-bean-name>
+		<managed-bean-class>org.jboss.shotoku.feeds.view.ViewConfigurationBean</managed-bean-class>
+		<managed-bean-scope>application</managed-bean-scope>
+	</managed-bean>
+
+    <managed-bean>
+		<managed-bean-name>feed</managed-bean-name>
+		<managed-bean-class>org.jboss.shotoku.feeds.view.FeedBean</managed-bean-class>
+		<managed-bean-scope>session</managed-bean-scope>
+		<managed-property>
+			<property-name>configuration</property-name>
+			<value>#{configuration}</value>
+		</managed-property>
+	</managed-bean>
+
     <!--<navigation-rule>
 		<from-view-id>/repo-access/default/contributor/contributor.jsp</from-view-id>
 		<navigation-case>




More information about the jboss-svn-commits mailing list