Author: ludovic
Date: 2007-12-27 00:35:22 +0100 (Thu, 27 Dec 2007)
New Revision: 6464

Modified:
   
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/api/Invitation.java
   
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/api/InvitationManager.java
   
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/api/JoinRequest.java
   
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/api/JoinRequestStatus.java
   
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/impl/InvitationImpl.java
   
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/JoinRequestImpl.java
   
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/impl/MembershipRequestImpl.java
   
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/plugin/InvitationManagerPlugin.java
   
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/plugin/InvitationManagerPluginApi.java
   
xwiki-products/curriki/trunk/plugins/invitationmanager/src/test/java/org/xwiki/plugin/invitationmanager/impl/JoinRequestTest.java
Log:
CURRIKI-1179 Added class creation on plugin init, Fix storage definitions, More 
debugging

Modified: 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/api/Invitation.java
===================================================================
--- 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/api/Invitation.java
 2007-12-26 15:53:05 UTC (rev 6463)
+++ 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/api/Invitation.java
 2007-12-26 23:35:22 UTC (rev 6464)
@@ -25,10 +25,6 @@
  */
 public interface Invitation extends JoinRequest
 {
-    /**
-     * Returns true is this invitation is new
-     */
-    boolean isNew();
 
     /**
      * @return The one who is invited to join the space

Modified: 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/api/InvitationManager.java
===================================================================
--- 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/api/InvitationManager.java
  2007-12-26 15:53:05 UTC (rev 6463)
+++ 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/api/InvitationManager.java
  2007-12-26 23:35:22 UTC (rev 6464)
@@ -23,6 +23,7 @@
 import java.util.Map;
 
 import com.xpn.xwiki.XWikiContext;
+import com.xpn.xwiki.XWikiException;
 
 /**
  * Manages invitations and membership requests
@@ -196,7 +197,7 @@
      * context user is not an administrator of the space, does nothing and log 
a warning in the
      * context
      */
-    void acceptMembership(String space, String userName, XWikiContext context) 
throws InvitationManagerException;
+    boolean acceptMembership(String space, String userName, XWikiContext 
context) throws InvitationManagerException;
 
     /**
      * Accept a pending membership using a custom email template which can 
differ from the
@@ -205,7 +206,7 @@
      * 
      * @see #acceptMembership(String, String, XWikiContext)
      */
-    void acceptMembership(String space, String userName, String templateMail, 
XWikiContext context) throws InvitationManagerException;
+    boolean acceptMembership(String space, String userName, String 
templateMail, XWikiContext context) throws InvitationManagerException;
 
     /**
      * Reject a pending membership request. Update the membership request 
object, and notify the
@@ -468,4 +469,9 @@
      * @see #getInvitations(String, int, XWikiContext)
      */
     List getInvitations(int status, int start, int count, XWikiContext 
context);
+
+    /**
+     * Creates the classes used by the invitation manager when necessary
+     */
+    void initClasses(XWikiContext context) throws XWikiException;
 }

Modified: 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/api/JoinRequest.java
===================================================================
--- 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/api/JoinRequest.java
        2007-12-26 15:53:05 UTC (rev 6463)
+++ 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/api/JoinRequest.java
        2007-12-26 23:35:22 UTC (rev 6464)
@@ -31,6 +31,11 @@
 public interface JoinRequest
 {
     /**
+     * Returns true is this invitation is new
+     */
+    boolean isNew();
+    
+    /**
      * @return A map with additional parameters for this request
      */
     Map getMap();
@@ -86,12 +91,12 @@
      * @return The status of this request
      * @see JoinRequestStatus
      */
-    int getStatus();
+    String getStatus();
 
     /**
      * @see #getStatus()
      */
-    void setStatus(int status);
+    void setStatus(String status);
 
     /**
      * @return An explanatory text for this request

Modified: 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/api/JoinRequestStatus.java
===================================================================
--- 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/api/JoinRequestStatus.java
  2007-12-26 15:53:05 UTC (rev 6463)
+++ 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/api/JoinRequestStatus.java
  2007-12-26 23:35:22 UTC (rev 6464)
@@ -30,30 +30,30 @@
      * The request status is not specified. It can have any of the allowed 
values. This can be
      * useful when retrieving stored requests.
      */
-    int ANY = 0;
+    String ANY = "0";
 
     /**
      * The request has been created but has not yet been sent
      */
-    int CREATED = 1;
+    String CREATED = "1";
 
     /**
      * The request has been sent but no answer has been received so far
      */
-    int SENT = 2;
+    String SENT = "2";
 
     /**
      * The request has been accepted
      */
-    int ACCEPTED = 3;
+    String ACCEPTED = "3";
 
     /**
      * The request has been refused
      */
-    int REFUSED = 4;
+    String REFUSED = "4";
 
     /**
      * The request has been canceled
      */
-    int CANCELLED = 5;
+    String CANCELLED = "5";
 }

Modified: 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/impl/InvitationImpl.java
===================================================================
--- 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/impl/InvitationImpl.java
    2007-12-26 15:53:05 UTC (rev 6463)
+++ 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/impl/InvitationImpl.java
    2007-12-26 23:35:22 UTC (rev 6464)
@@ -82,7 +82,7 @@
     }
 
     protected String getClassName() {
-       return manager.getJoinRequestClassName("Invitation");
+       return manager.getInvitationClassName();
     }
     
     /**

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
     2007-12-26 15:53:05 UTC (rev 6463)
+++ 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/impl/InvitationManagerImpl.java
     2007-12-26 23:35:22 UTC (rev 6464)
@@ -19,26 +19,25 @@
  */
 package org.xwiki.plugin.invitationmanager.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
-import org.apache.commons.lang.RandomStringUtils;
-import org.apache.velocity.VelocityContext;
 import org.xwiki.plugin.invitationmanager.api.*;
-import org.xwiki.plugin.spacemanager.api.Space;
+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.apache.commons.lang.RandomStringUtils;
+import org.apache.velocity.VelocityContext;
 
 import com.xpn.xwiki.XWikiContext;
 import com.xpn.xwiki.XWikiException;
+import com.xpn.xwiki.render.XWikiVelocityRenderer;
+import com.xpn.xwiki.plugin.mailsender.Mail;
+import com.xpn.xwiki.plugin.mailsender.MailSenderPlugin;
 import com.xpn.xwiki.api.Document;
-import com.xpn.xwiki.render.XWikiVelocityRenderer;
+import com.xpn.xwiki.api.XWiki;
+import com.xpn.xwiki.objects.classes.BaseClass;
 import com.xpn.xwiki.doc.XWikiDocument;
-import com.xpn.xwiki.plugin.mailsender.MailSenderPlugin;
-import com.xpn.xwiki.plugin.mailsender.Mail;
 
 /**
  * The default implementation for [EMAIL PROTECTED] InvitationManager}
@@ -60,6 +59,11 @@
 
     public static final String MEMBERSHIP_REQUEST_VELOCITY_KEY = "request";
 
+    public static final String INVITATION_CLASS_NAME =  
"XWiki.InvitationClass";
+
+    public static final String MEMBERSHIP_REQUEST_CLASS_NAME =  
"XWiki.MembershipRequestClass";
+
+
     /**
      * [EMAIL PROTECTED]
      *
@@ -69,7 +73,7 @@
         try {
             Invitation invitation = getInvitation(space, 
encodeEmailAddress(email), context);
             if (code.equals(invitation.getCode())
-                    && invitation.getStatus() == JoinRequestStatus.SENT) {
+                    && invitation.getStatus().equals(JoinRequestStatus.SENT)) {
                 if (!invitation.isOpen()) {
                     invitation.setStatus(JoinRequestStatus.ACCEPTED);
                     invitation.setResponseDate(new Date());
@@ -99,7 +103,7 @@
         try {
             Invitation invitation = getInvitation(space, 
encodeEmailAddress(email), context);
             if (code.equals(invitation.getCode())
-                    && invitation.getStatus() == JoinRequestStatus.SENT) {
+                    && invitation.getStatus().equals(JoinRequestStatus.SENT)) {
                 return true;
             } else {
                 return false;
@@ -117,8 +121,13 @@
     public boolean acceptInvitation(String space, XWikiContext context) throws 
InvitationManagerException {
         try {
             Invitation invitation = getInvitation(space, context.getUser(), 
context);
-            int status = invitation.getStatus();
-            if (status == JoinRequestStatus.SENT || status == 
JoinRequestStatus.REFUSED) {
+
+            // if the invitation does not exist we need to return false
+            if (invitation.isNew())
+                return false;
+            
+            String status = invitation.getStatus();
+            if (status.equals(JoinRequestStatus.SENT) || 
status.equals(JoinRequestStatus.REFUSED)) {
                 // update the invitation object
                 invitation.setResponseDate(new Date());
                 invitation.setStatus(JoinRequestStatus.ACCEPTED);
@@ -156,12 +165,17 @@
      *
      * @see InvitationManager#acceptMembership(String, String, String, 
XWikiContext)
      */
-    public void acceptMembership(String space, String userName, String 
templateMail,
+    public boolean acceptMembership(String space, String userName, String 
templateMail,
                                  XWikiContext context) throws 
InvitationManagerException {
         try {
             MembershipRequest request = getMembershipRequest(space, userName, 
context);
-            int status = request.getStatus();
-            if (status == JoinRequestStatus.SENT || status == 
JoinRequestStatus.REFUSED) {
+
+            // if the invitation does not exist we need to return false
+            if (request.isNew())
+                return false;
+
+            String status = request.getStatus();
+            if (status.equals(JoinRequestStatus.SENT) || 
status.equals(JoinRequestStatus.REFUSED)) {
                 // update the membership request object
                 request.setResponseDate(new Date());
                 request.setResponder(context.getUser());
@@ -174,6 +188,9 @@
 
                 // save after adding user and sending email
                 request.saveWithProgrammingRights();
+                return true;
+            } else {
+                return false;
             }
         } catch (XWikiException e) {
             throw new InvitationManagerException(e);
@@ -185,11 +202,11 @@
      *
      * @see InvitationManager#acceptMembership(String, String, XWikiContext)
      */
-    public void 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);
-        acceptMembership(space, userName, templateMail, context);
+        return acceptMembership(space, userName, templateMail, context);
     }
 
     /**
@@ -200,7 +217,7 @@
     public void cancelInvitation(String user, String space, XWikiContext 
context) throws InvitationManagerException {
         try {
             Invitation invitation = getInvitation(space, user, context);
-            if (invitation.getStatus() == JoinRequestStatus.SENT) {
+            if (invitation.getStatus().equals(JoinRequestStatus.SENT)) {
                 invitation.setStatus(JoinRequestStatus.CANCELLED);
                 invitation.saveWithProgrammingRights();
             }
@@ -217,7 +234,7 @@
     public void cancelMembershipRequest(String space, XWikiContext context) 
throws InvitationManagerException {
         try {
             MembershipRequest request = getMembershipRequest(space, 
context.getUser(), context);
-            if (request.getStatus() == JoinRequestStatus.SENT) {
+            if (request.getStatus().equals(JoinRequestStatus.SENT)) {
                 request.setStatus(JoinRequestStatus.CANCELLED);
                 request.saveWithProgrammingRights();
             }
@@ -235,14 +252,91 @@
     {
         try {
             Invitation prototype = createInvitation(context.getUser(), null, 
context);
-            prototype.setStatus(status);
+            prototype.setStatus("" + status);
             return getInvitations(prototype, start, count, context);
         } catch (XWikiException e) {
             return Collections.EMPTY_LIST;
         }
     }
 
+    public void initClasses(XWikiContext context) throws XWikiException {
+        getInvitationClass(context);
+        getMembershipRequestClass(context);
+    }
+
     /**
+     *
+     * @param context Xwiki context
+     * @return Returns the Invitation Class as defined by the extension
+     * @throws XWikiException
+     */
+    protected BaseClass getInvitationClass(XWikiContext context) throws 
XWikiException {
+        String className = getInvitationClassName();
+        String classContent = "1 XWiki Invitation Class";
+
+        return getJoinRequestClass(className, classContent, context);
+    }
+
+       /**
+     *
+     * @param context Xwiki context
+     * @return Returns the Membership Class as defined by the extension
+     * @throws XWikiException
+     */
+    protected BaseClass getMembershipRequestClass(XWikiContext context) throws 
XWikiException {
+        String className = getMembershipRequestClassName();
+        String classContent = "1 XWiki Membership Request Class";
+
+        return getJoinRequestClass(className, classContent, context);
+    }
+
+    private BaseClass getJoinRequestClass(String className, String 
classContent, XWikiContext context) throws XWikiException {
+        XWikiDocument doc;
+        com.xpn.xwiki.XWiki xwiki = context.getWiki();
+        boolean needsUpdate = false;
+
+        try {
+            doc = xwiki.getDocument(className, context);
+        } catch (Exception e) {
+            doc = new XWikiDocument();
+            doc.setFullName(className);
+            needsUpdate = true;
+        }
+
+        BaseClass bclass = doc.getxWikiClass();
+        bclass.setName(className);
+
+        needsUpdate |= 
bclass.addDateField(JoinRequestImpl.JoinRequestFields.REQUEST_DATE, "Request 
Date");
+        needsUpdate |= 
bclass.addDateField(JoinRequestImpl.JoinRequestFields.RESPONSE_DATE, "Response 
Date");
+        needsUpdate |= 
bclass.addTextAreaField(JoinRequestImpl.JoinRequestFields.TEXT, "Text", 80, 10);
+        needsUpdate |= 
bclass.addTextAreaField(JoinRequestImpl.JoinRequestFields.MAP, "Map", 80, 10);
+        needsUpdate |= 
bclass.addTextField(JoinRequestImpl.JoinRequestFields.SPACE, "Space", 32);
+        needsUpdate |= 
bclass.addStaticListField(JoinRequestImpl.JoinRequestFields.STATUS, "Status", 
1, false, "0=none|1=created|2=sent|3=accepted|4=refused|5=cancelled","select");
+        needsUpdate |= 
bclass.addDBListField(JoinRequestImpl.JoinRequestFields.ROLES, "Roles", 5, 
true, "");
+
+        if (className.equals(getInvitationClassName())) {
+            needsUpdate |= 
bclass.addTextField(InvitationImpl.InvitationFields.INVITEE, "Invitee", 40);
+            needsUpdate |= 
bclass.addTextField(InvitationImpl.InvitationFields.INVITEE, "Inviter", 40);
+            needsUpdate |= 
bclass.addBooleanField(InvitationImpl.InvitationFields.OPEN, "Open", "yesno");
+        }
+        else if (className.equals(getMembershipRequestClassName())) {
+            needsUpdate |= 
bclass.addTextField(MembershipRequestImpl.MembershipRequestFields.REQUESTER, 
"Requester", 40);
+            needsUpdate |= 
bclass.addTextField(MembershipRequestImpl.MembershipRequestFields.RESPONDER, 
"Responder", 40);
+        }
+
+        String content = doc.getContent();
+        if ((content == null) || (content.equals(""))) {
+            needsUpdate = true;
+            doc.setContent(classContent);
+        }
+
+        if (needsUpdate)
+            xwiki.saveDocument(doc, context);
+        return bclass;
+    }
+
+
+    /**
      * [EMAIL PROTECTED]
      *
      * @see InvitationManager#getInvitations(int, int, XWikiContext)
@@ -270,7 +364,7 @@
     public List getInvitations(Invitation prototype, int start, int count, 
XWikiContext context)
     {
         try {
-            String className = getJoinRequestClassName("Invitation");
+            String className = getInvitationClassName();
             StringBuffer fromClause =
                     new StringBuffer("from XWikiDocument as doc, BaseObject as 
obj");
             StringBuffer whereClause =
@@ -301,11 +395,11 @@
                         + "'");
             }
 
-            int status = prototype.getStatus();
-            if (status != JoinRequestStatus.ANY) {
-                fromClause.append(", IntegerProperty as status");
+            String status = prototype.getStatus();
+            if (!status.equals(JoinRequestStatus.ANY)) {
+                fromClause.append(", StringProperty as status");
                 whereClause.append(" and obj.id=status.id.id and 
status.id.name='"
-                        + InvitationImpl.InvitationFields.STATUS + "' and 
status.value=" + status);
+                        + InvitationImpl.InvitationFields.STATUS + "' and 
status.value='" + status + "'");
             }
 
             List roles = prototype.getRoles();
@@ -413,7 +507,7 @@
                 roles.add(role);
                 prototype.setRoles(roles);
             }
-            prototype.setStatus(status);
+            prototype.setStatus("" + status);
             return getInvitations(prototype, start, count, context);
         } catch (XWikiException e) {
             e.printStackTrace();
@@ -449,7 +543,7 @@
     public List getInvitations(String space, String role, int start, int count,
                                XWikiContext context)
     {
-        return getInvitations(space, JoinRequestStatus.ANY, role, start, 
count, context);
+        return getInvitations(space, 0, role, start, count, context);
     }
 
     /**
@@ -492,7 +586,7 @@
         try {
             MembershipRequest prototype =
                     createMembershipRequest(context.getUser(), null, context);
-            prototype.setStatus(status);
+            prototype.setStatus("" + status);
             return getMembershipRequests(prototype, start, count, context);
         } catch (XWikiException e) {
             e.printStackTrace();
@@ -529,7 +623,7 @@
                                       XWikiContext context)
     {
         try {
-            String className = getJoinRequestClassName("MembershipRequest");
+            String className = getMembershipRequestClassName();
             StringBuffer fromClause =
                     new StringBuffer("from XWikiDocument as doc, BaseObject as 
obj");
             StringBuffer whereClause =
@@ -559,12 +653,12 @@
                         + "' and requester.value='" + requester + "'");
             }
 
-            int status = prototype.getStatus();
-            if (status != JoinRequestStatus.ANY) {
-                fromClause.append(", IntegerProperty as status");
+            String status = prototype.getStatus();
+            if (!status.equals(JoinRequestStatus.ANY)) {
+                fromClause.append(", StringProperty as status");
                 whereClause.append(" and obj.id=status.id.id and 
status.id.name='"
                         + MembershipRequestImpl.MembershipRequestFields.STATUS
-                        + "' and status.value=" + status);
+                        + "' and status.value='" + status + "'");
             }
 
             List roles = prototype.getRoles();
@@ -633,11 +727,13 @@
                                       int count, XWikiContext context)
     {
         try {
-            List roles = new ArrayList();
-            roles.add(role);
             MembershipRequest prototype = createMembershipRequest(null, space, 
context);
-            prototype.setStatus(status);
-            prototype.setRoles(roles);
+            if ((role!=null)&&!"".equals(role)) {
+                List roles = new ArrayList();
+                roles.add(role);
+                prototype.setRoles(roles);
+            }
+            prototype.setStatus("" + status);
             return getMembershipRequests(prototype, start, count, context);
         } catch (XWikiException e) {
             e.printStackTrace();
@@ -673,7 +769,7 @@
     public List getMembershipRequests(String space, String role, int start, 
int count,
                                       XWikiContext context)
     {
-        return getMembershipRequests(space, JoinRequestStatus.ANY, role, 
start, count, context);
+        return getMembershipRequests(space, 0, role, start, count, context);
     }
 
     /**
@@ -706,6 +802,24 @@
         return getMembershipRequests(0, 0, context);
     }
 
+    private void addToAlreadyMember(String user, XWikiContext context) {
+        List list = (List) context.get("im_alreadymember");
+        if (list==null) {
+            list = new ArrayList();
+            context.put("im_alreadymember", list);
+        }
+        list.add(user);
+    }
+
+    private void addToAlreadyInvited(String user, XWikiContext context) {
+         List list = (List) context.get("im_alreadyinvited");
+         if (list==null) {
+             list = new ArrayList();
+             context.put("im_alreadyinvited", list);
+         }
+         list.add(user);
+     }
+
     /**
      * [EMAIL PROTECTED]
      *
@@ -722,12 +836,18 @@
                 invitee = encodeEmailAddress(wikiNameOrMailAddress);
             } else {
                 invitee = registeredUser;
+                if (isMember(space, invitee, context)) {
+                    addToAlreadyMember(invitee, context);
+                    return false;
+                }
             }
             // create the invitation object
             Invitation invitation = createInvitation(invitee, space, context);
 
-            if (!invitation.isNew())
+            if (!invitation.isNew()) {
+                addToAlreadyInvited(invitee, context);
                 return false;
+            }
 
             invitation.setInviter(context.getUser());
             invitation.setMap(map);
@@ -738,8 +858,11 @@
             if (registeredUser == null) {
                 invitation.setCode(generateInvitationCode());
                 // make the e-mail address available in the invitee field
-                invitation.setInvitee(wikiNameOrMailAddress);
+                invitation.setInvitee(invitee);
+            } else {
+                invitation.setInvitee(registeredUser);
             }
+
             // send a notification mail
             sendMail(JoinRequestAction.SEND, invitation, templateMail, 
context);
 
@@ -804,7 +927,7 @@
         try {
             Invitation invitation = getInvitation(space, 
encodeEmailAddress(email), context);
             if (code.equals(invitation.getCode())
-                    && invitation.getStatus() == JoinRequestStatus.SENT) {
+                    && invitation.getStatus().equals(JoinRequestStatus.SENT)) {
                 if (!invitation.isOpen()) {
                     invitation.setStatus(JoinRequestStatus.REFUSED);
                     invitation.setResponseDate(new Date());
@@ -827,7 +950,7 @@
     public void rejectInvitation(String space, XWikiContext context) throws 
InvitationManagerException {
         try {
             Invitation invitation = getInvitation(space, context.getUser(), 
context);
-            if (invitation.getStatus() == JoinRequestStatus.SENT) {
+            if (invitation.getStatus().equals(JoinRequestStatus.SENT)) {
                 invitation.setStatus(JoinRequestStatus.REFUSED);
                 invitation.setResponseDate(new Date());
                 invitation.saveWithProgrammingRights();
@@ -846,7 +969,7 @@
                                  XWikiContext context) throws 
InvitationManagerException {
         try {
             MembershipRequest request = getMembershipRequest(space, userName, 
context);
-            if (request.getStatus() == JoinRequestStatus.SENT) {
+            if (request.getStatus().equals(JoinRequestStatus.SENT)) {
                 request.setStatus(JoinRequestStatus.REFUSED);
                 request.setResponseDate(new Date());
                 request.setResponder(context.getUser());
@@ -964,23 +1087,41 @@
         if (user == null) {
             user = System.currentTimeMillis() + "";
         }
+
+        user = clearUserName(user);
+
         return getInvitationSpaceName(space, context) + "." + type
-                + "_" + user.replaceAll("\\.", "_").replaceAll("\\@", "_at_");
+                + "_" + user;
     }
 
+    private String clearUserName(String user) {
+        if (isEmailAddress(user))
+         return user.replaceAll("\\.", "_").replaceAll("\\@", "_at_");
+        else
+         return user.replaceAll("XWiki\\.", "");                
+    }
+
     private String getInvitationSpaceName(String space, XWikiContext context) {
         return space + getDefaultInvitationsSpaceSuffix(context);
     }
 
     /**
-     * @return the xwiki class associated with the given join request type
+     * @return the xwiki class associated with invitations
      */
-    public String getJoinRequestClassName(String type)
+    public String getInvitationClassName()
     {
-        return "XWiki." + type + "Class";
+        return INVITATION_CLASS_NAME;
     }
 
     /**
+     * @return the xwiki class associated with invitations
+     */
+    public String getMembershipRequestClassName()
+    {
+        return MEMBERSHIP_REQUEST_CLASS_NAME;
+    }
+
+    /**
      * @return the stored invitation uniquely identified by the given space 
and invitee
      */
     private Invitation getInvitation(String space, String invitee, 
XWikiContext context)
@@ -1003,7 +1144,7 @@
      * Creates a custom invitation for the currently logged-in user, from the 
given one, and then
      * saves it.
      */
-    private void customizeInvitation(Invitation invitation, int status, 
XWikiContext context)
+    private void customizeInvitation(Invitation invitation, String status, 
XWikiContext context)
             throws XWikiException
     {
         Invitation customInvitation =
@@ -1071,6 +1212,16 @@
     }
 
     /**
+     * Wrapper method for adding a user to a space and to the given roles 
using the space manager
+     */
+    private boolean isMember(String space, String user, XWikiContext context)
+            throws XWikiException
+    {
+        SpaceManager spaceManager = 
SpaceManagers.findSpaceManagerForSpace(space, context);
+        return spaceManager.isMember(space, user, context);
+    }
+
+    /**
      * Wrapper method for sending a mail using the mail sender plug-in
      */
     private void sendMail(String action, JoinRequest request, String 
templateDocFullName,
@@ -1131,6 +1282,7 @@
         XWikiDocument mailDoc = 
context.getWiki().getDocument(templateDocFullName, context);
         XWikiDocument translatedMailDoc = 
mailDoc.getTranslatedDocument(context);
         mailSender.prepareVelocityContext(fromUser, toUser, "", 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);
 
@@ -1239,26 +1391,10 @@
             String user;
 
             // First let's look in the cache
-            if (context.getWiki().exists("XWiki." + username, context)) {
-                user = "XWiki." + username;
-            } else {
-                // Note: The result of this search depends on the Database. If 
the database is
-                // case-insensitive (like MySQL) then users will be able to 
log in by entering their
-                // username in any case. For case-sensitive databases (like 
HSQLDB) they'll need to
-                // enter it exactly as they've created it.
-                String sql = "select distinct doc.fullName from XWikiDocument 
as doc";
-                Object[][] whereParameters =
-                        new Object[][] { {"doc.web", "XWiki"}, {"doc.name", 
username}};
-
-                List list = context.getWiki().search(sql, whereParameters, 
context);
-                if (list.size() == 0) {
-                    user = null;
-                } else {
-                    user = (String) list.get(0);
-                }
-            }
-
-            return user;
+            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);

Modified: 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/impl/JoinRequestImpl.java
===================================================================
--- 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/impl/JoinRequestImpl.java
   2007-12-26 15:53:05 UTC (rev 6463)
+++ 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/impl/JoinRequestImpl.java
   2007-12-26 23:35:22 UTC (rev 6464)
@@ -130,9 +130,10 @@
      * 
      * @see JoinRequest#getStatus()
      */
-    public int getStatus()
+    public String getStatus()
     {
-        return 
doc.getObject(getClassName()).getIntValue(JoinRequestFields.STATUS);
+        String status = 
doc.getObject(getClassName()).getStringValue(JoinRequestFields.STATUS);
+        return (status==null) ? "0" : status;
     }
 
     /**
@@ -209,9 +210,9 @@
      * 
      * @see JoinRequest#setStatus(int)
      */
-    public void setStatus(int status)
+    public void setStatus(String status)
     {
-        
getDoc().getObject(getClassName()).setIntValue(JoinRequestFields.STATUS, 
status);
+        
getDoc().getObject(getClassName()).setStringValue(JoinRequestFields.STATUS, 
status);
     }
 
     /**

Modified: 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/impl/MembershipRequestImpl.java
===================================================================
--- 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/impl/MembershipRequestImpl.java
     2007-12-26 15:53:05 UTC (rev 6463)
+++ 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/impl/MembershipRequestImpl.java
     2007-12-26 23:35:22 UTC (rev 6464)
@@ -35,6 +35,7 @@
  */
 public class MembershipRequestImpl extends JoinRequestImpl implements 
MembershipRequest
 {
+    
     public static interface MembershipRequestFields extends JoinRequestFields
     {
         String REQUESTER = "requester";
@@ -61,8 +62,6 @@
             // we created it if it does not yet exist, otherwise throw 
exception
             if (isNew()) {
                 createRequestDoc(requester, space, text, roles, map);
-            } else {
-                throw new XWikiException(-1, -1, "MembershipRequest already 
exists");
             }
         }
     }
@@ -82,7 +81,7 @@
 
 
     protected String getClassName() {
-       return manager.getJoinRequestClassName("Invitation");
+       return manager.getMembershipRequestClassName();
     }
     
     /**

Modified: 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/plugin/InvitationManagerPlugin.java
===================================================================
--- 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/plugin/InvitationManagerPlugin.java
 2007-12-26 15:53:05 UTC (rev 6463)
+++ 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/plugin/InvitationManagerPlugin.java
 2007-12-26 23:35:22 UTC (rev 6464)
@@ -78,4 +78,21 @@
     {
         this.invitationManager = invitationManager;
     }
+
+
+    public void init(XWikiContext context) {
+        super.init(context);
+        try {
+            invitationManager.initClasses(context);
+        } catch (Exception e) {
+        }
+    }
+
+    public void virtualInit(XWikiContext context) {
+        super.virtualInit(context);
+        try {
+            invitationManager.initClasses(context);
+        } catch (Exception e) {
+        }
+    }
 }

Modified: 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/plugin/InvitationManagerPluginApi.java
===================================================================
--- 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/plugin/InvitationManagerPluginApi.java
      2007-12-26 15:53:05 UTC (rev 6463)
+++ 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/main/java/org/xwiki/plugin/invitationmanager/plugin/InvitationManagerPluginApi.java
      2007-12-26 23:35:22 UTC (rev 6464)
@@ -249,10 +249,11 @@
      * default template email for membership acceptance. If the context user 
is not an administrator
      * of the space, does nothing and log a warning in the context
      */
-    public void acceptMembership(String space, String userName) throws 
InvitationManagerException {
+    public boolean acceptMembership(String space, String userName) throws 
InvitationManagerException {
         if (hasProgrammingRights()) {
-            getInvitationManager().acceptMembership(space, userName, context);
+            return getInvitationManager().acceptMembership(space, userName, 
context);
         }
+        return false;
     }
 
     /**
@@ -262,10 +263,11 @@
      * 
      * @see #acceptMembership(String, String)
      */
-    public void acceptMembership(String space, String userName, String 
templateMail) throws InvitationManagerException {
+    public boolean acceptMembership(String space, String userName, String 
templateMail) throws InvitationManagerException {
         if (hasProgrammingRights()) {
             getInvitationManager().acceptMembership(space, userName, 
templateMail, context);
         }
+        return false;
     }
 
     /**

Modified: 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/test/java/org/xwiki/plugin/invitationmanager/impl/JoinRequestTest.java
===================================================================
--- 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/test/java/org/xwiki/plugin/invitationmanager/impl/JoinRequestTest.java
   2007-12-26 15:53:05 UTC (rev 6463)
+++ 
xwiki-products/curriki/trunk/plugins/invitationmanager/src/test/java/org/xwiki/plugin/invitationmanager/impl/JoinRequestTest.java
   2007-12-26 23:35:22 UTC (rev 6464)
@@ -161,7 +161,7 @@
      */
     public void testStatus()
     {
-        int status = JoinRequestStatus.SENT;
+        String status = JoinRequestStatus.SENT;
         joinRequest.setStatus(status);
         assertEquals(status, joinRequest.getStatus());
     }

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

Reply via email to