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/06/04 04:21:36 UTC

svn commit: r544034 - in /roller/branches/roller_guice: ./ apps/planet/ apps/planet/src/java/org/apache/roller/planet/business/hibernate/ apps/planet/src/java/org/apache/roller/planet/pojos/ apps/weblogger/ apps/weblogger/src/java/org/apache/roller/web...

Author: snoopdave
Date: Sun Jun  3 19:21:35 2007
New Revision: 544034

URL: http://svn.apache.org/viewvc?view=rev&rev=544034
Log:
More merging from truink

Added:
    roller/branches/roller_guice/tools/buildtime/junit-4.1.jar
      - copied unchanged from r544028, roller/trunk/tools/buildtime/junit-4.1.jar
Removed:
    roller/branches/roller_guice/tools/buildtime/junit-3.8.1.jar
Modified:
    roller/branches/roller_guice/apps/planet/build.xml
    roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/business/hibernate/HibernatePersistenceStrategy.java
    roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/business/hibernate/HibernatePlanetManagerImpl.java
    roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/pojos/PlanetData.java
    roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/pojos/PlanetEntryData.java
    roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/pojos/PlanetGroupData.java
    roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/pojos/PlanetSubscriptionData.java
    roller/branches/roller_guice/apps/weblogger/properties.xmlf
    roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/planet/ui/PlanetConfig.java
    roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/planet/ui/PlanetGroups.java
    roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/model/URLModel.java
    roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentServlet.java
    roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/servlets/TrackbackServlet.java
    roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/util/MailUtil.java
    roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/util/URLUtilities.java
    roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/util/Utilities.java
    roller/branches/roller_guice/apps/weblogger/web/WEB-INF/jsps/admin/PlanetConfig.jsp
    roller/branches/roller_guice/apps/weblogger/web/WEB-INF/jsps/admin/PlanetGroups.jsp
    roller/branches/roller_guice/apps/weblogger/web/WEB-INF/jsps/admin/PlanetSubscriptions.jsp
    roller/branches/roller_guice/merges.txt

Modified: roller/branches/roller_guice/apps/planet/build.xml
URL: http://svn.apache.org/viewvc/roller/branches/roller_guice/apps/planet/build.xml?view=diff&rev=544034&r1=544033&r2=544034
==============================================================================
--- roller/branches/roller_guice/apps/planet/build.xml (original)
+++ roller/branches/roller_guice/apps/planet/build.xml Sun Jun  3 19:21:35 2007
@@ -135,7 +135,7 @@
         <fileset dir="${tools}/buildtime/mockrunner-0.35/lib">
             <include name="*.jar"/>
         </fileset>
-        <pathelement location="${tools}/buildtime/junit-3.8.1.jar"/>
+        <pathelement location="${tools}/buildtime/junit-4.1.jar"/>
         <pathelement location="${tools}/buildtime/ant-1.6.2/ant-junit.jar"/>
         <pathelement location="${tools}/buildtime/derby.jar"/>
         <pathelement location="${tools}/buildtime/derbyclient.jar"/>

Modified: roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/business/hibernate/HibernatePersistenceStrategy.java
URL: http://svn.apache.org/viewvc/roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/business/hibernate/HibernatePersistenceStrategy.java?view=diff&rev=544034&r1=544033&r2=544034
==============================================================================
--- roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/business/hibernate/HibernatePersistenceStrategy.java (original)
+++ roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/business/hibernate/HibernatePersistenceStrategy.java Sun Jun  3 19:21:35 2007
@@ -18,20 +18,17 @@
 
 package org.apache.roller.planet.business.hibernate;
 
-import java.io.StringBufferInputStream;
 import java.util.Properties;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.roller.planet.PlanetException;
 import org.hibernate.HibernateException;
 import org.hibernate.Session;
 import org.hibernate.SessionFactory;
 import org.hibernate.Transaction;
 import org.hibernate.cfg.Configuration;
-import org.apache.roller.planet.PlanetException;
 import org.apache.roller.planet.config.PlanetConfig;
 import org.hibernate.cfg.Environment;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.InputSource;
 
 
 /**
@@ -43,16 +40,8 @@
  */
 @com.google.inject.Singleton
 public class HibernatePersistenceStrategy {
-    private static Log log = LogFactory.getLog(HibernatePersistenceStrategy.class);
-    
-    protected static SessionFactory sessionFactory = null;
-    
-    /** No-op so XML parser doesn't hit the network looking for Hibernate DTDs */
-    private EntityResolver noOpEntityResolver = new EntityResolver() {
-        public InputSource resolveEntity(String publicId, String systemId) {
-            return new InputSource(new StringBufferInputStream(""));
-        }
-    };
+    private static final Log log = LogFactory.getLog(HibernatePersistenceStrategy.class);
+    private SessionFactory sessionFactory = null;
     
     /**
      * Persistence strategy configures itself by using Roller properties:
@@ -79,7 +68,7 @@
         props.put(Environment.CONNECTION_PROVIDER, connectionProvider);
         config.mergeProperties(props);
         
-        this.sessionFactory = config.buildSessionFactory(); 
+        sessionFactory = config.buildSessionFactory(); 
     }
     
     

Modified: roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/business/hibernate/HibernatePlanetManagerImpl.java
URL: http://svn.apache.org/viewvc/roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/business/hibernate/HibernatePlanetManagerImpl.java?view=diff&rev=544034&r1=544033&r2=544034
==============================================================================
--- roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/business/hibernate/HibernatePlanetManagerImpl.java (original)
+++ roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/business/hibernate/HibernatePlanetManagerImpl.java Sun Jun  3 19:21:35 2007
@@ -101,13 +101,6 @@
     
     // save a Group
     public void saveGroup(PlanetGroupData group)  throws PlanetException {
-        // TODO: move this check outside this method?
-        if (group.getId() == null || getGroupById(group.getId()) == null) {
-            // If new group, make sure hadnle is unique within Planet
-            if (getGroup(group.getPlanet(), group.getHandle()) != null) {
-                throw new PlanetException("ERROR group handle already exists in Planet");
-            }
-        }
         strategy.store(group);
     }
         

Modified: roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/pojos/PlanetData.java
URL: http://svn.apache.org/viewvc/roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/pojos/PlanetData.java?view=diff&rev=544034&r1=544033&r2=544034
==============================================================================
--- roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/pojos/PlanetData.java (original)
+++ roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/pojos/PlanetData.java Sun Jun  3 19:21:35 2007
@@ -58,7 +58,7 @@
     
     
     /**
-     * @hibernate.id column="id" generator-class="uuid.hex" unsaved-value="null"
+     * @hibernate.id column="id" generator-class="assigned"
      */
     public String getId() {
         return id;

Modified: roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/pojos/PlanetEntryData.java
URL: http://svn.apache.org/viewvc/roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/pojos/PlanetEntryData.java?view=diff&rev=544034&r1=544033&r2=544034
==============================================================================
--- roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/pojos/PlanetEntryData.java (original)
+++ roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/pojos/PlanetEntryData.java Sun Jun  3 19:21:35 2007
@@ -180,7 +180,7 @@
     //----------------------------------------------------------- persistent fields
     
     /**
-     * @hibernate.id column="id" generator-class="uuid.hex" unsaved-value="null"
+     * @hibernate.id column="id" generator-class="assigned"
      * @roller.wrapPojoMethod type="simple"
      */
     public String getId() {

Modified: roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/pojos/PlanetGroupData.java
URL: http://svn.apache.org/viewvc/roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/pojos/PlanetGroupData.java?view=diff&rev=544034&r1=544033&r2=544034
==============================================================================
--- roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/pojos/PlanetGroupData.java (original)
+++ roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/pojos/PlanetGroupData.java Sun Jun  3 19:21:35 2007
@@ -24,6 +24,7 @@
 import java.util.TreeSet;
 import org.apache.roller.planet.business.PlanetFactory;
 import org.apache.roller.planet.business.PlanetManager;
+import org.apache.roller.util.UUIDGenerator;
 
 
 /**
@@ -36,7 +37,7 @@
     transient private String[] catArray = null;
     
     // attributes
-    private String id = null;
+    private String id = UUIDGenerator.generateUUID();
     private String handle = null;
     private String title = null;
     private String description = null;
@@ -71,7 +72,7 @@
     
     
     /**
-     * @hibernate.id column="id" generator-class="uuid.hex" unsaved-value="null"
+     * @hibernate.id column="id" generator-class="assigned"
      */
     public String getId() {
         return id;

Modified: roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/pojos/PlanetSubscriptionData.java
URL: http://svn.apache.org/viewvc/roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/pojos/PlanetSubscriptionData.java?view=diff&rev=544034&r1=544033&r2=544034
==============================================================================
--- roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/pojos/PlanetSubscriptionData.java (original)
+++ roller/branches/roller_guice/apps/planet/src/java/org/apache/roller/planet/pojos/PlanetSubscriptionData.java Sun Jun  3 19:21:35 2007
@@ -71,7 +71,7 @@
     
     
     /**
-     * @hibernate.id column="id" generator-class="uuid.hex" unsaved-value="null"
+     * @hibernate.id column="id" generator-class="assigned"
      */
     public String getId() {
         return id;

Modified: roller/branches/roller_guice/apps/weblogger/properties.xmlf
URL: http://svn.apache.org/viewvc/roller/branches/roller_guice/apps/weblogger/properties.xmlf?view=diff&rev=544034&r1=544033&r2=544034
==============================================================================
--- roller/branches/roller_guice/apps/weblogger/properties.xmlf (original)
+++ roller/branches/roller_guice/apps/weblogger/properties.xmlf Sun Jun  3 19:21:35 2007
@@ -187,7 +187,6 @@
     <fileset refid="base.jars"/>
     <fileset refid="mail.jars"/>
     <fileset refid="roller-core.jars" />
-    <fileset refid="roller-planet.jars" />
     <fileset refid="xmlrpc.jars"/>
     <!-- JPA bytecode enhancement apparently wants JPA classes everywhere -->
     <fileset refid="jpa.jars" />
@@ -202,6 +201,7 @@
 <path id="presentation.path">
     <path refid="base.path"/>
     <fileset refid="presentation.jars"/>
+    <fileset refid="roller-planet.jars" />
     <fileset refid="struts.jars"/>
     <fileset refid="struts2.jars"/>
     <fileset refid="servlet.jars"/>
@@ -236,7 +236,7 @@
        <include name="*.jar"/>
     </fileset>
     <fileset refid="commons-httpclient.jar"/>
-    <pathelement location="${ro.tools}/buildtime/junit-3.8.1.jar"/>
+    <pathelement location="${ro.tools}/buildtime/junit-4.1.jar"/>
     <pathelement location="${ro.tools}/buildtime/ant-1.6.2/ant-junit.jar"/>
     <pathelement location="${ro.tools}/buildtime/derby.jar"/>
     <pathelement location="${ro.tools}/buildtime/derbyclient.jar"/>

Modified: roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/planet/ui/PlanetConfig.java
URL: http://svn.apache.org/viewvc/roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/planet/ui/PlanetConfig.java?view=diff&rev=544034&r1=544033&r2=544034
==============================================================================
--- roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/planet/ui/PlanetConfig.java (original)
+++ roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/planet/ui/PlanetConfig.java Sun Jun  3 19:21:35 2007
@@ -20,12 +20,16 @@
 
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.RollerException;
 import org.apache.roller.planet.business.PlanetFactory;
 import org.apache.roller.planet.business.PropertiesManager;
+import org.apache.roller.planet.config.PlanetRuntimeConfig;
+import org.apache.roller.planet.config.runtime.ConfigDef;
+import org.apache.roller.planet.config.runtime.RuntimeConfigDefs;
 import org.apache.roller.planet.pojos.PropertyData;
 import org.apache.struts2.interceptor.ParameterAware;
 
@@ -45,11 +49,14 @@
     // runtime properties data
     private Map properties = Collections.EMPTY_MAP;
     
+    // the runtime config def used to populate the display
+    private ConfigDef globalConfigDef = null;
+    
     
     public PlanetConfig() {
         this.actionName = "planetConfig";
         this.desiredMenu = "admin";
-        this.pageTitle = "";
+        this.pageTitle = "planetConfig.title";
     }
     
     
@@ -73,6 +80,15 @@
         } catch (RollerException ex) {
             log.error("Error loading planet properties");
         }
+        
+        // set config def used to draw the view
+        RuntimeConfigDefs defs = PlanetRuntimeConfig.getRuntimeConfigDefs();
+        List<ConfigDef> configDefs = defs.getConfigDefs();
+        for(ConfigDef configDef : configDefs) {
+            if("global-properties".equals(configDef.getName())) {
+                setGlobalConfigDef(configDef);
+            }
+        }
     }
 
     
@@ -152,6 +168,14 @@
 
     public void setProperties(Map properties) {
         this.properties = properties;
+    }
+    
+    public ConfigDef getGlobalConfigDef() {
+        return globalConfigDef;
+    }
+
+    public void setGlobalConfigDef(ConfigDef globalConfigDef) {
+        this.globalConfigDef = globalConfigDef;
     }
     
 }

Modified: roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/planet/ui/PlanetGroups.java
URL: http://svn.apache.org/viewvc/roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/planet/ui/PlanetGroups.java?view=diff&rev=544034&r1=544033&r2=544034
==============================================================================
--- roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/planet/ui/PlanetGroups.java (original)
+++ roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/planet/ui/PlanetGroups.java Sun Jun  3 19:21:35 2007
@@ -164,6 +164,8 @@
         if(getBean().getHandle() != null && "all".equals(getBean().getHandle())) {
             addError("planetGroups.error.nameReserved");
         }
+        
+        // make sure duplicate group handles are prevented
     }
     
     

Modified: roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/model/URLModel.java
URL: http://svn.apache.org/viewvc/roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/model/URLModel.java?view=diff&rev=544034&r1=544033&r2=544034
==============================================================================
--- roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/model/URLModel.java (original)
+++ roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/model/URLModel.java Sun Jun  3 19:21:35 2007
@@ -107,11 +107,11 @@
     public String action(String action, String namespace) {
         if(namespace != null) {
             if("/roller-ui".equals(namespace)) {
-                return URLUtilities.getActionURL(action, namespace, null, true);
+                return URLUtilities.getActionURL(action, namespace, null, null, true);
             } else if("/roller-ui/authoring".equals(namespace)) {
-                return URLUtilities.getActionURL(action, namespace, weblog.getHandle(), true);
+                return URLUtilities.getActionURL(action, namespace, weblog.getHandle(), null, true);
             } else if("/roller-ui/admin".equals(namespace)) {
-                return URLUtilities.getActionURL(action, namespace, null, true);
+                return URLUtilities.getActionURL(action, namespace, null, null, true);
             }
         }
         return null;

Modified: roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentServlet.java
URL: http://svn.apache.org/viewvc/roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentServlet.java?view=diff&rev=544034&r1=544033&r2=544034
==============================================================================
--- roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentServlet.java (original)
+++ roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentServlet.java Sun Jun  3 19:21:35 2007
@@ -20,22 +20,12 @@
 
 import java.io.IOException;
 import java.sql.Timestamp;
-import java.text.MessageFormat;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-import javax.mail.MessagingException;
-import javax.mail.Session;
-import javax.naming.Context;
-import javax.naming.NamingException;
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.WebloggerException;
@@ -46,10 +36,8 @@
 import org.apache.roller.weblogger.business.UserManager;
 import org.apache.roller.weblogger.business.WeblogManager;
 import org.apache.roller.weblogger.pojos.WeblogEntryComment;
-import org.apache.roller.weblogger.pojos.User;
 import org.apache.roller.weblogger.pojos.WeblogEntry;
 import org.apache.roller.weblogger.pojos.Weblog;
-import org.apache.roller.weblogger.ui.rendering.model.UtilitiesModel;
 import org.apache.roller.weblogger.ui.rendering.util.CommentAuthenticator;
 import org.apache.roller.weblogger.ui.rendering.util.CommentValidationManager;
 import org.apache.roller.weblogger.ui.rendering.util.DefaultCommentAuthenticator;
@@ -60,9 +48,7 @@
 import org.apache.roller.weblogger.util.MailUtil;
 import org.apache.roller.weblogger.util.I18nMessages;
 import org.apache.roller.weblogger.util.RollerMessages;
-import org.apache.roller.weblogger.util.RollerMessages.RollerMessage;
 import org.apache.roller.weblogger.util.URLUtilities;
-import org.apache.roller.weblogger.util.Utilities;
 import org.apache.roller.weblogger.util.cache.CacheManager;
 
 
@@ -77,16 +63,11 @@
  *
  * If email notification is turned on, each new comment will result in an
  * email sent to the blog owner and all who have commented on the same post.
- *
- * @web.servlet name="CommentServlet" load-on-startup="7"
- * @web.servlet-mapping url-pattern="/roller-ui/rendering/comment/*"
  */
 public class CommentServlet extends HttpServlet {
     
     private static Log log = LogFactory.getLog(CommentServlet.class);
     
-    private static final String EMAIL_ADDR_REGEXP = "^.*@.*[.].{2,}$";
-    
     private CommentAuthenticator     authenticator = null;
     private CommentValidationManager commentValidationManager = null;
     private GenericThrottle          commentThrottle = null;
@@ -157,8 +138,7 @@
      * The CommentServlet does not support GET requests, it's a 404.
      */
     public void doGet(HttpServletRequest request, HttpServletResponse response)
-    throws IOException, ServletException {
-        
+            throws IOException, ServletException {
         response.sendError(HttpServletResponse.SC_NOT_FOUND);
     }
     
@@ -169,7 +149,7 @@
      * Here we handle incoming comment postings.
      */
     public void doPost(HttpServletRequest request, HttpServletResponse response)
-    throws IOException, ServletException {
+            throws IOException, ServletException {
         
         String error = null;
         String dispatch_url = null;
@@ -237,7 +217,7 @@
         }
         
         
-        log.debug("Doing comment posting for entry = "+entry.getPermaLink());
+        log.debug("Doing comment posting for entry = "+entry.getPermalink());
         
         // collect input from request params and construct new comment object
         // fields: name, email, url, content, notify
@@ -307,14 +287,21 @@
                     mgr.saveComment(comment);
                     RollerFactory.getRoller().flush();
                     
-                    // Send email notifications, but only to subscribers if comment is 100% valid
+                    // Send email notifications only to subscribers if comment is 100% valid
                     boolean notifySubscribers = (validationScore == 100);
-                    String rootURL = RollerRuntimeConfig.getAbsoluteContextURL();
-                    sendEmailNotification(comment, notifySubscribers, messages, rootURL, messageUtils);
+                    MailUtil.sendEmailNotification(comment, messages, messageUtils, notifySubscribers);
                     
                     // only re-index/invalidate the cache if comment isn't moderated
                     if(!weblog.getCommentModerationRequired()) {
-                        reindexEntry(entry);
+                        IndexManager manager = RollerFactory.getRoller().getIndexManager();
+                        
+                        // remove entry before (re)adding it, or in case it isn't Published
+                        manager.removeEntryIndexOperation(entry);
+                        
+                        // if published, index the entry
+                        if (entry.isPublished()) {
+                            manager.addEntryIndexOperation(entry);
+                        }
                         
                         // Clear all caches associated with comment
                         CacheManager.invalidate(comment);
@@ -344,313 +331,6 @@
         RequestDispatcher dispatcher =
                 request.getRequestDispatcher(dispatch_url);
         dispatcher.forward(request, response);
-    }
-    
-    
-    /**
-     * Re-index the WeblogEntry so that the new comment gets indexed.
-     */
-    private void reindexEntry(WeblogEntry entry)
-    throws WebloggerException {
-        
-        IndexManager manager = RollerFactory.getRoller().getIndexManager();
-        
-        // remove entry before (re)adding it, or in case it isn't Published
-        manager.removeEntryIndexOperation(entry);
-        
-        // if published, index the entry
-        if (entry.isPublished()) {
-            manager.addEntryIndexOperation(entry);
-        }
-    }
-    
-    
-    /**
-     * Send email notification of new or newly approved comment.
-     * TODO: Make the addressing options configurable on a per-website basis.
-     *
-     * @param commentObject      The new comment
-     * @param notifySubscribers  True if subscribers are to be notified
-     * @param messages           Messages to be included in e-mail (or null). 
-     *                           Errors will be assumed to be "validation errors" 
-     *                           and messages will be assumed to be "from the system"
-     * @param rootURL            Root URL of the Roller site
-     */
-    public static void sendEmailNotification(
-            WeblogEntryComment commentObject, boolean notifySubscribers,
-            RollerMessages messages, String rootURL, I18nMessages resources) {
-        
-        WeblogEntry entry = commentObject.getWeblogEntry();
-        Weblog site = entry.getWebsite();
-        User user = entry.getCreator();
-        
-        // Send e-mail to owner and subscribed users (if enabled)
-        boolean notify = RollerRuntimeConfig.getBooleanProperty("users.comments.emailnotify");
-        if (notify && site.getEmailComments().booleanValue()) {
-            log.debug("Comment notification enabled ... preparing email");
-            
-            // Determine message and addressing options from init parameters
-            boolean hideCommenterAddrs = RollerConfig.getBooleanProperty(
-                    "comment.notification.hideCommenterAddresses");
-            
-            //------------------------------------------
-            // --- Determine the "from" address
-            // --- Use either the site configured from address or the user's address
-            
-            String from =
-                    (StringUtils.isEmpty(site.getEmailFromAddress()))
-                    ? user.getEmailAddress()
-                    : site.getEmailFromAddress();
-            
-            //------------------------------------------
-            // --- Build list of email addresses to send notification to
-            
-            List comments = entry.getComments(true, true);
-            
-            Set subscribers = new TreeSet();
-            
-            // If we are to notify subscribers, then...
-            if (notifySubscribers) {
-                log.debug("Sending notification email to all subscribers");
-                
-                // Get all the subscribers to this comment thread
-                for (Iterator it = comments.iterator(); it.hasNext();) {
-                    WeblogEntryComment comment = (WeblogEntryComment) it.next();
-                    if (!StringUtils.isEmpty(comment.getEmail())) {
-                        // If user has commented twice,
-                        // count the most recent notify setting
-                        if (comment.getNotify().booleanValue()) {
-                            // only add those with valid email
-                            if (comment.getEmail().matches(EMAIL_ADDR_REGEXP)) {
-                                subscribers.add(comment.getEmail());
-                            }
-                        } else {
-                            // remove user who doesn't want to be notified
-                            subscribers.remove(comment.getEmail());
-                        }
-                    }
-                }
-            } else {
-                log.debug("Sending notification email only to weblog owner");
-            }
-            
-            // Form array of commenter addrs
-            String[] commenterAddrs = (String[])subscribers.toArray(new String[0]);
-            
-            //------------------------------------------
-            // --- Form the messages to be sent -
-            // Build separate owner and commenter (aka subscriber) messages
-            
-            // Determine with mime type to use for e-mail
-            StringBuffer msg = new StringBuffer();
-            StringBuffer ownermsg = new StringBuffer();
-            boolean escapeHtml = RollerRuntimeConfig.getBooleanProperty("users.comments.escapehtml");
-            
-            // first the commenter message
-            
-            if (!escapeHtml) {
-                msg.append("<html><body style=\"background: white; ");
-                msg.append(" color: black; font-size: 12px\">");
-            }
-            
-            if (!StringUtils.isEmpty(commentObject.getName())) {
-                msg.append(commentObject.getName() + " "
-                        + resources.getString("email.comment.wrote")+": ");
-            } else {
-                msg.append(resources.getString("email.comment.anonymous")+": ");
-            }
-            
-            msg.append((escapeHtml) ? "\n\n" : "<br /><br />");
-            
-            msg.append((escapeHtml) ? Utilities.escapeHTML(commentObject.getContent())
-            : UtilitiesModel.transformToHTMLSubset(Utilities.escapeHTML(commentObject.getContent())));
-            
-            msg.append((escapeHtml) ? "\n\n----\n"
-                    : "<br /><br /><hr /><span style=\"font-size: 11px\">");
-            msg.append(resources.getString("email.comment.respond") + ": ");
-            msg.append((escapeHtml) ? "\n" : "<br />");
-            
-            // Build link back to comment
-            StringBuffer commentURL = new StringBuffer(rootURL);
-            commentURL.append(entry.getPermaLink());
-            commentURL.append("#comments");
-            
-            if (escapeHtml) {
-                msg.append(commentURL.toString());
-            } else {
-                msg.append("<a href=\""+commentURL+"\">"+commentURL+"</a></span>");
-            }
-            
-            // next the owner message
-            
-            // First, list any messages from the system that were passed in:
-            if (messages.getMessageCount() > 0) {
-                ownermsg.append((escapeHtml) ? "" : "<p>");
-                ownermsg.append(resources.getString("commentServlet.email.thereAreSystemMessages"));
-                ownermsg.append((escapeHtml) ? "\n\n" : "</p>");
-                ownermsg.append((escapeHtml) ? "" : "<ul>");
-            }
-            for (Iterator it = messages.getMessages(); it.hasNext();) {
-                RollerMessage rollerMessage = (RollerMessage)it.next();
-                ownermsg.append((escapeHtml) ? "" : "<li>");
-                ownermsg.append(MessageFormat.format(resources.getString(rollerMessage.getKey()), (Object[])rollerMessage.getArgs()) );
-                ownermsg.append((escapeHtml) ? "\n\n" : "</li>");
-            }
-            if (messages.getMessageCount() > 0) {
-                ownermsg.append((escapeHtml) ? "\n\n" : "</ul>");
-            }
-            
-            // Next, list any validation error messages that were passed in:
-            if (messages.getErrorCount() > 0) {
-                ownermsg.append((escapeHtml) ? "" : "<p>");
-                ownermsg.append(resources.getString("commentServlet.email.thereAreErrorMessages"));
-                ownermsg.append((escapeHtml) ? "\n\n" : "</p>");
-                ownermsg.append((escapeHtml) ? "" : "<ul>");
-            }
-            for (Iterator it = messages.getErrors(); it.hasNext();) {
-                RollerMessage rollerMessage = (RollerMessage)it.next();
-                ownermsg.append((escapeHtml) ? "" : "<li>");
-                ownermsg.append(MessageFormat.format(resources.getString(rollerMessage.getKey()), (Object[])rollerMessage.getArgs()) );
-                ownermsg.append((escapeHtml) ? "\n\n" : "</li>");
-            }
-            if (messages.getErrorCount() > 0) {
-                ownermsg.append((escapeHtml) ? "\n\n" : "</ul>");
-            }
-            
-            ownermsg.append(msg);
-            
-            // add link to weblog edit page so user can login to manage comments
-            ownermsg.append((escapeHtml) ? "\n\n----\n" :
-                "<br /><br /><hr /><span style=\"font-size: 11px\">");
-            ownermsg.append("Link to comment management page:");
-            ownermsg.append((escapeHtml) ? "\n" : "<br />");
-            
-            StringBuffer deleteURL = new StringBuffer(rootURL);
-            deleteURL.append("/roller-ui/authoring/comments.rol?entryId=" + entry.getId());
-            
-            if (escapeHtml) {
-                ownermsg.append(deleteURL.toString());
-            } else {
-                ownermsg.append(
-                        "<a href=\"" + deleteURL + "\">" + deleteURL + "</a></span>");
-                msg.append("</Body></html>");
-                ownermsg.append("</Body></html>");
-            }
-            
-            String subject = null;
-            if ((subscribers.size() > 1) ||
-                    (StringUtils.equals(commentObject.getEmail(), user.getEmailAddress()))) {
-                subject= "RE: "+resources.getString("email.comment.title")+": ";
-            } else {
-                subject = resources.getString("email.comment.title") + ": ";
-            }
-            subject += entry.getTitle();
-            
-            //------------------------------------------
-            // --- Send message to email recipients
-            try {
-                boolean isHtml = !escapeHtml;
-                // Send separate messages to owner and commenters
-                sendMessage(
-                    from, new String[]{user.getEmailAddress()}, null, 
-                    null, subject, ownermsg.toString(), isHtml);
-                if (notifySubscribers && commenterAddrs.length > 0) {
-                    // If hiding commenter addrs, they go in Bcc: otherwise in the To: of the second message
-                    String[] to = hideCommenterAddrs ? null : commenterAddrs;
-                    String[] bcc = hideCommenterAddrs ? commenterAddrs : null;
-                    sendMessage(from, to, null, bcc, subject, msg.toString(), isHtml);
-
-                }
-            } catch (Exception e) {
-                log.warn("Exception sending comment mail: " + e.getMessage());
-                // This will log the stack trace if debug is enabled
-                if (log.isDebugEnabled()) {
-                    log.debug(e);
-                }
-            }
-            
-            log.debug("Done sending email message");
-            
-        } // if email enabled
-    }
-    
-    
-    /**
-     * Send message to author of approved comment
-     *
-     * TODO: Make the addressing options configurable on a per-website basis.
-     */
-    public static void sendEmailApprovalNotification(WeblogEntryComment cd, String rootURL, I18nMessages resources) {
-        
-        WeblogEntry entry = cd.getWeblogEntry();
-        Weblog site = entry.getWebsite();
-        User user = entry.getCreator();
-        
-        // Only send email if email notificaiton is enabled
-        boolean notify = RollerRuntimeConfig.getBooleanProperty("users.comments.emailnotify");
-        if (notify && site.getEmailComments().booleanValue()) {
-            log.debug("Comment notification enabled ... preparing email");
-            
-            
-            
-            //------------------------------------------
-            // --- Determine the "from" address
-            // --- Use either the site configured from address or the user's address
-            
-            String from =
-                    (StringUtils.isEmpty(site.getEmailFromAddress()))
-                    ? user.getEmailAddress()
-                    : site.getEmailFromAddress();
-            
-            //------------------------------------------
-            // --- Form the message to be sent -
-            
-            String subject = resources.getString("email.comment.commentApproved");
-            
-            StringBuffer msg = new StringBuffer();
-            msg.append(resources.getString("email.comment.commentApproved"));
-            msg.append("\n\n");
-            
-            // Build link back to comment
-            StringBuffer commentURL = new StringBuffer();
-            commentURL.append(entry.getPermalink());
-            commentURL.append("#comments");
-            msg.append(commentURL.toString());
-            
-            //------------------------------------------
-            // --- Send message to author of approved comment
-            try {
-                String[] cc = null;
-                String[] bcc = null;
-                sendMessage(from,
-                        new String[] {cd.getEmail()},
-                        null, // cc
-                        null, // bcc
-                        subject, msg.toString(), false);
-            } catch (Exception e) {
-                log.warn("Exception sending comment mail: " + e.getMessage());
-                // This will log the stack trace if debug is enabled
-                if (log.isDebugEnabled()) {
-                    log.debug(e);
-                }
-            }
-            
-            log.debug("Done sending email message");
-            
-        } // if email enabled
-    }
-    
-    
-    /*
-     * This is somewhat ridiculous, but avoids duplicating a bunch of logic
-     * in the already messy sendEmailNotification.
-     */
-    static void sendMessage(String from, String[] to, String[] cc, String[] bcc, String subject,
-            String msg, boolean isHtml) throws MessagingException {
-        if (isHtml)
-            MailUtil.sendHTMLMessage(from, to, cc, bcc, subject, msg);
-        else
-            MailUtil.sendTextMessage(from, to, cc, bcc, subject, msg);
     }
     
 }

Modified: roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/servlets/TrackbackServlet.java
URL: http://svn.apache.org/viewvc/roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/servlets/TrackbackServlet.java?view=diff&rev=544034&r1=544033&r2=544034
==============================================================================
--- roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/servlets/TrackbackServlet.java (original)
+++ roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/ui/rendering/servlets/TrackbackServlet.java Sun Jun  3 19:21:35 2007
@@ -41,6 +41,7 @@
 import org.apache.roller.weblogger.ui.rendering.util.TrackbackLinkbackCommentValidator;
 import org.apache.roller.weblogger.ui.rendering.util.WeblogTrackbackRequest;
 import org.apache.roller.weblogger.util.I18nMessages;
+import org.apache.roller.weblogger.util.MailUtil;
 import org.apache.roller.weblogger.util.RollerMessages;
 import org.apache.roller.weblogger.util.cache.CacheManager;
 
@@ -191,9 +192,9 @@
                     }
                     
                     // Send email notifications
-                    String rootURL = RollerRuntimeConfig.getAbsoluteContextURL();
-                    CommentServlet.sendEmailNotification(comment, validationScore == 100, messages, rootURL, 
-                            I18nMessages.getMessages(trackbackRequest.getLocaleInstance()));
+                    MailUtil.sendEmailNotification(comment, messages, 
+                            I18nMessages.getMessages(trackbackRequest.getLocaleInstance()),
+                            validationScore == 100);
                     
                     if(WeblogEntryComment.PENDING.equals(comment.getStatus())) {
                         pw.println(this.getSuccessResponse("Trackback submitted to moderator"));

Modified: roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/util/MailUtil.java
URL: http://svn.apache.org/viewvc/roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/util/MailUtil.java?view=diff&rev=544034&r1=544033&r2=544034
==============================================================================
--- roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/util/MailUtil.java (original)
+++ roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/util/MailUtil.java Sun Jun  3 19:21:35 2007
@@ -20,12 +20,13 @@
 
 import java.text.MessageFormat;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Locale;
+import java.util.Map;
 import java.util.ResourceBundle;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import java.util.Set;
+import java.util.TreeSet;
 import javax.mail.Message;
 import javax.mail.MessagingException;
 import javax.mail.SendFailedException;
@@ -35,15 +36,20 @@
 import javax.mail.internet.InternetAddress;
 import javax.mail.internet.MimeMessage;
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.roller.weblogger.WebloggerException;
 import org.apache.roller.weblogger.business.MailProvider;
 import org.apache.roller.weblogger.business.RollerFactory;
 import org.apache.roller.weblogger.business.UserManager;
+import org.apache.roller.weblogger.config.RollerConfig;
 import org.apache.roller.weblogger.config.RollerRuntimeConfig;
 import org.apache.roller.weblogger.pojos.WeblogPermission;
 import org.apache.roller.weblogger.pojos.User;
 import org.apache.roller.weblogger.pojos.WeblogEntry;
 import org.apache.roller.weblogger.pojos.Weblog;
+import org.apache.roller.weblogger.pojos.WeblogEntryComment;
+import org.apache.roller.weblogger.util.RollerMessages.RollerMessage;
 
 
 /**
@@ -53,6 +59,9 @@
     
     private static Log log = LogFactory.getLog(MailUtil.class);
     
+    private static final String EMAIL_ADDR_REGEXP = "^.*@.*[.].{2,}$";
+    
+    
     /**
      * Ideally mail senders should call this first to avoid errors that occur 
      * when mail is not properly configured. We'll complain about that at 
@@ -236,6 +245,304 @@
     }
     
     
+    /**
+     * Send email notification of new or newly approved comment.
+     * TODO: Make the addressing options configurable on a per-website basis.
+     * 
+     * @param commentObject      The new comment
+     * @param messages           Messages to be included in e-mail (or null). 
+     *                           Errors will be assumed to be "validation errors" 
+     *                           and messages will be assumed to be "from the system"
+     */
+    public static void sendEmailNotification(WeblogEntryComment commentObject,
+                                             RollerMessages messages, 
+                                             I18nMessages resources,
+                                             boolean notifySubscribers) 
+            throws MailingException {
+        
+        WeblogEntry entry = commentObject.getWeblogEntry();
+        Weblog weblog = entry.getWebsite();
+        User user = entry.getCreator();
+        
+        // Only send email if email notificaiton is enabled
+        boolean notify = RollerRuntimeConfig.getBooleanProperty("users.comments.emailnotify");
+        if (!notify || !weblog.getEmailComments().booleanValue()) {
+            // notifications disabled, just bail
+            return;
+        }
+        
+        log.debug("Comment notification enabled ... preparing email");
+        
+        // Determine message and addressing options from init parameters
+        boolean hideCommenterAddrs = RollerConfig.getBooleanProperty(
+                "comment.notification.hideCommenterAddresses");
+        
+        // use either the weblog configured from address or the site configured from address
+        String from = weblog.getEmailFromAddress();
+        if(StringUtils.isEmpty(from)) {
+            // TODO: this should not be the users email address
+            from = user.getEmailAddress();
+        }
+        
+        // build list of email addresses to send notification to
+        Set subscribers = new TreeSet();
+        
+        // If we are to notify subscribers, then...
+        if (notifySubscribers) {
+            log.debug("Sending notification email to all subscribers");
+            
+            // Get all the subscribers to this comment thread
+            List comments = entry.getComments(true, true);
+            for (Iterator it = comments.iterator(); it.hasNext();) {
+                WeblogEntryComment comment = (WeblogEntryComment) it.next();
+                if (!StringUtils.isEmpty(comment.getEmail())) {
+                    // If user has commented twice,
+                    // count the most recent notify setting
+                    if (comment.getNotify().booleanValue()) {
+                        // only add those with valid email
+                        if (comment.getEmail().matches(EMAIL_ADDR_REGEXP)) {
+                            subscribers.add(comment.getEmail());
+                        }
+                    } else {
+                        // remove user who doesn't want to be notified
+                        subscribers.remove(comment.getEmail());
+                    }
+                }
+            }
+        } else {
+            log.debug("Sending notification email only to weblog owner");
+        }
+        
+        // Form array of commenter addrs
+        String[] commenterAddrs = (String[])subscribers.toArray(new String[0]);
+        
+        //------------------------------------------
+        // --- Form the messages to be sent -
+        // Build separate owner and commenter (aka subscriber) messages
+        
+        // Determine with mime type to use for e-mail
+        StringBuffer msg = new StringBuffer();
+        StringBuffer ownermsg = new StringBuffer();
+        boolean escapeHtml = RollerRuntimeConfig.getBooleanProperty("users.comments.escapehtml");
+        
+        // first the commenter message
+        
+        if (!escapeHtml) {
+            msg.append("<html><body style=\"background: white; ");
+            msg.append(" color: black; font-size: 12px\">");
+        }
+        
+        if (!StringUtils.isEmpty(commentObject.getName())) {
+            msg.append(commentObject.getName() + " "
+                    + resources.getString("email.comment.wrote")+": ");
+        } else {
+            msg.append(resources.getString("email.comment.anonymous")+": ");
+        }
+        
+        msg.append((escapeHtml) ? "\n\n" : "<br /><br />");
+        
+        msg.append((escapeHtml) ? Utilities.escapeHTML(commentObject.getContent())
+        : Utilities.transformToHTMLSubset(Utilities.escapeHTML(commentObject.getContent())));
+        
+        msg.append((escapeHtml) ? "\n\n----\n"
+                : "<br /><br /><hr /><span style=\"font-size: 11px\">");
+        msg.append(resources.getString("email.comment.respond") + ": ");
+        msg.append((escapeHtml) ? "\n" : "<br />");
+        
+        // Build link back to comment
+        String commentURL = URLUtilities.getWeblogCommentsURL(weblog, null, entry.getAnchor(), true);
+        
+        if (escapeHtml) {
+            msg.append(commentURL);
+        } else {
+            msg.append("<a href=\""+commentURL+"\">"+commentURL+"</a></span>");
+        }
+        
+        // next the owner message
+        
+        // First, list any messages from the system that were passed in:
+        if (messages.getMessageCount() > 0) {
+            ownermsg.append((escapeHtml) ? "" : "<p>");
+            ownermsg.append(resources.getString("commentServlet.email.thereAreSystemMessages"));
+            ownermsg.append((escapeHtml) ? "\n\n" : "</p>");
+            ownermsg.append((escapeHtml) ? "" : "<ul>");
+        }
+        for (Iterator it = messages.getMessages(); it.hasNext();) {
+            RollerMessage rollerMessage = (RollerMessage)it.next();
+            ownermsg.append((escapeHtml) ? "" : "<li>");
+            ownermsg.append(MessageFormat.format(resources.getString(rollerMessage.getKey()), (Object[])rollerMessage.getArgs()) );
+            ownermsg.append((escapeHtml) ? "\n\n" : "</li>");
+        }
+        if (messages.getMessageCount() > 0) {
+            ownermsg.append((escapeHtml) ? "\n\n" : "</ul>");
+        }
+        
+        // Next, list any validation error messages that were passed in:
+        if (messages.getErrorCount() > 0) {
+            ownermsg.append((escapeHtml) ? "" : "<p>");
+            ownermsg.append(resources.getString("commentServlet.email.thereAreErrorMessages"));
+            ownermsg.append((escapeHtml) ? "\n\n" : "</p>");
+            ownermsg.append((escapeHtml) ? "" : "<ul>");
+        }
+        for (Iterator it = messages.getErrors(); it.hasNext();) {
+            RollerMessage rollerMessage = (RollerMessage)it.next();
+            ownermsg.append((escapeHtml) ? "" : "<li>");
+            ownermsg.append(MessageFormat.format(resources.getString(rollerMessage.getKey()), (Object[])rollerMessage.getArgs()) );
+            ownermsg.append((escapeHtml) ? "\n\n" : "</li>");
+        }
+        if (messages.getErrorCount() > 0) {
+            ownermsg.append((escapeHtml) ? "\n\n" : "</ul>");
+        }
+        
+        ownermsg.append(msg);
+        
+        // add link to weblog edit page so user can login to manage comments
+        ownermsg.append((escapeHtml) ? "\n\n----\n" :
+            "<br /><br /><hr /><span style=\"font-size: 11px\">");
+        ownermsg.append("Link to comment management page:");
+        ownermsg.append((escapeHtml) ? "\n" : "<br />");
+        
+        Map<String, String> parameters = new HashMap();
+        parameters.put("entryId", entry.getId());
+        String deleteURL = URLUtilities.getActionURL(
+                "comments", "/roller-ui/authoring", weblog.getHandle(), parameters, true);
+        
+        if (escapeHtml) {
+            ownermsg.append(deleteURL);
+        } else {
+            ownermsg.append(
+                    "<a href=\"" + deleteURL + "\">" + deleteURL + "</a></span>");
+            msg.append("</Body></html>");
+            ownermsg.append("</Body></html>");
+        }
+        
+        String subject = null;
+        if ((subscribers.size() > 1) ||
+                (StringUtils.equals(commentObject.getEmail(), user.getEmailAddress()))) {
+            subject= "RE: "+resources.getString("email.comment.title")+": ";
+        } else {
+            subject = resources.getString("email.comment.title") + ": ";
+        }
+        subject += entry.getTitle();
+        
+        // send message to email recipients
+        try {
+            boolean isHtml = !escapeHtml;
+            
+            // Send separate messages to owner and commenters
+            if(isHtml) {
+                sendHTMLMessage(
+                        from,
+                        new String[]{user.getEmailAddress()},
+                        null,
+                        null,
+                        subject,
+                        ownermsg.toString());
+            } else {
+                sendTextMessage(
+                        from,
+                        new String[]{user.getEmailAddress()},
+                        null,
+                        null,
+                        subject,
+                        ownermsg.toString());
+            }
+            
+            // now send to subscribers
+            if (notifySubscribers && commenterAddrs.length > 0) {
+                // If hiding commenter addrs, they go in Bcc: otherwise in the To: of the second message
+                String[] to = hideCommenterAddrs ? null : commenterAddrs;
+                String[] bcc = hideCommenterAddrs ? commenterAddrs : null;
+                
+                if(isHtml) {
+                    sendHTMLMessage(
+                            from, 
+                            to, 
+                            null, 
+                            bcc, 
+                            subject, 
+                            msg.toString());
+                } else {
+                    sendTextMessage(
+                            from, 
+                            to, 
+                            null, 
+                            bcc, 
+                            subject, 
+                            msg.toString());
+                }
+            }
+        } catch (Exception e) {
+            log.warn("Exception sending comment mail: " + e.getMessage());
+            // This will log the stack trace if debug is enabled
+            if (log.isDebugEnabled()) {
+                log.debug(e);
+            }
+        }
+        
+        log.debug("Done sending email message");
+    }
+    
+    
+    /**
+     * Send message to author of approved comment
+     *
+     * TODO: Make the addressing options configurable on a per-website basis.
+     */
+    public static void sendEmailApprovalNotification(WeblogEntryComment cd, 
+                                                     I18nMessages resources) 
+            throws MailingException {
+        
+        WeblogEntry entry = cd.getWeblogEntry();
+        Weblog weblog = entry.getWebsite();
+        User user = entry.getCreator();
+        
+        // Only send email if email notificaiton is enabled
+        boolean notify = RollerRuntimeConfig.getBooleanProperty("users.comments.emailnotify");
+        if (!notify || !weblog.getEmailComments().booleanValue()) {
+            // notifications disabled, just bail
+            return;
+        }
+        
+        log.debug("Comment notification enabled ... preparing email");
+        
+        // use either the weblog configured from address or the site configured from address
+        String from = weblog.getEmailFromAddress();
+        if(StringUtils.isEmpty(from)) {
+            // TODO: this should not be the users email address
+            from = user.getEmailAddress();
+        }
+        
+        // form the message to be sent
+        String subject = resources.getString("email.comment.commentApproved");
+        
+        StringBuffer msg = new StringBuffer();
+        msg.append(resources.getString("email.comment.commentApproved"));
+        msg.append("\n\n");
+        msg.append(URLUtilities.getWeblogCommentsURL(weblog, null, entry.getAnchor(), true));
+        
+        // send message to author of approved comment
+        try {
+            sendTextMessage(
+                    from, // from
+                    new String[] {cd.getEmail()}, // to
+                    null, // cc
+                    null, // bcc
+                    subject, // subject
+                    msg.toString()); // message
+        } catch (Exception e) {
+            log.warn("Exception sending comment mail: " + e.getMessage());
+            // This will log the stack trace if debug is enabled
+            if (log.isDebugEnabled()) {
+                log.debug(e);
+            }
+        }
+        
+        log.debug("Done sending email message");
+    }
+    
+    
+    
     // agangolli: Incorporated suggested changes from Ken Blackler.
     
     /**
@@ -514,4 +821,13 @@
         sendMessage(from, recipient, cc, bcc, subject, content, "text/html; charset=utf-8");
     }
     
+    
+    /**
+     * An exception thrown if there is a problem sending an email.
+     */
+    public class MailingException extends WebloggerException {
+        public MailingException(Throwable t) {
+            super(t);
+        }
+    }
 }

Modified: roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/util/URLUtilities.java
URL: http://svn.apache.org/viewvc/roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/util/URLUtilities.java?view=diff&rev=544034&r1=544033&r2=544034
==============================================================================
--- roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/util/URLUtilities.java (original)
+++ roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/util/URLUtilities.java Sun Jun  3 19:21:35 2007
@@ -429,6 +429,7 @@
     public static final String getActionURL(String action,
                                             String namespace,
                                             String weblogHandle,
+                                            Map<String, String> parameters,
                                             boolean absolute) {
         
         StringBuffer url = new StringBuffer();
@@ -442,10 +443,18 @@
         url.append(namespace);
         url.append("/").append(action).append(".rol");
         
+        // put weblog handle parameter, if necessary
+        Map<String, String> params = new HashMap();
         if(weblogHandle != null) {
-            Map params = new HashMap();
             params.put("weblog", weblogHandle);
-            
+        }
+        
+        // add custom parameters if they exist
+        if(parameters != null) {
+            params.putAll(parameters);
+        }
+        
+        if(!params.isEmpty()) {
             return url.toString() + getQueryString(params);
         } else {
             return url.toString();

Modified: roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/util/Utilities.java
URL: http://svn.apache.org/viewvc/roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/util/Utilities.java?view=diff&rev=544034&r1=544033&r2=544034
==============================================================================
--- roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/util/Utilities.java (original)
+++ roller/branches/roller_guice/apps/weblogger/src/java/org/apache/roller/weblogger/util/Utilities.java Sun Jun  3 19:21:35 2007
@@ -18,6 +18,8 @@
 import java.util.Locale;
 import java.util.NoSuchElementException;
 import java.util.StringTokenizer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.commons.lang.StringUtils;
@@ -35,6 +37,50 @@
     
     public final static String TAG_SPLIT_CHARS = " ,\n\r\f\t";
       
+    private static Pattern mLinkPattern =
+            Pattern.compile("<a href=.*?>", Pattern.CASE_INSENSITIVE);    
+    private static final Pattern OPENING_B_TAG_PATTERN = 
+            Pattern.compile("&lt;b&gt;", Pattern.CASE_INSENSITIVE);
+    private static final Pattern CLOSING_B_TAG_PATTERN = 
+            Pattern.compile("&lt;/b&gt;", Pattern.CASE_INSENSITIVE);
+    private static final Pattern OPENING_I_TAG_PATTERN = 
+            Pattern.compile("&lt;i&gt;", Pattern.CASE_INSENSITIVE);
+    private static final Pattern CLOSING_I_TAG_PATTERN = 
+            Pattern.compile("&lt;/i&gt;", Pattern.CASE_INSENSITIVE);
+    private static final Pattern OPENING_BLOCKQUOTE_TAG_PATTERN = 
+            Pattern.compile("&lt;blockquote&gt;", Pattern.CASE_INSENSITIVE);
+    private static final Pattern CLOSING_BLOCKQUOTE_TAG_PATTERN = 
+            Pattern.compile("&lt;/blockquote&gt;", Pattern.CASE_INSENSITIVE);
+    private static final Pattern BR_TAG_PATTERN = 
+            Pattern.compile("&lt;br */*&gt;", Pattern.CASE_INSENSITIVE);
+    private static final Pattern OPENING_P_TAG_PATTERN = 
+            Pattern.compile("&lt;p&gt;", Pattern.CASE_INSENSITIVE);
+    private static final Pattern CLOSING_P_TAG_PATTERN = 
+            Pattern.compile("&lt;/p&gt;", Pattern.CASE_INSENSITIVE);
+    private static final Pattern OPENING_PRE_TAG_PATTERN = 
+            Pattern.compile("&lt;pre&gt;", Pattern.CASE_INSENSITIVE);
+    private static final Pattern CLOSING_PRE_TAG_PATTERN = 
+            Pattern.compile("&lt;/pre&gt;", Pattern.CASE_INSENSITIVE);
+    private static final Pattern OPENING_UL_TAG_PATTERN = 
+            Pattern.compile("&lt;ul&gt;", Pattern.CASE_INSENSITIVE);
+    private static final Pattern CLOSING_UL_TAG_PATTERN = 
+            Pattern.compile("&lt;/ul&gt;", Pattern.CASE_INSENSITIVE);
+    private static final Pattern OPENING_OL_TAG_PATTERN = 
+            Pattern.compile("&lt;ol&gt;", Pattern.CASE_INSENSITIVE);
+    private static final Pattern CLOSING_OL_TAG_PATTERN = 
+            Pattern.compile("&lt;/ol&gt;", Pattern.CASE_INSENSITIVE);
+    private static final Pattern OPENING_LI_TAG_PATTERN = 
+            Pattern.compile("&lt;li&gt;", Pattern.CASE_INSENSITIVE);
+    private static final Pattern CLOSING_LI_TAG_PATTERN = 
+            Pattern.compile("&lt;/li&gt;", Pattern.CASE_INSENSITIVE);
+    private static final Pattern CLOSING_A_TAG_PATTERN = 
+            Pattern.compile("&lt;/a&gt;", Pattern.CASE_INSENSITIVE);
+    private static final Pattern OPENING_A_TAG_PATTERN = 
+            Pattern.compile("&lt;a href=.*?&gt;", Pattern.CASE_INSENSITIVE);
+    private static final Pattern QUOTE_PATTERN = 
+            Pattern.compile("&quot;", Pattern.CASE_INSENSITIVE);
+    
+    
     //------------------------------------------------------------------------
     /** Strip jsessionid off of a URL */
     public static String stripJsessionId( String url ) {
@@ -848,4 +894,65 @@
             return Collections.EMPTY_LIST;
         return Arrays.asList(tagsarr);
     }
+    
+    
+    /**
+     * Transforms the given String into a subset of HTML displayable on a web
+     * page. The subset includes &lt;b&gt;, &lt;i&gt;, &lt;p&gt;, &lt;br&gt;,
+     * &lt;pre&gt; and &lt;a href&gt; (and their corresponding end tags).
+     *
+     * @param s   the String to transform
+     * @return    the transformed String
+     */
+    public static String transformToHTMLSubset(String s) {
+        
+        if (s == null) {
+            return null;
+        }
+        
+        s = replace(s, OPENING_B_TAG_PATTERN, "<b>");
+        s = replace(s, CLOSING_B_TAG_PATTERN, "</b>");
+        s = replace(s, OPENING_I_TAG_PATTERN, "<i>");
+        s = replace(s, CLOSING_I_TAG_PATTERN, "</i>");
+        s = replace(s, OPENING_BLOCKQUOTE_TAG_PATTERN, "<blockquote>");
+        s = replace(s, CLOSING_BLOCKQUOTE_TAG_PATTERN, "</blockquote>");
+        s = replace(s, BR_TAG_PATTERN, "<br />");
+        s = replace(s, OPENING_P_TAG_PATTERN, "<p>");
+        s = replace(s, CLOSING_P_TAG_PATTERN, "</p>");
+        s = replace(s, OPENING_PRE_TAG_PATTERN, "<pre>");
+        s = replace(s, CLOSING_PRE_TAG_PATTERN, "</pre>");
+        s = replace(s, OPENING_UL_TAG_PATTERN, "<ul>");
+        s = replace(s, CLOSING_UL_TAG_PATTERN, "</ul>");
+        s = replace(s, OPENING_OL_TAG_PATTERN, "<ol>");
+        s = replace(s, CLOSING_OL_TAG_PATTERN, "</ol>");
+        s = replace(s, OPENING_LI_TAG_PATTERN, "<li>");
+        s = replace(s, CLOSING_LI_TAG_PATTERN, "</li>");
+        s = replace(s, QUOTE_PATTERN, "\"");
+        
+        // HTTP links
+        s = replace(s, CLOSING_A_TAG_PATTERN, "</a>");
+        Matcher m = OPENING_A_TAG_PATTERN.matcher(s);
+        while (m.find()) {
+            int start = m.start();
+            int end = m.end();
+            String link = s.substring(start, end);
+            link = "<" + link.substring(4, link.length() - 4) + ">";
+            s = s.substring(0, start) + link + s.substring(end, s.length());
+            m = OPENING_A_TAG_PATTERN.matcher(s);
+        }
+        
+        // escaped angle brackets
+        s = s.replaceAll("&amp;lt;", "&lt;");
+        s = s.replaceAll("&amp;gt;", "&gt;");
+        s = s.replaceAll("&amp;#", "&#");
+        
+        return s;
+    }
+    
+    
+    private static String replace(String string, Pattern pattern, String replacement) {
+        Matcher m = pattern.matcher(string);
+        return m.replaceAll(replacement);
+    }
+    
 }

Modified: roller/branches/roller_guice/apps/weblogger/web/WEB-INF/jsps/admin/PlanetConfig.jsp
URL: http://svn.apache.org/viewvc/roller/branches/roller_guice/apps/weblogger/web/WEB-INF/jsps/admin/PlanetConfig.jsp?view=diff&rev=544034&r1=544033&r2=544034
==============================================================================
--- roller/branches/roller_guice/apps/weblogger/web/WEB-INF/jsps/admin/PlanetConfig.jsp (original)
+++ roller/branches/roller_guice/apps/weblogger/web/WEB-INF/jsps/admin/PlanetConfig.jsp Sun Jun  3 19:21:35 2007
@@ -18,82 +18,85 @@
 <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>
 <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
-<%-- Start by parsing our config defs using the jstl xml toolkit --%>
-<%-- Then we'll progress through the config defs and print out the form --%>
-<x:parse var="configDefs">
-  <%= org.apache.roller.planet.config.PlanetRuntimeConfig.getRuntimeConfigDefsAsString() %>
-</x:parse>
-
+<%--
+  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.
+--%>
+<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>
 
 <p class="subtitle"><s:text name="planetConfig.subtitle" /></a>
 <p><s:text name="planetConfig.prompt" /></a>
 
-<s:form action="planetConfig">
-
-<input type="hidden" name="method" value="update">
+<s:form action="planetConfig!save">
 
     <table class="formtableNoDesc">
     
-    <x:forEach select="$configDefs//config-def[@name='global-properties']/display-group">
-        <c:set var="displayGroupKey"><x:out select="@key"/></c:set>
+    <s:iterator id="dg" value="globalConfigDef.displayGroups">
     
         <tr>
-            <td colspan="3"><h2><s:text name="${displayGroupKey}" /></h2></td>
+            <td colspan="3"><h2><s:text name="%{#dg.key}" /></h2></td>
         </tr>
     
-        <x:forEach select="property-def">
-            <c:set var="propLabelKey"><x:out select="@key"/></c:set>
-            <c:set var="name"><x:out select="@name"/></c:set>
-        
+        <s:iterator id="pd" value="#dg.propertyDefs">
+            
             <tr>
-                <td class="label"><s:text name="${propLabelKey}" /></td>
+                <td class="label"><s:text name="%{#pd.key}" /></td>
               
-                <%-- choose the right html input element for the display --%>
-                <x:choose>
-                
                   <%-- "string" type means use a simple textbox --%>
-                  <x:when select="type='string'">
-                    <td class="field"><input type="text" name='<c:out value="${name}"/>' value='<c:out value="${PlanetProps[name].value}"/>' size="35" /></td>
-                  </x:when>
+                  <s:if test="#pd.type == 'string'">
+                    <td class="field"><input type="text" name='<s:property value="#pd.name"/>' value='<s:property value="properties[#pd.name].value"/>' size="35" /></td>
+                  </s:if>
                   
                   <%-- "text" type means use a full textarea --%>
-                  <x:when select="type='text'">
+                  <s:elseif test="#pd.type == 'text'">
                     <td class="field">
-                      <textarea name='<c:out value="${name}"/>' rows="<x:out select="rows"/>" cols="<x:out select="cols"/>"><c:out value="${PlanetProps[name].value}"/></textarea>
+                      <textarea name='<s:property value="#pd.name"/>' rows="<s:property value="#pd.rows"/>" cols="<s:property value="#pd.cols"/>"><s:property value="properties[#pd.name].value"/></textarea>
                     </td>
-                  </x:when>
+                  </s:elseif>
                   
                   <%-- "boolean" type means use a checkbox --%>
-                  <x:when select="type='boolean'">
-                    <c:choose>
-                      <c:when test="${PlanetProps[name].value eq 'true'}">
-                          <td class="field"><input type="checkbox" name='<c:out value="${name}"/>' CHECKED></td>
-                      </c:when>
-                      <c:otherwise>
-                          <td class="field"><input type="checkbox" name='<c:out value="${name}"/>'></td>
-                      </c:otherwise>
-                    </c:choose>
-                  </x:when>
+                  <s:elseif test="#pd.type == 'boolean'">
+                      <s:if test="properties[#pd.name].value == 'true'">
+                          <td class="field"><input type="checkbox" name='<s:property value="#pd.name"/>' CHECKED></td>
+                      </s:if>
+                      <s:else>
+                          <td class="field"><input type="checkbox" name='<s:property value="#pd.name"/>'></td>
+                      </s:else>
+                  </s:elseif>
                   
                   <%-- if it's something we don't understand then use textbox --%>
-                  <x:otherwise>
-                    <td class="field"><input type="text" name='<c:out value="${name}"/>' size="50" /></td>
-                  </x:otherwise>
-                </x:choose>
+                  <s:else>
+                    <td class="field"><input type="text" name='<s:property value="#pd.name"/>' size="50" /></td>
+                  </s:else>
                 
                 <td class="description"><%-- <s:text name="" /> --%></td>
             </tr>
           
-        </x:forEach>
+        </s:iterator>
       
         <tr>
             <td colspan="2">&nbsp;</td>
         </tr>
         
-    </x:forEach>
+    </s:iterator>
 
     </table>
     
-    <s:submit cssClass="buttonBox" key="configForm.save" />
+    <div class="control">
+        <input class="buttonBox" type="submit" value="<s:text name="configForm.save"/>"/>
+    </div>
     
 </s:form>

Modified: roller/branches/roller_guice/apps/weblogger/web/WEB-INF/jsps/admin/PlanetGroups.jsp
URL: http://svn.apache.org/viewvc/roller/branches/roller_guice/apps/weblogger/web/WEB-INF/jsps/admin/PlanetGroups.jsp?view=diff&rev=544034&r1=544033&r2=544034
==============================================================================
--- roller/branches/roller_guice/apps/weblogger/web/WEB-INF/jsps/admin/PlanetGroups.jsp (original)
+++ roller/branches/roller_guice/apps/weblogger/web/WEB-INF/jsps/admin/PlanetGroups.jsp Sun Jun  3 19:21:35 2007
@@ -55,9 +55,12 @@
         
         <s:if test="group != null" >
             &nbsp;&nbsp;
+            <s:url id="deleteUrl" action="planetGroups!delete">
+                <s:param name="bean.id" value="%{bean.id}" />
+            </s:url>
             <input type="button" 
                    value='<s:text name="planetGroups.button.delete" />' 
-                   onclick="window.location('')" />
+                   onclick="window.location='<s:url value="%{deleteUrl}"/>'" />
         </s:if>
     </div>
     
@@ -93,11 +96,11 @@
     </s:else>
     
     <td class="rollertable">
-        <s:property value="group.title" />
+        <s:property value="#group.title" />
     </td>
     
     <td class="rollertable">
-        <s:property value="group.handle" />
+        <s:property value="#group.handle" />
     </td>
     
     <td class="rollertable">

Modified: roller/branches/roller_guice/apps/weblogger/web/WEB-INF/jsps/admin/PlanetSubscriptions.jsp
URL: http://svn.apache.org/viewvc/roller/branches/roller_guice/apps/weblogger/web/WEB-INF/jsps/admin/PlanetSubscriptions.jsp?view=diff&rev=544034&r1=544033&r2=544034
==============================================================================
--- roller/branches/roller_guice/apps/weblogger/web/WEB-INF/jsps/admin/PlanetSubscriptions.jsp (original)
+++ roller/branches/roller_guice/apps/weblogger/web/WEB-INF/jsps/admin/PlanetSubscriptions.jsp Sun Jun  3 19:21:35 2007
@@ -72,13 +72,16 @@
         &nbsp;
         <input type="button" 
                value='<s:text name="planetSubscriptions.button.cancel" />' 
-               onclick="window.location('')"/>
+               onclick="window.location='<s:url action="planetSubscriptions" />'"/>
         
-        <s:if test="subscription != null" >
+        <s:if test="bean.id != null" >
             &nbsp;&nbsp;
+            <s:url id="deleteUrl" action="planetSubscriptions!delete">
+                <s:param name="bean.id" value="%{bean.id}" />
+            </s:url>
             <input type="button" 
                    value='<s:text name="planetSubscriptions.button.delete" />' 
-                   onclick="window.location('')" />
+                   onclick="window.location='<s:url value="%{deleteUrl}" />'" />
         </s:if>
     </div>
     
@@ -125,7 +128,7 @@
         </td>
         
         <td class="rollertable">
-            <s:url id="subUrl" action="planetSubscritions">
+            <s:url id="subUrl" action="planetSubscriptions">
                 <s:param name="bean.id" value="#sub.id" />
                 <s:param name="groupHandle" value="%{groupHandle}" />
             </s:url>

Modified: roller/branches/roller_guice/merges.txt
URL: http://svn.apache.org/viewvc/roller/branches/roller_guice/merges.txt?view=diff&rev=544034&r1=544033&r2=544034
==============================================================================
--- roller/branches/roller_guice/merges.txt (original)
+++ roller/branches/roller_guice/merges.txt Sun Jun  3 19:21:35 2007
@@ -1,5 +1,6 @@
 
 June 1-3, 2007
+svn merge -r 543971:544028 https://svn.apache.org/repos/asf/roller/trunk
 svn merge -r 543970:543971 https://svn.apache.org/repos/asf/roller/trunk
 svn merge -r 543952:543970 https://svn.apache.org/repos/asf/roller/trunk
 svn merge -r 543889:543952 https://svn.apache.org/repos/asf/roller/trunk