You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@roller.apache.org by sn...@apache.org on 2007/04/03 22:07:50 UTC

svn commit: r525260 [2/3] - in /incubator/roller/branches/roller_4.0_newbackend: ./ docs/devguide/ docs/examples/ docs/examples/configs/ docs/examples/configs/resin/ docs/examples/configs/tomcat/ docs/examples/configs/wbloggar/ metadata/database/tmpls/...

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/Theme.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/Theme.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/Theme.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/Theme.java Tue Apr  3 13:07:41 2007
@@ -35,46 +35,49 @@
  * is used mostly to contain all the templates for a theme, but does contain
  * other theme related attributes such as name, last modifed date, etc.
  */
-public class Theme implements Serializable {
+public class Theme implements Serializable, Comparable {
     
     // this is the name that will be used to identify a user customized theme
     public static final String CUSTOM = "custom";
     
-    private String id;
-    private String name;
-    private String description;
-    private String author;
-    private String lastEditor; // user id value of last editor
-    private Date lastModified;
-    private boolean enabled;
+    private String id = null;
+    private String name = null;
+    private String description = null;
+    private String author = null;
+    private String customStylesheet = null;
+    private Date lastModified = null;
+    private boolean enabled = false;
     
     // we keep templates in a Map for faster lookups by name
     // the Map contains ... (template name, ThemeTemplate)
-    private Map templates;
+    private Map templatesByName = new HashMap();
+    
+    // we keep templates in a Map for faster lookups by link
+    // the Map contains ... (template link, ThemeTemplate)
+    private Map templatesByLink = new HashMap();
+    
+    // we keep templates in a Map for faster lookups by action
+    // the Map contains ... (template action, ThemeTemplate)
+    private Map templatesByAction = new HashMap();
     
     // we keep resources in a Map for faster lookups by path
     // the Map contains ... (resource path, File)
-    private Map resources;
+    private Map resources = new HashMap();
     
     
-    public Theme() {
-        this.id = null;
-        this.name = null;
-        this.description = null;
-        this.author = null;
-        this.lastEditor = null;
-        this.lastModified = null;
-        this.enabled = false;
-        this.templates = new HashMap();
-        this.resources = new HashMap();
-    }
+    public Theme() {}
 
     
     /**
      * Get the collection of all templates associated with this Theme.
      */
-    public Collection getTemplates() {
-        return this.templates.values();
+    public List getTemplates() {
+        return new ArrayList(this.templatesByName.values());
+    }
+    
+    
+    public Template getDefaultTemplate() {
+        return (ThemeTemplate) this.templatesByAction.get(Template.ACTION_WEBLOG);
     }
     
     
@@ -83,38 +86,35 @@
      * Returns null if the template cannot be found.
      */
     public ThemeTemplate getTemplate(String name) {
-        return (ThemeTemplate) this.templates.get(name);
+        return (ThemeTemplate) this.templatesByName.get(name);
     }
     
     
     /**
      * Lookup the specified template by link.
      * Returns null if the template cannot be found.
-     *
-     * NOTE: for themes we enforce the rule that 
-     *          Theme.link == Theme.name
-     *
-     * So this lookup is basically the same as lookup by name.
      */
-    public ThemeTemplate getTemplateByLink(String link) {
-        return (ThemeTemplate) this.templates.get(link);
+    public Template getTemplateByLink(String link) {
+        return (ThemeTemplate) this.templatesByLink.get(link);
     }
     
     
     /**
-     * Set the value for a given template name.
+     * Lookup the specified template by action.
+     * Returns null if the template cannot be found.
      */
-    public void setTemplate(String name, ThemeTemplate template) {
-        this.templates.put(name, template);
+    public Template getTemplateByAction(String action) {
+        return (ThemeTemplate) this.templatesByAction.get(action);
     }
     
     
     /**
-     * Check if this Theme contains the named template.
-     * Returns true if the template exists, false otherwise.
+     * Set the value for a given template name.
      */
-    public boolean hasTemplate(String name) {
-        return this.templates.containsKey(name);
+    public void addTemplate(ThemeTemplate template) {
+        this.templatesByName.put(template.getName(), template);
+        this.templatesByLink.put(template.getLink(), template);
+        this.templatesByAction.put(template.getAction(), template);
     }
     
     
@@ -150,22 +150,11 @@
     }
     
     
-    /**
-     * Check if this Theme contains the named resource.
-     * Returns true if the resource exists, false otherwise.
-     */
-    public boolean hasResource(String path) {
-        return this.resources.containsKey(path);
-    }
-    
-    
     public String getId() {
         return id;
     }
 
     public void setId(String id) {
-        // Form bean workaround: empty string is never a valid id
-        if (id != null && id.trim().length() == 0) return; 
         this.id = id;
     }
     
@@ -193,14 +182,14 @@
         this.author = author;
     }
 
-    public String getLastEditor() {
-        return lastEditor;
+    public String getCustomStylesheet() {
+        return customStylesheet;
     }
 
-    public void setLastEditor(String lastEditor) {
-        this.lastEditor = lastEditor;
+    public void setCustomStylesheet(String customStylesheet) {
+        this.customStylesheet = customStylesheet;
     }
-
+    
     public Date getLastModified() {
         return lastModified;
     }
@@ -222,7 +211,7 @@
         sb.append(name);
         sb.append("\n");
         
-        Iterator it = this.templates.values().iterator();
+        Iterator it = this.templatesByName.values().iterator();
         while(it.hasNext()) {
             sb.append(it.next());
             sb.append("\n");
@@ -230,6 +219,15 @@
         
         return sb.toString();
         
+    }
+    
+    
+    /**
+     * @see java.lang.Comparable#compareTo(java.lang.Object)
+     */
+    public int compareTo(Object o) {
+        Theme other = (Theme) o;
+        return getName().compareTo(other.getName());
     }
 
 }

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/ThemeTemplate.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/ThemeTemplate.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/ThemeTemplate.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/ThemeTemplate.java Tue Apr  3 13:07:41 2007
@@ -30,6 +30,7 @@
 public class ThemeTemplate implements Template, Serializable {
     
     private String id = null;
+    private String action = null;
     private String name = null;
     private String description = null;
     private String contents = null;
@@ -46,12 +47,13 @@
     
     public ThemeTemplate() {}
     
-    public ThemeTemplate(Theme theme, String id, String name, String desc, 
-            String contents, String link, Date date, String tempLang, 
-            boolean hid, boolean navbar, String decor) {
+    public ThemeTemplate(Theme theme, String id, String action, String name, 
+            String desc, String contents, String link, Date date, 
+            String tempLang, boolean hid, boolean navbar, String decor) {
         
         this.myTheme = theme;
         this.id = id;
+        this.action = action;
         this.name = name;
         this.description = desc;
         this.contents = contents;
@@ -164,6 +166,14 @@
     public String toString() {
         return (id + "," + name + "," + description + "," + link + "," + 
                 lastModified + "\n\n" + contents + "\n");
+    }
+
+    public String getAction() {
+        return action;
+    }
+
+    public void setAction(String action) {
+        this.action = action;
     }
     
 }

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/WeblogEntryTagAggregateData.orm.xml
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/WeblogEntryTagAggregateData.orm.xml?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/WeblogEntryTagAggregateData.orm.xml (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/WeblogEntryTagAggregateData.orm.xml Tue Apr  3 13:07:41 2007
@@ -27,16 +27,16 @@
             <query>SELECT w.name FROM WeblogEntryTagAggregateData w WHERE w.name IN (?1) AND w.weblog IS NULL</query>
         </named-query>
         <named-query name="WeblogEntryTagAggregateData.getPopularTagsByWebsite&amp;StartDate">
-            <query>SELECT w.name, SUM(w.total) FROM WeblogEntryTagAggregateData w WHERE w.weblog = ?1 AND w.lastUsed &gt;= ?2</query>
+            <query>SELECT w.name, SUM(w.total) FROM WeblogEntryTagAggregateData w WHERE w.weblog = ?1 AND w.lastUsed &gt;= ?2 GROUP BY w.name, w.total ORDER BY w.total DESC</query>
         </named-query>
         <named-query name="WeblogEntryTagAggregateData.getPopularTagsByWebsite">
-            <query>SELECT w.name, SUM(w.total) FROM WeblogEntryTagAggregateData w WHERE w.weblog = ?1</query>
+            <query>SELECT w.name, SUM(w.total) FROM WeblogEntryTagAggregateData w WHERE w.weblog = ?1 GROUP BY w.name, w.total ORDER BY w.total DESC</query>
         </named-query>
         <named-query name="WeblogEntryTagAggregateData.getPopularTagsByWebsiteNull&amp;StartDate">
-            <query>SELECT w.name, SUM(w.total) FROM WeblogEntryTagAggregateData w WHERE w.weblog IS NULL AND w.lastUsed &gt;= ?2</query>
+            <query>SELECT w.name, SUM(w.total) FROM WeblogEntryTagAggregateData w WHERE w.weblog IS NULL AND w.lastUsed &gt;= ?2 GROUP BY w.name, w.total ORDER BY w.total DESC</query>
         </named-query>
         <named-query name="WeblogEntryTagAggregateData.getPopularTagsByWebsiteNull">
-            <query>SELECT w.name, SUM(w.total) FROM WeblogEntryTagAggregateData w WHERE w.weblog IS NULL</query>
+            <query>SELECT w.name, SUM(w.total) FROM WeblogEntryTagAggregateData w WHERE w.weblog IS NULL GROUP BY w.name, w.total ORDER BY w.total DESC</query>
         </named-query>
         <named-query name="WeblogEntryTagAggregateData.getTagsByWebsite&amp;NameStartsWith">
             <query>SELECT w.name, SUM(w.total) FROM WeblogEntryTagAggregateData w WHERE w.weblog = ?1 AND w.name LIKE ?2 GROUP BY w.name, w.total </query>

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/WeblogTemplate.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/WeblogTemplate.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/WeblogTemplate.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/WeblogTemplate.java Tue Apr  3 13:07:41 2007
@@ -29,6 +29,7 @@
 import org.apache.roller.RollerException;
 import org.apache.roller.util.UUIDGenerator;
 
+
 /**
  * POJO that represents a single user defined template page.
  *
@@ -49,6 +50,7 @@
     private static Set requiredTemplates = null;
     
     private String id = UUIDGenerator.generateUUID();
+    private String  action = null;
     private String  name = null;
     private String  description = null;
     private String  link = null;
@@ -71,32 +73,9 @@
         requiredTemplates.add("_decorator");
     }
     
+    
     public WeblogTemplate() {}
     
-    public WeblogTemplate(
-            java.lang.String id,
-            WebsiteData website,
-            java.lang.String name,
-            java.lang.String description,
-            java.lang.String link,
-            java.lang.String template,
-            java.util.Date updateTime,
-            String tempLang,
-            boolean hid,
-            boolean navbar,
-            String decorator) {
-        //this.id = id;
-        this.weblog = website;
-        this.name = name;
-        this.description = description;
-        this.link = link;
-        this.contents = template;
-        this.lastModified = (Date)updateTime.clone();
-        this.templateLanguage = tempLang;
-        this.hidden = hid;
-        this.navbar = navbar;
-        this.decoratorName = decorator;
-    }
     
     public WeblogTemplate( WeblogTemplate otherData ) {
         setData(otherData);
@@ -149,6 +128,19 @@
     
     /**
      * @ejb:persistent-field
+     * @hibernate.property column="action" non-null="true" unique="false"
+     */
+    public String getAction() {
+        return action;
+    }
+
+    public void setAction(String action) {
+        this.action = action;
+    }
+    
+    
+    /**
+     * @ejb:persistent-field
      * @hibernate.property column="name" non-null="true" unique="false"
      */
     public java.lang.String getName() {
@@ -209,16 +201,19 @@
      * @hibernate.property column="updatetime" non-null="true" unique="false"
      */
     public java.util.Date getLastModified() {
-        return (Date)this.lastModified.clone();
+        // don't modify fields directly
+        //return (Date)this.lastModified.clone();
+        return lastModified;
     }
     
     /** @ejb:persistent-field */
     public void setLastModified(final java.util.Date newtime ) {
-        if (newtime != null) {
-            lastModified = (Date)newtime.clone();
-        } else {
-            lastModified = null;
-        }
+        //if (newtime != null) {
+        //    lastModified = (Date)newtime.clone();
+        //} else {
+        //    lastModified = null;
+        //}
+        lastModified = newtime;
     }
     
     

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/WeblogTemplate.orm.xml
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/WeblogTemplate.orm.xml?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/WeblogTemplate.orm.xml (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/WeblogTemplate.orm.xml Tue Apr  3 13:07:41 2007
@@ -13,16 +13,19 @@
             class="org.apache.roller.pojos.WeblogTemplate">
         <table name="webpage"/>
         <named-query name="WeblogTemplate.getByWebsite">
-            <query>SELECT w FROM WeblogTemplate w Where w.website = ?1</query>
+            <query>SELECT w FROM WeblogTemplate w WHERE w.website = ?1</query>
         </named-query>
         <named-query name="WeblogTemplate.getByWebsiteOrderByName">
-            <query>SELECT w FROM WeblogTemplate w Where w.website = ?1 ORDER BY w.name</query>
+            <query>SELECT w FROM WeblogTemplate w WHERE w.website = ?1 ORDER BY w.name</query>
         </named-query>
         <named-query name="WeblogTemplate.getByWebsite&amp;Link">
-            <query>SELECT w FROM WeblogTemplate w Where w.website = ?1 AND w.link = ?2</query>
+            <query>SELECT w FROM WeblogTemplate w WHERE w.website = ?1 AND w.link = ?2</query>
+        </named-query>
+        <named-query name="WeblogTemplate.getByAction">
+            <query>SELECT w FROM WeblogTemplate w WHERE w.website = ?1 AND w.action = ?2</query>
         </named-query>
         <named-query name="WeblogTemplate.getByWebsite&amp;Name">
-            <query>SELECT w FROM WeblogTemplate w Where w.website = ?1 AND w.name= ?2</query>
+            <query>SELECT w FROM WeblogTemplate w WHERE w.website = ?1 AND w.name= ?2</query>
         </named-query>
 
         <attributes>
@@ -34,6 +37,9 @@
             </basic>
             <basic name="description">
                 <column name="description" insertable="true" updatable="true" unique="false"/>
+            </basic>
+            <basic name="action">
+                <column name="action" insertable="true" updatable="true" unique="false"/>
             </basic>
             <basic name="link">
                 <column name="link" insertable="true" updatable="true" unique="false"/>

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/WebsiteData.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/WebsiteData.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/WebsiteData.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/WebsiteData.java Tue Apr  3 13:07:41 2007
@@ -39,12 +39,12 @@
 import org.apache.roller.business.RollerFactory;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.roller.business.ThemeNotFoundException;
+import org.apache.roller.business.themes.ThemeNotFoundException;
 import org.apache.roller.config.RollerRuntimeConfig;
 import org.apache.roller.business.BookmarkManager;
 import org.apache.roller.business.PluginManager;
 import org.apache.roller.business.Roller;
-import org.apache.roller.business.ThemeManager;
+import org.apache.roller.business.themes.ThemeManager;
 import org.apache.roller.business.UserManager;
 import org.apache.roller.business.WeblogManager;
 import org.apache.roller.util.UUIDGenerator;
@@ -95,6 +95,7 @@
     private String  pageModels       = new String();
     private boolean enableMultiLang = false;
     private boolean showAllLangs = true;
+    private String customStylesheetPath = null;
     
     
     // Associated objects
@@ -183,6 +184,28 @@
         permissions.remove(perms);
     }
     
+    
+    /**
+     * Get the Theme object in use by this weblog, or null if no theme selected.
+     */
+    public Theme getTheme() throws RollerException {
+        
+        // if theme is custom or null then just return null
+        if(getEditorTheme() == null || Theme.CUSTOM.equals(getEditorTheme())) {
+            return null;
+        } else {
+            try {
+                ThemeManager themeMgr = RollerFactory.getRoller().getThemeManager();
+                return themeMgr.getTheme(getEditorTheme());
+            } catch(ThemeNotFoundException tnfe) {
+                // i sure hope not!
+                log.error("Unable to find theme = "+getEditorTheme(), tnfe);
+                return null;
+            }
+        }
+    }
+    
+    
     /**
      * Lookup the default page for this website.
      */
@@ -192,19 +215,9 @@
         
         // first check if this user has selected a theme
         // if so then return the themes Weblog template
-        if(this.editorTheme != null && !this.editorTheme.equals(Theme.CUSTOM)) {
-            try {
-                ThemeManager themeMgr = RollerFactory.getRoller().getThemeManager();
-                Theme usersTheme = themeMgr.getTheme(this.editorTheme);
-                
-                // this is a bit iffy :/
-                // we assume that all theme use "Weblog" for a default template
-                template = usersTheme.getTemplate("Weblog");
-                
-            } catch(ThemeNotFoundException tnfe) {
-                // i sure hope not!
-                log.error(tnfe);
-            }
+        Theme weblogTheme = getTheme();
+        if(weblogTheme != null) {
+            template = weblogTheme.getTemplateByAction(Template.ACTION_WEBLOG);
         }
         
         // if we didn't get the Template from a theme then look in the db
@@ -221,44 +234,35 @@
     
     
     /**
-     * Lookup a Template for this website by id.
+     * Lookup a Template for this website by action.
+     * 
+     * @roller.wrapPojoMethod type="pojo"
      */
-    public Template getPageById(String id) throws RollerException {
+    public Template getPageByAction(String action) throws RollerException {
         
-        if(id == null)
+        if(action == null)
             return null;
         
+        log.debug("looking up template for action ["+action+"]");
+        
         Template template = null;
         
         // first check if this user has selected a theme
         // if so then return the proper theme template
-        if(this.editorTheme != null && !this.editorTheme.equals(Theme.CUSTOM)) {
-            
-            // we don't actually expect to get lookups for theme pages by id
-            // but we have to be thorough and check anyways
-            String[] split = id.split(":",  2);
-            
-            // only continue if this looks like a theme id
-            // and the theme name matches this users current theme
-            if(split.length == 2 && split[0].equals(this.editorTheme)) {
-                try {
-                    ThemeManager themeMgr = RollerFactory.getRoller().getThemeManager();
-                    Theme usersTheme = themeMgr.getTheme(this.editorTheme);
-                    template = usersTheme.getTemplate(split[1]);
-                    
-                } catch(ThemeNotFoundException tnfe) {
-                    // i sure hope not!
-                    log.error(tnfe);
-                }
-            }
-            
-        }
+        Theme weblogTheme = getTheme();
+        if(weblogTheme != null) {
+            template = weblogTheme.getTemplateByAction(action);
+        } else {
         
-        // if we didn't get the Template from a theme then look in the db
-        if(template == null) {
+            // NOTE: we specifically do *NOT* return templates by action from the
+            // weblog's custom templates if the weblog is using a theme because we
+            // don't want old templates to take effect when using a specific theme
             UserManager userMgr = RollerFactory.getRoller().getUserManager();
-            template = userMgr.getPageByName(this, name);
+            template = userMgr.getPageByAction(this, action);
         }
+
+        if(template != null)
+            log.debug("returning template ["+template.getId()+"]");
         
         return template;
     }
@@ -279,18 +283,9 @@
         
         // first check if this user has selected a theme
         // if so then return the proper theme template
-        if(this.editorTheme != null && !this.editorTheme.equals(Theme.CUSTOM)) {
-            
-            try {
-                ThemeManager themeMgr = RollerFactory.getRoller().getThemeManager();
-                Theme usersTheme = themeMgr.getTheme(this.editorTheme);
-                template = usersTheme.getTemplate(name);
-                
-            } catch(ThemeNotFoundException tnfe) {
-                // i sure hope not!
-                log.error(tnfe);
-            }
-            
+        Theme weblogTheme = getTheme();
+        if(weblogTheme != null) {
+            template = weblogTheme.getTemplate(name);
         }
         
         // if we didn't get the Template from a theme then look in the db
@@ -321,18 +316,9 @@
         
         // first check if this user has selected a theme
         // if so then return the proper theme template
-        if(this.editorTheme != null && !this.editorTheme.equals(Theme.CUSTOM)) {
-            
-            try {
-                ThemeManager themeMgr = RollerFactory.getRoller().getThemeManager();
-                Theme usersTheme = themeMgr.getTheme(this.editorTheme);
-                template = usersTheme.getTemplateByLink(link);
-                
-            } catch(ThemeNotFoundException tnfe) {
-                // i sure hope not!
-                log.error(tnfe);
-            }
-            
+        Theme weblogTheme = getTheme();
+        if(weblogTheme != null) {
+            template = weblogTheme.getTemplateByLink(link);
         }
         
         // if we didn't get the Template from a theme then look in the db
@@ -372,12 +358,11 @@
         
         
         // now get theme pages if needed and put them in place of db pages
-        if (this.editorTheme != null && !this.editorTheme.equals(Theme.CUSTOM)) {
-            try {
+        try {
+            Theme weblogTheme = getTheme();
+            if(weblogTheme != null) {
                 Template template = null;
-                ThemeManager themeMgr = RollerFactory.getRoller().getThemeManager();
-                Theme usersTheme = themeMgr.getTheme(this.editorTheme);
-                Iterator themePages = usersTheme.getTemplates().iterator();
+                Iterator themePages = weblogTheme.getTemplates().iterator();
                 while(themePages.hasNext()) {
                     template = (Template) themePages.next();
                     
@@ -385,10 +370,10 @@
                     // pages in the pages list, which is what we want
                     pages.put(template.getName(), template);
                 }
-            } catch(Exception e) {
-                // how??
-                log.error(e);
             }
+        } catch(Exception e) {
+            // how??
+            log.error(e);
         }
         
         return new ArrayList(pages.values());
@@ -1066,6 +1051,37 @@
 
     
     /**
+     * The path under the weblog's resources to a stylesheet override.
+     *
+     * @hibernate.property column="customstylesheet" not-null="false"
+     */
+    public String getCustomStylesheetPath() {
+        return customStylesheetPath;
+    }
+
+    public void setCustomStylesheetPath(String customStylesheetPath) {
+        this.customStylesheetPath = customStylesheetPath;
+    }
+    
+    
+    public String getCustomStylesheet() {
+        try {
+            Theme weblogTheme = getTheme();
+            if(weblogTheme != null) {
+                return weblogTheme.getCustomStylesheet();
+            } else {
+                return getCustomStylesheetPath();
+            }
+        } catch(RollerException re) {
+            // hmmm, some exception getting theme
+            return null;
+        }
+    }
+    
+    // no-op to please xdoclet
+    public void setCustomStylesheet(String noop) {}
+    
+    /**
      * Get initialized plugins for use during rendering process.
      */
     public Map getInitializedPlugins() {
@@ -1392,8 +1408,3 @@
     public void setEntryCount(int ignored) {}
     
 }
-
-
-
-
-

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/WebsiteData.orm.xml
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/WebsiteData.orm.xml?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/WebsiteData.orm.xml (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/pojos/WebsiteData.orm.xml Tue Apr  3 13:07:41 2007
@@ -218,6 +218,9 @@
 			<basic name="pageModels">
 				<column name="pagemodels" insertable="true" updatable="true" unique="false"/>
 			</basic>
+			<basic name="customStylesheetPath">
+				<column name="customstylesheet" insertable="true" updatable="true" unique="false"/>
+			</basic>
 			<many-to-one name="creator" target-entity="org.apache.roller.pojos.UserData">
 				<join-column name="userid" insertable="true" updatable="true" nullable="false"/>
 			</many-to-one>
@@ -233,18 +236,18 @@
 			<transient name="adminUserCount"/>
 			<transient name="commentCount"/>
 			<transient name="commentModerationRequired"/>
+            <transient name="customStylesheet" />
 			<transient name="todaysHits"/>
 			<transient name="todaysReferrers"/>
 			<transient name="uRL"/>
 			<transient name="userCount"/>
-                        
-                        <transient name="defaultPage"/>
+            <transient name="defaultPage"/>
 			<transient name="entryCount"/>
-                        <transient name="initializedPlugins"/>
+            <transient name="initializedPlugins"/>
 			<transient name="pages"/>
-                        <transient name="weblogCategories"/>
-                        <transient name="localeInstance"/>
-                        <transient name="timeZoneInstance" />
+            <transient name="weblogCategories"/>
+            <transient name="localeInstance"/>
+            <transient name="timeZoneInstance" />
 		</attributes>
 	</entity>
 </entity-mappings>

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/CommentManagementAction.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/CommentManagementAction.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/CommentManagementAction.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/CommentManagementAction.java Tue Apr  3 13:07:41 2007
@@ -45,7 +45,6 @@
 import org.apache.roller.pojos.CommentData;
 import org.apache.roller.pojos.WeblogEntryData;
 import org.apache.roller.ui.core.BasePageModel;
-import org.apache.roller.ui.core.RollerContext;
 import org.apache.roller.ui.core.RollerRequest;
 import org.apache.roller.ui.core.RollerSession;
 import org.apache.roller.util.cache.CacheManager;
@@ -266,7 +265,6 @@
     private void sendCommentNotifications(
         HttpServletRequest req, List comments) throws RollerException {
         
-        RollerContext rc = RollerContext.getRollerContext();                             
         String rootURL = RollerRuntimeConfig.getAbsoluteContextURL();
         try {
             if (rootURL == null || rootURL.trim().length()==0) {

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/InvitationsAction.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/InvitationsAction.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/InvitationsAction.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/InvitationsAction.java Tue Apr  3 13:07:41 2007
@@ -47,7 +47,6 @@
 import org.apache.roller.pojos.WebsiteData;
 import org.apache.roller.ui.authoring.struts.formbeans.InvitationsForm;
 import org.apache.roller.ui.core.BasePageModel;
-import org.apache.roller.ui.core.RollerContext;
 import org.apache.roller.ui.core.RollerRequest;
 import org.apache.roller.ui.core.RollerSession;
 import org.apache.roller.util.MailUtil;
@@ -163,7 +162,6 @@
                 String content;
                 
                 // Figure URL to entry edit page
-                RollerContext rc = RollerContext.getRollerContext();
                 String rootURL = RollerRuntimeConfig.getAbsoluteContextURL();
                 if (rootURL == null || rootURL.trim().length()==0) {
                     rootURL = RequestUtils.serverURL(request)

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/InviteMemberAction.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/InviteMemberAction.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/InviteMemberAction.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/InviteMemberAction.java Tue Apr  3 13:07:41 2007
@@ -49,7 +49,6 @@
 import org.apache.roller.pojos.UserData;
 import org.apache.roller.pojos.WebsiteData;
 import org.apache.roller.ui.core.BasePageModel;
-import org.apache.roller.ui.core.RollerContext;
 import org.apache.roller.ui.core.RollerRequest;
 import org.apache.roller.ui.core.RollerSession;
 import org.apache.roller.ui.authoring.struts.formbeans.InviteMemberForm;
@@ -209,7 +208,6 @@
                 String content;
                 
                 // Figure URL to entry edit page
-                RollerContext rc = RollerContext.getRollerContext();
                 String rootURL = RollerRuntimeConfig.getAbsoluteContextURL();
                 if (rootURL == null || rootURL.trim().length()==0) {
                     rootURL = RequestUtils.serverURL(request)

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/ThemeEditorAction.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/ThemeEditorAction.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/ThemeEditorAction.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/ThemeEditorAction.java Tue Apr  3 13:07:41 2007
@@ -33,11 +33,11 @@
 import org.apache.struts.action.ActionMessage;
 import org.apache.struts.actions.DispatchAction;
 import org.apache.roller.RollerException;
-import org.apache.roller.business.ThemeNotFoundException;
+import org.apache.roller.business.themes.ThemeNotFoundException;
 import org.apache.roller.config.RollerRuntimeConfig;
 import org.apache.roller.business.Roller;
 import org.apache.roller.business.RollerFactory;
-import org.apache.roller.business.ThemeManager;
+import org.apache.roller.business.themes.ThemeManager;
 import org.apache.roller.business.UserManager;
 import org.apache.roller.pojos.Theme;
 import org.apache.roller.pojos.WebsiteData;
@@ -107,9 +107,19 @@
                 ThemeManager themeMgr = roller.getThemeManager();
                 
                 String username = rses.getAuthenticatedUser().getUserName();
-                String currentTheme = website.getEditorTheme();
                 List themes = themeMgr.getEnabledThemesList();
                 
+                // TODO: hack to make 'custom' an actual Theme object
+                // maybe there should be an actual Theme representing custom themes?
+                Theme currentTheme = null;
+                if(Theme.CUSTOM.equals(website.getEditorTheme())) {
+                    currentTheme = new Theme();
+                    currentTheme.setId(Theme.CUSTOM);
+                    currentTheme.setName(Theme.CUSTOM);
+                } else {
+                    currentTheme = website.getTheme();
+                }
+                
                 // this checks if the website has a default page template
                 // if not then we don't allow for a custom theme
                 boolean allowCustomTheme = true;
@@ -121,14 +131,14 @@
                 // if we allow custom themes then add it to the end of the list
                 if(RollerRuntimeConfig.getBooleanProperty("themes.customtheme.allowed")
                         && allowCustomTheme)
-                    themes.add(Theme.CUSTOM);
+                    request.setAttribute("allowCustomOption", Boolean.TRUE);
                 
                 // on the first pass just show a preview of the current theme
                 request.setAttribute("previewTheme", currentTheme);
                 request.setAttribute("currentTheme", currentTheme);
                 request.setAttribute("themesList", themes);
                 
-                mLogger.debug("Previewing theme "+currentTheme+" to "+username);
+                mLogger.debug("Previewing theme "+currentTheme.getName()+" to "+username);
                 
             } else {
                 forward = mapping.findForward("access-denied");
@@ -174,9 +184,19 @@
                 request.setAttribute("model",pageModel);          
                     
                 String username = rses.getAuthenticatedUser().getUserName();
-                String currentTheme = website.getEditorTheme();
                 List themes = themeMgr.getEnabledThemesList();
                 
+                // TODO: hack to make 'custom' an actual Theme object
+                // maybe there should be an actual Theme representing custom themes?
+                Theme currentTheme = null;
+                if(Theme.CUSTOM.equals(website.getEditorTheme())) {
+                    currentTheme = new Theme();
+                    currentTheme.setId(Theme.CUSTOM);
+                    currentTheme.setName(Theme.CUSTOM);
+                } else {
+                    currentTheme = website.getTheme();
+                }
+                
                 // this checks if the website has a default page template
                 // if not then we don't allow for a custom theme
                 boolean allowCustomTheme = true;
@@ -188,7 +208,7 @@
                 // if we allow custom themes then add it to the end of the list
                 if(RollerRuntimeConfig.getBooleanProperty("themes.customtheme.allowed")
                         && allowCustomTheme)
-                    themes.add(Theme.CUSTOM);
+                    request.setAttribute("allowCustomOption", Boolean.TRUE);
                 
                 // set the current theme in the request
                 request.setAttribute("currentTheme", currentTheme);
@@ -200,7 +220,7 @@
                     
                     if(previewTheme.isEnabled()) {
                         // make sure the view knows what theme to preview
-                        request.setAttribute("previewTheme", previewTheme.getName());
+                        request.setAttribute("previewTheme", previewTheme);
                     
                         mLogger.debug("Previewing theme "+previewTheme.getName()+
                                 " to "+username);
@@ -213,7 +233,11 @@
                 } catch(ThemeNotFoundException tnfe) {
                     // hmm ... maybe they chose "custom"?
                     if(theme != null && theme.equals(Theme.CUSTOM)) {
-                        request.setAttribute("previewTheme", Theme.CUSTOM);
+                        // TODO: total hack, this needs fixing
+                        Theme customTheme = new Theme();
+                        customTheme.setId(Theme.CUSTOM);
+                        customTheme.setName(Theme.CUSTOM);
+                        request.setAttribute("previewTheme", customTheme);
                     } else {
                         // we should never get here
                         request.setAttribute("previewTheme", currentTheme);
@@ -271,7 +295,7 @@
                     Theme previewTheme = themeMgr.getTheme(theme);
                     
                     if(previewTheme.isEnabled()) {
-                        newTheme = previewTheme.getName();
+                        newTheme = previewTheme.getId();
                     } else {
                         errors.add(null, new ActionMessage("Theme not enabled"));
                         saveErrors(request, errors);
@@ -364,7 +388,7 @@
                 String username = rses.getAuthenticatedUser().getUserName();
                 
                 try {
-                    Theme usersTheme = themeMgr.getTheme(website.getEditorTheme());
+                    Theme usersTheme = website.getTheme();
                     
                     // only if custom themes are allowed
                     if(RollerRuntimeConfig.getBooleanProperty("themes.customtheme.allowed")) {

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/ToggleLinkbackDisplayAction.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/ToggleLinkbackDisplayAction.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/ToggleLinkbackDisplayAction.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/ToggleLinkbackDisplayAction.java Tue Apr  3 13:07:41 2007
@@ -32,7 +32,6 @@
 import org.apache.roller.pojos.RefererData;
 import org.apache.roller.pojos.WeblogEntryData;
 import org.apache.roller.ui.core.RequestConstants;
-import org.apache.roller.ui.core.RollerContext;
 import org.apache.roller.ui.core.RollerRequest;
 import org.apache.roller.ui.core.RollerSession;
 import org.apache.roller.util.cache.CacheManager;
@@ -91,7 +90,6 @@
 		String url = null;
 		try
 		{
-			RollerContext rctx = RollerContext.getRollerContext();
             if (entry != null) {
                 url = entry.getPermalink();
             } else {

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/WeblogEntryFormAction.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/WeblogEntryFormAction.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/WeblogEntryFormAction.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/WeblogEntryFormAction.java Tue Apr  3 13:07:41 2007
@@ -59,7 +59,6 @@
 import org.apache.roller.pojos.UserData;
 import org.apache.roller.pojos.WeblogEntryData;
 import org.apache.roller.pojos.WebsiteData;
-import org.apache.roller.ui.core.RollerContext;
 import org.apache.roller.ui.core.RollerRequest;
 import org.apache.roller.ui.core.RollerSession;
 import org.apache.roller.util.cache.CacheManager;
@@ -402,7 +401,6 @@
                 to = (String[])reviewers.toArray(new String[reviewers.size()]);
                 
                 // Figure URL to entry edit page
-                RollerContext rc = RollerContext.getRollerContext();
                 String rootURL = RollerRuntimeConfig.getAbsoluteContextURL();
                 if (rootURL == null || rootURL.trim().length()==0) {
                     rootURL = RequestUtils.serverURL(request)
@@ -616,7 +614,6 @@
                 entryid = request.getParameter(RequestConstants.WEBLOGENTRY_ID);
             }
             Roller roller = RollerFactory.getRoller();
-            RollerContext rctx= RollerContext.getRollerContext();
             WeblogManager wmgr= roller.getWeblogManager();
             entry = wmgr.getWeblogEntry(entryid);
             

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/WeblogTemplateFormAction.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/WeblogTemplateFormAction.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/WeblogTemplateFormAction.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/actions/WeblogTemplateFormAction.java Tue Apr  3 13:07:41 2007
@@ -20,7 +20,10 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.Date;
+import java.util.Iterator;
 import java.util.List;
 import java.util.ResourceBundle;
 
@@ -36,12 +39,12 @@
 import org.apache.roller.business.RollerFactory;
 import org.apache.roller.business.UserManager;
 import org.apache.roller.config.RollerConfig;
+import org.apache.roller.pojos.Theme;
 import org.apache.roller.pojos.UserData;
 import org.apache.roller.pojos.WeblogTemplate;
 import org.apache.roller.pojos.WebsiteData;
 import org.apache.roller.ui.authoring.struts.formbeans.WeblogTemplateFormEx;
 import org.apache.roller.ui.core.BasePageModel;
-import org.apache.roller.ui.core.RollerContext;
 import org.apache.roller.ui.core.RollerRequest;
 import org.apache.roller.ui.core.RollerSession;
 import org.apache.roller.util.Utilities;
@@ -105,12 +108,17 @@
                 }
                 
                 WeblogTemplate page = new WeblogTemplate();
-                form.copyTo(page, request.getLocale());
+                page.setName(form.getName());
                 page.setWebsite(website);
                 page.setLastModified( new Date() );
                 page.setDescription(page.getName());
                 page.setContents(bundle.getString("pageForm.newTemplateContent"));
                 
+                // if no action specified then it's a custom page
+                if(page.getAction() == null) {
+                    page.setAction(WeblogTemplate.ACTION_CUSTOM);
+                }
+                
                 validateLink(page);
                 
                 // all templates start out as velocity templates
@@ -145,6 +153,9 @@
                 request.setAttribute("model",
                     new WeblogTemplateFormModel("pagesForm.title", request, response, mapping, page));
                 
+                // TODO: when a new template is successfully added then we should
+                // take the user directly to edit that new page
+                
             } else {
                 forward = mapping.findForward("access-denied");
             }
@@ -217,8 +228,32 @@
                 website = template.getWebsite();
             }
             
-            request.setAttribute("model", 
-                new WeblogTemplateFormModel("pagesForm.title", request, response, mapping, null));
+            WeblogTemplateFormModel model = 
+                    new WeblogTemplateFormModel("pagesForm.title", request, response, mapping, null);
+            request.setAttribute("model", model);
+            
+            List availableActions = new ArrayList();
+            availableActions.add(WeblogTemplate.ACTION_CUSTOM);
+            
+            if(Theme.CUSTOM.equals(website.getEditorTheme())) {
+                // if the weblog is using a custom theme then determine which
+                // action templates are still available to be created
+                availableActions.add(WeblogTemplate.ACTION_PERMALINK);
+                availableActions.add(WeblogTemplate.ACTION_SEARCH);
+                availableActions.add(WeblogTemplate.ACTION_WEBLOG);
+                availableActions.add(WeblogTemplate.ACTION_TAGSINDEX);
+                
+                WeblogTemplate tmpPage = null;
+                Iterator pagesIter = model.getPages().iterator();
+                while(pagesIter.hasNext()) {
+                    tmpPage = (WeblogTemplate) pagesIter.next();
+                    
+                    if(!WeblogTemplate.ACTION_CUSTOM.equals(tmpPage.getAction())) {
+                        availableActions.remove(tmpPage.getAction());
+                    }
+                }
+            }
+            request.setAttribute("availableActions", availableActions);
             
             if (!rses.isUserAuthorizedToAdmin(website)) {
                 forward = mapping.findForward("access-denied");
@@ -433,7 +468,7 @@
         private WeblogTemplate page;
         private List           pages;
         private List           languages = new ArrayList();
-
+        
         public WeblogTemplateFormModel(
                 String titleKey,
                 HttpServletRequest request,
@@ -455,7 +490,7 @@
  
             this.setUser(rses.getAuthenticatedUser());        
             this.setPages(mgr.getPages(getWebsite()));
-            this.setPage(page); 
+            this.setPage(page);
             
             if (page != null) {
                 String langs = RollerConfig.getProperty("rendering.templateLanguages","velocity");

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/formbeans/WeblogTemplateFormEx.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/formbeans/WeblogTemplateFormEx.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/formbeans/WeblogTemplateFormEx.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/struts/formbeans/WeblogTemplateFormEx.java Tue Apr  3 13:07:41 2007
@@ -22,7 +22,6 @@
 import org.apache.roller.RollerException;
 import org.apache.roller.pojos.WeblogTemplate;
 import org.apache.roller.ui.authoring.struts.forms.WeblogTemplateForm;
-import org.apache.roller.ui.core.RollerContext;
 
 /**
  * @struts.form name="weblogTemplateFormEx"

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/tags/ShowEntryContentTag.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/tags/ShowEntryContentTag.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/tags/ShowEntryContentTag.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/tags/ShowEntryContentTag.java Tue Apr  3 13:07:41 2007
@@ -32,7 +32,6 @@
 import org.apache.roller.business.Roller;
 import org.apache.roller.business.RollerFactory;
 import org.apache.roller.pojos.WeblogEntryData;
-import org.apache.roller.ui.core.RollerContext;
 import org.apache.roller.util.Utilities;
 import org.apache.struts.util.RequestUtils;
 
@@ -64,8 +63,6 @@
             String xformed = entry.getText();;        
             try {
                 if (entry.getPlugins() != null) {
-                    RollerContext rctx = 
-                        RollerContext.getRollerContext();
                     try {
                         PluginManager ppmgr = roller.getPagePluginManager();
                         Map plugins = ppmgr.getWeblogEntryPlugins(

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/tags/ShowEntrySummaryTag.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/tags/ShowEntrySummaryTag.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/tags/ShowEntrySummaryTag.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/tags/ShowEntrySummaryTag.java Tue Apr  3 13:07:41 2007
@@ -32,7 +32,6 @@
 import org.apache.roller.business.PluginManager;
 import org.apache.roller.business.RollerFactory;
 import org.apache.roller.pojos.WeblogEntryData;
-import org.apache.roller.ui.core.RollerContext;
 
 /**
  * Shows entry summary with plugins applied.
@@ -59,8 +58,6 @@
             String xformed = entry.getSummary();
             try {        
                 if (entry.getPlugins() != null) {
-                    RollerContext rctx = 
-                        RollerContext.getRollerContext();
                     PluginManager ppmgr = roller.getPagePluginManager();
                     Map plugins = ppmgr.getWeblogEntryPlugins(
                         entry.getWebsite());

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/tags/ShowEntryTextTag.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/tags/ShowEntryTextTag.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/tags/ShowEntryTextTag.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/authoring/tags/ShowEntryTextTag.java Tue Apr  3 13:07:41 2007
@@ -31,7 +31,6 @@
 import org.apache.roller.business.PluginManager;
 import org.apache.roller.business.RollerFactory;
 import org.apache.roller.pojos.WeblogEntryData;
-import org.apache.roller.ui.core.RollerContext;
 import org.apache.roller.util.Utilities;
 
 /**
@@ -73,8 +72,6 @@
             try {
                 String xformed = sourceText;        
                 if (entry.getPlugins() != null) {
-                    RollerContext rctx = 
-                        RollerContext.getRollerContext();
                     try {
                         PluginManager ppmgr = roller.getPagePluginManager();
                         Map plugins = ppmgr.getWeblogEntryPlugins(

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/RollerContext.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/RollerContext.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/RollerContext.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/RollerContext.java Tue Apr  3 13:07:41 2007
@@ -18,9 +18,7 @@
 
 package org.apache.roller.ui.core;
 
-import EDU.oswego.cs.dl.util.concurrent.SynchronizedInt;
 import java.io.File;
-import java.io.IOException;
 import java.io.InputStream;
 import java.sql.Connection;
 import java.sql.SQLException;
@@ -31,7 +29,6 @@
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
-import javax.servlet.http.HttpSessionEvent;
 import javax.sql.DataSource;
 import org.acegisecurity.providers.ProviderManager;
 import org.acegisecurity.providers.dao.DaoAuthenticationProvider;
@@ -65,63 +62,35 @@
  *
  * @web.listener
  */
-public class RollerContext extends ContextLoaderListener implements ServletContextListener {
+public class RollerContext extends ContextLoaderListener 
+        implements ServletContextListener {
     
-    private static Log mLogger = LogFactory.getLog(RollerContext.class);
+    private static Log log = LogFactory.getLog(RollerContext.class);
     
-    public static final String ROLLER_CONTEXT = "roller.context";
+    private static ServletContext servletContext = null;
     
-    private static ServletContext mContext = null;
-    private final SynchronizedInt mSessionCount = new SynchronizedInt(0);
     
-    
-    /**
-     * Constructor for RollerContext.
-     */
     public RollerContext() {
         super();
     }
     
     
-    /* Returns Roller instance for specified app */
-    public static RollerContext getRollerContext() {
-        // get roller from servlet context
-        ServletContext sc = RollerContext.getServletContext();
-        return (RollerContext) sc.getAttribute(ROLLER_CONTEXT);
-    }
-    
-    
-    /** Responds to app-destroy by saving the indexManager's information */
-    public void contextDestroyed(ServletContextEvent sce) {
-        RollerFactory.getRoller().shutdown();
-        
-        // do we need a more generic mechanism for presentation layer shutdown?
-        CacheManager.shutdown();
-    }
-    
-    
     /**
-     * Responds to context initialization event by processing context
-     * paramters for easy access by the rest of the application.
+     * Responds to app-init event and triggers startup procedures.
      */
     public void contextInitialized(ServletContextEvent sce) {
         
-        try {
-            Class.forName("org.hibernate.Session");
-        } catch (Throwable t) {
-            // if Hibernate is not available, we're hosed
-            throw new RuntimeException(
-               "FATAL ERROR: Hibernate not found, please refer to the Roller Installation Guide for instructions on how to install the required Hibernate jars");
-        }
-        
-        mLogger.debug("RollerContext initializing");
-        
-        // Save context in self and self in context
-        mContext = sce.getServletContext();
-        mContext.setAttribute(ROLLER_CONTEXT, this);
+        // keep a reverence to ServletContext object
+        this.servletContext = sce.getServletContext();
         
+        // 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);
+            
         // get the *real* path to <context>/resources
-        String ctxPath = mContext.getRealPath("/");
+        String ctxPath = servletContext.getRealPath("/");
         if(!ctxPath.endsWith(File.separator))
             ctxPath += File.separator + "resources";
         else
@@ -145,7 +114,7 @@
         // also, the RollerConfig.setThemesDir() method is smart
         // enough to disregard this call unless the themes.dir
         // is set to ${webapp.context}
-        RollerConfig.setThemesDir(mContext.getRealPath("/")+File.separator+"themes");
+        RollerConfig.setThemesDir(servletContext.getRealPath("/")+File.separator+"themes");
         
         try {
             // always upgrade database first
@@ -153,42 +122,69 @@
             
             Roller roller = RollerFactory.getRoller();
             
-            setupRollerProperties();
-            
-            // 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);
-            
-            initializeSecurityFeatures(mContext);
-            
+            setupRuntimeProperties();
+            initializeSecurityFeatures(servletContext);
+            setupSearch();
+            initializePingFeatures();
+            setupThemeLibrary();
+            setupScheduledTasks();
             setupVelocity();
-            roller.getThemeManager();
-            setupIndexManager(roller);
-            initializePingFeatures(roller);
-            setupTasks();
             
             roller.flush();
             roller.release();
             
         } catch (Throwable t) {
-            mLogger.fatal("RollerContext initialization failed", t);
+            log.fatal("Roller Weblogger initialization failed", t);
+            throw new RuntimeException(t);
         }
         
-        mLogger.debug("RollerContext initialization complete");
+        log.info("Roller Weblogger Initialization Complete");
     }
     
     
-    private void setupVelocity() throws RollerException {
+    /** 
+     * Responds to app-destroy event and triggers shutdown sequence.
+     */
+    public void contextDestroyed(ServletContextEvent sce) {
+        
+        RollerFactory.getRoller().shutdown();
         
-        mLogger.info("Initializing Velocity");
+        // do we need a more generic mechanism for presentation layer shutdown?
+        CacheManager.shutdown();
+    }
+    
+    
+    /**
+     * Trigger any database upgrade work that needs to be done.
+     */
+    private void upgradeDatabaseIfNeeded() throws Exception {
+        
+        try {
+            InitialContext ic = new InitialContext();
+            DataSource ds = (DataSource)ic.lookup("java:comp/env/jdbc/rollerdb");
+            Connection con = ds.getConnection();
+            UpgradeDatabase.upgradeDatabase(con, RollerFactory.getRoller().getVersion());
+            con.close();
+        } catch (NamingException e) {
+            log.warn("Unable to access DataSource", e);
+        } catch (SQLException e) {
+            log.warn(e);
+        }
+    }
+    
+    
+    /**
+     * Initialize the Velocity rendering engine.
+     */
+    private void setupVelocity() throws Exception {
+        
+        log.info("Initializing Velocity");
         
         // initialize the Velocity engine
         Properties velocityProps = new Properties();
         
         try {
-            InputStream instream = mContext.getResourceAsStream("/WEB-INF/velocity.properties");
+            InputStream instream = servletContext.getResourceAsStream("/WEB-INF/velocity.properties");
             
             velocityProps.load(instream);
             
@@ -201,7 +197,7 @@
                 velocityProps.setProperty("velocimacro.library", oldLibraries+","+macroLibraries);
             }
             
-            mLogger.debug("Velocity props = "+velocityProps);
+            log.debug("Velocity props = "+velocityProps);
             
             // init velocity
             RuntimeSingleton.init(velocityProps);
@@ -213,14 +209,37 @@
     }
     
     
-    private void setupRollerProperties() throws RollerException {
-        // init property manager by creating it
-        Roller mRoller = RollerFactory.getRoller();
-        mRoller.getPropertiesManager();
+    /**
+     * Initialize the runtime configuration.
+     */
+    private void setupRuntimeProperties() throws Exception {
+        // PropertiesManager initializes itself
+        RollerFactory.getRoller().getPropertiesManager();
+    }
+    
+    
+    /**
+     * Initialize the built-in search engine.
+     */
+    private void setupSearch() throws Exception {
+        // IndexManager initializes itself
+        RollerFactory.getRoller().getIndexManager();
     }
     
     
-    private void setupTasks() throws RollerException {
+    /**
+     * Initialize the Theme Library.
+     */
+    private void setupThemeLibrary() throws Exception {
+        // theme manager initializes itself
+        RollerFactory.getRoller().getThemeManager();
+    }
+    
+    
+    /**
+     * Start up any scheduled background jobs.
+     */
+    private void setupScheduledTasks() throws Exception {
         
         ThreadManager tmgr = RollerFactory.getRoller().getThreadManager();
         
@@ -233,7 +252,7 @@
             
             String taskClassName = RollerConfig.getProperty("tasks."+tasks[i]+".class");
             if(taskClassName != null) {
-                mLogger.info("Initializing task: "+tasks[i]);
+                log.info("Initializing task: "+tasks[i]);
                 
                 try {
                     Class taskClass = Class.forName(taskClassName);
@@ -249,11 +268,11 @@
                     tmgr.scheduleFixedRateTimerTask(task, startTime, task.getInterval());
                     
                 } catch (ClassCastException ex) {
-                    mLogger.warn("Task does not extend RollerTask class", ex);
+                    log.warn("Task does not extend RollerTask class", ex);
                 } catch (RollerException ex) {
-                    mLogger.error("Error scheduling task", ex);
+                    log.error("Error scheduling task", ex);
                 } catch (Exception ex) {
-                    mLogger.error("Error instantiating task", ex);
+                    log.error("Error instantiating task", ex);
                 }
             }
         }
@@ -261,7 +280,7 @@
     
     
     // Initialize ping features
-    private void initializePingFeatures(Roller roller) throws RollerException {
+    private void initializePingFeatures() throws RollerException {
         
         // Initialize common targets from the configuration
         PingConfig.initializeCommonTargets();
@@ -269,17 +288,20 @@
         PingConfig.initializePingVariants();
         // Remove custom ping targets if they have been disallowed
         if (PingConfig.getDisallowCustomTargets()) {
-            mLogger.info("Custom ping targets have been disallowed.  Removing any existing custom targets.");
-            roller.getPingTargetManager().removeAllCustomPingTargets();
+            log.info("Custom ping targets have been disallowed.  Removing any existing custom targets.");
+            RollerFactory.getRoller().getPingTargetManager().removeAllCustomPingTargets();
         }
         // Remove all autoping configurations if ping usage has been disabled.
         if (PingConfig.getDisablePingUsage()) {
-            mLogger.info("Ping usage has been disabled.  Removing any existing auto ping configurations.");
-            roller.getAutopingManager().removeAllAutoPings();
+            log.info("Ping usage has been disabled.  Removing any existing auto ping configurations.");
+            RollerFactory.getRoller().getAutopingManager().removeAllAutoPings();
         }
     }
     
     
+    /**
+     * Setup Acegi security features.
+     */
     protected void initializeSecurityFeatures(ServletContext context) { 
         
         ApplicationContext ctx =
@@ -288,7 +310,7 @@
         String rememberMe = RollerConfig.getProperty("rememberme.enabled");
         boolean rememberMeEnabled = Boolean.valueOf(rememberMe).booleanValue();
         
-        mLogger.info("Remember Me enabled: " + rememberMeEnabled);
+        log.info("Remember Me enabled: " + rememberMeEnabled);
         
         context.setAttribute("rememberMeEnabled", rememberMe);
         
@@ -310,12 +332,12 @@
             } else if (algorithm.equalsIgnoreCase("MD5")) {
                 encoder = new Md5PasswordEncoder();
             } else {
-                mLogger.error("Encryption algorithm '" + algorithm +
+                log.error("Encryption algorithm '" + algorithm +
                         "' not supported, disabling encryption.");
             }
             if (encoder != null) {
                 provider.setPasswordEncoder(encoder);
-                mLogger.info("Password Encryption Algorithm set to '" + algorithm + "'");
+                log.info("Password Encryption Algorithm set to '" + algorithm + "'");
             }
         }
         
@@ -351,54 +373,16 @@
     }
     
     
-    protected void upgradeDatabaseIfNeeded() throws RollerException {
-        
-        try {
-            InitialContext ic = new InitialContext();
-            DataSource ds = (DataSource)ic.lookup("java:comp/env/jdbc/rollerdb");
-            Connection con = ds.getConnection();
-            UpgradeDatabase.upgradeDatabase(con, RollerFactory.getRoller().getVersion());
-            con.close();
-        } catch (NamingException e) {
-            mLogger.warn("Unable to access DataSource", e);
-        } catch (SQLException e) {
-            mLogger.warn(e);
-        }
-    }
-    
-    
-    private void setupIndexManager(Roller roller) throws RollerException {
-        roller.getIndexManager();
-    }
-    
-    
-    public void sessionCreated(HttpSessionEvent se) {
-        mSessionCount.increment();
-        
-        mLogger.debug("sessions="+ mSessionCount
-                    + ":freemem=" + Runtime.getRuntime().freeMemory()
-                    + ":totmem=" + Runtime.getRuntime().totalMemory());
-    }
-    
-    
-    public void sessionDestroyed(HttpSessionEvent se) {
-        mSessionCount.decrement();
-        
-        mLogger.debug("sessions=" + mSessionCount
-                    + ":freemem=" + Runtime.getRuntime().freeMemory()
-                    + ":totalmem=" + Runtime.getRuntime().totalMemory());
-    }
-    
-    
     /**
      * Get the ServletContext.
      *
      * @return ServletContext
      */
     public static ServletContext getServletContext() {
-        return mContext;
+        return servletContext;
     }
-        
+    
+    
     /**
      * Get an instance of AutoProvision, if available in roller.properties
      * 
@@ -416,7 +400,7 @@
       try {
         clazz = Class.forName(clazzName);
       } catch (ClassNotFoundException e) {
-        mLogger.warn("Unable to found specified Auto Provision class.", e);
+        log.warn("Unable to found specified Auto Provision class.", e);
         return null;
       }
       
@@ -431,9 +415,9 @@
             try {
               return (AutoProvision) clazz.newInstance();
             } catch (InstantiationException e) {
-              mLogger.warn("InstantiationException while creating: " + clazzName, e);
+              log.warn("InstantiationException while creating: " + clazzName, e);
             } catch (IllegalAccessException e) {
-              mLogger.warn("IllegalAccessException while creating: " + clazzName, e);
+              log.warn("IllegalAccessException while creating: " + clazzName, e);
             }
           }
       }

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/RollerSession.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/RollerSession.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/RollerSession.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/RollerSession.java Tue Apr  3 13:07:41 2007
@@ -26,8 +26,6 @@
 import javax.servlet.http.HttpSessionActivationListener;
 import javax.servlet.http.HttpSessionEvent;
 import javax.servlet.http.HttpSessionListener;
-
-import org.apache.commons.collections.ArrayStack;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.RollerException;
@@ -111,14 +109,10 @@
     public void sessionCreated(HttpSessionEvent se) {
         RollerSession rollerSession = new RollerSession();
         se.getSession().setAttribute(ROLLER_SESSION, rollerSession);
-        RollerContext rctx = RollerContext.getRollerContext();
-        rctx.sessionCreated(se);
     }
     
     
     public void sessionDestroyed(HttpSessionEvent se) {
-        RollerContext rctx = RollerContext.getRollerContext();
-        rctx.sessionDestroyed(se);
         clearSession(se);
     }
     

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/filters/RequestFilter.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/filters/RequestFilter.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/filters/RequestFilter.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/filters/RequestFilter.java Tue Apr  3 13:07:41 2007
@@ -18,9 +18,6 @@
 package org.apache.roller.ui.core.filters;
 
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.util.Date;
-import java.util.Locale;
 
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
@@ -31,20 +28,12 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
-import javax.servlet.jsp.jstl.core.Config;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.struts.Globals;
-import org.apache.roller.RollerException;
-import org.apache.roller.config.RollerConfig;
 import org.apache.roller.business.Roller;
 import org.apache.roller.business.RollerFactory;
-import org.apache.roller.business.UserManager;
-import org.apache.roller.ui.core.RollerContext;
 import org.apache.roller.ui.core.RollerRequest;
-import org.apache.roller.ui.core.util.RequestUtil;
-
 
 /**
  * Entry point filter for Weblog page and Editor UI, this filter

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/struts/actions/CreateWebsiteAction.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/struts/actions/CreateWebsiteAction.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/struts/actions/CreateWebsiteAction.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/struts/actions/CreateWebsiteAction.java Tue Apr  3 13:07:41 2007
@@ -37,12 +37,11 @@
 import org.apache.roller.config.RollerRuntimeConfig;
 import org.apache.roller.business.Roller;
 import org.apache.roller.business.RollerFactory;
-import org.apache.roller.business.ThemeManager;
+import org.apache.roller.business.themes.ThemeManager;
 import org.apache.roller.business.UserManager;
 import org.apache.roller.pojos.UserData;
 import org.apache.roller.pojos.WebsiteData;
 import org.apache.roller.ui.core.BasePageModel;
-import org.apache.roller.ui.core.RollerContext;
 import org.apache.roller.ui.core.RollerSession;
 import org.apache.roller.ui.authoring.struts.formbeans.CreateWebsiteForm;
 import org.apache.roller.util.Utilities;
@@ -140,7 +139,6 @@
             saveErrors(request, errors);
             forward = mapping.findForward("createWebsite.page");
         } else try {
-            RollerContext rollerContext = RollerContext.getRollerContext();
             UserData user =
                 RollerSession.getRollerSession(request).getAuthenticatedUser();
             UserManager mgr = roller.getUserManager();
@@ -237,7 +235,6 @@
                 HttpServletResponse response, ActionMapping mapping, WebsiteData wd)
                 throws RollerException {
             super("createWebsite.title", request, response, mapping);
-            RollerContext rollerContext = RollerContext.getRollerContext();
             Roller roller = RollerFactory.getRoller();
             ThemeManager themeMgr = roller.getThemeManager();
             themes = themeMgr.getEnabledThemesList();

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/struts/actions/UserNewAction.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/struts/actions/UserNewAction.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/struts/actions/UserNewAction.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/struts/actions/UserNewAction.java Tue Apr  3 13:07:41 2007
@@ -44,7 +44,6 @@
 import org.apache.roller.business.UserManager;
 import org.apache.roller.pojos.UserData;
 import org.apache.roller.ui.core.BasePageModel;
-import org.apache.roller.ui.core.RollerContext;
 import org.apache.roller.ui.core.RollerRequest;
 import org.apache.roller.ui.core.security.CustomUserRegistry;
 import org.apache.roller.ui.authoring.struts.formbeans.UserFormEx;
@@ -139,7 +138,6 @@
         UserFormEx form = (UserFormEx)actionForm;
         RollerRequest rreq = RollerRequest.getRollerRequest(request);
         ServletContext ctx = rreq.getServletContext();
-        RollerContext rollerContext = RollerContext.getRollerContext();
         
         boolean reg_allowed =
                 RollerRuntimeConfig.getBooleanProperty("users.registration.enabled");

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/tags/calendar/BigWeblogCalendarModel.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/tags/calendar/BigWeblogCalendarModel.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/tags/calendar/BigWeblogCalendarModel.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/core/tags/calendar/BigWeblogCalendarModel.java Tue Apr  3 13:07:41 2007
@@ -28,7 +28,6 @@
 import org.apache.roller.business.RollerFactory;
 import org.apache.roller.business.WeblogManager;
 import org.apache.roller.pojos.WeblogEntryData;
-import org.apache.roller.ui.core.RollerContext;
 import org.apache.roller.ui.rendering.util.WeblogPageRequest;
 import org.apache.roller.util.DateUtil;
 import org.apache.roller.util.URLUtilities;
@@ -75,7 +74,6 @@
     public String getContent(Date day) {
         String content = null;
         try {
-            RollerContext rctx = RollerContext.getRollerContext();
             StringBuffer sb = new StringBuffer();
             
             // get the 8 char YYYYMMDD datestring for day, returns null

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/rendering/WeblogRequestMapper.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/rendering/WeblogRequestMapper.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/rendering/WeblogRequestMapper.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/rendering/WeblogRequestMapper.java Tue Apr  3 13:07:41 2007
@@ -193,6 +193,15 @@
             response.sendRedirect(redirectUrl);
             return true;
             
+        } else if(weblogRequestContext != null &&
+                "tags".equals(weblogRequestContext)) {
+            // tags section can have an index page at /<weblog>/tags/ and
+            // a tags query at /<weblog>/tags/tag1+tag2, buth that's it
+            if((weblogRequestData == null && !trailingSlash) ||
+                    (weblogRequestData != null && trailingSlash)) {
+                response.sendError(HttpServletResponse.SC_NOT_FOUND);
+                return true;
+            }
         } else if(weblogRequestContext != null && trailingSlash) {
             // this means that someone has accessed a weblog url and included
             // a trailing slash, like /<weblog>/entry/<anchor>/ which is not

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/rendering/model/FeedModel.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/rendering/model/FeedModel.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/rendering/model/FeedModel.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/rendering/model/FeedModel.java Tue Apr  3 13:07:41 2007
@@ -20,6 +20,7 @@
 
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -51,6 +52,8 @@
     
     private static Log log = LogFactory.getLog(FeedModel.class); 
     
+    private static int DEFAULT_ENTRIES = RollerRuntimeConfig.getIntProperty("site.newsfeeds.defaultEntries");
+    
     private WeblogFeedRequest feedRequest = null;
     private WebsiteData weblog = null;
     
@@ -114,29 +117,12 @@
         return feedRequest.getWeblogCategoryName();
     }
     
-    
     /**
      * Gets most recent entries limited by: weblog and category specified in 
      * request plus the weblog.entryDisplayCount.
      */
     public Pager getWeblogEntriesPager() {
-        
-        // all feeds get the site-wide default # of entries
-        int entryCount =
-                RollerRuntimeConfig.getIntProperty("site.newsfeeds.defaultEntries");
-        
-        String  pagerUrl = URLUtilities.getWeblogFeedURL(weblog, 
-                    feedRequest.getLocale(), feedRequest.getType(),
-                    feedRequest.getFormat(), feedRequest.getWeblogCategoryName(), 
-                    null, feedRequest.getTags(), feedRequest.isExcerpts(), true);
-       
-        return new WeblogEntriesListPager(
-            pagerUrl, weblog, null, feedRequest.getWeblogCategoryName(),
-            feedRequest.getTags(),
-            feedRequest.getLocale(),
-            -1,
-            feedRequest.getPage(), 
-            entryCount);        
+        return new FeedEntriesPager(feedRequest);        
     }
     
     
@@ -145,24 +131,9 @@
      * the weblog.entryDisplayCount.
      */
     public Pager getCommentsPager() {
-            
-        // all feeds get the site-wide default # of entries
-        int entryCount =
-                RollerRuntimeConfig.getIntProperty("site.newsfeeds.defaultEntries");
-        
-        String pagerUrl = URLUtilities.getWeblogFeedURL(weblog, 
-                    feedRequest.getLocale(), feedRequest.getType(),
-                    feedRequest.getFormat(), null, null, null,
-                    feedRequest.isExcerpts(), true);
+        return new FeedCommentsPager(feedRequest);
+    }    
         
-        return new CommentsPager(
-            pagerUrl,
-            feedRequest.getLocale(),
-            -1,
-            feedRequest.getPage(), 
-            entryCount);        
-    }
-    
     /**
      * Returns the list of tags specified in the request /?tags=foo+bar
      * @return
@@ -170,5 +141,69 @@
     public List getTags() {
         return feedRequest.getTags();
     }    
+
+    public static class FeedEntriesPager extends WeblogEntriesListPager {
+        
+        private WeblogFeedRequest feedRequest;
+        
+        public FeedEntriesPager(WeblogFeedRequest feedRequest) {
+            super(URLUtilities.getWeblogFeedURL(feedRequest.getWeblog(), 
+                    feedRequest.getLocale(), feedRequest.getType(),
+                    feedRequest.getFormat(), null, null, null, false, true), 
+                    feedRequest.getWeblog(), null, null, feedRequest.getTags(),
+                    feedRequest.getLocale(), -1, feedRequest.getPage(), DEFAULT_ENTRIES);
+            this.feedRequest = feedRequest;
+        }
+        
+        protected String createURL(String url, Map params) {
+            List tags = feedRequest.getTags();
+            if(tags != null && tags.size() > 0) {
+                params.put("tags", URLUtilities.getEncodedTagsString(tags));
+            }
+            String category = feedRequest.getWeblogCategoryName();
+            if(category != null && category.trim().length() > 0) {
+                params.put("cat", URLUtilities.encode(category));
+            }  
+            if(feedRequest.isExcerpts()) {
+                params.put("excerpts", "true");
+            }            
+            return super.createURL(url, params);
+        }
+        
+        public String getUrl() {
+            return createURL(super.getUrl(), new HashMap());
+        }
+    }
     
+    public static class FeedCommentsPager extends CommentsPager {
+        
+        private WeblogFeedRequest feedRequest;
+        
+        public FeedCommentsPager(WeblogFeedRequest feedRequest) {            
+            super(URLUtilities.getWeblogFeedURL(feedRequest.getWeblog(), 
+                    feedRequest.getLocale(), feedRequest.getType(),
+                    feedRequest.getFormat(), null, null,
+                    null, false, true), feedRequest.getLocale(), -1, feedRequest.getPage(), DEFAULT_ENTRIES);
+            this.feedRequest = feedRequest;
+        }
+        
+        protected String createURL(String url, Map params) {
+            List tags = feedRequest.getTags();
+            if(tags != null && tags.size() > 0) {
+                params.put("tags", URLUtilities.getEncodedTagsString(tags));
+            }
+            String category = feedRequest.getWeblogCategoryName();
+            if(category != null && category.trim().length() > 0) {
+                params.put("cat", URLUtilities.encode(category));
+            }  
+            if(feedRequest.isExcerpts()) {
+                params.put("excerpts", "true");
+            }   
+            return super.createURL(url, params);
+        }
+        
+        public String getUrl() {
+            return createURL(super.getUrl(), new HashMap());
+        }
+    }      
 }

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/rendering/model/SearchResultsFeedModel.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/rendering/model/SearchResultsFeedModel.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/rendering/model/SearchResultsFeedModel.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/rendering/model/SearchResultsFeedModel.java Tue Apr  3 13:07:41 2007
@@ -111,7 +111,7 @@
         String  pagerUrl = URLUtilities.getWeblogFeedURL(weblog, 
                 feedRequest.getLocale(), feedRequest.getType(),
                 feedRequest.getFormat(), null, null, /* cat and term are null but added to the url in the pager */
-                feedRequest.getTags(), feedRequest.isExcerpts(), true);
+                null, false, true);
         
         // if there is no query, then we are done
         if(feedRequest.getTerm() == null) {

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/rendering/model/URLModel.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/rendering/model/URLModel.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/rendering/model/URLModel.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/rendering/model/URLModel.java Tue Apr  3 13:07:41 2007
@@ -350,7 +350,7 @@
         }
         
         public String search(String term, String catPath) {
-            return URLUtilities.getWeblogFeedURL(weblog, locale, "search", "atom", catPath, term, null, false, true);
+            return URLUtilities.getWeblogFeedURL(weblog, locale, "entries", "atom", catPath, term, null, false, true);
         }        
         
         public String atomByTags(List tags, boolean excerpts) {

Modified: incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/rendering/pagers/SearchResultsFeedPager.java
URL: http://svn.apache.org/viewvc/incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/rendering/pagers/SearchResultsFeedPager.java?view=diff&rev=525260&r1=525259&r2=525260
==============================================================================
--- incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/rendering/pagers/SearchResultsFeedPager.java (original)
+++ incubator/roller/branches/roller_4.0_newbackend/src/org/apache/roller/ui/rendering/pagers/SearchResultsFeedPager.java Tue Apr  3 13:07:41 2007
@@ -89,6 +89,13 @@
         String term = feedRequest.getTerm();
         if(term != null && term.trim().length() > 0) {
             params.put("q", URLUtilities.encode(term.trim()));
+        }     
+        List tags = feedRequest.getTags();
+        if(tags != null && tags.size() > 0) {
+            params.put("tags", URLUtilities.getEncodedTagsString(tags));
+        }
+        if(feedRequest.isExcerpts()) {
+            params.put("excerpts", "true");
         }        
         return super.createURL(url, params);
     }