You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by gw...@apache.org on 2014/03/26 10:41:22 UTC

svn commit: r1581766 - in /syncope/branches/1_1_X: ./ core/ core/src/main/java/org/apache/syncope/core/notification/ core/src/main/resources/ core/src/main/resources/mailTemplates/ core/src/test/java/org/apache/syncope/core/notification/ core/src/test/...

Author: gwimmel
Date: Wed Mar 26 09:41:21 2014
New Revision: 1581766

URL: http://svn.apache.org/r1581766
Log:
[SYNCOPE-487] make Velocity tools available in templates for notifications

Modified:
    syncope/branches/1_1_X/core/pom.xml
    syncope/branches/1_1_X/core/src/main/java/org/apache/syncope/core/notification/NotificationManager.java
    syncope/branches/1_1_X/core/src/main/resources/mailTemplates/optin.html.vm
    syncope/branches/1_1_X/core/src/main/resources/mailTemplates/optin.txt.vm
    syncope/branches/1_1_X/core/src/main/resources/workflowContext.xml
    syncope/branches/1_1_X/core/src/test/java/org/apache/syncope/core/notification/NotificationTest.java
    syncope/branches/1_1_X/core/src/test/resources/noopworkflow/workflowContext.xml
    syncope/branches/1_1_X/pom.xml

Modified: syncope/branches/1_1_X/core/pom.xml
URL: http://svn.apache.org/viewvc/syncope/branches/1_1_X/core/pom.xml?rev=1581766&r1=1581765&r2=1581766&view=diff
==============================================================================
--- syncope/branches/1_1_X/core/pom.xml (original)
+++ syncope/branches/1_1_X/core/pom.xml Wed Mar 26 09:41:21 2014
@@ -188,7 +188,12 @@ under the License.
       <groupId>org.apache.velocity</groupId>
       <artifactId>velocity</artifactId>
     </dependency>
-
+    
+    <dependency>
+      <groupId>org.apache.velocity</groupId>
+      <artifactId>velocity-tools</artifactId>
+	</dependency>
+	
     <dependency>
       <groupId>org.quartz-scheduler</groupId>
       <artifactId>quartz</artifactId>

Modified: syncope/branches/1_1_X/core/src/main/java/org/apache/syncope/core/notification/NotificationManager.java
URL: http://svn.apache.org/viewvc/syncope/branches/1_1_X/core/src/main/java/org/apache/syncope/core/notification/NotificationManager.java?rev=1581766&r1=1581765&r2=1581766&view=diff
==============================================================================
--- syncope/branches/1_1_X/core/src/main/java/org/apache/syncope/core/notification/NotificationManager.java (original)
+++ syncope/branches/1_1_X/core/src/main/java/org/apache/syncope/core/notification/NotificationManager.java Wed Mar 26 09:41:21 2014
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.notification;
 
+import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -25,6 +26,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+
 import org.apache.syncope.common.SyncopeConstants;
 import org.apache.syncope.common.to.RoleTO;
 import org.apache.syncope.common.to.UserTO;
@@ -53,13 +55,15 @@ import org.apache.syncope.core.persisten
 import org.apache.syncope.core.rest.data.UserDataBinder;
 import org.apache.syncope.core.util.AttributableUtil;
 import org.apache.syncope.core.util.EntitlementUtil;
+import org.apache.velocity.VelocityContext;
 import org.apache.velocity.app.VelocityEngine;
+import org.apache.velocity.context.Context;
 import org.apache.velocity.exception.VelocityException;
+import org.apache.velocity.tools.ToolManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.ui.velocity.VelocityEngineUtils;
 
 /**
  * Create notification tasks that will be executed by NotificationJob.
@@ -121,6 +125,12 @@ public class NotificationManager {
      */
     @Autowired
     private VelocityEngine velocityEngine;
+    
+    /**
+     * Velocity tool manager.
+     */
+    @Autowired
+    private ToolManager velocityToolManager;
 
     @Autowired
     private EntitlementDAO entitlementDAO;
@@ -181,25 +191,51 @@ public class NotificationManager {
         task.setSender(notification.getSender());
         task.setSubject(notification.getSubject());
 
-        String htmlBody;
-        String textBody;
-        try {
-            htmlBody = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "mailTemplates/"
-                    + notification.getTemplate() + ".html.vm", SyncopeConstants.DEFAULT_ENCODING, model);
-            textBody = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "mailTemplates/"
-                    + notification.getTemplate() + ".txt.vm", SyncopeConstants.DEFAULT_ENCODING, model);
-        } catch (VelocityException e) {
-            LOG.error("Could not get mail body", e);
-
-            htmlBody = "";
-            textBody = "";
-        }
-        task.setTextBody(textBody);
+        String htmlBody = mergeTemplateIntoString("mailTemplates/" + notification.getTemplate() + ".html.vm", model);
+        String textBody = mergeTemplateIntoString("mailTemplates/" + notification.getTemplate() + ".txt.vm", model);
+        
         task.setHtmlBody(htmlBody);
-
+        task.setTextBody(textBody);
+        
         return task;
     }
 
+    
+    
+    private String mergeTemplateIntoString(String templateLocation, Map<String, Object> model) {
+    	StringWriter result = new StringWriter();
+    	try {
+			Context velocityContext = createVelocityContext(model);
+			velocityEngine.mergeTemplate(templateLocation, SyncopeConstants.DEFAULT_ENCODING, velocityContext, result);
+		}
+		catch (VelocityException e) {
+			LOG.error("Could not get mail body", e);
+			return "";
+		}
+    	// ensure same behaviour as by using Spring VelocityEngineUtils.mergeTemplateIntoString()
+		catch (RuntimeException e) {
+			throw e;
+		}
+		catch (Exception e) {
+			LOG.error("Could not get mail body", e);
+			return "";
+		}
+    	return result.toString();
+    	
+    }
+    
+    
+    /**
+     * Create a Velocity Context for the given model, to be passed to the template for merging.
+     * 
+     * @param model Velocity model
+     * @return Velocity context
+     */
+    protected Context createVelocityContext(Map<String, Object> model) {
+    	Context toolContext = velocityToolManager.createContext();
+    	return new VelocityContext(model, toolContext);
+    }
+
     /**
      * Create notification tasks for each notification matching the given user id and (some of) tasks performed.
      */

Modified: syncope/branches/1_1_X/core/src/main/resources/mailTemplates/optin.html.vm
URL: http://svn.apache.org/viewvc/syncope/branches/1_1_X/core/src/main/resources/mailTemplates/optin.html.vm?rev=1581766&r1=1581765&r2=1581766&view=diff
==============================================================================
--- syncope/branches/1_1_X/core/src/main/resources/mailTemplates/optin.html.vm (original)
+++ syncope/branches/1_1_X/core/src/main/resources/mailTemplates/optin.html.vm Wed Mar 26 09:41:21 2014
@@ -24,6 +24,7 @@ under the License.
 <p>
    Your username is $user.getUsername().<br/>
    Your email address is $user.getAttributeMap().get("email").getValues().get(0).
+   Your email address inside a <a href="http://localhost/?email=$esc.url($user.getUsername())">link</a>.
 </p>
 
 <p>

Modified: syncope/branches/1_1_X/core/src/main/resources/mailTemplates/optin.txt.vm
URL: http://svn.apache.org/viewvc/syncope/branches/1_1_X/core/src/main/resources/mailTemplates/optin.txt.vm?rev=1581766&r1=1581765&r2=1581766&view=diff
==============================================================================
--- syncope/branches/1_1_X/core/src/main/resources/mailTemplates/optin.txt.vm (original)
+++ syncope/branches/1_1_X/core/src/main/resources/mailTemplates/optin.txt.vm Wed Mar 26 09:41:21 2014
@@ -13,6 +13,7 @@ Hi $user.getAttributeMap().get("firstnam
 
 Your username is $user.getUsername().
 Your email address is $user.getAttributeMap().get("email").getValues().get(0).
+Your email address inside a link: http://localhost/?email=$esc.url($user.getUsername()) .
 
 This message was sent to the following recipients:
 #foreach($recipient in $recipients)

Modified: syncope/branches/1_1_X/core/src/main/resources/workflowContext.xml
URL: http://svn.apache.org/viewvc/syncope/branches/1_1_X/core/src/main/resources/workflowContext.xml?rev=1581766&r1=1581765&r2=1581766&view=diff
==============================================================================
--- syncope/branches/1_1_X/core/src/main/resources/workflowContext.xml (original)
+++ syncope/branches/1_1_X/core/src/main/resources/workflowContext.xml Wed Mar 26 09:41:21 2014
@@ -77,4 +77,11 @@ under the License.
       </value>
     </property>
   </bean>
+  
+  <bean id="velocityToolManager" class="org.apache.velocity.tools.ToolManager">
+    <!-- autoConfigure -->
+    <constructor-arg index="0" value="true"/>
+    <!-- include default velocity tools -->
+    <constructor-arg index="1" value="true"/>
+  </bean>
 </beans>

Modified: syncope/branches/1_1_X/core/src/test/java/org/apache/syncope/core/notification/NotificationTest.java
URL: http://svn.apache.org/viewvc/syncope/branches/1_1_X/core/src/test/java/org/apache/syncope/core/notification/NotificationTest.java?rev=1581766&r1=1581765&r2=1581766&view=diff
==============================================================================
--- syncope/branches/1_1_X/core/src/test/java/org/apache/syncope/core/notification/NotificationTest.java (original)
+++ syncope/branches/1_1_X/core/src/test/java/org/apache/syncope/core/notification/NotificationTest.java Wed Mar 26 09:41:21 2014
@@ -24,15 +24,18 @@ import static org.junit.Assert.assertNot
 
 import com.icegreen.greenmail.util.GreenMail;
 import com.icegreen.greenmail.util.ServerSetup;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
+
 import javax.annotation.Resource;
 import javax.mail.Flags.Flag;
 import javax.mail.Folder;
 import javax.mail.Message;
 import javax.mail.Session;
 import javax.mail.Store;
+
 import org.apache.commons.lang.StringUtils;
 import org.apache.syncope.common.search.MembershipCond;
 import org.apache.syncope.common.search.NodeCond;
@@ -241,14 +244,21 @@ public class NotificationTest {
         notificationJob.execute(null);
         assertTrue(verifyMail(sender, subject));
 
-        // 4. get NotificationTask id
+        // 4. get NotificationTask id and text body
         Long taskId = null;
+        String textBody = null;
         for (NotificationTask task : taskDAO.findAll(NotificationTask.class)) {
             if (sender.equals(task.getSender())) {
                 taskId = task.getId();
+                textBody = task.getTextBody();
             }
         }
         assertNotNull(taskId);
+        assertNotNull(textBody);
+        assertTrue("Notification mail text doesn't contain expected content.",
+        		textBody.contains("Your email address is notificationtest@syncope.apache.org."));
+        assertTrue("Notification mail text doesn't contain expected content.",
+        		textBody.contains("Your email address inside a link: http://localhost/?email=notificationtest%40syncope.apache.org ."));
 
         // 5. execute Notification task and verify e-mail
         taskController.execute(taskId, false);

Modified: syncope/branches/1_1_X/core/src/test/resources/noopworkflow/workflowContext.xml
URL: http://svn.apache.org/viewvc/syncope/branches/1_1_X/core/src/test/resources/noopworkflow/workflowContext.xml?rev=1581766&r1=1581765&r2=1581766&view=diff
==============================================================================
--- syncope/branches/1_1_X/core/src/test/resources/noopworkflow/workflowContext.xml (original)
+++ syncope/branches/1_1_X/core/src/test/resources/noopworkflow/workflowContext.xml Wed Mar 26 09:41:21 2014
@@ -37,4 +37,11 @@ under the License.
       </value>
     </property>
   </bean>
+  
+  <bean id="velocityToolManager" class="org.apache.velocity.tools.ToolManager">
+    <!-- autoConfigure -->
+    <constructor-arg index="0" value="true"/>
+    <!-- include default velocity tools -->
+    <constructor-arg index="1" value="true"/>
+  </bean>
 </beans>

Modified: syncope/branches/1_1_X/pom.xml
URL: http://svn.apache.org/viewvc/syncope/branches/1_1_X/pom.xml?rev=1581766&r1=1581765&r2=1581766&view=diff
==============================================================================
--- syncope/branches/1_1_X/pom.xml (original)
+++ syncope/branches/1_1_X/pom.xml Wed Mar 26 09:41:21 2014
@@ -327,6 +327,7 @@ under the License.
     <jackson.version>1.9.13</jackson.version>
     <xstream.version>1.4.7</xstream.version>
     <velocity.version>1.7</velocity.version>
+    <velocitytools.version>2.0</velocitytools.version>
     <quartz.version>2.1.7</quartz.version>
 
     <openjpa.version>2.2.2</openjpa.version>
@@ -524,6 +525,34 @@ under the License.
         <artifactId>velocity</artifactId>
         <version>${velocity.version}</version>
       </dependency>
+      
+      <dependency>
+        <groupId>org.apache.velocity</groupId>
+        <artifactId>velocity-tools</artifactId>
+        <version>${velocitytools.version}</version>
+        <exclusions>
+  			<exclusion>
+  				<artifactId>struts-core</artifactId>
+  				<groupId>org.apache.struts</groupId>
+  			</exclusion>
+  			<exclusion>
+  				<artifactId>struts-taglib</artifactId>
+  				<groupId>org.apache.struts</groupId>
+  			</exclusion>
+  			<exclusion>
+  				<artifactId>struts-tiles</artifactId>
+  				<groupId>org.apache.struts</groupId>
+  			</exclusion>
+  			<exclusion>
+  				<artifactId>sslext</artifactId>
+  				<groupId>sslext</groupId>
+  			</exclusion>
+  			<exclusion>
+  				<artifactId>commons-beanutils</artifactId>
+  				<groupId>commons-beanutils</groupId>
+  			</exclusion>
+  		</exclusions>
+      </dependency>
 
       <!-- Spring -->
       <dependency>