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/10/21 23:46:28 UTC

svn commit: r327589 [42/72] - in /incubator/roller/branches/roller_1.x: ./ 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...

Added: incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/actions/WebsiteFormAction.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/actions/WebsiteFormAction.java?rev=327589&view=auto
==============================================================================
--- incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/actions/WebsiteFormAction.java (added)
+++ incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/actions/WebsiteFormAction.java Fri Oct 21 14:27:36 2005
@@ -0,0 +1,231 @@
+
+package org.roller.presentation.website.actions;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.apache.commons.lang.StringUtils;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.struts.action.ActionError;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.actions.DispatchAction;
+import org.roller.RollerException;
+import org.roller.RollerPermissionsException;
+import org.roller.config.RollerRuntimeConfig;
+import org.roller.model.UserManager;
+import org.roller.model.WeblogManager;
+import org.roller.pojos.UserData;
+import org.roller.pojos.WeblogCategoryData;
+import org.roller.pojos.WebsiteData;
+import org.roller.presentation.RollerRequest;
+import org.roller.presentation.RollerSession;
+import org.roller.presentation.pagecache.PageCacheFilter;
+import org.roller.presentation.forms.WebsiteForm;
+import org.roller.presentation.website.formbeans.WebsiteFormEx;
+
+
+/////////////////////////////////////////////////////////////////////////////
+/**
+ * Website Settings action.
+ * 
+ * @struts.action name="websiteFormEx" path="/editor/website" 
+ * 		scope="session" parameter="method"
+ * 
+ * @struts.action-forward name="editWebsite.page" path="/website/edit-website.jsp"
+ */
+public final class WebsiteFormAction extends DispatchAction
+{
+    private static Log mLogger = 
+        LogFactory.getFactory().getInstance(WebsiteFormAction.class);
+
+    public ActionForward add(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws IOException, ServletException
+    {
+        return update( mapping, actionForm, request, response );
+    }
+
+    //-----------------------------------------------------------------------
+    public ActionForward edit(
+        ActionMapping       mapping,
+        ActionForm          actionForm,
+        HttpServletRequest  request,
+        HttpServletResponse response)
+        throws IOException, ServletException
+    {
+        ActionForward forward = mapping.findForward("editWebsite.page");
+        try
+        {
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            if ( rreq.isUserAuthorizedToEdit() )
+            {
+                UserData ud = rreq.getUser();
+                request.setAttribute("user",ud);
+
+                WebsiteData hd = rreq.getWebsite();
+                WebsiteForm wf = (WebsiteFormEx)actionForm;
+                wf.copyFrom(hd, request.getLocale());
+
+                List cd = rreq.getRoller().getWeblogManager()
+                   .getWeblogCategories(rreq.getWebsite(), true);
+                request.setAttribute("categories",cd);
+
+                List bcd = rreq.getRoller().getWeblogManager()
+                    .getWeblogCategories(rreq.getWebsite(), true);
+                request.setAttribute("bloggerCategories",bcd);
+
+                List pages = rreq.getRoller().getUserManager().getPages(rreq.getWebsite());
+                request.setAttribute("pages",pages);
+
+                ServletContext ctx = request.getSession().getServletContext();
+                String editorPages = 
+                        RollerRuntimeConfig.getProperty("users.editor.pages");
+                
+                List epages = Arrays.asList(StringUtils.split(StringUtils.deleteWhitespace(editorPages), ","));
+                request.setAttribute("editorPagesList", epages);
+            }
+            else
+            {
+                forward = mapping.findForward("access-denied");
+            }
+        }
+        catch (Exception 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("editWebsite");
+        try
+        {
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            WeblogManager wmgr = rreq.getRoller().getWeblogManager();
+            UserManager umgr = rreq.getRoller().getUserManager();
+            if ( rreq.isUserAuthorizedToEdit() )
+            {
+                WebsiteFormEx form = (WebsiteFormEx)actionForm;
+                
+                // checkboxes return no value when not checked
+                if (form.getAllowComments() == null)
+                {
+                    form.setAllowComments( Boolean.FALSE );
+                }
+                if (form.getEmailComments() == null)
+                {
+                    form.setEmailComments( Boolean.FALSE );
+                }
+                if (form.getEnableBloggerApi() == null)
+                {
+                    form.setEnableBloggerApi( Boolean.FALSE );
+                }
+
+                /* we don't need this check any longer -- Allen G
+                if(!form.getDefaultPageId().equals(form.getWeblogDayPageId()))
+                {
+                */               
+                    WebsiteData wd = umgr.retrieveWebsite(form.getId());
+                    wd.save(); // should throw if save not permitted
+
+                    // ensure isEnabled can't be changed
+                    form.setIsEnabled(wd.getIsEnabled());
+                    form.copyTo(wd, request.getLocale());
+                    
+                    if (form.getDefaultCategoryId() != null) 
+                    {
+                        WeblogCategoryData defaultCat = 
+                            wmgr.retrieveWeblogCategory(form.getDefaultCategoryId());
+                        wd.setDefaultCategory(defaultCat);
+                    }
+                    
+                    if (form.getBloggerCategoryId() != null) 
+                    {
+                        WeblogCategoryData bloggerCat = 
+                            wmgr.retrieveWeblogCategory(form.getBloggerCategoryId());
+                        wd.setBloggerCategory(bloggerCat);
+                    }
+                    
+                    wd.save();
+                    rreq.getRoller().getRefererManager().applyRefererFilters(wd);                    
+                    rreq.getRoller().commit();
+
+                    request.getSession().setAttribute(
+                        RollerSession.STATUS_MESSAGE,
+                        "Successfully submitted new Weblog templates");
+
+                    request.getSession().setAttribute(
+                        RollerRequest.WEBSITEID_KEY,form.getId());
+
+                    // clear the page cache for this user
+                    PageCacheFilter.removeFromCache( request, wd.getUser() );
+
+                    // set the Editor Page list
+                    ServletContext ctx = request.getSession().getServletContext();
+                    String editorPages = 
+                        RollerRuntimeConfig.getProperty("users.editor.pages");
+                
+                    List epages = Arrays.asList(StringUtils.split(
+                       StringUtils.deleteWhitespace(editorPages), ","));
+                    request.setAttribute("editorPagesList", epages);
+                /*
+                }
+                else
+                {
+                    request.getSession().setAttribute(
+                        RollerSession.ERROR_MESSAGE,
+                        "CHANGES REJECTED: Cannot set default page template "
+                        +"and day template to same template");
+                }
+                */
+            }
+            else
+            {
+                forward = mapping.findForward("access-denied");
+            }
+                    
+            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 (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 forward;
+    }
+
+}
+

Added: incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/actions/package.html
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/actions/package.html?rev=327589&view=auto
==============================================================================
--- incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/actions/package.html (added)
+++ incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/actions/package.html Fri Oct 21 14:27:36 2005
@@ -0,0 +1,10 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+  <title></title>
+</head>
+<body>
+Struts actions for managing Roller config, website settings and admin.
+
+</body>
+</html>

Added: incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/MaintenanceForm.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/MaintenanceForm.java?rev=327589&view=auto
==============================================================================
--- incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/MaintenanceForm.java (added)
+++ incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/MaintenanceForm.java Fri Oct 21 14:27:36 2005
@@ -0,0 +1,11 @@
+package org.roller.presentation.website.formbeans;
+
+import org.apache.struts.action.ActionForm;
+
+/**
+ * @struts.form name="maintenanceForm"
+ * @author Dave M Johnson
+ */
+public class MaintenanceForm extends ActionForm
+{
+}

Added: incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/RollerConfigFormEx.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/RollerConfigFormEx.java?rev=327589&view=auto
==============================================================================
--- incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/RollerConfigFormEx.java (added)
+++ incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/RollerConfigFormEx.java Fri Oct 21 14:27:36 2005
@@ -0,0 +1,72 @@
+
+package org.roller.presentation.website.formbeans;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.struts.action.ActionMapping;
+import org.roller.RollerException;
+import org.roller.pojos.RollerConfigData;
+import org.roller.presentation.forms.RollerConfigForm;
+
+/**
+ * These properties are not persistent and are only needed for the UI.
+ *
+ * @struts.form name="rollerConfigFormEx"
+ * @author Lance Lavandowska
+ */
+public class RollerConfigFormEx extends RollerConfigForm
+{
+    public RollerConfigFormEx()
+    {
+    }
+
+    public RollerConfigFormEx( RollerConfigData config, java.util.Locale locale ) throws RollerException
+    {
+        super(config, locale);
+    }
+
+    /**
+     * Override for non-primitive values
+     */
+    public void copyFrom(org.roller.pojos.RollerConfigData dataHolder, java.util.Locale locale) throws RollerException
+    {
+    	super.copyFrom(dataHolder, locale);
+        fixNulls();
+        this.uploadMaxFileMB = dataHolder.getUploadMaxFileMB();
+        this.uploadMaxDirMB = dataHolder.getUploadMaxDirMB();
+    }
+
+    /**
+     * Override for non-primitive values
+     */
+    public void copyTo(org.roller.pojos.RollerConfigData dataHolder, java.util.Locale locale) throws RollerException
+    {
+        fixNulls();
+        super.copyTo(dataHolder, locale);
+        dataHolder.setUploadMaxFileMB(this.uploadMaxFileMB);
+        dataHolder.setUploadMaxDirMB(this.uploadMaxDirMB);
+    }
+
+    /**
+     * Method allows Struts to handle empty checkboxes for booleans
+     */
+	public void reset(ActionMapping mapping, HttpServletRequest request) 
+	{
+        setAbsoluteURL( null );
+        fixNulls();
+	}
+    
+    private void fixNulls()
+    {
+        if (getRssUseCache() == null) setRssUseCache( Boolean.FALSE );
+        if (getNewUserAllowed() == null) setNewUserAllowed( Boolean.FALSE );
+        if (getEnableAggregator() == null) setEnableAggregator( Boolean.FALSE );
+        if (getUploadEnabled() == null) setUploadEnabled( Boolean.FALSE );
+        if (getMemDebug() == null) setMemDebug( Boolean.FALSE );
+        if (getAutoformatComments() == null) setAutoformatComments( Boolean.FALSE );
+        if (getEscapeCommentHtml() == null) setEscapeCommentHtml( Boolean.FALSE );
+        if (getEmailComments() == null) setEmailComments( Boolean.FALSE );
+        if (getEnableLinkback() == null) setEnableLinkback( Boolean.FALSE );        
+        if (getEncryptPasswords() == null) setEncryptPasswords( Boolean.FALSE );        
+    }
+}
\ No newline at end of file

Added: incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/ThemeEditorForm.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/ThemeEditorForm.java?rev=327589&view=auto
==============================================================================
--- incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/ThemeEditorForm.java (added)
+++ incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/ThemeEditorForm.java Fri Oct 21 14:27:36 2005
@@ -0,0 +1,53 @@
+package org.roller.presentation.website.formbeans;
+
+import org.apache.struts.action.ActionForm;
+
+/**
+ * Holds the name of the theme chosen or
+ * the template being edited.
+ * 
+ * @struts.form name="themeEditorForm"
+ * 
+ * @author llavandowska
+ */
+public class ThemeEditorForm extends ActionForm
+{
+	private String themeName;
+	private String themeTemplate;
+	/**
+	 * Returns the themeName.
+	 * @return String
+	 */
+	public String getThemeName()
+	{
+		return themeName;
+	}
+
+	/**
+	 * Returns the themeTemplate.
+	 * @return String
+	 */
+	public String getThemeTemplate()
+	{
+		return themeTemplate;
+	}
+
+	/**
+	 * Sets the themeName.
+	 * @param themeName The themeName to set
+	 */
+	public void setThemeName(String themeName)
+	{
+		this.themeName = themeName;
+	}
+
+	/**
+	 * Sets the themeTemplate.
+	 * @param themeTemplate The themeTemplate to set
+	 */
+	public void setThemeTemplate(String themeTemplate)
+	{
+		this.themeTemplate = themeTemplate;
+	}
+
+}

Added: incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/UploadFileForm.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/UploadFileForm.java?rev=327589&view=auto
==============================================================================
--- incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/UploadFileForm.java (added)
+++ incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/UploadFileForm.java Fri Oct 21 14:27:36 2005
@@ -0,0 +1,48 @@
+
+package org.roller.presentation.website.formbeans;
+
+import org.apache.struts.upload.FormFile;
+
+
+/**
+ * Allows the user to upload a set of files.
+ * @struts.form name="uploadFiles"
+ */
+public class UploadFileForm
+    extends    org.apache.struts.action.ActionForm
+{
+    //protected FormFile[] mUploadedFiles = null;
+    protected transient FormFile mUploadedFile = null;
+
+    // The name of file to be deleted
+    protected String[] mDeleteFiles;
+
+    public UploadFileForm()
+    {
+        super();
+    }
+
+    //------------------------------------------------- Property uploadedFiles
+
+    /** files to be written to disk */
+    //public void setUploadedFiles(FormFile[] files) { mUploadedFiles = files; }
+
+    /** files to be written to disk */
+    //public FormFile[] getUploadedFiles() { return mUploadedFiles; }
+
+    /** files to be written to disk */
+    public void setUploadedFile(FormFile file) { mUploadedFile = file; }
+
+    /** files to be written to disk */
+    public FormFile getUploadedFile() { return mUploadedFile; }
+
+    /** files to be deleted from disk **/
+    public void setDeleteFiles(String[] fileNames)
+    {
+        mDeleteFiles = fileNames;
+    }
+
+    /** files to be deleted from disk **/
+    public String[] getDeleteFiles() { return mDeleteFiles; }
+}
+

Added: incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/UserAdminForm.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/UserAdminForm.java?rev=327589&view=auto
==============================================================================
--- incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/UserAdminForm.java (added)
+++ incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/UserAdminForm.java Fri Oct 21 14:27:36 2005
@@ -0,0 +1,110 @@
+
+package org.roller.presentation.website.formbeans;
+
+import java.util.Locale;
+
+import org.apache.struts.action.ActionMapping;
+import org.roller.RollerException;
+import org.roller.pojos.UserData;
+import org.roller.presentation.forms.UserForm;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * These properties are not persistent and are only needed for the UI.
+ *
+ * @struts.form name="userAdminForm"
+ * @author dmj
+ */
+public class UserAdminForm extends UserFormEx
+{
+    private boolean mDelete = false;
+    private Boolean mUserEnabled = Boolean.FALSE;
+    private Boolean mUserAdmin = Boolean.FALSE;
+
+    public UserAdminForm()
+    {
+        super();
+    }
+
+    public UserAdminForm(UserData userData, java.util.Locale locale ) throws RollerException
+    {
+        super(userData, locale);
+    }
+
+    /**
+     * Returns true if delete requested.
+     * @return boolean
+    **/
+    public boolean getDelete()
+    {
+        return mDelete;
+    }
+
+    /**
+     * Sets the Delete member.
+     */
+    public void setDelete(boolean delete)
+    {
+        mDelete = delete;
+    }
+    
+	public void reset(ActionMapping mapping, HttpServletRequest request) 
+	{
+		super.reset(mapping, request);
+		mDelete = false;
+	}
+
+    /**
+     * @return Returns the mEnabled.
+     */
+    public Boolean getUserEnabled()
+    {
+        return this.mUserEnabled;
+    }
+    
+    /**
+     * @param enabled The mEnabled to set.
+     */
+    public void setUserEnabled(Boolean enabled)
+    {
+        this.mUserEnabled = enabled;
+    }
+    
+    /**
+     * @return Returns the mUserAdmin.
+     */
+    public Boolean getUserAdmin() {
+        return mUserAdmin;
+    }
+    
+    /**
+     * @param userAdmin The mUserAdmin to set.
+     */
+    public void setUserAdmin(Boolean userAdmin) {
+        mUserAdmin = userAdmin;
+    }
+
+    /** Override to grant/revoke admin role depending on form */
+    public void copyTo(UserData user, Locale locale)
+            throws RollerException
+    {
+        super.copyTo(user, locale);
+        if (mUserAdmin.booleanValue()) 
+        {
+            user.grantRole("admin");
+        }
+        else
+        {
+            user.revokeRole("admin");
+        }
+    }
+
+    /** Override to set "administration" checkbox depending on user's roles */
+    public void copyFrom(UserData user, Locale locale)
+            throws RollerException
+    {
+        super.copyFrom(user, locale);
+        mUserAdmin = user.hasRole("admin") ? Boolean.TRUE : Boolean.FALSE;
+    }
+}

Added: incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/UserFormEx.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/UserFormEx.java?rev=327589&view=auto
==============================================================================
--- incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/UserFormEx.java (added)
+++ incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/UserFormEx.java Fri Oct 21 14:27:36 2005
@@ -0,0 +1,160 @@
+
+package org.roller.presentation.website.formbeans;
+
+import org.roller.RollerException;
+import org.roller.pojos.UserData;
+import org.roller.presentation.forms.UserForm;
+import org.roller.util.DateUtil;
+
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * Extend form to add extra properties not in generated base.
+ * @struts.form name="userFormEx"
+ */ 
+public class UserFormEx extends UserForm
+{
+	private String mTheme = null;
+    private String mLocale = null;
+    private String mTimezone = null;
+    private String mPasswordText = null;
+    private String mPasswordConfirm = null;
+    private boolean adminCreated = false;
+
+	public UserFormEx()
+	{
+		super();
+	}
+
+	public UserFormEx( UserData userData, java.util.Locale locale ) throws RollerException
+	{
+		super(userData, locale);
+	}
+
+	public String getTheme()
+	{
+		return mTheme; 
+	}
+
+	public void setTheme( String theme )
+	{
+		mTheme = theme;
+	}
+	public String getLocale() 
+	{
+		return mLocale;
+	}
+
+	public void setLocale(String locale) 
+	{
+		mLocale = locale;
+	}
+
+	public String getTimezone() 
+	{
+		return mTimezone;
+	}
+
+	public void setTimezone(String timezone) 
+	{
+		mTimezone = timezone;
+	}
+    
+    /**
+     * Don't call it "password" because browser will autofill.
+     * @return Returns the passwordText.
+     */
+    public String getPasswordText()
+    {
+        return mPasswordText;
+    }
+    
+    /**
+     * Don't call it "password" because browser will autofill.
+     * @param passwordText The passwordText to set.
+     */
+    public void setPasswordText(String passwordText)
+    {
+        mPasswordText = passwordText;
+    }
+    
+    /**
+     * @return Returns the passwordConfirm.
+     */
+    public String getPasswordConfirm()
+    {
+        return mPasswordConfirm;
+    }
+    
+    /**
+     * @param passwordConfirm The passwordConfirm to set.
+     */
+    public void setPasswordConfirm(String passwordConfirm)
+    {
+        mPasswordConfirm = passwordConfirm;
+    }
+    
+    /**
+     * Utility to convert from String to Date.
+     */
+    public void setDateCreatedAsString(String value)
+    {
+        if ( value == null || value.trim().length() == 0 )
+        {
+            this.setDateCreated(null);   
+        }
+        else
+        {
+            try
+            {
+                Date pubDate = DateUtil.parse(
+                        value, DateUtil.friendlyTimestampFormat());
+                this.setDateCreated(new Timestamp(pubDate.getTime()));
+            }
+            catch (java.text.ParseException pe)
+            {
+                // wasn't proper format, try others
+                Date pubDate = DateUtil.parseFromFormats(value);
+                this.setDateCreated( new Timestamp(pubDate.getTime()) );
+            }
+        }
+    }
+
+    /**
+     * Returns a formatted pubTime string.
+     */
+    public String getDateCreatedAsString()
+    {
+        return DateUtil.friendlyTimestamp(this.getDateCreated());
+    }
+    
+    
+    /** 
+     * Override to prevent password or dateCreated being copied over by form
+     * @see org.roller.presentation.forms.UserForm#copyTo(
+     * 		org.roller.pojos.UserData, java.util.Locale)
+     */
+    public void copyTo(UserData dataHolder, Locale locale)
+                    throws RollerException
+    {
+        String password = dataHolder.getPassword();
+        Date dateCreated = dataHolder.getDateCreated();
+        
+        super.copyTo(dataHolder, locale);
+        
+        dataHolder.setPassword(password);
+        dataHolder.setDateCreated(dateCreated);
+    }
+
+    /** True if user is being created by an admin */
+    public void setAdminCreated(boolean b) {
+        adminCreated = b;
+    }
+    /** True if user is being created by an admin */
+    public boolean getAdminCreated() {
+        return adminCreated;
+    }
+}
+

Added: incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/WebsiteFormEx.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/WebsiteFormEx.java?rev=327589&view=auto
==============================================================================
--- incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/WebsiteFormEx.java (added)
+++ incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/WebsiteFormEx.java Fri Oct 21 14:27:36 2005
@@ -0,0 +1,113 @@
+/*
+ * Created on Feb 14, 2004
+ */
+package org.roller.presentation.website.formbeans;
+
+import org.apache.commons.lang.StringUtils;
+import org.roller.RollerException;
+import org.roller.pojos.WebsiteData;
+import org.roller.presentation.forms.WebsiteForm;
+
+/**
+ * @struts.form name="websiteFormEx"
+ */ 
+public class WebsiteFormEx extends WebsiteForm
+{
+    private String bloggerCategoryId;
+    private String defaultCategoryId;
+    private String[] defaultPluginsArray;
+    
+    /**
+     * @return Returns the bloggerCategoryId.
+     */
+    public String getBloggerCategoryId()
+    {
+        return bloggerCategoryId;
+    }
+
+    /**
+     * @param bloggerCategoryId The bloggerCategoryId to set.
+     */
+    public void setBloggerCategoryId(String bloggerCategoryId)
+    {
+        this.bloggerCategoryId = bloggerCategoryId;
+    }
+
+    /**
+     * @return Returns the defeaultCategoryId.
+     */
+    public String getDefaultCategoryId()
+    {
+        return defaultCategoryId;
+    }
+
+    /**
+     * @param defeaultCategoryId The defeaultCategoryId to set.
+     */
+    public void setDefaultCategoryId(String defeaultCategoryId)
+    {
+        this.defaultCategoryId = defeaultCategoryId;
+    }
+
+    /**
+     * @return
+     */
+    public String[] getDefaultPluginsArray()
+    {
+        return defaultPluginsArray;
+    }
+
+    /**
+     * @param strings
+     */
+    public void setDefaultPluginsArray(String[] strings)
+    {
+        defaultPluginsArray = strings;
+    }
+
+
+    /** 
+     * @see org.roller.presentation.forms.WebsiteForm#copyFrom(org.roller.pojos.WebsiteData)
+     */
+    public void copyFrom(WebsiteData dataHolder, java.util.Locale locale) throws RollerException
+    {
+        super.copyFrom(dataHolder, locale);
+        if (dataHolder.getDefaultCategory() != null)
+        {
+            defaultCategoryId = dataHolder.getDefaultCategory().getId();
+        }
+        if (dataHolder.getBloggerCategory() != null)
+        {
+            bloggerCategoryId = dataHolder.getBloggerCategory().getId();
+        }
+        if (dataHolder.getDefaultPlugins() != null)
+        {
+            defaultPluginsArray = StringUtils.split(dataHolder.getDefaultPlugins(), ",");
+        }
+    }
+
+    /** 
+     * @see org.roller.presentation.forms.WebsiteForm#copyTo(org.roller.pojos.WebsiteData)
+     */
+    public void copyTo(WebsiteData dataHolder, java.util.Locale locale) throws RollerException
+    {
+        super.copyTo(dataHolder, locale);
+        dataHolder.setDefaultPlugins( StringUtils.join(this.defaultPluginsArray,",") );
+    }
+    
+    public void reset(
+        org.apache.struts.action.ActionMapping mapping, 
+        javax.servlet.ServletRequest request)
+    {
+        doReset(mapping, request);
+        defaultPluginsArray = new String[0];
+    }
+    
+    public void reset(
+        org.apache.struts.action.ActionMapping mapping, 
+        javax.servlet.http.HttpServletRequest request)
+    {
+        doReset(mapping, request);
+        defaultPluginsArray = new String[0];
+    }
+}

Added: incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/package.html
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/package.html?rev=327589&view=auto
==============================================================================
--- incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/package.html (added)
+++ incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/formbeans/package.html Fri Oct 21 14:27:36 2005
@@ -0,0 +1,10 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+  <title></title>
+</head>
+<body>
+Form beans for managing Roller config, website settings and admin.
+
+</body>
+</html>

Added: incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/package.html
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/package.html?rev=327589&view=auto
==============================================================================
--- incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/package.html (added)
+++ incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/package.html Fri Oct 21 14:27:36 2005
@@ -0,0 +1,10 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+  <title></title>
+</head>
+<body>
+ThemeCache keeps us from hitting Velocity/disk so often.
+
+</body>
+</html>

Added: incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/tags/AuthorizeUserTag.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/tags/AuthorizeUserTag.java?rev=327589&view=auto
==============================================================================
--- incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/tags/AuthorizeUserTag.java (added)
+++ incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/tags/AuthorizeUserTag.java Fri Oct 21 14:27:36 2005
@@ -0,0 +1,122 @@
+package org.roller.presentation.website.tags;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.struts.config.ForwardConfig;
+import org.apache.struts.config.ModuleConfig;
+import org.apache.struts.util.RequestUtils;
+import org.roller.pojos.UserData;
+import org.roller.presentation.RollerRequest;
+
+import java.security.Principal;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.Tag;
+import javax.servlet.jsp.tagext.TagSupport;
+
+
+/** 
+  * If user is not authorized, forward to specified global forward. 
+  * @jsp.tag name="AuthorizeUser" 
+  */
+public class AuthorizeUserTag extends TagSupport 
+{
+    static final long serialVersionUID = 1684786313445066867L;
+    
+    private static Log mLogger = LogFactory.getFactory().getInstance(
+        AuthorizeUserTag.class);
+
+    private String name = null;
+	/** @jsp.attribute required="true" */ 
+    public String getFailureForward() { return (this.name); }
+    public void setFailureForward(String name) {this.name = name;}
+
+ 	//----------------------------------------------------------- 
+    /**
+     * Defer generation until the end of this tag is encountered.
+     *
+     * @exception JspException if a JSP exception has occurred
+     */
+    public int doStartTag() throws JspException 
+	{
+		return (SKIP_BODY);
+    }
+
+ 	//----------------------------------------------------------- 
+    /**
+     * Process start tag.
+     * @return EVAL_SKIP_BODY
+     */
+    public int doEndTag() throws JspException 
+	{
+		HttpServletRequest req = null;
+		UserData user = null; 
+		try
+		{
+			req = (HttpServletRequest)pageContext.getRequest();
+			user = RollerRequest.getRollerRequest(req).getUser();
+		}
+		catch (Exception e)
+		{
+            mLogger.error("ERROR in tag",e);
+			throw new JspException(e);
+		}
+
+		Principal prince = req.getUserPrincipal(); 
+		if ( prince == null || !prince.getName().equals( user.getUserName() ) )
+		{
+			ServletContext ctx = req.getSession().getServletContext();
+			ModuleConfig mConfig = RequestUtils.getModuleConfig(req,ctx);
+			ForwardConfig fConfig = mConfig.findForwardConfig(name);
+			if (fConfig==null)
+				throw new JspException("Forward "+name+"not found");
+			
+			// Forward or redirect to the corresponding actual path
+			String path = fConfig.getPath();
+			if (fConfig.getRedirect()) 
+			{
+				HttpServletResponse response =
+					(HttpServletResponse) pageContext.getResponse();
+				try 
+				{
+					response.sendRedirect(response.encodeRedirectURL(path));
+				} 
+				catch (Exception e) 
+				{
+                  mLogger.error("ERROR in tag",e);
+				  throw new JspException("Error redirecting to forward "+name);
+				}
+			} 
+			else 
+			{
+				try 
+				{
+					pageContext.forward(path);
+				} 
+				catch (Exception e) 
+				{
+                    mLogger.error("ERROR in tag",e);
+					throw new JspException("Error forward to "+name);
+				}
+			}
+
+			// Skip the remainder of this page
+			return (SKIP_PAGE);
+		}
+		return Tag.SKIP_BODY;
+    }
+
+	//------------------------------------------------------------------------
+    /**
+     * Release any acquired resources.
+     */
+    public void release() 
+	{
+		super.release();
+		name = null;
+    }
+}
+

Added: incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/tags/FileManagerTag.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/tags/FileManagerTag.java?rev=327589&view=auto
==============================================================================
--- incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/tags/FileManagerTag.java (added)
+++ incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/tags/FileManagerTag.java Fri Oct 21 14:27:36 2005
@@ -0,0 +1,166 @@
+package org.roller.presentation.website.tags;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.struts.util.RequestUtils;
+import org.roller.pojos.UserData;
+import org.roller.presentation.RollerContext;
+import org.roller.presentation.RollerRequest;
+
+import java.io.File;
+import java.text.Collator;
+import java.text.DecimalFormat;
+import java.util.ResourceBundle;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.JspWriter;
+import javax.servlet.jsp.tagext.Tag;
+import javax.servlet.jsp.tagext.TagSupport;
+
+/**
+ * @jsp.tag name="FileManager"
+ */
+public class FileManagerTag extends TagSupport
+{
+    static final long serialVersionUID = 5118479809543177187L;
+    
+    private transient ResourceBundle bundle = 
+        ResourceBundle.getBundle("ApplicationResources");
+    
+    private static Log mLogger = 
+        LogFactory.getFactory().getInstance(RollerRequest.class);
+
+    //-------------------------------------------------------------
+    /**
+     * Process start tag.
+     * @return EVAL_SKIP_BODY
+     */
+    public int doStartTag() throws JspException
+    {
+        JspWriter pw = pageContext.getOut();
+        try
+        {
+            ServletContext app = pageContext.getServletContext();
+
+            // get the root of the /resource directory
+            String dir = RollerContext.getUploadDir( app );
+
+            HttpServletRequest request =
+                (HttpServletRequest)pageContext.getRequest();
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            UserData user = rreq.getUser();
+
+            // for formatting the file size
+            DecimalFormat format = (DecimalFormat) DecimalFormat.getInstance();
+            format.setMaximumFractionDigits(1);
+            format.setMinimumFractionDigits(0);
+
+            pw.println("<table class=\"rollertable\">");
+            pw.println("<tr class=\"rHeaderTr\">");
+            pw.println("   <th class=\"rollertable\" width=\"95%\">Filename</th>");
+            pw.println("   <th class=\"rollertable\">Size</td>");
+            pw.println("   <th class=\"rollertable\">Delete</td>");
+            pw.println("</tr>");
+
+            // get the files
+            String[] files = new String[0];
+            int numFiles = 0;
+            File d = new File(dir + user.getUserName());
+            if (d.mkdirs() || d.exists())
+            {
+                files = this.fileList(d);
+
+                // print the file list
+                if (files != null && 0 < files.length)
+                {
+                    numFiles = files.length;
+
+                    /*
+                    * Force images array to sort alphabetically, ignoring case.
+                    * We have to do this as some servers (Bluestone)
+                    * returns them sorted according to upload time.
+                    */
+                    //Get the Collator for US English and set its strength
+                    // to PRIMARY
+                    java.text.Collator locCollator =
+                        java.text.Collator.getInstance(
+                            rreq.getWebsite().getLocaleInstance());
+                    locCollator.setStrength(Collator.PRIMARY);
+                    java.util.Arrays.sort(files, locCollator);
+
+                    File checkSize = null;
+                    float totalSize = 0;
+                    String fileSize = null;
+                    String fileLink = null;
+                    for (int i = 0; i < files.length; i++)
+                    {
+                        checkSize  = new File(d, files[i]);
+                        totalSize += new Float(checkSize.length()).floatValue();
+                        fileSize   = format.format(
+                          new Float(checkSize.length()).floatValue() / 1024);
+
+                        if (i+1 % 2 == 0) pw.print("<tr class=\"rollertable_even\">");
+                        else              pw.print("<tr class=\"rollertable_odd\">");
+
+                        fileLink = RequestUtils.printableURL(
+                            RequestUtils.absoluteURL( request,
+                                RollerContext.getUploadPath( app ) +
+                                "/" + user.getUserName() + "/" + files[i] ) );
+                        pw.print("<td class=\"rollertable\"><a href=\"" +
+                            fileLink + "\">" + files[i] + "</a></td>");
+                        pw.print("<td class=\"rollertable\" align=\"right\">" +
+                            fileSize + " kb</td>");
+                        pw.print("<td class=\"rollertable\" align=\"center\">" +
+                            "<input type=\"checkbox\" name=\"deleteFiles\" " +
+                            "value=\"" + files[i] + "\"></td>");
+
+                        pw.println("</tr>");
+                    }
+                    
+                    // print the total of file sizes
+                    fileSize = format.format(totalSize/1024);
+                    pw.print("<tr><td align=\"right\">Total:</td>");
+                    pw.print("<td align=\"right\">" + 
+                            fileSize + "&nbsp;kb</td>");
+                }
+            }
+
+            if (numFiles == 0)
+            {
+                pw.print("<tr class=\"rollertable\">");
+                pw.print("<td class=\"rollertable\" colspan=\"3\">");
+                pw.print(bundle.getString("uploadFiles.noFiles")+"</td>");
+                pw.println("</tr>");
+            }
+            pw.println("</table>");
+        }
+        catch (Exception e)
+        {
+            mLogger.error("Displaying files",e);
+            throw new JspException(e);
+        }
+        return Tag.SKIP_BODY;
+    }
+
+    /**
+     * Returns a String[] list of files only (excludes directories).
+    **/
+    public String[] fileList(File d)
+    {
+        File[] files = null; //list of files & directories in the image directory
+        java.util.ArrayList images = new java.util.ArrayList();
+
+        files = d.listFiles();
+        for (int i=0; i<files.length; i++)
+        {
+            if (!files[i].isDirectory()) images.add(files[i].getName());
+        }
+
+        String[] myFiles = new String[0];
+        return (String[]) images.toArray(myFiles);
+
+    }
+}
+

Added: incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/tags/FileUploadTag.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/tags/FileUploadTag.java?rev=327589&view=auto
==============================================================================
--- incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/tags/FileUploadTag.java (added)
+++ incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/tags/FileUploadTag.java Fri Oct 21 14:27:36 2005
@@ -0,0 +1,133 @@
+package org.roller.presentation.website.tags;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.struts.util.RequestUtils;
+import org.roller.pojos.UserData;
+import org.roller.presentation.RollerRequest;
+
+import java.io.File;
+import java.math.BigDecimal;
+import java.text.MessageFormat;
+import java.util.Hashtable;
+import java.util.ResourceBundle;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.JspWriter;
+import javax.servlet.jsp.tagext.Tag;
+import javax.servlet.jsp.tagext.TagSupport;
+import org.roller.config.RollerRuntimeConfig;
+import org.roller.model.FileManager;
+import org.roller.model.PropertiesManager;
+import org.roller.model.Roller;
+import org.roller.model.RollerFactory;
+
+/**
+ * @jsp.tag name="FileUpload"
+ */
+public class FileUploadTag extends TagSupport
+{
+    static final long serialVersionUID = -1278102416194468310L;
+    
+    private transient ResourceBundle bundle = 
+        ResourceBundle.getBundle("ApplicationResources");
+    
+    private static Log mLogger = 
+        LogFactory.getFactory().getInstance(FileUploadTag.class);
+
+    //-------------------------------------------------------------
+    /**
+     * Process start tag.
+     * @return EVAL_SKIP_BODY
+     */
+    public int doStartTag() throws JspException
+    {
+        JspWriter pw = pageContext.getOut();
+        try
+        {
+            ServletContext app = pageContext.getServletContext();
+            
+            Roller mRoller = RollerFactory.getRoller();
+            PropertiesManager pmgr = mRoller.getPropertiesManager();
+            FileManager fmgr = mRoller.getFileManager();
+
+            String dir = fmgr.getUploadDir();
+
+            HttpServletRequest request =
+                (HttpServletRequest)pageContext.getRequest();
+            RollerRequest rreq = RollerRequest.getRollerRequest(request);
+            UserData user = rreq.getUser();
+            
+            String maxDir = RollerRuntimeConfig.getProperty("uploads.dir.maxsize");
+            String maxFile = RollerRuntimeConfig.getProperty("uploads.file.maxsize");
+            BigDecimal maxDirMB = new BigDecimal(maxDir);
+            BigDecimal maxFileMB = new BigDecimal(maxFile);
+            
+            int maxDirBytes = (int)(1024000 * maxDirMB.doubleValue());
+
+            // determine the number of bytes in user's directory
+            int userDirSize = 0;
+            File d = new File(dir + user.getUserName());
+            if (d.mkdirs() || d.exists())
+            {
+                File[] files = d.listFiles();
+                long dirSize = 0l;
+                for (int i=0; i<files.length; i++)
+                {
+                    if (!files[i].isDirectory())
+                    {
+                        dirSize = dirSize + files[i].length();
+                    }
+                }
+                userDirSize = new Long(dirSize).intValue();
+            }
+
+            boolean uploadEnabled = 
+                    RollerRuntimeConfig.getBooleanProperty("uploads.enabled");
+            
+            if ( !uploadEnabled )
+            {
+                pw.print("<span class=\"error\">");
+                pw.print(bundle.getString("uploadFiles.uploadDisabled")); 
+                pw.println("</span>");
+                
+            }
+            // if user has exceeded maximum do not allow upload
+            else if ( userDirSize > maxDirBytes )
+            {
+                pw.print("<span class=\"error\">");
+                pw.print(bundle.getString("uploadFiles.exceededQuota"));
+                pw.println("</span><br />");
+            }
+            else
+            {   
+                Hashtable params = new Hashtable();
+
+                String edit = RequestUtils.computeURL( pageContext,
+                    "uploadFiles", null, null, null, params,null,false);
+                pw.print("<form name=\"uploadFiles\" method=\"post\" ");
+                pw.print("action=\"" +  edit + "\" ");
+                pw.println("enctype=\"multipart/form-data\">");
+                pw.println(bundle.getString("uploadFiles.uploadPrompt")+"<br />");
+                pw.print("<input type=\"file\" ");
+                pw.println("name=\"uploadedFile\" size=\"30\" />");
+                pw.println("&nbsp;");
+                pw.println("<input type=\"submit\" value=\""
+                    +bundle.getString("uploadFiles.upload")+"\" />");
+                pw.println("<input type=\"hidden\" name=\"method\" value=\"upload\" /><br /><br />");
+                pw.println(MessageFormat.format(
+                    bundle.getString("uploadFiles.quotaNote"),
+                    new String[] {maxFileMB.toString(), maxDirMB.toString()}));
+                pw.println("</form>");
+            }
+        }
+        catch (Exception e)
+        {
+            mLogger.error("Exception writing file upload tag",e);
+            throw new JspException(e);
+        }
+        return Tag.SKIP_BODY;
+    }
+}

Added: incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/tags/package.html
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/tags/package.html?rev=327589&view=auto
==============================================================================
--- incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/tags/package.html (added)
+++ incubator/roller/branches/roller_1.x/src/org/roller/presentation/website/tags/package.html Fri Oct 21 14:27:36 2005
@@ -0,0 +1,10 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+  <title></title>
+</head>
+<body>
+JSP tags for file manager and user authorization.
+
+</body>
+</html>

Added: incubator/roller/branches/roller_1.x/src/org/roller/presentation/xmlrpc/BaseAPIHandler.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_1.x/src/org/roller/presentation/xmlrpc/BaseAPIHandler.java?rev=327589&view=auto
==============================================================================
--- incubator/roller/branches/roller_1.x/src/org/roller/presentation/xmlrpc/BaseAPIHandler.java (added)
+++ incubator/roller/branches/roller_1.x/src/org/roller/presentation/xmlrpc/BaseAPIHandler.java Fri Oct 21 14:27:36 2005
@@ -0,0 +1,139 @@
+/*
+ * Created on Apr 11, 2003
+ */
+package org.roller.presentation.xmlrpc;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.xmlrpc.XmlRpcException;
+import org.roller.model.UserManager;
+import org.roller.pojos.UserData;
+import org.roller.pojos.WebsiteData;
+import org.roller.presentation.MainPageAction;
+import org.roller.presentation.RollerContext;
+import org.roller.presentation.RollerRequest;
+import org.roller.presentation.pagecache.PageCacheFilter;
+import org.roller.util.Utilities;
+
+import java.io.Serializable;
+import org.roller.config.RollerConfig;
+
+/**
+ * Base API handler does user validation, provides exception types, etc.
+ * @author David M Johnson
+ */
+public class BaseAPIHandler implements Serializable
+{
+    static final long serialVersionUID = -698186274794937582L;
+    
+    private static Log mLogger = 
+        LogFactory.getFactory().getInstance(BaseAPIHandler.class);
+
+    public static final int AUTHORIZATION_EXCEPTION = 0001;
+    public static final String AUTHORIZATION_EXCEPTION_MSG = 
+            "Invalid Username and/or Password";
+            
+    public static final int UNKNOWN_EXCEPTION = 1000;
+    public static final String UNKNOWN_EXCEPTION_MSG = 
+            "An error occured processing your request";
+    
+    public static final int BLOGGERAPI_DISABLED = 1000;
+    public static final String BLOGGERAPI_DISABLED_MSG = 
+            "You have not enabled Blogger API support for your weblog";
+    
+    public static final int UNSUPPORTED_EXCEPTION = 1001;
+    public static final String UNSUPPORTED_EXCEPTION_MSG = 
+            "Unsupported method - Roller does not support this method";
+            
+    public static final int INVALID_POSTID = 2000;
+    public static final String INVALID_POSTID_MSG = 
+            "The entry postid you submitted is invalid";
+            
+    public static final int NOBLOGS_EXCEPTION = 3000;
+    public static final String NOBLOGS_EXCEPTION_MSG = 
+            "There are no categories defined for your user";
+
+    public static final int UPLOAD_DENIED_EXCEPTION = 4000;
+    public static final String UPLOAD_DENIED_EXCEPTION_MSG = 
+            "Upload denied";
+
+    //------------------------------------------------------------------------
+    public BaseAPIHandler()
+    {
+    }
+    
+    //------------------------------------------------------------------------
+    //public void prep( HttpServletRequest req )
+    //{
+        //mRoller = RollerContext.getRoller(req);
+        //mContextUrl = RollerContext.getRollerContext(req).getAbsoluteContextUrl(req);
+    //
+
+    //------------------------------------------------------------------------
+    protected WebsiteData validate(String username, String password) throws Exception
+    {
+        boolean authenticated = false;
+        boolean enabled = false;
+        WebsiteData website = null;
+        try
+        {
+            // Get Roller request object for current thread
+            RollerRequest rreq = RollerRequest.getRollerRequest();
+            
+            UserManager userMgr = rreq.getRoller().getUserManager();
+            website = userMgr.getWebsite(username);
+            
+            enabled = website.getEnableBloggerApi().booleanValue();
+            if (enabled)
+            {    
+                // are passwords encrypted?
+                RollerContext rollerContext = 
+                    RollerContext.getRollerContext(rreq.getRequest());
+                String encrypted = 
+                        RollerConfig.getProperty("passwds.encryption.enabled");
+                //System.out.print("password was [" + password + "] ");
+                if ("true".equalsIgnoreCase(encrypted)) 
+                {
+                	password = Utilities.encodePassword(password, 
+                      RollerConfig.getProperty("passwds.encryption.algorithm"));
+                }
+                //System.out.println("is now [" + password + "]");
+    			authenticated= website.getUser().getPassword().equals(password);
+                if (authenticated)
+                {
+                    rreq.getRoller().setUser(website.getUser());
+                }
+            }
+        }
+        catch (Exception e)
+        {
+            mLogger.error("ERROR internal error validating user", e);
+        }
+        
+        if ( !enabled )
+        {
+            throw new XmlRpcException(
+                BLOGGERAPI_DISABLED, BLOGGERAPI_DISABLED_MSG);
+        }
+        
+        if ( !authenticated )
+        {
+            throw new XmlRpcException(
+                AUTHORIZATION_EXCEPTION, AUTHORIZATION_EXCEPTION_MSG);
+        }
+        return website;
+    }
+
+    //------------------------------------------------------------------------
+    protected void flushPageCache(String user) throws Exception
+    {
+        // Get Roller request object for current thread
+        RollerRequest rreq = RollerRequest.getRollerRequest();
+        
+        UserManager umgr = rreq.getRoller().getUserManager();
+        UserData ud = umgr.getUser(user);
+        
+        PageCacheFilter.removeFromCache( rreq.getRequest(), ud );
+        MainPageAction.flushMainPageCache();
+    }
+}

Added: incubator/roller/branches/roller_1.x/src/org/roller/presentation/xmlrpc/BloggerAPIHandler.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_1.x/src/org/roller/presentation/xmlrpc/BloggerAPIHandler.java?rev=327589&view=auto
==============================================================================
--- incubator/roller/branches/roller_1.x/src/org/roller/presentation/xmlrpc/BloggerAPIHandler.java (added)
+++ incubator/roller/branches/roller_1.x/src/org/roller/presentation/xmlrpc/BloggerAPIHandler.java Fri Oct 21 14:27:36 2005
@@ -0,0 +1,504 @@
+
+package org.roller.presentation.xmlrpc;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.xmlrpc.XmlRpcException;
+import org.roller.RollerException;
+import org.roller.model.Roller;
+import org.roller.model.UserManager;
+import org.roller.model.WeblogManager;
+import org.roller.pojos.WeblogTemplate;
+import org.roller.pojos.UserData;
+import org.roller.pojos.WeblogEntryData;
+import org.roller.pojos.WebsiteData;
+import org.roller.presentation.RollerContext;
+import org.roller.presentation.RollerRequest;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.StringTokenizer;
+import java.util.Vector;
+
+import javax.servlet.http.HttpServletRequest;
+
+
+/**
+ * Roller XML-RPC Handler for the Blogger v1 API.
+ *
+ * Blogger API spec can be found at http://plant.blogger.com/api/index.html
+ * See also http://xmlrpc.free-conversant.com/docs/bloggerAPI
+ *
+ * @author David M Johnson
+ */
+public class BloggerAPIHandler extends BaseAPIHandler
+{
+    static final long serialVersionUID = 2398898776655115019L;
+    
+    private static Log mLogger =
+        LogFactory.getFactory().getInstance(RollerXMLRPCServlet.class);
+
+    public BloggerAPIHandler()
+    {
+        super();
+    }
+
+    //------------------------------------------------------------------------
+
+    /**
+     * Delete a Post
+     *
+     * @param appkey Unique identifier/passcode of the application sending the post
+     * @param postid Unique identifier of the post to be changed
+     * @param userid Login for a Blogger user who has permission to post to the blog
+     * @param password Password for said username
+     * @param publish Ignored
+     * @throws XmlRpcException
+     * @return
+     */
+    public boolean deletePost(String appkey, String postid, String userid,
+                              String password, boolean publish)
+                       throws Exception
+    {
+        mLogger.info("deletePost() Called =====[ SUPPORTED ]=====");
+        mLogger.info("     Appkey: " + appkey);
+        mLogger.info("     PostId: " + postid);
+        mLogger.info("     UserId: " + userid);
+
+        validate(userid,password);
+
+        Roller roller = RollerRequest.getRollerRequest().getRoller();
+        WeblogManager weblogMgr = roller.getWeblogManager();
+        try
+        {
+            WeblogEntryData entry = weblogMgr.retrieveWeblogEntry(postid);
+            entry.remove();
+            roller.commit();
+            flushPageCache(userid);
+        }
+        catch (Exception e)
+        {
+            String msg = "ERROR in blogger.deletePost: "+e.getClass().getName();
+            mLogger.error(msg,e);
+            e.printStackTrace();
+            throw new XmlRpcException(UNKNOWN_EXCEPTION, msg);
+        }
+        return true;
+    }
+
+    //------------------------------------------------------------------------
+
+    /**
+     * Edits the main index template of a given blog. Roller only support
+     * updating the main template, the default template of your weblog.
+     *
+     * @param appkey Unique identifier/passcode of the application sending the post
+     * @param blogid Unique identifier of the blog the post will be added to
+     * @param userid Login for a Blogger user who has permission to post to the blog
+     * @param password Password for said username
+     * @param template The text for the new template (usually mostly HTML).
+     * @param templateType Determines which of the blog's templates is to be set.
+     * @throws XmlRpcException
+     * @return
+     */
+    public boolean setTemplate(String appkey, String blogid, String userid,
+                               String password, String templateData,
+                               String templateType) throws Exception
+    {
+        mLogger.info("setTemplate() Called =====[ SUPPORTED ]=====");
+        mLogger.info("     Appkey: " + appkey);
+        mLogger.info("     BlogId: " + blogid);
+        mLogger.info("     UserId: " + userid);
+        mLogger.info("   Template: " + templateData);
+        mLogger.info("       Type: " + templateType);
+
+        validate(userid,password);
+
+        if (! templateType.equals("main"))
+        {
+            throw new XmlRpcException(
+                UNKNOWN_EXCEPTION, "Roller only supports main template");
+        }
+
+        try
+        {
+            Roller roller = RollerRequest.getRollerRequest().getRoller();
+            UserManager userMgr = roller.getUserManager();
+
+            WeblogTemplate page = userMgr.retrievePage(templateType);
+            page.setContents(templateData);
+            userMgr.storePage(page);
+            flushPageCache(userid);
+
+            return true;
+        }
+        catch (RollerException e)
+        {
+            String msg = "ERROR in BlooggerAPIHander.setTemplate";
+            mLogger.error(msg,e);
+            throw new XmlRpcException(UNKNOWN_EXCEPTION,msg);
+        }
+    }
+
+    //------------------------------------------------------------------------
+
+    /**
+     * Returns the main or archive index template of a given blog
+     *
+     * @param appkey Unique identifier/passcode of the application sending the post
+     * @param blogid Unique identifier of the blog the post will be added to
+     * @param userid Login for a Blogger user who has permission to post to the blog
+     * @param password Password for said username
+     * @param templateType Determines which of the blog's templates will be returned. Currently, either "main" or "archiveIndex"
+     * @throws XmlRpcException
+     * @return
+     */
+    public String getTemplate(String appkey, String blogid, String userid,
+                              String password, String templateType)
+                       throws Exception
+    {
+        mLogger.info("getTemplate() Called =====[ SUPPORTED ]=====");
+        mLogger.info("     Appkey: " + appkey);
+        mLogger.info("     BlogId: " + blogid);
+        mLogger.info("     UserId: " + userid);
+        mLogger.info("       Type: " + templateType);
+
+        validate(userid,password);
+
+        try
+        {
+            Roller roller = RollerRequest.getRollerRequest().getRoller();
+            UserManager userMgr = roller.getUserManager();
+            WeblogTemplate page = userMgr.retrievePage(templateType);
+
+            if ( null == page )
+            {
+                throw new XmlRpcException(UNKNOWN_EXCEPTION,"Template not found");
+            }
+            else
+            {
+                return page.getContents();
+            }
+        }
+        catch (Exception e)
+        {
+            String msg = "ERROR in BlooggerAPIHander.getTemplate";
+            mLogger.error(msg,e);
+            throw new XmlRpcException(UNKNOWN_EXCEPTION,msg);
+        }
+    }
+
+    //------------------------------------------------------------------------
+
+    /**
+     * Authenticates a user and returns basic user info (name, email, userid, etc.)
+     *
+     * @param appkey Unique identifier/passcode of the application sending the post
+     * @param userid Login for a Blogger user who has permission to post to the blog
+     * @param password Password for said username
+     * @throws XmlRpcException
+     * @return
+     */
+    public Object getUserInfo(String appkey, String userid, String password)
+                       throws Exception
+    {
+        mLogger.info("getUserInfo() Called =====[ SUPPORTED ]=====");
+        mLogger.info("     Appkey: " + appkey);
+        mLogger.info("     UserId: " + userid);
+
+        validate(userid,password);
+
+        try
+        {
+            Roller roller = RollerRequest.getRollerRequest().getRoller();
+            UserManager userMgr = roller.getUserManager();
+            UserData user = userMgr.getUser(userid);
+
+            // parses full name into two strings, firstname and lastname
+            String firstname = "", lastname = "";
+            StringTokenizer toker = new StringTokenizer(user.getFullName());
+
+            if (toker.hasMoreTokens())
+            {
+                firstname = toker.nextToken();
+            }
+
+            while (toker.hasMoreTokens())
+            {
+                if ( !lastname.equals("") )
+                {
+                    lastname += " ";
+                }
+                lastname += toker.nextToken();
+            }
+
+            RollerRequest rreq = RollerRequest.getRollerRequest();
+            HttpServletRequest req = rreq.getRequest();
+            String contextUrl =
+                RollerContext.getRollerContext(req).getAbsoluteContextUrl(req);
+            
+            // populates user information to return as a result
+            Hashtable result = new Hashtable();
+            result.put("nickname", user.getUserName());
+            result.put("userid", user.getUserName());
+            result.put("url", contextUrl+"/page/"+userid);
+            result.put("email", "");
+            result.put("lastname", lastname);
+            result.put("firstname", firstname);
+
+            return result;
+        }
+        catch (RollerException e)
+        {
+            String msg = "ERROR in BlooggerAPIHander.getInfo";
+            mLogger.error(msg,e);
+            throw new XmlRpcException(UNKNOWN_EXCEPTION,msg);
+        }
+    }
+
+    //------------------------------------------------------------------------
+
+    /**
+     * Returns information on all the blogs a given user is a member of
+     *
+     * @param appkey Unique identifier/passcode of the application sending the post
+     * @param userid Login for a Blogger user who has permission to post to the blog
+     * @param password Password for said username
+     * @throws XmlRpcException
+     * @return
+     */
+    public Object getUsersBlogs(String appkey, String userid, String password)
+                         throws Exception
+    {
+        mLogger.info("getUsersBlogs() Called ===[ SUPPORTED ]=======");
+        mLogger.info("     Appkey: " + appkey);
+        mLogger.info("     UserId: " + userid);
+
+        WebsiteData website = validate(userid,password);
+
+        try
+        {
+            RollerRequest rreq = RollerRequest.getRollerRequest();
+            HttpServletRequest req = rreq.getRequest();
+            String contextUrl =
+                RollerContext.getRollerContext(req).getAbsoluteContextUrl(req);
+
+            Hashtable blog = new Hashtable(3);
+            blog.put("url", contextUrl+"/page/"+userid);
+            blog.put("blogid", userid);
+            blog.put("blogName", website.getName());
+
+            Vector result = new Vector();
+            result.add(blog);
+
+            return result;
+        }
+        catch (Exception e)
+        {
+            String msg = "ERROR in BlooggerAPIHander.getUsersBlogs";
+            mLogger.error(msg,e);
+            throw new XmlRpcException(UNKNOWN_EXCEPTION, msg);
+        }
+    }
+
+    //------------------------------------------------------------------------
+
+    /**
+     * Edits a given post. Optionally, will publish the blog after making the edit
+     *
+     * @param appkey Unique identifier/passcode of the application sending the post
+     * @param postid Unique identifier of the post to be changed
+     * @param userid Login for a Blogger user who has permission to post to the blog
+     * @param password Password for said username
+     * @param content Contents of the post
+     * @param publish If true, the blog will be published immediately after the post is made
+     * @throws XmlRpcException
+     * @return
+     */
+    public boolean editPost(String appkey, String postid, String userid,
+                            String password, String content, boolean publish)
+                     throws Exception
+    {
+        mLogger.info("editPost() Called ========[ SUPPORTED ]=====");
+        mLogger.info("     Appkey: " + appkey);
+        mLogger.info("     PostId: " + postid);
+        mLogger.info("     UserId: " + userid);
+        mLogger.info("    Publish: " + publish);
+        mLogger.info("     Content:\n " + content);
+
+        validate(userid,password);
+
+        try
+        {
+            Timestamp current = new Timestamp(System.currentTimeMillis());
+
+            Roller roller = RollerRequest.getRollerRequest().getRoller();
+            WeblogManager weblogMgr = roller.getWeblogManager();
+            WeblogEntryData entry = weblogMgr.retrieveWeblogEntry(postid);
+            entry.setText(content);
+            entry.setUpdateTime(current);
+            entry.setPublishEntry(Boolean.valueOf(publish));
+
+            entry.save();
+            roller.commit();
+            flushPageCache(userid);
+            return true;
+        }
+        catch (Exception e)
+        {
+            String msg = "ERROR in BlooggerAPIHander.editPost";
+            mLogger.error(msg,e);
+            throw new XmlRpcException(UNKNOWN_EXCEPTION, msg);
+        }
+    }
+
+    //------------------------------------------------------------------------
+
+    /**
+     * Makes a new post to a designated blog. Optionally, will publish the blog after making the post
+     *
+     * @param appkey Unique identifier/passcode of the application sending the post
+     * @param blogid Unique identifier of the blog the post will be added to
+     * @param userid Login for a Blogger user who has permission to post to the blog
+     * @param password Password for said username
+     * @param content Contents of the post
+     * @param publish If true, the blog will be published immediately after the post is made
+     * @throws XmlRpcException
+     * @return
+     */
+    public String newPost(String appkey, String blogid, String userid,
+                          String password, String content, boolean publish)
+                   throws Exception
+    {
+        mLogger.info("newPost() Called ===========[ SUPPORTED ]=====");
+        mLogger.info("     Appkey: " + appkey);
+        mLogger.info("     BlogId: " + blogid);
+        mLogger.info("     UserId: " + userid);
+        mLogger.info("    Publish: " + publish);
+        mLogger.info("    Content:\n " + content);
+
+        WebsiteData website = validate(userid,password);
+
+        // extract the title from the content
+        String title = "";
+
+        if (content.indexOf("<title>") != -1)
+        {
+            title =
+                content.substring(content.indexOf("<title>") + 7,
+                                  content.indexOf("</title>"));
+            content = StringUtils.replace(content, "<title>"+title+"</title>", "");
+        }
+
+        try
+        {
+            RollerRequest rreq = RollerRequest.getRollerRequest();
+            Roller roller = rreq.getRoller();
+
+            Timestamp current = new Timestamp(System.currentTimeMillis());
+
+            WeblogEntryData entry = new WeblogEntryData();
+            entry.setTitle(title);
+            entry.setText(content);
+            entry.setPubTime(current);
+            entry.setUpdateTime(current);
+            entry.setWebsite(website);
+            entry.setPublishEntry(Boolean.valueOf(publish));
+            entry.setCategory(website.getBloggerCategory());
+
+            entry.save();
+            roller.commit();
+            flushPageCache(userid);
+/*
+            String blogUrl = Utilities.escapeHTML( 
+                RollerContext.getRollerContext(req).getAbsoluteContextUrl(req)
+                + "/page/" + userid);
+            RollerXmlRpcClient.sendWeblogsPing(
+                blogUrl,
+                entry.getWebsite().getName());
+*/
+            return entry.getId();
+        }
+        catch (Exception e)
+        {
+            String msg = "ERROR in BlooggerAPIHander.newPost";
+            mLogger.error(msg,e);
+            throw new XmlRpcException(UNKNOWN_EXCEPTION, msg);
+        }
+    }
+
+    //------------------------------------------------------------------------
+
+    /**
+     * This method was added to the Blogger 1.0 API via an Email from Evan
+     * Williams to the Yahoo Group bloggerDev, see the email message for details - 
+     * http://groups.yahoo.com/group/bloggerDev/message/225 
+     *
+     * @param appkey Unique identifier/passcode of the application sending the post
+     * @param blogid Unique identifier of the blog the post will be added to
+     * @param userid Login for a Blogger user who has permission to post to the blog
+     * @param password Password for said username
+     * @param numposts Number of Posts to Retrieve
+     * @throws XmlRpcException
+     * @return Vector of Hashtables, each containing dateCreated, userid, postid, content
+     */
+    public Object getRecentPosts(
+        String appkey, String blogid, String userid, String password, int numposts)
+        throws Exception
+    {
+        mLogger.info("getRecentPosts() Called ===========[ SUPPORTED ]=====");
+        mLogger.info("     Appkey: " + appkey);
+        mLogger.info("     BlogId: " + blogid);
+        mLogger.info("     UserId: " + userid);
+        mLogger.info("     Number: " + numposts);
+
+        WebsiteData website = validate(userid,password);
+
+        try
+        {
+            Vector results = new Vector();
+
+            Roller roller = RollerRequest.getRollerRequest().getRoller();
+            WeblogManager weblogMgr = roller.getWeblogManager();
+            if (website != null)
+            {
+                Map entries = weblogMgr.getWeblogEntryObjectMap(
+                                website,                // userName
+                                null,                   // startDate
+                                new Date(),             // endDate
+                                null,                   // catName
+                                WeblogManager.ALL,      // status
+                                new Integer(numposts)); // maxEntries 
+                
+                Iterator iter = entries.values().iterator();
+                while (iter.hasNext())
+                {
+                    ArrayList list = (ArrayList) iter.next();
+                    Iterator i = list.iterator();
+                    while (i.hasNext())
+                    {
+                        WeblogEntryData entry = (WeblogEntryData) i.next();    
+                        Hashtable result = new Hashtable();    
+                        result.put("dateCreated", entry.getPubTime());
+                        result.put("userid", userid);
+                        result.put("postid", entry.getId());
+                        result.put("content", entry.getText());                        
+                        results.add(result);
+                    }
+                }
+            }
+            return results;
+        }
+        catch (Exception e)
+        {
+            String msg = "ERROR in BlooggerAPIHander.getRecentPosts";
+            mLogger.error(msg,e);
+            throw new XmlRpcException(UNKNOWN_EXCEPTION, msg);
+        }
+    }
+}