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/24 06:31:48 UTC

svn commit: r201564 [2/4] - in /incubator/roller/branches/roller_2.0: ./ contrib/plugins/src/org/roller/presentation/velocity/plugins/readmore/ custom/ metadata/database/ metadata/database/hibernate/ nbproject/ personal/testing/ src/org/roller/business...

Modified: incubator/roller/branches/roller_2.0/src/org/roller/pojos/WeblogEntryData.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_2.0/src/org/roller/pojos/WeblogEntryData.java?rev=201564&r1=201563&r2=201564&view=diff
==============================================================================
--- incubator/roller/branches/roller_2.0/src/org/roller/pojos/WeblogEntryData.java (original)
+++ incubator/roller/branches/roller_2.0/src/org/roller/pojos/WeblogEntryData.java Thu Jun 23 21:31:43 2005
@@ -1,6 +1,7 @@
 
 package org.roller.pojos;
 
+import java.io.Serializable;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.sql.Timestamp;
@@ -21,14 +22,11 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.roller.RollerException;
-import org.roller.model.Roller;
 import org.roller.model.RollerFactory;
 import org.roller.model.WeblogManager;
 import org.roller.util.DateUtil;
 import org.roller.util.Utilities;
 
-import sun.security.krb5.internal.i;
-
 
 /**
  * Represents a Weblog Entry.
@@ -40,8 +38,7 @@
  * @hibernate.class table="weblogentry"
  * hibernate.jcs-cache usage="read-write"
  */
-public class WeblogEntryData extends org.roller.pojos.PersistentObject
-    implements java.io.Serializable
+public class WeblogEntryData extends WebsiteObject implements Serializable
 {
     private static Log mLogger = LogFactory.getFactory()
                                            .getInstance(WeblogEntryData.class);
@@ -57,6 +54,7 @@
     protected Timestamp pubTime=null;
     protected Timestamp updateTime=null;
     protected Boolean publishEntry=null;
+    protected UserData mCreator=null;
     protected WebsiteData mWebsite=null;
     protected String mPlugins;
     protected Boolean allowComments = Boolean.TRUE;
@@ -187,6 +185,21 @@
 
     /** 
      * @ejb:persistent-field 
+     * @hibernate.many-to-one column="userid" cascade="none" not-null="true"
+     */
+    public UserData getCreator()
+    {
+        return this.mCreator;
+    }
+
+    /** @ejb:persistent-field */
+    public void setCreator(UserData creator)
+    {
+        this.mCreator = creator;
+    }
+    
+    /** 
+     * @ejb:persistent-field 
      * @hibernate.property column="title" non-null="true" unique="false"
      */
     public java.lang.String getTitle()
@@ -673,7 +686,7 @@
         }
         
         WebsiteData website = this.getWebsite();
-        String plink = "/page/" + website.getUser().getUserName() + 
+        String plink = "/page/" + website.getHandle() + 
                 "?anchor=" + lAnchor;
         
         return plink;
@@ -707,7 +720,7 @@
         {
             // go with the "no encoding" version
         }        
-        String clink = "/page/" + this.getWebsite().getUser().getUserName() + "?anchor=" + lAnchor;
+        String clink = "/page/" + this.getWebsite().getHandle() + "?anchor=" + lAnchor;
         return clink;
     }
     /** to please XDoclet */
@@ -996,17 +1009,4 @@
         return new ArrayList();
     }
 
-    public boolean canSave() throws RollerException
-    {
-        Roller roller = RollerFactory.getRoller();
-        if (roller.getUser().equals(UserData.SYSTEM_USER)) 
-        {
-            return true;
-        }
-        if (roller.getUser().equals(getWebsite().getUser()))
-        {
-            return true;
-        }
-        return false;
-    }
 }

Modified: incubator/roller/branches/roller_2.0/src/org/roller/pojos/WebsiteData.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_2.0/src/org/roller/pojos/WebsiteData.java?rev=201564&r1=201563&r2=201564&view=diff
==============================================================================
--- incubator/roller/branches/roller_2.0/src/org/roller/pojos/WebsiteData.java (original)
+++ incubator/roller/branches/roller_2.0/src/org/roller/pojos/WebsiteData.java Thu Jun 23 21:31:43 2005
@@ -6,6 +6,8 @@
 import org.roller.model.RollerFactory;
 import org.roller.util.PojoUtil;
 
+import java.util.Iterator;
+import java.util.List;
 import java.util.Locale;
 import java.util.TimeZone;
 /**
@@ -21,24 +23,27 @@
     implements java.io.Serializable
 {
     static final long serialVersionUID = 206437645033737127L;
-    protected java.lang.String id;
-    protected java.lang.String name;
-    protected java.lang.String description;
-    protected java.lang.String defaultPageId;
-    protected java.lang.String weblogDayPageId;
-    protected java.lang.Boolean enableBloggerApi;
+    protected String  id;
+    protected String  handle;
+    protected String  name;
+    protected String  description;
+    protected String  defaultPageId;
+    protected String  weblogDayPageId;
+    protected Boolean enableBloggerApi;
+    protected String  editorPage;
+    protected String  ignoreWords;
+    protected Boolean allowComments;
+    protected Boolean emailComments;
+    protected String  emailFromAddress;
+    protected String  emailAddress;
+    protected String  editorTheme;
+    protected String  locale;
+    protected String  timezone;
+    protected String  mDefaultPlugins;
+    protected Boolean isEnabled;
+    protected List    permissions;
     protected WeblogCategoryData bloggerCategory;
     protected WeblogCategoryData defaultCategory;
-    protected java.lang.String editorPage;
-    protected java.lang.String ignoreWords;
-    protected java.lang.Boolean allowComments;
-    protected java.lang.Boolean emailComments;
-    protected java.lang.String emailFromAddress;
-    protected java.lang.String editorTheme;
-    protected java.lang.String locale;
-    protected java.lang.String timezone;
-    protected java.lang.String mDefaultPlugins;
-    protected java.lang.Boolean isEnabled;
 
     protected UserData mUser = null;
 
@@ -46,24 +51,26 @@
     {
     }
 
-    public WebsiteData(final java.lang.String id, 
-                       final java.lang.String name,
-                       final java.lang.String description,
+    public WebsiteData(final String   id, 
+                       final String   name,
+                       final String   handle,
+                       final String   description,
                        final UserData user,
-                       final java.lang.String defaultPageId,
-                       final java.lang.String weblogDayPageId,
-                       final java.lang.Boolean enableBloggerApi,
+                       final String   defaultPageId,
+                       final String   weblogDayPageId,
+                       final Boolean  enableBloggerApi,
                        final WeblogCategoryData bloggerCategory,
                        final WeblogCategoryData defaultCategory,
-                       final java.lang.String editorPage,
-                       final java.lang.String ignoreWords,
-                       final java.lang.Boolean allowComments,
-                       final java.lang.Boolean emailComments,
-                       final java.lang.String emailFromAddress,
-                       final java.lang.Boolean isEnabled)
+                       final String   editorPage,
+                       final String   ignoreWords,
+                       final Boolean  allowComments,
+                       final Boolean  emailComments,
+                       final String   emailFromAddress,
+                       final Boolean  isEnabled)
     {
         this.id = id;
         this.name = name;
+        this.handle = handle;
         this.description = description;
         this.mUser = user;
         this.defaultPageId = defaultPageId;
@@ -84,35 +91,73 @@
         this.setData(otherData);
     }
 
+    /** 
+     * @hibernate.bag lazy="true" inverse="true" cascade="delete" 
+     * @hibernate.collection-key column="website_id"
+     * @hibernate.collection-one-to-many 
+     *    class="org.roller.pojos.PermissionsData"
+     */
+    public List getPermissions() 
+    {
+        return permissions;
+    }
+    public void setPermissions(List perms)
+    {
+        permissions = perms;
+    }
+    /** 
+     * Remove permission from collection.
+     */
+    public void removePermission(PermissionsData perms)
+    {
+        permissions.remove(perms);
+    }
+    
     /**
      * Id of the Website.
      * @ejb:persistent-field
      * @hibernate.id column="id" type="string"
      *  generator-class="uuid.hex" unsaved-value="null"
      */
-    public java.lang.String getId()
+    public String getId()
     {
         return this.id;
     }
 
     /** @ejb:persistent-field */
-    public void setId(java.lang.String id)
+    public void setId(String id)
     {
         this.id = id;
     }
 
     /**
+     * Short URL safe string that uniquely identifies the website.
+     * @ejb:persistent-field
+     * @hibernate.property column="name" non-null="true" unique="true"
+     */
+    public String getHandle()
+    {
+        return this.handle;
+    }
+
+    /** @ejb:persistent-field */
+    public void setHandle(String handle)
+    {
+        this.handle = handle;
+    }
+
+    /**
      * Name of the Website.
      * @ejb:persistent-field
      * @hibernate.property column="name" non-null="true" unique="false"
      */
-    public java.lang.String getName()
+    public String getName()
     {
         return this.name;
     }
 
     /** @ejb:persistent-field */
-    public void setName(java.lang.String name)
+    public void setName(String name)
     {
         this.name = name;
     }
@@ -122,13 +167,13 @@
      * @ejb:persistent-field
      * @hibernate.property column="description" non-null="true" unique="false"
      */
-    public java.lang.String getDescription()
+    public String getDescription()
     {
         return this.description;
     }
 
     /** @ejb:persistent-field */
-    public void setDescription(java.lang.String description)
+    public void setDescription(String description)
     {
         this.description = description;
     }
@@ -138,13 +183,13 @@
      * @ejb:persistent-field
      * @hibernate.many-to-one column="userid" cascade="none" not-null="true"
      */
-    public org.roller.pojos.UserData getUser()
+    public org.roller.pojos.UserData getCreator()
     {
         return mUser;
     }
 
     /** @ejb:persistent-field */
-    public void setUser( org.roller.pojos.UserData ud )
+    public void setCreator( org.roller.pojos.UserData ud )
     {
         mUser = ud;
     }
@@ -153,7 +198,7 @@
      * @ejb:persistent-field
      * @hibernate.property column="defaultpageid" non-null="true" unique="false"
      */
-    public java.lang.String getDefaultPageId()
+    public String getDefaultPageId()
     {
         return this.defaultPageId;
     }
@@ -161,7 +206,7 @@
     /**
      * @ejb:persistent-field
      */
-    public void setDefaultPageId(java.lang.String defaultPageId)
+    public void setDefaultPageId(String defaultPageId)
     {
         this.defaultPageId = defaultPageId;
     }
@@ -171,7 +216,7 @@
      * @ejb:persistent-field
      * @hibernate.property column="weblogdayid" non-null="true" unique="false"
      */
-    public java.lang.String getWeblogDayPageId()
+    public String getWeblogDayPageId()
     {
         return this.weblogDayPageId;
     }
@@ -180,7 +225,7 @@
      * @deprecated
      * @ejb:persistent-field
      */
-    public void setWeblogDayPageId(java.lang.String weblogDayPageId)
+    public void setWeblogDayPageId(String weblogDayPageId)
     {
         this.weblogDayPageId = weblogDayPageId;
     }
@@ -189,13 +234,13 @@
      * @ejb:persistent-field
      * @hibernate.property column="enablebloggerapi" non-null="true" unique="false"
      */
-    public java.lang.Boolean getEnableBloggerApi()
+    public Boolean getEnableBloggerApi()
     {
         return this.enableBloggerApi;
     }
 
     /** @ejb:persistent-field */
-    public void setEnableBloggerApi(java.lang.Boolean enableBloggerApi)
+    public void setEnableBloggerApi(Boolean enableBloggerApi)
     {
         this.enableBloggerApi = enableBloggerApi;
     }
@@ -240,13 +285,13 @@
      * @ejb:persistent-field
      * @hibernate.property column="editorpage" non-null="true" unique="false"
      */
-    public java.lang.String getEditorPage()
+    public String getEditorPage()
     {
         return this.editorPage;
     }
 
     /** @ejb:persistent-field */
-    public void setEditorPage(java.lang.String editorPage)
+    public void setEditorPage(String editorPage)
     {
         this.editorPage = editorPage;
     }
@@ -255,13 +300,13 @@
      * @ejb:persistent-field
      * @hibernate.property column="ignorewords" non-null="true" unique="false"
      */
-    public java.lang.String getIgnoreWords()
+    public String getIgnoreWords()
     {
         return this.ignoreWords;
     }
 
     /** @ejb:persistent-field */
-    public void setIgnoreWords(java.lang.String ignoreWords)
+    public void setIgnoreWords(String ignoreWords)
     {
         this.ignoreWords = ignoreWords;
     }
@@ -270,13 +315,13 @@
      * @ejb:persistent-field
      * @hibernate.property column="allowcomments" non-null="true" unique="false"
      */
-    public java.lang.Boolean getAllowComments()
+    public Boolean getAllowComments()
     {
         return this.allowComments;
     }
 
     /** @ejb:persistent-field */
-    public void setAllowComments(java.lang.Boolean allowComments)
+    public void setAllowComments(Boolean allowComments)
     {
         this.allowComments = allowComments;
     }
@@ -285,13 +330,13 @@
      * @ejb:persistent-field
      * @hibernate.property column="emailcomments" non-null="true" unique="false"
      */
-    public java.lang.Boolean getEmailComments()
+    public Boolean getEmailComments()
     {
         return this.emailComments;
     }
 
     /** @ejb:persistent-field */
-    public void setEmailComments(java.lang.Boolean emailComments)
+    public void setEmailComments(Boolean emailComments)
     {
         this.emailComments = emailComments;
     }
@@ -300,29 +345,44 @@
      * @ejb:persistent-field
      * @hibernate.property column="emailfromaddress" non-null="true" unique="false"
      */
-    public java.lang.String getEmailFromAddress()
+    public String getEmailFromAddress()
     {
         return this.emailFromAddress;
     }
 
     /** @ejb:persistent-field */
-    public void setEmailFromAddress(java.lang.String emailFromAddress)
+    public void setEmailFromAddress(String emailFromAddress)
     {
         this.emailFromAddress = emailFromAddress;
     }
     
     /**
+     * @ejb:persistent-field
+     * @hibernate.property column="emailfromaddress" non-null="true" unique="false"
+     */
+    public String getEmailAddress()
+    {
+        return this.emailAddress;
+    }
+
+    /** @ejb:persistent-field */
+    public void setEmailAddress(String emailFromAddress)
+    {
+        this.emailAddress = emailAddress;
+    }
+    
+    /**
      * EditorTheme of the Website.
      * @ejb:persistent-field
      * @hibernate.property column="editortheme" non-null="true" unique="false"
      */
-    public java.lang.String getEditorTheme()
+    public String getEditorTheme()
     {
         return this.editorTheme;
     }
 
     /** @ejb:persistent-field */
-    public void setEditorTheme(java.lang.String editorTheme)
+    public void setEditorTheme(String editorTheme)
     {
         this.editorTheme = editorTheme;
     }
@@ -332,13 +392,13 @@
      * @ejb:persistent-field
      * @hibernate.property column="locale" non-null="true" unique="false"
      */
-    public java.lang.String getLocale()
+    public String getLocale()
     {
         return this.locale;
     }
 
     /** @ejb:persistent-field */
-    public void setLocale(java.lang.String locale)
+    public void setLocale(String locale)
     {
         this.locale = locale;
     }
@@ -348,13 +408,13 @@
      * @ejb:persistent-field
      * @hibernate.property column="timezone" non-null="true" unique="false"
      */
-    public java.lang.String getTimezone()
+    public String getTimezone()
     {
         return this.timezone;
     }
 
     /** @ejb:persistent-field */
-    public void setTimezone(java.lang.String timezone)
+    public void setTimezone(String timezone)
     {
         this.timezone = timezone;
     }
@@ -364,13 +424,13 @@
      * @ejb:persistent-field
      * @hibernate.property column="defaultplugins" non-null="false" unique="false"
      */
-    public java.lang.String getDefaultPlugins()
+    public String getDefaultPlugins()
     {
         return mDefaultPlugins;
     }
 
     /** @ejb:persistent-field */
-    public void setDefaultPlugins(java.lang.String string)
+    public void setDefaultPlugins(String string)
     {
         mDefaultPlugins = string;
     }
@@ -379,13 +439,13 @@
      * @ejb:persistent-field
      * @hibernate.property column="isenabled" non-null="true" unique="false"
      */
-    public java.lang.Boolean getIsEnabled()
+    public Boolean getIsEnabled()
     {
         return this.isEnabled;
     }
     
     /** @ejb:persistent-field */ 
-    public void setIsEnabled(java.lang.Boolean isEnabled)
+    public void setIsEnabled(Boolean isEnabled)
     {
         this.isEnabled = isEnabled;
     }
@@ -500,6 +560,7 @@
 
         this.id = other.id;
         this.name = other.name;
+        this.handle = other.handle;
         this.description = other.description;
         this.mUser = other.mUser;
         this.defaultPageId = other.defaultPageId;
@@ -588,11 +649,38 @@
         {
             return true;
         }
-        if (roller.getUser().equals(getUser()))
+        if (hasUserPermissions(roller.getUser(), 
+                (short)(PermissionsData.ADMIN|PermissionsData.AUTHOR)))
         {
             return true;
         }
         return false;
     }
 
-}
\ No newline at end of file
+    /**
+     * Returns true if user has all permissions specified by mask.
+     */
+    public boolean hasUserPermissions(UserData user, short mask)
+    {
+        PermissionsData userPerms = null;
+        Iterator iter = getPermissions().iterator();
+        while (iter.hasNext())
+        {
+            PermissionsData perms = (PermissionsData) iter.next();
+            if (perms.getUser().getId().equals(user.getId())) 
+            {
+                userPerms = perms;
+                break;
+            }
+        }
+        if (!userPerms.isPending())
+        {
+            if (userPerms != null && (userPerms.getPermissionMask() & mask) > 0) 
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+}
+

Modified: incubator/roller/branches/roller_2.0/src/org/roller/presentation/BasePageModel.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_2.0/src/org/roller/presentation/BasePageModel.java?rev=201564&r1=201563&r2=201564&view=diff
==============================================================================
--- incubator/roller/branches/roller_2.0/src/org/roller/presentation/BasePageModel.java (original)
+++ incubator/roller/branches/roller_2.0/src/org/roller/presentation/BasePageModel.java Thu Jun 23 21:31:43 2005
@@ -60,11 +60,6 @@
         return "MMM dd, yyyy";
     }
 
-    public UserData getUser()
-    {
-        return RollerRequest.getRollerRequest(request).getUser();
-    }
-    
     /**
      * @return Returns the mapping.
      */

Modified: incubator/roller/branches/roller_2.0/src/org/roller/presentation/LanguageUtil.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_2.0/src/org/roller/presentation/LanguageUtil.java?rev=201564&r1=201563&r2=201564&view=diff
==============================================================================
--- incubator/roller/branches/roller_2.0/src/org/roller/presentation/LanguageUtil.java (original)
+++ incubator/roller/branches/roller_2.0/src/org/roller/presentation/LanguageUtil.java Thu Jun 23 21:31:43 2005
@@ -126,13 +126,17 @@
 		mLogger.debug("getViewLocale()");
 		Locale viewLocale = null;
 
-		// if user is logged in and the user looking at his own website, take website-locale
-		if (isWebsiteOfPrincipal(request)) 
-        {
-			viewLocale = getDefaultLocale(request);
-			mLogger.debug("websiteLocale = "+viewLocale);
-		} 
-        else if (request.getSession(false) != null) 
+	    // if user is logged in and the user looking at his own website, 
+        // take website-locale user's don;t have locales, websites do and a user
+        // can belong to multiple websites, each with a different locale.
+        // So this check no longer makes sense.
+		//if (isWebsiteOfPrincipal(request)) 
+        //{
+			//viewLocale = getDefaultLocale(request);
+			//mLogger.debug("websiteLocale = "+viewLocale);
+		//} 
+        
+        if (request.getSession(false) != null) 
         {
 			// check session for existing Locale
 			viewLocale = (Locale) request.getSession().getAttribute(Globals.LOCALE_KEY);
@@ -209,18 +213,18 @@
 	 * @param request
 	 * @return
 	 */
-	public static boolean isWebsiteOfPrincipal(HttpServletRequest request) {
-		boolean result = false;
-		RollerRequest rreq = RollerRequest.getRollerRequest(request);
-		if (rreq != null) {            
-            WebsiteData website = rreq.getWebsite();
-            Principal principal = request.getUserPrincipal(); 
-            if (website != null && principal != null) {
-                return website.getUser().getUserName().equals(principal.getName());
-            }
-        }
-        return result;
-	}
+//	public static boolean isWebsiteOfPrincipal(HttpServletRequest request) {
+//		boolean result = false;
+//		RollerRequest rreq = RollerRequest.getRollerRequest(request);
+//		if (rreq != null) {            
+//            WebsiteData website = rreq.getWebsite();
+//            Principal principal = request.getUserPrincipal(); 
+//            if (website != null && principal != null) {
+//                return website.getUser().getUserName().equals(principal.getName());
+//            }
+//        }
+//        return result;
+//	}
 	
 	/**
 	 * Helper method to convert a language string to a <code>Locale</code> object.

Modified: incubator/roller/branches/roller_2.0/src/org/roller/presentation/RollerContext.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_2.0/src/org/roller/presentation/RollerContext.java?rev=201564&r1=201563&r2=201564&view=diff
==============================================================================
--- incubator/roller/branches/roller_2.0/src/org/roller/presentation/RollerContext.java (original)
+++ incubator/roller/branches/roller_2.0/src/org/roller/presentation/RollerContext.java Thu Jun 23 21:31:43 2005
@@ -28,7 +28,9 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.struts.util.RequestUtils;
 import org.roller.RollerException;
+import org.roller.config.PingConfig;
 import org.roller.config.RollerConfig;
+import org.roller.config.RollerRuntimeConfig;
 import org.roller.model.RefererManager;
 import org.roller.model.Roller;
 import org.roller.model.RollerFactory;
@@ -36,18 +38,17 @@
 import org.roller.model.ScheduledTask;
 import org.roller.pojos.UserData;
 import org.roller.pojos.WeblogEntryData;
+import org.roller.pojos.WebsiteData;
+import org.roller.presentation.pings.PingQueueTask;
 import org.roller.presentation.velocity.CommentAuthenticator;
 import org.roller.presentation.velocity.ContextLoader;
 import org.roller.presentation.velocity.DefaultCommentAuthenticator;
 import org.roller.presentation.website.ThemeCache;
-import org.roller.presentation.pings.PingQueueTask;
 import org.roller.util.DateUtil;
 import org.roller.util.StringUtils;
 import org.roller.util.Utilities;
 
 import EDU.oswego.cs.dl.util.concurrent.SynchronizedInt;
-import org.roller.config.RollerRuntimeConfig;
-import org.roller.config.PingConfig;
 
 //////////////////////////////////////////////////////////////////////////////
 /**
@@ -630,12 +631,12 @@
     /**
      * Returns the full url for the website of the specified username.
      */
-    public String getContextUrl(HttpServletRequest request, String username)
+    public String getContextUrl(HttpServletRequest request, WebsiteData website)
     {
         String url = this.getContextUrl(request);
-        if (username != null)
+        if (website != null)
         {
-            url = url + "/page/" + username;
+            url = url + "/page/" + website.getHandle();
         }
         return url;
     }
@@ -712,13 +713,11 @@
 
             String dayString = DateUtil.format8chars(entry.getPubTime());
 
-            UserData ud = entry.getWebsite().getUser();
-
             link =
                 Utilities.escapeHTML(
                     baseUrl
                         + "/page/"
-                        + ud.getUserName()
+                        + entry.getWebsite().getHandle()
                         + "/"
                         + dayString
                         + "#"

Modified: incubator/roller/branches/roller_2.0/src/org/roller/presentation/RollerRequest.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_2.0/src/org/roller/presentation/RollerRequest.java?rev=201564&r1=201563&r2=201564&view=diff
==============================================================================
--- incubator/roller/branches/roller_2.0/src/org/roller/presentation/RollerRequest.java (original)
+++ incubator/roller/branches/roller_2.0/src/org/roller/presentation/RollerRequest.java Thu Jun 23 21:31:43 2005
@@ -23,11 +23,11 @@
 import org.roller.pojos.BookmarkData;
 import org.roller.pojos.FolderData;
 import org.roller.pojos.PageData;
+import org.roller.pojos.PermissionsData;
 import org.roller.pojos.UserData;
 import org.roller.pojos.WeblogCategoryData;
 import org.roller.pojos.WeblogEntryData;
 import org.roller.pojos.WebsiteData;
-import org.roller.pojos.PingTargetData;
 import org.roller.util.DateUtil;
 import org.roller.util.Utilities;
  
@@ -77,6 +77,7 @@
     
     public static final String ANCHOR_KEY             = "anchor";
     public static final String USERNAME_KEY           = "username";
+    public static final String WEBSITEHANDLE_KEY      = "blog";
     public static final String WEBSITEID_KEY          = "websiteid";
     public static final String FOLDERID_KEY           = "folderid";
     public static final String PARENTID_KEY           = "parentid";
@@ -96,7 +97,7 @@
     public static final String WEBLOGCOMMENTID_KEY    = "catid";
     public static final String LOGIN_COOKIE           = "sessionId";
     
-    public static final String OWNING_USER            = "OWNING_USER";
+    public static final String OWNING_WEBSITE         = "OWNING_WEBSITE";
     
     private static final String ROLLER_REQUEST        = "roller_request";
     
@@ -113,7 +114,6 @@
         init();
     }
     
-    //------------------------------------------------------------------------
     /** Convenience */
     public RollerRequest( ServletRequest req, ServletContext ctx ) 
         throws RollerException
@@ -123,7 +123,6 @@
         init();
     }
     
-    //------------------------------------------------------------------------
     public RollerRequest( PageContext pCtx) throws RollerException
     {
         mRequest = (HttpServletRequest) pCtx.getRequest();
@@ -132,7 +131,6 @@
         init();
     }
 
-    //------------------------------------------------------------------------
     private void init() throws RollerException
     {
         mRollerRequestTLS.set(this);
@@ -171,6 +169,17 @@
         parseRequestParams();
     }
     
+    public String toString()
+    {
+        StringBuffer sb = new StringBuffer();
+        sb.append("[");
+        sb.append(getRequestURL());
+        sb.append(", ");
+        sb.append(getRefererURL());
+        sb.append("]");
+        return sb.toString();
+    }
+
     //------------------------------------------------------------------------
     /** 
      * Bind persistence session to specific user.
@@ -195,7 +204,7 @@
             //   /username/pagelink/anchor (specific entry)
             //   /username/pagelink/datestring/anchor (specific entry)
             UserManager userMgr = getRoller().getUserManager();
-            mWebsite = userMgr.getWebsite(pathInfo[0]);
+            mWebsite = userMgr.getWebsiteByHandle(pathInfo[0]);
             if (mWebsite != null)
             {
                 if ( pathInfo.length == 1 )
@@ -301,11 +310,6 @@
                 userName = mRequest.getRemoteUser(); 
             }
             
-            if ( userName != null )
-            {
-                mWebsite = userMgr.getWebsite(userName);
-            }
-            
             // Look for page ID in request params
             String pageId = mRequest.getParameter(RollerRequest.PAGEID_KEY);                    
             if ( pageId != null )
@@ -452,91 +456,14 @@
         return RollerContext.getRoller( mRequest );
     }
     
-    //------------------------------------------------------------------------
-    /** Is mRequest's user the admin user? */
-    public boolean isAdminUser() throws RollerException
-    {
-        UserData user = getUser();
-        if (user != null && user.hasRole("admin")) 
-        {
-            return true;
-        }
-        else
-        {
-            return false;
-        }
-    }
-
-    //------------------------------------------------------------------------
-    /** Is mRequest's user authorized to edit the mRequested resource */
-    public boolean isUserAuthorizedToEdit() throws RollerException
-    {
-        // Make sure authenticated user is the owner of this item
-        // Session's principal's name must match user name in mRequest
-        
-        RollerContext rctx = RollerContext.getRollerContext(mContext); 
-        Authenticator auth = rctx.getAuthenticator();
-        
-        String userName = auth.getAuthenticatedUserName(mRequest);
-            
-        // TODO: A hack to be replaced by Object.canEdit()
-        UserData owningUser = null;
-        if (mRequest.getAttribute(OWNING_USER) != null)
-        {
-            owningUser = (UserData)mRequest.getAttribute(OWNING_USER);
-        }
-        else
-        {
-            owningUser = getUser(); 
-        }
-        
-        if (    userName != null 
-             && owningUser != null
-             && userName.equalsIgnoreCase( owningUser.getUserName() )
-             && auth.isAuthenticatedUserInRole(mRequest,"editor"))
-        {
-            return true;
-        }
-        else
-        {
-            return false;
-        }
-    }
-
-    //------------------------------------------------------------------------
-    /**
-     * Get user by name.
-     */
-    public UserData getUser( String userName ) throws Exception
-    {
-        return getRoller().getUserManager().getUser(userName);
-    }
-
-    //------------------------------------------------------------------------
+    //-----------------------------------------------------------------------------
     
     public boolean isDateSpecified()
     {
         return mIsDateSpecified;
     }
-            
-    //------------------------------------------------------------------------
-    
-    public int getWeblogEntryCount()
-    {
-        // Get count of entries to return, or 20 if null
-        int count = 20;
-        if ( mRequest.getParameter("count") != null )
-        {
-            count= Utilities.stringToInt(mRequest.getParameter("count"));
-            if ( count==0 || count>50 )
-            {
-                count = 20;
-            } 
-        } 
-        return count; 
-    }         
-            
-    //------------------------------------------------------------------------
+                
+    //--------------------------------------------------- Date specified by request
     
     /**
      * Gets the date specified by the request, or null.
@@ -547,7 +474,6 @@
         return getDate(false);
     }
     
-    //------------------------------------------------------------------------
     /**
      * Gets the date specified by the request
      * @param orToday If no date specified, then use today's date.
@@ -584,7 +510,6 @@
         return todayCal.getTime(); 
     }
 
-    //------------------------------------------------------------------------
     /**
      * Gets the YYYYMMDD date string specified by the request, or null.
      * @return String
@@ -594,7 +519,6 @@
         return getDateString(false);
     }
 
-    //------------------------------------------------------------------------
     /**
      * Gets the date specified by the request
      * @param orToday If no date specified, then use today's date.
@@ -642,6 +566,21 @@
         return mPageLink;
     }
 
+    public int getWeblogEntryCount()
+    {
+        // Get count of entries to return, or 20 if null
+        int count = 20;
+        if ( mRequest.getParameter("count") != null )
+        {
+            count= Utilities.stringToInt(mRequest.getParameter("count"));
+            if ( count==0 || count>50 )
+            {
+                count = 20;
+            } 
+        } 
+        return count; 
+    }         
+            
     //------------------------------------------------------------------------
     /**
      * Gets the BookmarkData specified by the request, or null.
@@ -789,18 +728,10 @@
     }
     
     /**
-     * Gets the UserData specified by the request, or null.
-     * @return UserData
-     */
-    public UserData getUser()
-    {
-        if (mWebsite != null) return mWebsite.getUser();
-        return null;
-    }
-
-    /**
-     * Gets the WebsiteData specified by the request, or null.
-     * @return WeblogCategory
+     * Gets the WebsiteData specified in the path info of the request URI, this is 
+     * NOT the same thing as the "current website" (i.e. the one that the session's 
+     * authenticated user is currently editing).
+     * @return WebsiteData object specified by request URI.
      */
     public WebsiteData getWebsite()
     {
@@ -810,7 +741,7 @@
     {
         mWebsite = wd;
     }
-
+    
     /**
      * Gets the WeblogEntryData specified by the request, or null.
      * 
@@ -858,7 +789,6 @@
             catch (RollerException e)
             {
                 mLogger.error("EXCEPTION getting weblog entry",e);
-                mLogger.error("user=" + mWebsite.getUser());
                 mLogger.error("anchor=" + anchor);
                 mLogger.error("entryid=" + entryid);
             }
@@ -866,7 +796,7 @@
         return mWeblogEntry;
     }
 
-    //------------------------------------------------------------------------
+    //-----------------------------------------------------------------------------
 
     /** Get attribute from mRequest, and if that fails try session */
     private String getFromRequest( String key )
@@ -883,8 +813,6 @@
         return ret;
     }
 
-    //------------------------------------------------------------------------
-
     private Date parseDate( String dateString )
     {
         Date ret = null;        
@@ -905,27 +833,57 @@
         return ret;
     }
     
-    //------------------------------------------------------------------------
+    /** 
+     * @see org.roller.pojos.ParsedRequest#isLinkbackEnabled()
+     */
+    public boolean isEnableLinkback()
+    {
+        return RollerRuntimeConfig.getBooleanProperty("site.linkbacks.enabled");
+    }
 
-    public String toString()
+    //-------------------------------------------- Authentication and authorization
+    
+    /**
+     * Get the current website from the Roller session, or null if none exists.
+     */
+    public WebsiteData getCurrentWebsite()
     {
-        StringBuffer sb = new StringBuffer();
-        sb.append("[");
-        sb.append(getRequestURL());
-        sb.append(", ");
-        sb.append(getRefererURL());
-        sb.append("]");
-        return sb.toString();
+        RollerSession rollerSession = RollerSession.getRollerSession(mRequest);
+        if (rollerSession != null) return rollerSession.getCurrentWebsite();
+        return null;
     }
 
-    //------------------------------------------------------------------------
+    /**
+     * Gets the UserData specified by the request, or null if none exists.
+     * @return UserData
+     */
+    public UserData getAuthenticatedUser()
+    {
+        RollerSession rollerSession = RollerSession.getRollerSession(mRequest);
+        if (rollerSession != null) return rollerSession.getAuthenticatedUser();
+        return null;
+    }
 
     /** 
-     * @see org.roller.pojos.ParsedRequest#isLinkbackEnabled()
+     * Does user have the admin role (aka global superuser)
      */
-    public boolean isEnableLinkback()
+    public boolean isAdminUser() throws RollerException
     {
-        return RollerRuntimeConfig.getBooleanProperty("site.linkbacks.enabled");
+        UserData user = getAuthenticatedUser();
+        if (user != null && user.hasRole("admin")) return true;
+        return false;
+    }
+
+    /** 
+     * Is user authorized to edit objects in the current website. 
+     */
+    public boolean isUserAuthorizedToEdit() throws RollerException
+    {
+        RollerSession rollerSession = RollerSession.getRollerSession(mRequest);
+        UserData user = rollerSession.getAuthenticatedUser();
+        WebsiteData website = rollerSession.getCurrentWebsite();
+        return website.hasUserPermissions(user, 
+                (short)(PermissionsData.AUTHOR | PermissionsData.ADMIN));
     }
 }
 

Modified: incubator/roller/branches/roller_2.0/src/org/roller/presentation/RollerSession.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_2.0/src/org/roller/presentation/RollerSession.java?rev=201564&r1=201563&r2=201564&view=diff
==============================================================================
--- incubator/roller/branches/roller_2.0/src/org/roller/presentation/RollerSession.java (original)
+++ incubator/roller/branches/roller_2.0/src/org/roller/presentation/RollerSession.java Thu Jun 23 21:31:43 2005
@@ -1,15 +1,22 @@
 package org.roller.presentation;
 
-import org.apache.commons.collections.ArrayStack;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import java.io.Serializable;
+import java.security.Principal;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 import javax.servlet.http.HttpSessionActivationListener;
 import javax.servlet.http.HttpSessionEvent;
 import javax.servlet.http.HttpSessionListener;
-import java.io.Serializable;
+
+import org.apache.commons.collections.ArrayStack;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.roller.RollerException;
+import org.roller.model.RollerFactory;
+import org.roller.model.UserManager;
+import org.roller.pojos.UserData;
+import org.roller.pojos.WebsiteData;
 
 
 //////////////////////////////////////////////////////////////////////////////
@@ -20,10 +27,11 @@
 public class RollerSession
     implements HttpSessionListener, HttpSessionActivationListener, Serializable
 {
-    // Although we have no actual members, we implement Serializable to meet expectations of
-    // session attributes for some container configurations.
     static final long serialVersionUID = 5890132909166913727L;
 
+    private UserData authenticatedUser = null;
+    private WebsiteData currentWebsite = null;
+    
     private static Log mLogger =
         LogFactory.getFactory().getInstance(RollerSession.class);
 
@@ -32,16 +40,43 @@
     public static final String ERROR_MESSAGE   = "rollererror_message";
     public static final String STATUS_MESSAGE  = "rollerstatus_message";
 
-
+    /** 
+     * Get RollerSession from request (and add user if not already present).
+     */
+    public static RollerSession getRollerSession(HttpServletRequest request)
+    {
+        RollerSession rollerSession = null;
+        HttpSession session = request.getSession(false);
+        if (session != null) 
+        {
+            rollerSession = (RollerSession)session.getAttribute(ROLLER_SESSION);
+            Principal principal = request.getUserPrincipal();
+            if (rollerSession.getAuthenticatedUser() == null && principal != null)
+            {
+                try 
+                {
+                    UserManager umgr = RollerFactory.getRoller().getUserManager();
+                    UserData user = umgr.getUser(principal.getName());
+                    rollerSession.setAuthenticatedUser(user);
+                }
+                catch (RollerException e)
+                {
+                    mLogger.error("ERROR: getting user object");
+                }
+            }
+        }
+        return rollerSession;
+    }
+    
     //------------------------------------------------------------------------
     /** Create session's Roller instance */
     public void sessionCreated(HttpSessionEvent se)
     {
         // put this in session, so that we get HttpSessionActivationListener callbacks
-        se.getSession().setAttribute( ROLLER_SESSION, this );
+        se.getSession().setAttribute(ROLLER_SESSION, this);
         
         RollerContext rctx = RollerContext.getRollerContext(
-            se.getSession().getServletContext());
+            se.getSession().getServletContext());       
         rctx.sessionCreated(se);           
     }    
 
@@ -141,6 +176,35 @@
                 mLogger.debug("EXCEPTION PURGING session attributes",e);
             }
         }
+    }
+    
+    /**
+     * Authenticated user associated with this session.
+     */
+    public UserData getAuthenticatedUser()
+    {
+        return authenticatedUser;
+    }
+    /**
+     * Authenticated user associated with this session.
+     */
+    public void setAuthenticatedUser(UserData authenticatedUser)
+    {
+        this.authenticatedUser = authenticatedUser;
+    }
+    /**
+     * Current website that user is working with.
+     */
+    public WebsiteData getCurrentWebsite()
+    {
+        return currentWebsite;
+    }
+    /**
+     * Current website that user is working with.
+     */
+    public void setCurrentWebsite(WebsiteData currentWebsite)
+    {
+        this.currentWebsite = currentWebsite;
     }
 }
 

Modified: incubator/roller/branches/roller_2.0/src/org/roller/presentation/atomapi/RollerAtomHandler.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_2.0/src/org/roller/presentation/atomapi/RollerAtomHandler.java?rev=201564&r1=201563&r2=201564&view=diff
==============================================================================
--- incubator/roller/branches/roller_2.0/src/org/roller/presentation/atomapi/RollerAtomHandler.java (original)
+++ incubator/roller/branches/roller_2.0/src/org/roller/presentation/atomapi/RollerAtomHandler.java Thu Jun 23 21:31:43 2005
@@ -109,7 +109,6 @@
         
         // TODO: decide what to do about authentication, is WSSE going to fly?
         mUsername = authenticateWSSE(request);
-        //mUsername = authenticateBASIC(request);  
  
         if (mUsername != null) 
         {
@@ -235,9 +234,9 @@
             String[] pathInfo, Date start, Date end, int offset) 
         throws Exception
     {
-        String username = pathInfo[0];
+        String handle = pathInfo[0];
         String absUrl = mRollerContext.getAbsoluteContextUrl(mRequest);
-        WebsiteData website = mRoller.getUserManager().getWebsite(username);
+        WebsiteData website = mRoller.getUserManager().getWebsiteByHandle(handle);
         List entries = null;
         if (canView(website)) 
         {
@@ -295,7 +294,7 @@
                 member.setTitle(rollerEntry.getDisplayTitle());
                 member.setUpdated(rollerEntry.getUpdateTime());
                 member.setHref(absUrl 
-                    + "/atom/" + username + "/entry/" + rollerEntry.getId());
+                    + "/atom/" + handle + "/entry/" + rollerEntry.getId());
                 col.addMember(member);
             }
             return col;
@@ -309,9 +308,9 @@
     public AtomCollection getCollectionOfResources(
             String[] pathInfo, Date start, Date end, int offset) throws Exception
     {
-        String username = pathInfo[0];
+        String handle = pathInfo[0];
         String absUrl = mRollerContext.getAbsoluteContextUrl(mRequest);
-        WebsiteData website = mRoller.getUserManager().getWebsite(username);
+        WebsiteData website = mRoller.getUserManager().getWebsiteByHandle(handle);
         FileManager fmgr = mRoller.getFileManager();
         File[] files = fmgr.getFiles(website);
         if (canView(website)) 
@@ -323,7 +322,7 @@
                 member.setTitle(files[i].getName());
                 member.setUpdated(new Date(files[i].lastModified()));
                 member.setHref(absUrl 
-                    + "/atom/" + username + "/resource/" + files[i].getName() );
+                    + "/atom/" + website.getHandle() + "/resource/" + files[i].getName() );
                 col.addMember(member);
             }
             return col;
@@ -337,9 +336,9 @@
     public AtomCollection getCollectionOfCategories(
             String[] pathInfo, Date start, Date end, int offset) throws Exception
     {
-        String username = pathInfo[0];
+        String handle = pathInfo[0];
         String absUrl = mRollerContext.getAbsoluteContextUrl(mRequest);
-        WebsiteData website = mRoller.getUserManager().getWebsite(username);
+        WebsiteData website = mRoller.getUserManager().getWebsiteByHandle(handle);
         WeblogManager wmgr = mRoller.getWeblogManager();
         List items = wmgr.getWeblogCategories(website);
         if (canView(website)) 
@@ -354,7 +353,7 @@
                 member.setTitle(item.getPath());
                 member.setUpdated(now);
                 member.setHref(
-                    absUrl + "/atom/" + username + "/category/" + item.getId());
+                    absUrl + "/atom/" + website.getHandle() + "/category/" + item.getId());
                 col.addMember(member);
             }
             return col;
@@ -370,8 +369,8 @@
     public Entry postEntry(String[] pathInfo, Entry entry) throws Exception
     {
         // authenticated client posted a weblog entry
-        String username = pathInfo[0];
-        WebsiteData website = mRoller.getUserManager().getWebsite(username);
+        String handle = pathInfo[0];
+        WebsiteData website = mRoller.getUserManager().getWebsiteByHandle(handle);
         if (canEdit(website))
         {            
             // Save it and commit it
@@ -470,8 +469,8 @@
             throws Exception
     {
         // authenticated client posted a weblog entry
-        String username = pathInfo[0];
-        WebsiteData website = mRoller.getUserManager().getWebsite(username);
+        String handle = pathInfo[0];
+        WebsiteData website = mRoller.getUserManager().getWebsiteByHandle(handle);
         if (canEdit(website) && pathInfo.length > 1)
         {
             try
@@ -501,7 +500,7 @@
                     // TODO: build URL to uploaded file should be done in FileManager
                     String uploadPath = RollerContext.getUploadPath(
                         mRequest.getSession(true).getServletContext());
-                    uploadPath += "/" + website.getUser().getUserName() + "/" + name;
+                    uploadPath += "/" + website.getHandle() + "/" + name;
                     return RequestUtils.printableURL(
                         RequestUtils.absoluteURL(mRequest, uploadPath));                    
                 }
@@ -551,8 +550,8 @@
     public void deleteResource(String[] pathInfo) throws Exception
     {
         // authenticated client posted a weblog entry
-        String username = pathInfo[0];
-        WebsiteData website = mRoller.getUserManager().getWebsite(username);
+        String handle = pathInfo[0];
+        WebsiteData website = mRoller.getUserManager().getWebsiteByHandle(handle);
         if (canEdit(website) && pathInfo.length > 1)
         {
             try
@@ -653,7 +652,15 @@
      */
     private boolean canEdit(WeblogEntryData entry)
     {
-        return entry.getWebsite().getUser().getUserName().equals(mUsername);
+        try 
+        {
+            return entry.canSave();
+        }
+        catch (Exception e)
+        {
+            mLogger.error("ERROR: checking website.canSave()");
+        }
+        return false;
     }
     
     /**
@@ -661,7 +668,15 @@
      */
     private boolean canEdit(WebsiteData website)
     {
-        return website.getUser().getUserName().equals(mUsername);
+        try 
+        {
+            return website.canSave();
+        }
+        catch (Exception e)
+        {
+            mLogger.error("ERROR: checking website.canSave()");
+        }
+        return false;
     }
     
     /**

Modified: incubator/roller/branches/roller_2.0/src/org/roller/presentation/filters/IfModifiedFilter.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_2.0/src/org/roller/presentation/filters/IfModifiedFilter.java?rev=201564&r1=201563&r2=201564&view=diff
==============================================================================
--- incubator/roller/branches/roller_2.0/src/org/roller/presentation/filters/IfModifiedFilter.java (original)
+++ incubator/roller/branches/roller_2.0/src/org/roller/presentation/filters/IfModifiedFilter.java Thu Jun 23 21:31:43 2005
@@ -3,17 +3,6 @@
  */
 package org.roller.presentation.filters;
 
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.roller.RollerException;
-import org.roller.model.Roller;
-import org.roller.model.WeblogManager;
-import org.roller.pojos.UserData;
-import org.roller.presentation.RollerContext;
-import org.roller.presentation.RollerRequest;
-import org.roller.util.LRUCache2;
-
 import java.io.IOException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
@@ -26,7 +15,19 @@
 import javax.servlet.ServletResponse;
 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.roller.RollerException;
 import org.roller.config.RollerConfig;
+import org.roller.model.Roller;
+import org.roller.model.UserManager;
+import org.roller.model.WeblogManager;
+import org.roller.pojos.WebsiteData;
+import org.roller.presentation.RollerContext;
+import org.roller.presentation.RollerRequest;
+import org.roller.util.LRUCache2;
 
 /**
  * Entry point filter for Newsfeed Servlets, this filter 
@@ -172,14 +173,14 @@
     public static Date getLastPublishedDate(HttpServletRequest request)
         throws RollerException
     {
-        // Get user name without using heavy RollerRequest URL parser
-        String userName = null;
+        // Get website handle without using heavy RollerRequest URL parser
+        String handle = null;
         String pathInfo = request.getPathInfo();
         pathInfo = pathInfo != null ? pathInfo : "";
         String[] pathInfoArray = StringUtils.split(pathInfo, "/");
         if (pathInfoArray.length == 1)
         {
-            userName = pathInfoArray[0];
+            handle = pathInfoArray[0];
         }
         else if (pathInfoArray.length > 1) 
         {
@@ -194,7 +195,7 @@
         // update times are cached to reduce database queries per request
         StringBuffer sb = new StringBuffer();
             sb.append("zzz_");
-        sb.append(userName);
+        sb.append(handle);
             sb.append("_zzz_");
         sb.append(catname);
         String key = sb.toString();
@@ -204,19 +205,22 @@
         {
             mLogger.debug("Hitting database for update time: "+key);
             Roller roller = RollerContext.getRoller(request);
+            UserManager umgr = roller.getUserManager();
             WeblogManager wmgr = roller.getWeblogManager();
-            updateTime = wmgr.getWeblogLastPublishTime(userName, catname);  
+            
+            updateTime = wmgr.getWeblogLastPublishTime(
+                    umgr.getWebsiteByHandle(handle), catname);  
             getCache().put(key, updateTime);
         }
         return updateTime;
     }
     
-    public static void purgeDateCache(UserData user) 
+    public static void purgeDateCache(WebsiteData website) 
     {
-        String userName = (user != null) ? user.getUserName() : null;
+        String handle = (website != null) ? website.getHandle() : null;
         StringBuffer sb = new StringBuffer();
         sb.append("zzz_");
-        sb.append(userName);
+        sb.append(handle);
         sb.append("_zzz_");
         getCache().purge(new String[] {sb.toString()});
     }

Modified: incubator/roller/branches/roller_2.0/src/org/roller/presentation/filters/RefererFilter.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_2.0/src/org/roller/presentation/filters/RefererFilter.java?rev=201564&r1=201563&r2=201564&view=diff
==============================================================================
--- incubator/roller/branches/roller_2.0/src/org/roller/presentation/filters/RefererFilter.java (original)
+++ incubator/roller/branches/roller_2.0/src/org/roller/presentation/filters/RefererFilter.java Thu Jun 23 21:31:43 2005
@@ -55,13 +55,13 @@
             RollerContext rctx = RollerContext.getRollerContext(
                 mFilterConfig.getServletContext());
             
-            if ( rreq.getUser() != null )
+            if ( rreq.getWebsite() != null )
             {
-                String userName = rreq.getUser().getUserName();                
+                String handle = rreq.getWebsite().getHandle();                
                 
                 // Base page URLs, with and without www.
                 String basePageUrlWWW = 
-                    rctx.getAbsoluteContextUrl(request)+"/page/"+userName;                        
+                    rctx.getAbsoluteContextUrl(request)+"/page/"+handle;                        
                 String basePageUrl = basePageUrlWWW;          
                 if ( basePageUrlWWW.startsWith("http://www.") )
                 {
@@ -71,7 +71,7 @@
                                  
                 // Base comment URLs, with and without www.  
                 String baseCommentsUrlWWW = 
-                    rctx.getAbsoluteContextUrl(request)+"/comments/"+userName;   
+                    rctx.getAbsoluteContextUrl(request)+"/comments/"+handle;   
                 String baseCommentsUrl = baseCommentsUrlWWW;          
                 if ( baseCommentsUrlWWW.startsWith("http://www.") )
                 {

Modified: incubator/roller/branches/roller_2.0/src/org/roller/presentation/pagecache/FilterHandler.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_2.0/src/org/roller/presentation/pagecache/FilterHandler.java?rev=201564&r1=201563&r2=201564&view=diff
==============================================================================
--- incubator/roller/branches/roller_2.0/src/org/roller/presentation/pagecache/FilterHandler.java (original)
+++ incubator/roller/branches/roller_2.0/src/org/roller/presentation/pagecache/FilterHandler.java Thu Jun 23 21:31:43 2005
@@ -1,7 +1,5 @@
 package org.roller.presentation.pagecache;
 
-import org.roller.pojos.UserData;
-
 import java.io.IOException;
 
 import javax.servlet.FilterChain;
@@ -10,6 +8,8 @@
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 
+import org.roller.pojos.WebsiteData;
+
 public interface FilterHandler
 {
     /**
@@ -33,5 +33,5 @@
      * Remove the entries for this User
      * from the cache.
      */
-    public void removeFromCache(HttpServletRequest req,UserData user);
+    public void removeFromCache(HttpServletRequest req, WebsiteData website);
 }

Modified: incubator/roller/branches/roller_2.0/src/org/roller/presentation/pagecache/PageCacheFilter.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_2.0/src/org/roller/presentation/pagecache/PageCacheFilter.java?rev=201564&r1=201563&r2=201564&view=diff
==============================================================================
--- incubator/roller/branches/roller_2.0/src/org/roller/presentation/pagecache/PageCacheFilter.java (original)
+++ incubator/roller/branches/roller_2.0/src/org/roller/presentation/pagecache/PageCacheFilter.java Thu Jun 23 21:31:43 2005
@@ -14,7 +14,7 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.roller.pojos.UserData;
+import org.roller.pojos.WebsiteData;
 import org.roller.presentation.filters.IfModifiedFilter;
 import org.roller.presentation.pagecache.rollercache.LRUCacheHandler2;
 
@@ -99,14 +99,14 @@
 
     //-----------------------------------------------------------------------
     /** Remove from cache for all handlers of this class */
-    public static void removeFromCache(HttpServletRequest req, UserData user)
+    public static void removeFromCache(HttpServletRequest req, WebsiteData website)
     {
         Iterator iter = mHandlers.iterator();
         while (iter.hasNext())
         {
             FilterHandler handler = (FilterHandler)iter.next();
-            handler.removeFromCache(req, user);
+            handler.removeFromCache(req, website);
         }       
-        IfModifiedFilter.purgeDateCache(user);
+        IfModifiedFilter.purgeDateCache(website);
     }
 }

Modified: incubator/roller/branches/roller_2.0/src/org/roller/presentation/pagecache/rollercache/LRUCacheHandler.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_2.0/src/org/roller/presentation/pagecache/rollercache/LRUCacheHandler.java?rev=201564&r1=201563&r2=201564&view=diff
==============================================================================
--- incubator/roller/branches/roller_2.0/src/org/roller/presentation/pagecache/rollercache/LRUCacheHandler.java (original)
+++ incubator/roller/branches/roller_2.0/src/org/roller/presentation/pagecache/rollercache/LRUCacheHandler.java Thu Jun 23 21:31:43 2005
@@ -2,13 +2,6 @@
  * Created on Jun 15, 2004
  */
 package org.roller.presentation.pagecache.rollercache;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.roller.pojos.UserData;
-import org.roller.presentation.LanguageUtil;
-import org.roller.presentation.pagecache.FilterHandler;
-import org.roller.util.LRUCache;
-
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -28,7 +21,14 @@
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.roller.config.RollerConfig;
+import org.roller.pojos.WebsiteData;
+import org.roller.presentation.LanguageUtil;
+import org.roller.presentation.pagecache.FilterHandler;
+import org.roller.util.LRUCache;
 
 /**
  * Page cache implementation that uses a simple LRUCache. Can be configured 
@@ -260,11 +260,12 @@
     /**
      * Purge user's entries from cache.
      */
-    public synchronized void removeFromCache(HttpServletRequest req, UserData user)
+    public synchronized void removeFromCache(
+            HttpServletRequest req, WebsiteData website)
     {
         // TODO: can we make this a little more precise, perhaps via regex?
-        String rssString = "/rss/" + user.getUserName(); // user's pages
-        String pageString = "/page/" + user.getUserName(); // user's RSS feeds
+        String rssString = "/rss/" + website.getHandle(); // user's pages
+        String pageString = "/page/" + website.getHandle(); // user's RSS feeds
         String mainRssString = "/rss_"; // main RSS feed
         List purgeList = new ArrayList();
         
@@ -273,7 +274,8 @@
         {
             String key = (String) keys.next();
             
-            if (key.indexOf(rssString)!=-1 || key.indexOf(pageString)!=-1 || key.indexOf(mainRssString)!=-1) 
+            if (key.indexOf(rssString)!=-1 
+                    || key.indexOf(pageString)!=-1 || key.indexOf(mainRssString)!=-1) 
             {
                 purgeList.add(key);
             }
@@ -291,8 +293,8 @@
             StringBuffer sb = new StringBuffer();
             sb.append("Purged, count=");
             sb.append(purgeList.size());
-            sb.append(", user=");
-            sb.append(user.getUserName());
+            sb.append(", website=");
+            sb.append(website.getHandle());
             mLogger.debug(sb.toString());
         }        
     }

Modified: incubator/roller/branches/roller_2.0/src/org/roller/presentation/pagecache/rollercache/LRUCacheHandler2.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_2.0/src/org/roller/presentation/pagecache/rollercache/LRUCacheHandler2.java?rev=201564&r1=201563&r2=201564&view=diff
==============================================================================
--- incubator/roller/branches/roller_2.0/src/org/roller/presentation/pagecache/rollercache/LRUCacheHandler2.java (original)
+++ incubator/roller/branches/roller_2.0/src/org/roller/presentation/pagecache/rollercache/LRUCacheHandler2.java Thu Jun 23 21:31:43 2005
@@ -20,7 +20,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.roller.config.RollerConfig;
-import org.roller.pojos.UserData;
+import org.roller.pojos.WebsiteData;
 import org.roller.presentation.LanguageUtil;
 import org.roller.presentation.pagecache.FilterHandler;
 import org.roller.util.LRUCache2;
@@ -220,11 +220,12 @@
     /**
      * Purge user's entries from cache.
      */
-    public synchronized void removeFromCache(HttpServletRequest req, UserData user)
+    public synchronized void removeFromCache(
+            HttpServletRequest req, WebsiteData website)
     {
         // TODO: can we make this a little more precise, perhaps via regex?
-        String rssString = "/rss/" + user.getUserName(); // user's pages
-        String pageString = "/page/" + user.getUserName(); // user's RSS feeds
+        String rssString = "/rss/" + website.getHandle(); // user's pages
+        String pageString = "/page/" + website.getHandle(); // user's RSS feeds
         String mainRssString = "/rss_"; // main RSS feed
         String mainPageString = "/main.do"; // main page
         String planetPageString = "/planet.do"; // planet page
@@ -245,8 +246,8 @@
             StringBuffer sb = new StringBuffer();
             sb.append("Purged, count=");
             sb.append(beforeSize - afterSize);
-            sb.append(", user=");
-            sb.append(user.getUserName());
+            sb.append(", website=");
+            sb.append(website.getHandle());
             mLogger.debug(sb.toString());
         }        
     }

Modified: incubator/roller/branches/roller_2.0/src/org/roller/presentation/pings/WeblogUpdatePinger.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_2.0/src/org/roller/presentation/pings/WeblogUpdatePinger.java?rev=201564&r1=201563&r2=201564&view=diff
==============================================================================
--- incubator/roller/branches/roller_2.0/src/org/roller/presentation/pings/WeblogUpdatePinger.java (original)
+++ incubator/roller/branches/roller_2.0/src/org/roller/presentation/pings/WeblogUpdatePinger.java Thu Jun 23 21:31:43 2005
@@ -98,7 +98,7 @@
     {
         // Figure out the url of the user's website.
         String websiteUrl =
-            RollerFactory.getRoller().getWeblogManager().getUrl(website.getUser(), absoluteContextUrl);
+            RollerFactory.getRoller().getWeblogManager().getUrl(website, absoluteContextUrl);
 
         // Set up the ping parameters.
         Vector params = new Vector();

Modified: incubator/roller/branches/roller_2.0/src/org/roller/presentation/planet/SyncWebsitesTask.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_2.0/src/org/roller/presentation/planet/SyncWebsitesTask.java?rev=201564&r1=201563&r2=201564&view=diff
==============================================================================
--- incubator/roller/branches/roller_2.0/src/org/roller/presentation/planet/SyncWebsitesTask.java (original)
+++ incubator/roller/branches/roller_2.0/src/org/roller/presentation/planet/SyncWebsitesTask.java Thu Jun 23 21:31:43 2005
@@ -85,27 +85,26 @@
                 {
                     String baseFeedURL = baseURL + "/rss/";
                     String baseSiteURL = baseURL + "/page/";
-                    Iterator users = roller.getUserManager().getUsers().iterator();
-                    while (users.hasNext())
+                    Iterator websites = 
+                        roller.getUserManager().getWebsites(null, null).iterator();
+                    while (websites.hasNext())
                     {
-                        UserData user = (UserData) users.next();
+                        WebsiteData website = (WebsiteData)websites.next();
                         
                         StringBuffer sitesb = new StringBuffer();
                         sitesb.append(baseSiteURL);
-                        sitesb.append(user.getUserName());
+                        sitesb.append(website.getHandle());
                         String siteUrl = sitesb.toString();
                         
                         StringBuffer feedsb = new StringBuffer();
                         feedsb.append(baseFeedURL);
-                        feedsb.append(user.getUserName());
+                        feedsb.append(website.getHandle());
                         String feedUrl = feedsb.toString();
                         
                         liveUserFeeds.add(feedUrl);
                         
                         PlanetSubscriptionData sub = 
                                 planet.getSubscription(feedUrl);
-                        WebsiteData website = 
-                                userManager.getWebsite(user.getUserName());
                         if (sub == null)
                         {
                             logger.info("ADDING feed: "+feedUrl);
@@ -113,14 +112,12 @@
                             sub.setTitle(website.getName());
                             sub.setFeedUrl(feedUrl);
                             sub.setSiteUrl(siteUrl);
-                            sub.setAuthor(user.getUserName());
                             planet.saveSubscription(sub);
                             group.addSubscription(sub);
                         }
                         else
                         {
                             sub.setTitle(website.getName());
-                            sub.setAuthor(user.getUserName());
                             planet.saveSubscription(sub);
                         }
                     }

Modified: incubator/roller/branches/roller_2.0/src/org/roller/presentation/tags/menu/RollerMenuModel.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_2.0/src/org/roller/presentation/tags/menu/RollerMenuModel.java?rev=201564&r1=201563&r2=201564&view=diff
==============================================================================
--- incubator/roller/branches/roller_2.0/src/org/roller/presentation/tags/menu/RollerMenuModel.java (original)
+++ incubator/roller/branches/roller_2.0/src/org/roller/presentation/tags/menu/RollerMenuModel.java Thu Jun 23 21:31:43 2005
@@ -165,7 +165,7 @@
 		RollerRequest rreq = RollerRequest.getRollerRequest(req);
 		try
 		{
-			UserData user = rreq.getUser();
+			UserData user = rreq.getAuthenticatedUser();
 			String fid = 
                 rreq.getFolder()==null ? null : rreq.getFolder().getId();
 			if ( user != null ) 

Modified: incubator/roller/branches/roller_2.0/src/org/roller/presentation/velocity/BasePageServlet.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_2.0/src/org/roller/presentation/velocity/BasePageServlet.java?rev=201564&r1=201563&r2=201564&view=diff
==============================================================================
--- incubator/roller/branches/roller_2.0/src/org/roller/presentation/velocity/BasePageServlet.java (original)
+++ incubator/roller/branches/roller_2.0/src/org/roller/presentation/velocity/BasePageServlet.java Thu Jun 23 21:31:43 2005
@@ -1 +1 @@
-package org.roller.presentation.velocity;

import java.io.IOException;
import java.io.StringWriter;
import java.util.Map;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspFactory;
import javax.servlet.jsp.PageContext;

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.context.Context;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.servlet.VelocityServlet;
import org.roller.RollerException;
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;

/**
 * Base Servlet for Servlets that render user page templates. Loads the
 * Velocity context using the ContextLoader and runs the page template
 * selected by the request.
 *
 * @author llavandowska
 * @author David M Johnson
 */
public abstract class BasePageServlet extends VelocityServlet
{
    private static Log mLogger =
        LogFactory.getFactory().getInstance(BasePageServlet.class);
	/**
	 *  <p>Sets servletContext for WebappResourceLoader.</p>
	 *
	 * @param config servlet configuation
	 */
	public void init( ServletConfig config )
		throws ServletException
	{
		super.init( config );
		WebappResourceLoader.setServletContext( getServletContext() );
	}
    public Template handleRequest( HttpServletRequest request,
                                   HttpServletResponse response,
                                   Context ctx ) throws Exception
    {
        String pid = null;
        Template outty = null;
        Exception pageException = null;
        
        try
        {
            PageContext pageContext =
                JspFactory.getDefaultFactory().getPageContext(
                    this, request, response,"", true, 8192, true);
            // Needed to init request attributes, etc.
            RollerRequest rreq = RollerRequest.getRollerRequest(pageContext);
            UserManager userMgr = rreq.getRoller().getUserManager();
            
            WebsiteData wd = null;
            if (request.getAttribute(RollerRequest.OWNING_USER) != null) {
                UserData user = (UserData)
                    request.getAttribute(RollerRequest.OWNING_USER);
                wd = userMgr.getWebsite(user.getUserName());
            }
            else
            {
                wd = rreq.getWebsite();
            }
            
            // If request specified the page, then go with that
            PageData pd = null;
            if (rreq.getPage() != null // RollerRequest does too much guess work
                    && request.getAttribute(RollerRequest.OWNING_USER) == null)
            {
                pd = rreq.getPage();
                pid = pd.getId();
            }
            // If page not available from request, then use website's default
            else if (wd != null)
            {
                pd = userMgr.retrievePage(wd.getDefaultPageId());
                pid = pd.getId();
                rreq.setPage(pd); 
            }
            // Still no page ID, then we have a problem
            if ( pid == null )
            {
                throw new ResourceNotFoundException("Page not found");
            }
            
            outty = prepareForPageExecution(ctx, rreq, response, pd);
        }
        catch( Exception e )
        {
	        pageException = e;
            response.setStatus( HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        }
        if (pageException != null)
        {
            mLogger.error("EXCEPTION: in RollerServlet", pageException);
            request.setAttribute("DisplayException", pageException);
        }
        return outty;
    }

    //------------------------------------------------------------------------
    /**
     * Try to load user-specified Decorator (if specified).  Failing that
     * see if user has a _decorator Page, if not check for a _decorator
     * in the Preview resource loader.  Finally, if none of those can
     * be found fall back to the no-op decorator.
     * @param object
     * @return
     */
    private Template findDecorator(String decoratorName, UserManager userMgr, WebsiteData wd) 
        throws ResourceNotFoundException, ParseErrorException, RollerException, Exception
    {
        Template decorator = null;
        PageData decoratorPage = null;
        String decoratorId = null;
        
        // check for user-specified decorator
        if (decoratorName != null)
        {    
            decoratorPage = userMgr.getPageByName(wd, decoratorName);
            if (decoratorPage != null) 
            {
                decoratorId = decoratorPage.getId();
            }
        }
        
        // if no user-specified decorator try default page-name
        if (decoratorPage == null)
        {
            decoratorPage = userMgr.getPageByName(wd, "_decorator");
            if (decoratorPage != null) 
            {
                decoratorId = decoratorPage.getId();
            }
            else
            {
                // could be in PreviewResourceLoader
                decoratorId = "_decorator";
            }
        }

        // try loading Template
        if (decoratorId != null) 
        {
            try
            {
                decorator = getTemplate(decoratorId, "UTF-8");
            }
            catch (Exception e)
            {
                // it may not exist, so this is okay
            }
        }
        
        // couldn't find Template, load default "no-op" decorator
        if (decorator == null) 
        {
            decorator = getTemplate("/themes/noop_decorator.vm", "UTF-8");
        }
        return decorator;
    }

    /** 
     * Prepare for page execution be setting content type, populating context,
     * and processing the page decorator if needed.
     */
    protected Template prepareForPageExecution(Context ctx, RollerRequest rreq, 
        HttpServletResponse response, PageData pd) throws Exception
    {                    
        Template outty = null;
        UserManager userMgr = rreq.getRoller().getUserManager();
        WebsiteData wd = pd.getWebsite();
        
        // if page has an extension - use that to set the contentType
        String pageLink = pd.getLink();
        String mimeType = getServletConfig().getServletContext().getMimeType(pageLink);
        if(mimeType != null) {
            // we found a match ... set the content type
            response.setContentType(mimeType);
        }
        
        /* old way ... not as flexible -- Allen G
        int period = pd.getLink().indexOf('.');
        if (period > -1) 
        {
            String extension = pd.getLink().substring(period+1);
            if ("js".equals(extension)) 
            {
                extension = "javascript";
            }
            response.setContentType("text/" + extension);
        }
        */
    
        // Made it this far, populate the Context
        ContextLoader.setupContext( ctx, rreq, response );

        // Get the page
        outty =  getTemplate( pd.getId(), "UTF-8" );

        /**
         * User can define a Decorator Template.
         */
        if (wd != null)
        {
            // parse/merge Page template
            StringWriter sw = new StringWriter();
            outty.merge(ctx, sw);
            ctx.put("decorator_body", sw.toString());

            // replace outty with decorator Template
            outty = findDecorator((String)ctx.get("decorator"), userMgr, wd);                
        }
        return outty;
    }
    
    //------------------------------------------------------------------------
    /**
     * Handle error in Velocity processing.
     */
    protected void error( HttpServletRequest req, HttpServletResponse res,
        Exception e) throws ServletException, IOException
    {
        mLogger.warn("ERROR in VelocityServlet",e);
    }
   
    /** 
     * Override to prevent Velocity from putting "req" and "res" into the context.
     * Allowing users access to the underlying Servlet objects is a security risk.
     * If need access to request parameters, use $requestParameters.
     */
    protected Context createContext(
            HttpServletRequest req,
            HttpServletResponse res) {
        
        VelocityContext context = new VelocityContext();
        context.put(REQUEST, new RequestWrapper(req.getParameterMap()));
        return context;
        
    }
    
    /** Provide access to request params only, not actual request */
    public static class RequestWrapper
    {
        Map params = null;
        public RequestWrapper(Map params) 
        {
            this.params = params;
        }
        public String getParameter(String key)
        {
            String ret = null;
            String[] array = (String[])params.get(key);
            if (array != null && array.length > 0)
            {
                ret = array[0];
            }
            return ret;
        }
    }
}
\ No newline at end of file
+package org.roller.presentation.velocity;

import java.io.IOException;
import java.io.StringWriter;
import java.util.Map;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspFactory;
import javax.servlet.jsp.PageContext;

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.context.Context;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.servlet.VelocityServlet;
import org.roller.RollerException;
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;

/**
 * Base Servlet for Servlets that render user page templates. Loads the
 * Velocity context using the ContextLoader and runs the page template
 * selected by the request.
 *
 * @author llavandowska
 * @author David M Johnson
 */
public abstract class BasePageServlet extends VelocityServlet
{
    private static Log mLogger =
        LogFactory.getFactory().getInstance(BasePageServlet.class);
	/**
	 *  <p>Sets servletContext for WebappResourceLoader.</p>
	 *
	 * @param config servlet configuation
	 */
	public void init( ServletConfig config )
		throws ServletException
	{
		super.init( config );
		WebappResourceLoader.setServletContext( getServletContext() );
	}
    public Template handleRequest( HttpServletRequest request,
                                   HttpServletResponse response,
                                   Context ctx ) throws Exception
    {
        String pid = null;
        Template outty = null;
        Exception pageException = null;
        
        try
        {
            PageContext pageContext =
                JspFactory.getDefaultFactory().getPageContext(
                    this, request, response,"", true, 8192, true);
            // Needed to init request attributes, etc.
            RollerRequest rreq = RollerRequest.getRollerRequest(pageContext);
            UserManager userMgr = rreq.getRoller().getUserManager();
            
            WebsiteData wd = null;
            if (request.getAttribute(RollerRequest.OWNING_WEBSITE) != null) {
                wd = (WebsiteData)
                    request.getAttribute(RollerRequest.OWNING_WEBSITE);
            }
            else
            {
                wd = rreq.getWebsite();
            }
            
            // If request specified the page, then go with that
            PageData pd = null;
            if (rreq.getPage() != null // RollerRequest does too much guess work
                    && request.getAttribute(RollerRequest.OWNING_WEBSITE) == null)
            {
                pd = rreq.getPage();
                pid = pd.getId();
            }
            // If page not available from request, then use website's default
            else if (wd != null)
            {
                pd = userMgr.retrievePage(wd.getDefaultPageId());
                pid = pd.getId();
                rreq.setPage(pd); 
            }
            // Still no page ID, then we have a problem
            if ( pid == null )
            {
                throw new ResourceNotFoundException("Page not found");
            }
            
            outty = prepareForPageExecution(ctx, rreq, response, pd);
        }
        catch( Exception e )
        {
	        pageException = e;
            response.setStatus( HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        }
        if (pageException != null)
        {
            mLogger.error("EXCEPTION: in RollerServlet", pageException);
            request.setAttribute("DisplayException", pageException);
        }
        return outty;
    }

    //------------------------------------------------------------------------
    /**
     * Try to load user-specified Decorator (if specified).  Failing that
     * see if user has a _decorator Page, if not check for a _decorator
     * in the Preview resource loader.  Finally, if none of those can
     * be found fall back to the no-op decorator.
     * @param object
     * @return
     */
    private Template findDecorator(String decoratorName, UserManager userMgr, WebsiteData wd) 
        throws ResourceNotFoundException, ParseErrorException, RollerException, Exception
    {
        Template decorator = null;
        PageData decoratorPage = null;
        String decoratorId = null;
        
        // check for user-specified decorator
        if (decoratorName != null)
        {    
            decoratorPage = userMgr.getPageByName(wd, decoratorName);
            if (decoratorPage != null) 
            {
                decoratorId = decoratorPage.getId();
            }
        }
        
        // if no user-specified decorator try default page-name
        if (decoratorPage == null)
        {
            decoratorPage = userMgr.getPageByName(wd, "_decorator");
            if (decoratorPage != null) 
            {
                decoratorId = decoratorPage.getId();
            }
            else
            {
                // could be in PreviewResourceLoader
                decoratorId = "_decorator";
            }
        }

        // try loading Template
        if (decoratorId != null) 
        {
            try
            {
                decorator = getTemplate(decoratorId, "UTF-8");
            }
            catch (Exception e)
            {
                // it may not exist, so this is okay
            }
        }
        
        // couldn't find Template, load default "no-op" decorator
        if (decorator == null) 
        {
            decorator = getTemplate("/themes/noop_decorator.vm", "UTF-8");
        }
        return decorator;
    }

    /** 
     * Prepare for page execution be setting content type, populating context,
     * and processing the page decorator if needed.
     */
    protected Template prepareForPageExecution(Context ctx, RollerRequest rreq, 
        HttpServletResponse response, PageData pd) throws Exception
    {                    
        Template outty = null;
        UserManager userMgr = rreq.getRoller().getUserManager();
        WebsiteData wd = pd.getWebsite();
        
        // if page has an extension - use that to set the contentType
        String pageLink = pd.getLink();
        String mimeType = getServletConfig().getServletContext().getMimeType(pageLink);
        if(mimeType != null) {
            // we found a match ... set the content type
            response.setContentType(mimeType);
        }
        
        /* old way ... not as flexible -- Allen G
        int period = pd.getLink().indexOf('.');
        if (period > -1) 
        {
            String extension = pd.getLink().substring(period+1);
            if ("js".equals(extension)) 
            {
                extension = "javascript";
            }
            response.setContentType("text/" + extension);
        }
        */
    
        // Made it this far, populate the Context
        ContextLoader.setupContext( ctx, rreq, response );

        // Get the page
        outty =  getTemplate( pd.getId(), "UTF-8" );

        /**
         * User can define a Decorator Template.
         */
        if (wd != null)
        {
            // parse/merge Page template
            StringWriter sw = new StringWriter();
            outty.merge(ctx, sw);
            ctx.put("decorator_body", sw.toString());

            // replace outty with decorator Template
            outty = findDecorator((String)ctx.get("decorator"), userMgr, wd);                
        }
        return outty;
    }
    
    //------------------------------------------------------------------------
    /**
     * Handle error in Velocity processing.
     */
    protected void error( HttpServletRequest req, HttpServletResponse res,
        Exception e) throws ServletException, IOException
    {
        mLogger.warn("ERROR in VelocityServlet",e);
    }
   
    /** 
     * Override to prevent Velocity from putting "req" and "res" into the context.
     * Allowing users access to the underlying Servlet objects is a security risk.
     * If need access to request parameters, use $requestParameters.
     */
    protected Context createContext(
            HttpServletRequest req,
            HttpServletResponse res) {
        
        VelocityContext context = new VelocityContext();
        context.put(REQUEST, new RequestWrapper(req.getParameterMap()));
        return context;
        
    }
    
    /** Provide access to request params only, not actual request */
    public static class RequestWrapper
    {
        Map params = null;
        public RequestWrapper(Map params) 
        {
            this.params = params;
        }
        public String getParameter(String key)
        {
            String ret = null;
            String[] array = (String[])params.get(key);
            if (array != null && array.length > 0)
            {
                ret = array[0];
            }
            return ret;
        }
    }
}
\ No newline at end of file