You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@roller.apache.org by sn...@apache.org on 2005/06/08 18:06:46 UTC

svn commit: r189602 [23/50] - in /incubator/roller/trunk: ./ contrib/ contrib/lib/ contrib/plugins/ contrib/plugins/src/ contrib/plugins/src/org/ contrib/plugins/src/org/roller/ contrib/plugins/src/org/roller/presentation/ contrib/plugins/src/org/roller/presentation/velocity/ contrib/plugins/src/org/roller/presentation/velocity/plugins/ contrib/plugins/src/org/roller/presentation/velocity/plugins/acronyms/ contrib/plugins/src/org/roller/presentation/velocity/plugins/bookmarks/ contrib/plugins/src/org/roller/presentation/velocity/plugins/email/ contrib/plugins/src/org/roller/presentation/velocity/plugins/jspwiki/ contrib/plugins/src/org/roller/presentation/velocity/plugins/radeox/ contrib/plugins/src/org/roller/presentation/velocity/plugins/readmore/ contrib/plugins/src/org/roller/presentation/velocity/plugins/smileys/ contrib/plugins/src/org/roller/presentation/velocity/plugins/textile/ docs/ docs/images/ docs/installguide/ docs/installguide/old/ docs/userguide/ docs/userguide/images/ docs/userguide/old/ metadata/ metadata/database/ metadata/database/hibernate/ metadata/xdoclet/ personal/ personal/eclipse/ personal/testing/ src/ src/org/ src/org/roller/ src/org/roller/business/ src/org/roller/business/hibernate/ src/org/roller/business/utils/ src/org/roller/model/ src/org/roller/pojos/ src/org/roller/presentation/ src/org/roller/presentation/atom/ src/org/roller/presentation/bookmarks/ src/org/roller/presentation/bookmarks/actions/ src/org/roller/presentation/bookmarks/formbeans/ src/org/roller/presentation/bookmarks/tags/ src/org/roller/presentation/filters/ src/org/roller/presentation/forms/ src/org/roller/presentation/newsfeeds/ src/org/roller/presentation/pagecache/ src/org/roller/presentation/pagecache/rollercache/ src/org/roller/presentation/tags/ src/org/roller/presentation/tags/calendar/ src/org/roller/presentation/tags/menu/ src/org/roller/presentation/velocity/ src/org/roller/presentation/weblog/ src/org/roller/presentation/weblog/actions/ src/org/roller/presentation/weblog/formbeans/ src/org/roller/presentation/weblog/search/ src/org/roller/presentation/weblog/search/operations/ src/org/roller/presentation/weblog/tags/ src/org/roller/presentation/website/ src/org/roller/presentation/website/actions/ src/org/roller/presentation/website/formbeans/ src/org/roller/presentation/website/tags/ src/org/roller/presentation/xmlrpc/ src/org/roller/util/ tests/ tests/org/ tests/org/roller/ tests/org/roller/business/ tests/org/roller/model/ tests/org/roller/persistence/ tests/org/roller/presentation/ tests/org/roller/presentation/atom/ tests/org/roller/presentation/bookmarks/ tests/org/roller/presentation/velocity/ tests/org/roller/presentation/velocity/plugins/ tests/org/roller/presentation/velocity/plugins/smileys/ tests/org/roller/presentation/velocity/plugins/textile/ tests/org/roller/presentation/xmlrpc/ tests/org/roller/util/ tools/ tools/buildtime/ tools/buildtime/mockrunner-0.2.6/ tools/buildtime/mockrunner-0.2.6/lib/ tools/buildtime/tomcat-4.1.24/ tools/buildtime/xdoclet-1.2/ tools/buildtime/xdoclet-1.2/lib/ tools/hibernate-2.1/ tools/hibernate-2.1/lib/ tools/lib/ tools/standard-1.0.3/ tools/standard-1.0.3/lib/ tools/standard-1.0.3/tld/ tools/struts-1.1/ tools/struts-1.1/lib/ web/ web/WEB-INF/ web/WEB-INF/classes/ web/WEB-INF/classes/flavors/ web/WEB-INF/classes/themes/ web/bookmarks/ web/images/ web/images/editor/ web/images/midas/ web/images/preview/ web/images/smileys/ web/tags/ web/templates/ web/theme/ web/theme/images/ web/theme/lavender/ web/theme/scripts/ web/theme/scripts/classes/ web/themes/ web/themes/basic/ web/themes/berkley/ web/themes/berkley/images/ web/themes/cheb/ web/themes/cheb/images/ web/themes/cheb/scripts/ web/themes/clean/ web/themes/currency-i18n/ web/themes/currency-i18n/images/ web/themes/currency/ web/themes/currency/images/ web/themes/grey2/ web/themes/moonshine/ web/themes/pacifica/ web/themes/robot/ web/themes/rolling/ web/themes/rolling/images/ web/themes/sotto/ web/themes/sotto/images/ web/themes/sotto/styles/ web/themes/sunsets/ web/themes/sunsets/images/ web/themes/sunsets/scripts/ web/themes/sunsets/styles/ web/themes/werner/ web/themes/x2/ web/themes/x2/images/ web/themes/x2/scripts/ web/themes/x2/styles/ web/weblog/ web/website/

Added: incubator/roller/trunk/src/org/roller/presentation/weblog/TrackbackServlet.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/weblog/TrackbackServlet.java?rev=189602&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/weblog/TrackbackServlet.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/weblog/TrackbackServlet.java Wed Jun  8 09:06:16 2005
@@ -0,0 +1,164 @@
+/*
+ * Created on Apr 13, 2003
+ */
+package org.roller.presentation.weblog;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.roller.pojos.WeblogEntryData;
+import org.roller.presentation.RollerRequest;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+
+/**
+ * Roller's Trackback server implementation. POSTing to this Servlet will add a
+ * Trackback to a Weblog Entrty. For more info on Trackback, read the spec: 
+ * <a href="http://www.movabletype.org/docs/mttrackback.html>MT Trackback</a>.
+ * 
+ * @web.servlet name="TrackbackServlet"
+ * @web.servlet-mapping url-pattern="/trackback/*"
+ * 
+ * @author David M Johnson
+ */
+public class TrackbackServlet extends HttpServlet
+{
+    /** Request parameter to indicate a trackback "tb" */
+    private static final String TRACKBACK_PARAM = "tb";
+
+    /** Request parameter for the trackback "title" */
+    private static final String TRACKBACK_TITLE_PARAM = "title";
+
+    /** Request parameter for the trackback "excerpt" */
+    private static final String TRACKBACK_EXCERPT_PARAM = "excerpt";
+
+    /** Request parameter for the trackback "url" */
+    private static final String TRACKBACK_URL_PARAM = "url";
+
+    /** Request parameter for the trackback "blog_name" */
+    private static final String TRACKBACK_BLOG_NAME_PARAM = "blog_name";
+
+    /** Key under which the trackback return code will be placed
+     * (example: on the request for the JSPDispatcher) */
+    public static final String BLOJSOM_TRACKBACK_RETURN_CODE = 
+            "BLOJSOM_TRACKBACK_RETURN_CODE";
+
+    /** Key under which the trackback error message will be placed
+     * (example: on the request for the JSPDispatcher) */
+    public static final String BLOJSOM_TRACKBACK_MESSAGE = 
+            "BLOJSOM_TRACKBACK_MESSAGE";
+
+    /** Trackback success page */
+    private static final String TRACKBACK_SUCCESS_PAGE = "trackback-success";
+
+    /** Trackback failure page */
+    private static final String TRACKBACK_FAILURE_PAGE = "trackback-failure";
+
+    /**
+     * Constructor.
+     */
+    public TrackbackServlet()
+    {
+        super();
+    }
+
+    /** 
+     * POSTing to this Servlet will add a Trackback to a Weblog Entrty.
+     */
+    protected void doGet(HttpServletRequest req, HttpServletResponse res)
+                   throws ServletException, IOException
+    {
+        doPost(req,res);
+    }
+    
+    /** 
+     * POSTing to this Servlet will add a Trackback to a Weblog Entrty.
+     */
+    protected void doPost(HttpServletRequest req, HttpServletResponse res)
+                   throws ServletException, IOException
+    {
+        String url = req.getParameter(TRACKBACK_URL_PARAM);
+        String title = req.getParameter(TRACKBACK_TITLE_PARAM);
+        String excerpt = req.getParameter(TRACKBACK_EXCERPT_PARAM);
+        String blogName = req.getParameter(TRACKBACK_BLOG_NAME_PARAM);
+
+        if ((title == null) || "".equals(title))
+        {
+            title = url;
+        }
+
+        if (excerpt == null)
+        {
+            excerpt = "";
+        }
+        else
+        {
+            if (excerpt.length() >= 255)
+            {
+                excerpt = excerpt.substring(0, 252);
+                excerpt += "...";
+            }
+        }
+               
+        String error = null;
+        PrintWriter pw = new PrintWriter(res.getOutputStream());
+        try
+        {
+            if ( title==null || url==null || excerpt==null || blogName==null )
+            {
+                error = "title, url, excerpt, and blog_name not specified.";
+            }
+            else
+            {
+                RollerRequest rreq = RollerRequest.getRollerRequest(req);
+                WeblogEntryData entry = rreq.getWeblogEntry();
+                
+                if (entry!=null && entry.getCommentsStillAllowed())
+                {
+                    entry.addTrackback(url,title,excerpt,blogName);
+                    rreq.getRoller().commit();
+            
+                    pw.println("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>");
+                    pw.println("<response>");
+                    pw.println("<error>0</error>");
+                    pw.println("</response>");
+                    pw.flush();
+                }
+                else if (entry!=null)
+                {
+                    error = "Comments and Trackbacks are disabled for the entry you specified.";
+                }                
+                else
+                {
+                    error = "Entry not specified.";
+                }                
+            }
+            
+        }
+        catch (Exception e)
+        {
+            error = e.getMessage();
+            if ( error == null )
+            {   
+                error = e.getClass().getName();
+            }
+        }
+        
+        if ( error!= null )
+        {
+            pw.println("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>");
+            pw.println("<response>");
+            pw.println("<error>1</error>");
+            pw.println("<message>ERROR: "+error+"</message>");
+            pw.println("</response>");
+            pw.flush();
+        }
+        res.flushBuffer();
+    }
+}
\ No newline at end of file

Added: incubator/roller/trunk/src/org/roller/presentation/weblog/actions/BakeWeblogAction.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/weblog/actions/BakeWeblogAction.java?rev=189602&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/weblog/actions/BakeWeblogAction.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/weblog/actions/BakeWeblogAction.java Wed Jun  8 09:06:16 2005
@@ -0,0 +1,251 @@
+package org.roller.presentation.weblog.actions;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.struts.action.ActionError;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.actions.DispatchAction;
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.Velocity;
+import org.apache.velocity.exception.MethodInvocationException;
+import org.apache.velocity.exception.ParseErrorException;
+import org.apache.velocity.exception.ResourceNotFoundException;
+import org.roller.RollerException;
+import org.roller.model.UserManager;
+import org.roller.model.WeblogManager;
+import org.roller.pojos.PageData;
+import org.roller.pojos.WebsiteData;
+import org.roller.presentation.RollerContext;
+import org.roller.presentation.RollerRequest;
+import org.roller.presentation.RollerSession;
+import org.roller.presentation.velocity.ContextLoader;
+import org.roller.presentation.weblog.tags.WeblogEntryMacros;
+import org.roller.util.DateUtil;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.StringWriter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.jsp.JspFactory;
+import javax.servlet.jsp.PageContext;
+
+/////////////////////////////////////////////////////////////////////////////
+/**
+ * Generates static pages for each day containing Weblog entries.
+ * @struts.action name="bakeWeblogForm" path="/bake" scope="session"
+ * parameter="method"
+ * 
+ * @author llavandowska
+ */
+public class BakeWeblogAction extends DispatchAction
+{
+	private static Log mLogger = 
+		LogFactory.getFactory().getInstance(BakeWeblogAction.class);
+		
+	public ActionForward load(
+		ActionMapping       mapping,
+		ActionForm          actionForm,
+		HttpServletRequest  request,
+		HttpServletResponse response)
+		throws IOException, ServletException
+	{
+		RollerRequest rreq = RollerRequest.getRollerRequest(request);
+		try {
+			if ( !rreq.isUserAuthorizedToEdit() )
+			{
+				return mapping.findForward("access-denied");
+			}
+		}
+		catch (Exception e)
+		{
+			return mapping.findForward("access-denied");
+		}
+		return mapping.findForward("baking.done");
+	}
+		
+	public ActionForward bake(
+		ActionMapping       mapping,
+		ActionForm          actionForm,
+		HttpServletRequest  request,
+		HttpServletResponse response)
+		throws IOException, ServletException
+	{
+		ActionForward forward = mapping.findForward("baking.done");
+		ActionErrors errors = new ActionErrors();
+		try
+		{
+			PageContext pageContext =
+				JspFactory.getDefaultFactory().getPageContext(
+					this.getServlet(), request, response,"", true, 8192, true);
+			RollerRequest rreq = RollerRequest.getRollerRequest(pageContext);
+			if ( !rreq.isUserAuthorizedToEdit() )
+			{
+				return mapping.findForward("access-denied");
+			}			
+			
+			String pid = getDefaultPageId( rreq );
+			
+			VelocityContext context = new VelocityContext();
+			ContextLoader.setupContext( context, rreq, response );
+
+			// Get this months Entries
+            WeblogManager mgr = rreq.getRoller().getWeblogManager();
+            //Map entryMap = mgr.getWeblogEntryMonthMap( 
+			    //rreq.getUser().getUserName(), 
+                //rreq.getDate(true), 
+                //null, 
+                //false, 
+                //true );
+
+            Map entryMap = mgr.getWeblogEntryObjectMap(
+                            rreq.getWebsite(),
+                            null,                        // startDate
+                            rreq.getDate(true),          // endDate
+                            null,                        // catName
+                            WeblogManager.PUB_ONLY,      // status
+                            null);                      // maxEntries
+            
+            if (mLogger.isDebugEnabled())
+            {
+			    mLogger.debug("Num Days to Bake: " + entryMap.size());
+            }
+            
+			Iterator iter = entryMap.keySet().iterator();
+			if (iter.hasNext())
+			{
+				Date d = (Date)iter.next();
+                
+                if (mLogger.isDebugEnabled())
+                {
+				    mLogger.debug("Bake Weblog for date:" + d);
+				}
+                
+				// Do we need this to continue supporting Macros?
+				WeblogEntryMacros macros = 
+					new WeblogEntryMacros( rreq.getPageContext(), d );
+				context.put( "macros", macros );
+				
+				List entries = (List) entryMap.get( d ); 	
+				String content = transformTemplate(pid, entries, context, rreq);
+				
+				String fileName = writeToFile(content, d, rreq);
+				request.getSession().setAttribute(
+					RollerSession.STATUS_MESSAGE,
+						"Weblog baked to :" + fileName);			
+			}
+
+			/** put some user message **/
+			String message = (String) request.getSession().getAttribute(
+				RollerSession.STATUS_MESSAGE);
+			if (message == null) message = "No Files Written";
+			request.getSession().setAttribute(
+				RollerSession.STATUS_MESSAGE,
+					message);		
+		}
+		catch (Exception e)
+		{
+			forward = mapping.findForward("error");
+
+			errors.add(ActionErrors.GLOBAL_ERROR,
+				new ActionError("error.bake.weblog", e.toString()));
+			saveErrors(request,errors);
+
+			mLogger.error(getResources(request).getMessage("error.bake.weblog") 
+				+ e.toString(),e);
+		}		
+		
+		return forward;
+	}
+	
+	/**
+	 * Write the content generated by transformTemplate to a file in the Upload
+	 * directory, where the user can reach it.
+	 * 
+	 * @param content
+	 * @param d
+	 * @param rreq
+	 */
+	private String writeToFile(String content, Date d, RollerRequest rreq) 
+		throws IOException
+	{
+        if (mLogger.isDebugEnabled())
+        {
+		    mLogger.debug("Write file for:" + d);
+        }
+        
+		String dir = RollerContext.getUploadDir( rreq.getServletContext() );
+		String username = rreq.getUser().getUserName();
+		File dirF = new File(dir + username + File.separator + "baked");
+		if (!dirF.exists())
+		{
+			dirF.mkdirs();
+		}
+		
+		SimpleDateFormat mFmt = DateUtil.get8charDateFormat();
+		String dString = mFmt.format( d ) + ".html";
+		File pFile = new File(dirF, dString);
+		
+		OutputStream bos = new FileOutputStream(pFile);
+		bos.write( content.getBytes() );
+		bos.close();
+		
+		return pFile.getName();
+	}
+
+	/**
+	 * Transform the Page specified by the pageId using Velocity. Return the
+	 * resulting String.
+	 * 
+	 * @param pid
+	 * @param context
+	 * @throws ResourceNotFoundException
+	 * @throws ParseErrorException
+	 * @throws MethodInvocationException
+	 * @throws Exception
+	 */
+	private String transformTemplate(String pid, List entries, 
+		VelocityContext context, RollerRequest rreq)
+		throws
+			ResourceNotFoundException,
+			ParseErrorException,
+			MethodInvocationException,
+			Exception
+	{              
+		
+		context.put( "entries", entries ); 
+		
+		StringWriter sw = new StringWriter();
+		Velocity.mergeTemplate(pid, Velocity.ENCODING_DEFAULT, context, sw );
+		return sw.toString();
+	}
+	
+	/**
+	 * Get the default pageId for this Website, this is assumed to be the Weblog
+	 * page since we have no other way of declaring it.
+	 * 
+	 * @param rreq
+	 * @return String
+	 * @throws RollerException
+	 */
+	private String getDefaultPageId(RollerRequest rreq) throws RollerException
+	{
+		UserManager userMgr = rreq.getRoller().getUserManager();
+		WebsiteData wd = rreq.getWebsite();
+		PageData pd = userMgr.retrievePage(wd.getDefaultPageId());
+		return pd.getId();
+	}
+	
+}

Added: incubator/roller/trunk/src/org/roller/presentation/weblog/actions/CategoriesAction.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/weblog/actions/CategoriesAction.java?rev=189602&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/weblog/actions/CategoriesAction.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/weblog/actions/CategoriesAction.java Wed Jun  8 09:06:16 2005
@@ -0,0 +1,196 @@
+/*
+ * Created on Oct 21, 2003
+ */
+package org.roller.presentation.weblog.actions;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.actions.DispatchAction;
+import org.roller.RollerException;
+import org.roller.model.WeblogManager;
+import org.roller.pojos.WeblogCategoryData;
+import org.roller.pojos.WebsiteData;
+import org.roller.presentation.RollerRequest;
+import org.roller.presentation.weblog.formbeans.CategoriesForm;
+
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.TreeSet;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Actions that are initiated from the CategoriesForm.
+ * 
+ * @struts.action name="categoriesForm" path="/categories" parameter="method"
+ * @struts.action-forward name="CategoriesForm" path="/weblog/CategoriesForm.jsp"
+ * 
+ * @author Dave Johnson
+ */
+public class CategoriesAction extends DispatchAction
+{
+    private static Log mLogger = 
+        LogFactory.getFactory().getInstance(CategoriesAction.class);
+
+    /**
+     * Present the CategoriesForm loaded with category specified by request.
+     * @param mapping Action mapping.
+     * @param actionForm Form bean.
+     * @param request Request.
+     * @param response Response.
+     * @return Forward to CategoriesForm or access-denied.
+     * @throws RollerException
+     */
+    public ActionForward selectCategory(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws RollerException
+    {
+        RollerRequest rreq = RollerRequest.getRollerRequest(request);
+        if (rreq.isUserAuthorizedToEdit())
+        {
+            addModelObjects(request, (CategoriesForm)actionForm);
+            return mapping.findForward("CategoriesForm");
+        }
+        else
+        {
+            return mapping.findForward("access-denied");
+        }
+    }
+
+     /**
+     * Move Categories and bookmarks indicated by CategoriesForm bean.
+     * @param mapping Action mapping.
+     * @param actionForm  Form bean.
+     * @param request Request.
+     * @param response Response.
+     * @return Forward to CategoriesForm or access-denied.
+     * @throws RollerException
+     */
+    public ActionForward moveSelected(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws RollerException
+    {
+        RollerRequest rreq = RollerRequest.getRollerRequest(request);
+        if (rreq.isUserAuthorizedToEdit())
+        {
+            WeblogManager wmgr = rreq.getRoller().getWeblogManager();
+            CategoriesForm form = (CategoriesForm)actionForm; 
+
+            mLogger.debug("Moving categories to category, id=" 
+                + form.getMoveToCategoryId());
+                
+            // Move subCategories to new category.
+            String Categories[] = form.getSelectedCategories();
+            WeblogCategoryData parent = wmgr.retrieveWeblogCategory(form.getMoveToCategoryId());
+            if (null != Categories)
+            {
+                for (int i = 0; i < Categories.length; i++)
+                {
+                    WeblogCategoryData cd = wmgr.retrieveWeblogCategory(Categories[i]); 
+                    
+                    // Don't move category into itself.                   
+                    if (!cd.getId().equals(parent.getId()))
+                    {
+                        cd.setParent(parent);
+                        cd.save();
+                    }
+                }
+            }
+
+            rreq.getRoller().commit();
+            
+            addModelObjects(request, (CategoriesForm)actionForm);
+            return mapping.findForward("CategoriesForm");
+        }
+        else
+        {
+            return mapping.findForward("access-denied");
+        }
+    }
+
+    /**
+     * Load model objects for display in CategoriesForm.
+     * @param request
+     * @throws RollerException
+     */
+    private void addModelObjects(HttpServletRequest request, CategoriesForm form) 
+        throws RollerException
+    {
+        RollerRequest rreq = RollerRequest.getRollerRequest(request);
+        WebsiteData wd = rreq.getWebsite();
+        WeblogManager wmgr = rreq.getRoller().getWeblogManager();
+        
+        TreeSet allCategories = new TreeSet(new Comparator() {
+            public int compare(Object o1, Object o2) {
+                WeblogCategoryData f1 = (WeblogCategoryData)o1; 
+                WeblogCategoryData f2 = (WeblogCategoryData)o2; 
+                return f1.getPath().compareTo(f2.getPath());
+            }
+        });
+        
+        // Find catid wherever it may be
+        String catId = (String)request.getAttribute(RollerRequest.WEBLOGCATEGORYID_KEY);
+        if (null == catId) 
+        {
+            catId = request.getParameter(RollerRequest.WEBLOGCATEGORYID_KEY);
+        }  
+        if (null == catId)
+        {
+            catId = form.getId();     
+        }
+       
+        WeblogCategoryData cat = null;
+        if (null == catId || catId.equals("null"))
+        {
+            cat = wmgr.getRootWeblogCategory(wd);
+        }
+        else 
+        {
+            cat = wmgr.retrieveWeblogCategory(catId);            
+        }
+        form.setId(cat.getId());
+        
+        request.setAttribute("category", cat);
+        request.setAttribute("categories", cat.getWeblogCategories());
+        
+        if (null != cat.getParent())
+        {
+            LinkedList catPath = new LinkedList();
+            catPath.add(0, cat);
+            WeblogCategoryData parent = cat.getParent();
+            while (parent != null) 
+            {
+                catPath.add(0, parent);
+                parent = parent.getParent();   
+            }
+            request.setAttribute("categoryPath", catPath);
+            
+            request.setAttribute(
+                RollerRequest.PARENTID_KEY, cat.getParent().getId());
+        }
+    
+        // Build collection of all Categories, except for current one, 
+        // sorted by path.
+        Iterator iter = wmgr.getWeblogCategories(wd).iterator();
+        while (iter.hasNext())
+        {
+            WeblogCategoryData cd = (WeblogCategoryData) iter.next();
+            if (!cd.getId().equals(catId))
+            {
+                allCategories.add(cd);
+            }
+        }
+        request.setAttribute("allCategories", allCategories);
+    }
+}

Added: incubator/roller/trunk/src/org/roller/presentation/weblog/actions/CategoryDeleteAction.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/weblog/actions/CategoryDeleteAction.java?rev=189602&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/weblog/actions/CategoryDeleteAction.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/weblog/actions/CategoryDeleteAction.java Wed Jun  8 09:06:16 2005
@@ -0,0 +1,128 @@
+/*
+ * Created on Oct 21, 2003
+ */
+package org.roller.presentation.weblog.actions;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.roller.model.WeblogManager;
+import org.roller.pojos.WeblogCategoryData;
+import org.roller.pojos.WebsiteData;
+import org.roller.presentation.RollerRequest;
+import org.roller.presentation.weblog.formbeans.CategoryDeleteForm;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @struts.action path="/categoryDelete" name="categoryDeleteForm"
+ * @struts.action-forward name="Categories" path="/categories.do?method=selectCategory"
+ * @struts.action-forward name="CategoryDeleteOK" path="/weblog/CategoryDeleteOK.jsp"
+ * 
+ * @author Dave Johnson
+ */
+public class CategoryDeleteAction extends Action
+{
+    public ActionForward execute(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws Exception
+    {
+        ActionForward forward = null;
+        CategoryDeleteForm form = (CategoryDeleteForm)actionForm;
+        RollerRequest rreq = RollerRequest.getRollerRequest(request);
+        WeblogManager wmgr = rreq.getRoller().getWeblogManager();
+        
+        if (rreq.isUserAuthorizedToEdit())
+        {
+            String catid = request.getParameter("catid");
+            WeblogCategoryData catToDelete = 
+                wmgr.retrieveWeblogCategory(catid);
+            String returnId = null;
+            if (catToDelete.getParent() != null)
+            {
+                returnId = catToDelete.getParent().getId();
+            }
+            if (form.isDelete() == null)
+            {
+                // Present CategoryDeleteOK? page to user
+                WebsiteData website = rreq.getWebsite();
+                WeblogCategoryData theCat = wmgr.retrieveWeblogCategory(catid);
+                Iterator allCats = 
+                    wmgr.getWeblogCategories(website).iterator();
+                List destCats = new LinkedList();
+                while (allCats.hasNext())
+                {
+                    WeblogCategoryData cat = (WeblogCategoryData)allCats.next();
+                    if (cat.getId() != catid)
+                    {
+                        destCats.add(cat);
+                    }                    
+                }
+                if (destCats.size() > 0)
+                {
+                    form.setName(theCat.getName());
+                    form.setCatid(catid);
+                    form.setCats(destCats);
+                    form.setInUse(new Boolean(catToDelete.isInUse()));
+                    forward = mapping.findForward("CategoryDeleteOK");
+                }
+                else
+                {
+                    // Can't delete last category, send 'em back!
+                    if (null != returnId) 
+                    {
+                        request.setAttribute(
+                                RollerRequest.WEBLOGCATEGORYID_KEY, returnId);
+                    }               
+                    forward = mapping.findForward("Categories");
+                }
+            }
+            else if (form.isDelete().booleanValue()) 
+            {
+                // User clicked YES to delete
+                WeblogCategoryData destCat = null;
+                if (form.getMoveToWeblogCategoryId() != null) 
+                {
+                    destCat = wmgr.retrieveWeblogCategory(form.getMoveToWeblogCategoryId());
+                }
+                  
+                // move entries to destCat and remove catToDelete
+                catToDelete.remove(destCat);
+                
+                rreq.getRoller().commit();
+                
+                if (null != returnId) 
+                {
+                    request.setAttribute(
+                        RollerRequest.WEBLOGCATEGORYID_KEY, returnId);
+                }               
+                forward = mapping.findForward("Categories");
+            }
+            else 
+            {
+                // User clicked NO to delete, do back to categories form
+                if (null != returnId) 
+                {
+                    request.setAttribute(
+                       RollerRequest.WEBLOGCATEGORYID_KEY, returnId);
+                }               
+                forward = mapping.findForward("Categories");   
+            }
+        }
+        else
+        {
+            forward = mapping.findForward("access-denied");
+        }
+        return forward;
+    }
+
+}

Added: incubator/roller/trunk/src/org/roller/presentation/weblog/actions/CategoryEditAction.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/weblog/actions/CategoryEditAction.java?rev=189602&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/weblog/actions/CategoryEditAction.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/weblog/actions/CategoryEditAction.java Wed Jun  8 09:06:16 2005
@@ -0,0 +1,93 @@
+/*
+ * Created on Oct 21, 2003
+ */
+package org.roller.presentation.weblog.actions;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.roller.model.WeblogManager;
+import org.roller.pojos.WeblogCategoryData;
+import org.roller.pojos.WebsiteData;
+import org.roller.presentation.RollerRequest;
+import org.roller.presentation.weblog.formbeans.WeblogCategoryFormEx;
+
+import java.util.LinkedList;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @struts.action path="/categoryEdit" name="weblogCategoryFormEx" validate="false"
+ * @struts.action-forward name="CategoryForm" path="/weblog/CategoryForm.jsp"
+ * 
+ * @author Dave Johnson
+ */
+public class CategoryEditAction extends Action
+{
+    public ActionForward execute(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws Exception
+    {
+        RollerRequest rreq = RollerRequest.getRollerRequest(request);
+        WebsiteData wd = rreq.getWebsite();
+        WeblogManager wmgr = rreq.getRoller().getWeblogManager();
+        WeblogCategoryFormEx form = (WeblogCategoryFormEx)actionForm;
+        
+        WeblogCategoryData parentCat = null;
+        if (null!=rreq.getWeblogCategory() && null==request.getParameter("correct")) 
+        {
+            // If request specifies Category and we are not correcting an 
+            // already submitted form then load that Category into the form.
+            WeblogCategoryData cd = rreq.getWeblogCategory();
+            form.copyFrom(cd, request.getLocale());
+            request.setAttribute("state","edit"); 
+                
+            // Pass Category's parent id on as attribute.                 
+            parentCat = cd.getParent();
+            request.setAttribute(
+                RollerRequest.WEBLOGCATEGORYID_KEY, parentCat.getId());
+        }
+        else if (null != request.getParameter("correct"))
+        {
+            // We are correcting a previously submtted form.
+            request.setAttribute("state","correcting"); 
+                
+            // Cat is specified by request param, pass it on as attribute.                 
+            parentCat = wmgr.retrieveWeblogCategory(rreq.getWeblogCategory().getId());
+            request.setAttribute(
+                RollerRequest.WEBLOGCATEGORYID_KEY, parentCat.getId());                
+        }
+        else
+        {
+            // We are adding a new Category
+            request.setAttribute("state","add");
+            
+            // Cat is specified by request param, pass it on as attribute. 
+            String parentId = request.getParameter(RollerRequest.PARENTID_KEY);
+            form.setParentId(parentId);                            
+        }
+        
+        // Build cat path for display on page
+        if (null != parentCat)
+        {
+            LinkedList categoryPath = new LinkedList();
+            categoryPath.add(0, parentCat);
+            WeblogCategoryData parent = parentCat.getParent();
+            while (parent != null) 
+            {
+                categoryPath.add(0, parent);
+                parent = parent.getParent();   
+            }
+            request.setAttribute("parentCategory", parentCat);
+            request.setAttribute("categoryPath", categoryPath);
+        }
+
+        return mapping.findForward("CategoryForm");
+    }
+    
+}

Added: incubator/roller/trunk/src/org/roller/presentation/weblog/actions/CategorySaveAction.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/weblog/actions/CategorySaveAction.java?rev=189602&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/weblog/actions/CategorySaveAction.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/weblog/actions/CategorySaveAction.java Wed Jun  8 09:06:16 2005
@@ -0,0 +1,60 @@
+/*
+ * Created on Oct 21, 2003
+ */
+package org.roller.presentation.weblog.actions;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.roller.model.WeblogManager;
+import org.roller.pojos.WeblogCategoryData;
+import org.roller.presentation.RollerRequest;
+import org.roller.presentation.weblog.formbeans.WeblogCategoryFormEx;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @struts.action path="/categorySave" name="weblogCategoryFormEx"
+ *    validate="true" input="/categoryEdit.do"
+ * @struts.action-forward name="Categories" path="/categories.do?method=selectCategory"
+ * 
+ * @author Dave Johnson
+ */
+public class CategorySaveAction extends Action
+{
+    public ActionForward execute(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws Exception
+    {
+        WeblogCategoryFormEx form = (WeblogCategoryFormEx)actionForm;
+        RollerRequest rreq = RollerRequest.getRollerRequest(request);
+        WeblogManager wmgr = rreq.getRoller().getWeblogManager();
+        
+        WeblogCategoryData cd = null;
+        if (null != form.getId() && !form.getId().trim().equals("")) 
+        {
+            cd = wmgr.retrieveWeblogCategory(form.getId());
+        }
+        else 
+        {
+            cd = wmgr.createWeblogCategory();
+            cd.setWebsite(rreq.getWebsite());
+            
+            String parentId = form.getParentId();
+            cd.setParent(wmgr.retrieveWeblogCategory(parentId));
+        }
+        form.copyTo(cd, request.getLocale());
+        cd.save();
+        rreq.getRoller().commit();
+        
+        request.setAttribute(
+            RollerRequest.WEBLOGCATEGORYID_KEY, cd.getParent().getId());         
+        return mapping.findForward("Categories");
+    }
+
+}

Added: incubator/roller/trunk/src/org/roller/presentation/weblog/actions/CommentFormAction.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/weblog/actions/CommentFormAction.java?rev=189602&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/weblog/actions/CommentFormAction.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/weblog/actions/CommentFormAction.java Wed Jun  8 09:06:16 2005
@@ -0,0 +1,585 @@
+package org.roller.presentation.weblog.actions;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.struts.action.ActionError;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.actions.DispatchAction;
+import org.apache.struts.util.MessageResources;
+import org.apache.struts.util.RequestUtils;
+import org.roller.RollerException;
+import org.roller.model.UserManager;
+import org.roller.model.WeblogManager;
+import org.roller.pojos.CommentData;
+import org.roller.pojos.PageData;
+import org.roller.pojos.RollerConfig;
+import org.roller.pojos.UserData;
+import org.roller.pojos.WeblogEntryData;
+import org.roller.pojos.WebsiteData;
+import org.roller.presentation.LanguageUtil;
+import org.roller.presentation.RollerContext;
+import org.roller.presentation.RollerRequest;
+import org.roller.presentation.pagecache.PageCache;
+import org.roller.presentation.weblog.formbeans.CommentFormEx;
+import org.roller.presentation.weblog.search.IndexManager;
+import org.roller.presentation.weblog.search.operations.AddEntryOperation;
+import org.roller.presentation.weblog.search.operations.RemoveEntryOperation;
+import org.roller.util.CommentSpamChecker;
+import org.roller.util.MailUtil;
+import org.roller.util.StringUtils;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+
+import javax.mail.MessagingException;
+import javax.mail.Session;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+
+/////////////////////////////////////////////////////////////////////////////
+/**
+ * Comment form action supports displaying, posting, previewing, and
+ * deleting comments.
+ *
+ * @struts.action name="commentFormEx" path="/comment"
+ *  scope="session" parameter="method"
+ */
+public class CommentFormAction extends DispatchAction
+{
+    private static final String COMMENT_SPAM_MSG =
+                    "Your comment has been recognized as " +
+                    "<a href='http://www.jayallen.org/projects/mt-blacklist/'>" +
+                    "Comment Spam</a> and rejected.";
+	private static Log mLogger =
+        LogFactory.getFactory().getInstance(CommentFormAction.class);
+
+    //------------------------------------------------------------------------
+
+    /**
+     * Done.
+     */
+    public ActionForward done(ActionMapping mapping, ActionForm actionForm,
+            HttpServletRequest req, HttpServletResponse res)
+    throws Exception
+    {
+        return mapping.findForward("editWeblog");
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * load the comments for weblogEntryId into request attribute
+     **/
+	private void loadComments(
+		HttpServletRequest request,
+		String weblogEntryId,
+		WeblogManager mgr,
+        boolean noSpam)
+		throws RollerException
+	{
+		List comments = mgr.getComments( weblogEntryId, noSpam );
+		request.setAttribute("blogComments", comments);
+	}
+
+    //-----------------------------------------------------------------------
+    /**
+     * Load comments and blog entry objects and forward to comment display
+     * edit page.
+     */
+    public ActionForward edit(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws IOException, ServletException
+    {
+        ActionForward forward = mapping.findForward("comment.page");
+        ActionErrors errors = new ActionErrors();
+        RollerRequest rreq = RollerRequest.getRollerRequest(request);
+        try
+        {
+            WeblogEntryData wd = rreq.getWeblogEntry();
+            if (wd == null || wd.getId() == null)
+            {
+              // this is likely to be a fraudulent attempt
+              throw new NullPointerException("Unable to find WeblogEntry for "+
+                    request.getParameter(RollerRequest.WEBLOGENTRYID_KEY));
+            }
+            request.setAttribute("blogEntry", wd);
+
+            CommentFormEx cf = (CommentFormEx)actionForm;
+            cf.setWeblogEntry( wd );
+
+            WeblogManager mgr = rreq.getRoller().getWeblogManager();
+            loadComments(request, wd.getId(), mgr, true); // no spam
+        }
+        catch (Exception e)
+        {
+            forward = mapping.findForward("error");
+
+            errors.add(ActionErrors.GLOBAL_ERROR,
+                new ActionError("error.edit.comment", e.toString()));
+            saveErrors(request,errors);
+
+            if (e instanceof NullPointerException)
+            {
+                // from a fraudulent attempt - lower logging level
+                mLogger.warn(getResources(request).getMessage("error.edit.comment")
+                    + e.toString(),e);
+            }
+            else
+            {
+                mLogger.error(getResources(request).getMessage("error.edit.comment")
+                    + e.toString(),e);
+            }
+        }
+        return forward;
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Saves comment and forward to the comment-edit page.
+     */
+    public ActionForward update(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws IOException, ServletException
+    {
+        ActionForward forward = null; // we'll compute this later
+
+        RollerRequest rreq = RollerRequest.getRollerRequest(request);
+        ActionErrors errors = new ActionErrors();
+
+        try
+        {
+            // Get weblog entry object, put in page context
+            WeblogEntryData wd = rreq.getWeblogEntry();
+            if (wd == null || wd.getId() == null)
+            {
+                throw new NullPointerException(
+                    "Unable to find WeblogEntry for "+
+                    request.getParameter(RollerRequest.WEBLOGENTRYID_KEY));
+            }
+            if ( !wd.getWebsite().getAllowComments().booleanValue() ) {
+                throw new ServletException("ERROR comments disabled by user");
+            }
+            request.setAttribute("blogEntry", wd);
+
+            // get the User to which the blog belongs
+            UserData user = rreq.getUser();
+
+            // Save comment
+            WeblogManager mgr = rreq.getRoller().getWeblogManager();
+            CommentFormEx cf = (CommentFormEx)actionForm;
+            CommentData cd = new CommentData();
+            cf.copyTo(cd, request.getLocale());
+            cd.setWeblogEntry(wd);
+            cd.setRemoteHost(request.getRemoteHost());
+
+            cd.setPostTime(new java.sql.Timestamp( System.currentTimeMillis()));
+            if (cd.getSpam() == null) 
+            {
+            	cd.setSpam(Boolean.FALSE);
+            }
+            cd.save();
+            rreq.getRoller().commit();
+
+            // check for spam
+            testCommentSpam(cd, request);
+            if (cd.getSpam().booleanValue())
+            {
+                errors.add(ActionErrors.GLOBAL_ERROR,
+                           new ActionError("error.update.comment", COMMENT_SPAM_MSG));
+                saveErrors(request,errors);                
+            }
+            else
+            {
+                reindexEntry(wd);
+            }
+
+			// Refresh user's entries in page cache
+			PageCache.removeFromCache( request, user );
+
+			// Put array of comments in context
+			List comments = mgr.getComments( wd.getId() );
+			request.setAttribute("blogComments", comments);
+
+			// Remove the obsolete form bean
+			request.removeAttribute(mapping.getAttribute());
+
+			// MR: Added functionality to e-mail comments
+            sendEmailNotification(request, rreq, wd, cd, user, comments);
+
+            if ( request.getAttribute("updateFromPage")!=null )
+            {
+                forward = updateFromPageForward(request, rreq, wd, user);
+            }
+            else
+            {
+                forward = mapping.findForward("comment.page");
+            }
+
+            // Put array of comments in context
+            loadComments(request, wd.getId(), mgr, true); // no spam
+
+            cf.reset(mapping,request);
+        }
+        catch (Exception e)
+        {
+            forward = mapping.findForward("error");
+
+            errors.add(ActionErrors.GLOBAL_ERROR,
+                new ActionError("error.update.comment", e.toString()));
+            saveErrors(request,errors);
+
+            mLogger.error(getResources(request)
+                .getMessage("error.update.comment") + e.toString(),e);
+        }
+        return forward;
+    }
+
+    /**
+     * Re-index the WeblogEntry so that the new comment gets indexed
+     * along with it.
+     * 
+     * @param wd
+     */
+    private void reindexEntry(WeblogEntryData entry)
+    {
+        IndexManager manager =
+            RollerContext.getRollerContext(
+                RollerContext.getServletContext()).getIndexManager();
+        
+        // remove entry before (re)adding it, or in case it isn't Published
+        RemoveEntryOperation removeOp = new RemoveEntryOperation(entry);
+        manager.executeIndexOperationNow(removeOp); 
+        
+        // if published, index the entry
+        if (entry.getPublishEntry() == Boolean.TRUE) 
+        {
+            AddEntryOperation addEntry = new AddEntryOperation(entry);
+            manager.scheduleIndexOperation(addEntry);
+        }
+    }
+
+    private void sendEmailNotification(
+        HttpServletRequest request,
+        RollerRequest rreq,
+        WeblogEntryData wd,
+        CommentData cd,
+        UserData user,
+        List comments)
+        throws MalformedURLException
+    {
+        RollerContext rc = RollerContext.getRollerContext( request );
+        RollerConfig rollerConfig = rc.getRollerConfig();
+        
+		MessageResources resources = getResources(request);
+		Locale viewLocale = LanguageUtil.getViewLocale(request);
+        
+        UserManager userMgr = null;
+        WebsiteData site = null;
+        try 
+        {
+            userMgr = RollerContext.getRoller(request).getUserManager(); 
+            site = userMgr.getWebsite(user.getUserName());
+        } 
+        catch (RollerException re)
+        {
+            re.printStackTrace();
+            mLogger.error("Couldn't get UserManager from RollerContext", re.getRootCause());
+        }
+        
+        // Send e-mail to owner (if enabled) and subscribed users
+        if ( rollerConfig.getEmailComments().booleanValue() &&
+                site.getEmailComments().booleanValue() )
+        {
+            
+            String defaultFromEmail = (StringUtils.isEmpty(site.getEmailFromAddress())) ? 
+                                       user.getEmailAddress() : site.getEmailFromAddress();
+            
+        	String from = (StringUtils.isEmpty(cd.getEmail()))
+        					? defaultFromEmail : cd.getEmail();
+
+        	// get all the subscribers to this comment thread
+        	ArrayList subscribers = new ArrayList();
+        	for (Iterator it = comments.iterator(); it.hasNext();) 
+        	{
+        		CommentData comment = (CommentData) it.next();
+        		// only add the subscriber if they don't already exist
+        		if (   ! StringUtils.isEmpty(comment.getEmail())
+        			&& ! subscribers.contains(comment.getEmail())
+        			&& ! StringUtils.equals(comment.getEmail(), 
+        					                user.getEmailAddress())) 
+        		{
+        			subscribers.add(comment.getEmail());
+        		}
+        	}
+
+        	// There's got to be an easier way, but I'm in a hurry ;-)
+        	String[] cc = new String[subscribers.size()];
+        	for (int i = 0; i < subscribers.size(); i++)
+        	{
+        		cc[i] = (String) subscribers.get(i);
+        	}
+
+        	StringBuffer msg = new StringBuffer();
+
+            // determine with mime type to use for e-mail
+        	boolean escapeHtml = rollerConfig.getEscapeCommentHtml().booleanValue();
+        	if (!escapeHtml)
+        	{
+        		msg.append("<html><body style=\"background: white; ");
+        		msg.append(" color: black; font-size: 12px\">");
+        	}
+
+			if (!StringUtils.isEmpty(cd.getName()))
+			{
+				msg.append(cd.getName() + " " + resources.getMessage(viewLocale, "email.comment.wrote") + ": ");
+			}
+			else
+			{
+				msg.append(resources.getMessage(viewLocale, "email.comment.anonymous") + ": ");
+			}
+
+        	msg.append((escapeHtml) ? "\n\n" : "<br /><br />");
+        	msg.append(cd.getContent());
+            msg.append((escapeHtml) ? "\n\n----\n" :
+        		"<br /><br /><hr /><span style=\"font-size: 11px\">");
+			msg.append(resources.getMessage(viewLocale, "email.comment.respond") + ": ");
+        	msg.append((escapeHtml) ? "\n" : "<br />");
+
+        	// build link back to comment
+        	StringBuffer commentURL = new StringBuffer();
+        	commentURL.append(RequestUtils.serverURL(request));
+        	commentURL.append(request.getContextPath()+"/page/");
+        	commentURL.append(rreq.getUser().getUserName());
+        	PageData page = rreq.getPage();
+        	if (page == null)
+        	{
+        		commentURL.append("?anchor=");
+        	}
+        	else
+        	{
+        		commentURL.append("/").append(page.getLink()).append("/");
+        	}
+
+        	commentURL.append(wd.getAnchor());
+
+        	if (escapeHtml)
+        	{
+        		msg.append(commentURL.toString());
+        	}
+        	else
+        	{
+        		msg.append("<a href=\"" + commentURL + "\">" + commentURL + "</a></span>");
+        		msg.append("</body></html>");
+        	}
+
+        	String subject = null;
+
+			if ( (subscribers.size() > 1) ||
+				 (StringUtils.equals(cd.getEmail(), user.getEmailAddress()) ))
+			{
+				subject = "RE: " + resources.getMessage(viewLocale, "email.comment.title") + ": ";
+			}
+			else
+			{
+				subject = resources.getMessage(viewLocale, "email.comment.title") + ": ";
+			}
+
+        	subject += wd.getTitle();
+
+        	try
+            {
+        		Context ctx = (Context)
+                new InitialContext().lookup("java:comp/env");
+        		Session session = (Session) ctx.lookup("mail/Session");
+        		if (escapeHtml)
+                {
+                    // signifies plain text
+                    // from, to, subject, content
+        			MailUtil.sendTextMessage(session, from,
+        			  user.getEmailAddress(), cc,
+        		      subject, msg.toString());
+        		}
+                else
+                {
+        			MailUtil.sendHTMLMessage(session, from,
+        			  user.getEmailAddress(), cc,
+        			  subject, msg.toString());
+        		}
+        	}
+            catch (NamingException ne)
+            {
+        		log.error("NamingException: " + ne.getMessage());
+        		log.warn("Looking up mail session in JNDI failed!");
+        	}
+            catch (MessagingException me)
+            {
+        		log.error("MessagingException: " + me.getMessage());
+        		log.warn("Sending comments e-mail failed!");
+        	}
+
+        }
+
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Get the "forward" necessary to display the
+     * "single entry" view.
+     */
+	private ActionForward updateFromPageForward(
+		HttpServletRequest request,
+		RollerRequest rreq,
+		WeblogEntryData wd,
+		UserData user)
+	{
+		ActionForward forward;
+		PageData page = rreq.getPage();
+		if (page == null)
+		{
+		    try
+		    {
+		        page = rreq.getRoller().getUserManager().
+		            retrievePage(wd.getWebsite().getDefaultPageId());
+		    }
+		    catch (Exception ignore)
+		    {
+		    }
+		}
+		StringBuffer sb = new StringBuffer();
+		sb.append("/page/");
+		sb.append(user.getUserName());
+		if (page == null)
+		{
+		    sb.append("?anchor=");
+		}
+		else
+		{
+		    request.setAttribute(RollerRequest.PAGEID_KEY, page.getId());
+		    sb.append("/").append(page.getLink()).append("/");
+		}
+		sb.append(wd.getAnchor());
+		forward = new ActionForward(sb.toString());
+		return forward;
+	}
+
+    //-----------------------------------------------------------------------
+    /**
+	 * @param cf
+	 * @return
+	 */
+	private void testCommentSpam(CommentData cd, HttpServletRequest req)
+	{
+        new CommentSpamChecker().testComment(cd,
+            RollerContext.getRollerContext(req).getThreadManager());
+	}
+
+	//-----------------------------------------------------------------------
+    /**
+     * Saves comment and forward to the comment-edit page.
+     */
+    public ActionForward updateFromPage(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws IOException, ServletException
+    {
+        request.setAttribute("updateFromPage","true");
+        return update(mapping,actionForm,request,response);
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Load comment and blog entry objects and forward to comment preview page.
+     */
+    public ActionForward preview(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws IOException, ServletException
+    {
+        ActionForward forward = null; // we'll compute this later
+
+        ActionErrors errors = new ActionErrors();
+        RollerRequest rreq = RollerRequest.getRollerRequest(request);
+        try
+        {
+            WeblogEntryData wd = rreq.getWeblogEntry();
+            if (wd == null || wd.getId() == null)
+            {
+                throw new NullPointerException(
+                    "Unable to find WeblogEntry for " +
+                    request.getParameter(RollerRequest.WEBLOGENTRYID_KEY));
+            }
+            request.setAttribute("blogEntry", wd);
+
+            CommentFormEx cf = (CommentFormEx)actionForm;
+            cf.setWeblogEntry( wd );
+            cf.setPostTime(new java.sql.Timestamp(System.currentTimeMillis()));
+            request.setAttribute("commentForm", cf);
+
+            UserData user = rreq.getUser();
+
+            if ( request.getAttribute("previewFromPage")!=null )
+            {
+                StringBuffer sb = new StringBuffer();
+                sb.append("/page/");
+                sb.append(user.getUserName());
+                sb.append("?anchor=");
+                sb.append(wd.getAnchor());
+                forward = new ActionForward(sb.toString());
+            }
+            else
+            {
+                forward = mapping.findForward("comment.preview");
+            }
+        }
+        catch (Exception e)
+        {
+            forward = mapping.findForward("error");
+
+            errors.add(ActionErrors.GLOBAL_ERROR,
+                new ActionError("error.preview.comment", e.toString()));
+            saveErrors(request,errors);
+
+            mLogger.error(
+                getResources(request).getMessage("error.preview.comment"),e);
+        }
+        return forward;
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Load comment and blog entry objects and forward to comment preview page.
+     */
+    public ActionForward previewFromPage(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws IOException, ServletException
+    {
+        request.setAttribute("previewFromPage","true");
+        return preview(mapping,actionForm,request,response);
+    }
+
+}
+

Added: incubator/roller/trunk/src/org/roller/presentation/weblog/actions/ExportEntriesAction.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/weblog/actions/ExportEntriesAction.java?rev=189602&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/weblog/actions/ExportEntriesAction.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/weblog/actions/ExportEntriesAction.java Wed Jun  8 09:06:16 2005
@@ -0,0 +1,289 @@
+/*
+ * Created on Mar 25, 2004
+ */
+package org.roller.presentation.weblog.actions;
+
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.ActionMessage;
+import org.apache.struts.action.ActionMessages;
+import org.apache.struts.actions.DispatchAction;
+import org.apache.struts.util.RequestUtils;
+import org.roller.RollerException;
+import org.roller.model.WeblogManager;
+import org.roller.pojos.WeblogEntryData;
+import org.roller.presentation.BasePageModel;
+import org.roller.presentation.RollerRequest;
+import org.roller.presentation.velocity.ExportRss;
+import org.roller.presentation.weblog.formbeans.WeblogQueryForm;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.jsp.JspFactory;
+import javax.servlet.jsp.PageContext;
+
+/**
+ * @struts.action path="/exportEntries" name="weblogQueryForm" 
+ *    scope="request" parameter="method"
+ * 
+ * @author lance.lavandowska
+ */
+public class ExportEntriesAction extends DispatchAction
+{
+    private SimpleDateFormat dayFormat = new SimpleDateFormat("yyyyMMdd");
+    private SimpleDateFormat monthFormat = new SimpleDateFormat("yyyyMM");
+    private SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy");
+
+    public ActionForward unspecified(
+                              ActionMapping       mapping,
+                              ActionForm          actionForm,
+                              HttpServletRequest  request,
+                              HttpServletResponse response)
+    throws IOException, ServletException
+    {
+        return edit(mapping, actionForm, request, response);
+    }
+    
+    /**
+     * Prepare the form for selecting date-range to export.
+     * 
+     * @param mapping
+     * @param actionForm
+     * @param request
+     * @param response
+     * @return
+     * @throws IOException
+     * @throws ServletException
+     */
+    public ActionForward edit(
+                              ActionMapping       mapping,
+                              ActionForm          actionForm,
+                              HttpServletRequest  request,
+                              HttpServletResponse response)
+    throws IOException, ServletException
+    {
+        ActionForward forward = mapping.findForward("exportEntries.page");
+        try
+        {
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            if ( !rreq.isUserAuthorizedToEdit() )
+            {
+                forward = mapping.findForward("access-denied");
+            }
+            else
+            {
+                request.setAttribute("model",
+                    new BasePageModel(request, response, mapping));
+            }
+        }
+        catch (Exception e)
+        {
+            request.getSession().getServletContext().log("ERROR",e);
+            throw new ServletException(e);
+        }
+        return forward;
+    }
+
+    /**
+     * Export entries from the requested date-range to XML.
+     * 
+     * @param mapping
+     * @param actionForm
+     * @param request
+     * @param response
+     * @return
+     * @throws IOException
+     * @throws ServletException
+     */
+    public ActionForward export(
+                              ActionMapping       mapping,
+                              ActionForm          actionForm,
+                              HttpServletRequest  request,
+                              HttpServletResponse response)
+    throws IOException, ServletException
+    {
+        ActionForward forward = mapping.findForward("exportEntries.page");
+        try
+        {
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            WeblogQueryForm form = (WeblogQueryForm)actionForm;
+            if ( rreq.isUserAuthorizedToEdit() )
+            {               
+                request.setAttribute("model",
+                                     new BasePageModel(request, response, mapping));
+                
+                Locale locale = Locale.getDefault();//rreq.getWebsite().getLocaleInstance();
+                final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
+                Date startDate;
+                Date endDate;
+                try
+                {
+                    startDate = df.parse(form.getStartDateString());
+                    endDate = df.parse(form.getEndDateString());
+                }
+                catch (ParseException e)
+                {
+                    throw new RollerException("ERROR parsing date:" + e.getMessage());
+                }
+                
+                if (startDate != null && endDate != null) 
+                {
+                    // this work should go into a Thread!
+                    WeblogManager weblogMgr =
+                        rreq.getRoller().getWeblogManager();
+                    
+                    //List entries = weblogMgr.getWeblogEntriesInDateRange(
+                        //rreq.getUser().getUserName(), null, startDate, endDate, false);
+                    //System.out.println("Export: got " + entries.size() + " entries.");
+                    
+                    List entries = weblogMgr.getWeblogEntries(
+                                    rreq.getWebsite(), // userName
+                                    startDate,         // startDate
+                                    endDate,           // endDate
+                                    null,              // catName
+                                    WeblogManager.ALL,  // status
+                                    null);              // maxEntries
+
+                    ActionMessages messages = writeSuccessMessage(request, response, rreq, form);
+
+                    // seperate the entries as specified: day, month, year
+                    Map entryMap = seperateByPeriod(entries, form.getFileBy());
+
+                    // now export each List in the entryMap
+                    ExportRss exporter = new ExportRss(rreq.getWebsite());
+                    String exportTo = form.getExportFormat().toLowerCase();
+                    if ("atom".equals(exportTo))
+                    {
+                        exporter.setExportAtom(true);
+                    }
+                    ArrayList fileNames = new ArrayList();
+                    Iterator it = entryMap.keySet().iterator();
+                    while(it.hasNext())
+                    {
+                        String key = (String)it.next();
+                        ArrayList list = (ArrayList)entryMap.get(key);
+                        exporter.exportEntries(list, key+"_"+exportTo+".xml");
+                        fileNames.add("Exported " + list.size() + " entry(s) to " + key+"_"+exportTo+".xml<br />");
+                        //System.out.println("Exported: " + list.size() + " entries for " + key);
+                    }
+                    
+                    StringBuffer fileMessage = new StringBuffer();
+                    it = fileNames.iterator();
+                    while (it.hasNext())
+                    {
+                        fileMessage.append((String)it.next());
+                    }
+                    if (fileMessage.length() > 0) 
+                    {
+                        messages.add(ActionMessages.GLOBAL_MESSAGE, 
+                                     new ActionMessage("weblogEntryExport.exportFiles", 
+                                                       fileMessage.toString()));
+                    }
+                    saveMessages(request, messages);
+                }
+                else
+                {
+                    form.reset(mapping, (ServletRequest)request);
+                    return edit(mapping, actionForm, request, response);
+                }
+
+                //forward = mapping.findForward("exportEntries.done");
+            }
+            else
+            {    
+                forward = mapping.findForward("access-denied");
+            }
+        }
+        catch (Exception e)
+        {
+            request.getSession().getServletContext().log("ERROR",e);
+            throw new ServletException(e);
+        }
+        return forward;
+    }
+
+    /**
+     * Place entries into Lists, placed into date-related
+     * buckets.  The individual buckets may represent a
+     * day, month, or year, depending on which the user specified.
+     * 
+     * @param entries
+     * @return
+     */
+    private Map seperateByPeriod(List entries, String period)
+    {
+        HashMap map = new HashMap();
+        WeblogEntryData entry = null;
+        String key = null;
+        ArrayList list = null;
+        SimpleDateFormat formatter = monthFormat;
+        if ("year".equals(period))
+        {
+            formatter = yearFormat;
+        }
+        else if ("day".equals(period))
+        {
+            formatter = dayFormat;
+        }
+        
+        Iterator it = entries.iterator();
+        while (it.hasNext()) 
+        {
+            entry = (WeblogEntryData)it.next();
+            key = formatter.format(entry.getPubTime());
+            list = (ArrayList)map.get(key);
+            if (list == null)
+            {
+                list = new ArrayList();
+                map.put(key, list);
+            }
+            list.add(entry);
+        }
+        return map;
+    }
+
+    private ActionMessages writeSuccessMessage(
+                    HttpServletRequest request, 
+                    HttpServletResponse response, 
+                    RollerRequest rreq, 
+                    WeblogQueryForm form) throws MalformedURLException
+    {
+        PageContext pageContext =
+            JspFactory.getDefaultFactory().getPageContext( 
+                this.getServlet(), request, response, "", true, 8192, true);
+        Map params = new HashMap();
+        params.put( RollerRequest.USERNAME_KEY,  rreq.getUser().getUserName());
+        params.put("rmik", "Files");
+        String filesLink = RequestUtils.computeURL(
+             pageContext, (String)null, (String)null, (String)null,
+             "uploadFiles", params, (String)null, false);
+        
+        String message = 
+            "Exporting Entries from " + 
+            form.getStartDateString() + " to " +
+            form.getEndDateString() + ".<br />" +
+            "Check your <a href=\"" + filesLink + "\">Files</a>.";
+
+        ActionMessages messages = new ActionMessages();
+        messages.add(ActionMessages.GLOBAL_MESSAGE, 
+                     new ActionMessage("weblogEntryExport.exportSuccess", message));
+                                                                      
+        return messages;
+    }
+}

Added: incubator/roller/trunk/src/org/roller/presentation/weblog/actions/ImportEntriesAction.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/weblog/actions/ImportEntriesAction.java?rev=189602&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/weblog/actions/ImportEntriesAction.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/weblog/actions/ImportEntriesAction.java Wed Jun  8 09:06:16 2005
@@ -0,0 +1,166 @@
+/*
+ * Created on Mar 31, 2004
+ */
+package org.roller.presentation.weblog.actions;
+
+import org.apache.struts.action.ActionError;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.ActionMessage;
+import org.apache.struts.action.ActionMessages;
+import org.apache.struts.actions.DispatchAction;
+import org.roller.pojos.UserData;
+import org.roller.presentation.ArchiveParser;
+import org.roller.presentation.MainPageAction;
+import org.roller.presentation.RollerContext;
+import org.roller.presentation.RollerRequest;
+import org.roller.presentation.pagecache.PageCache;
+import org.roller.presentation.weblog.formbeans.ImportEntriesForm;
+import org.roller.util.StringUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @struts.action name="importEntries" path="/importEntries"
+ *                scope="request" parameter="method"
+ *
+ * @author lance.lavandowska
+ */
+public class ImportEntriesAction extends DispatchAction
+{
+    public ActionForward importEntries(
+                              ActionMapping       mapping,
+                              ActionForm          actionForm,
+                              HttpServletRequest  request,
+                              HttpServletResponse response)
+    throws IOException, ServletException
+    {
+        ActionForward forward = mapping.findForward("importEntries.page");
+        try
+        {
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            if ( !rreq.isUserAuthorizedToEdit() )
+            {
+                forward = mapping.findForward("access-denied");
+            }
+            else
+            {
+				getXmlFiles(actionForm, rreq);
+                ImportEntriesForm form = (ImportEntriesForm)actionForm;
+                if (StringUtils.isNotEmpty(form.getImportFileName()))
+                {
+                    // "default" values
+                    UserData user = rreq.getUser();
+
+                    // load selected file
+                    ServletContext app = this.getServlet().getServletConfig().getServletContext();
+                    String dir = RollerContext.getUploadDir( app );
+                    File f = new File(dir + user.getUserName() +
+                                      "/" + form.getImportFileName());
+
+                    ArchiveParser archiveParser =
+                        new ArchiveParser(rreq.getRoller(), rreq.getWebsite(), f);
+                    String parseMessages = archiveParser.parse();
+
+                    // buf will be non-zero if Entries were imported
+                    if (parseMessages.length() > 0)
+                    {
+                        ActionMessages notices = new ActionMessages();
+                        notices.add(ActionMessages.GLOBAL_MESSAGE, 
+                                     new ActionMessage("weblogEntryImport.importFiles", 
+                                                   parseMessages));
+                        saveMessages(request, notices);
+
+                        // Flush the page cache
+                        PageCache.removeFromCache( request, user );
+                        // refresh the front page cache
+                        MainPageAction.flushMainPageCache();
+                    }
+                    else
+                    {
+                        ActionErrors errors = new ActionErrors();
+                        errors.add(ActionErrors.GLOBAL_ERROR,
+                                   new ActionError("error.importing.entries", ""));
+                        saveErrors(request,errors);
+                    }
+                }
+            }
+        }
+        catch (Exception e)
+        {
+            request.getSession().getServletContext().log("ERROR",e);
+            throw new ServletException(e);
+        }
+        return forward;
+    }
+
+    /**
+     * Load list of XML files available for import.
+     * @param mapping
+     * @param actionForm
+     * @param request
+     * @param response
+     * @return
+     * @throws IOException
+     * @throws ServletException
+     */
+    public ActionForward edit(
+                              ActionMapping       mapping,
+                              ActionForm          actionForm,
+                              HttpServletRequest  request,
+                              HttpServletResponse response)
+    throws IOException, ServletException
+    {
+        ActionForward forward = mapping.findForward("importEntries.page");
+        try
+        {
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            if ( !rreq.isUserAuthorizedToEdit() )
+            {
+                forward = mapping.findForward("access-denied");
+            }
+            else
+            {
+				getXmlFiles(actionForm, rreq);
+            }
+        }
+        catch (Exception e)
+        {
+            request.getSession().getServletContext().log("ERROR",e);
+            throw new ServletException(e);
+        }
+        return forward;
+    }
+
+    private void getXmlFiles(ActionForm actionForm, RollerRequest rreq)
+    {
+		ServletContext app = this.getServlet().getServletConfig().getServletContext();
+		String dir = RollerContext.getUploadDir( app );
+		File d = new File(dir + rreq.getUser().getUserName());
+		ArrayList xmlFiles = new ArrayList();
+		if (d.mkdirs() || d.exists())
+		{
+			File[] files = d.listFiles();
+			for (int i=0; i<files.length; i++)
+			{
+				if (!files[i].isDirectory() &&
+					files[i].getName().toLowerCase().endsWith(".xml"))
+					// TODO : later change detection to use FileInfo
+				{
+					xmlFiles.add(files[i].getName());
+				}
+			}
+		}
+		ImportEntriesForm form = (ImportEntriesForm)actionForm;
+		form.setXmlFiles(xmlFiles);
+	}
+}

Added: incubator/roller/trunk/src/org/roller/presentation/weblog/actions/ReferersAction.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/weblog/actions/ReferersAction.java?rev=189602&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/weblog/actions/ReferersAction.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/weblog/actions/ReferersAction.java Wed Jun  8 09:06:16 2005
@@ -0,0 +1,150 @@
+
+package org.roller.presentation.weblog.actions;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.struts.action.ActionError;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.ActionMessage;
+import org.apache.struts.action.ActionMessages;
+import org.apache.struts.actions.DispatchAction;
+import org.roller.model.RefererManager;
+import org.roller.pojos.UserData;
+import org.roller.pojos.WebsiteData;
+import org.roller.presentation.RollerRequest;
+
+import java.util.List;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Display today's referers.
+ * @struts.action name="refererForm" path="/referers"
+ *      scope="session" parameter="method"
+ */
+public class ReferersAction extends DispatchAction
+{    
+    private static Log mLogger = 
+        LogFactory.getFactory().getInstance(ReferersAction.class);
+        
+    public ActionForward unspecified(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws Exception
+    {
+        return view(mapping, actionForm, request, response);
+    }
+    
+    /**
+     * execute
+     */
+    public ActionForward view(
+        ActionMapping mapping, ActionForm form,
+        HttpServletRequest req, HttpServletResponse res)
+        throws Exception
+    {
+        ActionForward forward = mapping.findForward("referers.page");
+        RollerRequest rreq = RollerRequest.getRollerRequest(req);
+        RefererManager refmgr = rreq.getRoller().getRefererManager();
+        try
+        {
+            if ( rreq.isUserAuthorizedToEdit() )
+            {
+                UserData ud = rreq.getUser();
+                
+                req.setAttribute("pageHits",
+                    new Integer(refmgr.getDayHits(rreq.getWebsite())));
+                    
+                req.setAttribute("totalHits",
+                    new Integer(refmgr.getTotalHits(rreq.getWebsite())));
+                    
+                List refs = refmgr.getTodaysReferers(rreq.getWebsite());
+                req.setAttribute("referers",refs);        
+            }
+        }
+        catch (Exception e)
+        {
+            mLogger.error("ERROR in action",e);
+            throw new ServletException(e);
+        }
+        
+        return forward;
+    }
+    
+    public ActionForward reset(
+        ActionMapping mapping, ActionForm form,
+        HttpServletRequest req, HttpServletResponse res)
+        throws Exception
+    {
+        this.servlet.log("ReferersAction.reset()");
+        RollerRequest rreq = RollerRequest.getRollerRequest(req);
+        try
+        {
+            if ( rreq.isUserAuthorizedToEdit() )
+            {
+                RefererManager refmgr = rreq.getRoller().getRefererManager();
+                WebsiteData website = rreq.getWebsite();
+                refmgr.forceTurnover(website.getId());
+                rreq.getRoller().commit();
+            }
+            this.servlet.log("ReferersAction.reset(): don't have permission");
+        }
+        catch (Exception e)
+        {
+            mLogger.error("ERROR in action",e);
+            throw new ServletException(e);
+        }
+        return view(mapping, form, req, res);
+    }
+    
+    public ActionForward delete(
+            ActionMapping mapping, ActionForm form,
+            HttpServletRequest req, HttpServletResponse res)
+        throws Exception
+    {
+        //this.servlet.log("ReferersAction.delete()");
+        RollerRequest rreq = RollerRequest.getRollerRequest(req);
+        try
+        {
+            if ( rreq.isUserAuthorizedToEdit() )
+            {
+                RefererManager refmgr = rreq.getRoller().getRefererManager();
+                WebsiteData website = rreq.getWebsite();
+
+                String[] deleteIds = req.getParameterValues("id");
+                if (deleteIds != null)
+                {
+                    for (int i=0; i<deleteIds.length; i++)
+                    {
+                        refmgr.removeReferer(deleteIds[i]);
+                    }
+                    rreq.getRoller().commit();
+                    ActionMessages messages = new ActionMessages();
+                    messages.add(null, new ActionMessage("referers.deletedReferers"));
+                    saveMessages(req, messages);
+                }
+                else 
+                {
+                    ActionErrors errors = new ActionErrors();
+                    errors.add(null, new ActionError("referers.noReferersSpecified"));
+                    saveErrors(req, errors);
+                }
+            }
+            //this.servlet.log("ReferersAction.delete(): don't have permission");
+        }
+        catch (Exception e)
+        {
+            mLogger.error("ERROR in action",e);
+            throw new ServletException(e);
+        }
+        return view(mapping, form, req, res);
+    }
+}
+

Added: incubator/roller/trunk/src/org/roller/presentation/weblog/actions/ToggleLinkbackDisplayAction.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/weblog/actions/ToggleLinkbackDisplayAction.java?rev=189602&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/weblog/actions/ToggleLinkbackDisplayAction.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/weblog/actions/ToggleLinkbackDisplayAction.java Wed Jun  8 09:06:16 2005
@@ -0,0 +1,84 @@
+package org.roller.presentation.weblog.actions;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.roller.model.RefererManager;
+import org.roller.pojos.RefererData;
+import org.roller.presentation.RollerContext;
+import org.roller.presentation.RollerRequest;
+import org.roller.presentation.pagecache.PageCache;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+
+/**
+ * Toggle display of a linkback.
+ * @struts.action name="toggleLinkback" path="/toggleLinkback" scope="session"
+ */
+public class ToggleLinkbackDisplayAction extends Action
+{
+    private static Log mLogger = LogFactory.getFactory().getInstance(
+        ToggleLinkbackDisplayAction.class);
+        
+	/**
+	 * execute
+     */
+	public ActionForward execute(
+		ActionMapping mapping, ActionForm form,
+		HttpServletRequest req, HttpServletResponse res)
+		throws Exception
+	{
+         
+        RollerRequest rreq = RollerRequest.getRollerRequest(req);
+        String userName = rreq.getUser().getUserName();
+
+        try
+        {
+            if ( rreq.isUserAuthorizedToEdit() )
+            {
+                String refid = req.getParameter(RollerRequest.REFERERID_KEY);
+                if ( refid != null )
+                {
+                    RefererManager refmgr = 
+                        rreq.getRoller().getRefererManager();                        
+                    RefererData ref = refmgr.retrieveReferer(refid);                    
+                    ref.setVisible( 
+                        Boolean.valueOf( !ref.getVisible().booleanValue() ));                       
+                    ref.save();
+                    
+                    rreq.getRoller().commit();
+                    
+                    PageCache.removeFromCache( req, rreq.getUser() );
+                }                
+            }
+        }
+        catch (Exception e)
+        {
+            mLogger.error("Toggling linkback display",e);
+            throw new ServletException(e);
+        }
+        
+        // forward to user's website URL
+		String url = null;
+		try
+		{
+			RollerContext rctx = RollerContext.getRollerContext(
+				rreq.getServletContext());
+			url = rctx.getContextUrl( req, userName);
+			res.sendRedirect(url);
+		}
+		catch (Exception e)
+		{
+			mLogger.error("Unexpected exception",e);
+		}
+
+        return null;
+	}
+}
+