Author: mflorea
Date: 2008-01-02 15:45:48 +0100 (Wed, 02 Jan 2008)
New Revision: 6587

Modified:
   
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/impl/InvitationManagerImpl.java
Log:
notify space admins on new request membership; notify user after making a 
membership request; create space user profile on accept membership request;

Modified: 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/impl/InvitationManagerImpl.java
===================================================================
--- 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/impl/InvitationManagerImpl.java
     2008-01-02 14:38:21 UTC (rev 6586)
+++ 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/impl/InvitationManagerImpl.java
     2008-01-02 14:45:48 UTC (rev 6587)
@@ -22,10 +22,11 @@
 import java.util.*;
 
 import org.xwiki.plugin.invitationmanager.api.*;
-import org.xwiki.plugin.spacemanager.impl.SpaceImpl;
 import org.xwiki.plugin.spacemanager.api.SpaceManager;
 import org.xwiki.plugin.spacemanager.api.SpaceManagers;
 import org.xwiki.plugin.spacemanager.api.Space;
+import org.xwiki.plugin.spacemanager.api.SpaceUserProfile;
+import org.xwiki.plugin.spacemanager.impl.SpaceUserProfileImpl;
 import org.apache.commons.lang.RandomStringUtils;
 import org.apache.velocity.VelocityContext;
 
@@ -46,6 +47,8 @@
 {
     public static interface JoinRequestAction
     {
+        String CREATE = "Create";
+
         String SEND = "Send";
 
         String ACCEPT = "Accept";
@@ -184,6 +187,9 @@
                 // send notification mail
                 sendMail(JoinRequestAction.ACCEPT, request, templateMail, 
context);
 
+                // create space user profile based on the membership request
+                createSpaceUserProfile(space, request, context);
+                
                 // update the list of members and their roles
                 addMember(space, userName, request.getRoles(), context);
 
@@ -200,13 +206,15 @@
 
     /**
      * [EMAIL PROTECTED]
-     *
+     * 
      * @see InvitationManager#acceptMembership(String, String, XWikiContext)
      */
-    public boolean acceptMembership(String space, String userName, 
XWikiContext context) throws InvitationManagerException {
+    public boolean acceptMembership(String space, String userName, 
XWikiContext context)
+        throws InvitationManagerException
+    {
         String templateMail =
-                getDefaultTemplateMailDocumentName(space, "MembershipRequest",
-                        JoinRequestAction.ACCEPT, context);
+            getDefaultTemplateMailDocumentName(space, "Request", 
JoinRequestAction.ACCEPT,
+                context);
         return acceptMembership(space, userName, templateMail, context);
     }
 
@@ -824,11 +832,14 @@
 
     /**
      * [EMAIL PROTECTED]
-     *
-     * @see 
org.xwiki.plugin.invitationmanager.api.InvitationManager#inviteUser(String, 
String, boolean, List, String, Map, XWikiContext)
+     * 
+     * @see 
org.xwiki.plugin.invitationmanager.api.InvitationManager#inviteUser(String, 
String,
+     *      boolean, List, String, Map, XWikiContext)
      */
-    public boolean inviteUser(String wikiNameOrMailAddress, String space, 
boolean open, List roles,
-                           String templateMail, Map map, XWikiContext context) 
throws InvitationManagerException {
+    public boolean inviteUser(String wikiNameOrMailAddress, String space, 
boolean open,
+        List roles, String templateMail, Map map, XWikiContext context)
+        throws InvitationManagerException
+    {
         String invitee;
         String registeredUser = null;
         try {
@@ -867,9 +878,14 @@
             }
 
             // send a notification mail
+            if (templateMail == null) {
+                templateMail =
+                    getDefaultTemplateMailDocumentName(space, "Invitation",
+                        JoinRequestAction.SEND, context);
+            }
             sendMail(JoinRequestAction.SEND, invitation, templateMail, 
context);
 
-            // save invitation after 
+            // save invitation after
             invitation.saveWithProgrammingRights();
             return true;
         } catch (XWikiException e) {
@@ -986,31 +1002,46 @@
 
     /**
      * [EMAIL PROTECTED]
-     *
+     * 
      * @see InvitationManager#rejectMembership(String, String, XWikiContext)
      */
-    public void rejectMembership(String space, String userName, XWikiContext 
context) throws InvitationManagerException {
+    public void rejectMembership(String space, String userName, XWikiContext 
context)
+        throws InvitationManagerException
+    {
         String templateMail =
-                getDefaultTemplateMailDocumentName(space, "MembershipRequest",
-                        JoinRequestAction.REJECT, context);
+            getDefaultTemplateMailDocumentName(space, "Request", 
JoinRequestAction.REJECT,
+                context);
         rejectMembership(space, userName, templateMail, context);
     }
 
     /**
      * [EMAIL PROTECTED]
-     *
+     * 
      * @see InvitationManager#requestMembership(String, String, List, Map, 
XWikiContext)
      */
     public void requestMembership(String space, String message, List roles, 
Map map,
-                                  XWikiContext context) throws 
InvitationManagerException {
+        XWikiContext context) throws InvitationManagerException
+    {
         try {
             MembershipRequest request =
-                    createMembershipRequest(context.getUser(), space, context);
+                createMembershipRequest(context.getUser(), space, context);
             request.setMap(map);
             request.setRequestDate(new Date());
             request.setRoles(roles);
             request.setStatus(JoinRequestStatus.SENT);
             request.setText(message);
+            // e-mail notification is sent to user's e-mail address informing 
them of their "Pending
+            // approval" status
+            String requestSentMailTemplate =
+                getDefaultTemplateMailDocumentName(space, "Request", 
JoinRequestAction.CREATE,
+                    context);
+            sendMail(JoinRequestAction.CREATE, request, 
requestSentMailTemplate, context);
+            // send "Membership Request awaiting approval" notification via 
e-mail to the space
+            // administrator(s)
+            String requestPendingMailTemplate =
+                getDefaultTemplateMailDocumentName(space, "Request", 
JoinRequestAction.SEND,
+                    context);
+            sendMail(JoinRequestAction.SEND, request, 
requestPendingMailTemplate, context);
             request.saveWithProgrammingRights();
         } catch (XWikiException e) {
             throw new InvitationManagerException(e);
@@ -1019,7 +1050,7 @@
 
     /**
      * [EMAIL PROTECTED]
-     *
+     * 
      * @see InvitationManager#requestMembership(String, String, List, 
XWikiContext)
      */
     public void requestMembership(String space, String message, List roles, 
XWikiContext context) throws InvitationManagerException {
@@ -1228,76 +1259,95 @@
      * Wrapper method for sending a mail using the mail sender plug-in
      */
     private void sendMail(String action, JoinRequest request, String 
templateDocFullName,
-                          XWikiContext context) throws XWikiException
+        XWikiContext context) throws XWikiException
     {
         VelocityContext vContext = new VelocityContext();
         String spaceName = request.getSpace();
         SpaceManager spaceManager = 
SpaceManagers.findSpaceManagerForSpace(spaceName, context);
         Space space = spaceManager.getSpace(spaceName, context);
         vContext.put(SPACE_VELOCITY_KEY, space);
-        String fromUser = null, toUser = null;
+        String fromUser = context.getWiki().getXWikiPreference("admin_email", 
context);
+        String[] toUsers = new String[0];
         if (request instanceof Invitation) {
             Invitation invitation = (Invitation) request;
             vContext.put(INVITATION_VELOCITY_KEY, invitation);
             if (JoinRequestAction.SEND.equals(action)) {
                 // invitation notification mail
-                fromUser = invitation.getInviter();
-                toUser = invitation.getInvitee();
+                toUsers = new String[] {invitation.getInvitee()};
             } else {
                 // accept or reject invitation mail
-                fromUser = invitation.getInvitee();
-                toUser = invitation.getInviter();
+                toUsers = new String[] {invitation.getInviter()};
             }
         } else if (request instanceof MembershipRequest) {
             MembershipRequest membershipRequest = (MembershipRequest) request;
             vContext.put(MEMBERSHIP_REQUEST_VELOCITY_KEY, membershipRequest);
             if (JoinRequestAction.SEND.equals(action)) {
-                // membership request notification mail
-                fromUser = membershipRequest.getRequester();
-                toUser = membershipRequest.getResponder();
+                // notify the space administrators of a new membership request 
pending for approval
+                toUsers = (String[]) spaceManager.getAdmins(spaceName, 
context).toArray();
             } else {
-                // accept or reject membership request mail
-                fromUser = membershipRequest.getResponder();
-                toUser = membershipRequest.getRequester();
+                // create, accept or reject membership request mail
+                toUsers = new String[] {membershipRequest.getRequester()};
             }
         }
 
-        // TODO: replace by admin email.. we cannot send invitation from a 
different domain..
-        if (!isEmailAddress(fromUser)) {
-            fromUser = getEmailAddress(fromUser, context);
+        if (fromUser == null) {
+            throw new 
InvitationManagerException(InvitationManagerException.MODULE_PLUGIN_INVITATIONMANAGER,
+                
InvitationManagerException.ERROR_INVITATION_SENDER_EMAIL_INVALID,
+                "Sender email is invalid");
         }
 
-        if (fromUser==null) {
-            throw new 
InvitationManagerException(InvitationManagerException.MODULE_PLUGIN_INVITATIONMANAGER,
 InvitationManagerException.ERROR_INVITATION_SENDER_EMAIL_INVALID,
-                        "Sender email is invalid");
+        boolean toUsersValid = toUsers.length > 0;
+        for (int i = 0; i < toUsers.length && toUsersValid; i++) {
+            if (!isEmailAddress(toUsers[i])) {
+                toUsers[i] = getEmailAddress(toUsers[i], context);
+            }
+            if (toUsers[i] == null) {
+                toUsersValid = false;
+            }
         }
 
-        if (!isEmailAddress(toUser)) {
-            toUser = getEmailAddress(toUser, context);
+        if (!toUsersValid) {
+            throw new 
InvitationManagerException(InvitationManagerException.MODULE_PLUGIN_INVITATIONMANAGER,
+                
InvitationManagerException.ERROR_INVITATION_TARGET_EMAIL_INVALID,
+                "Target email is invalid");
         }
+        String strToUsers = join(toUsers, ",");
 
-        if (toUser==null) {
-            throw new 
InvitationManagerException(InvitationManagerException.MODULE_PLUGIN_INVITATIONMANAGER,
 InvitationManagerException.ERROR_INVITATION_TARGET_EMAIL_INVALID,
-                        "Target email is invalid");
-        }
-
         MailSenderPlugin mailSender = getMailSenderPlugin(context);
         XWikiDocument mailDoc = 
context.getWiki().getDocument(templateDocFullName, context);
         XWikiDocument translatedMailDoc = 
mailDoc.getTranslatedDocument(context);
-        mailSender.prepareVelocityContext(fromUser, toUser, "", vContext, 
context);
+        mailSender.prepareVelocityContext(fromUser, strToUsers, "", vContext, 
context);
         vContext.put("xwiki", new XWiki(context.getWiki(), context));
-        String mailSubject = 
XWikiVelocityRenderer.evaluate(translatedMailDoc.getTitle(), 
templateDocFullName, vContext);
-        String mailContent = 
XWikiVelocityRenderer.evaluate(translatedMailDoc.getContent(), 
templateDocFullName, vContext);
+        String mailSubject =
+            XWikiVelocityRenderer.evaluate(translatedMailDoc.getTitle(), 
templateDocFullName,
+                vContext);
+        String mailContent =
+            XWikiVelocityRenderer.evaluate(translatedMailDoc.getContent(), 
templateDocFullName,
+                vContext);
 
-        Mail mail = new Mail(fromUser, toUser, null, null, mailSubject, 
mailContent, null);
+        Mail mail = new Mail(fromUser, strToUsers, null, null, mailSubject, 
mailContent, null);
 
         try {
             mailSender.sendMail(mail, context);
         } catch (Exception e) {
-            throw new 
InvitationManagerException(InvitationManagerException.MODULE_PLUGIN_INVITATIONMANAGER,
 InvitationManagerException.ERROR_INVITATION_SENDING_EMAIL_FAILED,
-                    "Sending notification email failed", e);
+            throw new 
InvitationManagerException(InvitationManagerException.MODULE_PLUGIN_INVITATIONMANAGER,
+                
InvitationManagerException.ERROR_INVITATION_SENDING_EMAIL_FAILED,
+                "Sending notification email failed",
+                e);
         }
     }
+    
+    private static final String join(String[] array, String separator)
+    {
+        StringBuffer result = new StringBuffer("");
+        if (array.length > 0) {
+            result.append(array[0]);
+        }
+        for (int i = 1; i < array.length; i++) {
+            result.append("," + array[i]);
+        }
+        return result.toString();
+    }
 
     private MailSenderPlugin getMailSenderPlugin(XWikiContext context) throws 
InvitationManagerException {
         MailSenderPlugin mailSender =
@@ -1345,7 +1395,7 @@
                     "Curriki ID is invalid", e);
         }
     }
-
+    
     /**
      * Helper method for testing if a given string is an email address.
      */
@@ -1388,20 +1438,45 @@
     }
 
     // copy & paste from XWikiAuthServiceImpl#findUser(String, XWikiContext)
-    private String findUser(String username, XWikiContext context) throws 
InvitationManagerException
+    private String findUser(String username, XWikiContext context)
+        throws InvitationManagerException
     {
         try {
-            String user;
-
             // First let's look in the cache
             if (context.getWiki().exists("XWiki." + username, context))
                 return "XWiki." + username;
             else
                 return null;
         } catch (Exception e) {
-            throw new 
InvitationManagerException(InvitationManagerException.MODULE_PLUGIN_INVITATIONMANAGER,
 InvitationManagerException.ERROR_INVITATION_ERROR_FINDING_USER,
-                    "Error finding user " + username, e);
+            throw new 
InvitationManagerException(InvitationManagerException.MODULE_PLUGIN_INVITATIONMANAGER,
+                InvitationManagerException.ERROR_INVITATION_ERROR_FINDING_USER,
+                "Error finding user " + username,
+                e);
         }
 
     }
+    
+    /**
+     * Creates and saves a user profile associated with the given space and 
the user who made the
+     * membership request
+     */
+    private void createSpaceUserProfile(String spaceName, MembershipRequest 
request,
+        XWikiContext context) throws XWikiException
+    {
+        SpaceManager spaceManager = 
SpaceManagers.findSpaceManagerForSpace(spaceName, context);
+        SpaceUserProfile profile =
+            new SpaceUserProfileImpl(request.getRequester(), spaceName, 
spaceManager, context);
+        
profile.setAllowNotifications("true".equals(request.getMap().get("allowNotifications")));
+        
profile.setAllowNotificationsFromSelf("true".equals(request.getMap().get(
+            "allowNotificationsFromSelf")));
+        String profileText = (String) request.getMap().get("profile");
+        if (profileText == null) {
+            profileText = request.getText();
+        }
+        if (profileText == null) {
+            profileText = "";
+        }
+        profile.setProfile(profileText);
+        profile.saveWithProgrammingRights();
+    }
 }

_______________________________________________
notifications mailing list
notifications@xwiki.org
http://lists.xwiki.org/mailman/listinfo/notifications

Reply via email to