You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jspwiki.apache.org by aj...@apache.org on 2008/12/20 05:34:20 UTC

svn commit: r728235 [1/3] - in /incubator/jspwiki/trunk: ./ doc/ etc/ etc/i18n/templates/ etc/ini/ src/com/ecyrd/jspwiki/ src/com/ecyrd/jspwiki/action/ src/com/ecyrd/jspwiki/diff/ src/com/ecyrd/jspwiki/preferences/ src/com/ecyrd/jspwiki/ui/ src/com/ecy...

Author: ajaquith
Date: Fri Dec 19 20:34:18 2008
New Revision: 728235

URL: http://svn.apache.org/viewvc?rev=728235&view=rev
Log:
Migrated UserPreferences.jsp and related; completely overhauled Preferences code so that it is much simpler, and leverages Stripes. UserPreferences.jsp and the collaborating UserPreferencesActionBean, in particular, are excellent examples of what the JSPs will look like when we are done migrating everything.

Added:
    incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/ui/stripes/LocaleConverter.java
    incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/ui/stripes/TimeZoneConverter.java
Removed:
    incubator/jspwiki/trunk/etc/jstl-fmt.tld
    incubator/jspwiki/trunk/etc/stripes.tld
Modified:
    incubator/jspwiki/trunk/ChangeLog
    incubator/jspwiki/trunk/build.xml
    incubator/jspwiki/trunk/doc/README - Stripes Migration
    incubator/jspwiki/trunk/etc/i18n/templates/default.properties
    incubator/jspwiki/trunk/etc/ini/default_jspwiki.properties
    incubator/jspwiki/trunk/etc/web.xml
    incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/Release.java
    incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/WikiPage.java
    incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/action/UserPreferencesActionBean.java
    incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/action/WikiContextFactory.java
    incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/diff/TraditionalDiffProvider.java
    incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/preferences/Preferences.java
    incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/ui/TemplateManager.java
    incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/ui/WikiRequestWrapper.java
    incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/ui/WikiServletFilter.java
    incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/ui/migrator/JSPWikiJspTransformer.java
    incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/ui/migrator/JspDocument.java
    incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/ui/migrator/StripesJspTransformer.java
    incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/ui/stripes/DefaultWikiContext.java
    incubator/jspwiki/trunk/src/webdocs/Captcha.jsp
    incubator/jspwiki/trunk/src/webdocs/Comment.jsp
    incubator/jspwiki/trunk/src/webdocs/CookieError.jsp
    incubator/jspwiki/trunk/src/webdocs/CreateProfile.jsp
    incubator/jspwiki/trunk/src/webdocs/Delete.jsp
    incubator/jspwiki/trunk/src/webdocs/Diff.jsp
    incubator/jspwiki/trunk/src/webdocs/Edit.jsp
    incubator/jspwiki/trunk/src/webdocs/Error.jsp
    incubator/jspwiki/trunk/src/webdocs/Install.jsp
    incubator/jspwiki/trunk/src/webdocs/LoginForm.jsp
    incubator/jspwiki/trunk/src/webdocs/Message.jsp
    incubator/jspwiki/trunk/src/webdocs/NewBlogEntry.jsp
    incubator/jspwiki/trunk/src/webdocs/PageInfo.jsp
    incubator/jspwiki/trunk/src/webdocs/PageModified.jsp
    incubator/jspwiki/trunk/src/webdocs/Preview.jsp
    incubator/jspwiki/trunk/src/webdocs/Rename.jsp
    incubator/jspwiki/trunk/src/webdocs/Search.jsp
    incubator/jspwiki/trunk/src/webdocs/Upload.jsp
    incubator/jspwiki/trunk/src/webdocs/UserPreferences.jsp
    incubator/jspwiki/trunk/src/webdocs/Wiki.jsp
    incubator/jspwiki/trunk/src/webdocs/Workflow.jsp
    incubator/jspwiki/trunk/src/webdocs/admin/SecurityConfig.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/AJAXCategories.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/AJAXPreview.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/AJAXSearch.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/AttachmentTab.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/CreateProfileContent.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/DiffTab.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/EditGroupContent.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/EditLayout.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/FindContent.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/GroupContent.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/GroupTab.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/InfoContent.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/LoginContent.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/NewGroupContent.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/PageTab.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/PreferencesTab.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/ProfileTab.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/SearchBox.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/ViewLayout.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/WorkflowContent.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/admin/AdminTemplate.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/admin/UserManagement.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/commonheader.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/editors/FCK.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/editors/plain.jsp
    incubator/jspwiki/trunk/src/webdocs/templates/default/editors/preview.jsp
    incubator/jspwiki/trunk/tests/com/ecyrd/jspwiki/ui/migrator/JspParserTest.java
    incubator/jspwiki/trunk/tests/com/ecyrd/jspwiki/ui/migrator/StripesJspTransformerTest.java

Modified: incubator/jspwiki/trunk/ChangeLog
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/ChangeLog?rev=728235&r1=728234&r2=728235&view=diff
==============================================================================
--- incubator/jspwiki/trunk/ChangeLog (original)
+++ incubator/jspwiki/trunk/ChangeLog Fri Dec 19 20:34:18 2008
@@ -1,3 +1,12 @@
+2008-12-19  Andrew Jaquith <ajaquith AT apache DOT org>
+
+        * 3.0.0-svn-34
+        
+        * Migrated UserPreferences.jsp and related; completely overhauled Preferences
+        code so that it is much simpler, and leverages Stripes. UserPreferences.jsp and
+        the collaborating UserPreferencesActionBean, in particular, are excellent
+        examples of what the JSPs will look like when we are done migrating everything.
+
 2008-12-19 Harry Metske <me...@apache.org>
 
         * 3.0.0-svn-33

Modified: incubator/jspwiki/trunk/build.xml
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/build.xml?rev=728235&r1=728234&r2=728235&view=diff
==============================================================================
--- incubator/jspwiki/trunk/build.xml (original)
+++ incubator/jspwiki/trunk/build.xml Fri Dec 19 20:34:18 2008
@@ -306,6 +306,7 @@
       </classpath>
       <arg value="src/webdocs" />
       <arg value="build/migrated" />
+      <sysproperty key="stripes.migrator.migrateForms" value="${stripes.migrator.migrateForms}" />
     </java>
   </target>
 

Modified: incubator/jspwiki/trunk/doc/README - Stripes Migration
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/doc/README%20-%20Stripes%20Migration?rev=728235&r1=728234&r2=728235&view=diff
==============================================================================
--- incubator/jspwiki/trunk/doc/README - Stripes Migration (original)
+++ incubator/jspwiki/trunk/doc/README - Stripes Migration Fri Dec 19 20:34:18 2008
@@ -26,7 +26,7 @@
 Include these lines for all top-level JSPs:
 
 <%@ page import="com.ecyrd.jspwiki.action.*" %>
-<%@ taglib uri="/WEB-INF/stripes.tld" prefix="stripes" %>
+<%@ taglib uri="http://stripes.sourceforge.net/stripes.tld" prefix="stripes" %>
 
 WikiContext Creation
 --------------------

Modified: incubator/jspwiki/trunk/etc/i18n/templates/default.properties
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/etc/i18n/templates/default.properties?rev=728235&r1=728234&r2=728235&view=diff
==============================================================================
--- incubator/jspwiki/trunk/etc/i18n/templates/default.properties (original)
+++ incubator/jspwiki/trunk/etc/i18n/templates/default.properties Fri Dec 19 20:34:18 2008
@@ -450,6 +450,10 @@
 profile.nameCollision=Another user already has a profile with {0} set to {1}
 profile.noPasswordMatch=Passwords must match
 
+# Enumerated types
+Orientation.LEFT=Left
+Orientation.RIGHT=Right
+
 # Workflow generic messages
 workflow.tab=Workflow
 workflow.heading=Your Workflow Items

Modified: incubator/jspwiki/trunk/etc/ini/default_jspwiki.properties
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/etc/ini/default_jspwiki.properties?rev=728235&r1=728234&r2=728235&view=diff
==============================================================================
--- incubator/jspwiki/trunk/etc/ini/default_jspwiki.properties (original)
+++ incubator/jspwiki/trunk/etc/ini/default_jspwiki.properties Fri Dec 19 20:34:18 2008
@@ -20,9 +20,9 @@
 
 # Set position of the favorites menu (aka left menu)
 # The value determines the css-class used to change the position of the #favorites block
-# Possible values: fav-left or fav-right
-# Default value is fav-left
-jspwiki.defaultprefs.template.orientation =fav-left
+# Possible values: LEFT or RIGHT
+# Default value is LEFT
+jspwiki.defaultprefs.template.orientation =LEFT
 
 # Set editor type : plain, WikiWizard, FCK 
 jspwiki.defaultprefs.template.editor =plain

Modified: incubator/jspwiki/trunk/etc/web.xml
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/etc/web.xml?rev=728235&r1=728234&r2=728235&view=diff
==============================================================================
--- incubator/jspwiki/trunk/etc/web.xml (original)
+++ incubator/jspwiki/trunk/etc/web.xml Fri Dec 19 20:34:18 2008
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
-
 <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
@@ -59,8 +58,8 @@
          <param-name>ActionResolver.Packages</param-name>
          <param-value>com.ecyrd.jspwiki.action</param-value>
       </init-param>
-      <!-- Tell Stripes to auto-discover custom extension classes from the "action"
-           package also. Extensions JSPWiki uses includes WikiActionBeanContext,
+      <!-- Tell Stripes to auto-discover custom extensions from the "ui.stripes"
+           package. Extensions JSPWiki uses includes WikiActionBeanContext,
            WikiRuntimeConfiguration, WikiInterceptor and the various TypeConverter
            implementations for JSPWiki-specific types. -->
       <init-param>
@@ -79,7 +78,7 @@
       <!-- Locales supported by this wiki -->
       <init-param>
          <param-name>LocalePicker.Locales</param-name>
-         <param-value>en:UTF8,de:UTF8,es:UTF8,fi:UTF8,it:UTF8,ln:UTF8,zh_CN:UTF8,</param-value>
+         <param-value>en:UTF8,de:UTF8,es:UTF8,fi:UTF8,fr:UTF8,it:UTF8,nl:UTF8,ru:UTF8,zh_CN:UTF8</param-value>
       </init-param>
       <!-- Library for parsing multi-part file uploads -->
       <init-param>
@@ -128,18 +127,24 @@
        <filter-name>WikiServletFilter</filter-name>
        <url-pattern>/JSON-RPC</url-pattern>
    </filter-mapping> 
-    <filter-mapping>
-        <filter-name>StripesFilter</filter-name>
-        <url-pattern>*.jsp</url-pattern>
-        <dispatcher>REQUEST</dispatcher>
-        <dispatcher>FORWARD</dispatcher>
-    </filter-mapping>
-
-    <filter-mapping>
-        <filter-name>StripesFilter</filter-name>
-        <servlet-name>StripesDispatcher</servlet-name>
-        <dispatcher>REQUEST</dispatcher>
-    </filter-mapping>
+   <filter-mapping>
+       <filter-name>WikiServletFilter</filter-name>
+       <url-pattern>*.jsp</url-pattern>
+   </filter-mapping> 
+   <filter-mapping>
+       <filter-name>WikiServletFilter</filter-name>
+       <url-pattern>*.action</url-pattern>
+   </filter-mapping> 
+   <filter-mapping>
+       <filter-name>StripesFilter</filter-name>
+       <url-pattern>*.jsp</url-pattern>
+       <dispatcher>REQUEST</dispatcher>
+   </filter-mapping>
+   <filter-mapping>
+       <filter-name>StripesFilter</filter-name>
+       <servlet-name>StripesDispatcher</servlet-name>
+       <dispatcher>REQUEST</dispatcher>
+   </filter-mapping>
 
    <!--
    <filter-mapping>
@@ -153,7 +158,7 @@
    -->
 
    <!--
-       HttpSessionListener used for managing WikiSession's.
+       HttpSessionListener used for managing WikiSessions.
      -->
    <listener>
       <listener-class>com.ecyrd.jspwiki.auth.SessionMonitor</listener-class>
@@ -318,22 +323,6 @@
      <error-code>403</error-code>
      <location>/error/Forbidden.html</location>
    </error-page>
-   
-   <!-- Taglibs -->
-   <!--
-   <taglib>
-     <taglib-location>/WEB-INF/jstl-core.tld</taglib-location>
-     <taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
-   </taglib>
-   <taglib>
-     <taglib-location>/WEB-INF/jstl-fmt.tld</taglib-location>
-     <taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri>
-   </taglib>
-   -->
-   <taglib>
-     <taglib-location>/WEB-INF/stripes.tld</taglib-location>
-     <taglib-uri>http://stripes.sourceforge.net/stripes.tld</taglib-uri>
-   </taglib>
 
    <!--  REMOVE ME TO ENABLE JDBC DATABASE
    <resource-ref>

Modified: incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/Release.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/Release.java?rev=728235&r1=728234&r2=728235&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/Release.java (original)
+++ incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/Release.java Fri Dec 19 20:34:18 2008
@@ -77,7 +77,7 @@
      *  <p>
      *  If the build identifier is empty, it is not added.
      */
-    public static final String     BUILD         = "33";
+    public static final String     BUILD         = "34";
     
     /**
      *  This is the generic version string you should use

Modified: incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/WikiPage.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/WikiPage.java?rev=728235&r1=728234&r2=728235&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/WikiPage.java (original)
+++ incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/WikiPage.java Fri Dec 19 20:34:18 2008
@@ -73,8 +73,8 @@
     /**
      *  Create a new WikiPage using a given engine and name.
      *  
-     *  @param engine The WikiEngine that owns this page.
-     *  @param name   The path of the page.
+     *  @param engine the WikiEngine that owns this page
+     *  @param path the path of the page
      */
     public WikiPage( WikiEngine engine, String path )
     {

Modified: incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/action/UserPreferencesActionBean.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/action/UserPreferencesActionBean.java?rev=728235&r1=728234&r2=728235&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/action/UserPreferencesActionBean.java (original)
+++ incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/action/UserPreferencesActionBean.java Fri Dec 19 20:34:18 2008
@@ -1,18 +1,22 @@
 package com.ecyrd.jspwiki.action;
 
 import java.security.Principal;
+import java.util.Locale;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 
 import net.sourceforge.stripes.action.*;
+import net.sourceforge.stripes.controller.LifecycleStage;
 import net.sourceforge.stripes.validation.Validate;
 
+import com.ecyrd.jspwiki.WikiContext;
 import com.ecyrd.jspwiki.auth.login.CookieAssertionLoginModule;
 import com.ecyrd.jspwiki.auth.permissions.WikiPermission;
 import com.ecyrd.jspwiki.log.Logger;
 import com.ecyrd.jspwiki.log.LoggerFactory;
+import com.ecyrd.jspwiki.preferences.Preferences;
 import com.ecyrd.jspwiki.ui.EditorManager;
 import com.ecyrd.jspwiki.ui.TemplateManager;
 import com.ecyrd.jspwiki.ui.stripes.HandlerPermission;
@@ -33,6 +37,20 @@
 
     private String m_redirect = null;
 
+    private Locale m_locale = null;
+
+    private Preferences.Orientation m_orientation = null;
+
+    private String m_timeFormat = null;
+
+    private String m_timeZone = null;
+
+    private boolean m_showQuickLinks = false;
+
+    private boolean m_sectionEditing = false;
+
+    private String m_skin = null;
+
     /**
      * Clears the user's asserted name by removing the cookie from the user's
      * session, then logs out the user by redirecting to <code>/Login.jsp</code>.
@@ -49,19 +67,6 @@
     }
 
     /**
-     * Redirects the user to their favorites page.
-     * 
-     * @return a redirection to the favorites page
-     */
-    @HandlesEvent( "editFavorites" )
-    @WikiRequestContext( "favorites" )
-    public Resolution editFavorites()
-    {
-        Principal principal = getContext().getCurrentUser();
-        return new RedirectResolution( "/Edit.jsp?" + principal.getName() + "Favorites" );
-    }
-
-    /**
      * Sets the user's asserted name by setting a cookie in the user's session,
      * then redirects to the wiki front page. This method will <em>not</em>
      * set the cookie if the user is already authenticated.
@@ -91,24 +96,26 @@
     }
 
     /**
-     * Returns the asserted name for the user prefererences.
+     * Redirects the user to their favorites page.
      * 
-     * @return the asserted name
+     * @return a redirection to the favorites page
      */
-    public String getAssertedName()
+    @HandlesEvent( "editFavorites" )
+    @WikiRequestContext( "favorites" )
+    public Resolution editFavorites()
     {
-        return m_assertedName;
+        Principal principal = getContext().getCurrentUser();
+        return new RedirectResolution( "/Edit.jsp?" + principal.getName() + "Favorites" );
     }
 
     /**
-     * Sets the asserted name for the user prefererences.
+     * Returns the asserted name for the user preferences.
      * 
-     * @param name the asserted name
+     * @return the asserted name
      */
-    @Validate( required = true, on = "createAssertedName", minlength=1, maxlength=128 )
-    public void setAssertedName( String name )
+    public String getAssertedName()
     {
-        m_assertedName = name;
+        return m_assertedName;
     }
 
     /**
@@ -121,6 +128,126 @@
         return m_editor;
     }
 
+    public Locale getLocale()
+    {
+        return m_locale;
+    }
+
+    public Preferences.Orientation getOrientation()
+    {
+        return m_orientation;
+    }
+
+    /**
+     * Returns the URL to redirect to after the event handler methods fire.
+     * 
+     * @return the URL to redirect to
+     */
+    public String getRedirect()
+    {
+        return m_redirect;
+    }
+
+    public String getSkin()
+    {
+        return m_skin;
+    }
+
+    public String getTimeFormat()
+    {
+        return m_timeFormat;
+    }
+
+    public String getTimeZone()
+    {
+        return m_timeZone;
+    }
+
+    /**
+     * Pre-action that loads the available set of skins, languages, time formats
+     * and time zones based on the current template returned by
+     * {@link com.ecyrd.jspwiki.ui.stripes.WikiActionBeanContext#getTemplate()}.
+     * It also pre-populates the form values with the preferences stored in the
+     * session attribute
+     * {@link com.ecyrd.jspwiki.preferences.Preferences#SESSIONPREFS}.
+     * 
+     * @return always returns <code>null</code>
+     */
+    @Before( stages = LifecycleStage.BindingAndValidation )
+    public Resolution initPreferenceOptions()
+    {
+        WikiContext c = getContext();
+        TemplateManager t = c.getEngine().getTemplateManager();
+        HttpServletRequest request = getContext().getRequest();
+        HttpSession session = request.getSession();
+        
+        // Set request attributes
+        request.setAttribute( "skins", t.listSkins( request, c.getTemplate() ) );
+        request.setAttribute( "locales", t.listLocales( request ) );
+        request.setAttribute( "timeformats", t.listTimeFormats( getContext() ) );
+        request.setAttribute( "timezones", t.listTimeZones( request ) );
+        
+        // Pre-populate values
+        m_editor = Preferences.getPreference( session, Preferences.PREFS_EDITOR );
+        m_locale = new Locale( Preferences.getPreference( session, Preferences.PREFS_LOCALE ) );
+        try
+        {
+            m_orientation = Preferences.Orientation.valueOf( Preferences.getPreference( session, Preferences.PREFS_ORIENTATION ) );
+        }
+        catch ( Exception e )
+        {
+            m_orientation = Preferences.Orientation.LEFT;
+        }
+        m_sectionEditing = Boolean.parseBoolean( Preferences.getPreference( session, Preferences.PREFS_SECTION_EDITING ) );
+        m_skin = Preferences.getPreference( session, Preferences.PREFS_SKIN );
+        m_timeFormat = Preferences.getPreference( session, Preferences.PREFS_TIME_FORMAT );
+        m_timeZone = Preferences.getPreference( session, Preferences.PREFS_TIME_ZONE );
+        
+        return null;
+    }
+
+    public boolean isSectionEditing()
+    {
+        return m_sectionEditing;
+    }
+
+    public boolean isShowQuickLinks()
+    {
+        return m_showQuickLinks;
+    }
+
+    /**
+     * Saves the user's currently selected preferences to cookies, and to the
+     * Preferences map associated with the user's session.
+     * 
+     * @return resolution redirecting user to the display JSP for this ActionBean
+     */
+    @HandlesEvent( "save" )
+    public Resolution save()
+    {
+        HttpSession session = getContext().getHttpRequest().getSession();
+        HttpServletResponse response = getContext().getResponse();
+        Preferences.setPreference( session, response, Preferences.PREFS_EDITOR, m_editor );
+        Preferences.setPreference( session, response, Preferences.PREFS_LOCALE, m_locale.toString() );
+        Preferences.setPreference( session, response, Preferences.PREFS_ORIENTATION, m_orientation.name() );
+        Preferences.setPreference( session, response, Preferences.PREFS_SECTION_EDITING, Boolean.toString( m_sectionEditing ) );
+        Preferences.setPreference( session, response, Preferences.PREFS_SKIN, m_skin );
+        Preferences.setPreference( session, response, Preferences.PREFS_TIME_FORMAT, m_timeFormat );
+        Preferences.setPreference( session, response, Preferences.PREFS_TIME_ZONE, m_timeZone );
+        return new RedirectResolution( UserPreferencesActionBean.class );
+    }
+
+    /**
+     * Sets the asserted name for the user preferences.
+     * 
+     * @param name the asserted name
+     */
+    @Validate( required = true, on = "createAssertedName", minlength = 1, maxlength = 128 )
+    public void setAssertedName( String name )
+    {
+        m_assertedName = name;
+    }
+
     /**
      * Sets the editor for editing preferences. If this
      * UserPreferencesActionBean has an associated WikiActionBeanContext, and
@@ -130,7 +257,7 @@
      * 
      * @param editor the editor
      */
-    @Validate()
+    @Validate( )
     public void setEditor( String editor )
     {
         m_editor = editor;
@@ -141,25 +268,57 @@
         }
     }
 
+    @Validate( )
+    public void setLocale( Locale locale )
+    {
+        m_locale = locale;
+    }
+
+    @Validate( )
+    public void setOrientation( Preferences.Orientation orientation )
+    {
+        m_orientation = orientation;
+    }
+
     /**
      * Sets the URL to redirect to after the event handler methods fire.
      * 
      * @param url the URL to redirect to
      */
-    @Validate()
+    @Validate( )
     public void setRedirect( String url )
     {
         m_redirect = url;
     }
 
-    /**
-     * Returns the URL to redirect to after the event handler methods fire.
-     * 
-     * @return the URL to redirect to
-     */
-    public String getRedirect()
+    @Validate( )
+    public void setSectionEditing( boolean sectionEditing )
     {
-        return m_redirect;
+        m_sectionEditing = sectionEditing;
+    }
+
+    @Validate( )
+    public void setShowQuickLinks( boolean showQuickLinks )
+    {
+        m_showQuickLinks = showQuickLinks;
+    }
+
+    @Validate( )
+    public void setSkin( String skin )
+    {
+        m_skin = skin;
+    }
+
+    @Validate( )
+    public void setTimeFormat( String timeFormat )
+    {
+        m_timeFormat = timeFormat;
+    }
+
+    @Validate( )
+    public void setTimeZone( String timeZone )
+    {
+        m_timeZone = timeZone;
     }
 
     /**
@@ -169,7 +328,7 @@
      * @return a forward to the content template
      */
     @DefaultHandler
-    @HandlesEvent("prefs")
+    @HandlesEvent( "prefs" )
     @HandlerPermission( permissionClass = WikiPermission.class, target = "${context.engine.applicationName}", actions = WikiPermission.EDIT_PREFERENCES_ACTION )
     @WikiRequestContext( "prefs" )
     public Resolution view()

Modified: incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/action/WikiContextFactory.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/action/WikiContextFactory.java?rev=728235&r1=728234&r2=728235&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/action/WikiContextFactory.java (original)
+++ incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/action/WikiContextFactory.java Fri Dec 19 20:34:18 2008
@@ -3,7 +3,10 @@
 import java.lang.reflect.Method;
 import java.net.URI;
 import java.net.URISyntaxException;
-import java.util.*;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -22,7 +25,6 @@
 import com.ecyrd.jspwiki.log.Logger;
 import com.ecyrd.jspwiki.log.LoggerFactory;
 import com.ecyrd.jspwiki.parser.MarkupParser;
-import com.ecyrd.jspwiki.preferences.Preferences;
 import com.ecyrd.jspwiki.providers.ProviderException;
 import com.ecyrd.jspwiki.tags.WikiTagBase;
 import com.ecyrd.jspwiki.ui.stripes.HandlerInfo;
@@ -90,22 +92,6 @@
     }
 
     /**
-     * Returns the locale of the HTTP request if available, otherwise returns
-     * the default Locale of the server.
-     * 
-     * @return A valid locale object
-     * @param context The WikiContext
-     */
-    public static Locale getLocale( WikiContext context )
-    {
-        return Preferences.getLocale( context );
-        /*
-         * HttpServletRequest request = context.getHttpRequest(); return (
-         * request != null ) ? request.getLocale() : Locale.getDefault();
-         */
-    }
-
-    /**
      * <p>
      * Saves the supplied WikiContext, and the related WikiEngine and
      * WikiSession, in request scope. The WikiContext is saved as an attribute

Modified: incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/diff/TraditionalDiffProvider.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/diff/TraditionalDiffProvider.java?rev=728235&r1=728234&r2=728235&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/diff/TraditionalDiffProvider.java (original)
+++ incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/diff/TraditionalDiffProvider.java Fri Dec 19 20:34:18 2008
@@ -38,7 +38,6 @@
 import com.ecyrd.jspwiki.NoRequiredPropertyException;
 import com.ecyrd.jspwiki.WikiContext;
 import com.ecyrd.jspwiki.WikiEngine;
-import com.ecyrd.jspwiki.action.WikiContextFactory;
 import com.ecyrd.jspwiki.i18n.InternationalizationManager;
 
 
@@ -183,7 +182,7 @@
             double[] choiceLimits = { 1, 2 };
             
             MessageFormat fmt = new MessageFormat("");
-            fmt.setLocale( WikiContextFactory.getLocale(m_context) );
+            fmt.setLocale( m_context.getHttpRequest().getLocale() );
             ChoiceFormat cfmt = new ChoiceFormat( choiceLimits, choiceString );
             fmt.applyPattern( type );
             Format[] formats = { NumberFormat.getInstance(), cfmt, NumberFormat.getInstance() };

Modified: incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/preferences/Preferences.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/preferences/Preferences.java?rev=728235&r1=728234&r2=728235&view=diff
==============================================================================
--- incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/preferences/Preferences.java (original)
+++ incubator/jspwiki/trunk/src/com/ecyrd/jspwiki/preferences/Preferences.java Fri Dec 19 20:34:18 2008
@@ -24,272 +24,165 @@
 import java.text.SimpleDateFormat;
 import java.util.*;
 
+import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 import javax.servlet.jsp.PageContext;
 
-import org.apache.commons.lang.StringUtils;
-import com.ecyrd.jspwiki.log.Logger;
-import com.ecyrd.jspwiki.log.LoggerFactory;
-import org.json.JSONException;
-import org.json.JSONObject;
-
 import com.ecyrd.jspwiki.InternalWikiException;
 import com.ecyrd.jspwiki.PropertyReader;
 import com.ecyrd.jspwiki.WikiContext;
-import com.ecyrd.jspwiki.action.WikiContextFactory;
+import com.ecyrd.jspwiki.WikiEngine;
 import com.ecyrd.jspwiki.i18n.InternationalizationManager;
-import com.ecyrd.jspwiki.util.HttpUtil;
-import com.ecyrd.jspwiki.util.TextUtil;
+import com.ecyrd.jspwiki.log.Logger;
+import com.ecyrd.jspwiki.log.LoggerFactory;
+import com.ecyrd.jspwiki.ui.stripes.LocaleConverter;
 
 /**
- *  Represents an object which is used to store user preferences.
- *  
+ * <p>
+ * Represents user preferences for language, timezone, preferred template skin
+ * and other customizable user interface items. Preferences are initialized by
+ * JSPWiki by reading a series of cookies from the user's HTTP request. This
+ * happens once per request, during the execution of
+ * {@link com.ecyrd.jspwiki.ui.WikiServletFilter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)}.
+ * The method {@link #setupPreferences(HttpServletRequest)} performs the actual
+ * initialization.
+ * <p>
+ * After initialization, Preferences are stashed in the user's session as an
+ * attribute named {@link #SESSIONPREFS}. Preferences may be subsequently
+ * changed by calling
+ * {@link com.ecyrd.jspwiki.action.UserPreferencesActionBean#save()} with
+ * appropriate parameters, generally from a JSP.
+ * </p>
  */
-public class Preferences
-    extends HashMap<String,String>
+public class Preferences extends HashMap<String, String>
 {
-    private static final long serialVersionUID = 1L;
-    
     /**
-     *  The name under which a Preferences object is stored in the HttpSession.
-     *  Its value is {@value}.
-     */
-    public static final String SESSIONPREFS = "prefs";
-     
-    private static Logger log = LoggerFactory.getLogger( Preferences.class );
-    
-    /**
-     *  This is an utility method which is called to make sure that the
-     *  JSP pages do have proper access to any user preferences.  It should be
-     *  called from the commonheader.jsp.
-     *  <p>
-     *  This method reads user cookie preferences and mixes them up with any
-     *  default preferences (and in the future, any user-specific preferences)
-     *  and puts them all in the session, so that they do not have to be rewritten
-     *  again.
-     *  <p>
-     *  This method will remember if the user has already changed his prefs.
-     *  
-     *  @param pageContext The JSP PageContext.
+     * <p>
+     * Enumeration of three different date formats that JSPWiki supports.
+     * </p>
+     * <ul>
+     * <li>TIME: A time format, without date</li>
+     * <li>DATE: A date format, without a time</li>
+     * <li>DATETIME: A date format, with a time</li>
+     * </ul>
+     * 
+     * @since 2.8
      */
-    public static void setupPreferences( PageContext pageContext )
+    public enum TimeFormat
     {
-        HttpSession session = pageContext.getSession();
+        /** Time only; no date. */
+        TIME,
 
-        if( session.getAttribute( SESSIONPREFS ) == null )
-        {
-            reloadPreferences( pageContext );
-        }
+        /** Date only; no time. */
+        DATE,
+
+        /** Date plus time. */
+        DATETIME
     }
-    
+
     /**
-     *  Reloads the preferences from the PageContext into the WikiContext.
-     *  
-     *  @param pageContext The page context.
-     */
-    // FIXME: The way that date preferences are chosen is currently a bit wacky: it all
-    //        gets saved to the cookie based on the browser state with which the user
-    //        happened to first arrive to the site with.  This, unfortunately, means that
-    //        even if the user changes e.g. language preferences (like in a web cafe),
-    //        the old preferences still remain in a site cookie.
-    public static void reloadPreferences( PageContext pageContext )
+     * Enumeration of the orientation formats for favorites.
+     */
+    public enum Orientation
     {
-        Preferences prefs = new Preferences();
-        Properties props = PropertyReader.loadWebAppProps( pageContext.getServletContext() );
-        WikiContext ctx = WikiContextFactory.findContext( pageContext );
-        
-        prefs.put("SkinName", TextUtil.getStringProperty( props, "jspwiki.defaultprefs.template.skinname", "PlainVanilla" ) );
-        prefs.put("DateFormat", 
-                  TextUtil.getStringProperty( props, 
-                                              "jspwiki.defaultprefs.template.dateformat", 
-                                              ctx.getEngine().getInternationalizationManager().get( InternationalizationManager.CORE_BUNDLE, 
-                                                                                                    getLocale( ctx ), 
-                                                                                                    "common.datetimeformat" ) ) );
-
-        prefs.put("TimeZone", TextUtil.getStringProperty( props, "jspwiki.defaultprefs.template.timezone", 
-                                                          java.util.TimeZone.getDefault().getID() ) );
-
-        prefs.put("Orientation", TextUtil.getStringProperty( props, "jspwiki.defaultprefs.template.orientation", "fav-left" ) );
-        
-        prefs.put("Language", TextUtil.getStringProperty( props, "jspwiki.defaultprefs.template.language",
-                                                          getLocale( ctx ).toString() ) );
+        /** Favorites to the left. */
+        LEFT,
+        /** Favorites to the right. */
+        RIGHT
+    }
 
-        prefs.put("SectionEditing", TextUtil.getStringProperty( props, "jspwiki.defaultprefs.template.sectionediting",
-                                                          "" ) );
+    /**
+     * Cookie name for the user's preference for displaying dates and times.
+     */
+    public static final String PREFS_TIME_FORMAT = "TimeFormat";
 
-        // FIXME: "editor" property does not get registered, may be related with http://bugs.jspwiki.org/show_bug.cgi?id=117
-        // disabling it until knowing why it's happening
-        // FIXME: editormanager reads jspwiki.editor -- which of both properties should continue
-        prefs.put("editor", TextUtil.getStringProperty( props, "jspwiki.defaultprefs.template.editor", "plain" ) );
-                
-        parseJSONPreferences( (HttpServletRequest) pageContext.getRequest(), prefs );
+    /**
+     * Cookie name for the user's preference for displaying time zones.
+     */
+    public static final String PREFS_TIME_ZONE = "TimeZone";
 
-        pageContext.getSession().setAttribute( SESSIONPREFS, prefs );        
-    }
+    /**
+     * Cookie name for the user's preference for text orientation.
+     */
+    public static final String PREFS_ORIENTATION = "Orientation";
 
- 
     /**
-     *  Parses new-style preferences stored as JSON objects and stores them
-     *  in the session.  Everything in the cookie is stored.
-     *  
-     *  @param request
-     *  @param prefs The default hashmap of preferences
-     *  
+     * Cookie name for the user's preference for section editing (on/off).
      */
-    private static void parseJSONPreferences( HttpServletRequest request, Preferences prefs )
-    {
-        //FIXME: urlDecodeUTF8 should better go in HttpUtil ??
-        String prefVal = TextUtil.urlDecodeUTF8( HttpUtil.retrieveCookieValue( request, "JSPWikiUserPrefs" ) );
-        
-        if( prefVal != null )
-        {
-            try
-            {
-                JSONObject jo = new JSONObject( prefVal );
-    
-                for( Iterator i = jo.keys(); i.hasNext(); )
-                {
-                    String key = TextUtil.replaceEntities( (String)i.next() );
-                    prefs.put(key, jo.getString(key) );
-                }
-            }
-            catch( JSONException e )
-            {
-            }
-        }
-    }
+    public static final String PREFS_SECTION_EDITING = "SectionEditing";
 
     /**
-     *  Returns a preference value programmatically.
-     *  FIXME
-     *  
-     *  @param wikiContext
-     *  @param name
-     *  @return the preference value
+     * Cookie name for the user's preferred {@link com.ecyrd.jspwiki.ui.Editor}.
      */
-    public static String getPreference( WikiContext wikiContext, String name )
-    {
-        HttpServletRequest request = wikiContext.getHttpRequest();
-        if ( request == null ) return null;
-        
-        Preferences prefs = (Preferences)request.getSession().getAttribute( SESSIONPREFS );
-        
-        if( prefs != null )
-            return prefs.get( name );
-        
-        return null;
-    }
+    public static final String PREFS_EDITOR = "Editor";
+
     /**
-     *  Returns a preference value programmatically.
-     *  FIXME
-     *  
-     *  @param pageContext
-     *  @param name
-     *  @return the preference value
+     * The name under which a Preferences object is stored in the HttpSession.
+     * Its value is {@value}.
      */
-    public static String getPreference( PageContext pageContext, String name )
-    {
-        Preferences prefs = (Preferences)pageContext.getSession().getAttribute( SESSIONPREFS );
-        
-        if( prefs != null )
-            return prefs.get( name );
-        
-        return null;
-    }
+    public static final String SESSIONPREFS = "prefs";
 
-    
     /**
-     * Get Locale according to user-preference settings or the Stripes ActionBeanContext.
-     * 
-     * @param context The context to examine.
-     * @return a Locale object.
-     * @since 2.8
+     * Cookie name for the user's preferred {@link java.util.Locale}.
      */
-    public static Locale getLocale(WikiContext context)
-    {
-        Locale loc = null;
-        
-        String langSetting = Preferences.getPreference( context, "Language" );
-        
-        //
-        // parse language and construct valid Locale object
-        //
-        if( langSetting != null)
-        {
-            String language = "";
-            String country  = "";
-            String variant  = "";
-            
-            String[] res = StringUtils.split( langSetting, "-_" );
-            
-            if( res.length > 2 ) variant = res[2];
-            if( res.length > 1 ) country = res[1];
-            
-            if( res.length > 0 )
-            {
-                language = res[0];
-            
-                loc = new Locale( language, country, variant );
-            }
-        }
-        
-        // otherwise try to find out the browser's preferred language setting, or use the JVM's default
-        if( loc == null)
-        {    
-            HttpServletRequest request = context.getHttpRequest();
-            loc = ( request != null ) ? request.getLocale() : Locale.getDefault();
-        }
+    public static final String PREFS_LOCALE = "Locale";
 
-        //log.info( "using locale "+loc.toString() );
-        return loc;
-    }
+    /**
+     * Cookie name for the user's preferred template skin.
+     */
+    public static final String PREFS_SKIN = "SkinName";
+
+    private static final long serialVersionUID = 2L;
+
+    private static Logger log = LoggerFactory.getLogger( Preferences.class );
+
+    private static final LocaleConverter LOCALE_CONVERTER = new LocaleConverter();
 
     /**
-     *  Get SimpleTimeFormat according to user browser locale and preferred time
-     *  formats. If not found, it will revert to whichever format is set for the
-     *  default
+     * Get SimpleTimeFormat according to user browser locale and preferred time
+     * formats. If not found, it will revert to whichever format is set for the
+     * default
      * 
-     *  @param context WikiContext to use for rendering.
-     *  @param tf Which version of the dateformat you are looking for?
-     *  @return A SimpleTimeFormat object which you can use to render
-     *  @since 2.8
+     * @param context WikiContext to use for rendering.
+     * @param tf Which version of the dateformat you are looking for?
+     * @return A SimpleTimeFormat object which you can use to render
+     * @since 2.8
      */
     public static SimpleDateFormat getDateFormat( WikiContext context, TimeFormat tf )
     {
         InternationalizationManager imgr = context.getEngine().getInternationalizationManager();
-        Locale clientLocale = Preferences.getLocale( context );
-        String prefTimeZone = Preferences.getPreference( context, "TimeZone" );
+        Locale clientLocale = getLocale( context.getHttpRequest() );
+        String prefTimeZone = Preferences.getPreference( context, PREFS_TIME_ZONE );
         String prefDateFormat;
-        
-        log.debug("Checking for preferences...");
-        
+
+        log.debug( "Checking for preferences..." );
+
         switch( tf )
         {
             case DATETIME:
-                prefDateFormat = Preferences.getPreference( context, "DateFormat" );
-                log.debug("Preferences fmt = "+prefDateFormat);
-                if( prefDateFormat == null ) 
+                prefDateFormat = Preferences.getPreference( context, PREFS_TIME_FORMAT );
+                log.debug( "Preferences fmt = " + prefDateFormat );
+                if( prefDateFormat == null )
                 {
-                    prefDateFormat = imgr.get( InternationalizationManager.CORE_BUNDLE, 
-                                               clientLocale, 
-                                               "common.datetimeformat" );
-                    log.debug("Using locale-format = "+prefDateFormat);
+                    prefDateFormat = imgr.get( InternationalizationManager.CORE_BUNDLE, clientLocale, "common.datetimeformat" );
+                    log.debug( "Using locale-format = " + prefDateFormat );
                 }
                 break;
-                
+
             case TIME:
                 prefDateFormat = imgr.get( "common.timeformat" );
                 break;
-                
+
             case DATE:
                 prefDateFormat = imgr.get( "common.dateformat" );
                 break;
-                
+
             default:
                 throw new InternalWikiException( "Got a TimeFormat for which we have no value!" );
         }
-        
+
         try
         {
             SimpleDateFormat fmt = new SimpleDateFormat( prefDateFormat, clientLocale );
@@ -312,41 +205,216 @@
     }
 
     /**
-     *  A simple helper function to render a date based on the user preferences.
-     *  This is useful for example for all plugins.
-     *  
-     *  @param context  The context which is used to get the preferences
-     *  @param date     The date to render.
-     *  @param tf       In which format the date should be rendered.
-     *  @return A ready-rendered date.
-     *  @since 2.8
+     * Returns the user's preferred {@link java.util.Locale} according the
+     * contents of the cookie value {@link #PREFS_LOCALE}, or alternatively the
+     * Locale supplied by the HTTP request object.
+     * 
+     * @param request the HTTP request
+     * @return a Locale object.
+     * @since 2.8
+     */
+    public static Locale getLocale( HttpServletRequest request )
+    {
+        String localePref = getCookieValue( request, PREFS_LOCALE, request.getLocale().toString() );
+        Locale locale = LOCALE_CONVERTER.convert( localePref, Locale.class, null );
+
+        // Otherwise use the JVM's default
+        if( locale == null )
+        {
+            locale = Locale.getDefault();
+        }
+        return locale;
+    }
+
+    /**
+     * Returns a preference value from the Preferences object stored in the
+     * user's session.
+     * 
+     * @param session the HTTP session
+     * @param name the name of the preference to retrieve
+     * @return the preference value, or <code>null</code> if not found
+     */
+    public static String getPreference( HttpSession session, String name )
+    {
+        Preferences prefs = (Preferences) session.getAttribute( SESSIONPREFS );
+        if( prefs != null )
+        {
+            return prefs.get( name );
+        }
+        return null;
+    }
+
+    /**
+     * Returns a preference value from the Preferences object stored in the
+     * user's session.
+     * 
+     * @param pageContext the page context
+     * @param name the name of the preference to retrieve
+     * @return the preference value, or <code>null</code> if not found
+     */
+    public static String getPreference( PageContext pageContext, String name )
+    {
+        return getPreference( pageContext.getSession(), name );
+    }
+
+    /**
+     * Returns a preference value from the Preferences object stored in the
+     * user's session.
+     * 
+     * @param wikiContext the wiki context
+     * @param name the name of the preference to retrieve
+     * @return the preference value, or <code>null</code> if not found
+     */
+    public static String getPreference( WikiContext wikiContext, String name )
+    {
+        return getPreference( wikiContext.getHttpRequest().getSession(), name );
+    }
+
+    /**
+     * Saves a preference value as a cookie. If <code>key</code> or
+     * <code>value</code> is <code>null</code>, the cookie is not set.
+     * 
+     * @param session the HTTP session
+     * @param response the HTTP response
+     * @param key the cookie name
+     * @param value the cookie value
+     */
+    public static void setPreference( HttpSession session, HttpServletResponse response, String key, String value )
+    {
+        if( key != null && value != null )
+        {
+            Cookie cookie = new Cookie( key, value );
+            response.addCookie( cookie );
+            Preferences prefs = (Preferences) session.getAttribute( SESSIONPREFS );
+            if( prefs != null )
+            {
+                prefs.put( key, value );
+            }
+        }
+    }
+
+    /**
+     * A simple helper function to render a date based on the user preferences.
+     * This is useful for example for all plugins.
+     * 
+     * @param context The context which is used to get the preferences
+     * @param date The date to render.
+     * @param tf In which format the date should be rendered.
+     * @return A ready-rendered date.
+     * @since 2.8
      */
     public static String renderDate( WikiContext context, Date date, TimeFormat tf )
     {
         DateFormat df = getDateFormat( context, tf );
-        
+
         return df.format( date );
     }
 
     /**
-     *  Is used to choose between the different date formats that JSPWiki supports.
-     *  <ul>
-     *   <li>TIME: A time format, without  date</li>
-     *   <li>DATE: A date format, without a time</li>
-     *   <li>DATETIME: A date format, with a time</li>
-     *  </ul>
-     *  
-     *  @since 2.8
+     * <p>
+     * This method checks to see if user preferences have been loaded from
+     * request cookies, and if not, loads them. This method is called from three
+     * places: from
+     * {@link com.ecyrd.jspwiki.ui.stripes.WikiInterceptor#intercept(net.sourceforge.stripes.controller.ExecutionContext)},
+     * {@link com.ecyrd.jspwiki.action.WikiContextFactory#newContext(HttpServletRequest, javax.servlet.http.HttpServletResponse, String)}
+     * and
+     * {@link com.ecyrd.jspwiki.action.WikiContextFactory#newViewContext(HttpServletRequest, javax.servlet.http.HttpServletResponse, com.ecyrd.jspwiki.WikiPage)}.
+     * </p>
+     * <p>
+     * Every user preference is read from a unique cookie. This method parses
+     * each value from the respective cookie, and applies a default value if the
+     * cookie is not found in the request. Once all preference values are
+     * parsed, this method stashes the Preferences object in the user's
+     * HTTPSession so that as an attribute named {@link #SESSIONPREFS}, so that
+     * it can be recalled later. So that JSPWiki does not waste excessive cycles
+     * parsing preference cookies on every request, if this method finds the
+     * SESSIONPREFS already present in the session, it returns silently without
+     * doing any more work.
+     * </p>
+     * <p>
+     * To change user preference values after the initial parse, users normally
+     * invoke {@link com.ecyrd.jspwiki.action.UserPreferencesActionBean#save()}.
+     * </p>
+     * 
+     * @param request the HTTP request
      */
-    public enum TimeFormat
+    public static void setupPreferences( HttpServletRequest request )
     {
-        /** A time format, no date. */
-        TIME,
-        
-        /** A date format, no time. */
-        DATE,
-        
-        /** A date+time format. */
-        DATETIME
+        HttpSession session = request.getSession();
+
+        if( session.getAttribute( SESSIONPREFS ) != null )
+        {
+            return;
+        }
+
+        // Ok, set up the preferences now
+        WikiEngine engine = WikiEngine.getInstance( session.getServletContext(), null );
+        Preferences prefs = new Preferences();
+        Properties props = PropertyReader.loadWebAppProps( session.getServletContext() );
+        Locale locale = request.getLocale();
+
+        // FIXME: "editor" property does not get registered, may be related with
+        // http://bugs.jspwiki.org/show_bug.cgi?id=117
+        // disabling it until knowing why it's happening
+        // FIXME: editormanager reads jspwiki.editor -- which of both properties
+        // should continue
+        String defaultValue = props.getProperty( "jspwiki.defaultprefs.template.editor", "plain" );
+        prefs.put( PREFS_EDITOR, getCookieValue( request, PREFS_EDITOR, defaultValue ) );
+
+        // Init the Locale
+        defaultValue = props.getProperty( "jspwiki.defaultprefs.template.language", locale.toString() );
+        prefs.put( PREFS_LOCALE, getCookieValue( request, PREFS_LOCALE, defaultValue ) );
+
+        // Init the orientation
+        defaultValue = props.getProperty( "jspwiki.defaultprefs.template.orientation", Orientation.LEFT.name() );
+        prefs.put( PREFS_ORIENTATION, getCookieValue( request, PREFS_ORIENTATION, defaultValue ) );
+
+        // Init section editing
+        defaultValue = props.getProperty( "jspwiki.defaultprefs.template.sectionediting", "false" );
+        prefs.put( PREFS_SECTION_EDITING, getCookieValue( request, PREFS_SECTION_EDITING, defaultValue ) );
+
+        // Init the template skin
+        defaultValue = props.getProperty( "jspwiki.defaultprefs.template.skinname", "PlainVanilla" );
+        prefs.put( PREFS_SKIN, getCookieValue( request, PREFS_SKIN, defaultValue ) );
+
+        // Init the date format
+        defaultValue = props.getProperty( "jspwiki.defaultprefs.template.dateformat", engine.getInternationalizationManager()
+            .get( InternationalizationManager.CORE_BUNDLE, locale, "common.datetimeformat" ) );
+        prefs.put( PREFS_TIME_FORMAT, getCookieValue( request, PREFS_TIME_FORMAT, defaultValue ) );
+
+        // Init the time zone
+        defaultValue = props.getProperty( "jspwiki.defaultprefs.template.timezone", java.util.TimeZone.getDefault().getID() );
+        prefs.put( PREFS_TIME_ZONE, getCookieValue( request, PREFS_TIME_ZONE, defaultValue ) );
+
+        // We're done here...
+        session.setAttribute( SESSIONPREFS, prefs );
+    }
+
+    private static String getCookieValue( HttpServletRequest request, String key, String defaultValue )
+    {
+        String cookieValue = null;
+        Cookie[] cookies = request.getCookies();
+        if( cookies != null )
+        {
+            for( Cookie cookie : request.getCookies() )
+            {
+                if( key.equals( cookie.getName() ) )
+                {
+                    cookieValue = cookie.getValue();
+                    break;
+                }
+            }
+        }
+        return cookieValue == null ? defaultValue : cookieValue;
+    }
+
+    public static void main( String[] args )
+    {
+        Orientation r = Orientation.LEFT;
+        System.out.println( r.toString() );
+        System.out.println( r.name() );
+        r = Orientation.valueOf( "LEFT" );
+        System.out.println( r.name() );
+        r = Orientation.valueOf( "foo" );
     }
 }