[jboss-cvs] jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/ui ...
Christian Bauer
christian at hibernate.org
Mon Jan 14 00:10:49 EST 2008
User: cbauer
Date: 08/01/14 00:10:49
Modified: examples/wiki/src/main/org/jboss/seam/wiki/core/ui
FeedServlet.java
Log:
JBSEAM-2457 - Render "REST" feed/file download URLs, breaks all current feed/file bookmarks
Revision Changes Path
1.18 +75 -29 jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/ui/FeedServlet.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: FeedServlet.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/ui/FeedServlet.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -b -r1.17 -r1.18
--- FeedServlet.java 10 Jan 2008 08:37:46 -0000 1.17
+++ FeedServlet.java 14 Jan 2008 05:10:49 -0000 1.18
@@ -11,13 +11,15 @@
import org.jboss.seam.Component;
import org.jboss.seam.international.Messages;
import org.jboss.seam.wiki.core.feeds.FeedDAO;
-import org.jboss.seam.wiki.core.model.Feed;
-import org.jboss.seam.wiki.core.model.FeedEntry;
-import org.jboss.seam.wiki.core.model.WikiCommentFeedEntry;
+import org.jboss.seam.wiki.core.model.*;
import org.jboss.seam.wiki.core.action.Authenticator;
import org.jboss.seam.wiki.core.action.prefs.WikiPreferences;
+import org.jboss.seam.wiki.core.dao.WikiNodeDAO;
+import org.jboss.seam.wiki.core.dao.WikiNodeFactory;
import org.jboss.seam.wiki.util.WikiUtil;
import org.jboss.seam.wiki.preferences.Preferences;
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.logging.Log;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
@@ -41,14 +43,16 @@
*/
public class FeedServlet extends HttpServlet {
+ private static final Log log = LogFactory.getLog(FeedServlet.class);
+
public static enum Comments {
include, exclude, only
}
// Possible feed types
public enum SyndFeedType {
- ATOM("/atom.seam", "atom_1.0", "application/atom+xml"),
- RSS2("/rss.seam", "rss_2.0", "application/rss+xml");
+ ATOM("/atom.seam", "atom_1.0", "application/atom+xml");
+ // TODO: I don't think we'll ever do that: ,RSS2("/rss.seam", "rss_2.0", "application/rss+xml");
SyndFeedType(String pathInfo, String feedType, String contentType) {
this.pathInfo = pathInfo;
@@ -72,37 +76,39 @@
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
- String pathInfo = request.getPathInfo();
String feedIdParam = request.getParameter("feedId");
- String tagParam = request.getParameter("tag");
- String commentsParam = request.getParameter("comments");
+ String areaNameParam = request.getParameter("areaName");
+ String nodeNameParam = request.getParameter("nodeName");
+ log.debug("feed request id: '" + feedIdParam + "' area name: '" + areaNameParam + "' node name: '" + nodeNameParam + "'");
+
+ // Feed type
+ String pathInfo = request.getPathInfo();
+ log.debug("requested feed type: " + pathInfo);
+ if (!feedTypes.containsKey(pathInfo)) {
+ log.debug("can not render this feed type, returning BAD REQUEST");
+ response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Unsupported feed type " + pathInfo);
+ return;
+ }
+ SyndFeedType syndFeedType = feedTypes.get(pathInfo);
+ // Comments
+ String commentsParam = request.getParameter("comments");
Comments comments = Comments.include;
if (commentsParam != null) {
try {
comments = Comments.valueOf(commentsParam);
} catch (IllegalArgumentException ex) {}
}
+ log.debug("feed rendering handles comments: " + comments);
- try {
- Long.valueOf(feedIdParam);
- } catch (NumberFormatException ex) {
- response.sendError(HttpServletResponse.SC_NOT_FOUND, "Feed " + feedIdParam);
- return;
- }
-
- try {
- Long.valueOf(feedIdParam);
- } catch (NumberFormatException ex) {
- response.sendError(HttpServletResponse.SC_NOT_FOUND, "Feed " + feedIdParam);
- return;
+ // Tag
+ String tagParam = request.getParameter("tag");
+ String tag = null;
+ if (tagParam != null && tagParam.length() >0) {
+ log.debug("feed rendering restricts on tag: " + tagParam);
+ tag = tagParam;
}
-
- if (!feedTypes.containsKey(pathInfo)) return;
- SyndFeedType syndFeedType = feedTypes.get(pathInfo);
- if (feedIdParam == null) return;
-
// TODO: Seam should use its transaction interceptor for java beans: http://jira.jboss.com/jira/browse/JBSEAM-957
UserTransaction userTx = null;
boolean startedTx = false;
@@ -113,20 +119,59 @@
userTx.begin();
}
+ Feed feed = null;
+
+ // Find the feed, depending on variations of request parameters
+ if (feedIdParam != null && feedIdParam.length() >0) {
+ try {
+ log.debug("trying to retrieve feed for id: " + feedIdParam);
+ Long feedId = Long.valueOf(feedIdParam);
FeedDAO feedDAO = (FeedDAO)Component.getInstance(FeedDAO.class);
- Feed feed = feedDAO.findFeed(Long.valueOf(feedIdParam));
- if (feed == null) {
+ feed = feedDAO.findFeed(feedId);
+ } catch (NumberFormatException ex) {
+ log.debug("feed identifier couldn't be converted to java.lang.Long");
response.sendError(HttpServletResponse.SC_NOT_FOUND, "Feed " + feedIdParam);
+ }
+ } else if (areaNameParam != null && areaNameParam.matches("^[A-Z0-9]+.*")) {
+ log.debug("trying to retrieve area: " + areaNameParam);
+ WikiNodeDAO nodeDAO = (WikiNodeDAO)Component.getInstance(WikiNodeDAO.class);
+ WikiDirectory area = nodeDAO.findAreaUnrestricted(areaNameParam);
+ if (area != null && (nodeNameParam == null || !nodeNameParam.matches("^[A-Z0-9]+.*")) && area.getFeed() != null) {
+ log.debug("using feed of area, no node requested: " + area);
+ feed = area.getFeed();
+ } else if (area != null && nodeNameParam != null && nodeNameParam.matches("^[A-Z0-9]+.*")) {
+ log.debug("trying to retrieve node: " + nodeNameParam);
+ WikiDirectory nodeDir = nodeDAO.findWikiDirectoryInAreaUnrestricted(area.getAreaNumber(), nodeNameParam);
+ if (nodeDir != null && nodeDir.getFeed() != null) {
+ log.debug("using feed of node: " + nodeDir);
+ feed = nodeDir.getFeed();
+ } else {
+ log.debug("node not found or node has no feed");
+ }
+ } else {
+ log.debug("area not found or area has no feed");
+ }
+ } else {
+ log.debug("neither feed id nor area name requested, getting wikiRoot feed");
+ WikiNodeFactory factory = (WikiNodeFactory)Component.getInstance(WikiNodeFactory.class);
+ feed = factory.loadWikiRoot().getFeed();
+ }
+
+ if (feed == null) {
+ log.debug("feed not found, returning NOT FOUND");
+ response.sendError(HttpServletResponse.SC_NOT_FOUND, "Feed");
if (startedTx) userTx.commit();
return;
}
+ log.debug("checking permissions of feed: " + feed);
// Authenticate and authorize, first with current user (session) then with basic HTTP authentication
Integer currentAccessLevel = (Integer)Component.getInstance("currentAccessLevel");
if (feed.getReadAccessLevel() > currentAccessLevel) {
boolean loggedIn = ((Authenticator)Component.getInstance(Authenticator.class)).authenticateBasicHttp(request);
currentAccessLevel = (Integer)Component.getInstance("currentAccessLevel");
if (!loggedIn || feed.getReadAccessLevel() > currentAccessLevel) {
+ log.debug("requiring authentication, feed has higher access level than current");
response.setHeader("WWW-Authenticate", "Basic realm=\"" + feed.getTitle().replace("\"", "'") + "\"");
response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
if (startedTx) userTx.commit();
@@ -134,7 +179,8 @@
}
}
- SyndFeed syndFeed = createSyndFeed(request.getRequestURL().toString(), syndFeedType, feed, currentAccessLevel, tagParam, comments);
+ log.debug("finally rendering feed");
+ SyndFeed syndFeed = createSyndFeed(request.getRequestURL().toString(), syndFeedType, feed, currentAccessLevel, tag, comments);
// Write feed to output
response.setContentType(syndFeedType.contentType);
More information about the jboss-cvs-commits
mailing list