[jboss-cvs] JBossBlog SVN: r266 - in trunk: resources/WEB-INF and 12 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Mar 17 06:11:54 EDT 2008


Author: adamw
Date: 2008-03-17 06:11:54 -0400 (Mon, 17 Mar 2008)
New Revision: 266

Added:
   trunk/view/emails/proposition_accepted.xhtml
   trunk/view/emails/proposition_rejected.xhtml
Modified:
   trunk/blog.iml
   trunk/build.properties
   trunk/resources/WEB-INF/components.xml
   trunk/src/action/org/jboss/blog/session/feed/mod/FeedModBean.java
   trunk/src/action/org/jboss/blog/session/feed/mod/PropositionsListener.java
   trunk/src/action/org/jboss/blog/session/security/SecurityModBean.java
   trunk/src/action/org/jboss/blog/session/security/external/AbstractExternalSecurityService.java
   trunk/src/action/org/jboss/blog/session/security/external/DummyExternalSecurityService.java
   trunk/src/action/org/jboss/blog/session/security/external/ExternalSecurityService.java
   trunk/src/action/org/jboss/blog/session/tools/StringToolsBean.java
   trunk/src/model/org/jboss/blog/model/Group.java
   trunk/src/model/org/jboss/blog/model/RestrictedCategory.java
   trunk/src/model/org/jboss/blog/model/RestrictedEnclosure.java
   trunk/src/model/org/jboss/blog/model/RestrictedImage.java
   trunk/src/model/org/jboss/blog/model/RestrictedPost.java
   trunk/src/model/org/jboss/blog/model/Template.java
   trunk/src/model/org/jboss/blog/model/configuration/Configuration.java
   trunk/src/model/org/jboss/blog/model/feed/RestrictedFeed.java
   trunk/src/model/org/jboss/blog/model/log/PropositionsLog.java
   trunk/src/portal/org/jboss/blog/session/security/external/PortalExternalSecurityService.java
   trunk/src/portal/org/jboss/blog/session/security/external/PortalRole.java
   trunk/src/portal/org/jboss/blog/session/security/external/PortalSecurityService.java
   trunk/src/portal/org/jboss/blog/session/security/external/PortalSecurityServiceImpl.java
   trunk/src/portal/org/jboss/blog/session/security/external/PortalUser.java
   trunk/src/test/org/jboss/blog/session/merge/test/MergeServiceTest.java
   trunk/view/emails/new_proposition_email.xhtml
   trunk/view/manage/group/group_mod.xhtml
Log:


Modified: trunk/blog.iml
===================================================================
--- trunk/blog.iml	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/blog.iml	2008-03-17 10:11:54 UTC (rev 266)
@@ -4,6 +4,7 @@
     <facet type="jpa" name="JPA">
       <configuration>
         <setting name="validation-enabled" value="true" />
+        <setting name="provider-name" value="" />
         <datasource-mapping>
           <factory-entry name="blog" value="Datasource" />
         </datasource-mapping>
@@ -30,8 +31,258 @@
           <setting name="BUILD_EXTERNAL_DEPENDENCIES" value="false" />
           <setting name="EXCLUDE_EXPLODED_DIRECTORY" value="true" />
         </building>
+        <packaging>
+          <containerElement type="facet" facetId="blog/ejb/EJB">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="&lt;N/A&gt;" />
+          </containerElement>
+          <containerElement type="facet" facetId="blog/web/Web">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="&lt;N/A&gt;" />
+            <attribute name="contextRoot" value="blogWeb" />
+          </containerElement>
+        </packaging>
       </configuration>
     </facet>
+    <facet type="ejb" name="EJB">
+      <configuration>
+        <descriptors>
+          <deploymentDescriptor name="ejb-jar.xml" url="file://$MODULE_DIR$/resources/META-INF/ejb-jar.xml" optional="false" version="3.0" />
+        </descriptors>
+        <ejbRoots>
+          <root url="file://$MODULE_DIR$/src/action" />
+          <root url="file://$MODULE_DIR$/src/model" />
+          <root url="file://$MODULE_DIR$/src/portal" />
+          <root url="file://$MODULE_DIR$/src/services" />
+          <root url="file://$MODULE_DIR$/src/shotoku" />
+          <root url="file://$MODULE_DIR$/src/test" />
+          <root url="file://$MODULE_DIR$/src/tools" />
+        </ejbRoots>
+        <building>
+          <setting name="EXPLODED_URL" value="file://" />
+          <setting name="EXPLODED_ENABLED" value="false" />
+          <setting name="JAR_URL" value="file://" />
+          <setting name="JAR_ENABLED" value="false" />
+          <setting name="BUILD_MODULE_ON_FRAME_DEACTIVATION" value="false" />
+          <setting name="BUILD_EXTERNAL_DEPENDENCIES" value="false" />
+          <setting name="EXCLUDE_EXPLODED_DIRECTORY" value="true" />
+          <setting name="RUN_EJB_VALIDATION" value="true" />
+        </building>
+        <packaging>
+          <containerElement type="library" name="Seam" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/" />
+          </containerElement>
+          <containerElement type="library" name="api-other" level="application">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="&lt;N/A&gt;" />
+          </containerElement>
+          <containerElement type="library" name="hibernate" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/" />
+          </containerElement>
+          <containerElement type="library" name="javaee" level="application">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="&lt;N/A&gt;" />
+          </containerElement>
+          <containerElement type="library" name="rome" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/" />
+          </containerElement>
+          <containerElement type="library" name="search" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/" />
+          </containerElement>
+          <containerElement type="library" name="testng" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/" />
+          </containerElement>
+          <containerElement type="library" name="velocity" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/" />
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/" />
+            <url>jar://$MODULE_DIR$/lib/drools-core.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/" />
+            <url>jar://$MODULE_DIR$/lib/htmlcleaner1_6.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="&lt;N/A&gt;" />
+            <url>jar://$APPLICATION_HOME_DIR$/lib/javaee.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/" />
+            <url>jar://$MODULE_DIR$/lib/javassist.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/" />
+            <url>jar://$MODULE_DIR$/lib/jericho-html-2.5.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/" />
+            <url>jar://$MODULE_DIR$/lib/jsf-facelets.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/" />
+            <url>jar://$MODULE_DIR$/../jboss/lib/mysql.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/" />
+            <url>jar://$MODULE_DIR$/lib/portal-common-lib.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/" />
+            <url>jar://$MODULE_DIR$/lib/portal-identity-lib.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/" />
+            <url>jar://$MODULE_DIR$/lib/portal-portlet-jsr168api-lib.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/" />
+            <url>jar://$MODULE_DIR$/lib/shotoku-base.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/" />
+            <url>jar://$MODULE_DIR$/lib/urlrewritefilter.jar!/</url>
+          </containerElement>
+        </packaging>
+      </configuration>
+    </facet>
+    <facet type="web" name="Web">
+      <configuration>
+        <descriptors>
+          <deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/resources-portlet/WEB-INF/web.xml" optional="false" version="2.5" />
+        </descriptors>
+        <webroots>
+          <root url="file://$MODULE_DIR$/resources-portlet" relative="/" />
+        </webroots>
+        <building>
+          <setting name="EXPLODED_URL" value="file://" />
+          <setting name="EXPLODED_ENABLED" value="false" />
+          <setting name="JAR_URL" value="file://" />
+          <setting name="JAR_ENABLED" value="false" />
+          <setting name="BUILD_MODULE_ON_FRAME_DEACTIVATION" value="false" />
+          <setting name="BUILD_EXTERNAL_DEPENDENCIES" value="false" />
+          <setting name="EXCLUDE_EXPLODED_DIRECTORY" value="true" />
+          <setting name="RUN_JASPER_VALIDATION" value="true" />
+          <setting name="BUILD_ONLY_WEB_RESOURCES" value="false" />
+        </building>
+        <packaging>
+          <containerElement type="module" name="blog">
+            <attribute name="method" value="1" />
+            <attribute name="URI" value="/WEB-INF/classes" />
+          </containerElement>
+          <containerElement type="library" name="Seam" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/WEB-INF/lib" />
+          </containerElement>
+          <containerElement type="library" name="api-other" level="application">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="&lt;N/A&gt;" />
+          </containerElement>
+          <containerElement type="library" name="hibernate" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/WEB-INF/lib" />
+          </containerElement>
+          <containerElement type="library" name="javaee" level="application">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="&lt;N/A&gt;" />
+          </containerElement>
+          <containerElement type="library" name="rome" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/WEB-INF/lib" />
+          </containerElement>
+          <containerElement type="library" name="search" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/WEB-INF/lib" />
+          </containerElement>
+          <containerElement type="library" name="testng" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/WEB-INF/lib" />
+          </containerElement>
+          <containerElement type="library" name="velocity" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/WEB-INF/lib" />
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/WEB-INF/lib" />
+            <url>jar://$MODULE_DIR$/lib/drools-core.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/WEB-INF/lib" />
+            <url>jar://$MODULE_DIR$/lib/htmlcleaner1_6.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="&lt;N/A&gt;" />
+            <url>jar://$APPLICATION_HOME_DIR$/lib/javaee.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/WEB-INF/lib" />
+            <url>jar://$MODULE_DIR$/lib/javassist.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/WEB-INF/lib" />
+            <url>jar://$MODULE_DIR$/lib/jericho-html-2.5.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/WEB-INF/lib" />
+            <url>jar://$MODULE_DIR$/lib/jsf-facelets.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/WEB-INF/lib" />
+            <url>jar://$MODULE_DIR$/../jboss/lib/mysql.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/WEB-INF/lib" />
+            <url>jar://$MODULE_DIR$/lib/portal-common-lib.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/WEB-INF/lib" />
+            <url>jar://$MODULE_DIR$/lib/portal-identity-lib.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/WEB-INF/lib" />
+            <url>jar://$MODULE_DIR$/lib/portal-portlet-jsr168api-lib.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/WEB-INF/lib" />
+            <url>jar://$MODULE_DIR$/lib/shotoku-base.jar!/</url>
+          </containerElement>
+          <containerElement type="library" level="module">
+            <attribute name="method" value="0" />
+            <attribute name="URI" value="/WEB-INF/lib" />
+            <url>jar://$MODULE_DIR$/lib/urlrewritefilter.jar!/</url>
+          </containerElement>
+        </packaging>
+      </configuration>
+    </facet>
   </component>
   <component name="NewModuleRootManager" inherit-compiler-output="true">
     <exclude-output />
@@ -175,8 +426,6 @@
         <SOURCES />
       </library>
     </orderEntry>
-    <orderEntry type="library" name="jbosscache" level="project" />
-    <orderEntry type="library" name="jboss" level="project" />
     <orderEntry type="module-library">
       <library>
         <CLASSES>

Modified: trunk/build.properties
===================================================================
--- trunk/build.properties	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/build.properties	2008-03-17 10:11:54 UTC (rev 266)
@@ -1,6 +1,6 @@
 #jboss.home = /Users/adamwarski/portal-extensions/feeds/binaries
-#jboss.home = /Users/adamwarski/jboss/jboss-4.2
-jboss.home = /Users/adamwarski/jboss/jboss-4.0.5
-#profile = dev
-profile = prod
+jboss.home = /Users/adamwarski/jboss/jboss-4.2
+#jboss.home = /Users/adamwarski/jboss/jboss-4.0.5
+profile = dev
+#profile = prod
 #jboss.home = /Users/adamwarski/jboss/jboss-design
\ No newline at end of file

Modified: trunk/resources/WEB-INF/components.xml
===================================================================
--- trunk/resources/WEB-INF/components.xml	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/resources/WEB-INF/components.xml	2008-03-17 10:11:54 UTC (rev 266)
@@ -55,13 +55,6 @@
         <action execute="#{redirect.returnToCapturedView}"/>
     </event>
 
-    <event type="org.jboss.blog.feed.accept">
-        <action execute="#{feedMod.acceptFeed}"/>
-    </event>
-    <event type="org.jboss.blog.feed.proposed">
-        <action execute="#{feedMod.proposedFeed}"/>
-    </event>
-
     <mail:mail-session host="localhost" port="25" />
 
     <web:context-filter url-pattern="/feeds.seam" />
@@ -70,8 +63,4 @@
         <property name="serverAddress">http://localhost:8080</property>
         <property name="contextName">blogs</property>
     </component>
-
-     <component name="stringTools">
-        <property name="summaryLength">500</property>
-    </component>
 </components>

Modified: trunk/src/action/org/jboss/blog/session/feed/mod/FeedModBean.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/feed/mod/FeedModBean.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/action/org/jboss/blog/session/feed/mod/FeedModBean.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -10,10 +10,7 @@
 import org.jboss.blog.session.update.UpdateHandlerAsync;
 import org.jboss.seam.ScopeType;
 import org.jboss.seam.core.Events;
-import org.jboss.seam.annotations.AutoCreate;
-import org.jboss.seam.annotations.In;
-import org.jboss.seam.annotations.Name;
-import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.annotations.*;
 import org.jboss.seam.annotations.security.Restrict;
 import org.jboss.seam.faces.FacesMessages;
 
@@ -48,6 +45,9 @@
     @In
     private UpdateHandlerAsync updateHandlerAsync;
 
+    @In
+    private Events events;
+
     public void initNewFeed(Feed feed) {
         this.feed = feed;
         feed.setMaxPostsInFeed(10);
@@ -70,6 +70,7 @@
         return new XmlType[] { XmlType.ATOM };
     }
 
+    @Observer("org.jboss.blog.feed.accept")
     public void acceptFeed() {
         feed.setAccepted(true);
 
@@ -77,9 +78,12 @@
 
         updateHandlerAsync.update(feed);
 
+        events.raiseEvent("org.jboss.blog.feed.accepted", getFeed());
+
         facesMessages.addFromResourceBundle(FacesMessage.SEVERITY_INFO, "blog.feed.accepted", getFeed().getName());
     }
 
+    @Observer("org.jboss.blog.feed.proposed")
     public void proposedFeed() {
         facesMessages.addFromResourceBundle(FacesMessage.SEVERITY_INFO, "blog.feed.proposed", getFeed().getName());
     }
@@ -102,7 +106,7 @@
 
         facesMessages.addFromResourceBundle(FacesMessage.SEVERITY_INFO, "blog.feed.added", getFeed().getName());
 
-        Events.instance().raiseEvent("org.jboss.blog.feed.added", getFeed()); 
+        events.raiseEvent("org.jboss.blog.feed.added", getFeed());
     }
 
     @Restrict("#{identity.hasPermission('feed', 'edit', feedMod.feed, feedMod.feed.group)}")
@@ -111,17 +115,17 @@
 
         facesMessages.addFromResourceBundle(FacesMessage.SEVERITY_INFO, "blog.feed.updated", getFeed().getName());
 
-        Events.instance().raiseEvent("org.jboss.blog.feed.updated", getFeed());
+        events.raiseEvent("org.jboss.blog.feed.updated", getFeed());
     }
 
     @Restrict("#{identity.hasPermission('feed', 'delete', feedMod.feed, feedMod.feed.group)}")
     public void delete() {
-        Events.instance().raiseEvent("org.jboss.blog.feed.before_delete", getFeed());
+        events.raiseEvent("org.jboss.blog.feed.before_delete", getFeed());
 
         entityManager.remove(getFeed());
 
         facesMessages.addFromResourceBundle(FacesMessage.SEVERITY_INFO, "blog.feed.deleted", getFeed().getName());
 
-        Events.instance().raiseEvent("org.jboss.blog.feed.deleted", getFeed());
+        events.raiseEvent("org.jboss.blog.feed.deleted", getFeed());
     }
 }

Modified: trunk/src/action/org/jboss/blog/session/feed/mod/PropositionsListener.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/feed/mod/PropositionsListener.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/action/org/jboss/blog/session/feed/mod/PropositionsListener.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -7,9 +7,14 @@
 import org.jboss.seam.faces.Renderer;
 import org.jboss.seam.log.Log;
 import org.jboss.blog.model.log.PropositionsLog;
+import org.jboss.blog.model.security.*;
+import org.jboss.blog.model.feed.Feed;
 import org.jboss.blog.session.security.FeedsIdentity;
+import org.jboss.blog.session.security.external.ExternalSecurityService;
+import org.jboss.blog.session.configuration.ConfigurationManager;
 
 import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
 import java.util.Date;
 
 /**
@@ -29,17 +34,65 @@
     @In
     private FeedsIdentity identity;
 
+    @In
+    private ExternalSecurityService externalSecurityService;
+
+    @In
+    private ConfigurationManager configurationManager;
+
     @Logger
     private Log log;
 
+    private String currentEmail;
+
+    public String getCurrentEmail() {
+        return currentEmail;
+    }
+
+    private void sendEmail(String email, String view) {
+        if (email != null) {
+            try {
+                currentEmail = email;
+                renderer.render(view);
+            } catch (Exception e) {
+                log.warn(e);
+            }
+        }
+    }
+
     @Observer("org.jboss.blog.feed.proposed")
     public void feedProposed() {
+        entityManager.persist(new PropositionsLog(feedMod.getFeed(), identity.getSecurityUser(), new Date()));
+
+        sendEmail(feedMod.getFeed().getGroup().getAdminEmail(), "/emails/new_proposition_email.xhtml");
+        sendEmail(configurationManager.getConfiguration().getAdminEmail(), "/emails/new_proposition_email.xhtml");
+    }
+
+    private String getEmailForProposedFeed(Feed feed) {
         try {
-            renderer.render("/emails/new_proposition_email.xhtml");
-        } catch (Exception e) {
-            log.warn(e); 
+            SecurityUser securityUser = (SecurityUser) entityManager.createQuery(
+                    "select pl.securityUser from PropositionsLog pl where pl.feed = ?1")
+                    .setParameter(1, feed).getSingleResult();
+
+            if (securityUser != null) {
+                return externalSecurityService.getEmail(securityUser);
+            } else {
+                return null;
+            }
+        } catch (NoResultException e) {
+            return null;
         }
+    }
 
-        entityManager.persist(new PropositionsLog(feedMod.getFeed(), identity.getSecurityUser(), new Date()));
+    @Observer("org.jboss.blog.feed.accepted")
+    public void feedAccepted(Feed feed) {
+        sendEmail(getEmailForProposedFeed(feed), "/emails/proposition_accepted.xhtml");
     }
+
+    @Observer("org.jboss.blog.feed.before_delete")
+    public void beforeFeedDeleted(Feed feed) {
+        if (!feed.isAccepted()) {
+            sendEmail(getEmailForProposedFeed(feed), "/emails/proposition_rejected.xhtml");
+        }
+    }
 }

Modified: trunk/src/action/org/jboss/blog/session/security/SecurityModBean.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/security/SecurityModBean.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/action/org/jboss/blog/session/security/SecurityModBean.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -12,11 +12,8 @@
 import org.jboss.blog.model.feed.Feed;
 import org.jboss.blog.session.security.external.ExternalSecurityService;
 
-import javax.persistence.EntityManager;
-import javax.persistence.NoResultException;
 import javax.faces.application.FacesMessage;
 import java.util.List;
-import java.util.ArrayList;
 import java.io.Serializable;
 
 /**
@@ -27,9 +24,6 @@
 @AutoCreate
 public class SecurityModBean implements Serializable {
     @In
-    private EntityManager entityManager;
-
-    @In
     private ExternalSecurityService externalSecurityService;
 
     @In
@@ -81,51 +75,28 @@
         this.role = role;
     }
 
-    private SecurityMapping getMapping(FeedsSecurityRole role, Integer idForRole) {
-        try {
-            if (idForRole == null) {
-                return (SecurityMapping) entityManager.createQuery(
-                    "select mapping from SecurityMapping mapping where mapping.role = ?1")
-                    .setParameter(1, role).getSingleResult();
-            } else {
-                return (SecurityMapping) entityManager.createQuery(
-                    "select mapping from SecurityMapping mapping where mapping.role = ?1 and mapping.idForRole = ?2")
-                    .setParameter(1, role).setParameter(2, idForRole).getSingleResult();
-            }
-        } catch (NoResultException e) {
-            SecurityMapping mapping = new SecurityMapping();
-            mapping.setRole(role);
-            mapping.setIdForRole(idForRole);
-            mapping.setUsers(new ArrayList<SecurityUser>());
-            mapping.setGroups(new ArrayList<SecurityGroup>());
-            entityManager.persist(mapping);
-
-            return mapping;
-        }
-    }
-
     public List<SecurityGroup> getAdministratorGroups() {
-        return getMapping(FeedsSecurityRole.ADMIN, null).getGroups();
+        return externalSecurityService.getMapping(FeedsSecurityRole.ADMIN, null).getGroups();
     }
 
     public List<SecurityGroup> getGroupAdministratorGroups(Group group) {
-        return getMapping(FeedsSecurityRole.GROUP_ADMIN, group.getId()).getGroups();
+        return externalSecurityService.getMapping(FeedsSecurityRole.GROUP_ADMIN, group.getId()).getGroups();
     }
 
     public List<SecurityGroup> getFeedAdministratorGroups(Feed feed) {
-        return getMapping(FeedsSecurityRole.FEED_ADMIN, feed.getId()).getGroups();
+        return externalSecurityService.getMapping(FeedsSecurityRole.FEED_ADMIN, feed.getId()).getGroups();
     }
 
     public List<SecurityUser> getAdministratorUsers() {
-        return getMapping(FeedsSecurityRole.ADMIN, null).getUsers();
+        return externalSecurityService.getMapping(FeedsSecurityRole.ADMIN, null).getUsers();
     }
 
     public List<SecurityUser> getGroupAdministratorUsers(Group group) {
-        return getMapping(FeedsSecurityRole.GROUP_ADMIN, group.getId()).getUsers();
+        return externalSecurityService.getMapping(FeedsSecurityRole.GROUP_ADMIN, group.getId()).getUsers();
     }
 
     public List<SecurityUser> getFeedAdministratorUsers(Feed feed) {
-        return getMapping(FeedsSecurityRole.FEED_ADMIN, feed.getId()).getUsers();
+        return externalSecurityService.getMapping(FeedsSecurityRole.FEED_ADMIN, feed.getId()).getUsers();
     }
 
     private SecurityMapping getMapping() {
@@ -137,7 +108,7 @@
             default: idForRole = null;
         }
 
-        return getMapping(getRole(), idForRole);
+        return externalSecurityService.getMapping(getRole(), idForRole);
     }
 
     public void addSecurityGroupAsSuperUser() {

Modified: trunk/src/action/org/jboss/blog/session/security/external/AbstractExternalSecurityService.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/security/external/AbstractExternalSecurityService.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/action/org/jboss/blog/session/security/external/AbstractExternalSecurityService.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -1,12 +1,10 @@
 package org.jboss.blog.session.security.external;
 
-import org.jboss.blog.model.security.SecurityUser;
-import org.jboss.blog.model.security.SecurityGroup;
-import org.jboss.blog.model.security.RestrictedSecurityGroup;
-import org.jboss.blog.model.security.RestrictedSecurityUser;
+import org.jboss.blog.model.security.*;
 
 import javax.persistence.EntityManager;
 import javax.persistence.NoResultException;
+import java.util.ArrayList;
 
 /**
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
@@ -51,4 +49,28 @@
             return su;
         }
     }
+
+    public SecurityMapping getMapping(FeedsSecurityRole role, Integer idForRole) {
+        try {
+            if (idForRole == null) {
+                return (SecurityMapping) getEntityManager().createQuery(
+                    "select mapping from SecurityMapping mapping where mapping.role = ?1")
+                    .setParameter(1, role).getSingleResult();
+            } else {
+                return (SecurityMapping) getEntityManager().createQuery(
+                    "select mapping from SecurityMapping mapping where mapping.role = ?1 and mapping.idForRole = ?2")
+                    .setParameter(1, role).setParameter(2, idForRole).getSingleResult();
+            }
+        } catch (NoResultException e) {
+            SecurityMapping mapping = new SecurityMapping();
+            mapping.setRole(role);
+            mapping.setIdForRole(idForRole);
+            mapping.setUsers(new ArrayList<SecurityUser>());
+            mapping.setGroups(new ArrayList<SecurityGroup>());
+            getEntityManager().persist(mapping);
+            getEntityManager().flush();
+
+            return mapping;
+        }
+    }
 }
\ No newline at end of file

Modified: trunk/src/action/org/jboss/blog/session/security/external/DummyExternalSecurityService.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/security/external/DummyExternalSecurityService.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/action/org/jboss/blog/session/security/external/DummyExternalSecurityService.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -60,6 +60,17 @@
         return groups;
     }
 
+    public List<? extends RestrictedSecurityUser> getUsersInGroup(RestrictedSecurityGroup securityGroup) {
+        List<SecurityUser> users = new ArrayList<SecurityUser>();
+        users.add(new SecurityUser(securityGroup.getExternalId(), securityGroup.getExternalId()));
+
+        return users;
+    }
+
+    public String getEmail(RestrictedSecurityUser securityUserUser) {
+        return "a at a.pl";
+    }
+
     public String getDisplayName(RestrictedSecurityUser securityUser) {
         return securityUser.getExternalId();
     }

Modified: trunk/src/action/org/jboss/blog/session/security/external/ExternalSecurityService.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/security/external/ExternalSecurityService.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/action/org/jboss/blog/session/security/external/ExternalSecurityService.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -1,9 +1,6 @@
 package org.jboss.blog.session.security.external;
 
-import org.jboss.blog.model.security.SecurityUser;
-import org.jboss.blog.model.security.SecurityGroup;
-import org.jboss.blog.model.security.RestrictedSecurityGroup;
-import org.jboss.blog.model.security.RestrictedSecurityUser;
+import org.jboss.blog.model.security.*;
 import org.jboss.blog.session.security.InvalidLoginException;
 
 import java.util.List;
@@ -24,9 +21,15 @@
 
     List<SecurityGroup> getGroupsOfUser(SecurityUser securityUser);
 
+    List<? extends RestrictedSecurityUser> getUsersInGroup(RestrictedSecurityGroup securityGroup);
+
+    String getEmail(RestrictedSecurityUser securityUser);
+
     String getDisplayName(RestrictedSecurityUser securityUser);
 
     String getDisplayName(RestrictedSecurityGroup securityGroup);
 
     RestrictedSecurityGroup getAdminGroup();
+
+    SecurityMapping getMapping(FeedsSecurityRole role, Integer idForRole);
 }

Modified: trunk/src/action/org/jboss/blog/session/tools/StringToolsBean.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/tools/StringToolsBean.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/action/org/jboss/blog/session/tools/StringToolsBean.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -15,6 +15,10 @@
 public class StringToolsBean {
     private volatile int summaryLength;
 
+    public StringToolsBean() {
+        summaryLength = 500;
+    }
+
     public int getSummaryLength() {
         return summaryLength;
     }

Modified: trunk/src/model/org/jboss/blog/model/Group.java
===================================================================
--- trunk/src/model/org/jboss/blog/model/Group.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/model/org/jboss/blog/model/Group.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -3,10 +3,12 @@
 import org.hibernate.validator.NotEmpty;
 import org.hibernate.validator.Pattern;
 import org.hibernate.validator.Length;
+import org.hibernate.validator.Email;
 import org.hibernate.annotations.Cache;
 import org.hibernate.annotations.CacheConcurrencyStrategy;
 
 import javax.persistence.*;
+import java.io.Serializable;
 
 /**
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
@@ -14,7 +16,7 @@
 @Entity
 @Table(name = "FeedGroup")
 @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
-public class Group {
+public class Group implements Serializable {
     @Id
     @GeneratedValue
     @Column(updatable = false)
@@ -33,6 +35,9 @@
     @Lob
     private String header;
 
+    @Email
+    private String adminEmail;
+
     public Integer getId() {
         return id;
     }
@@ -65,6 +70,14 @@
         this.header = header;
     }
 
+    public String getAdminEmail() {
+        return adminEmail;
+    }
+
+    public void setAdminEmail(String adminEmail) {
+        this.adminEmail = adminEmail;
+    }
+
     public boolean equals(Object o) {
         if (this == o) return true;
         if (!(o instanceof Group)) return false;

Modified: trunk/src/model/org/jboss/blog/model/RestrictedCategory.java
===================================================================
--- trunk/src/model/org/jboss/blog/model/RestrictedCategory.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/model/org/jboss/blog/model/RestrictedCategory.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -1,9 +1,11 @@
 package org.jboss.blog.model;
 
+import java.io.Serializable;
+
 /**
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
  */
-public interface RestrictedCategory {
+public interface RestrictedCategory extends Serializable {
     Integer getId();
 
     String getName();

Modified: trunk/src/model/org/jboss/blog/model/RestrictedEnclosure.java
===================================================================
--- trunk/src/model/org/jboss/blog/model/RestrictedEnclosure.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/model/org/jboss/blog/model/RestrictedEnclosure.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -1,9 +1,11 @@
 package org.jboss.blog.model;
 
+import java.io.Serializable;
+
 /**
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
  */
-public interface RestrictedEnclosure {
+public interface RestrictedEnclosure extends Serializable {
     Integer getId();
 
     String getUrl();

Modified: trunk/src/model/org/jboss/blog/model/RestrictedImage.java
===================================================================
--- trunk/src/model/org/jboss/blog/model/RestrictedImage.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/model/org/jboss/blog/model/RestrictedImage.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -1,9 +1,11 @@
 package org.jboss.blog.model;
 
+import java.io.Serializable;
+
 /**
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
  */
-public interface RestrictedImage {
+public interface RestrictedImage extends Serializable {
     Integer getId();
 
     String getUrl();

Modified: trunk/src/model/org/jboss/blog/model/RestrictedPost.java
===================================================================
--- trunk/src/model/org/jboss/blog/model/RestrictedPost.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/model/org/jboss/blog/model/RestrictedPost.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -4,11 +4,12 @@
 
 import java.util.List;
 import java.util.Date;
+import java.io.Serializable;
 
 /**
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
  */
-public interface RestrictedPost extends Comparable<RestrictedPost> {
+public interface RestrictedPost extends Comparable<RestrictedPost>, Serializable {
     Integer getId();
 
     String getTitle();

Modified: trunk/src/model/org/jboss/blog/model/Template.java
===================================================================
--- trunk/src/model/org/jboss/blog/model/Template.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/model/org/jboss/blog/model/Template.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -7,13 +7,14 @@
 
 import javax.persistence.*;
 import java.util.Date;
+import java.io.Serializable;
 
 /**
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
  */
 @Entity
 @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
-public class Template {
+public class Template implements Serializable {
     @Id
     @GeneratedValue
     @Column(updatable = false)

Modified: trunk/src/model/org/jboss/blog/model/configuration/Configuration.java
===================================================================
--- trunk/src/model/org/jboss/blog/model/configuration/Configuration.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/model/org/jboss/blog/model/configuration/Configuration.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -4,12 +4,13 @@
 import org.hibernate.validator.Email;
 
 import javax.persistence.*;
+import java.io.Serializable;
 
 /**
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
  */
 @Entity
-public class Configuration {
+public class Configuration implements Serializable {
     @Id
     @GeneratedValue
     @Column(updatable = false)

Modified: trunk/src/model/org/jboss/blog/model/feed/RestrictedFeed.java
===================================================================
--- trunk/src/model/org/jboss/blog/model/feed/RestrictedFeed.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/model/org/jboss/blog/model/feed/RestrictedFeed.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -1,8 +1,11 @@
 package org.jboss.blog.model.feed;
+
+import java.io.Serializable;
+
 /**
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
  */
-public interface RestrictedFeed {
+public interface RestrictedFeed extends Serializable {
     Integer getId();
 
     String getName();

Modified: trunk/src/model/org/jboss/blog/model/log/PropositionsLog.java
===================================================================
--- trunk/src/model/org/jboss/blog/model/log/PropositionsLog.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/model/org/jboss/blog/model/log/PropositionsLog.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -11,6 +11,7 @@
  * @author <a href="mailto:adam at warski.org">Adam Warski</a>
  */
 @Entity
+ at Table(uniqueConstraints = @UniqueConstraint(columnNames = "feed_id"))
 public class PropositionsLog {
     @Id
     @GeneratedValue

Modified: trunk/src/portal/org/jboss/blog/session/security/external/PortalExternalSecurityService.java
===================================================================
--- trunk/src/portal/org/jboss/blog/session/security/external/PortalExternalSecurityService.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/portal/org/jboss/blog/session/security/external/PortalExternalSecurityService.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -112,7 +112,6 @@
 
     public List<? extends RestrictedSecurityUser> getAllUsers() {
         try {
-
             //noinspection unchecked
             return convertUsers(portalSecurityService.getAllUsers(), false);
         } catch (PortalSecurityException e) {
@@ -131,6 +130,24 @@
         }
     }
 
+    public List<? extends RestrictedSecurityUser> getUsersInGroup(RestrictedSecurityGroup securityGroup) {
+        try {
+            return convertUsers(portalSecurityService.getUsersInRole(securityGroup.getExternalId()), false);
+        } catch (PortalSecurityException e) {
+            log.error(e);
+            return new ArrayList<RestrictedSecurityUser>();
+        }
+    }
+
+    public String getEmail(RestrictedSecurityUser securityUser) {
+        try {
+            return getRealUser(securityUser).getEmail();
+        } catch (PortalSecurityException e) {
+            log.error(e);
+            return null;
+        }
+    }
+
     public String getDisplayName(RestrictedSecurityUser securityUser) {
         try {
             return getRealUser(securityUser).getDisplayName();

Modified: trunk/src/portal/org/jboss/blog/session/security/external/PortalRole.java
===================================================================
--- trunk/src/portal/org/jboss/blog/session/security/external/PortalRole.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/portal/org/jboss/blog/session/security/external/PortalRole.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -16,15 +16,7 @@
         return id;
     }
 
-    public void setId(String id) {
-        this.id = id;
-    }
-
     public String getDisplayName() {
         return displayName;
     }
-
-    public void setDisplayName(String displayName) {
-        this.displayName = displayName;
-    }
 }

Modified: trunk/src/portal/org/jboss/blog/session/security/external/PortalSecurityService.java
===================================================================
--- trunk/src/portal/org/jboss/blog/session/security/external/PortalSecurityService.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/portal/org/jboss/blog/session/security/external/PortalSecurityService.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -10,19 +10,21 @@
  */
 @Local
 public interface PortalSecurityService {
-    public PortalUser authenticate(String username, String password) throws PortalSecurityException, InvalidLoginException;
+    PortalUser authenticate(String username, String password) throws PortalSecurityException, InvalidLoginException;
 
-    public List<PortalRole> getAllRoles() throws PortalSecurityException;
+    List<PortalRole> getAllRoles() throws PortalSecurityException;
 
-    public List<PortalUser> getAllUsers() throws PortalSecurityException;
+    List<PortalUser> getAllUsers() throws PortalSecurityException;
 
-    public List<PortalRole> getRolesOfUser(String id) throws PortalSecurityException;
+    List<PortalRole> getRolesOfUser(String id) throws PortalSecurityException;
 
-    public PortalRole getAdminRole() throws PortalSecurityException;
+    List<PortalUser> getUsersInRole(String id) throws PortalSecurityException;
 
-    public PortalRole getRoleById(String id) throws PortalSecurityException;
+    PortalRole getAdminRole() throws PortalSecurityException;
 
-    public PortalUser getUserById(String id) throws PortalSecurityException; 
+    PortalRole getRoleById(String id) throws PortalSecurityException;
 
-    public void remove();
+    PortalUser getUserById(String id) throws PortalSecurityException;
+
+    void remove();
 }

Modified: trunk/src/portal/org/jboss/blog/session/security/external/PortalSecurityServiceImpl.java
===================================================================
--- trunk/src/portal/org/jboss/blog/session/security/external/PortalSecurityServiceImpl.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/portal/org/jboss/blog/session/security/external/PortalSecurityServiceImpl.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -6,6 +6,7 @@
 import org.jboss.portal.identity.Role;
 import org.jboss.portal.common.util.Tools;
 import org.jboss.blog.session.security.InvalidLoginException;
+import org.jboss.blog.tools.StringTools;
 
 import javax.ejb.Stateless;
 import javax.ejb.Remove;
@@ -53,6 +54,23 @@
         }
     }
 
+    private UserProfileModule getProfileModule() throws PortalSecurityException {
+        try {
+            return (UserProfileModule) new InitialContext().lookup("java:portal/UserProfileModule");
+        } catch (NamingException e) {
+            log.error(e);
+            throw new PortalSecurityException(e);
+        }
+    }
+
+    private String getUserEmail(User user) throws PortalSecurityException {
+        try {
+            return StringTools.safeToString(getProfileModule().getProperty(user, User.INFO_USER_EMAIL_REAL));
+        } catch (IdentityException e) {
+            throw new PortalSecurityException(e);
+        }
+    }
+
     @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
     public PortalUser authenticate(String username, String password)
             throws InvalidLoginException, PortalSecurityException {
@@ -75,7 +93,7 @@
             }
         }
 
-        return new PortalUser(user.getId().toString(), user.getUserName());
+        return new PortalUser(user.getId().toString(), user.getUserName(), getUserEmail(user));
     }
 
     @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
@@ -102,7 +120,7 @@
             // TODO - users count
             for (Object userObj : getUserModule().findUsers(0, 100000)) {
                 User user = (User) userObj;
-                users.add(new PortalUser(user.getId().toString(), user.getUserName()));
+                users.add(new PortalUser(user.getId().toString(), user.getUserName(), getUserEmail(user)));
             }
 
             return users;
@@ -128,6 +146,22 @@
     }
 
     @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
+    public List<PortalUser> getUsersInRole(String id) throws PortalSecurityException {
+        try {
+            List<PortalUser> users = new ArrayList<PortalUser>();
+
+            for (Object roleObj : getMembershipModule().getUsers(getRoleModule().findRoleById(id)))  {
+                User user = (User) roleObj;
+                users.add(new PortalUser(user.getId().toString(), user.getUserName(), getUserEmail(user)));
+            }
+
+            return users;
+        } catch (IdentityException e) {
+            throw new PortalSecurityException(e);
+        }
+    }
+
+    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
     public PortalRole getAdminRole() throws PortalSecurityException {
         try {
             Role adminRole = getRoleModule().findRoleByName("Admin");
@@ -156,7 +190,7 @@
     public PortalUser getUserById(String id) throws PortalSecurityException {
         try {
             User user = getUserModule().findUserById(id);
-            return new PortalUser(user.getId().toString(), user.getUserName());
+            return new PortalUser(user.getId().toString(), user.getUserName(), getUserEmail(user));
         } catch (IdentityException e) {
             throw new PortalSecurityException(e);
         }

Modified: trunk/src/portal/org/jboss/blog/session/security/external/PortalUser.java
===================================================================
--- trunk/src/portal/org/jboss/blog/session/security/external/PortalUser.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/portal/org/jboss/blog/session/security/external/PortalUser.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -6,25 +6,23 @@
 public class PortalUser {
     private String id;
     private String displayName;
+    private String email;
 
-    public PortalUser(String id, String displayName) {
+    public PortalUser(String id, String displayName, String email) {
         this.id = id;
         this.displayName = displayName;
+        this.email = email;
     }
 
     public String getId() {
         return id;
     }
 
-    public void setId(String id) {
-        this.id = id;
-    }
-
     public String getDisplayName() {
         return displayName;
     }
 
-    public void setDisplayName(String displayName) {
-        this.displayName = displayName;
+    public String getEmail() {
+        return email;
     }
 }

Modified: trunk/src/test/org/jboss/blog/session/merge/test/MergeServiceTest.java
===================================================================
--- trunk/src/test/org/jboss/blog/session/merge/test/MergeServiceTest.java	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/src/test/org/jboss/blog/session/merge/test/MergeServiceTest.java	2008-03-17 10:11:54 UTC (rev 266)
@@ -1,14 +1,15 @@
 package org.jboss.blog.session.merge.test;
 
 import static org.easymock.EasyMock.*;
+import org.easymock.EasyMock;
 import org.jboss.blog.model.feed.Feed;
 import org.jboss.blog.model.Post;
 import org.jboss.blog.model.Enclosure;
 import org.jboss.blog.model.Image;
+import org.jboss.blog.model.RestrictedPost;
 import org.jboss.blog.service.FeedsService;
 import org.jboss.blog.service.PostNotFoundException;
 import org.jboss.blog.session.merge.MergeServiceBean;
-import org.jboss.blog.session.merge.TitleAsIdService;
 import org.jboss.blog.tools.TestTools;
 import org.jboss.seam.log.Log;
 import org.testng.annotations.BeforeClass;
@@ -100,7 +101,8 @@
                 post_2007_11_01_t1_c1_l1);
         
         // Behaviour of mocks
-        expect(mockFeedsService.getPosts(feed, 0, 3)).andReturn((List) posts);
+        EasyMock.<List<? extends RestrictedPost>>expect(mockFeedsService.getPosts(feed, 0, 3))
+                .andReturn(posts);
         expect(mockFeedsService.getPost(post_2007_11_02_t3_c3_l3.getTitle())).andReturn(post_2007_11_02_t3_c3_l3);
         expect(mockFeedsService.getPost(post_2007_11_01_t1_c1_l1.getTitle())).andReturn(post_2007_11_01_t1_c1_l1);
         mockEntityManager.flush();
@@ -122,7 +124,7 @@
                 post_2007_11_01_t1_c1_l1);
 
         // Behaviour of mocks
-        expect(mockFeedsService.getPosts(feed, 0, 3)).andReturn((List) mergeTo);
+        EasyMock.<List<? extends RestrictedPost>>expect(mockFeedsService.getPosts(feed, 0, 3)).andReturn(mergeTo);
         mockEntityManager.persist(post_2007_11_02_t3_c3_l3);
         mockEntityManager.flush();
         mockEntityManager.persist(post_2007_11_01_t1_c1_l1);
@@ -146,7 +148,7 @@
         List<Post> mergeFrom = new ArrayList<Post>();
 
         // Behaviour of mocks
-        expect(mockFeedsService.getPosts(feed, 0, 1)).andReturn((List) mergeTo);
+        EasyMock.<List<? extends RestrictedPost>>expect(mockFeedsService.getPosts(feed, 0, 1)).andReturn(mergeTo);
         mockEntityManager.flush();
 
         // Test
@@ -167,7 +169,7 @@
                 post_2007_11_02_t1_c1_l4);
 
         // Behaviour of mocks
-        expect(mockFeedsService.getPosts(feed, 0, 3)).andReturn((List) mergeTo);
+        EasyMock.<List<? extends RestrictedPost>>expect(mockFeedsService.getPosts(feed, 0, 3)).andReturn(mergeTo);
         mockEntityManager.persist(post_2007_11_04_t6_c6_l7);
         mockEntityManager.flush();
         mockEntityManager.persist(post_2007_11_02_t1_c1_l4);
@@ -193,7 +195,7 @@
                 post_2007_11_03_t5_c5_l6, post_2007_11_01_t2_c2_l2);
 
         // Behaviour of mocks
-        expect(mockFeedsService.getPosts(feed, 0, 4)).andReturn((List) mergeTo);
+        EasyMock.<List<? extends RestrictedPost>>expect(mockFeedsService.getPosts(feed, 0, 4)).andReturn(mergeTo);
 
         expect(mockFeedsService.getPost(post_2007_11_04_t6_c6_l7.getTitle())).andReturn(post_2007_11_04_t6_c6_l7);
 
@@ -203,7 +205,7 @@
         expect(mockFeedsService.getPost(post_2007_11_01_t1_c1_l1.getTitle())).andReturn(post_2007_11_01_t1_c1_l1);
         mockEntityManager.flush();
 
-        expect(mockFeedsService.getPosts(feed, 4, 8)).andReturn(new ArrayList());
+        EasyMock.<List<? extends RestrictedPost>>expect(mockFeedsService.getPosts(feed, 4, 8)).andReturn(new ArrayList<Post>());
 
         mockEntityManager.flush();
 
@@ -231,7 +233,7 @@
                 post_2007_11_03_t4_c4_l5, post_2007_11_02_t3_c3_l3);
 
         // Behaviour of mocks
-        expect(mockFeedsService.getPosts(feed, 0, 6)).andReturn((List) mergeTo);
+        EasyMock.<List<? extends RestrictedPost>>expect(mockFeedsService.getPosts(feed, 0, 6)).andReturn(mergeTo);
         expect(mockFeedsService.getPost(post_2007_11_05_t6_c6_l8.getTitle())).andReturn(post_2007_11_05_t6_c6_l8);
         expect(mockFeedsService.getPost(post_2007_11_04_t6_c6_l7.getTitle())).andReturn(post_2007_11_04_t6_c6_l7);
         expect(mockFeedsService.getPost(post_2007_11_03_t5_c5_l6.getTitle())).andReturn(post_2007_11_03_t5_c5_l6);
@@ -260,9 +262,9 @@
         List<Post> mergeFrom = Arrays.asList(post_2007_11_02_t1_c1_l4);
 
         // Behaviour of mocks
-        expect(mockFeedsService.getPosts(feed, 0, 2)).andReturn((List) mergeTo1);
-        expect(mockFeedsService.getPosts(feed, 2, 4)).andReturn((List) mergeTo2);
-        expect(mockFeedsService.getPosts(feed, 4, 6)).andReturn((List) mergeTo3);
+        EasyMock.<List<? extends RestrictedPost>>expect(mockFeedsService.getPosts(feed, 0, 2)).andReturn(mergeTo1);
+        EasyMock.<List<? extends RestrictedPost>>expect(mockFeedsService.getPosts(feed, 2, 4)).andReturn(mergeTo2);
+        EasyMock.<List<? extends RestrictedPost>>expect(mockFeedsService.getPosts(feed, 4, 6)).andReturn(mergeTo3);
         mockEntityManager.persist(post_2007_11_02_t1_c1_l4);
         mockEntityManager.flush();
         mockEntityManager.flush();

Modified: trunk/view/emails/new_proposition_email.xhtml
===================================================================
--- trunk/view/emails/new_proposition_email.xhtml	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/view/emails/new_proposition_email.xhtml	2008-03-17 10:11:54 UTC (rev 266)
@@ -5,7 +5,7 @@
     charset="UTF-8">
 
     <m:from name="JBoss.ORG Feeds robot" address="feeds-robot at jboss.org" />
-    <m:to>#{configurationManager.configuration.adminEmail}</m:to>
+    <m:to>#{propositionsListener.currentEmail}</m:to>
     <m:subject>A new feed has been proposed</m:subject>
 
     <m:body type="plain">
@@ -14,7 +14,7 @@
         Title: #{feedMod.feed.title}<br />
         Link: #{feedMod.feed.remoteLink}<br />
         <br />
-        Visit http://labs.jboss.com/blogs/manage/proposition/proposition_list.seam to accept/reject the feed.<br />
+        Visit #{linkService.serverAddress}/#{linkService.contextName}/manage/proposition/proposition_list.seam to accept/reject the feed.<br />
         <br />
         -- <br />
         JBoss.ORG Feeds robot

Copied: trunk/view/emails/proposition_accepted.xhtml (from rev 250, trunk/view/emails/new_proposition_email.xhtml)
===================================================================
--- trunk/view/emails/proposition_accepted.xhtml	                        (rev 0)
+++ trunk/view/emails/proposition_accepted.xhtml	2008-03-17 10:11:54 UTC (rev 266)
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<m:message xmlns="http://www.w3.org/1999/xhtml"
+    xmlns:m="http://jboss.com/products/seam/mail"
+    xmlns:h="http://java.sun.com/jsf/html"
+    charset="UTF-8">
+
+    <m:from name="JBoss.ORG Feeds robot" address="feeds-robot at jboss.org" />
+    <m:to>#{propositionsListener.currentEmail}</m:to>
+    <m:subject>Your feed has been accepted!</m:subject>
+
+    <m:body type="plain">
+        Welcome!<br />
+        <br />
+        Congratulations! Your feed: '#{feedMod.feed.title}' has been accepted and will now be aggregated on
+        JBoss.ORG Feeds.<br />
+        <br />
+        To view the feed, enter:<br />
+        #{linkService.generateFeedPageLink(feedMod.feed)}<br />
+        <br />
+        And don't forget to visit http://labs.jboss.com often!<br />
+        <br />
+        -- <br />
+        JBoss.ORG Feeds robot
+    </m:body>
+</m:message>
\ No newline at end of file

Copied: trunk/view/emails/proposition_rejected.xhtml (from rev 250, trunk/view/emails/new_proposition_email.xhtml)
===================================================================
--- trunk/view/emails/proposition_rejected.xhtml	                        (rev 0)
+++ trunk/view/emails/proposition_rejected.xhtml	2008-03-17 10:11:54 UTC (rev 266)
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<m:message xmlns="http://www.w3.org/1999/xhtml"
+    xmlns:m="http://jboss.com/products/seam/mail"
+    xmlns:h="http://java.sun.com/jsf/html"
+    charset="UTF-8">
+
+    <m:from name="JBoss.ORG Feeds robot" address="feeds-robot at jboss.org" />
+    <m:to>#{propositionsListener.currentEmail}</m:to>
+    <m:subject>Your feed has been rejected</m:subject>
+
+    <m:body type="plain">
+        Unfortunately, your feed '#{feedMod.feed.title}' has been rejected.<br />
+        <br />
+        Is it a blog on a JBoss-related subject?<br />
+        Did you submit a feed containing only JBoss-related posts?<br />
+        <br />
+        If so, and you still think that your feed should be aggregated, please contact the project to which's group you
+        submitted your blog.
+        <br />
+        -- <br />
+        JBoss.ORG Feeds robot
+    </m:body>
+</m:message>
\ No newline at end of file

Modified: trunk/view/manage/group/group_mod.xhtml
===================================================================
--- trunk/view/manage/group/group_mod.xhtml	2008-03-14 10:22:37 UTC (rev 265)
+++ trunk/view/manage/group/group_mod.xhtml	2008-03-17 10:11:54 UTC (rev 266)
@@ -11,6 +11,10 @@
     <div class="TwoColumnBlogSubnav">
         <h4>Tips</h4>
         <ul>
+            <li>
+                Notifications of new proposed feeds in this group will be sent to the e-mail
+                specified below (field "Administrator e-mail").
+            </li>
             <li class="last">
                 <p>Header is an optional piece of HTML that will be displayed on the top of the page when
                     viewing feeds/posts from that group.</p>
@@ -46,6 +50,18 @@
                     </a:outputPanel>
                 </h:panelGroup>
 
+                <h:outputLabel for="adminEmail">Administrator e-mail:</h:outputLabel>
+                <h:panelGroup>
+                    <h:inputText id="adminEmail" value="#{groupMod.group.adminEmail}" size="32">
+                        <a:support event="onblur" reRender="adminEmailMessage" ajaxSingle="true" bypassUpdates="true"/>
+                        <s:validate />
+                    </h:inputText>
+
+                    <a:outputPanel id="adminEmailMessage">
+                        <h:message for="adminEmail" styleClass="error" />
+                    </a:outputPanel>
+                </h:panelGroup>
+
                 <h:outputLabel for="header">Header:</h:outputLabel>
                 <h:panelGroup>
                     <h:inputTextarea id="header" value="#{groupMod.group.header}" rows="25" cols="60">




More information about the jboss-cvs-commits mailing list