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/09 05:19:20 UTC

svn commit: r189695 [39/67] - 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/ contrib/plugins/src/org/roller/presentation/velocity/plugins/topictag/ custom/ custom/src/ custom/web/ docs/ docs/images/ docs/installguide/ docs/installguide/old/ docs/userguide/ docs/userguide/images/ docs/userguide/old/ metadata/ metadata/database/ metadata/database/hibernate/ metadata/xdoclet/ nbproject/ personal/ personal/eclipse/ personal/testing/ sandbox/ sandbox/planetroller/ sandbox/planetroller/metadata/ sandbox/planetroller/metadata/database/ sandbox/planetroller/src/ sandbox/planetroller/src/org/ sandbox/planetroller/src/org/roller/ sandbox/planetroller/src/org/roller/tools/ sandbox/planetroller/src/org/roller/tools/planet/ sandbox/planetroller/templates/ sandbox/planetroller/test/ sandbox/planetroller/test/org/ sandbox/planetroller/test/org/roller/ sandbox/planetroller/test/org/roller/model/ sandbox/planetroller/test/org/roller/tools/ sandbox/planetroller/test/org/roller/tools/planet/ sandbox/planetroller/testdata/ sandbox/planetroller/testdata/cache/ sandbox/planetroller/testdata/output/ sandbox/standalone/ sandbox/standalone/jspwiki/ sandbox/standalone/jspwiki/default/ sandbox/standalone/jspwiki/default/images/ sandbox/standalone/lib/ sandbox/standalone/src/ sandbox/standalone/src/org/ sandbox/standalone/src/org/roller/ sandbox/standalone/src/org/roller/jspwiki/ sandbox/standalone/src/org/roller/tomcat/ sandbox/standalone/src/org/roller/util/ sandbox/standalone/tests/ sandbox/standalone/tests/org/ sandbox/standalone/tests/org/roller/ sandbox/standalone/tests/org/roller/util/ sandbox/standalone/tomcat/ src/ src/org/ src/org/roller/ src/org/roller/business/ src/org/roller/business/hibernate/ src/org/roller/business/search/ src/org/roller/business/search/operations/ src/org/roller/business/utils/ src/org/roller/config/ src/org/roller/config/runtime/ src/org/roller/model/ src/org/roller/pojos/ src/org/roller/presentation/ src/org/roller/presentation/atomapi/ 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/pings/ src/org/roller/presentation/planet/ src/org/roller/presentation/tags/ src/org/roller/presentation/tags/calendar/ src/org/roller/presentation/tags/menu/ src/org/roller/presentation/util/ 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/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/ src/org/roller/util/rome/ tests/ tests/org/ tests/org/roller/ tests/org/roller/ant/ tests/org/roller/business/ tests/org/roller/presentation/ tests/org/roller/presentation/atomapi/ tests/org/roller/presentation/bookmarks/ tests/org/roller/presentation/filters/ 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/weblog/ tests/org/roller/presentation/xmlrpc/ tests/org/roller/util/ tests/org/roller/util/rome/ tools/ tools/buildtime/ tools/buildtime/ant-1.6.2/ tools/buildtime/findbugs/ tools/buildtime/findbugs/lib/ tools/buildtime/findbugs/plugin/ tools/buildtime/mockrunner-0.3/ tools/buildtime/mockrunner-0.3/lib/ tools/buildtime/mockrunner-0.35/ tools/buildtime/mockrunner-0.35/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.2.4/ tools/struts-1.2.4/lib/ web/ web/WEB-INF/ web/WEB-INF/classes/ web/WEB-INF/classes/flavors/ web/WEB-INF/classes/themes/ web/bookmarks/ web/editor/ web/editor/images/ web/images/ web/images/editor/ web/images/midas/ web/images/preview/ web/images/smileys/ web/planet/ 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/brushedmetal/ web/themes/brushedmetal/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/movablemanila/ web/themes/movablemanila/images/ 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/tags/ApplyPluginsTag.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/weblog/tags/ApplyPluginsTag.java?rev=189695&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/weblog/tags/ApplyPluginsTag.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/weblog/tags/ApplyPluginsTag.java Wed Jun  8 20:18:46 2005
@@ -0,0 +1,208 @@
+     /*
+ * Created on Feb 27, 2004
+ */
+package org.roller.presentation.weblog.tags;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.struts.util.RequestUtils;
+import org.roller.pojos.WeblogEntryData;
+import org.roller.presentation.velocity.PageHelper;
+import org.roller.util.Utilities;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.TagSupport;
+
+/**
+ * Apply configured PagePlugins to WeblogEntryData and display the result.
+ * @jsp.tag name="ApplyPlugins"
+ * @author David M Johnson
+ */
+public class ApplyPluginsTag extends TagSupport
+{
+    static final long serialVersionUID = 3166731504235428544L;
+    
+    private static final String HELPER_KEY = "roller.pageHelper";
+    private static Log mLogger =
+        LogFactory.getFactory().getInstance(ApplyPluginsTag.class);
+
+    private String name = null;
+    private String property = null;
+    private String scope = "request";
+    
+    private boolean stripHtml = false;
+    private int maxLength = -1;
+    private boolean skipFlag = false;
+
+    /**
+     * @see javax.servlet.jsp.tagext.Tag#doStartTag()
+     */
+    public int doStartTag() throws JspException
+    {
+        WeblogEntryData entry = 
+            (WeblogEntryData)RequestUtils.lookup(pageContext, name, property, scope);
+        
+        String xformed = null;
+
+        if (entry.getPlugins() != null)
+        {
+            // check to see if a PageHelper has already been created this request
+            PageHelper helper = (PageHelper)pageContext.getRequest().getAttribute(HELPER_KEY);
+            if (helper == null)
+            {
+                helper = loadNewPageHelper();
+            }
+            helper.setSkipFlag(skipFlag);
+    
+            xformed = helper.renderPlugins(entry);
+        }
+        else
+        {
+            xformed = entry.getText();
+        }
+        
+        if (stripHtml)
+        {
+            // don't escape ampersands
+            xformed = Utilities.escapeHTML( Utilities.removeHTML(xformed), false );
+        }
+        
+        if (maxLength != -1)
+        {
+            xformed = Utilities.truncateNicely(xformed, maxLength, maxLength, "...");
+        }
+        
+        // somehow things (&#8220) are getting double-escaped
+        // but I cannot seem to track it down
+        xformed = Utilities.stringReplace(xformed, "&amp#", "&#");
+        
+        try
+        {
+            pageContext.getOut().println(xformed);
+        }
+        catch (IOException e)
+        {
+            throw new JspException("ERROR applying plugin to entry", e);
+        }
+        return TagSupport.SKIP_BODY;
+    }
+
+    /**
+     * PagePlugins need to be loaded and properly initialized for use.
+     * Also, store the PageHelper in the Request as it will likely be
+     * used more than once and this way we can skip a fair amount of overhead.
+     */
+    private PageHelper loadNewPageHelper()
+    {
+        PageHelper pageHelper = PageHelper.createPageHelper(
+            (HttpServletRequest)pageContext.getRequest(), 
+            (HttpServletResponse)pageContext.getResponse());
+
+        pageContext.getRequest().setAttribute(HELPER_KEY, pageHelper);
+        return pageHelper;
+    }
+
+    /**
+     * Maximum length of text displayed, only applies if stripHtml is true.
+     * @jsp.attribute required="false"
+     * @return Returns the maxLength.
+     */
+    public int getMaxLength()
+    {
+        return maxLength;
+    }
+
+    /**
+     * Maximum length of text displayed, only applies if stripHtml is true.
+     * @param maxLength The maxLength to set.
+     */
+    public void setMaxLength(int maxLength)
+    {
+        this.maxLength = maxLength;
+    }
+
+    /**
+     * Set to true to strip all HTML markup from output.
+     * @jsp.attribute required="false"
+     * @return Returns the stripHtml.
+     */
+    public boolean getStripHtml()
+    {
+        return stripHtml;
+    }
+
+    /**
+     * Set to true to strip all HTML markup from output.
+     * @param stripHtml The stripHtml to set.
+     */
+    public void setStripHtml(boolean stripHtml)
+    {
+        this.stripHtml = stripHtml;
+    }
+
+    /**
+     * Set to true to inform PagePlugins if they
+     * should "skip" themselves.
+     *
+     * @jsp.attribute required="false"
+     * @return Returns the skipFlag.
+     */
+    public boolean getSkipFlag()
+    {
+        return skipFlag;
+    }
+
+    /**
+     * Set to true to inform PagePlugins if they
+     * should "skip" themselves.
+     * @param skipFlag The skipFlag to set.
+     */
+    public void setSkipFlag(boolean skipFlag)
+    {
+        this.skipFlag = skipFlag;
+    }
+
+    /**
+     * @return Returns the name.
+     */
+    public String getName() {
+        return name;
+    }
+    
+    /**
+     * @jsp.attribute required="true"
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+    
+    /**
+     * @return Returns the property.
+     */
+    public String getProperty() {
+        return property;
+    }
+    /**
+     * @jsp.attribute required="false"
+     */
+    public void setProperty(String property) {
+        this.property = property;
+    }
+    
+    /**
+     * @jsp.attribute required="false"
+     */
+    public String getScope() {
+        return scope;
+    }
+    /**
+     * @param scope The scope to set.
+     */
+    public void setScope(String scope) {
+        this.scope = scope;
+    }
+}

Added: incubator/roller/trunk/src/org/roller/presentation/weblog/tags/BigWeblogCalendarModel.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/weblog/tags/BigWeblogCalendarModel.java?rev=189695&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/weblog/tags/BigWeblogCalendarModel.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/weblog/tags/BigWeblogCalendarModel.java Wed Jun  8 20:18:46 2005
@@ -0,0 +1,193 @@
+package org.roller.presentation.weblog.tags;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.roller.RollerException;
+import org.roller.model.WeblogManager;
+import org.roller.pojos.WeblogEntryData;
+import org.roller.presentation.RollerContext;
+import org.roller.presentation.RollerRequest;
+import org.roller.util.DateUtil;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Model for big calendar that displays titles for each day.
+ * @author David M Johnson
+ */
+public class BigWeblogCalendarModel extends WeblogCalendarModel
+{
+    private static Log mLogger = 
+        LogFactory.getFactory().getInstance(BigWeblogCalendarModel.class);
+    
+    protected static final SimpleDateFormat mStarDateFormat = 
+        DateUtil.get8charDateFormat();
+        
+    protected static final SimpleDateFormat mSingleDayFormat = 
+        new SimpleDateFormat("dd");
+
+    /**
+     * @param rreq
+     * @param res
+     * @param url
+     * @param cat
+     */
+    public BigWeblogCalendarModel(RollerRequest rreq, HttpServletResponse res, 
+                                  String url, String cat)
+    {
+        super(rreq, res, url, cat);
+    }
+    
+    /**
+     * @param startDate
+     * @param endDate
+     */
+    protected void loadWeblogEntries(Date startDate, Date endDate, String catName)
+    {
+        try
+        {
+            WeblogManager mgr = mRollerReq.getRoller().getWeblogManager();
+            mMonthMap = mgr.getWeblogEntryObjectMap(
+                            mRollerReq.getWebsite(), // userName
+                            startDate,              // startDate
+                            endDate,                // endDate
+                            catName,                // catName
+                            WeblogManager.PUB_ONLY, // status
+                            null 
+            );
+        }
+        catch (RollerException e)
+        {
+            mLogger.error(e);
+            mMonthMap = new HashMap();
+        }
+    }
+
+    /** 
+     * Create URL for use on view-weblog page, ignores query-string.
+     * @param day   Day for URL
+     * @param valid Always return a URL, never return null 
+     * @return URL for day, or null if no weblog entry on that day
+     */
+    public String computeUrl(Date day, boolean valid)
+    {
+        String url = null;
+        try 
+        {
+            if ( day == null )
+            {
+                url = mRes.encodeURL(mSelfUrl + mCatName);
+            }
+            else 
+            {
+                // get the 8 char YYYYMMDD datestring for day, returns null 
+                // if no weblog entry on that day
+                String dateString = null;
+                List entries = 
+                   (List)mMonthMap.get( day );
+                if ( entries != null && day != null )
+                {
+                	WeblogEntryData entry = (WeblogEntryData)entries.get(0);
+                    dateString = 
+                        mStarDateFormat.format(entry.getPubTime());
+                    
+                    // append 8 char date string on end of selfurl
+                    url = mRes.encodeURL(mSelfUrl+"/"+dateString+mCatName);
+                }
+                else if ( entries != null )
+                {
+                    url = mRes.encodeURL(mSelfUrl+"/"+mCatName);
+                }
+                else if ( valid ) 
+                {
+                    // Make the date yyyyMMdd and append it to URL
+                    dateString = mStarDateFormat.format( day );
+                    url = mRes.encodeURL(mSelfUrl+"/"+dateString+mCatName);
+                }
+            }
+        }
+        catch (Exception e)
+        {
+            RollerRequest.getRollerRequest(mReq)
+                .getServletContext().log("ERROR: creating URL",e);
+        }
+        return url;
+    } 
+    
+    /**
+     * @see org.roller.presentation.tags.calendar.CalendarModel#getContent(Date, boolean)
+     */
+    public String getContent(Date day)
+    {
+        String content = null;
+        try 
+        {
+			RollerRequest rreq = RollerRequest.getRollerRequest(mReq);
+			RollerContext rctx = 
+				RollerContext.getRollerContext(rreq.getServletContext());
+            StringBuffer sb = new StringBuffer();
+            
+            // get the 8 char YYYYMMDD datestring for day, returns null 
+            // if no weblog entry on that day
+            String dateString = null;
+            List entries = (List)mMonthMap.get(day);
+            if ( entries != null )
+            {
+                dateString = mStarDateFormat.format( 
+                    ((WeblogEntryData)entries.get(0)).getPubTime());
+                                
+                // append 8 char date string on end of selfurl
+                String dayUrl = mRes.encodeURL(mSelfUrl+"/"+ dateString+mCatName );
+
+                sb.append("<div class=\"hCalendarDayTitleBig\">");
+                sb.append("<a href=\"");
+                sb.append( dayUrl );
+                sb.append("\">");
+                sb.append( mSingleDayFormat.format( day ) );
+                sb.append("</a></div>");
+                
+                for ( int i=0; i<entries.size(); i++ )
+                {
+                    sb.append("<div class=\"bCalendarDayContentBig\">");
+                    sb.append("<a href=\"");
+                    sb.append(rctx.createEntryPermalink(
+                        (WeblogEntryData)entries.get(i),mReq,false));
+                    sb.append("\">");
+                    
+                    String title = ((WeblogEntryData)entries.get(i)).getTitle().trim();
+                    if ( title.length()==0 )
+                    {
+                        title = ((WeblogEntryData)entries.get(i)).getAnchor();
+                    }
+                    if ( title.length() > 20 )
+                    {
+                        title = title.substring(0,20)+"...";
+                    }
+                   
+                    sb.append( title );
+                    sb.append("</a></div>");                       
+                }  
+                
+            }
+            else
+            {
+                sb.append("<div class=\"hCalendarDayTitleBig\">");
+                sb.append( mSingleDayFormat.format( day ) );
+                sb.append("</div>");
+                sb.append("<div class=\"bCalendarDayContentBig\"/>");
+            }
+            content = sb.toString();              
+        }
+        catch (Exception e)
+        {
+            RollerRequest.getRollerRequest(mReq)
+                .getServletContext().log("ERROR: creating URL",e);
+        }
+        return content;
+    }
+}

Added: incubator/roller/trunk/src/org/roller/presentation/weblog/tags/DateMacro.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/weblog/tags/DateMacro.java?rev=189695&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/weblog/tags/DateMacro.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/weblog/tags/DateMacro.java Wed Jun  8 20:18:46 2005
@@ -0,0 +1,36 @@
+package org.roller.presentation.weblog.tags;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/** For formatting a date using patterns from 
+ * {@link java.text.SimpleDateFormat SimpleDateFormat}.
+ * @deprecated Use methods on 
+ * {@link org.roller.presentation.weblog.WeblogEntryDataEx WeblogEntryDataEx} 
+ * instead.
+ */
+public class DateMacro
+{
+	final Date mDate;
+    
+    /** Construct macro for specified date */
+	public DateMacro( Date d ) 
+	{ 
+		mDate = d; 
+	}
+    
+    /** Format date using pattern */
+	public String view( String pattern )
+	{
+		SimpleDateFormat format = new SimpleDateFormat( pattern );
+		return format.format( mDate );
+	}
+    
+    /** Format date using standard format. */
+	public String toString()
+	{
+		return view("EEEE MMMM dd, yyyy");
+	}
+}
+
+

Added: incubator/roller/trunk/src/org/roller/presentation/weblog/tags/EditWeblogCalendarModel.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/weblog/tags/EditWeblogCalendarModel.java?rev=189695&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/weblog/tags/EditWeblogCalendarModel.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/weblog/tags/EditWeblogCalendarModel.java Wed Jun  8 20:18:46 2005
@@ -0,0 +1,104 @@
+
+package org.roller.presentation.weblog.tags;
+
+import org.roller.model.WeblogManager;
+import org.roller.presentation.RollerRequest;
+import org.roller.presentation.tags.menu.RollerMenuModel;
+import org.roller.util.DateUtil;
+
+import java.util.Calendar;
+import java.util.Date;
+
+import javax.servlet.http.HttpServletResponse;
+
+/** 
+ * Calendar model for calendar intended for use on edit-weblog page.
+ */
+public class EditWeblogCalendarModel extends WeblogCalendarModel
+{    
+    protected String mQueryString = null;
+
+    /**
+     * @param req
+     * @param resp
+     * @param selfUrl
+     * @param queryString  */    
+	public EditWeblogCalendarModel(
+        RollerRequest rreq,  HttpServletResponse res, String url)
+	{
+        super( rreq, res, url, null );
+	}
+    
+    /** 
+     * Create URL for use on edit-weblog page, preserves the request
+     * parameters used by the tabbed-menu tag for navigation.
+     * 
+     * @param day   Day for URL
+     * @param valid Always return a URL, never return null 
+     * @return URL for day, or null if no weblog entry on that day
+     */
+    public String computeUrl( java.util.Date day, boolean valid )
+    {
+        String url = null;
+        try 
+        {
+            boolean haveWeblogEntry = true;
+
+            if ( day == null )
+            {
+                url = mRes.encodeURL(mSelfUrl + mCatName);
+            }
+            else
+            {
+                // get the 8 char YYYYMMDD datestring for day, returns null 
+                // if no weblog entry on that day
+                String dateString = (String)mMonthMap.get( day );
+
+                if ( dateString == null )
+                {
+                    haveWeblogEntry = false;
+
+                    // no weblog entry and no date, so use today as the date 
+                    dateString = DateUtil.format8chars( day );
+                }
+
+                if ( haveWeblogEntry || valid )
+                {
+                    // create URL with params for day, menu, and menu item
+                    StringBuffer sb = new StringBuffer();
+                    sb.append( mSelfUrl );
+
+                    sb.append( '&' );  
+                    sb.append( RollerRequest.WEBLOGDAY_KEY);
+                    sb.append( '=' );  
+                    sb.append( dateString );  
+                
+                    //sb.append( "&method=edit" );
+
+                    if (mReq.getParameter(RollerMenuModel.MENU_KEY) != null )
+                    {
+                        sb.append( '&' );
+                        sb.append( RollerMenuModel.MENU_KEY );
+                        sb.append( '=' );  
+                        sb.append(mReq.getParameter(RollerMenuModel.MENU_KEY));  
+                    }
+                    if (mReq.getParameter(RollerMenuModel.MENU_ITEM_KEY)!=null)
+                    {
+                        sb.append( '&' );  
+                        sb.append( RollerMenuModel.MENU_ITEM_KEY );
+                        sb.append( '=' );  
+                        sb.append(
+                            mReq.getParameter(RollerMenuModel.MENU_ITEM_KEY));  
+                    }
+                    url = mRes.encodeURL( sb.toString() );
+                }
+            }
+        }
+        catch (Exception e)
+        {
+            RollerRequest.getRollerRequest(mReq).getServletContext().log("ERROR: creating URL",e);
+        }
+        return url;
+   }
+}
+

Added: incubator/roller/trunk/src/org/roller/presentation/weblog/tags/RssBadgeTag.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/weblog/tags/RssBadgeTag.java?rev=189695&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/weblog/tags/RssBadgeTag.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/weblog/tags/RssBadgeTag.java Wed Jun  8 20:18:46 2005
@@ -0,0 +1,58 @@
+
+package org.roller.presentation.weblog.tags;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.roller.pojos.UserData;
+import org.roller.presentation.RollerRequest;
+
+import java.io.PrintWriter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.Tag;
+
+/** 
+  * @jsp.tag name="RssBadge"
+  */
+public class RssBadgeTag extends org.roller.presentation.tags.HybridTag 
+{
+    static final long serialVersionUID = 8569693454388788128L;
+    
+    private static Log mLogger = 
+       LogFactory.getFactory().getInstance(RssBadgeTag.class);
+
+  	//------------------------------------------------------------------------ 
+    /**
+     * Process start tag.
+     * @return EVAL_SKIP_BODY
+     */
+    public int doStartTag( PrintWriter pw ) throws JspException 
+	{
+		try
+		{
+			HttpServletRequest req = 
+				(HttpServletRequest)pageContext.getRequest();
+			RollerRequest rreq = RollerRequest.getRollerRequest(req);
+
+			UserData ud = rreq.getUser();
+
+			pw.println(
+				"<a href="+"\""+req.getContextPath()+"/rss/"
+                +ud.getUserName()+"\">"
+				+"<img "+"src=\""+req.getContextPath()+"/images/rssbadge.gif\" "
+				+"class=\"rssbadge\" "
+				+"alt=\"XML\""
+				+"/>"
+				+"</a>");
+		}
+		catch (Exception e)
+		{
+            mLogger.error("Exception",e);
+			throw new JspException(
+				e.getClass().toString()+": "+e.getMessage(),e);
+		}
+		return Tag.SKIP_BODY;
+    }
+}
+

Added: incubator/roller/trunk/src/org/roller/presentation/weblog/tags/ViewWeblogEntriesTag.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/weblog/tags/ViewWeblogEntriesTag.java?rev=189695&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/weblog/tags/ViewWeblogEntriesTag.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/weblog/tags/ViewWeblogEntriesTag.java Wed Jun  8 20:18:46 2005
@@ -0,0 +1,160 @@
+package org.roller.presentation.weblog.tags;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.velocity.Template;
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.runtime.RuntimeSingleton;
+import org.roller.model.WeblogManager;
+import org.roller.pojos.PageData;
+import org.roller.pojos.WebsiteData;
+import org.roller.presentation.RollerRequest;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.Tag;
+
+
+//////////////////////////////////////////////////////////////////////////////
+/**
+ * @jsp.tag name="ViewWeblogEntries"
+ */
+public class ViewWeblogEntriesTag 
+	extends org.roller.presentation.tags.HybridTag
+{
+    private static Log mLogger = 
+        LogFactory.getFactory().getInstance(RollerRequest.class);
+
+    /** @jsp.attribute */
+    public String getDayTemplate() { return mDayTemplate; }
+    public void setDayTemplate( String n ) { mDayTemplate = n; }
+    private String mDayTemplate = null;
+
+    /** @jsp.attribute */
+    public String getCatName() { return mCatName; }
+    public void setCatName( String n ) { mCatName = n; }
+    private String mCatName = null;
+
+	/** @jsp.attribute */
+	public int getMaxEntries() { return mMaxEntries; }
+    public void setMaxEntries( int v ) { mMaxEntries = v; }
+	private int mMaxEntries = -1;
+
+   	//------------------------------------------------------------------------ 
+
+	public String view( String catName )
+	{
+		mCatName = catName;
+		return emit();
+	}
+
+	public String view( String catName, int maxEntries )
+	{
+		mCatName = catName;
+		mMaxEntries = maxEntries;
+		return emit();
+	}
+
+   	//------------------------------------------------------------------------ 
+    /**
+     * This doStartTag is for the weblog template implementation
+     * @return EVAL_SKIP_BODY
+     */
+    public int doStartTag( PrintWriter pw ) throws JspException 
+	{
+		try
+		{
+			HttpServletRequest req = 
+				(HttpServletRequest)pageContext.getRequest();
+
+			RollerRequest rreq = RollerRequest.getRollerRequest(req);
+
+			// need website so we can get weblog day template
+			WebsiteData website = rreq.getWebsite( );
+            
+            String catName = mCatName;
+            if (catName == null)
+            {
+                catName= req.getParameter(RollerRequest.WEBLOGCATEGORYNAME_KEY);
+            }
+
+            String name = null;
+            if ( rreq.getUser() != null )
+            {
+                name = rreq.getUser().getUserName();
+            }
+
+			// get recent weblog entries
+			int max = (mMaxEntries == -1) ? 15 : mMaxEntries;
+            Date dayParam = rreq.getDate(true);
+            WeblogManager mgr = rreq.getRoller().getWeblogManager();
+            
+            //Map map = mgr.getRecentWeblogEntries( 
+                //name, dayParam, catName, max, true );
+
+            Map map = mgr.getWeblogEntryObjectMap(
+                            rreq.getWebsite(),      // userName
+                            null,                  // startDate
+                            dayParam,               // endDate
+                            catName,                // catName
+                            WeblogManager.PUB_ONLY, // status
+                            new Integer(max));     // maxEntries      
+            
+            
+            // Get page id if daytemplate is specified
+            String pid = null; 
+            if ( mDayTemplate != null )
+            {
+                PageData page =
+                    rreq.getRoller().getUserManager().getPageByLink(
+                        website, mDayTemplate );
+                if (page != null)
+                {
+                    pid = page.getId();
+                }            
+            }
+            if ( pid == null )
+            {
+                pid = website.getWeblogDayPageId();
+            }
+            
+            // get day template and run it through Velocity
+            Template vtemplate = RuntimeSingleton.getTemplate( pid );
+
+			// through entries, one day per iteration 
+			int count = 0;
+			Iterator iter = map.keySet().iterator();
+			while ( iter.hasNext() )
+			{
+				// get date and entries for that date
+				Date d = (Date)iter.next();
+
+                VelocityContext vcontext = new VelocityContext();
+                WeblogEntryMacros macros = 
+                    new WeblogEntryMacros( pageContext, d );
+                vcontext.put( "macros", macros );
+
+				ArrayList entries = (ArrayList)map.get( d );                
+                vcontext.put( "entries", entries ); 
+
+				vtemplate.merge( vcontext, pw );
+
+				if ( mMaxEntries != -1 && count > mMaxEntries ) break;
+				count++;
+			}
+		}
+		catch (Exception e)
+		{
+            mLogger.error("Unexpected exception",e);
+			throw new JspException(e);
+		}
+		return Tag.SKIP_BODY;
+    }
+}
+

Added: incubator/roller/trunk/src/org/roller/presentation/weblog/tags/WeblogCalendarModel.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/weblog/tags/WeblogCalendarModel.java?rev=189695&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/weblog/tags/WeblogCalendarModel.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/weblog/tags/WeblogCalendarModel.java Wed Jun  8 20:18:46 2005
@@ -0,0 +1,266 @@
+
+package org.roller.presentation.weblog.tags;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.roller.RollerException;
+import org.roller.model.WeblogManager;
+import org.roller.presentation.RollerRequest;
+import org.roller.presentation.tags.calendar.CalendarModel;
+import org.roller.util.DateUtil;
+
+import java.text.ParsePosition;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/** 
+ * Calendar model for calendar intended for use on view-weblog page.
+ */
+public class WeblogCalendarModel implements CalendarModel
+{
+    private static Log mLogger = 
+        LogFactory.getFactory().getInstance(WeblogCalendarModel.class);
+    
+    protected RollerRequest       mRollerReq = null;
+	protected HttpServletRequest  mReq = null;
+	protected HttpServletResponse mRes = null;
+	protected Map                 mMonthMap;
+    protected String              mSelfUrl;
+    protected Date                mDay;
+    protected String              mCatName = null;
+    protected Calendar            mCalendar = null;
+
+	public WeblogCalendarModel(
+        RollerRequest rreq, HttpServletResponse res, String url, String cat)
+	{
+        mRollerReq = rreq;
+		mReq = rreq.getRequest();
+		mRes = res;
+        mSelfUrl = url;
+        
+        setDay( mRollerReq.getDate(true) );
+        
+        // If category is specified in URL, then perpetuate it
+        String catKey = RollerRequest.WEBLOGCATEGORYNAME_KEY;
+        String catToUse = mReq.getParameter(catKey);
+        if (mReq.getParameter(catKey) == null)
+        {
+            // If no cat in URL, then use method argument
+            catToUse = cat;
+        }
+        if ( catToUse != null )
+        {
+            mCatName = "?"+catKey+"="+catToUse;
+        }
+        else
+        {
+            mCatName = "";
+        }                
+    }
+ /*   
+	public static WeblogCalendarModel getInstance(
+		HttpServletRequest req, HttpServletResponse res, String url, String cat)
+	{
+		return new WeblogCalendarModel(RollerRequest.getRollerRequest(req), res, url, cat);
+	}
+*/	
+	private void setDay(Date month)
+	{
+        mDay = month;
+        
+        // If category is specified in URL, then use it
+        String catName = 
+            mReq.getParameter(RollerRequest.WEBLOGCATEGORYNAME_KEY);
+
+        mCalendar = Calendar.getInstance(
+                                mRollerReq.getWebsite().getTimeZoneInstance(),
+                                mRollerReq.getWebsite().getLocaleInstance()
+        );   
+        
+        Calendar cal = (Calendar)mCalendar.clone();
+        
+        // Compute first second of month
+        cal.setTime(month);
+        cal.set(Calendar.DAY_OF_MONTH, cal.getMinimum(Calendar.DAY_OF_MONTH));
+        cal.set(Calendar.HOUR_OF_DAY, cal.getMinimum(Calendar.HOUR_OF_DAY));
+        cal.set(Calendar.MINUTE, cal.getMinimum(Calendar.MINUTE));
+        cal.set(Calendar.SECOND, cal.getMinimum(Calendar.SECOND));
+        cal.set(Calendar.MILLISECOND, cal.getMinimum(Calendar.MILLISECOND));
+        Date startDate = cal.getTime();
+        
+        // Compute last second of month
+        cal.set(Calendar.DAY_OF_MONTH, cal.getMaximum(Calendar.DAY_OF_MONTH));
+        cal.set(Calendar.HOUR_OF_DAY, cal.getMaximum(Calendar.HOUR_OF_DAY));
+        cal.set(Calendar.MINUTE, cal.getMaximum(Calendar.MINUTE));
+        cal.set(Calendar.SECOND, cal.getMaximum(Calendar.SECOND));
+        cal.set(Calendar.MILLISECOND, cal.getMaximum(Calendar.MILLISECOND));
+        Date endDate = cal.getTime();
+
+        loadWeblogEntries(startDate, endDate, catName);
+    }
+	
+	/**
+     * @param startDate
+     * @param endDate
+     */
+    protected void loadWeblogEntries(Date startDate, Date endDate, String catName)
+    {
+        try
+        {
+            WeblogManager mgr = mRollerReq.getRoller().getWeblogManager();
+            mMonthMap = mgr.getWeblogEntryStringMap(
+                            mRollerReq.getWebsite(), // userName
+                            startDate,              // startDate
+                            endDate,                // endDate
+                            catName,                // catName
+                            WeblogManager.PUB_ONLY, // status
+                            null 
+            );
+        }
+        catch (RollerException e)
+        {
+            mLogger.error(e);
+            mMonthMap = new HashMap();
+        }
+    }
+    
+    public void setDay(String month) throws Exception
+	{
+        SimpleDateFormat fmt = DateUtil.get8charDateFormat();
+		ParsePosition pos = new ParsePosition(0);
+        setDay( fmt.parse( month, pos ) );
+	}
+	
+	public Date getDay()
+	{
+        return (Date)mDay.clone();
+	}
+	
+	public String getSelfUrl() throws Exception
+	{
+        return mRes.encodeURL(mSelfUrl);
+	}
+
+	public String getTargetUrl() throws Exception
+	{
+		return getSelfUrl();
+	}
+
+	public String getParameterName()
+	{
+		return RollerRequest.WEBLOGDAY_KEY;
+	}
+
+	public String getParameterValue( Date day )
+	{
+		return (String)mMonthMap.get( day );
+	}
+
+    /** 
+     * Create URL for use on view-weblog page, ignores query-string.
+     * @param day   Day for URL
+     * @param valid Always return a URL, never return null 
+     * @return URL for day, or null if no weblog entry on that day
+     */
+    public String computeUrl(java.util.Date day, boolean valid)
+    {
+        String url = null;
+        try 
+        {
+            if ( day == null )
+            {
+                url = mRes.encodeURL(mSelfUrl + mCatName);
+            }
+            else
+            {            
+                // get the 8 char YYYYMMDD datestring for day, returns null 
+                // if no weblog entry on that day
+                String dateString = (String)mMonthMap.get( day );
+                if ( dateString != null )
+                {                
+                    // append 8 char date string on end of selfurl
+                    url = mRes.encodeURL(mSelfUrl+"/"+dateString+mCatName);
+                }
+                else if ( valid ) 
+                {
+                    // Make the date yyyyMMdd and append it to URL
+                    dateString = DateUtil.format8chars( day );
+                    url = mRes.encodeURL( mSelfUrl+"/"+dateString+mCatName);
+                }
+            }
+        }
+        catch (Exception e)
+        {
+           mRollerReq.getServletContext().log("ERROR: creating URL",e);
+        }
+        return url;
+    } 
+    
+    /**
+     * @see org.roller.presentation.tags.calendar.CalendarModel#getContent(Date, boolean)
+     */
+    public String getContent(Date day)
+    {
+        return null;
+    }
+    
+    public Calendar getCalendar()
+    {
+        return (Calendar)mCalendar.clone();
+    }
+    
+    public Date getNextMonth()
+    {
+        Calendar nextCal = getCalendar();
+        nextCal.setTime( mDay );
+        nextCal.add( Calendar.MONTH, 1 );
+        return getFirstDayOfMonth(nextCal).getTime();
+    }
+    
+    protected Calendar getFirstDayOfMonth(Calendar cal) 
+    {
+        int firstDay = cal.getActualMinimum(Calendar.DAY_OF_MONTH);
+        cal.set(Calendar.DAY_OF_MONTH, firstDay);
+        return cal;
+    }
+    
+    protected Calendar getLastDayOfMonth(Calendar cal) 
+    {
+        int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
+        cal.set(Calendar.DAY_OF_MONTH, lastDay);
+        return cal;
+    }
+    
+    public String computeNextMonthUrl()
+    {
+        // Create yyyyMMdd dates for next month, prev month and today 
+        Calendar nextCal = getCalendar();
+        nextCal.setTime( mDay );
+        nextCal.add( Calendar.MONTH, 1 );
+        Date nextMonth = getLastDayOfMonth(nextCal).getTime();
+        String nextMonthUrl = computeUrl(nextMonth, true);            
+        return nextMonthUrl;
+    }
+
+    public String computePrevMonthUrl()
+    {
+        Calendar prevCal = getCalendar();
+        prevCal.setTime( mDay );
+        prevCal.add( Calendar.MONTH, -1 );
+        getLastDayOfMonth( prevCal );
+        String prevMonth = computeUrl(prevCal.getTime(),true);
+        return prevMonth;
+    }
+
+    public String computeTodayMonthUrl()
+    {
+        return computeUrl(null,true);
+    }
+}
+

Added: incubator/roller/trunk/src/org/roller/presentation/weblog/tags/WeblogCategoryChooserTag.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/weblog/tags/WeblogCategoryChooserTag.java?rev=189695&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/weblog/tags/WeblogCategoryChooserTag.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/weblog/tags/WeblogCategoryChooserTag.java Wed Jun  8 20:18:46 2005
@@ -0,0 +1,144 @@
+package org.roller.presentation.weblog.tags;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.struts.util.RequestUtils;
+import org.roller.model.WeblogManager;
+import org.roller.pojos.UserData;
+import org.roller.pojos.WeblogCategoryData;
+import org.roller.presentation.RollerRequest;
+
+import java.io.PrintWriter;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.Tag;
+
+
+/**
+ * @jsp.tag name="WeblogCatagoryChooser"
+ */
+public class WeblogCategoryChooserTag 
+	extends org.roller.presentation.tags.HybridTag
+{
+    static final long serialVersionUID = 1553415977601404703L;
+    
+    private static Log mLogger = 
+       LogFactory.getFactory().getInstance(WeblogCategoryChooserTag.class);
+
+  	//------------------------------------------------------------- 
+    /**
+     * Process start tag.
+     * @return EVAL_SKIP_BODY
+     */
+    public int doStartTag( PrintWriter pw ) throws JspException 
+	{
+		try
+		{
+			HttpServletRequest req = 
+				(HttpServletRequest)pageContext.getRequest();
+			RollerRequest rreq = RollerRequest.getRollerRequest(
+                (HttpServletRequest)pageContext.getRequest());
+
+			WeblogManager weblogMgr = 
+				rreq.getRoller().getWeblogManager(); 
+
+			UserData user = rreq.getUser();
+			List weblogCats = 
+				weblogMgr.getWeblogCategories(rreq.getWebsite(), false);
+
+			String rawUrl = req.getContextPath()+"/page/"+user.getUserName();
+
+			pw.println("<div class=\"rWeblogCategoryChooser\">");
+
+			Hashtable params = new Hashtable();
+			params.put( RollerRequest.USERNAME_KEY, user.getUserName() );
+			String weblog = RequestUtils.computeURL( 
+				pageContext, 
+				null,   // forward 
+				rawUrl, // href
+				null,   // page
+				null,
+				params, // params
+				null,   // anchor
+				false); // redirect
+            String catClass = "rUnchosenCategory";
+            String chosenCat = 
+                    req.getParameter(RollerRequest.WEBLOGCATEGORYNAME_KEY);
+            if ( chosenCat != null )
+            {
+                pw.println(
+                    "<a href=\""+weblog+"\" class=\""+catClass+"\">"
+                        + "All" +
+                    "</a>");
+            }
+            else
+            {
+                catClass = "rChosenCategory";
+                pw.println(
+                    "<span class=\""+catClass+"\">"
+                        + "All" +
+                    "</span>");
+            }
+
+			for (Iterator wbcItr = weblogCats.iterator(); wbcItr.hasNext(); ) 
+            {	
+				WeblogCategoryData category = (WeblogCategoryData) wbcItr.next();
+				String catName = category.getName();
+                
+                // For now don't show root category
+                if (category.getParent() == null) continue;
+				
+				params = new Hashtable();
+
+				String pid = pageContext.getRequest().getParameter(
+					RollerRequest.PAGEID_KEY );
+				if (pid != null) params.put( RollerRequest.PAGEID_KEY,pid);
+
+				params.put( RollerRequest.WEBLOGCATEGORYNAME_KEY, catName);
+
+				pw.println(" | ");
+				weblog = RequestUtils.computeURL( 	
+					pageContext, 
+					null,   // forward 
+					rawUrl, // href
+					null,   // page
+					null,
+					params, // params
+					null,   // anchor
+					false); // redirect
+    
+				catClass = "rUnchosenCategory";
+				chosenCat = req.getParameter(
+                    RollerRequest.WEBLOGCATEGORYNAME_KEY);
+				if ( chosenCat != null && chosenCat.equals(catName) )
+				{
+					catClass = "rChosenCategory";
+					pw.println(
+						"<span class=\""+catClass+"\">"
+							+ category.getPath() +
+						"</span>");
+				} 
+				else
+				{
+					pw.println(
+						"<a href=\""+weblog+"\" class=\""+catClass+"\">"
+							+ category.getPath() +
+						"</a>");
+				}
+			}
+			
+			pw.println("</div>");
+		}
+		catch (Exception e)
+		{
+            mLogger.error("Exception",e);
+			throw new JspException(e);
+		}
+		return Tag.SKIP_BODY;
+    }
+}
+

Added: incubator/roller/trunk/src/org/roller/presentation/weblog/tags/WeblogEntryMacros.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/weblog/tags/WeblogEntryMacros.java?rev=189695&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/weblog/tags/WeblogEntryMacros.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/weblog/tags/WeblogEntryMacros.java Wed Jun  8 20:18:46 2005
@@ -0,0 +1,244 @@
+package org.roller.presentation.weblog.tags;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.struts.util.RequestUtils;
+import org.roller.model.RefererManager;
+import org.roller.model.Roller;
+import org.roller.model.WeblogManager;
+import org.roller.pojos.RefererData;
+import org.roller.pojos.WeblogEntryData;
+import org.roller.presentation.RollerRequest;
+import org.roller.presentation.velocity.Macros;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.jsp.PageContext;
+
+//////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Provides the macros object that is available to Roller day templates.
+ */
+public class WeblogEntryMacros extends Macros 
+{
+    private static Log mLogger = 
+        LogFactory.getFactory().getInstance(RollerRequest.class);
+
+    private Date mDate = null;
+
+    //-----------------------------------------------------------------------
+    /**
+     * Construct macros object for page context and date.
+     * @param ctx JSP page context being processed.
+     * @param date Data formatter for entry's date.
+     */
+    public WeblogEntryMacros( PageContext ctx, Date date )
+    {
+        super( ctx, null );
+        mDate = date;
+    }
+    
+    //-----------------------------------------------------------------------
+    public List getDayLinkbacks()
+    {
+        List list = new ArrayList();
+        try
+        {
+            List refs = null;
+            
+            Roller roller = getRollerRequest().getRoller();
+            String userName = getRollerRequest().getUser().getUserName();
+            RefererManager refmgr = roller.getRefererManager();
+             
+            refs = refmgr.getReferersToDate( getWebsite(), view("yyyyMMdd") ); 
+                
+            for (Iterator rdItr = refs.iterator(); rdItr.hasNext();) {
+					RefererData referer = (RefererData) rdItr.next();
+					
+					if ( referer.getTitle()==null ) continue;
+					if ( referer.getTitle().trim().equals("") ) continue;
+					if ( referer.getExcerpt()==null ) continue;
+					if ( referer.getExcerpt().trim().equals("") ) continue;
+    
+					if (   referer.getVisible().booleanValue() 
+						|| getRollerRequest().isUserAuthorizedToEdit() )
+					{ 
+						list.add( referer );
+					}
+				}
+              
+        }
+        catch (Exception e)
+        {
+            mLogger.error("Getting referers",e);
+        }
+        return list;
+    }
+    
+    //-----------------------------------------------------------------------
+    /** Show entry date using standard format.
+     * @deprecated Use methods on
+     * {@link org.roller.presentation.weblog.WeblogEntryDataEx WeblogEntryDataEx}
+     * instead.
+     */
+    public String showEntryDate()
+    {
+        return this.toString();
+    }
+    
+    //-----------------------------------------------------------------------
+    /** Show entry date using specified
+     * {@link java.text.SimpleDateFormat SimpleDateFormat}
+     * format.
+     * @deprecated Use methods on
+     * {@link org.roller.presentation.weblog.WeblogEntryDataEx WeblogEntryDataEx}
+     * instead.
+     */
+    public String showFormattedEntryDate( String format )
+    {
+        return this.view( format );
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Show entry permalink and an edit-entry link if logged in as editor.
+     * @param entry Weblog entry for which permalink is to be shown.
+     * @deprecated Use methods on
+     * {@link org.roller.presentation.weblog.WeblogEntryDataEx WeblogEntryDataEx}
+     * instead.
+     * @return HTML for displaying entry permalink icon with permalink.
+     */
+    public String showEntryPermalink( WeblogEntryData entry )
+    {
+        HttpServletRequest request = getRollerRequest().getRequest();
+        String userName = getRollerRequest().getUser().getUserName();
+
+        String edit = null;
+        try
+        {
+            if ( getRollerRequest().isUserAuthorizedToEdit() )
+            {
+                Hashtable params = new Hashtable();
+                params.put( RollerRequest.WEBLOGENTRYID_KEY, entry.getId());
+                params.put( RollerRequest.USERNAME_KEY, userName);
+                params.put( RollerRequest.ANCHOR_KEY, entry.getAnchor());
+                edit = RequestUtils.computeURL( mPageContext,
+                    "editWeblog", null, null, params,null,false);
+            }
+        }
+        catch (Exception e)
+        {
+           // should never happen, but if it does:
+           mLogger.error("ERROR creating Edit-Entry URL",e);
+        }
+
+        StringBuffer sb = new StringBuffer();
+        sb.append( "<a href=\"");
+        sb.append( request.getContextPath());
+        sb.append( "/page/");
+        sb.append( userName );
+        sb.append( "/");
+        sb.append( showFormattedEntryDate("yyyyMMdd") );
+        sb.append( "#" );
+        sb.append( entry.getAnchor() );
+        sb.append( "\" title=\"Permanent link to this weblog entry\"" );
+        sb.append( " class=\"entrypermalink\">#</a>" );
+        if ( edit != null )
+        {
+            sb.append( " [<a href=\""+edit+"\">Edit</a>]" );
+        }
+
+        return sb.toString();
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Show day permalink and an edit-entry link if logged in as editor.
+     * @return HTML for displaying day permalink icon with permalink.
+     */
+    public String showDayPermalink()
+    {
+        HttpServletRequest request =
+            (HttpServletRequest)mPageContext.getRequest();
+
+        String userName = 
+            RollerRequest.getRollerRequest(request).getUser().getUserName();
+
+        StringBuffer sb = new StringBuffer();
+        sb.append( "<a href=\"");
+        sb.append( request.getContextPath());
+        sb.append( "/page/");
+        sb.append( userName );
+        sb.append( "/");
+        sb.append( showFormattedEntryDate("yyyyMMdd") );
+        sb.append( "\"><img class=\"daypermalink\" src=\"" );
+        sb.append( request.getContextPath() );
+        sb.append( "/images/permalink.gif\" ");
+        sb.append( "title=\"Permanent link to this day\" " );
+        sb.append( "alt=\"" + showFormattedEntryDate("yyyyMMdd") + "\"/></a>" );
+
+        return sb.toString();
+    }
+
+    //-----------------------------------------------------------------------
+
+    public String showCommentsLink( WeblogEntryData entry )
+    {
+        if (entry.getWebsite().getAllowComments().booleanValue())
+        {
+            HttpServletRequest request =
+                (HttpServletRequest)mPageContext.getRequest();
+
+            int commentCount = 0;
+            RollerRequest rreq = null;
+            try
+            {
+                rreq = RollerRequest.getRollerRequest(request);
+                WeblogManager mgr = rreq.getRoller().getWeblogManager();
+                List comments = mgr.getComments( entry.getId() );
+                commentCount = comments.size();
+            }
+            catch (Exception e)
+            {
+                // should never happen, but if it does:
+                if (rreq != null)
+                   mLogger.error("ERROR in showCommentsLink",e);
+                else
+                    System.err.println("ERROR in showCommentsLink:"+e.toString());
+            }
+            StringBuffer link = new StringBuffer( request.getContextPath());
+            link.append( "/comment.do?method=edit&amp;entryid=");
+            link.append( entry.getId() );
+
+            StringBuffer sb = new StringBuffer("<a href=\"");            
+            sb.append( link );
+            sb.append("\" onclick=\"window.open('");
+            sb.append( link ).append("','comments','");
+            sb.append("width=480,height=480,scrollbars=yes,status=yes');");
+            sb.append("return false\" class=\"entrycommentslink\">Comments [");
+            sb.append(commentCount).append("]</a>");
+            return sb.toString();
+        }
+        return "";
+    }
+    
+    /** Format date using pattern */
+    public String view( String pattern )
+    {
+        SimpleDateFormat format = new SimpleDateFormat( pattern );
+        return format.format( mDate );
+    }
+    /** Format date using standard format. */
+    public String toString()
+    {
+        return view("EEEE MMMM dd, yyyy");
+    }
+}
+

Added: incubator/roller/trunk/src/org/roller/presentation/weblog/tags/package.html
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/weblog/tags/package.html?rev=189695&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/weblog/tags/package.html (added)
+++ incubator/roller/trunk/src/org/roller/presentation/weblog/tags/package.html Wed Jun  8 20:18:46 2005
@@ -0,0 +1,9 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+  <title></title>
+</head>
+<body>
+JSP tags for displaying and editing weblog entries.<br>
+</body>
+</html>

Added: incubator/roller/trunk/src/org/roller/presentation/website/ThemeCache.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/website/ThemeCache.java?rev=189695&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/website/ThemeCache.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/website/ThemeCache.java Wed Jun  8 20:18:46 2005
@@ -0,0 +1,109 @@
+package org.roller.presentation.website;
+
+import org.roller.util.LRUCache2;
+
+/**
+ * Caches the Theme files to avoid repeated reading of the files from the
+ * harddrive.
+ * 
+ * @author llavandowska
+ */
+public class ThemeCache
+{
+	private static ThemeCache INSTANCE = new ThemeCache();
+	private static String cacheName = "ThemeFiles";
+	/**
+	 * How many objects to store in cache.
+	 * @TODO Add configuration for maxObjects in theme cache
+	 */
+	private static int  maxObjects = 500;
+	
+    private static LRUCache2 cache = new LRUCache2(maxObjects, 30 * 60 * 1000);
+	
+	/**
+	 * How long until an object in cache expires.
+	 * @TODO Add configuration for theme cache timeout
+	 */
+	private long expireInterval = 1000l*60*60*24; // 1 second * 1 min * 1 hr * 24 hours
+	
+	/**
+	 * Should the PreviewResourceLoader cache the Template files.
+	 * @TODO Add configuration for enabling theme template caching
+	 */
+	private static boolean cacheTemplateFiles = false;
+		
+	/** Private constructor to prevent outside instantiation **/
+	private ThemeCache() { }
+		
+	/**
+	 * 
+	 */
+	public static ThemeCache getInstance()
+	{
+		return INSTANCE;
+	}
+	
+	/**
+	 * 
+	 */
+	public String putIntoCache(String themeName, String fileName, String template)
+	{
+		if (cacheTemplateFiles)
+		{
+			cache.put(themeName+":"+fileName, template);
+		}
+		return template;
+
+	}
+	
+	/**
+	 * Null will be returned if there is a problem or if caching is "turned
+	 * off".
+	 */
+	public String getFromCache(String themeName, String fileName)
+	{
+		if (!cacheTemplateFiles) return null;
+		return (String) cache.get(themeName + ":" + fileName);
+	}
+	
+	/**
+	 * 
+	 */
+	public void removeFromCache(String themeName, String fileName)
+	{
+		if (!cacheTemplateFiles) return;
+		cache.purge( new String[] { themeName+":"+fileName } );
+	}
+
+    
+    /**
+     * The list of files in a Theme is cached as a String[], the key being the
+     * Theme location itself.
+     * 
+     * @param themeDir
+     * @param fileNames
+     * @return String[]
+     */
+    public String[] setFileList(String themeDir, String[] fileNames)
+    {
+		if (cacheTemplateFiles)
+		{
+        	    cache.put(themeDir, fileNames);
+		}
+        return fileNames;
+
+    }
+    
+    /**
+     * The list of files in a Theme is cached as a String[], the key being the
+     * Theme location itself.  If caching is turned off this will return null.
+     * 
+     * @param theme
+     * @return String[]
+     */
+    public String[] getFileList(String themeDir)
+    {
+		if (!cacheTemplateFiles) return null;
+        return (String[])cache.get(themeDir);
+    }
+}

Added: incubator/roller/trunk/src/org/roller/presentation/website/actions/CommonPingTargetsAction.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/website/actions/CommonPingTargetsAction.java?rev=189695&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/website/actions/CommonPingTargetsAction.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/website/actions/CommonPingTargetsAction.java Wed Jun  8 20:18:46 2005
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2005
+ * Anil R. Gangolli. All rights reserved.
+ *
+ * Distributed with the Roller Weblogger Project under the terms of the Roller Software
+ * License
+ */
+
+package org.roller.presentation.website.actions;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.roller.RollerException;
+import org.roller.model.PingTargetManager;
+import org.roller.pojos.PingTargetData;
+import org.roller.presentation.RollerRequest;
+import org.roller.presentation.forms.PingTargetForm;
+import org.roller.presentation.weblog.actions.BasePingTargetsAction;
+
+import java.util.List;
+
+/**
+ * Administer common ping targets.
+ *
+ * @struts.action name="pingTargetForm" path="/admin/commonPingTargets" scope="request" parameter="method"
+ * @struts.action-forward name="pingTargets.page" path="/website/CommonPingTargets.jsp"
+ * @struts.action-forward name="pingTargetEdit.page" path="/website/CommonPingTargetEdit.jsp"
+ * @struts.action-forward name="pingTargetDeleteOK.page" path="/website/CommonPingTargetDeleteOK.jsp"
+ */
+public class CommonPingTargetsAction extends BasePingTargetsAction
+{
+    private static Log mLogger =
+        LogFactory.getFactory().getInstance(CommonPingTargetsAction.class);
+
+    protected Log getLogger() {
+        return mLogger;
+    }
+
+    /*
+     * Get the ping targets for the view.  Here we return the common ping targets for the
+     * entire site.
+     */
+    protected List getPingTargets(RollerRequest rreq) throws RollerException
+    {
+        PingTargetManager pingTargetMgr = rreq.getRoller().getPingTargetManager();
+        return pingTargetMgr.getCommonPingTargets();
+    }
+
+    /*
+     * Create a new ping target (blank). Here we create a common ping target.
+     */
+    protected PingTargetData createPingTarget(RollerRequest rreq, PingTargetForm pingTargetForm)
+        throws RollerException
+    {
+        PingTargetManager pingTargetMgr = rreq.getRoller().getPingTargetManager();
+        return pingTargetMgr.createCommonPingTarget(
+            pingTargetForm.getName(), pingTargetForm.getPingUrl());
+    }
+
+
+    /*
+     * Check if request carries admin rights.
+     */
+    protected boolean hasRequiredRights(RollerRequest rreq) throws RollerException
+    {
+        // This mimics the check in other admin actions, but not sure why the latter is not sufficient.
+        return (rreq.isUserAuthorizedToEdit() && rreq.isAdminUser());
+    }
+}

Added: incubator/roller/trunk/src/org/roller/presentation/website/actions/MaintenanceAction.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/website/actions/MaintenanceAction.java?rev=189695&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/website/actions/MaintenanceAction.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/website/actions/MaintenanceAction.java Wed Jun  8 20:18:46 2005
@@ -0,0 +1,129 @@
+/*
+ * Created on May 25, 2004
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package org.roller.presentation.website.actions;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+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.action.ActionMessage;
+import org.apache.struts.action.ActionMessages;
+import org.apache.struts.actions.DispatchAction;
+import org.roller.RollerException;
+import org.roller.business.search.operations.RebuildUserIndexOperation;
+import org.roller.model.IndexManager;
+import org.roller.pojos.UserData;
+import org.roller.presentation.RollerRequest;
+import org.roller.presentation.pagecache.PageCacheFilter;
+
+/**
+ * Allows user to perform Website maintenence operations such as flushing
+ * the website page cache or re-indexing the website search index.
+ * 
+ * @struts.action path="/editor/maintenance" name="maintenanceForm" scope="request" parameter="method"
+ * 
+ * @struts.action-forward name="maintenance.page" path="/website/Maintenance.jsp"
+ */
+public class MaintenanceAction extends DispatchAction 
+{
+    private static Log mLogger = 
+        LogFactory.getFactory().getInstance(MaintenanceAction.class);
+
+
+	/* (non-Javadoc)
+	 * @see org.apache.struts.actions.DispatchAction#unspecified(
+	 * 	org.apache.struts.action.ActionMapping, 
+	 *  org.apache.struts.action.ActionForm, 
+	 *  javax.servlet.http.HttpServletRequest, 
+	 *  javax.servlet.http.HttpServletResponse)
+	 */
+	protected ActionForward unspecified(
+			ActionMapping       mapping,
+			ActionForm          actionForm,
+			HttpServletRequest  request,
+			HttpServletResponse response)
+			throws ServletException
+	{
+		return mapping.findForward("maintenance.page");
+	}
+
+	//-----------------------------------------------------------------------
+    /**
+     * Respond to user's request to rebuild search index.
+     */
+	public ActionForward index(
+		ActionMapping       mapping,
+		ActionForm          actionForm,
+		HttpServletRequest  request,
+		HttpServletResponse response)
+		throws IOException, ServletException
+	{
+		try
+		{
+			RollerRequest rreq = RollerRequest.getRollerRequest(request);
+			if ( rreq.isUserAuthorizedToEdit() )
+			{
+				UserData ud = rreq.getUser();
+				IndexManager manager = rreq.getRoller().getIndexManager();
+				manager.rebuildUserIndex();
+				
+                ActionMessages messages = new ActionMessages();
+                messages.add(null, new ActionMessage("maintenance.message.indexed"));
+                saveMessages(request, messages);
+			}
+		}
+		catch (RollerException re)
+		{
+			mLogger.error("Unexpected exception",re.getRootCause());
+			throw new ServletException(re);
+		}
+		catch (Exception e)
+		{
+			mLogger.error("Unexpected exception",e);
+			throw new ServletException(e);
+		}
+		return mapping.findForward("maintenance.page");
+	}
+
+    //-----------------------------------------------------------------------
+    /**
+     * Respond to request to flush a user's page cache.
+     */
+    public ActionForward flushCache(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws IOException, ServletException
+    {
+        try
+        {
+			RollerRequest rreq = RollerRequest.getRollerRequest(request);
+			if ( rreq.isUserAuthorizedToEdit() )
+			{
+				UserData user = rreq.getUser();
+	            PageCacheFilter.removeFromCache(request, user);
+
+                ActionMessages messages = new ActionMessages();
+                messages.add(null, new ActionMessage("maintenance.message.flushed"));
+                saveMessages(request, messages);
+            }
+        }
+        catch (Exception e)
+        {
+            throw new ServletException(e);
+        }
+		return mapping.findForward("maintenance.page");
+    }
+}

Added: incubator/roller/trunk/src/org/roller/presentation/website/actions/PageFormAction.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/website/actions/PageFormAction.java?rev=189695&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/website/actions/PageFormAction.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/website/actions/PageFormAction.java Wed Jun  8 20:18:46 2005
@@ -0,0 +1,372 @@
+
+package org.roller.presentation.website.actions;
+
+import java.io.IOException;
+import java.util.List;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+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.RollerException;
+import org.roller.RollerPermissionsException;
+import org.roller.model.UserManager;
+import org.roller.pojos.PageData;
+import org.roller.pojos.UserData;
+import org.roller.pojos.WebsiteData;
+import org.roller.presentation.RollerRequest;
+import org.roller.presentation.forms.PageForm;
+import org.roller.presentation.pagecache.PageCacheFilter;
+import org.roller.util.StringUtils;
+import org.roller.util.Utilities;
+
+
+/////////////////////////////////////////////////////////////////////////////
+/**
+ * Page form action.
+ * @struts.action name="pageForm" path="/editor/page"
+ *  	scope="session" parameter="method"
+ * 
+ * @struts.action-forward name="removePage.page" path="/website/remove-page.jsp"
+ * @struts.action-forward name="editPage.page" path="/website/edit-page.jsp"
+ * @struts.action-forward name="editPages.page" path="/website/edit-pages.jsp"
+ */
+public final class PageFormAction extends DispatchAction
+{
+    private static Log mLogger = 
+        LogFactory.getFactory().getInstance(PageFormAction.class);
+        
+    public ActionForward add(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws IOException, ServletException
+    {
+        ActionForward forward = mapping.findForward("editPages.page");
+        try
+        {
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            if ( rreq.isUserAuthorizedToEdit() )
+            {
+                PageForm form = (PageForm)actionForm;
+                PageData data = new PageData();
+                form.copyTo(data, request.getLocale());
+                WebsiteData hd = rreq.getWebsite();
+
+                data.setWebsite( hd );
+                data.setUpdateTime( new java.util.Date() );
+                data.setDescription("");
+                data.setTemplate("");
+                validateLink( data );
+
+                UserManager mgr = rreq.getRoller().getUserManager();
+                mgr.storePage( data );
+                rreq.getRoller().commit();
+
+                ActionMessages uiMessages = new ActionMessages();
+                uiMessages.add(ActionMessages.GLOBAL_MESSAGE, 
+                        new ActionMessage("pagesForm.addNewPage.success", 
+                                data.getName()));
+                saveMessages(request, uiMessages);
+                
+                UserData user = rreq.getUser();
+                PageCacheFilter.removeFromCache( request, user );
+                    
+                actionForm.reset(mapping,request);                
+                
+                addModelObjects(rreq);
+            }
+            else
+            {
+                forward = mapping.findForward("access-denied");
+            }
+        }
+        catch (Exception e)
+        {
+            mLogger.error("ERROR in action",e);
+            throw new ServletException(e);
+        }
+        return forward;
+    }
+
+    //-----------------------------------------------------------------------
+    public ActionForward edit(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws IOException, ServletException
+    {
+        ActionForward forward = mapping.findForward("editPage.page");
+        try
+        {
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            if ( rreq.isUserAuthorizedToEdit() )
+            {
+                UserData ud = rreq.getUser();
+                PageData pd = rreq.getPage();
+                PageForm pf = (PageForm)actionForm;
+                pf.copyFrom(pd, request.getLocale());
+
+                PageCacheFilter.removeFromCache( request,ud );
+                
+                addModelObjects(rreq);
+            }
+            else
+            {
+                forward = mapping.findForward("access-denied");
+            }
+        }
+        catch (Exception e)
+        {
+            mLogger.error("ERROR in action",e);
+            throw new ServletException(e);
+        }
+        return forward;
+    }
+
+    //-----------------------------------------------------------------------
+    public ActionForward editPages(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws IOException, ServletException
+    {
+        ActionForward forward = mapping.findForward("editPages.page");
+        try
+        {
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            if ( rreq.isUserAuthorizedToEdit() )
+            {
+                addModelObjects(rreq);
+            }
+            else
+            {
+                forward = mapping.findForward("access-denied");
+            }
+        }
+        catch (Exception e)
+        {
+            mLogger.error("ERROR in action",e);
+            throw new ServletException(e);
+        }
+        return forward;
+    }
+
+    //-----------------------------------------------------------------------
+    public ActionForward remove(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws IOException, ServletException
+    {
+        ActionForward forward = mapping.findForward("editPages");
+        try
+        {
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            if ( rreq.isUserAuthorizedToEdit() )
+            {
+                PageForm form = (PageForm)actionForm;
+                PageData data = new PageData();
+                form.copyTo(data, request.getLocale());
+
+                UserManager mgr = rreq.getRoller().getUserManager();
+                mgr.removePageSafely( data.getId() );
+                rreq.getRoller().commit();
+
+                UserData user = rreq.getUser();
+                PageCacheFilter.removeFromCache( request,user );
+                    
+                addModelObjects(rreq);
+
+                actionForm.reset(mapping,request);
+            }
+            else
+            {
+                forward = mapping.findForward("access-denied");
+            }
+        }
+        catch (RollerException e)
+        {
+            ActionErrors errors = new ActionErrors();
+            errors.add(null, new ActionError(
+                    "error.internationalized",e.getRootCauseMessage()));
+            saveErrors(request, errors);       
+        }
+        catch (Exception e)
+        {
+            mLogger.error("ERROR in action",e);
+            throw new ServletException(e);
+        }
+        return forward;
+    }
+
+    //-----------------------------------------------------------------------
+    public ActionForward removeOk(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws IOException, ServletException
+    {
+        ActionForward forward = mapping.findForward("removePage.page");
+        try
+        {
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            if ( rreq.isUserAuthorizedToEdit() )
+            {
+                PageData cd = rreq.getPage();
+                PageForm pf = (PageForm)actionForm;
+                pf.copyFrom(cd, request.getLocale());
+
+                UserData ud = rreq.getUser();
+                request.setAttribute("user",ud);
+            }
+            else
+            {
+                forward = mapping.findForward("access-denied");
+            }
+        }
+        catch (Exception e)
+        {
+            mLogger.error("ERROR in action",e);
+            throw new ServletException(e);
+        }
+        return forward;
+    }
+
+    //-----------------------------------------------------------------------
+    public ActionForward update(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws IOException, ServletException
+    {
+        ActionForward forward = mapping.findForward("editPage.page");
+        try
+        {
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            if ( rreq.isUserAuthorizedToEdit() )
+            {
+                PageForm form = (PageForm)actionForm;
+                UserManager mgr = rreq.getRoller().getUserManager();
+                PageData data = mgr.retrievePage(form.getId());
+                data.save(); // should through exception if no save permission
+                form.copyTo(data, request.getLocale());
+                data.setUpdateTime( new java.util.Date() );
+                data.setWebsite( rreq.getWebsite() );
+
+                validateLink( data );
+
+                mgr.storePage( data );
+                rreq.getRoller().commit();
+
+                // set the (possibly) new link back into the Form bean
+                ((PageForm)actionForm).setLink( data.getLink() );
+
+                ActionMessages uiMessages = new ActionMessages();
+                uiMessages.add(ActionMessages.GLOBAL_MESSAGE, 
+                        new ActionMessage("pageForm.save.success", 
+                                data.getName()));
+                saveMessages(request, uiMessages);
+
+                UserData user = rreq.getUser();
+                PageCacheFilter.removeFromCache( request,user );
+            }
+            else
+            {
+                forward = mapping.findForward("access-denied");
+            }
+              
+            // Don't reset this form. Allow user to keep on tweaking.        
+            //actionForm.reset(mapping,request);
+        }
+        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)
+        {
+            mLogger.error("ERROR in action",e);
+            throw new ServletException(e);
+        }
+        return forward;
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Ensures that the page has a safe value for the link
+     * field.  "Safe" is defined as containing no html
+     * or any other non-alphanumeric characters.
+     * While this is overly strict (there are non-alphanum
+     * characters that are web-safe), this is a much easier
+     * test-and-correct.  Otherwise we would need a RegEx package.
+     */
+    private void validateLink( PageData data )
+    {
+        // if data.getLink() is null or empty
+        // use the title ( data.getName() )
+        if ( StringUtils.isEmpty( data.getLink() ) )
+        {
+            data.setLink( data.getName() );
+        }
+
+        // if link contains any nonAlphanumeric, strip them
+        // first we must remove any html, as this is
+        // non-instructional markup.  Then do a straight
+        // removeNonAlphanumeric.
+        if ( !StringUtils.isAlphanumeric( data.getLink() ) )
+        {
+            String link = Utilities.removeHTML( data.getLink() );
+            link = Utilities.removeNonAlphanumeric( link );
+            data.setLink( link );
+        }
+    }
+    
+    //-----------------------------------------------------------------------
+    public ActionForward cancel(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws IOException, ServletException
+    {
+        return (mapping.findForward("editPages"));
+    }
+    
+    //-----------------------------------------------------------------------
+    private void addModelObjects( RollerRequest rreq ) 
+        throws RollerException {  
+            
+        HttpServletRequest request = rreq.getRequest();
+            
+        UserManager mgr = rreq.getRoller().getUserManager();
+
+        UserData user = rreq.getUser();
+        request.setAttribute("user",user);
+
+        WebsiteData wd = rreq.getWebsite();
+        request.setAttribute("website", wd);
+
+        List pages = mgr.getPages(wd);
+        request.setAttribute("pages",pages);
+    }
+}
+

Added: incubator/roller/trunk/src/org/roller/presentation/website/actions/RollerConfigAction.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/website/actions/RollerConfigAction.java?rev=189695&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/website/actions/RollerConfigAction.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/website/actions/RollerConfigAction.java Wed Jun  8 20:18:46 2005
@@ -0,0 +1,151 @@
+
+package org.roller.presentation.website.actions;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+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.RollerException;
+import org.roller.RollerPermissionsException;
+import org.roller.model.IndexManager;
+import org.roller.model.RollerFactory;
+import org.roller.pojos.RollerConfigData;
+import org.roller.presentation.RollerRequest;
+import org.roller.presentation.RollerSession;
+import org.roller.presentation.website.formbeans.RollerConfigFormEx;
+
+/////////////////////////////////////////////////////////////////////////////
+/**
+ * New user form action.
+ * 
+ */
+public final class RollerConfigAction extends DispatchAction
+{
+    private static Log mLogger = 
+        LogFactory.getFactory().getInstance(RollerConfigAction.class);
+        
+    //-----------------------------------------------------------------------
+    public ActionForward edit(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws IOException, ServletException
+    {
+        ActionForward forward = mapping.findForward("rollerConfig.page");
+        try
+        {
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            if ( rreq.isUserAuthorizedToEdit() && rreq.isAdminUser() )
+            {
+                RollerConfigData rollerConfig = RollerFactory.getRoller().getConfigManager().getRollerConfig();
+                RollerConfigFormEx rcForm = (RollerConfigFormEx)actionForm;
+                rcForm.copyFrom(rollerConfig, request.getLocale());
+            }
+            else
+            {
+                forward = mapping.findForward("access-denied");
+            }
+        }
+        catch (Exception e)
+        {
+            mLogger.error("ERROR in action",e);
+            throw new ServletException(e);
+        }
+        return forward;
+    }
+
+    //-----------------------------------------------------------------------
+    public ActionForward update(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws IOException, ServletException
+    {
+        ActionForward forward = mapping.findForward("rollerConfig.page");
+        ActionErrors errors = new ActionErrors();
+        try
+        {
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            if ( rreq.isUserAuthorizedToEdit() && rreq.isAdminUser() )
+            {
+                RollerConfigFormEx rcForm = (RollerConfigFormEx)actionForm;
+                                    				
+                // get current RollerConfig and set new values
+                RollerConfigData rollerConfig = RollerFactory.getRoller().getConfigManager().getRollerConfig();
+                rcForm.copyTo(rollerConfig, request.getLocale());
+                
+                // persist
+                rreq.getRoller().getConfigManager().storeRollerConfig(rollerConfig);
+                rreq.getRoller().getRefererManager().applyRefererFilters();
+                rreq.getRoller().commit();
+                
+                ActionMessages uiMessages = new ActionMessages();
+                uiMessages.add(null, new ActionMessage("weblogEdit.changesSaved"));
+                saveMessages(request, uiMessages);
+            }
+            else
+            {
+                forward = mapping.findForward("access-denied");
+            }
+        }
+        catch (RollerPermissionsException e)
+        {
+            errors.add(null, new ActionError("error.permissions.deniedSave"));
+            saveErrors(request, errors);
+            forward = mapping.findForward("access-denied");
+        }
+        catch (RollerException e)
+        {
+            mLogger.error(e);
+            errors.add(ActionErrors.GLOBAL_ERROR, new ActionError(
+               "error.update.rollerConfig",e.getClass().getName()));
+            saveErrors(request,errors);
+        }
+        return forward;
+    }
+
+	public ActionForward index(
+		ActionMapping       mapping,
+		ActionForm          actionForm,
+		HttpServletRequest  request,
+		HttpServletResponse response)
+		throws Exception
+	{
+		ActionForward forward = mapping.findForward("rollerConfig.page");
+		try {
+			// if admin requests an index be re-built, do it
+             RollerRequest rreq = RollerRequest.getRollerRequest(request);
+			IndexManager manager = rreq.getRoller().getIndexManager();
+										 
+			manager.rebuildUserIndex();
+			request.getSession().setAttribute(
+				RollerSession.STATUS_MESSAGE,
+					"Successfully scheduled rebuild of all users' indexes");
+
+            // load up RollerConfig for UI
+            RollerConfigData rollerConfig = RollerFactory.getRoller().getConfigManager().getRollerConfig();
+            RollerConfigFormEx rcForm = (RollerConfigFormEx)actionForm;
+            rcForm.copyFrom(rollerConfig, request.getLocale());
+		}
+		catch (Exception e)
+		{
+			mLogger.error("ERROR in action",e);
+			throw new ServletException(e);
+		}
+		return forward;
+	}
+}
\ No newline at end of file

Added: incubator/roller/trunk/src/org/roller/presentation/website/actions/RollerPropertiesAction.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/website/actions/RollerPropertiesAction.java?rev=189695&view=auto
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/website/actions/RollerPropertiesAction.java (added)
+++ incubator/roller/trunk/src/org/roller/presentation/website/actions/RollerPropertiesAction.java Wed Jun  8 20:18:46 2005
@@ -0,0 +1,178 @@
+/*
+ * RollerPropertiesAction.java
+ *
+ * Created on April 21, 2005, 2:48 PM
+ */
+
+package org.roller.presentation.website.actions;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Map;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+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.RollerException;
+import org.roller.RollerPermissionsException;
+import org.roller.model.PropertiesManager;
+import org.roller.model.Roller;
+import org.roller.model.RollerFactory;
+import org.roller.pojos.RollerPropertyData;
+import org.roller.presentation.RollerRequest;
+
+
+
+/**
+ * Struts Action class which handles requests to the Admin Properties page.
+ *
+ * @author Allen Gilliland
+ *
+ * @struts.action path="/admin/rollerConfig"
+ *  scope="request" parameter="method"
+ *
+ * @struts.action-forward name="rollerProperties.page"
+ *  path="/website/rollerProperties.jsp"
+ */
+public class RollerPropertiesAction extends DispatchAction {
+    
+    private static Log mLogger =
+            LogFactory.getFactory().getInstance(RollerPropertiesAction.class);
+    
+    
+    public ActionForward unspecified(
+            ActionMapping       mapping,
+            ActionForm          actionForm,
+            HttpServletRequest  request,
+            HttpServletResponse response)
+            throws IOException, ServletException {
+        
+        // make "edit" our default action
+        return this.edit(mapping, actionForm, request, response);
+    }
+    
+    
+    public ActionForward edit(
+            ActionMapping       mapping,
+            ActionForm          actionForm,
+            HttpServletRequest  request,
+            HttpServletResponse response)
+            throws IOException, ServletException {
+        
+        mLogger.debug("Handling edit request");
+        
+        ActionForward forward = mapping.findForward("rollerProperties.page");
+        try {
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            if ( rreq.isUserAuthorizedToEdit() && rreq.isAdminUser() ) {
+                
+                // just grab our properties map and put it in the request
+                Roller mRoller = RollerFactory.getRoller();
+                PropertiesManager propsManager = mRoller.getPropertiesManager();
+                Map props = propsManager.getProperties();
+                request.setAttribute("RollerProps", props);
+                
+            } else {
+                forward = mapping.findForward("access-denied");
+            }
+        } catch (Exception e) {
+            mLogger.error("ERROR in action",e);
+            throw new ServletException(e);
+        }
+        return forward;
+    }
+    
+    
+    public ActionForward update(
+            ActionMapping       mapping,
+            ActionForm          actionForm,
+            HttpServletRequest  request,
+            HttpServletResponse response)
+            throws IOException, ServletException {
+        
+        mLogger.debug("Handling update request");
+        
+        ActionForward forward = mapping.findForward("rollerProperties.page");
+        ActionErrors errors = new ActionErrors();
+        try {
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            if ( rreq.isUserAuthorizedToEdit() && rreq.isAdminUser() ) {
+            
+                // just grab our properties map and put it in the request
+                Roller mRoller = RollerFactory.getRoller();
+                PropertiesManager propsManager = mRoller.getPropertiesManager();
+                Map props = propsManager.getProperties();
+                request.setAttribute("RollerProps", props);
+                
+                // only set values for properties that are already defined
+                String propName = null;
+                RollerPropertyData updProp = null;
+                String incomingProp = null;
+                Iterator propsIT = props.keySet().iterator();
+                while(propsIT.hasNext()) {
+                    propName = (String) propsIT.next();
+                    updProp = (RollerPropertyData) props.get(propName);
+                    incomingProp = request.getParameter(updProp.getName());
+                    
+                    mLogger.debug("Checking property ["+propName+"]");
+                    
+                    // some special treatment for booleans
+                    // this is a bit hacky since we are assuming that any prop
+                    // with a value of "true" or "false" is meant to be a boolean
+                    // it may not always be the case, but we should be okay for now
+                    if(updProp.getValue().equals("true") ||
+                            updProp.getValue().equals("false")) {
+                        
+                        if(incomingProp == null || !incomingProp.equals("on"))
+                            incomingProp = "false";
+                        else
+                            incomingProp = "true";
+                    }
+                    
+                    // only work on props that were submitted with the request
+                    if(incomingProp != null) {
+                        mLogger.debug("Setting new value for ["+propName+"]");
+                        
+                        // NOTE: the old way had some locale sensitive way to do this??
+                        updProp.setValue(incomingProp.trim());
+                    }
+                }
+                
+                // save it
+                propsManager.store(props);
+                mRoller.getRefererManager().applyRefererFilters();
+                mRoller.commit();
+                
+                ActionMessages uiMessages = new ActionMessages();
+                uiMessages.add(null, new ActionMessage("weblogEdit.changesSaved"));
+                saveMessages(request, uiMessages);
+                
+            } else {
+                forward = mapping.findForward("access-denied");
+            }
+            
+        } catch (RollerPermissionsException e) {
+            errors.add(null, new ActionError("error.permissions.deniedSave"));
+            saveErrors(request, errors);
+            forward = mapping.findForward("access-denied");
+            
+        } catch (RollerException e) {
+            mLogger.error(e);
+            errors.add(ActionErrors.GLOBAL_ERROR, new ActionError(
+                    "error.update.rollerConfig",e.getClass().getName()));
+            saveErrors(request,errors);
+        }
+        
+        return forward;
+    }
+    
+}