You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@roller.apache.org by ag...@apache.org on 2008/06/28 21:18:57 UTC

svn commit: r672574 [6/16] - in /roller/planet/core/trunk: ./ lib/ lib/buildtime/ lib/jakarta-taglibs-standard-1.1.2/ lib/jakarta-taglibs-standard-1.1.2/lib/ lib/jakarta-taglibs-standard-1.1.2/tld/ lib/openjpa-0.9.7/ lib/rome-0.9/ lib/spring-1.2/ lib/s...

Added: roller/planet/core/trunk/src/java/org/apache/roller/planet/pojos/UserRole.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/pojos/UserRole.java?rev=672574&view=auto
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/pojos/UserRole.java (added)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/pojos/UserRole.java Sat Jun 28 12:18:17 2008
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  The ASF licenses this file to You
+ * under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+
+package org.apache.roller.planet.pojos;
+
+import java.io.Serializable;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.roller.planet.util.UUIDGenerator;
+
+
+/**
+ * Role bean.
+ */
+public class UserRole implements Serializable {
+    
+    private String id = UUIDGenerator.generateUUID();
+    private String userName;
+    private User user;
+    private String role;
+    
+    
+    public UserRole() {
+    }
+    
+    public UserRole(User user, String role) {
+        this.userName = user.getUserName();
+        this.user = user;
+        this.role = role;
+    }
+    
+    
+    public String getId() {
+        return this.id;
+    }
+    
+    public void setId( String id ) {
+        this.id = id;
+    }
+    
+    
+    public String getUserName() {
+        return this.userName;
+    }
+    
+    public void setUserName( String userName ) {
+        this.userName = userName;
+    }
+    
+    
+    public User getUser() {
+        return this.user;
+    }
+    
+    public void setUser( User user ) {
+        this.user = user;
+    }
+    
+    
+    public String getRole() {
+        return this.role;
+    }
+    
+    public void setRole( String role ) {
+        this.role = role;
+    }
+    
+    
+    //------------------------------------------------------- Good citizenship
+    
+    public String toString() {
+        StringBuffer buf = new StringBuffer();
+        buf.append("{");
+        buf.append(this.id);
+        buf.append(", ").append(this.userName);
+        buf.append(", ").append(this.role);
+        buf.append("}");
+        return buf.toString();
+    }
+    
+    public boolean equals(Object other) {
+        if (other == this) return true;
+        if (other instanceof UserRole != true) return false;
+        UserRole o = (UserRole)other;
+        return new EqualsBuilder()
+        .append(getRole(), o.getRole())
+        .append(getUserName(), o.getUserName())
+        .isEquals();
+    }
+    
+    public int hashCode() {
+        return new HashCodeBuilder().append(getUserName()).append(getRole()).toHashCode();
+    }
+    
+}

Added: roller/planet/core/trunk/src/java/org/apache/roller/planet/pojos/UserRole.orm.xml
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/pojos/UserRole.orm.xml?rev=672574&view=auto
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/pojos/UserRole.orm.xml (added)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/pojos/UserRole.orm.xml Sat Jun 28 12:18:17 2008
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entity-mappings version="1.0" xmlns="http://java.sun.com/xml/ns/persistence/orm"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd">
+    <description>Persistence Metadata for Roller</description>
+    <persistence-unit-metadata>
+        <persistence-unit-defaults>
+            <access>PROPERTY</access>
+        </persistence-unit-defaults>
+    </persistence-unit-metadata>
+    <package>org.apache.roller.planet.pojos</package>
+    <entity metadata-complete="true" name="UserRole" class="org.apache.roller.planet.pojos.UserRole">
+        <table name="rag_userrole"/>
+        <attributes>
+            <id name="id">
+                <column name="id"/>
+            </id>
+            <basic name="userName">
+                <column name="username" insertable="true" updatable="true" unique="false"/>
+            </basic>
+            <basic name="role">
+                <column name="rolename" insertable="true" updatable="true" unique="false"/>
+            </basic>
+            <many-to-one name="user" target-entity="org.apache.roller.planet.pojos.User">
+                <join-column name="user_id" insertable="true" updatable="true" nullable="false"/>
+            </many-to-one>
+        </attributes>
+    </entity>
+</entity-mappings>

Modified: roller/planet/core/trunk/src/java/org/apache/roller/planet/tasks/PlanetTask.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/tasks/PlanetTask.java?rev=672574&r1=672573&r2=672574&view=diff
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/tasks/PlanetTask.java (original)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/tasks/PlanetTask.java Sat Jun 28 12:18:17 2008
@@ -19,7 +19,7 @@
 package org.apache.roller.planet.tasks;
 
 import org.apache.roller.planet.business.fetcher.FeedFetcher;
-import org.apache.roller.planet.business.PlanetFactory;
+import org.apache.roller.planet.business.AggregatorFactory;
 import org.apache.roller.planet.business.URLStrategy;
 import org.apache.roller.planet.config.PlanetConfig;
 

Added: roller/planet/core/trunk/src/java/org/apache/roller/planet/tasks/PurgeUnusedSubscriptionsTask.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/tasks/PurgeUnusedSubscriptionsTask.java?rev=672574&view=auto
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/tasks/PurgeUnusedSubscriptionsTask.java (added)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/tasks/PurgeUnusedSubscriptionsTask.java Sat Jun 28 12:18:17 2008
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  The ASF licenses this file to You
+ * under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+
+package org.apache.roller.planet.tasks;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.roller.planet.PlanetException;
+import org.apache.roller.planet.business.AggregatorFactory;
+import org.apache.roller.planet.business.PlanetManager;
+import org.apache.roller.planet.business.startup.PlanetStartup;
+import org.apache.roller.planet.config.PlanetConfig;
+import org.apache.roller.planet.pojos.Subscription;
+
+
+/**
+ * Purges unused subscriptions from the database.
+ */
+public class PurgeUnusedSubscriptionsTask extends PlanetTask {
+    
+    private static Log log = LogFactory.getLog(PurgeUnusedSubscriptionsTask.class);
+    
+    
+    public void run() {
+        
+        log.info("Purging all unused subscriptions");
+        
+        try {
+            // lookup all subscriptions not in a group
+            PlanetManager pmgr = AggregatorFactory.getAggregator().getPlanetManager();
+            List<Subscription> subs = pmgr.getSubscriptions();
+            
+            // find unused subscriptions
+            List<Subscription> unusedSubs = new ArrayList();
+            for (Subscription sub : subs) {
+                if (sub.getGroups().size() < 1) {
+                    unusedSubs.add(sub);
+                }
+            }
+            
+            // remove unused subscriptions
+            for (Subscription unused : unusedSubs) {
+                try {
+                    log.debug("Removing unused subscription "+unused.getFeedURL());
+                    pmgr.deleteSubscription(unused);
+                } catch(PlanetException ex) {
+                    log.warn("Error removing subscription "+unused.getFeedURL(), ex);
+                }
+            }
+            
+            // flush and done
+            AggregatorFactory.getAggregator().flush();
+            log.info("Purged "+unusedSubs.size()+" unused subscriptions");
+            
+        } catch (Exception e) {
+            log.error("ERROR purging subscriptions", e);
+        }
+    }
+    
+    
+    public static void main(String[] args) throws Exception {
+        
+        PurgeUnusedSubscriptionsTask task = new PurgeUnusedSubscriptionsTask();
+        task.initialize();
+        
+        // start by loading config
+        PlanetConfig config = PlanetConfig.getConfig(PlanetConfig.DEFAULT, PlanetConfig.CUSTOM, PlanetConfig.JVM_PARAM);
+        
+        // need to prepare and bootstrap Aggregator as well
+        PlanetStartup.prepare(config);
+        AggregatorFactory.bootstrap(AggregatorFactory.getDefaultProvider(config));
+        
+        task.run();
+    }
+    
+}

Modified: roller/planet/core/trunk/src/java/org/apache/roller/planet/tasks/RefreshPlanetTask.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/tasks/RefreshPlanetTask.java?rev=672574&r1=672573&r2=672574&view=diff
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/tasks/RefreshPlanetTask.java (original)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/tasks/RefreshPlanetTask.java Sat Jun 28 12:18:17 2008
@@ -20,10 +20,11 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.roller.planet.business.PlanetFactory;
+import org.apache.roller.planet.business.AggregatorFactory;
 import org.apache.roller.planet.business.startup.PlanetStartup;
 import org.apache.roller.planet.business.updater.FeedUpdater;
 import org.apache.roller.planet.business.updater.SingleThreadedFeedUpdater;
+import org.apache.roller.planet.config.PlanetConfig;
 
 
 /**
@@ -42,9 +43,9 @@
         try {            
             // Update all feeds in planet
             log.info("Refreshing Planet entries");
-            FeedUpdater updater = new SingleThreadedFeedUpdater();
+            FeedUpdater updater = new SingleThreadedFeedUpdater(AggregatorFactory.getAggregator().getConfig());
             updater.updateSubscriptions();
-            PlanetFactory.getPlanet().release();
+            AggregatorFactory.getAggregator().release();
             
         } catch (Exception e) {
             log.error("ERROR refreshing planet", e);
@@ -57,9 +58,12 @@
         RefreshPlanetTask task = new RefreshPlanetTask();
         task.initialize();
         
+        // start by loading config
+        PlanetConfig config = PlanetConfig.getConfig(PlanetConfig.DEFAULT, PlanetConfig.CUSTOM, PlanetConfig.JVM_PARAM);
+        
         // need to prepare and bootstrap Planet as well
-        PlanetStartup.prepare();
-        PlanetFactory.bootstrap();
+        PlanetStartup.prepare(config);
+        AggregatorFactory.bootstrap(AggregatorFactory.getDefaultProvider(config));
         
         task.run();
     }

Modified: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/core/PlanetContext.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/core/PlanetContext.java?rev=672574&r1=672573&r2=672574&view=diff
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/core/PlanetContext.java (original)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/core/PlanetContext.java Sat Jun 28 12:18:17 2008
@@ -18,17 +18,32 @@
 
 package org.apache.roller.planet.ui.core;
 
+import java.security.Principal;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import org.acegisecurity.providers.ProviderManager;
+import org.acegisecurity.providers.dao.DaoAuthenticationProvider;
+import org.acegisecurity.providers.dao.UserCache;
+import org.acegisecurity.providers.encoding.Md5PasswordEncoder;
+import org.acegisecurity.providers.encoding.PasswordEncoder;
+import org.acegisecurity.providers.encoding.ShaPasswordEncoder;
+import org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.planet.PlanetException;
 import org.apache.roller.planet.business.BootstrapException;
-import org.apache.roller.planet.business.PlanetFactory;
+import org.apache.roller.planet.business.AggregatorFactory;
+import org.apache.roller.planet.business.UserManager;
 import org.apache.roller.planet.business.startup.PlanetStartup;
 import org.apache.roller.planet.business.startup.StartupException;
+import org.apache.roller.planet.config.PlanetConfig;
+import org.apache.roller.planet.pojos.User;
+import org.springframework.context.ApplicationContext;
 import org.springframework.web.context.ContextLoaderListener;
+import org.springframework.web.context.support.WebApplicationContextUtils;
 
 
 /**
@@ -39,9 +54,14 @@
     
     private static Log log = LogFactory.getLog(PlanetContext.class);
     
+    public static final String USER_ID = "org.apache.roller.planet.USER_ID";
+    
     // reference to ServletContext object
     private static ServletContext context = null;
     
+    // reference to PlanetConfig
+    private PlanetConfig config = null;
+    
     
     public PlanetContext() {
         super();
@@ -62,22 +82,20 @@
      * Responds to context initialization event by processing context
      * paramters for easy access by the rest of the application.
      */
+    @Override
     public void contextInitialized(ServletContextEvent sce) {
         
         log.info("Roller Planet Initializing ... ");
         
         // keep a reverence to ServletContext object
-        this.context = sce.getServletContext();
+        context = sce.getServletContext();
+        
+        // First of all we are going to need our configuration
+        this.config = PlanetConfig.getConfig(PlanetConfig.DEFAULT, PlanetConfig.CUSTOM, PlanetConfig.JVM_PARAM);
         
-        // call Spring's context ContextLoaderListener to initialize
-        // all the context files specified in web.xml. This is necessary
-        // because listeners don't initialize in the order specified in
-        // 2.3 containers
-        super.contextInitialized(sce);
-                
         // Now prepare the core services of the app so we can bootstrap
         try {
-            PlanetStartup.prepare();
+            PlanetStartup.prepare(config);
         } catch (StartupException ex) {
             log.fatal("Roller Planet startup failed during app preparation", ex);
             return;
@@ -90,10 +108,10 @@
         } else {
             try {
                 // trigger bootstrapping process
-                PlanetFactory.bootstrap();
+                AggregatorFactory.bootstrap(AggregatorFactory.getDefaultProvider(config));
                 
                 // trigger initialization process
-                PlanetFactory.getPlanet().initialize();
+                AggregatorFactory.getAggregator().initialize();
                 
             } catch (BootstrapException ex) {
                 log.fatal("Roller PlanetFactory bootstrap failed", ex);
@@ -102,6 +120,17 @@
             }
         }
         
+        
+        // setup web tier
+        
+        // call Spring's context ContextLoaderListener to initialize
+        // all the context files specified in web.xml. This is necessary
+        // because listeners don't initialize in the order specified in
+        // 2.3 containers
+        super.contextInitialized(sce);
+        
+        setupSecurityFeatures();
+        
         log.info("Roller Planet Initialization Complete");
     }
     
@@ -109,7 +138,158 @@
     /** 
      * Responds to app-destroy. 
      */
+    @Override
     public void contextDestroyed(ServletContextEvent sce) {
-        PlanetFactory.getPlanet().shutdown();
+        AggregatorFactory.getAggregator().shutdown();
+    }
+    
+    
+    /**
+     * Setup Acegi security features.
+     */
+    private void setupSecurityFeatures() { 
+
+        ApplicationContext ctx =
+                WebApplicationContextUtils.getRequiredWebApplicationContext(context);
+        
+
+        String rememberMe = config.getProperty("rememberme.enabled");
+        boolean rememberMeEnabled = Boolean.valueOf(rememberMe).booleanValue();
+        
+        log.info("Remember Me enabled: " + rememberMeEnabled);
+        
+        context.setAttribute("rememberMeEnabled", rememberMe);
+        
+        if (rememberMeEnabled) {
+            ProviderManager provider = (ProviderManager) ctx.getBean("authenticationManager");
+            provider.getProviders().add(ctx.getBean("rememberMeAuthenticationProvider"));
+        }
+        
+
+        String encryptPasswords = config.getProperty("passwds.encryption.enabled");
+        boolean doEncrypt = Boolean.valueOf(encryptPasswords).booleanValue();
+        
+        if (doEncrypt) {
+            DaoAuthenticationProvider provider =
+                    (DaoAuthenticationProvider) ctx.getBean("daoAuthenticationProvider");
+            String algorithm = config.getProperty("passwds.encryption.algorithm");
+            PasswordEncoder encoder = null;
+            if (algorithm.equalsIgnoreCase("SHA")) {
+                encoder = new ShaPasswordEncoder();
+            } else if (algorithm.equalsIgnoreCase("MD5")) {
+                encoder = new Md5PasswordEncoder();
+            } else {
+                log.error("Encryption algorithm '" + algorithm +
+                        "' not supported, disabling encryption.");
+            }
+            if (encoder != null) {
+                provider.setPasswordEncoder(encoder);
+                log.info("Password Encryption Algorithm set to '" + algorithm + "'");
+            }
+        }
+        
+
+        if (config.getBooleanProperty("securelogin.enabled")) {
+            AuthenticationProcessingFilterEntryPoint entryPoint =
+                (AuthenticationProcessingFilterEntryPoint)
+                    ctx.getBean("authenticationProcessingFilterEntryPoint");
+            entryPoint.setForceHttps(true);
+        }
+                
+        /*
+        if (PlanetConfig.getBooleanProperty("schemeenforcement.enabled")) {
+            
+            ChannelProcessingFilter procfilter =
+                    (ChannelProcessingFilter)ctx.getBean("channelProcessingFilter");
+            ConfigAttributeDefinition secureDef = new ConfigAttributeDefinition();
+            secureDef.addConfigAttribute(new SecurityConfig("REQUIRES_SECURE_CHANNEL"));
+            ConfigAttributeDefinition insecureDef = new ConfigAttributeDefinition();
+            insecureDef.addConfigAttribute(new SecurityConfig("REQUIRES_INSECURE_CHANNEL"));
+            PathBasedFilterInvocationDefinitionMap defmap =
+                    (PathBasedFilterInvocationDefinitionMap)procfilter.getFilterInvocationDefinitionSource();
+            
+            // add HTTPS URL path patterns to Acegi config
+            String httpsUrlsProp = PlanetConfig.getProperty("schemeenforcement.https.urls");
+            if (httpsUrlsProp != null) {
+                String[] httpsUrls = StringUtils.stripAll(StringUtils.split(httpsUrlsProp, ",") );
+                for (int i=0; i<httpsUrls.length; i++) {
+                    defmap.addSecureUrl(httpsUrls[i], secureDef);
+                }
+            }
+            // all other action URLs are non-HTTPS
+            defmap.addSecureUrl("/**<!-- need to remove this when uncommenting -->/*.do*", insecureDef);
+        }
+        */
+    }
+    
+    
+    /**
+     * Authenticated user associated with this session.
+     */
+    public static User getAuthenticatedUser(HttpServletRequest request) {
+        
+        User authenticUser = null;
+        
+        HttpSession session = request.getSession(false);
+        if (session != null) {
+            log.debug("Http session exists, trying to extract planet user");
+
+            // lookup user from existing session data if possible
+            String userId = (String) session.getAttribute(USER_ID);
+            if (userId != null) {
+                try {
+                    UserManager mgr = AggregatorFactory.getAggregator().getUserManager();
+                    authenticUser = mgr.getUser(userId);
+                } catch (PlanetException ex) {
+                    log.warn("Error looking up authenticated user " + userId, ex);
+                }
+            }
+        }
+        
+        // if we didn't find the user from an existing session then see if we can set it up now
+        Principal principal = request.getUserPrincipal();
+        if (authenticUser == null && principal != null) {
+            log.debug("Client user id not found in session, trying lookup by request principal = " + principal);
+            try {
+                UserManager mgr = AggregatorFactory.getAggregator().getUserManager();
+                authenticUser = mgr.getUserByUserName(principal.getName());
+
+                // only set authenticated user if user is enabled
+                if (authenticUser != null &&
+                        authenticUser.getEnabled().booleanValue()) {
+                    
+                    // force session at this point
+                    session = request.getSession(true);
+                    session.setAttribute(USER_ID, authenticUser.getId());
+                }
+            } catch (PlanetException e) {
+                log.error("ERROR: getting user object", e);
+            }
+        } else {
+            log.debug("Request does not contain a principal, client is not authentic");
+        }
+
+        // Security check, if for some reason the user is not enabled
+        // then don't return the authenticated user object
+        // this can occur when an already authentic user gets changed to a disabled state
+        if (authenticUser != null && !authenticUser.getEnabled().booleanValue()) {
+            authenticUser = null;
+        }
+
+        return authenticUser;
+    }
+    
+    
+    /**
+     * Flush user from any caches maintained by security system.
+     */
+    public static void flushAuthenticationUserCache(String userName) {                                
+        ApplicationContext ctx = 
+            WebApplicationContextUtils.getRequiredWebApplicationContext(context);
+        UserCache userCache = (UserCache)ctx.getBean("userCache");
+        if (userCache != null) {
+            userCache.removeUserFromCache(userName);
+        }
     }
+    
 }

Added: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/core/filters/CharEncodingFilter.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/core/filters/CharEncodingFilter.java?rev=672574&view=auto
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/core/filters/CharEncodingFilter.java (added)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/core/filters/CharEncodingFilter.java Sat Jun 28 12:18:17 2008
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  The ASF licenses this file to You
+ * under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+
+package org.apache.roller.planet.ui.core.filters;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+
+/**
+ * Entry point filter for all requests. This filter ensures that the request 
+ * encoding is set to UTF-8 before any other processing forces request parsing 
+ * using a default encoding.
+ */
+public class CharEncodingFilter implements Filter {
+    
+    private static Log log = LogFactory.getLog(CharEncodingFilter.class);
+    
+    /**
+     * init
+     */
+    public void init(FilterConfig filterConfig) throws ServletException {
+    }
+    
+    /**
+     * destroy
+     */
+    public void destroy() {
+    }
+    
+    
+    /**
+     * Set the character encoding and sync up Struts and JSTL locales.  This filter should normally be first (and last)
+     * in the chain.
+     */
+    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
+            throws IOException, ServletException {
+        
+        log.debug("Processing CharEncodingFilter");
+        
+        try {
+            req.setCharacterEncoding("UTF-8");            
+            log.debug("Set request character encoding to UTF-8");
+            
+        } catch (UnsupportedEncodingException e) {
+            // This should never happen since UTF-8 is a Java-specified required encoding.
+            throw new ServletException("Can't set incoming encoding to UTF-8");
+        }
+        
+        chain.doFilter(req, res);
+    }
+    
+}

Modified: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/core/filters/PersistenceSessionFilter.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/core/filters/PersistenceSessionFilter.java?rev=672574&r1=672573&r2=672574&view=diff
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/core/filters/PersistenceSessionFilter.java (original)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/core/filters/PersistenceSessionFilter.java Sat Jun 28 12:18:17 2008
@@ -29,8 +29,7 @@
 import javax.servlet.http.HttpServletResponse;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.roller.planet.business.Planet;
-import org.apache.roller.planet.business.PlanetFactory;
+import org.apache.roller.planet.business.AggregatorFactory;
 
 
 /**
@@ -53,13 +52,12 @@
         
         log.debug("Entered PersistenceSessionFilter");
         
-        Planet planet = PlanetFactory.getPlanet();
         try {
             chain.doFilter(request, response);
         } finally {
             log.debug("Releasing Planet Session");
-            if (PlanetFactory.isBootstrapped()) {
-                PlanetFactory.getPlanet().release();
+            if (AggregatorFactory.isBootstrapped()) {
+                AggregatorFactory.getAggregator().release();
             }
         }
         

Added: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/core/filters/SchemeEnforcementFilter.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/core/filters/SchemeEnforcementFilter.java?rev=672574&view=auto
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/core/filters/SchemeEnforcementFilter.java (added)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/core/filters/SchemeEnforcementFilter.java Sat Jun 28 12:18:17 2008
@@ -0,0 +1,165 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+*  contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+
+package org.apache.roller.planet.ui.core.filters;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+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.apache.roller.planet.business.AggregatorFactory;
+import org.apache.roller.planet.config.PlanetConfig;
+
+
+/**
+ * The SchemeEnforcementFilter is provided for Roller sites that enable secure
+ * logins and want to ensure that only login urls are used under https.
+ */
+public class SchemeEnforcementFilter implements Filter {
+    
+    private static Log log = LogFactory.getLog(SchemeEnforcementFilter.class);
+    
+    private FilterConfig filterConfig = null;
+    
+    private boolean schemeEnforcementEnabled = false;
+    private boolean secureLoginEnabled = false;
+    private int httpPort = 80;
+    private int httpsPort = 443;
+    
+    private Set allowedUrls = new HashSet();
+    
+    
+    /**
+     * Process filter.
+     *
+     * We'll take the incoming request and first determine if this is a
+     * secure request.  If the request is secure then we'll see if it matches
+     * one of the allowed secure urls, if not then we will redirect back out
+     * of https.
+     */
+    public void doFilter(ServletRequest request, ServletResponse response,
+                        FilterChain chain)
+            throws IOException, ServletException {
+        
+        if(this.schemeEnforcementEnabled && this.secureLoginEnabled) {
+            
+            HttpServletRequest req = (HttpServletRequest) request;
+            HttpServletResponse res = (HttpServletResponse) response;
+            
+            log.debug("checking path = "+req.getServletPath());
+            
+            if(!request.isSecure() && allowedUrls.contains(req.getServletPath())) {
+                // http insecure request that should be over https
+                String redirect = "https://"+req.getServerName();
+                
+                if(this.httpsPort != 443)
+                    redirect += ":"+this.httpsPort;
+                
+                redirect += req.getRequestURI();
+                
+                if(req.getQueryString() != null)
+                    redirect += "?"+req.getQueryString();
+                
+                log.debug("Redirecting to "+redirect);
+                res.sendRedirect(redirect);
+                return;
+                
+            } else if(request.isSecure() && !allowedUrls.contains(req.getServletPath())) {
+                // https secure request that should be over http
+                String redirect = "http://"+req.getServerName();
+                
+                if(this.httpPort != 80)
+                    redirect += ":"+this.httpPort;
+                
+                redirect += req.getRequestURI();
+                
+                if(req.getQueryString() != null)
+                    redirect += "?"+req.getQueryString();
+                
+                log.debug("Redirecting to "+redirect);
+                res.sendRedirect(redirect);
+                return;
+            }
+        }
+        
+        chain.doFilter(request, response);
+    }
+    
+    
+    public void destroy() {}
+    
+    
+    /**
+     * Filter init.
+     *
+     * We are just collecting init properties which we'll use for each request.
+     */
+    public void init(FilterConfig filterConfig) {
+        this.filterConfig = filterConfig;
+        
+        PlanetConfig config = AggregatorFactory.getAggregator().getConfig();
+        
+        // determine if we are doing scheme enforcement
+        this.schemeEnforcementEnabled = 
+                config.getBooleanProperty("schemeenforcement.enabled");
+        this.secureLoginEnabled = 
+                config.getBooleanProperty("securelogin.enabled");
+        
+        if(this.schemeEnforcementEnabled && this.secureLoginEnabled) {
+            // gather some more properties
+            String http_port = 
+                    config.getProperty("securelogin.http.port");
+            String https_port = 
+                    config.getProperty("securelogin.https.port");
+            
+            try {
+                this.httpPort = Integer.parseInt(http_port);
+                this.httpsPort = Integer.parseInt(https_port);
+            } catch(NumberFormatException nfe) {
+                // ignored ... guess we'll have to use the defaults
+                log.warn("error with secure login ports", nfe);
+            }
+            
+            // finally, construct our list of allowable https urls
+            String urls = 
+                    config.getProperty("schemeenforcement.https.urls");
+            String[] urlsArray = urls.split(",");
+            for(int i=0; i < urlsArray.length; i++)
+                this.allowedUrls.add(urlsArray[i]);
+            
+            // some logging for the curious
+            log.info("Scheme enforcement = enabled");
+            if(log.isDebugEnabled()) {
+                log.debug("allowed urls are:");
+                for(Iterator it = this.allowedUrls.iterator(); it.hasNext();)
+                    log.debug(it.next());
+            }
+        }
+    }
+    
+}

Added: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/core/security/RollerUserDetailsService.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/core/security/RollerUserDetailsService.java?rev=672574&view=auto
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/core/security/RollerUserDetailsService.java (added)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/core/security/RollerUserDetailsService.java Sat Jun 28 12:18:17 2008
@@ -0,0 +1,53 @@
+
+package org.apache.roller.planet.ui.core.security;
+
+import java.util.Iterator;
+import org.acegisecurity.GrantedAuthority;
+import org.acegisecurity.GrantedAuthorityImpl;
+import org.acegisecurity.userdetails.UserDetails;
+import org.acegisecurity.userdetails.UserDetailsService;
+import org.acegisecurity.userdetails.UsernameNotFoundException;
+import org.apache.roller.planet.PlanetException;
+import org.apache.roller.planet.business.Aggregator;
+import org.apache.roller.planet.business.AggregatorFactory;
+import org.apache.roller.planet.business.UserManager;
+import org.apache.roller.planet.pojos.User;
+import org.apache.roller.planet.pojos.UserRole;
+import org.springframework.dao.DataAccessException;
+import org.springframework.dao.DataRetrievalFailureException;
+
+
+/**
+ * Acegi user details service implemented using Aggregator API.
+ */
+public class RollerUserDetailsService implements UserDetailsService {
+
+    public UserDetails loadUserByUsername(String userName) 
+        throws UsernameNotFoundException, DataAccessException {
+        
+        User userData = null;
+        try {
+            Aggregator roller = AggregatorFactory.getAggregator();
+            UserManager umgr = roller.getUserManager();
+            userData = umgr.getUserByUserName(userName, Boolean.TRUE); 
+        } catch (PlanetException ex) {
+            throw new DataRetrievalFailureException("ERROR in user lookup", ex);
+        } 
+        
+        if (userData == null) {
+            throw new UsernameNotFoundException("ERROR no user: " + userName);
+        }
+        
+        GrantedAuthority[] authorities = 
+            new GrantedAuthorityImpl[userData.getRoles().size()];
+        int i = 0;
+        for (Iterator it = userData.getRoles().iterator(); it.hasNext();) {
+            UserRole role = (UserRole)it.next();
+            authorities[i++] = new GrantedAuthorityImpl(role.getRole());
+        }
+        
+        return new org.acegisecurity.userdetails.User(
+            userData.getUserName(), userData.getPassword(), true, authorities);
+    }
+    
+}

Modified: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/MultiPlanetRequestMapper.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/MultiPlanetRequestMapper.java?rev=672574&r1=672573&r2=672574&view=diff
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/MultiPlanetRequestMapper.java (original)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/MultiPlanetRequestMapper.java Sat Jun 28 12:18:17 2008
@@ -27,7 +27,7 @@
 import javax.servlet.http.HttpServletResponse;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.roller.planet.business.PlanetFactory;
+import org.apache.roller.planet.business.AggregatorFactory;
 import org.apache.roller.planet.business.PlanetManager;
 import org.apache.roller.planet.config.PlanetConfig;
 import org.apache.roller.planet.pojos.Planet;
@@ -59,7 +59,7 @@
         
         // build roller restricted list
         String restrictList = 
-                PlanetConfig.getProperty("rendering.multiPlanetMapper.rollerProtectedUrls");
+                AggregatorFactory.getAggregator().getConfig().getProperty("rendering.multiPlanetMapper.rollerProtectedUrls");
         if(restrictList != null && restrictList.trim().length() > 0) {
             String[] restrict = restrictList.split(",");
             for(int i=0; i < restrict.length; i++) {
@@ -69,7 +69,7 @@
         
         // add user restricted list
         restrictList = 
-                PlanetConfig.getProperty("rendering.multiPlanetMapper.userProtectedUrls");
+                AggregatorFactory.getAggregator().getConfig().getProperty("rendering.multiPlanetMapper.userProtectedUrls");
         if(restrictList != null && restrictList.trim().length() > 0) {
             String[] restrict = restrictList.split(",");
             for(int i=0; i < restrict.length; i++) {
@@ -270,7 +270,7 @@
         boolean isPlanet = false;
         
         try {
-            PlanetManager mgr = PlanetFactory.getPlanet().getPlanetManager();
+            PlanetManager mgr = AggregatorFactory.getAggregator().getPlanetManager();
             Planet planet = mgr.getPlanet(planetHandle);
             
             if(planet != null) {

Modified: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/RendererManager.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/RendererManager.java?rev=672574&r1=672573&r2=672574&view=diff
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/RendererManager.java (original)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/RendererManager.java Sat Jun 28 12:18:17 2008
@@ -23,7 +23,7 @@
 import java.util.Set;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.roller.planet.config.PlanetConfig;
+import org.apache.roller.planet.business.AggregatorFactory;
 import org.apache.roller.planet.pojos.Template;
 import org.apache.roller.planet.ui.rendering.Renderer;
 import org.apache.roller.planet.ui.rendering.RendererFactory;
@@ -48,8 +48,8 @@
     
     static {
         // lookup set of renderer factories we are going to use
-        String rollerFactories = PlanetConfig.getProperty("rendering.rollerRendererFactories");
-        String userFactories = PlanetConfig.getProperty("rendering.userRendererFactories");
+        String rollerFactories = AggregatorFactory.getAggregator().getConfig().getProperty("rendering.rollerRendererFactories");
+        String userFactories = AggregatorFactory.getAggregator().getConfig().getProperty("rendering.userRendererFactories");
         
         // instantiate user defined renderer factory classes
         if(userFactories != null && userFactories.trim().length() > 0) {

Modified: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/filters/RequestMappingFilter.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/filters/RequestMappingFilter.java?rev=672574&r1=672573&r2=672574&view=diff
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/filters/RequestMappingFilter.java (original)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/filters/RequestMappingFilter.java Sat Jun 28 12:18:17 2008
@@ -32,7 +32,7 @@
 import javax.servlet.http.HttpServletResponse;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.roller.planet.config.PlanetConfig;
+import org.apache.roller.planet.business.AggregatorFactory;
 import org.apache.roller.planet.ui.rendering.RequestMapper;
 
 
@@ -53,8 +53,8 @@
     public void init(FilterConfig filterConfig) {
         
         // lookup set of request mappers we are going to use
-        String rollerMappers = PlanetConfig.getProperty("rendering.rollerRequestMappers");
-        String userMappers = PlanetConfig.getProperty("rendering.userRequestMappers");
+        String rollerMappers = AggregatorFactory.getAggregator().getConfig().getProperty("rendering.rollerRequestMappers");
+        String userMappers = AggregatorFactory.getAggregator().getConfig().getProperty("rendering.userRequestMappers");
         
         // instantiate user defined request mapper classes
         if(userMappers != null && userMappers.trim().length() > 0) {

Modified: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/FeedModel.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/FeedModel.java?rev=672574&r1=672573&r2=672574&view=diff
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/FeedModel.java (original)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/FeedModel.java Sat Jun 28 12:18:17 2008
@@ -22,12 +22,10 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.planet.PlanetException;
-import org.apache.roller.planet.pojos.Planet;
-import org.apache.roller.planet.pojos.PlanetGroup;
 import org.apache.roller.planet.ui.rendering.pagers.Pager;
 import org.apache.roller.planet.ui.rendering.pagers.PlanetEntriesPager;
 import org.apache.roller.planet.ui.rendering.util.PlanetGroupFeedRequest;
-import org.apache.roller.planet.ui.rendering.util.PlanetRequest;
+import org.apache.roller.planet.ui.rendering.util.PlanetGroupRequest;
 import org.apache.roller.planet.util.URLUtilities;
 
 
@@ -53,6 +51,7 @@
     /** 
      * Template context name to be used for model.
      */
+    @Override
     public String getModelName() {
         return "model";
     }
@@ -61,24 +60,25 @@
     /** 
      * Init page model based on request. 
      */
+    @Override
     public void init(Map initData) throws PlanetException {
         
         // parent gets to go first
         super.init(initData);
         
         // we expect the init data to contain a weblogRequest object
-        PlanetRequest planetRequest = (PlanetRequest) initData.get("planetRequest");
-        if(planetRequest == null) {
-            throw new PlanetException("expected planetRequest from init data");
+        PlanetGroupRequest pgRequest = (PlanetGroupRequest) initData.get("parsedRequest");
+        if(pgRequest == null) {
+            throw new PlanetException("expected parsedRequest from init data");
         }
         
         // PageModel only works on page requests, so cast planetRequest
         // into a PlanetRequest and if it fails then throw exception
-        if(planetRequest instanceof PlanetGroupFeedRequest) {
-            this.feedRequest = (PlanetGroupFeedRequest) planetRequest;
+        if(pgRequest instanceof PlanetGroupFeedRequest) {
+            this.feedRequest = (PlanetGroupFeedRequest) pgRequest;
         } else {
-            throw new PlanetException("weblogRequest is not a WeblogPageRequest."+
-                    "  PageModel only supports page requests.");
+            throw new PlanetException("parsedRequest is not a PlanetGroupFeedRequest."+
+                    "  FeedModel only supports feed requests.");
         }
     }
     

Modified: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/PageModel.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/PageModel.java?rev=672574&r1=672573&r2=672574&view=diff
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/PageModel.java (original)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/PageModel.java Sat Jun 28 12:18:17 2008
@@ -22,12 +22,10 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.planet.PlanetException;
-import org.apache.roller.planet.pojos.Planet;
-import org.apache.roller.planet.pojos.PlanetGroup;
 import org.apache.roller.planet.ui.rendering.pagers.Pager;
 import org.apache.roller.planet.ui.rendering.pagers.PlanetEntriesPager;
 import org.apache.roller.planet.ui.rendering.util.PlanetGroupPageRequest;
-import org.apache.roller.planet.ui.rendering.util.PlanetRequest;
+import org.apache.roller.planet.ui.rendering.util.PlanetGroupRequest;
 import org.apache.roller.planet.util.URLUtilities;
 
 
@@ -52,6 +50,7 @@
     /** 
      * Template context name to be used for model.
      */
+    @Override
     public String getModelName() {
         return "model";
     }
@@ -60,23 +59,24 @@
     /** 
      * Init page model based on request. 
      */
+    @Override
     public void init(Map initData) throws PlanetException {
         
         // parent gets to go first
         super.init(initData);
         
-        // we expect the init data to contain a weblogRequest object
-        PlanetRequest planetRequest = (PlanetRequest) initData.get("planetRequest");
-        if(planetRequest == null) {
-            throw new PlanetException("expected planetRequest from init data");
+        // we expect the init data to contain a parsedRequest object
+        PlanetGroupRequest pgRequest = (PlanetGroupRequest) initData.get("parsedRequest");
+        if(pgRequest == null) {
+            throw new PlanetException("expected parsedRequest from init data");
         }
         
         // PageModel only works on page requests, so cast planetRequest
         // into a PlanetRequest and if it fails then throw exception
-        if(planetRequest instanceof PlanetGroupPageRequest) {
-            this.pageRequest = (PlanetGroupPageRequest) planetRequest;
+        if(pgRequest instanceof PlanetGroupPageRequest) {
+            this.pageRequest = (PlanetGroupPageRequest) pgRequest;
         } else {
-            throw new PlanetException("weblogRequest is not a WeblogPageRequest."+
+            throw new PlanetException("parsedRequest is not a PlanetGroupPageRequest."+
                     "  PageModel only supports page requests.");
         }
     }

Modified: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/PlanetGroupModel.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/PlanetGroupModel.java?rev=672574&r1=672573&r2=672574&view=diff
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/PlanetGroupModel.java (original)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/PlanetGroupModel.java Sat Jun 28 12:18:17 2008
@@ -25,7 +25,6 @@
 import org.apache.roller.planet.pojos.Planet;
 import org.apache.roller.planet.pojos.PlanetGroup;
 import org.apache.roller.planet.ui.rendering.util.PlanetGroupRequest;
-import org.apache.roller.planet.ui.rendering.util.PlanetRequest;
 
 
 /**
@@ -60,18 +59,18 @@
      */
     public void init(Map initData) throws PlanetException {
         
-        // we expect the init data to contain a planetRequest object
-        PlanetRequest planetRequest = (PlanetRequest) initData.get("planetRequest");
-        if(planetRequest == null) {
-            throw new PlanetException("expected planetRequest from init data");
+        // we expect the init data to contain a parsedRequest object
+        PlanetGroupRequest pgRequest = (PlanetGroupRequest) initData.get("parsedRequest");
+        if(pgRequest == null) {
+            throw new PlanetException("expected parsedRequest from init data");
         }
         
-        // only works on planet group requests, so cast planetRequest
+        // only works on planet group requests, so cast parsedRequest
         // into a PlanetGroupRequest and if it fails then throw exception
-        if(planetRequest instanceof PlanetGroupRequest) {
-            this.planetGroupRequest = (PlanetGroupRequest) planetRequest;
+        if(pgRequest instanceof PlanetGroupRequest) {
+            this.planetGroupRequest = (PlanetGroupRequest) pgRequest;
         } else {
-            throw new PlanetException("planetRequest is not a PlanetGroupRequest."+
+            throw new PlanetException("parsedRequest is not a PlanetGroupRequest."+
                     "  PlanetGroupModel only supports planet group requests.");
         }
         

Modified: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/PlanetURLModel.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/PlanetURLModel.java?rev=672574&r1=672573&r2=672574&view=diff
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/PlanetURLModel.java (original)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/PlanetURLModel.java Sat Jun 28 12:18:17 2008
@@ -22,11 +22,10 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.planet.PlanetException;
-import org.apache.roller.planet.business.PlanetFactory;
+import org.apache.roller.planet.business.AggregatorFactory;
 import org.apache.roller.planet.business.URLStrategy;
-import org.apache.roller.planet.config.PlanetRuntimeConfig;
 import org.apache.roller.planet.pojos.Planet;
-import org.apache.roller.planet.ui.rendering.util.PlanetRequest;
+import org.apache.roller.planet.ui.rendering.util.PlanetGroupRequest;
 
 
 /**
@@ -59,20 +58,20 @@
     public void init(Map initData) throws PlanetException {
         
         // grab a reference to the url strategy
-        this.urlStrategy = PlanetFactory.getPlanet().getURLStrategy();
+        this.urlStrategy = AggregatorFactory.getAggregator().getURLStrategy();
         
         // need a weblog request so that we can know the weblog and locale
-        PlanetRequest planetRequest = (PlanetRequest) initData.get("planetRequest");
-        if(planetRequest == null) {
-            throw new PlanetException("Expected 'planetRequest' init param!");
+        PlanetGroupRequest parsedRequest = (PlanetGroupRequest) initData.get("parsedRequest");
+        if(parsedRequest == null) {
+            throw new PlanetException("Expected 'parsedRequest' init param!");
         }
         
-        this.planet = planetRequest.getPlanet();
+        this.planet = parsedRequest.getPlanet();
     }
     
     
     public String getSite() {
-        return PlanetRuntimeConfig.getProperty("site.absoluteurl");
+        return AggregatorFactory.getAggregator().getConfig().getProperty("site.absoluteurl");
     }
     
         
@@ -80,6 +79,9 @@
         return urlStrategy.getPlanetURL(planet.getHandle());
     }
     
+    public String planet(String planetHandle) {
+        return this.urlStrategy.getPlanetURL(planetHandle);
+    }
     
     public String group(String groupHandle) {
         return urlStrategy.getPlanetGroupURL(planet.getHandle(), groupHandle, -1);

Added: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/RequestContextModel.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/RequestContextModel.java?rev=672574&view=auto
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/RequestContextModel.java (added)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/RequestContextModel.java Sat Jun 28 12:18:17 2008
@@ -0,0 +1,63 @@
+
+package org.apache.roller.planet.ui.rendering.model;
+
+import java.util.Map;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.roller.planet.PlanetException;
+import org.apache.roller.planet.pojos.User;
+import org.apache.roller.planet.ui.rendering.util.ParsedRequest;
+
+
+/**
+ * A Model which provides access to contextual information about the context
+ * of the request.
+ *
+ * @author ag92114
+ */
+public class RequestContextModel implements Model {
+    
+    private static Log log = LogFactory.getLog(RequestContextModel.class);
+    
+    private ParsedRequest parsedRequest = null;
+    
+    
+    /** 
+     * Creates an un-initialized new instance.
+     */
+    public RequestContextModel() {}
+    
+    
+    /** 
+     * Template context name to be used for model.
+     */
+    public String getModelName() {
+        return "request";
+    }
+    
+    
+    /** 
+     * Init page model based on request. 
+     */
+    public void init(Map initData) throws PlanetException {
+        
+        // we expect a parsed request
+        if(initData.containsKey("parsedRequest")) {
+            this.parsedRequest = (ParsedRequest) initData.get("parsedRequest");
+        }
+    }
+    
+    
+    public boolean isLoggedIn() {
+        return parsedRequest.isLoggedIn();
+    }
+    
+    public String getAuthenticatedUserName() {
+        return parsedRequest.getAuthenticUserName();
+    }
+    
+    public User getAuthenticatedUser() {
+        return parsedRequest.getAuthenticUser();
+    }
+    
+}

Modified: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/SiteModel.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/SiteModel.java?rev=672574&r1=672573&r2=672574&view=diff
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/SiteModel.java (original)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/SiteModel.java Sat Jun 28 12:18:17 2008
@@ -23,9 +23,8 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.planet.PlanetException;
-import org.apache.roller.planet.business.PlanetFactory;
+import org.apache.roller.planet.business.AggregatorFactory;
 import org.apache.roller.planet.business.PlanetManager;
-import org.apache.roller.planet.config.PlanetRuntimeConfig;
 
 
 /**
@@ -59,12 +58,12 @@
     
     
     public String getTitle() {
-        return PlanetRuntimeConfig.getProperty("site.name");
+        return AggregatorFactory.getAggregator().getConfig().getProperty("site.name");
     }
     
     
     public String getDescription() {
-        return PlanetRuntimeConfig.getProperty("site.description");
+        return AggregatorFactory.getAggregator().getConfig().getProperty("site.description");
     }
     
     
@@ -72,7 +71,7 @@
      * Get the list of all planets.
      */
     public List getPlanets() {
-        PlanetManager pMgr = PlanetFactory.getPlanet().getPlanetManager();
+        PlanetManager pMgr = AggregatorFactory.getAggregator().getPlanetManager();
         try {
             return pMgr.getPlanets();
         } catch(Exception e) {

Modified: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/SiteURLModel.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/SiteURLModel.java?rev=672574&r1=672573&r2=672574&view=diff
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/SiteURLModel.java (original)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/SiteURLModel.java Sat Jun 28 12:18:17 2008
@@ -22,11 +22,8 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.planet.PlanetException;
-import org.apache.roller.planet.business.PlanetFactory;
+import org.apache.roller.planet.business.AggregatorFactory;
 import org.apache.roller.planet.business.URLStrategy;
-import org.apache.roller.planet.config.PlanetRuntimeConfig;
-import org.apache.roller.planet.pojos.Planet;
-import org.apache.roller.planet.ui.rendering.util.PlanetRequest;
 
 
 /**
@@ -58,12 +55,12 @@
     public void init(Map initData) throws PlanetException {
         
         // grab a reference to the url strategy
-        this.urlStrategy = PlanetFactory.getPlanet().getURLStrategy();
+        this.urlStrategy = AggregatorFactory.getAggregator().getURLStrategy();
     }
     
     
     public String getSite() {
-        return PlanetRuntimeConfig.getProperty("site.absoluteurl");
+        return AggregatorFactory.getAggregator().getConfig().getProperty("site.absoluteurl");
     }
     
     

Modified: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/UtilitiesModel.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/UtilitiesModel.java?rev=672574&r1=672573&r2=672574&view=diff
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/UtilitiesModel.java (original)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/model/UtilitiesModel.java Sat Jun 28 12:18:17 2008
@@ -33,8 +33,8 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.planet.PlanetException;
-import org.apache.roller.util.DateUtil;
-import org.apache.roller.util.RegexUtil;
+import org.apache.roller.planet.util.DateUtil;
+import org.apache.roller.planet.util.RegexUtil;
 import org.apache.roller.planet.util.Utilities;
 
 

Modified: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/pagers/PlanetEntriesPager.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/pagers/PlanetEntriesPager.java?rev=672574&r1=672573&r2=672574&view=diff
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/pagers/PlanetEntriesPager.java (original)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/pagers/PlanetEntriesPager.java Sat Jun 28 12:18:17 2008
@@ -26,7 +26,7 @@
 import java.util.List;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.roller.planet.business.PlanetFactory;
+import org.apache.roller.planet.business.AggregatorFactory;
 import org.apache.roller.planet.business.PlanetManager;
 import org.apache.roller.planet.pojos.SubscriptionEntry;
 import org.apache.roller.planet.pojos.PlanetGroup;
@@ -42,6 +42,7 @@
     
     private String feedURL = null;
     private PlanetGroup group = null;
+    private String locale = null;
     private int sinceDays = -1;
     private int length = 0;
     
@@ -64,6 +65,7 @@
         
         this.feedURL = feedURL;
         this.group = group;
+        this.locale = locale;
         this.sinceDays = sinceDays;
         this.length = length;
         
@@ -88,7 +90,7 @@
             
             List results = new ArrayList();
             try {
-                PlanetManager planetManager = PlanetFactory.getPlanet().getPlanetManager();
+                PlanetManager planetManager = AggregatorFactory.getAggregator().getPlanetManager();
                 
                 List rawEntries = null;
                 if (feedURL != null) {
@@ -104,16 +106,15 @@
                 }
                 
                 // check if there are more results for paging
-                if(rawEntries.size() > length) {
-                    more = true;
-                    rawEntries.remove(rawEntries.size() - 1);
-                }
-                
-                // wrap 'em
-                for (Iterator it = rawEntries.iterator(); it.hasNext();) {
-                    SubscriptionEntry entry = (SubscriptionEntry) it.next();
-                    // TODO needs pojo wrapping from planet
-                    results.add(entry);
+                // now we need to go through each entry and wrap
+                int count = 0;
+                for (int i = 0; i < rawEntries.size(); i++) {
+                    if (count++ < length) {
+                        // TODO: pojo wrapping wrapped.add(i, WeblogEntryWrapper.wrap((WeblogEntry) unwrapped.get(i), urlStrategy));
+                        results.add(i, rawEntries.get(i));
+                    } else {
+                        more = true;
+                    }
                 }
                 
             } catch (Exception e) {

Modified: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/servlets/FeedServlet.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/servlets/FeedServlet.java?rev=672574&r1=672573&r2=672574&view=diff
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/servlets/FeedServlet.java (original)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/servlets/FeedServlet.java Sat Jun 28 12:18:17 2008
@@ -29,7 +29,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.planet.PlanetException;
-import org.apache.roller.planet.config.PlanetConfig;
+import org.apache.roller.planet.business.AggregatorFactory;
 import org.apache.roller.planet.pojos.Planet;
 import org.apache.roller.planet.pojos.PlanetGroup;
 import org.apache.roller.planet.pojos.StaticTemplate;
@@ -38,6 +38,8 @@
 import org.apache.roller.planet.ui.rendering.RendererManager;
 import org.apache.roller.planet.ui.rendering.model.ModelLoader;
 import org.apache.roller.planet.ui.rendering.util.PlanetGroupFeedRequest;
+import org.apache.roller.planet.ui.rendering.util.cache.FeedCache;
+import org.apache.roller.planet.util.cache.CachedContent;
 
 
 /**
@@ -46,22 +48,36 @@
 public class FeedServlet extends HttpServlet {
 
     private static Log log = LogFactory.getLog(FeedServlet.class);
-
-
+    
+    // feed cache
+    private FeedCache feedCache = null;
+    
+    
     /**
      * Init method for this servlet
      */
+    @Override
     public void init(ServletConfig servletConfig) throws ServletException {
 
         super.init(servletConfig);
 
         log.info("Initializing FeedServlet");
+        
+        // get a reference to the feed cache
+        feedCache = FeedCache.getInstance();
     }
 
-
+    
+    @Override
+    public void destroy() {
+        log.info("Destroying FeedServlet");
+    }
+    
+    
     /**
      * Handle GET requests for weblog feeds.
      */
+    @Override
     public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
 
@@ -73,7 +89,7 @@
         PlanetGroupFeedRequest feedRequest = null;
         try {
             // parse the incoming request and extract the relevant data
-            feedRequest = new PlanetGroupFeedRequest(request);
+            feedRequest = getParsedRequest(request);
             
             planet = feedRequest.getPlanet();
             if(planet == null) {
@@ -93,7 +109,7 @@
             response.sendError(HttpServletResponse.SC_NOT_FOUND);
             return;
         }
-
+        
         // set content type
         String accepts = request.getHeader("Accept");
         String userAgent = request.getHeader("User-Agent");
@@ -110,15 +126,30 @@
         }
         
         
+        // see if we have this feed cached
+        String cacheKey = feedCache.generateKey(feedRequest);
+        CachedContent cachedContent = (CachedContent) feedCache.get(cacheKey);
+        if(cachedContent != null) {
+            log.debug("HIT "+cacheKey);
+
+            response.setContentLength(cachedContent.getContent().length);
+            response.getOutputStream().write(cachedContent.getContent());
+            return;
+
+        } else {
+            log.debug("MISS "+cacheKey);
+        }
+        
+        
         // looks like we need to render content
         HashMap model = new HashMap();
         try {
             // populate the rendering model
             Map initData = new HashMap();
-            initData.put("planetRequest", feedRequest);
+            initData.put("parsedRequest", feedRequest);
             
             // Load models for feeds
-            String feedModels = PlanetConfig.getProperty("rendering.feedModels");
+            String feedModels = AggregatorFactory.getAggregator().getConfig().getProperty("rendering.feedModels");
             ModelLoader.loadModels(feedModels, model, initData, true);
 
         } catch (PlanetException ex) {
@@ -153,9 +184,14 @@
         }
 
         // render content.  use default size of about 24K for a standard page
+        CachedContent rendererOutput = new CachedContent(24567);
         try {
             log.debug("Doing rendering");
-            renderer.render(model, response.getWriter());
+            renderer.render(model, rendererOutput.getCachedWriter());
+            
+            // flush rendered output and close
+            rendererOutput.flush();
+            rendererOutput.close();
         } catch(Exception e) {
             // bummer, error during rendering
             log.error("Error during rendering for group-atom.vm", e);
@@ -170,10 +206,34 @@
 
         // flush rendered content to response
         log.debug("Flushing response output");
-        //response.setContentLength(rendererOutput.getContent().length);
-        //response.getOutputStream().write(rendererOutput.getContent());
+        response.setContentLength(rendererOutput.getContent().length);
+        response.getOutputStream().write(rendererOutput.getContent());
+
+        // cache rendered content.
+        log.debug("PUT "+cacheKey);
+        feedCache.put(cacheKey, rendererOutput);
 
         log.debug("Exiting");
     }
+    
+    
+    private PlanetGroupFeedRequest getParsedRequest(HttpServletRequest request) 
+            throws Exception {
 
+        PlanetGroupFeedRequest parsedRequest = new PlanetGroupFeedRequest(request.getPathInfo());
+        
+        java.security.Principal prince = request.getUserPrincipal();
+        if (prince != null) {
+            // TODO: this should actually just be a permission check
+            // for now just make sure the user has a local account
+            parsedRequest.setAuthenticUserName(prince.getName());
+            if(parsedRequest.getAuthenticUser() == null) {
+                // not a local user
+                parsedRequest.setAuthenticUserName(null);
+            }
+        }
+
+        return parsedRequest;
+    }
+    
 }

Modified: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/servlets/HomepageServlet.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/servlets/HomepageServlet.java?rev=672574&r1=672573&r2=672574&view=diff
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/servlets/HomepageServlet.java (original)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/servlets/HomepageServlet.java Sat Jun 28 12:18:17 2008
@@ -29,15 +29,13 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.planet.PlanetException;
-import org.apache.roller.planet.config.PlanetConfig;
-import org.apache.roller.planet.pojos.Planet;
-import org.apache.roller.planet.pojos.PlanetGroup;
+import org.apache.roller.planet.business.AggregatorFactory;
 import org.apache.roller.planet.pojos.StaticTemplate;
 import org.apache.roller.planet.pojos.Template;
 import org.apache.roller.planet.ui.rendering.Renderer;
 import org.apache.roller.planet.ui.rendering.RendererManager;
 import org.apache.roller.planet.ui.rendering.model.ModelLoader;
-import org.apache.roller.planet.ui.rendering.util.PlanetGroupPageRequest;
+import org.apache.roller.planet.ui.rendering.util.HomepageRequest;
 
 
 /**
@@ -51,6 +49,7 @@
     /**
      * Init method for this servlet
      */
+    @Override
     public void init(ServletConfig servletConfig) throws ServletException {
 
         super.init(servletConfig);
@@ -62,11 +61,24 @@
     /**
      * Handle GET requests for weblog feeds.
      */
+    @Override
     public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
 
         log.debug("Entering");
-
+        
+        HomepageRequest homeRequest;
+        try {
+            // parse the incoming request and extract the relevant data
+            homeRequest = getParsedRequest(request);
+            
+        } catch(Exception e) {
+            // invalid request
+            log.debug("error creating homepage request", e);
+            response.sendError(HttpServletResponse.SC_NOT_FOUND);
+            return;
+        }
+        
         // set content type
         response.setContentType("text/html; charset=utf-8");
         
@@ -77,8 +89,11 @@
             // populate the rendering model
             Map initData = new HashMap();
             
+            // parsed request
+            initData.put("parsedRequest", homeRequest);
+        
             // Load models for pages
-            String models = PlanetConfig.getProperty("rendering.homepageModels");
+            String models = AggregatorFactory.getAggregator().getConfig().getProperty("rendering.homepageModels");
             ModelLoader.loadModels(models, model, initData, true);
 
         } catch (PlanetException ex) {
@@ -133,5 +148,25 @@
 
         log.debug("Exiting");
     }
+    
+    
+    private HomepageRequest getParsedRequest(HttpServletRequest request) 
+            throws Exception {
 
+        HomepageRequest parsedRequest = new HomepageRequest(request.getPathInfo());
+        
+        java.security.Principal prince = request.getUserPrincipal();
+        if (prince != null) {
+            // TODO: this should actually just be a permission check
+            // for now just make sure the user has a local account
+            parsedRequest.setAuthenticUserName(prince.getName());
+            if(parsedRequest.getAuthenticUser() == null) {
+                // not a local user
+                parsedRequest.setAuthenticUserName(null);
+            }
+        }
+
+        return parsedRequest;
+    }
+    
 }

Modified: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/servlets/OpmlServlet.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/servlets/OpmlServlet.java?rev=672574&r1=672573&r2=672574&view=diff
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/servlets/OpmlServlet.java (original)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/servlets/OpmlServlet.java Sat Jun 28 12:18:17 2008
@@ -29,7 +29,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.planet.PlanetException;
-import org.apache.roller.planet.config.PlanetConfig;
+import org.apache.roller.planet.business.AggregatorFactory;
 import org.apache.roller.planet.pojos.Planet;
 import org.apache.roller.planet.pojos.PlanetGroup;
 import org.apache.roller.planet.pojos.StaticTemplate;
@@ -38,6 +38,8 @@
 import org.apache.roller.planet.ui.rendering.RendererManager;
 import org.apache.roller.planet.ui.rendering.model.ModelLoader;
 import org.apache.roller.planet.ui.rendering.util.PlanetGroupOpmlRequest;
+import org.apache.roller.planet.ui.rendering.util.cache.FeedCache;
+import org.apache.roller.planet.util.cache.CachedContent;
 
 
 /**
@@ -47,21 +49,28 @@
 
     private static Log log = LogFactory.getLog(OpmlServlet.class);
 
-
+    private FeedCache feedCache = null;
+    
+    
     /**
      * Init method for this servlet
      */
+    @Override
     public void init(ServletConfig servletConfig) throws ServletException {
 
         super.init(servletConfig);
 
         log.info("Initializing OpmlServlet");
+        
+        // get a reference to the feed cache
+        feedCache = FeedCache.getInstance();
     }
 
 
     /**
      * Handle GET requests for weblog feeds.
      */
+    @Override
     public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
 
@@ -73,7 +82,7 @@
         PlanetGroupOpmlRequest opmlRequest = null;
         try {
             // parse the incoming request and extract the relevant data
-            opmlRequest = new PlanetGroupOpmlRequest(request);
+            opmlRequest = getParsedRequest(request);
 
             planet = opmlRequest.getPlanet();
             if(planet == null) {
@@ -98,15 +107,30 @@
         response.setContentType("application/xml; charset=utf-8");
         
         
+        // see if we have this feed cached
+        String cacheKey = feedCache.generateKey(opmlRequest);
+        CachedContent cachedContent = (CachedContent) feedCache.get(cacheKey);
+        if(cachedContent != null) {
+            log.debug("HIT "+cacheKey);
+
+            response.setContentLength(cachedContent.getContent().length);
+            response.getOutputStream().write(cachedContent.getContent());
+            return;
+
+        } else {
+            log.debug("MISS "+cacheKey);
+        }
+        
+        
         // looks like we need to render content
         HashMap model = new HashMap();
         try {
             // populate the rendering model
             Map initData = new HashMap();
-            initData.put("planetRequest", opmlRequest);
+            initData.put("parsedRequest", opmlRequest);
             
             // Load models for feeds
-            String opmlModels = PlanetConfig.getProperty("rendering.opmlModels");
+            String opmlModels = AggregatorFactory.getAggregator().getConfig().getProperty("rendering.opmlModels");
             ModelLoader.loadModels(opmlModels, model, initData, true);
 
         } catch (PlanetException ex) {
@@ -133,9 +157,14 @@
         }
 
         // render content.  use default size of about 24K for a standard page
+        CachedContent rendererOutput = new CachedContent(24567);
         try {
             log.debug("Doing rendering");
-            renderer.render(model, response.getWriter());
+            renderer.render(model, rendererOutput.getCachedWriter());
+            
+            // flush rendered output and close
+            rendererOutput.flush();
+            rendererOutput.close();
         } catch(Exception e) {
             // bummer, error during rendering
             log.error("Error during rendering for opml.vm", e);
@@ -150,10 +179,34 @@
 
         // flush rendered content to response
         log.debug("Flushing response output");
-        //response.setContentLength(rendererOutput.getContent().length);
-        //response.getOutputStream().write(rendererOutput.getContent());
+        response.setContentLength(rendererOutput.getContent().length);
+        response.getOutputStream().write(rendererOutput.getContent());
+
+        // cache rendered content.
+        log.debug("PUT "+cacheKey);
+        feedCache.put(cacheKey, rendererOutput);
 
         log.debug("Exiting");
     }
+    
+    
+    private PlanetGroupOpmlRequest getParsedRequest(HttpServletRequest request) 
+            throws Exception {
 
+        PlanetGroupOpmlRequest parsedRequest = new PlanetGroupOpmlRequest(request.getPathInfo());
+        
+        java.security.Principal prince = request.getUserPrincipal();
+        if (prince != null) {
+            // TODO: this should actually just be a permission check
+            // for now just make sure the user has a local account
+            parsedRequest.setAuthenticUserName(prince.getName());
+            if(parsedRequest.getAuthenticUser() == null) {
+                // not a local user
+                parsedRequest.setAuthenticUserName(null);
+            }
+        }
+
+        return parsedRequest;
+    }
+    
 }

Modified: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/servlets/PageServlet.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/servlets/PageServlet.java?rev=672574&r1=672573&r2=672574&view=diff
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/servlets/PageServlet.java (original)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/servlets/PageServlet.java Sat Jun 28 12:18:17 2008
@@ -29,7 +29,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.planet.PlanetException;
-import org.apache.roller.planet.config.PlanetConfig;
+import org.apache.roller.planet.business.AggregatorFactory;
 import org.apache.roller.planet.pojos.Planet;
 import org.apache.roller.planet.pojos.PlanetGroup;
 import org.apache.roller.planet.pojos.StaticTemplate;
@@ -38,6 +38,8 @@
 import org.apache.roller.planet.ui.rendering.RendererManager;
 import org.apache.roller.planet.ui.rendering.model.ModelLoader;
 import org.apache.roller.planet.ui.rendering.util.PlanetGroupPageRequest;
+import org.apache.roller.planet.ui.rendering.util.cache.PageCache;
+import org.apache.roller.planet.util.cache.CachedContent;
 
 
 /**
@@ -47,21 +49,28 @@
 
     private static Log log = LogFactory.getLog(PageServlet.class);
 
-
+    private PageCache pageCache = null;
+    
+    
     /**
      * Init method for this servlet
      */
+    @Override
     public void init(ServletConfig servletConfig) throws ServletException {
 
         super.init(servletConfig);
 
         log.info("Initializing PageServlet");
+        
+        // get a reference to the page cache
+        pageCache = PageCache.getInstance();
     }
 
 
     /**
      * Handle GET requests for weblog feeds.
      */
+    @Override
     public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
 
@@ -73,7 +82,7 @@
         PlanetGroupPageRequest pageRequest = null;
         try {
             // parse the incoming request and extract the relevant data
-            pageRequest = new PlanetGroupPageRequest(request);
+            pageRequest = getParsedRequest(request);
 
             planet = pageRequest.getPlanet();
             if(planet == null) {
@@ -94,15 +103,32 @@
         response.setContentType("text/html; charset=utf-8");
         
         
+        // see if we have this page cached
+        String cacheKey = pageCache.generateKey(pageRequest);
+        if (!pageRequest.isLoggedIn()) {
+            CachedContent cachedContent = (CachedContent) pageCache.get(cacheKey);
+            if (cachedContent != null) {
+                log.debug("HIT " + cacheKey);
+
+                response.setContentLength(cachedContent.getContent().length);
+                response.getOutputStream().write(cachedContent.getContent());
+                return;
+
+            } else {
+                log.debug("MISS " + cacheKey);
+            }
+        }
+        
+        
         // looks like we need to render content
         HashMap model = new HashMap();
         try {
             // populate the rendering model
             Map initData = new HashMap();
-            initData.put("planetRequest", pageRequest);
+            initData.put("parsedRequest", pageRequest);
             
             // Load models for pages
-            String pageModels = PlanetConfig.getProperty("rendering.pageModels");
+            String pageModels = AggregatorFactory.getAggregator().getConfig().getProperty("rendering.pageModels");
             ModelLoader.loadModels(pageModels, model, initData, true);
 
         } catch (PlanetException ex) {
@@ -142,9 +168,14 @@
         
         
         // render content
+        CachedContent rendererOutput = new CachedContent(24567);
         try {
             log.debug("Doing rendering");
-            renderer.render(model, response.getWriter());
+            renderer.render(model, rendererOutput.getCachedWriter());
+            
+            // flush rendered output and close
+            rendererOutput.flush();
+            rendererOutput.close();
         } catch(Exception e) {
             // bummer, error during rendering
             log.error("Error during rendering", e);
@@ -155,14 +186,37 @@
         }
 
 
-        // post rendering process
-
-        // flush rendered content to response
         log.debug("Flushing response output");
-        //response.setContentLength(rendererOutput.getContent().length);
-        //response.getOutputStream().write(rendererOutput.getContent());
+        response.setContentLength(rendererOutput.getContent().length);
+        response.getOutputStream().write(rendererOutput.getContent());
+
+        // cache rendered content.
+        if(!pageRequest.isLoggedIn()) {
+            log.debug("PUT "+cacheKey);
+            pageCache.put(cacheKey, rendererOutput);
+        }
 
         log.debug("Exiting");
     }
-
+    
+    
+    private PlanetGroupPageRequest getParsedRequest(HttpServletRequest request) 
+            throws Exception {
+        
+        PlanetGroupPageRequest parsedRequest = new PlanetGroupPageRequest(request.getPathInfo(), request.getParameterMap());
+        
+        java.security.Principal prince = request.getUserPrincipal();
+        if (prince != null) {
+            // TODO: this should actually just be a permission check
+            // for now just make sure the user has a local account
+            parsedRequest.setAuthenticUserName(prince.getName());
+            if(parsedRequest.getAuthenticUser() == null) {
+                // not a local user
+                parsedRequest.setAuthenticUserName(null);
+            }
+        }
+        
+        return parsedRequest;
+    }
+    
 }

Added: roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/util/HomepageRequest.java
URL: http://svn.apache.org/viewvc/roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/util/HomepageRequest.java?rev=672574&view=auto
==============================================================================
--- roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/util/HomepageRequest.java (added)
+++ roller/planet/core/trunk/src/java/org/apache/roller/planet/ui/rendering/util/HomepageRequest.java Sat Jun 28 12:18:17 2008
@@ -0,0 +1,20 @@
+
+package org.apache.roller.planet.ui.rendering.util;
+
+/**
+ * Represents a request to the application homepage.
+ *
+ * @author ag92114
+ */
+public class HomepageRequest extends ParsedRequest {
+    
+    public HomepageRequest() {
+        super();
+    }
+    
+    
+    public HomepageRequest(String uri) throws InvalidRequestException {
+        super(uri);
+    }
+    
+}