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 2006/05/02 00:23:34 UTC

svn commit: r398712 [24/32] - in /incubator/roller/trunk/src/org/apache: ./ roller/ roller/business/ roller/business/hibernate/ roller/business/referrers/ roller/business/runnable/ roller/business/search/ roller/business/search/operations/ roller/busin...

Added: incubator/roller/trunk/src/org/apache/roller/presentation/weblog/actions/WeblogEntryFormAction.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/apache/roller/presentation/weblog/actions/WeblogEntryFormAction.java?rev=398712&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/presentation/weblog/actions/WeblogEntryFormAction.java (added)
+++ incubator/roller/trunk/src/org/apache/roller/presentation/weblog/actions/WeblogEntryFormAction.java Mon May  1 15:23:02 2006
@@ -0,0 +1,842 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+*  contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+
+package org.apache.roller.presentation.weblog.actions;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLEncoder;
+import java.sql.Timestamp;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.ResourceBundle;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.mail.MessagingException;
+import javax.mail.Session;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+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.apache.struts.util.RequestUtils;
+import org.apache.velocity.VelocityContext;
+import org.apache.roller.RollerException;
+import org.apache.roller.RollerPermissionsException;
+import org.apache.roller.config.RollerConfig;
+import org.apache.roller.model.IndexManager;
+import org.apache.roller.model.PagePluginManager;
+import org.apache.roller.model.Roller;
+import org.apache.roller.model.RollerFactory;
+import org.apache.roller.model.UserManager;
+import org.apache.roller.model.WeblogManager;
+import org.apache.roller.pojos.CommentData;
+import org.apache.roller.pojos.PermissionsData;
+import org.apache.roller.pojos.UserData;
+import org.apache.roller.pojos.WeblogEntryData;
+import org.apache.roller.pojos.WebsiteData;
+import org.apache.roller.presentation.RollerContext;
+import org.apache.roller.presentation.RollerRequest;
+import org.apache.roller.presentation.RollerSession;
+import org.apache.roller.presentation.cache.CacheManager;
+import org.apache.roller.presentation.weblog.formbeans.WeblogEntryFormEx;
+import org.apache.roller.util.MailUtil;
+import org.apache.roller.util.StringUtils;
+import org.apache.roller.util.Utilities;
+
+
+
+/////////////////////////////////////////////////////////////////////////////
+/**
+ * Supports Weblog Entry form actions edit, remove, update, etc.
+ *
+ * @struts.action name="weblogEntryFormEx" path="/editor/weblog"
+ *     scope="request" parameter="method"
+ *
+ * @struts.action-forward name="weblogEdit.page" path=".WeblogEdit"
+ * @struts.action-forward name="weblogEntryRemove.page" path=".WeblogEntryRemove"
+ */
+public final class WeblogEntryFormAction extends DispatchAction {
+    private static Log mLogger =
+            LogFactory.getFactory().getInstance(WeblogEntryFormAction.class);
+    
+    //-----------------------------------------------------------------------
+    /**
+     * Allow user to create a new weblog entry.
+     */
+    public ActionForward create(
+            ActionMapping       mapping,
+            ActionForm          actionForm,
+            HttpServletRequest  request,
+            HttpServletResponse response)
+            throws IOException, ServletException {
+        ActionForward forward = mapping.findForward("weblogEdit.page");
+        try {
+            RollerSession rses = RollerSession.getRollerSession(request);
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            if (rreq.getWebsite() != null
+                    && rses.isUserAuthorized(rreq.getWebsite())) {
+                WeblogEntryFormEx form = (WeblogEntryFormEx)actionForm;
+                form.initNew(request, response);
+                form.setCreatorId(rses.getAuthenticatedUser().getId());
+                form.setWebsiteId(rreq.getWebsite().getId());
+                form.setAllowComments(rreq.getWebsite().getDefaultAllowComments());
+                form.setCommentDays(new Integer(rreq.getWebsite().getDefaultCommentDays()));
+                
+                request.setAttribute("model",
+                        new WeblogEntryPageModel(request, response, mapping,
+                        (WeblogEntryFormEx)actionForm,
+                        WeblogEntryPageModel.EDIT_MODE));
+            } else {
+                forward = mapping.findForward("access-denied");
+            }
+        } catch (Exception e) {
+            request.getSession().getServletContext().log("ERROR",e);
+            throw new ServletException(e);
+        }
+        return forward;
+    }
+    
+    //-----------------------------------------------------------------------
+    /**
+     * Allow user to edit a weblog entry.
+     */
+    public ActionForward edit(
+            ActionMapping       mapping,
+            ActionForm          actionForm,
+            HttpServletRequest  request,
+            HttpServletResponse response)
+            throws IOException, ServletException {
+        ActionForward forward = mapping.findForward("weblogEdit.page");
+        try {
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            RollerSession rses = RollerSession.getRollerSession(request);
+            WeblogManager wmgr = RollerFactory.getRoller().getWeblogManager();
+            WeblogEntryData entry = rreq.getWeblogEntry();
+            WeblogEntryFormEx form = (WeblogEntryFormEx)actionForm;
+            if (entry == null && form.getId() != null) {
+                entry = wmgr.getWeblogEntry(form.getId());
+            }
+            if (entry == null) {
+                ResourceBundle resources = ResourceBundle.getBundle(
+                        "ApplicationResources", request.getLocale());
+                request.setAttribute("javax.servlet.error.message",
+                        resources.getString("weblogEntry.notFound"));
+                forward = mapping.findForward("error");
+            } else if (rses.isUserAuthorized(entry.getWebsite())
+            || (rses.isUserAuthorized(entry.getWebsite()) && !entry.isPublished())) {
+                form.copyFrom(entry, request.getLocale());
+                WeblogEntryPageModel pageModel = new WeblogEntryPageModel(
+                        request, response, mapping, form,
+                        WeblogEntryPageModel.EDIT_MODE);
+                pageModel.setWebsite(entry.getWebsite());
+                request.setAttribute("model", pageModel);
+            } else {
+                forward = mapping.findForward("access-denied");
+            }
+        } catch (Exception e) {
+            request.getSession().getServletContext().log("ERROR",e);
+            throw new ServletException(e);
+        }
+        return forward;
+    }
+    
+    //-----------------------------------------------------------------------
+    public ActionForward preview(
+            ActionMapping       mapping,
+            ActionForm          actionForm,
+            HttpServletRequest  request,
+            HttpServletResponse response)
+            throws IOException, ServletException {
+        // we need to save any new entries before Previewing
+        WeblogEntryFormEx form = (WeblogEntryFormEx)actionForm;
+        if (form.getId() == null) {
+            save(mapping, actionForm, request, response);
+        }
+        return display(WeblogEntryPageModel.PREVIEW_MODE,
+                mapping, actionForm, request, response);
+    }
+    
+    //-----------------------------------------------------------------------
+    public ActionForward returnToEditMode(
+            ActionMapping       mapping,
+            ActionForm          actionForm,
+            HttpServletRequest  request,
+            HttpServletResponse response)
+            throws IOException, ServletException {
+        return display(WeblogEntryPageModel.EDIT_MODE,
+                mapping, actionForm, request, response);
+    }
+    
+    //-----------------------------------------------------------------------
+    private ActionForward display(
+            WeblogEntryPageModel.PageMode mode,
+            ActionMapping       mapping,
+            ActionForm          actionForm,
+            HttpServletRequest  request,
+            HttpServletResponse response)
+            throws IOException, ServletException {
+        ActionForward forward = mapping.findForward("weblogEdit.page");
+        try {
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            RollerSession rollerSession =
+                    RollerSession.getRollerSession(request);
+            WeblogEntryPageModel pageModel = new WeblogEntryPageModel(
+                    request, response, mapping, (WeblogEntryFormEx)actionForm, mode);
+            if (rollerSession.isUserAuthorized(
+                    pageModel.getWeblogEntry().getWebsite())) {
+                request.setAttribute("model", pageModel);
+            } else {
+                forward = mapping.findForward("access-denied");
+            }
+        } catch (Exception e) {
+            request.getSession().getServletContext().log("ERROR",e);
+            throw new ServletException(e);
+        }
+        return forward;
+    }
+    
+    //-----------------------------------------------------------------------
+    /**
+     * Saves weblog entry and flushes page cache so that new entry will appear
+     * on users weblog page.
+     */
+    public ActionForward save(
+            ActionMapping       mapping,
+            ActionForm          actionForm,
+            HttpServletRequest  request,
+            HttpServletResponse response)
+            throws IOException, ServletException {
+        
+        ActionForward forward = mapping.findForward("weblogEdit.page");
+        ActionMessages uiMessages = new ActionMessages();
+        try {
+            WeblogEntryFormEx  form = (WeblogEntryFormEx)actionForm;
+            Roller           roller = RollerFactory.getRoller();
+            RollerSession      rses = RollerSession.getRollerSession(request);
+            UserManager     userMgr = roller.getUserManager();
+            WeblogManager weblogMgr = roller.getWeblogManager();
+            UserData           ud  = userMgr.getUser(form.getCreatorId());
+            WebsiteData       site = userMgr.getWebsite(form.getWebsiteId());
+            WeblogEntryData  entry = null;
+            
+            if ( rses.isUserAuthorizedToAuthor(site)
+            || (rses.isUserAuthorized(site)
+            && !form.getStatus().equals(WeblogEntryData.PUBLISHED) )) {
+                
+                ActionErrors errors = validateEntry(null, form);
+                if (errors.size() > 0) {
+                    saveErrors(request, errors);
+                    request.setAttribute("model",
+                            new WeblogEntryPageModel(request, response, mapping,
+                            (WeblogEntryFormEx)actionForm,
+                            WeblogEntryPageModel.EDIT_MODE));
+                    return forward;
+                }
+                
+                if (form.getId() == null || form.getId().trim().length()==0) {
+                    entry = new WeblogEntryData();
+                    entry.setCreator(ud);
+                    entry.setWebsite( site );
+                } else {
+                    entry = weblogMgr.getWeblogEntry(form.getId());
+                }
+                
+                mLogger.debug("setting update time now");
+                form.setUpdateTime(new Timestamp(new Date().getTime()));
+                
+                if ("PUBLISHED".equals(form.getStatus()) &&
+                        "0/0/0".equals(form.getDateString())) {
+                    mLogger.debug("setting pubtime now");
+                    
+                    /* NOTE: the wf.copyTo() method will override this value
+                     * based on data submitted with the form if that data is
+                     * not null.  check the method to verify.
+                     *
+                     * this means that setting the pubtime here only takes
+                     * effect if the entry is being published for the first
+                     * time.
+                     */
+                    form.setPubTime(form.getUpdateTime());
+                }
+                
+                mLogger.debug("copying submitted form data to entry object");
+                form.copyTo(entry, request.getLocale(),request.getParameterMap());
+                
+                // Fetch MediaCast content type and length
+                mLogger.debug("Checking MediaCast attributes");
+                if (!checkMediaCast(entry, uiMessages)) {
+                    mLogger.debug("Invalid MediaCast attributes");
+                } else {
+                    mLogger.debug("Validated MediaCast attributes");
+                }
+                
+                // Store value object (creates new or updates existing)
+                entry.setUpdateTime(new Timestamp(new Date().getTime()));
+                
+                // make sure we have an anchor value set
+                if(entry.getAnchor() == null || entry.getAnchor().trim().equals("")) {
+                    entry.setAnchor(weblogMgr.createAnchor(entry));
+                }
+
+                mLogger.debug("Saving entry");
+                weblogMgr.saveWeblogEntry(entry);
+                RollerFactory.getRoller().flush();
+                
+                mLogger.debug("Populating form");
+                form.copyFrom(entry, request.getLocale());
+                
+                request.setAttribute(
+                        RollerRequest.WEBLOGENTRYID_KEY, entry.getId());
+                
+                // Reindex entry, flush caches, etc.
+                reindexEntry(RollerFactory.getRoller(), entry);
+                mLogger.debug("Removing from cache");
+                RollerRequest rreq = RollerRequest.getRollerRequest(request);
+                //PageCacheFilter.removeFromCache(request, entry.getWebsite());
+                CacheManager.invalidate(entry);
+                
+                // Queue applicable pings for this update.
+                if(entry.isPublished()) {
+                    RollerFactory.getRoller().getAutopingManager().queueApplicableAutoPings(entry);
+                }
+                
+                // Clean up session objects we used
+                HttpSession session = request.getSession(true);
+                session.removeAttribute("spellCheckEvents");
+                session.removeAttribute("entryText");
+                
+                // Load up request with data for view
+                request.setAttribute("model",
+                        new WeblogEntryPageModel(request, response, mapping,
+                        (WeblogEntryFormEx)actionForm,
+                        WeblogEntryPageModel.EDIT_MODE));
+                
+                if (!rses.isUserAuthorizedToAuthor(site) &&
+                        rses.isUserAuthorized(site) && entry.isPending()) {
+                    // implies that entry just changed to pending
+                    notifyWebsiteAuthorsOfPendingEntry(request, entry);
+                    uiMessages.add(null,
+                            new ActionMessage("weblogEdit.submittedForReview"));
+                    
+                    // so clear entry from editor
+                    actionForm = new WeblogEntryFormEx();
+                    request.setAttribute(mapping.getName(), actionForm);
+                    forward = create(mapping, actionForm, request, response);
+                } else {
+                    uiMessages.add(null,
+                            new ActionMessage("weblogEdit.changesSaved"));
+                }
+                saveMessages(request, uiMessages);
+                mLogger.debug("operation complete");
+                
+            } else {
+                forward = mapping.findForward("access-denied");
+            }
+        } catch (RollerPermissionsException e) {
+            ActionErrors errors = new ActionErrors();
+            errors.add(null, new ActionError("error.permissions.deniedSave"));
+            saveErrors(request, errors);
+            forward = mapping.findForward("access-denied");
+        } catch (Exception e) {
+            throw new ServletException(e);
+        }
+        return forward;
+    }
+    
+    /**
+     * Inform authors and admins of entry's website that entry is pending.
+     * @param entry
+     * @throws RollerException
+     * @throws MalformedURLException
+     */
+    private void notifyWebsiteAuthorsOfPendingEntry(
+            HttpServletRequest request, WeblogEntryData entry) {
+        try {
+            Roller roller = RollerFactory.getRoller();
+            UserManager umgr = roller.getUserManager();
+            javax.naming.Context ctx = (javax.naming.Context)
+            new InitialContext().lookup("java:comp/env");
+            Session mailSession =
+                    (Session)ctx.lookup("mail/Session");
+            if (mailSession != null) {
+                String userName = entry.getCreator().getUserName();
+                String from = entry.getCreator().getEmailAddress();
+                String cc[] = new String[] {from};
+                String bcc[] = new String[0];
+                String to[];
+                String subject;
+                String content;
+                
+                // list of enabled website authors and admins
+                ArrayList reviewers = new ArrayList();
+                List websiteUsers =
+                        umgr.getUsers(entry.getWebsite(), Boolean.TRUE);
+                
+                // build list of reviewers (website users with author permission)
+                Iterator websiteUserIter = websiteUsers.iterator();
+                while (websiteUserIter.hasNext()) {
+                    UserData websiteUser = (UserData)websiteUserIter.next();
+                    if (entry.getWebsite().hasUserPermissions(
+                            websiteUser, PermissionsData.AUTHOR)
+                            && websiteUser.getEmailAddress() != null) {
+                        reviewers.add(websiteUser.getEmailAddress());
+                    }
+                }
+                to = (String[])reviewers.toArray(new String[reviewers.size()]);
+                
+                // Figure URL to entry edit page
+                RollerContext rc = RollerContext.getRollerContext();
+                String rootURL = rc.getAbsoluteContextUrl(request);
+                if (rootURL == null || rootURL.trim().length()==0) {
+                    rootURL = RequestUtils.serverURL(request)
+                    + request.getContextPath();
+                }
+                String editURL = rootURL
+                        + "/editor/weblog.do?method=edit&entryid=" + entry.getId();
+                
+                ResourceBundle resources = ResourceBundle.getBundle(
+                        "ApplicationResources", request.getLocale());
+                StringBuffer sb = new StringBuffer();
+                sb.append(
+                        MessageFormat.format(
+                        resources.getString("weblogEntry.pendingEntrySubject"),
+                        new Object[] {
+                    entry.getWebsite().getName(),
+                    entry.getWebsite().getHandle()
+                }));
+                subject = sb.toString();
+                sb = new StringBuffer();
+                sb.append(
+                        MessageFormat.format(
+                        resources.getString("weblogEntry.pendingEntryContent"),
+                        new Object[] { userName, userName, editURL })
+                        );
+                content = sb.toString();
+                MailUtil.sendTextMessage(
+                        mailSession, from, to, cc, bcc, subject, content);
+            }
+        } catch (NamingException e) {
+            mLogger.error("ERROR: Notification email(s) not sent, "
+                    + "Roller's mail session not properly configured");
+        } catch (MessagingException e) {
+            mLogger.error("ERROR: Notification email(s) not sent, "
+                    + "due to Roller configuration or mail server problem.");
+        } catch (MalformedURLException e) {
+            mLogger.error("ERROR: Notification email(s) not sent, "
+                    + "Roller site URL is malformed?");
+        } catch (RollerException e) {
+            throw new RuntimeException(
+                    "FATAL ERROR: unable to find Roller object");
+        }
+    }
+    
+    private boolean checkMediaCast(WeblogEntryData entry, ActionMessages uiMessages) {
+        boolean valid = false;
+        String url = entry.findEntryAttribute("att_mediacast_url");
+        boolean empty = (url == null) || (url.trim().length() == 0);
+        if (!empty) {
+            // fetch MediaCast content type and length
+            valid = false;
+            try {
+                mLogger.debug("Sending HTTP HEAD");
+                HttpURLConnection con = (HttpURLConnection)
+                new URL(url).openConnection();
+                mLogger.debug("Getting response code");
+                con.setRequestMethod("HEAD");
+                if (con.getResponseCode() != 200) {
+                    mLogger.debug("Response code indicates error");
+                    mLogger.error("ERROR " + con.getResponseCode() + " return from MediaCast URL");
+                    uiMessages.add(null,new ActionMessage("weblogEdit.mediaCastResponseError"));
+                } else if (con.getContentType()==null || con.getContentLength()==-1) {
+                    mLogger.debug("Content type + (" + con.getContentType()  + " is null or content length (" +
+                            con.getContentLength() + ") is -1 (indeterminate).");
+                    uiMessages.add(null,new ActionMessage("weblogEdit.mediaCastLacksContentTypeOrLength"));
+                } else {
+                    if (mLogger.isDebugEnabled()) {
+                        mLogger.debug("Got good response: Content type " +
+                                con.getContentType() + " [length = " + con.getContentLength() + "]" );
+                    }
+                    entry.putEntryAttribute(
+                            "att_mediacast_type", con.getContentType());
+                    entry.putEntryAttribute(
+                            "att_mediacast_length", ""+con.getContentLength());
+                    valid = true;
+                }
+            } catch (MalformedURLException mfue) {
+                mLogger.debug("Malformed MediaCast url: " + url);
+                uiMessages.add(null, new ActionMessage("weblogEdit.mediaCastUrlMalformed"));
+            } catch (Exception e) {
+                mLogger.error("ERROR while checking MediaCast URL: " + url + ": " + e.getMessage());
+                uiMessages.add(null, new ActionMessage("weblogEdit.mediaCastFailedFetchingInfo"));
+            }
+        } else {
+            mLogger.debug("No MediaCast specified, but that is OK");
+            valid = true;
+        }
+        if (!valid || empty) {
+            mLogger.debug("Removing MediaCast attributes");
+            try {
+                entry.removeEntryAttribute("att_mediacast_url");
+                entry.removeEntryAttribute("att_mediacast_type");
+                entry.removeEntryAttribute("att_mediacast_length");
+            } catch (RollerException e) {
+                mLogger.error("ERROR removing invalid MediaCast attributes");
+            }
+        }
+        mLogger.debug("operation complete");
+        return valid;
+    }
+    
+    
+    //-----------------------------------------------------------------------
+    /**
+     * Responds to request to remove weblog entry. Forwards user to page
+     * that presents the 'are you sure?' question.
+     */
+    public ActionForward removeOk(
+            ActionMapping       mapping,
+            ActionForm          actionForm,
+            HttpServletRequest  request,
+            HttpServletResponse response)
+            throws IOException, ServletException {
+        ActionForward forward = mapping.findForward("weblogEntryRemove.page");
+        try {
+            Roller roller = RollerFactory.getRoller();
+            WeblogEntryFormEx wf = (WeblogEntryFormEx)actionForm;
+            WeblogEntryData wd =
+                    roller.getWeblogManager().getWeblogEntry(wf.getId());
+            RollerSession rses =
+                    RollerSession.getRollerSession(request);
+            if (     rses.isUserAuthorizedToAuthor(wd.getWebsite())
+            || (rses.isUserAuthorized(wd.getWebsite()) && wd.isDraft()) ) {
+                wf.copyFrom(wd, request.getLocale());
+                if (wd == null || wd.getId() == null) {
+                    ResourceBundle resources = ResourceBundle.getBundle(
+                            "ApplicationResources", request.getLocale());
+                    request.setAttribute("javax.servlet.error.message",
+                            resources.getString("weblogEntry.notFound"));
+                    forward = mapping.findForward("error");
+                }
+            } else {
+                forward = mapping.findForward("access-denied");
+            }
+        } catch (Exception e) {
+            throw new ServletException(e);
+        }
+        return forward;
+    }
+    
+    //-----------------------------------------------------------------------
+    /**
+     * Responds to request from the 'are you sure you want to remove?' page.
+     * Removes the specified weblog entry and flushes the cache.
+     */
+    public ActionForward remove(
+            ActionMapping       mapping,
+            ActionForm          actionForm,
+            HttpServletRequest  request,
+            HttpServletResponse response)
+            throws IOException, ServletException {
+        try {
+            WeblogManager mgr = RollerFactory.getRoller().getWeblogManager();
+            WeblogEntryData wd =
+                    mgr.getWeblogEntry(request.getParameter("id"));
+            RollerSession rses =
+                    RollerSession.getRollerSession(request);
+            if (     rses.isUserAuthorizedToAuthor(wd.getWebsite())
+            || (rses.isUserAuthorized(wd.getWebsite()) && wd.isDraft()) ) {
+                
+                // remove the index for it
+                // TODO: can we do this in a better way?
+                wd.setStatus(WeblogEntryData.DRAFT);
+                reindexEntry(RollerFactory.getRoller(), wd);
+                
+                // remove entry itself
+                mgr.removeWeblogEntry(wd);
+                RollerFactory.getRoller().flush();
+                
+                // flush caches
+                CacheManager.invalidate(wd);
+                
+                ActionMessages uiMessages = new ActionMessages();
+                uiMessages.add(null,
+                        new ActionMessage("weblogEdit.entryRemoved"));
+                saveMessages(request, uiMessages);
+                
+                RollerRequest.getRollerRequest().setWebsite(wd.getWebsite());
+            } else {
+                return mapping.findForward("access-denied");
+            }
+        } catch (Exception e) {
+            throw new ServletException(e); 
+        }
+        
+        // need to reset all values to empty (including 'id')
+        actionForm = new WeblogEntryFormEx();
+        actionForm.reset(mapping, request);
+        request.setAttribute(mapping.getName(), actionForm);
+        return create(mapping, actionForm, request, response);
+    }
+    
+    /**
+     *
+     */
+    public ActionForward sendTrackback(
+            ActionMapping mapping,
+            ActionForm actionForm,
+            HttpServletRequest request,
+            HttpServletResponse response) throws RollerException {
+        ActionMessages resultMsg = new ActionMessages();
+        ActionForward forward = mapping.findForward("weblogEdit.page");
+        ActionErrors errors = new ActionErrors();
+        WeblogEntryData entry = null;
+        try {
+            WeblogEntryFormEx form = (WeblogEntryFormEx)actionForm;
+            String entryid = form.getId();
+            if ( entryid == null ) {
+                entryid =
+                        request.getParameter(RollerRequest.WEBLOGENTRYID_KEY);
+            }
+            Roller roller = RollerFactory.getRoller();
+            RollerContext rctx= RollerContext.getRollerContext();
+            WeblogManager wmgr= roller.getWeblogManager();
+            entry = wmgr.getWeblogEntry(entryid);
+            
+            RollerSession rses = RollerSession.getRollerSession(request);
+            if (rses.isUserAuthorizedToAuthor(entry.getWebsite())) {
+                // Run entry through registered PagePlugins
+                PagePluginManager ppmgr = roller.getPagePluginManager();
+                Map plugins = ppmgr.createAndInitPagePlugins(
+                        entry.getWebsite(),
+                        RollerContext.getRollerContext().getServletContext(),
+                        RollerContext.getRollerContext().getAbsoluteContextUrl(),
+                        new VelocityContext());
+                
+                String content = "";
+                if (!StringUtils.isEmpty(entry.getText())) {
+                    content = entry.getText();
+                } else {
+                    content = entry.getSummary();
+                }
+                content = ppmgr.applyPagePlugins(entry, plugins, content, true);
+
+                String title = entry.getTitle();
+                String excerpt = StringUtils.left( Utilities.removeHTML(content),255 );
+                
+                String url = rctx.createEntryPermalink(entry, request, true);
+                String blog_name = entry.getWebsite().getName();
+                
+                if (form.getTrackbackUrl() != null) {
+                    // by default let all trackbacks to be sent
+                    boolean allowTrackback = true;
+                    
+                    String allowedURLs = RollerConfig.getProperty("trackback.allowedURLs");
+                    if (allowedURLs != null && allowedURLs.trim().length() > 0) {
+                        // in the case that the administrator has enabled trackbacks
+                        // for only specific URLs, set it to false by default
+                        allowTrackback = false;
+                        String[] splitURLs = allowedURLs.split("\\|\\|");
+                        for (int i=0; i<splitURLs.length; i++) {
+                            Matcher m = Pattern.compile(splitURLs[i]).matcher(form.getTrackbackUrl());
+                            if (m.matches()) {
+                                allowTrackback = true;
+                                break;
+                            }
+                        }
+                    }
+                    
+                    if(!allowTrackback) {
+                        errors.add(ActionErrors.GLOBAL_ERROR,
+                                new ActionError("error.trackbackNotAllowed"));
+                    } else {
+                        try {
+                            // Construct data
+                            
+                            String data = URLEncoder.encode("title", "UTF-8")
+                            +"="+URLEncoder.encode(title, "UTF-8");
+                            
+                            data += ("&" + URLEncoder.encode("excerpt", "UTF-8")
+                            +"="+URLEncoder.encode(excerpt,"UTF-8"));
+                            
+                            data += ("&" + URLEncoder.encode("url", "UTF-8")
+                            +"="+URLEncoder.encode(url,"UTF-8"));
+                            
+                            data += ("&" + URLEncoder.encode("blog_name", "UTF-8")
+                            +"="+URLEncoder.encode(blog_name,"UTF-8"));
+                            
+                            // Send data
+                            URL tburl = new URL(form.getTrackbackUrl());
+                            HttpURLConnection conn = (HttpURLConnection)tburl.openConnection();
+                            conn.setDoOutput(true);
+                            
+                            OutputStreamWriter wr =
+                                    new OutputStreamWriter(conn.getOutputStream());
+                            BufferedReader rd = null;
+                            try {
+                                wr.write(data);
+                                wr.flush();
+                                
+                                // Get the response
+                                boolean inputAvailable = false;
+                                try {
+                                    rd = new BufferedReader(new InputStreamReader(
+                                            conn.getInputStream()));
+                                    inputAvailable = true;
+                                } catch (Throwable e) {
+                                    mLogger.debug(e);
+                                }
+                                
+                                // read repsonse only if there is one
+                                if (inputAvailable) {
+                                    String line;
+                                    StringBuffer resultBuff = new StringBuffer();
+                                    while ((line = rd.readLine()) != null) {
+                                        resultBuff.append(
+                                                Utilities.escapeHTML(line, true));
+                                        resultBuff.append("<br />");
+                                    }
+                                    resultMsg.add(ActionMessages.GLOBAL_MESSAGE,
+                                            new ActionMessage("weblogEdit.trackbackResults",
+                                            resultBuff));
+                                }
+                                
+                                // add response code to messages
+                                if (conn.getResponseCode() > 399) {
+                                    errors.add(ActionErrors.GLOBAL_ERROR,
+                                            new ActionError("weblogEdit.trackbackStatusCodeBad",
+                                            new Integer(conn.getResponseCode())));
+                                } else {
+                                    resultMsg.add(ActionMessages.GLOBAL_MESSAGE,
+                                            new ActionMessage("weblogEdit.trackbackStatusCodeGood",
+                                            new Integer(conn.getResponseCode())));
+                                }
+                            } finally {
+                                if (wr != null) wr.close();
+                                if (rd != null) rd.close();
+                            }
+                        } catch (IOException e) {
+                            errors.add(ActionErrors.GLOBAL_ERROR,
+                                    new ActionError("error.trackback",e));
+                        }
+                    }
+                } else {
+                    errors.add(ActionErrors.GLOBAL_ERROR,
+                            new ActionError("error.noTrackbackUrlSpecified"));
+                }
+                
+                form.setTrackbackUrl(null);
+            } else {
+                forward = mapping.findForward("access-denied");
+            }
+        } catch (Exception e) // unexpected
+        {
+            mLogger.error(e);
+            String msg = e.getMessage();
+            if ( msg == null ) {
+                msg = e.getClass().getName();
+            }
+            errors.add(ActionErrors.GLOBAL_ERROR,
+                    new ActionError("error.general",msg));
+        }
+        
+        saveErrors(request, errors);
+        saveMessages(request, resultMsg);
+        
+        request.setAttribute("model",
+                new WeblogEntryPageModel(request, response, mapping,
+                (WeblogEntryFormEx)actionForm,
+                WeblogEntryPageModel.EDIT_MODE));
+        
+        return forward;
+    }
+    
+    //-----------------------------------------------------------------------
+    public ActionForward cancel(
+            ActionMapping       mapping,
+            ActionForm          actionForm,
+            HttpServletRequest  request,
+            HttpServletResponse response)
+            throws IOException, ServletException {
+        return (mapping.findForward("weblogEdit"));
+    }
+    
+    //-----------------------------------------------------------------------
+    public ActionForward unspecified(
+            ActionMapping       mapping,
+            ActionForm          actionForm,
+            HttpServletRequest  request,
+            HttpServletResponse response)
+            throws Exception {
+        return create(mapping, actionForm, request, response);
+    }
+    
+    /**
+     * Attempts to remove the Entry from the Lucene index and
+     * then re-index the Entry if it is Published.  If the Entry
+     * is being deleted then mark it published = false.
+     * @param entry
+     */
+    private void reindexEntry(Roller roller, WeblogEntryData entry)
+    throws RollerException {
+        IndexManager manager = roller.getIndexManager();
+        
+        // remove entry before (re)adding it, or in case it isn't Published
+        //manager.removeEntryIndexOperation(entry);
+        
+        // if published, index the entry
+        if (entry.isPublished()) {
+            manager.addEntryReIndexOperation(entry);
+        }
+    }
+    
+    public ActionErrors validateEntry(ActionErrors errors, WeblogEntryFormEx form) {
+        if (errors == null) errors = new ActionErrors();
+        if (StringUtils.isEmpty(form.getTitle())) {
+            errors.add(null, new ActionError("weblogEdit.error.incompleteEntry"));
+        }
+        return errors;
+    }
+    
+    
+}
+
+

Added: incubator/roller/trunk/src/org/apache/roller/presentation/weblog/actions/WeblogEntryManagementAction.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/apache/roller/presentation/weblog/actions/WeblogEntryManagementAction.java?rev=398712&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/presentation/weblog/actions/WeblogEntryManagementAction.java (added)
+++ incubator/roller/trunk/src/org/apache/roller/presentation/weblog/actions/WeblogEntryManagementAction.java Mon May  1 15:23:02 2006
@@ -0,0 +1,240 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+*  contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+
+package org.apache.roller.presentation.weblog.actions;
+
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.util.Date;
+import java.util.List;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+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.roller.RollerException;
+import org.apache.roller.model.RollerFactory;
+import org.apache.roller.model.WeblogManager;
+import org.apache.roller.pojos.WeblogCategoryData;
+import org.apache.roller.pojos.WeblogEntryData;
+import org.apache.roller.pojos.WebsiteData;
+import org.apache.roller.presentation.BasePageModel;
+import org.apache.roller.presentation.RollerRequest;
+import org.apache.roller.presentation.RollerSession;
+import org.apache.roller.presentation.weblog.formbeans.WeblogEntryManagementForm;
+import org.apache.roller.util.DateUtil;
+
+
+/////////////////////////////////////////////////////////////////////////////
+/**
+ * Query weblog entries and display the results in tabular form.
+ *
+ * @struts.action path="/editor/weblogEntryManagement" name="weblogEntryManagementForm" 
+ *     scope="request" parameter="method"
+ * 
+ * @struts.action-forward name="weblogEntryManagement.page" path=".WeblogEntryManagement"
+ * 
+ * @author Dave Johnson
+ */
+public final class WeblogEntryManagementAction extends DispatchAction
+{
+    //-----------------------------------------------------------------------
+    /**
+     * Respond to request to add a new or edit an existing weblog entry.
+     * Loads the appropriate model objects and forwards the request to
+     * the edit weblog page.
+     */
+    public ActionForward query(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws IOException, ServletException, RollerException
+    {
+        WeblogEntryManagementForm form = (WeblogEntryManagementForm)actionForm;
+        RollerRequest   rreq = RollerRequest.getRollerRequest(request);
+        WeblogManager   wmgr = RollerFactory.getRoller().getWeblogManager();           
+        RollerSession   rses = RollerSession.getRollerSession(request);
+        
+        // ensure that weblog is specfied and user has permission to work there
+        if (rreq.getWebsite() != null && rses.isUserAuthorized(rreq.getWebsite())) {
+            String status= form.getStatus().equals("ALL") ? null : form.getStatus();        
+            request.setAttribute("model", new PageModel(
+               request, 
+               response, 
+               mapping,
+               rreq.getWebsite(),
+               form)); 
+        } 
+        else 
+        {
+            return mapping.findForward("access-denied");
+        }
+        return mapping.findForward("weblogEntryManagement.page");
+    }
+    
+    public class PageModel extends BasePageModel {
+        private List               entries = null;
+        private RollerRequest      rollerRequest = null;
+        private HttpServletRequest request = null;
+        private WebsiteData        website = null;
+        private String             category = null;
+        private Date               startDate = null;
+        private Date               endDate = null;
+        private String             status = WeblogEntryData.PUBLISHED;
+        private Integer            maxEntries = null;
+        private boolean            more = false;
+        private WeblogEntryManagementForm    queryForm = null;
+
+        public PageModel( 
+                HttpServletRequest request,
+                HttpServletResponse response,
+                ActionMapping mapping,
+                WebsiteData website,
+                WeblogEntryManagementForm queryForm) throws RollerException {
+            super("weblogEntryQuery.title", request, response, mapping);
+            rollerRequest = RollerRequest.getRollerRequest(request);
+            this.request = request;
+            this.queryForm = queryForm;
+            this.website = website;
+
+            if (null != queryForm.getCategoryId() && !queryForm.getCategoryId().equals("")) {
+                WeblogManager wmgr = RollerFactory.getRoller().getWeblogManager();
+                WeblogCategoryData cd = wmgr.getWeblogCategory(queryForm.getCategoryId());
+                category = cd.getPath();
+            }
+
+            final DateFormat df =
+                    DateFormat.getDateInstance(DateFormat.SHORT, request.getLocale());
+            String start = queryForm.getStartDateString();
+            if (null != start && start.trim().length() > 0) {
+                try {
+                    startDate = DateUtil.getStartOfDay(df.parse(start));
+                } catch (ParseException e) {
+                    throw new RollerException("ERROR parsing start date.");
+                }
+            }
+
+            String end = queryForm.getEndDateString();
+            if (null != end && end.trim().length() > 0) {
+                try {
+                    endDate = DateUtil.getEndOfDay(df.parse(end));
+                } catch (ParseException e) {
+                    throw new RollerException("ERROR parsing end date.");
+                }
+            }
+
+            this.status = "ALL".equals(queryForm.getStatus()) ? null: queryForm.getStatus();    
+            this.maxEntries = maxEntries;
+
+            entries = RollerFactory.getRoller().getWeblogManager().getWeblogEntries(
+                    website,
+                    startDate,
+                    endDate,
+                    category,
+                    status,
+                    queryForm.getSortby(),
+                    queryForm.getOffset(),
+                    queryForm.getCount() + 1);
+           if (entries.size() > queryForm.getCount()) {
+               more = true;
+               entries.remove(entries.size()-1);
+           }
+        }
+
+        public String getBaseURL() {
+            return getRequest().getContextPath();
+        }
+
+        /**
+         * Get recent weblog entries using request parameters to determine
+         * username, date, and category name parameters.
+         * @return List of WeblogEntryData objects.
+         * @throws RollerException
+         */
+        public List getRecentWeblogEntries() throws RollerException {
+            return entries;
+        }
+
+        public int getWeblogEntryCount() {
+            return entries.size();
+        }
+        
+        public List getCategories() throws Exception {
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            List categories = RollerFactory.getRoller().getWeblogManager()
+            .getWeblogCategories(rreq.getWebsite());
+            return categories;
+        }
+
+        public Date getEarliestDate() {
+            Date date = null;
+            if (entries.size() > 0) {
+                WeblogEntryData earliest = (WeblogEntryData)entries.get(entries.size()-1);
+                date = earliest.getPubTime();
+            }
+            return date;
+        }
+
+        public Date getLatestDate() {
+            Date date = null;
+            if (entries.size() > 0) {
+                WeblogEntryData latest = (WeblogEntryData)entries.get(0);
+                date = latest.getPubTime();
+            }
+            return date;
+        }
+
+        public String getNextLink() {
+            if (more) {
+                int offset = queryForm.getOffset() + queryForm.getCount();
+                offset = (offset < 0) ? 0 : offset;
+                return getQueryLink() + "&offset=" + offset;
+            } else {
+                return null;
+            }
+        }
+
+        public String getPrevLink() {
+            if (queryForm.getOffset() > 0) {
+                int offset = queryForm.getOffset() - queryForm.getCount();
+                offset = (offset < 0) ? 0 : offset;
+                return getQueryLink() + "&offset=" + offset;
+            } else {
+                return null;
+            }
+        }
+
+        private String getQueryLink() {
+            StringBuffer sb = new StringBuffer();
+            sb.append(request.getContextPath());
+            sb.append("/editor/weblogEntryManagement.do"); // TODO: get path from Struts
+            sb.append("?method=query");
+            sb.append("&weblog=");
+            sb.append(getWebsite().getHandle());
+            sb.append("&count=");
+            sb.append(queryForm.getCount());
+            return sb.toString();
+        }
+    }
+}

Added: incubator/roller/trunk/src/org/apache/roller/presentation/weblog/actions/WeblogEntryPageModel.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/apache/roller/presentation/weblog/actions/WeblogEntryPageModel.java?rev=398712&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/presentation/weblog/actions/WeblogEntryPageModel.java (added)
+++ incubator/roller/trunk/src/org/apache/roller/presentation/weblog/actions/WeblogEntryPageModel.java Mon May  1 15:23:02 2006
@@ -0,0 +1,395 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+*  contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+/* Created on Mar 10, 2004 */
+package org.apache.roller.presentation.weblog.actions;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.roller.RollerException;
+import org.apache.roller.model.RollerFactory;
+import org.apache.roller.pojos.UserData;
+import org.apache.roller.pojos.WeblogEntryData;
+import org.apache.roller.presentation.BasePageModel;
+import org.apache.roller.presentation.RollerContext;
+import org.apache.roller.presentation.RollerRequest;
+import org.apache.roller.presentation.RollerSession;
+import org.apache.roller.presentation.tags.calendar.CalendarModel;
+import org.apache.roller.presentation.weblog.actions.WeblogEntryPageModel.PageMode;
+import org.apache.roller.presentation.weblog.formbeans.WeblogEntryFormEx;
+import org.apache.roller.presentation.weblog.tags.EditWeblogCalendarModel;
+import org.apache.roller.util.StringUtils;
+
+//import com.swabunga.spell.event.SpellCheckEvent;
+import java.util.Map;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.velocity.VelocityContext;
+import org.apache.roller.model.PagePluginManager;
+import org.apache.roller.model.Roller;
+
+/**
+ * All data needed to render the edit-weblog page.
+ * @author David M Johnson
+ */
+public class WeblogEntryPageModel extends BasePageModel
+{
+    private static Log logger = 
+       LogFactory.getFactory().getInstance(WeblogEntryPageModel.class);
+        
+    private RollerRequest rollerRequest = null;
+    private PageMode mode = null;
+    private ArrayList words = null;
+    private WeblogEntryFormEx form;
+    private WeblogEntryData weblogEntry;
+        
+    public static class PageMode {
+        private String name;
+        public PageMode(String name) {
+            this.name = name;
+        }
+        public boolean equals(Object obj) {
+            return ((PageMode)obj).name.equals(name);
+        }
+        public int hashCode() {
+            return HashCodeBuilder.reflectionHashCode(this);            
+        }
+    }
+    
+    public static final PageMode EDIT_MODE = new PageMode("EDIT_MODE");
+    public static final PageMode SPELL_MODE = new PageMode("SPELL_MODE");
+    public static final PageMode PREVIEW_MODE = new PageMode("PREVIEW_MODE");
+    
+
+    public WeblogEntryPageModel(
+            HttpServletRequest request,
+            HttpServletResponse response,
+            ActionMapping mapping,
+            WeblogEntryFormEx form,
+            PageMode mode,
+            ArrayList words) throws RollerException
+    {
+        this(request, response, mapping, form, mode);
+        this.words = words;
+    }
+
+    public WeblogEntryPageModel(
+            HttpServletRequest request,
+            HttpServletResponse response,
+            ActionMapping mapping,
+            WeblogEntryFormEx form,
+            PageMode mode) throws RollerException
+    {
+        super("dummy", request, response, mapping);
+        this.rollerRequest = RollerRequest.getRollerRequest(request);  
+        this.form = form;
+        this.mode = mode;       
+        getRequest().setAttribute("leftPage","/weblog/WeblogEditSidebar.jsp");
+    }
+    
+    public String getTitle() 
+    {
+        if (StringUtils.isEmpty(form.getId()))
+        {
+            return bundle.getString("weblogEdit.title.newEntry");
+        }
+        return bundle.getString("weblogEdit.title.editEntry");
+    }
+
+    /**
+     * Get recent weblog entries using request parameters to determine
+     * username, date, and category name parameters.
+     * @return List of WeblogEntryData objects.
+     * @throws RollerException
+     */
+    public List getRecentPublishedEntries() throws RollerException
+    {
+        RollerSession rollerSession = RollerSession.getRollerSession(getRequest());
+        return RollerFactory.getRoller().getWeblogManager()
+            .getWeblogEntries(
+                getWeblogEntry().getWebsite(), // userName
+                null,              // startDate
+                null,              // endDate
+                null,              // catName
+                WeblogEntryData.PUBLISHED, // status
+                null,              // sortby (null for pubTime)
+                new Integer(20));  // maxEntries
+    }
+
+    /**
+     * Get recent weblog entries using request parameters to determine
+     * username, date, and category name parameters.
+     * @return List of WeblogEntryData objects.
+     * @throws RollerException
+     */
+    public List getRecentDraftEntries() throws RollerException
+    {
+        RollerSession rollerSession = RollerSession.getRollerSession(getRequest());
+        return RollerFactory.getRoller().getWeblogManager()
+            .getWeblogEntries(
+                getWeblogEntry().getWebsite(), 
+                null,              // startDate
+                null,              // endDate
+                null,              // catName
+                WeblogEntryData.DRAFT, // status
+                "updateTime",      // sortby 
+                new Integer(20));  // maxEntries
+    }
+    
+    /**
+     * Get recent weblog entries using request parameters to determine
+     * username, date, and category name parameters.
+     * @return List of WeblogEntryData objects.
+     * @throws RollerException
+     */
+    public List getRecentPendingEntries() throws RollerException
+    {
+        RollerSession rollerSession = RollerSession.getRollerSession(getRequest());
+        return RollerFactory.getRoller().getWeblogManager()
+            .getWeblogEntries(
+                getWeblogEntry().getWebsite(), 
+                null,              // startDate
+                null,              // endDate
+                null,              // catName
+                WeblogEntryData.PENDING, // status
+                "updateTime",      // sortby
+                new Integer(20));  // maxEntries
+    }
+ 
+    public List getHoursList()
+    {
+        List ret = new LinkedList();
+        for (int i=0; i<24; i++)
+        {
+            ret.add(new Integer(i));
+        }
+        return ret;
+    }
+
+    public List getMinutesList()
+    {
+        List ret = new LinkedList();
+        for (int i=0; i<60; i++)
+        {
+            ret.add(new Integer(i));
+        }
+        return ret;
+    }
+
+    public List getSecondsList()
+    {
+        return getMinutesList();
+    }
+
+    public boolean getHasPagePlugins()
+    {
+        boolean ret = false;
+        try {
+            Roller roller = RollerFactory.getRoller();
+            PagePluginManager ppmgr = roller.getPagePluginManager();
+            ret = ppmgr.hasPagePlugins();
+        } catch (RollerException e) {
+            logger.error(e);
+        }
+        return ret;
+    }
+    
+    public List getPagePlugins() 
+    {
+        List list = new ArrayList();
+        try {
+            if (getHasPagePlugins()) 
+            {
+                Roller roller = RollerFactory.getRoller();
+                PagePluginManager ppmgr = roller.getPagePluginManager();
+                Map plugins = ppmgr.createAndInitPagePlugins(
+                    getWebsite(),
+                    RollerContext.getRollerContext().getServletContext(),
+                    RollerContext.getRollerContext().getAbsoluteContextUrl(),
+                    new VelocityContext());
+                Iterator it = plugins.values().iterator();
+                while (it.hasNext()) list.add(it.next());
+            }
+        } catch (Exception e) {
+            logger.error(e);
+        }
+        return list;
+    }
+
+    public String getEditorPage()
+    {
+        // Select editor page selected by user (simple text editor,
+        // DHTML editor, Ekit Java applet, etc.
+        RollerSession rollerSession = RollerSession.getRollerSession(getRequest());
+        String editorPage = weblogEntry.getWebsite().getEditorPage();
+        if (StringUtils.isEmpty( editorPage ))
+        {
+            editorPage = "editor-text.jsp";
+        }
+        return editorPage;
+    }
+
+    public CalendarModel getCalendarModel() throws Exception
+    {
+        // Determine URL to self
+        ActionForward selfForward = getMapping().findForward("editWeblog");
+        String selfUrl= getRequest().getContextPath()+selfForward.getPath();
+
+        // Setup weblog calendar model
+        CalendarModel model = new EditWeblogCalendarModel(
+                rollerRequest, getResponse(), selfUrl );
+        return model;
+    }
+
+    public UserData getUser()
+    {
+        RollerSession rollerSession = RollerSession.getRollerSession(getRequest());
+        return rollerSession.getAuthenticatedUser();
+    }
+
+    public List getCategories() throws Exception
+    {
+        RollerSession rollerSession = RollerSession.getRollerSession(getRequest());
+        return RollerFactory.getRoller().getWeblogManager()
+            .getWeblogCategories(weblogEntry.getWebsite(), false);
+    }
+    
+    public WeblogEntryFormEx getWeblogEntryForm() throws RollerException
+    {
+        return this.form;
+    }
+
+    /** returns a dummied-up weblog entry object */
+    public WeblogEntryData getWeblogEntry() throws RollerException
+    {
+        if (weblogEntry == null) 
+        {
+            weblogEntry = new WeblogEntryData();
+            weblogEntry.setWebsite(getWebsite());
+            form.copyTo(weblogEntry, 
+                    getRequest().getLocale(), getRequest().getParameterMap());
+            weblogEntry.setWebsite(weblogEntry.getWebsite());
+        }
+        return weblogEntry;
+    }
+    
+    public String getPermaLink() throws RollerException
+    {
+        String context = RollerContext
+            .getRollerContext()
+            .getAbsoluteContextUrl(rollerRequest.getRequest());
+        return context + getWeblogEntry().getPermaLink();
+    }
+    
+    public static String makeSelect(String word, List words)
+    {
+        StringBuffer buf = new StringBuffer("<select name=\"");
+        buf.append("replacementWords\" style=\"font-size: 10px;\">");
+        buf.append("<option selected=\"selected\" value=\"").append(word);
+        buf.append("\">").append(word).append("</option>");
+        if (words == null || words.size() < 1)
+        {
+            buf.append("<option value=\"").append(word);
+            buf.append("\">No Suggestions</option>");
+        }
+        else
+        {
+            for (Iterator it2=words.iterator(); it2.hasNext();)
+            {
+                word = it2.next().toString();
+                buf.append("<option value=\"").append(word);
+                buf.append("\">").append(word).append("</option>");
+            }
+        }    
+        buf.append("</select>");
+        return buf.toString();
+    }
+
+    /**
+     * @return Returns the mode.
+     */
+    public PageMode getMode() {
+        return mode;
+    }
+    
+    /**
+     * @param mode The mode to set.
+     */
+    public void setMode(PageMode mode) {
+        this.mode = mode;
+    }
+    
+    public boolean getEditMode()
+    {
+        return mode.equals(EDIT_MODE);
+    }
+    
+    public boolean getSpellMode()
+    {
+        return mode.equals(SPELL_MODE);
+    }
+    
+    public boolean getPreviewMode()
+    {
+        return mode.equals(PREVIEW_MODE);
+    }
+    
+    /**
+     * @return Returns the words.
+     */
+    public ArrayList getWords() {
+        return words;
+    }
+    /**
+     * @param words The words to set.
+     */
+    public void setWords(ArrayList words) {
+        this.words = words;
+    }
+
+    public boolean getUserAuthorized() throws RollerException
+    {
+        return getRollerSession().isUserAuthorized(getWeblogEntry().getWebsite());
+    }
+    
+    public boolean getUserAuthorizedToAuthor() throws RollerException
+    {
+        return getRollerSession().isUserAuthorizedToAuthor(getWeblogEntry().getWebsite());
+    }
+
+    public PageMode getEDIT_MODE() {
+        return EDIT_MODE;
+    }
+    
+    public int getCommentCount() {
+        // Don't check for comments on unsaved entry (fixed ROL-970)
+        if (weblogEntry.getId() == null) return 0;
+        List comments = comments = weblogEntry.getComments(false, false);
+        return comments != null ? comments.size() : 0;
+    }
+}
+

Added: incubator/roller/trunk/src/org/apache/roller/presentation/weblog/actions/package.html
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/apache/roller/presentation/weblog/actions/package.html?rev=398712&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/presentation/weblog/actions/package.html (added)
+++ incubator/roller/trunk/src/org/apache/roller/presentation/weblog/actions/package.html Mon May  1 15:23:02 2006
@@ -0,0 +1,27 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  The ASF licenses this file to You
+  under the Apache License, Version 2.0 (the "License"); you may not
+  use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.  For additional information regarding
+  copyright in this work, please see the NOTICE file in the top level
+  directory of this distribution.
+-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+  <title></title>
+</head>
+<body>
+Struts actions for weblog entries, categories and pings.
+
+</body>
+</html>

Added: incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/BakeWeblogForm.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/BakeWeblogForm.java?rev=398712&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/BakeWeblogForm.java (added)
+++ incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/BakeWeblogForm.java Mon May  1 15:23:02 2006
@@ -0,0 +1,34 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+*  contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+package org.apache.roller.presentation.weblog.formbeans;
+
+import org.apache.struts.action.ActionForm;
+
+/**
+ * Holds the name of the theme chosen or
+ * the template being edited.
+ * 
+ * @struts.form name="bakeWeblogForm"
+ * 
+ * @author llavandowska
+ */
+public class BakeWeblogForm extends ActionForm
+{
+
+
+}

Added: incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/CategoriesForm.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/CategoriesForm.java?rev=398712&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/CategoriesForm.java (added)
+++ incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/CategoriesForm.java Mon May  1 15:23:02 2006
@@ -0,0 +1,80 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+*  contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+
+package org.apache.roller.presentation.weblog.formbeans;
+
+import org.apache.roller.RollerException;
+import org.apache.roller.pojos.WeblogCategoryData;
+import org.apache.roller.presentation.forms.WeblogCategoryForm;
+
+
+/**
+ * @struts.form name="categoriesForm"
+ */ 
+public class CategoriesForm extends WeblogCategoryForm
+{
+    private String mParentId = null;
+	private boolean mMoveContents = false; 
+	private String mMoveToCategoryId = null; 
+    private String[] mSelectedCategories = null;
+
+	public CategoriesForm()
+	{
+		super();
+	}
+
+	public CategoriesForm( WeblogCategoryData catData, java.util.Locale locale ) throws RollerException
+	{
+		super(catData, locale);
+	}
+
+    public String getParentId()
+    {
+        return mParentId;
+    }
+
+    public void setParentId(String parentId)
+    {
+        mParentId = parentId;
+    }
+
+    //-------------------------------------------------- Property moveContents
+
+	/** If true then contents should be moved when this Category is removed */
+	public boolean getMoveContents() { return mMoveContents; }
+
+	/** If true then contents should be moved when this Category is removed */
+	public void setMoveContents( boolean flag ) { mMoveContents = flag;}
+
+    //----------------------------------------------- Property moveToCategoryId
+
+	/** Category where contents should be moved if this Category is removed */ 
+	public String getMoveToCategoryId() { return mMoveToCategoryId; }
+
+	/** Category where contents should be moved if this Category is removed */ 
+	public void setMoveToCategoryId( String id ) { mMoveToCategoryId = id;}
+
+    //--------------------------------------------- Property selectedCategories 
+
+    /** Get selected Categories */
+    public String[] getSelectedCategories() { return mSelectedCategories; }
+
+    /** Set selected Categories */
+    public void setSelectedCategories( String[] f ) {mSelectedCategories = f;}
+}
+

Added: incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/CategoryDeleteForm.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/CategoryDeleteForm.java?rev=398712&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/CategoryDeleteForm.java (added)
+++ incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/CategoryDeleteForm.java Mon May  1 15:23:02 2006
@@ -0,0 +1,151 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+*  contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+/*
+ * Created on Jan 19, 2004
+ */
+package org.apache.roller.presentation.weblog.formbeans;
+
+import java.util.List;
+
+import org.apache.struts.action.ActionForm;
+
+/**
+ * @struts.form name="categoryDeleteForm"
+ */
+public class CategoryDeleteForm extends ActionForm
+{
+    private String name;
+    private String categoryId = null;
+    private String moveToWeblogCategoryId = null;
+    private List cats = null;
+    private Boolean inUse = Boolean.FALSE;
+    private Boolean confirmDelete = null;
+    
+    /**
+     * @return
+     */
+    public List getCats()
+    {
+        return cats;
+    }
+
+    /**
+     * @return
+     */
+    public String getCategoryId()
+    {
+        return categoryId;
+    }
+
+    /**
+     * @return
+     */
+    public Boolean isInUse()
+    {
+        return inUse;
+    }
+
+    /**
+     * @return
+     */
+    public String getMoveToWeblogCategoryId()
+    {
+        return moveToWeblogCategoryId;
+    }
+
+    /**
+     * @param list
+     */
+    public void setCats(List list)
+    {
+        cats = list;
+    }
+
+    /**
+     * @param string
+     */
+    public void setCategoryId(String string)
+    {
+        categoryId = string;
+    }
+
+    /**
+     * @param b
+     */
+    public void setInUse(Boolean b)
+    {
+        inUse = b;
+    }
+
+    /**
+     * @param string
+     */
+    public void setMoveToWeblogCategoryId(String string)
+    {
+        moveToWeblogCategoryId = string;
+    }
+
+    /**
+     * @return
+     */
+    public Boolean isDelete()
+    {
+        return confirmDelete;
+    }
+
+    /**
+     * @param b
+     */
+    public void setConfirmDelete(Boolean b)
+    {
+        confirmDelete = b;
+    }
+
+    /**
+     * @return
+     */
+    public String getName()
+    {
+        return name;
+    }
+
+    /**
+     * @param string
+     */
+    public void setName(String string)
+    {
+        name = string;
+    }
+
+    /**
+     * @return Returns the delete.
+     */
+    public Boolean getConfirmDelete()
+    {
+        return confirmDelete;
+    }
+
+    /**
+     * @return Returns the inUse.
+     */
+    public Boolean getInUse()
+    {
+        return inUse;
+    }
+
+}

Added: incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/CommentFormEx.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/CommentFormEx.java?rev=398712&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/CommentFormEx.java (added)
+++ incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/CommentFormEx.java Mon May  1 15:23:02 2006
@@ -0,0 +1,120 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+*  contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+package org.apache.roller.presentation.weblog.formbeans;
+
+import java.util.Locale;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.struts.action.ActionMapping;
+import org.apache.roller.RollerException;
+import org.apache.roller.pojos.CommentData;
+import org.apache.roller.presentation.forms.CommentForm;
+
+/**
+ * Extends the WeblogEntryForm so that additional properties may be added.
+ * These properties are not persistent and are only needed for the UI.
+ *
+ * @struts.form name="commentFormEx"
+ * @author Lance Lavandowska
+ */
+public class CommentFormEx extends CommentForm
+{
+    private String[] deleteComments = null;
+    private String[] spamComments = null;
+    private String mEntryId = null;
+
+    public CommentFormEx()
+    {
+        super();
+    }
+
+    public CommentFormEx(CommentData entryData, java.util.Locale locale ) throws RollerException
+    {
+        super(entryData, locale);
+    }
+
+    public String[] getDeleteComments()
+    {
+        return deleteComments;
+    }
+
+    public void setDeleteComments(String[] deleteIds)
+    {
+        deleteComments = deleteIds;
+    }
+
+    /**
+     * @return
+     */
+    public String[] getSpamComments()
+    {
+        return spamComments;
+    }
+
+    public void setSpamComments(String[] spamIds)
+    {
+        spamComments = spamIds;
+    }
+
+    /**
+     * @return
+     */
+    public String getWeblogEntryId()
+    {
+        return mEntryId;
+    }
+
+    /**
+     * @param string
+     */
+    public void setWeblogEntryId(String string)
+    {
+        mEntryId = string;
+    }
+
+    /**
+     * @see org.apache.struts.action.ActionForm#reset(org.apache.struts.action.ActionMapping, javax.servlet.http.HttpServletRequest)
+     */
+    public void reset(ActionMapping mapping, HttpServletRequest request)
+    {
+        super.reset(mapping, request);
+        deleteComments = null;
+        spamComments = null;
+    }
+
+    /**
+     * @see org.apache.struts.action.ActionForm#reset(org.apache.struts.action.ActionMapping, javax.servlet.ServletRequest)
+     */
+    public void reset(ActionMapping mapping, ServletRequest request)
+    {
+        super.reset(mapping, request);
+        deleteComments = null;
+        spamComments = null;
+    }
+    
+    public void copyTo(org.apache.roller.pojos.CommentData dataHolder, Locale locale) 
+        throws RollerException
+    {
+        super.copyTo(dataHolder, locale);
+        if (getSpam() == null) dataHolder.setSpam(Boolean.FALSE);
+        if (getNotify() == null) dataHolder.setNotify(Boolean.FALSE);
+    }
+}
+

Added: incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/CommentManagementForm.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/CommentManagementForm.java?rev=398712&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/CommentManagementForm.java (added)
+++ incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/CommentManagementForm.java Mon May  1 15:23:02 2006
@@ -0,0 +1,278 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+*  contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+package org.apache.roller.presentation.weblog.formbeans;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+
+import javax.servlet.ServletRequest;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.struts.action.ActionMapping;
+import org.apache.roller.pojos.CommentData;
+import org.apache.roller.util.DateUtil;
+import org.apache.roller.util.Utilities;
+
+/**
+ * @struts.form name="commentManagementForm"
+ * @author Dave Johnson
+ */
+public class CommentManagementForm
+    extends    org.apache.struts.action.ActionForm
+    implements java.io.Serializable {
+    
+    private static Log logger =
+        LogFactory.getFactory().getInstance(CommentManagementForm.class);
+    
+    private String entryid = null;
+    private String handle = null;
+    
+    private String searchString = null;
+    private String startDateString;
+    private String endDateString;
+    
+    /** ALL, NO_SPAM or ONLY_SPAM */
+    private String  spamString = "ALL";   
+    
+    /** ALL, NO_APPROVED or ONLY_APPROVED */
+    private String  approvedString = "ALL"; 
+   
+    /** max comments displayed per page */
+    private int count = 30; 
+    
+     /** offset into current query results */
+    private int offset = 0;
+
+    /** IDs of comments to mark as spam */
+    private String[] spamComments = new String[0];
+    
+    /** IDs of comments to mark as approved */
+    private String[] approvedComments = new String[0];
+    
+    /** IDs of comments to delete */
+    private String[] deleteComments = new String[0];
+    
+    /** Limit updates to just this set of comma-separated IDs */
+    private String ids = null;
+    
+    
+    public void reset(ActionMapping mapping, ServletRequest request) {
+        // reset time fields to current time
+        Calendar cal = Calendar.getInstance(request.getLocale());
+        Date now = new Date();
+        cal.setTime(now);        
+    
+        DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, request.getLocale());
+        setEndDateString(df.format(now));
+        
+        cal.set(Calendar.DAY_OF_MONTH, 1);
+        setStartDateString(df.format(cal.getTime()));
+    }    
+
+    public void loadCheckboxes(List comments) {
+        ArrayList all = new ArrayList();
+        ArrayList approvedList = new ArrayList();
+        ArrayList spamList = new ArrayList();
+        Iterator it = comments.iterator();
+        while (it.hasNext()) {
+            CommentData comment = (CommentData)it.next();
+            all.add(comment.getId());
+            if (comment.getApproved().booleanValue()) {
+                approvedList.add(comment.getId());
+            }            
+            if (comment.getSpam().booleanValue()) {
+                spamList.add(comment.getId());
+            }
+        }
+        String[] idArray = (String[])all.toArray(
+            new String[all.size()]);
+        ids = Utilities.stringArrayToString(idArray,",");
+        
+        approvedComments = (String[])approvedList.toArray(
+            new String[approvedList.size()]);
+        spamComments = (String[])spamList.toArray(
+            new String[spamList.size()]);
+    }
+        
+    public Date getStartDate(Locale locale) {
+        Date startDate = null;
+        final DateFormat df =
+            DateFormat.getDateInstance(DateFormat.SHORT, locale);
+        if (null != getStartDateString() && getStartDateString().trim().length() > 0) {
+            try {
+                startDate = DateUtil.getStartOfDay(df.parse(getStartDateString()));
+            } catch (ParseException e) {
+                // what!?! calendar widget handed us a bad date?
+                logger.debug("Parsing startDate", e);
+            }
+        }
+        return startDate;
+    }
+
+    public Date getEndDate(Locale locale) {
+        Date endDate = null;
+        final DateFormat df =
+            DateFormat.getDateInstance(DateFormat.SHORT, locale);
+        if (null != getEndDateString() && getEndDateString().trim().length() > 0) {
+            try {
+                endDate = DateUtil.getEndOfDay(df.parse(getEndDateString()));
+            } catch (ParseException e) {
+                // what!?! calendar widget handed us a bad date?
+                logger.debug("Parsing endDate", e);
+            }
+        }
+        return endDate;
+    }
+
+    public Boolean getSpam() {
+        if (spamString.equals("ONLY_SPAM")) {
+            return Boolean.TRUE;
+        } else if (spamString.equals("NO_SPAM")) {
+            return Boolean.FALSE;
+        }
+        return null;
+    }
+
+    public Boolean getPending() {
+        if (approvedString.equals("ONLY_PENDING")) {
+            return Boolean.TRUE;
+        }
+        return null;
+    }
+    
+    public Boolean getApproved() {
+        if (approvedString.equals("ONLY_APPROVED")) {
+            return Boolean.TRUE;
+        } else if (approvedString.equals("ONLY_DISAPPROVED")) {
+            return Boolean.FALSE;
+        }
+        return null;
+    }
+
+    public int getCount() {
+        return count;
+    }
+
+    public void setCount(int count) {
+        this.count = count;
+    }
+
+    public int getOffset() {
+        return offset;
+    }
+
+    public void setOffset(int offset) {
+        this.offset = offset;
+    }  
+
+    public String getStartDateString() {
+        return startDateString;
+    }
+
+    public void setStartDateString(String startDateString) {
+        this.startDateString = startDateString;
+    }
+
+    public String getEndDateString() {
+        return endDateString;
+    }
+
+    public void setEndDateString(String endDateString) {
+        this.endDateString = endDateString;
+    }
+
+    public String getSpamString() {
+        return spamString;
+    }
+
+    public void setSpamString(String spamString) {
+        this.spamString = spamString;
+    }
+
+    public String getPendingString() {
+        return approvedString;
+    }
+
+    public void setPendingString(String pendingString) {
+        this.approvedString = pendingString;
+    }
+
+    public String getIds() {
+        return ids;
+    }
+
+    public void setIds(String ids) {
+        this.ids = ids;
+    }
+
+    public String getSearchString() {
+        return searchString;
+    }
+
+    public void setSearchString(String searchString) {
+        this.searchString = searchString;
+    }
+
+    public String getEntryid() {
+        return entryid;
+    }
+
+    public void setEntryid(String entryid) {
+        this.entryid = entryid;
+    }
+
+    public String getWeblog() {
+        return handle;
+    }
+
+    public void setWeblog(String handle) {
+        this.handle = handle;
+    }
+    
+    public String[] getDeleteComments() {
+        return deleteComments;
+    }
+    
+    public void setDeleteComments(String[] deleteComments) {
+        this.deleteComments = deleteComments;
+    }
+    
+    public String[] getSpamComments() {
+        return spamComments;
+    }
+    
+    public void setSpamComments(String[] commentsToMarkAsSpam) {
+        this.spamComments = commentsToMarkAsSpam;
+    }
+    
+    public String[] getApprovedComments() {
+        return approvedComments;
+    }
+    
+    public void setApprovedComments(String[] approvedComments) {
+        this.approvedComments = approvedComments;
+    }
+
+}

Added: incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/CommentQueryForm.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/CommentQueryForm.java?rev=398712&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/CommentQueryForm.java (added)
+++ incubator/roller/trunk/src/org/apache/roller/presentation/weblog/formbeans/CommentQueryForm.java Mon May  1 15:23:02 2006
@@ -0,0 +1,26 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+*  contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+package org.apache.roller.presentation.weblog.formbeans;
+
+/**
+ * @struts.form name="commentQueryForm"
+ * @author Dave Johnson
+ */
+public class CommentQueryForm  extends CommentManagementForm 
+    implements java.io.Serializable {
+}