Invitation service

Java Script API for invitations on Site object.
    Implementation of REST API for Site / Invitations. 
    Rename of old invite workflow to invitation-nominated and renaming of properties for consistency.   Old workflow is due for deprecation.
    Rework to Nominated workflow to unscramble user creation.    
    Start Workflow UI bean now knows to avoid workflows managed by the InvitationService.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@13523 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Mark Rogers
2009-03-10 14:08:22 +00:00
parent bc91efa1e0
commit fb3d5445b8
24 changed files with 935 additions and 158 deletions

View File

@@ -379,6 +379,7 @@
<prop key="redeploy">false</prop> <prop key="redeploy">false</prop>
</props> </props>
<!-- Invitation service workflow definition -->
<props> <props>
<prop key="engineId">jbpm</prop> <prop key="engineId">jbpm</prop>
<prop key="location">alfresco/workflow/invitation-nominated_processdefinition.xml</prop> <prop key="location">alfresco/workflow/invitation-nominated_processdefinition.xml</prop>
@@ -386,6 +387,7 @@
<prop key="redeploy">false</prop> <prop key="redeploy">false</prop>
</props> </props>
<!-- Invitation service workflow definition -->
<props> <props>
<prop key="engineId">jbpm</prop> <prop key="engineId">jbpm</prop>
<prop key="location">alfresco/workflow/invitation-moderated_processdefinition.xml</prop> <prop key="location">alfresco/workflow/invitation-moderated_processdefinition.xml</prop>
@@ -393,7 +395,6 @@
<prop key="redeploy">false</prop> <prop key="redeploy">false</prop>
</props> </props>
</list> </list>
</property> </property>
<property name="models"> <property name="models">

View File

@@ -1,7 +1,9 @@
#
# Invitation service # Invitation service
#
invitation.error.not_found "Invitation not found invitationId: {0}" invitation.error.noworkflow "Invitation workflow not found, workflow name : {0}"
invitation.error.not_found "Invitation not found, invitationId: {0}"
invitation.error.invalid_inviteId_format "Invitation Id not valid format, valid formats are <engine>$<id> : {0}"
invitation.cancel.not_site_manager "Current user, {0}, cannot cancel invitation: {1} because they are not a Site Manager for site: {2} invitation.cancel.not_site_manager "Current user, {0}, cannot cancel invitation: {1} because they are not a Site Manager for site: {2}
invitation.invite.unable_generate_id "Unable to generate a user name for invitee, which doesn't already belong to someone else firstName:{0} lastName:{1} email:{2}" invitation.invite.unable_generate_id "Unable to generate a user name for invitee, which doesn't already belong to someone else firstName:{0} lastName:{1} email:{2}"

View File

@@ -4,9 +4,23 @@
# Moderated Invitation # Moderated Invitation
# #
wf_invitation-moderated.workflow.title=Invitation (Moderated) wf_invitation-moderated.workflow.title=Invitation - Moderated
wf_invitation-moderated.workflow.description=Moderated invitation to a resource such as a web site. wf_invitation-moderated.workflow.description=Moderated invitation to a resource such as a web site.
wf_invitation-moderated-workflow-model.type.wf_moderatedInvitationSubmitTask.title=Start Invitation
wf_invitation-moderated-workflow-model.type.wf_moderatedInvitationSubmitTask=Start a moderated invitation
wf_invitation-moderated-model.type.approveInvitationTask.title=Approve Invitation wf_invitation-moderated-model.type.approveInvitationTask.title=Approve Invitation
wf_invitation-moderated-model.type.approveInvitationTask.description=Approve Invitation wf_invitation-moderated-model.type.approveInvitationTask.description=Approve Invitation
wf_invitation-moderated.node.start.title=Start
wf_invitation-moderated.node.start.description=Start moderated invitation
wf_invitation-moderated.node.review.title=Review Invitation
wf_invitation-moderated.node.review.description=Review moderated invitation
wf_invitation-moderated.node.review.transition.reject.title=Reject
wf_invitation-moderated.node.review.transition.reject.description=Reject
wf_invitation-moderated.node.review.transition.approve.title=Approve
wf_invitation-moderated.node.review.transition.approve.description=Approve
wf_invitation-moderated.node.review.transition.cancel.title=Cancel
wf_invitation-moderated.node.review.transition.cancel.description=Cancel

View File

@@ -1,40 +1,41 @@
# Display labels for out-of-the-box Site-oriented Workflows # Display labels for out-of-the-box Site-oriented Workflows
# #
# Invite Workflow # Invitation Nominated Workflow
# #
wf_invite.workflow.title=Invitation (Nominated) wf_invitation-nominated.workflow.title=Invitation - Nominated
wf_invite.workflow.description=Invitation to a Share Site, nominated by a site manager wf_invitation-nominated.workflow.description=Invitation to a Share Site, nominated by a site manager
# Invite Task Definitions # Invite Task Definitions
wf_invite-workflow-model.type.wf_inviteToSiteTask.title=Start Invite wf_invitation-nominated-workflow-model.type.wf_inviteToSiteTask.title=Start task
wf_invite-workflow-model.type.wf_inviteToSiteTask.description=Start an invite to a Site wf_invitation-nominated-workflow-model.type.wf_inviteToSiteTask.description=Start a nominated invitation
wf_invite-workflow-model.type.wf_invitePendingTask.title=Site Invite wf_invitation-nominated-workflow-model.type.wf_invitePendingTask.title=Pending invitation
wf_invite-workflow-model.type.wf_invitePendingTask.description=Invite to a Site wf_invitation-nominated-workflow-model.type.wf_invitePendingTask.description=Pending invitation
wf_invite-workflow-model.type.wf_rejectInviteTask.title=Rejected wf_invitation-nominated-workflow-model.type.wf_rejectInviteTask.title=Rejected
wf_invite-workflow-model.type.wf_rejectInviteTask.description=Rejected wf_invitation-nominated-workflow-model.type.wf_rejectInviteTask.description=Rejected
wf_invite-workflow-model.type.wf_acceptInviteTask.title=Accepted wf_invitation-nominated-workflow-model.type.wf_acceptInviteTask.title=Accepted
wf_invite-workflow-model.type.wf_acceptInviteTask.description=Accepted wf_invitation-nominated-workflow-model.type.wf_acceptInviteTask.description=Accepted
# Invite Process Definitions # Invite Process Definitions
wf_invitation-nominated.node.start.title=Start
wf_invite.node.start.title=Start wf_invitation-nominated.node.start.description=Start
wf_invite.node.start.description=Start wf_invitation-nominated.node.invitePending.title=Invite Pending
wf_invite.node.invitePending.title=Invite Pending wf_invitation-nominated.node.invitePending.description=Invite Pending
wf_invite.node.invitePending.description=Invite Pending wf_invitation-nominated.node.invitePending.transition.reject.title=Reject
wf_invite.node.invitePending.transition.reject.title=Reject wf_invitation-nominated.node.invitePending.transition.reject.description=Reject
wf_invite.node.invitePending.transition.reject.description=Reject wf_invitation-nominated.node.invitePending.transition.accept.title=Accept
wf_invite.node.invitePending.transition.accept.title=Accept wf_invitation-nominated.node.invitePending.transition.accept.description=Accept
wf_invite.node.invitePending.transition.accept.description=Accept wf_invitation-nominated.node.invitePending.transition.cancel.title=Cancel
wf_invite.node.inviteRejected.title=Rejected wf_invitation-nominated.node.invitePending.transition.cancel.description=Cancel
wf_invite.node.inviteRejected.description=Rejected wf_invitation-nominated.node.inviteRejected.title=Rejected
wf_invite.task.wf_rejectInviteTask.title=Rejected wf_invitation-nominated.node.inviteRejected.description=Rejected
wf_invite.task.wf_rejectInviteTask.description=Rejected wf_invitation-nominated.task.wf_rejectInviteTask.title=Rejected
wf_invite.node.inviteAccepted.title=Accepted wf_invitation-nominated.task.wf_rejectInviteTask.description=Rejected
wf_invite.node.inviteAccepted.description=Accepted wf_invitation-nominated.node.inviteAccepted.title=Accepted
wf_invite.task.wf_acceptInviteTask.title=Accepted wf_invitation-nominated.node.inviteAccepted.description=Accepted
wf_invite.task.wf_acceptInviteTask.description=Accepted wf_invitation-nominated.task.wf_acceptInviteTask.title=Accepted
wf_invite.node.end.title=End wf_invitation-nominated.task.wf_acceptInviteTask.description=Accepted
wf_invite.node.end.description=End wf_invitation-nominated.node.end.title=End
wf_invitation-nominated.node.end.description=End

View File

@@ -34,6 +34,9 @@
<property name="wf:inviteeUserName"> <property name="wf:inviteeUserName">
<type>d:text</type> <type>d:text</type>
</property> </property>
<property name="wf:inviteeEmail">
<type>d:text</type>
</property>
<property name="wf:inviteeFirstName"> <property name="wf:inviteeFirstName">
<type>d:text</type> <type>d:text</type>
</property> </property>
@@ -49,7 +52,7 @@
<property name="wf:resourceName"> <property name="wf:resourceName">
<type>d:text</type> <type>d:text</type>
</property> </property>
<property name="wf:inviteeSiteRole"> <property name="wf:inviteeRole">
<type>d:text</type> <type>d:text</type>
</property> </property>
</properties> </properties>

View File

@@ -2,7 +2,8 @@
<!-- Nominated invitation --> <!-- Nominated invitation -->
<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="wf:invite"> <process-definition xmlns="urn:jbpm.org:jpdl-3.1"
name="wf:invitation-nominated">
<swimlane name="initiator"/> <swimlane name="initiator"/>
@@ -40,7 +41,7 @@
args["inviteePersonRef"] = inviteePerson.nodeRef.toString(); args["inviteePersonRef"] = inviteePerson.nodeRef.toString();
args["inviterPersonRef"] = inviterPerson.nodeRef.toString(); args["inviterPersonRef"] = inviterPerson.nodeRef.toString();
args["siteName"] = siteName; args["siteName"] = siteName;
args["inviteeSiteRole"] = wf_inviteeSiteRole; args["inviteeSiteRole"] = wf_inviteeRole;
args["inviteeUserName"] = wf_inviteeUserName; args["inviteeUserName"] = wf_inviteeUserName;
args["inviteeGenPassword"] = wf_inviteeGenPassword; args["inviteeGenPassword"] = wf_inviteeGenPassword;
args["acceptLink"] = acceptLink; args["acceptLink"] = acceptLink;

View File

@@ -5,10 +5,8 @@ import org.alfresco.service.cmr.invitation.Invitation.ResourceType;
/* package scope */ abstract class InvitationImpl /* package scope */ abstract class InvitationImpl
{ {
/**
* Who is this invitation for
*/
private String inviteeUserName;
/** /**
* Unique reference for this invitation * Unique reference for this invitation
@@ -48,14 +46,6 @@ import org.alfresco.service.cmr.invitation.Invitation.ResourceType;
this.resourceType = resourceType; this.resourceType = resourceType;
} }
public void setInviteeUserName(String inviteeUserName) {
this.inviteeUserName = inviteeUserName;
}
public String getInviteeUserName() {
return inviteeUserName;
}
public void setInviteId(String inviteId) { public void setInviteId(String inviteId) {
this.inviteId = inviteId; this.inviteId = inviteId;
} }

View File

@@ -26,6 +26,7 @@ package org.alfresco.repo.invitation;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -48,6 +49,7 @@ import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.cmr.security.PersonService; import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.cmr.site.SiteService; import org.alfresco.service.cmr.site.SiteService;
import org.alfresco.service.cmr.workflow.WorkflowDefinition; import org.alfresco.service.cmr.workflow.WorkflowDefinition;
import org.alfresco.service.cmr.workflow.WorkflowException;
import org.alfresco.service.cmr.workflow.WorkflowInstance; import org.alfresco.service.cmr.workflow.WorkflowInstance;
import org.alfresco.service.cmr.workflow.WorkflowPath; import org.alfresco.service.cmr.workflow.WorkflowPath;
import org.alfresco.service.cmr.workflow.WorkflowService; import org.alfresco.service.cmr.workflow.WorkflowService;
@@ -85,7 +87,65 @@ public class InvitationServiceImpl implements InvitationService
// maximum number of tries to generate a invitee user name which // maximum number of tries to generate a invitee user name which
// does not already belong to an existing person // does not already belong to an existing person
public static final int MAX_NUM_INVITEE_USER_NAME_GEN_TRIES = 10; public static final int MAX_NUM_INVITEE_USER_NAME_GEN_TRIES = 10;
/**
* Get the names of the workflows which are managed by the invitation service
* @return
*/
public List<String> getInvitationServiceWorkflowNames()
{
List<String> ret = new ArrayList<String>(2);
ret.add(WorkflowModelNominatedInvitation.WORKFLOW_DEFINITION_NAME);
ret.add(WorkflowModelModeratedInvitation.WORKFLOW_DEFINITION_NAME);
return ret;
}
/**
* Start the invitation process for a NominatedInvitation
*
* @param inviteeUserName Alfresco user name of the invitee
* @param Invitation
* @param ResourceType resourceType
* @param resourceName
* @param inviteeRole
* @param serverPath
* @param acceptUrl
* @param rejectUrl
*
* @return the nominated invitation which will contain the invitationId and
* ticket which will uniqely identify this invitation for the rest
* of the workflow.
*
* @throws InvitationException
* @throws InvitationExceptionUserError
* @throws InvitationExceptionForbidden
*/
public NominatedInvitation inviteNominated(String inviteeUserName,
Invitation.ResourceType resourceType,
String resourceName,
String inviteeRole,
String serverPath,
String acceptUrl,
String rejectUrl)
{
// inviteeUserName was specified
NodeRef person = this.personService.getPerson(inviteeUserName);
Serializable firstNameVal = this.getNodeService().getProperty(person, ContentModel.PROP_FIRSTNAME);
Serializable lastNameVal = this.getNodeService().getProperty(person, ContentModel.PROP_LASTNAME);
Serializable emailVal = this.getNodeService().getProperty(person, ContentModel.PROP_EMAIL);
String firstName = DefaultTypeConverter.INSTANCE.convert(
String.class, firstNameVal);
String lastName = DefaultTypeConverter.INSTANCE.convert(
String.class, lastNameVal);
String email = DefaultTypeConverter.INSTANCE.convert(
String.class, emailVal);
return inviteNominated(firstName, lastName, email,
inviteeUserName, resourceType, resourceName, inviteeRole,
serverPath, acceptUrl, rejectUrl);
}
/** /**
* Start the invitation process for a NominatedInvitation * Start the invitation process for a NominatedInvitation
* *
@@ -111,11 +171,40 @@ public class InvitationServiceImpl implements InvitationService
* @throws InvitationExceptionUserError * @throws InvitationExceptionUserError
* @throws InvitationExceptionForbidden * @throws InvitationExceptionForbidden
*/ */
public NominatedInvitation inviteNominated(String inviteeFirstName, public NominatedInvitation inviteNominated(
String inviteeLastName, String inviteeEmail, String inviteeFirstName,
String inviteeUserName, Invitation.ResourceType resourceType, String inviteeLastName,
String resourceName, String inviteeRole, String serverPath, String inviteeEmail,
String acceptUrl, String rejectUrl) Invitation.ResourceType resourceType,
String resourceName,
String inviteeRole,
String serverPath,
String acceptUrl,
String rejectUrl)
{
return inviteNominated(inviteeFirstName,
inviteeLastName,
inviteeEmail,
null,
resourceType,
resourceName,
inviteeRole,
serverPath,
acceptUrl,
rejectUrl);
}
// Temporary method
private NominatedInvitation inviteNominated(String inviteeFirstName,
String inviteeLastName,
String inviteeEmail,
String inviteeUserName,
Invitation.ResourceType resourceType,
String resourceName,
String inviteeRole,
String serverPath,
String acceptUrl,
String rejectUrl)
{ {
// Validate the request // Validate the request
@@ -123,7 +212,7 @@ public class InvitationServiceImpl implements InvitationService
if (resourceType == Invitation.ResourceType.WEB_SITE) if (resourceType == Invitation.ResourceType.WEB_SITE)
{ {
return startInvite(inviteeFirstName, inviteeLastName, inviteeEmail, return startNominatedInvite(inviteeFirstName, inviteeLastName, inviteeEmail,
inviteeUserName, resourceType, resourceName, inviteeRole, inviteeUserName, resourceType, resourceName, inviteeRole,
serverPath, acceptUrl, rejectUrl); serverPath, acceptUrl, rejectUrl);
} }
@@ -151,7 +240,7 @@ public class InvitationServiceImpl implements InvitationService
{ {
if (resourceType == Invitation.ResourceType.WEB_SITE) if (resourceType == Invitation.ResourceType.WEB_SITE)
{ {
return startInvite(inviteeComments, inviteeUserName, resourceType, return startModeratedInvite(inviteeComments, inviteeUserName, resourceType,
resourceName, inviteeRole); resourceName, inviteeRole);
} }
throw new InvitationException("unknown resource type"); throw new InvitationException("unknown resource type");
@@ -335,10 +424,23 @@ public class InvitationServiceImpl implements InvitationService
* *
* @throws InvitationExceptionNotFound * @throws InvitationExceptionNotFound
* the invitation does not exist. * the invitation does not exist.
* @throws InvitationExceptionUserError
* @return the invitation. * @return the invitation.
*/ */
public Invitation getInvitation(String invitationId) { public Invitation getInvitation(String invitationId) {
WorkflowInstance wi = workflowService.getWorkflowById(invitationId);
validateInvitationId(invitationId);
WorkflowInstance wi = null;
try
{
wi = workflowService.getWorkflowById(invitationId);
}
catch (WorkflowException we)
{
// Do nothing
}
if (wi == null) { if (wi == null) {
Object objs[] = { invitationId }; Object objs[] = { invitationId };
throw new InvitationExceptionNotFound("invitation.error.not_found", throw new InvitationExceptionNotFound("invitation.error.not_found",
@@ -363,11 +465,14 @@ public class InvitationServiceImpl implements InvitationService
// should also be 0 or 1 // should also be 0 or 1
if (inviteStartTasks.size() < 1) { if (inviteStartTasks.size() < 1) {
return null; Object objs[] = { invitationId };
throw new InvitationExceptionNotFound("invitation.error.not_found",
objs);
} else { } else {
WorkflowTask task = inviteStartTasks.get(0); WorkflowTask task = inviteStartTasks.get(0);
NominatedInvitationImpl result = new NominatedInvitationImpl( NominatedInvitationImpl result = new NominatedInvitationImpl(
task.properties); task.properties);
result.setSentInviteDate(task.path.instance.startDate);
result.setInviteId(invitationId); result.setInviteId(invitationId);
return result; return result;
} }
@@ -836,7 +941,7 @@ public class InvitationServiceImpl implements InvitationService
* @param inviteeRole * @param inviteeRole
* @return the new moderated invitation * @return the new moderated invitation
*/ */
private ModeratedInvitation startInvite(String inviteeComments, private ModeratedInvitation startModeratedInvite(String inviteeComments,
String inviteeUserName, Invitation.ResourceType resourceType, String inviteeUserName, Invitation.ResourceType resourceType,
String resourceName, String inviteeRole) String resourceName, String inviteeRole)
{ {
@@ -878,10 +983,10 @@ public class InvitationServiceImpl implements InvitationService
WorkflowModelModeratedInvitation.WF_PROP_INVITEE_USER_NAME, WorkflowModelModeratedInvitation.WF_PROP_INVITEE_USER_NAME,
inviteeUserName); inviteeUserName);
workflowProps.put( workflowProps.put(
WorkflowModelNominatedInvitation.WF_PROP_RESOURCE_NAME, WorkflowModelModeratedInvitation.WF_PROP_RESOURCE_NAME,
resourceName); resourceName);
workflowProps.put( workflowProps.put(
WorkflowModelNominatedInvitation.WF_PROP_RESOURCE_TYPE, WorkflowModelModeratedInvitation.WF_PROP_RESOURCE_TYPE,
resourceType.toString()); resourceType.toString());
// get the moderated workflow // get the moderated workflow
@@ -945,11 +1050,17 @@ public class InvitationServiceImpl implements InvitationService
* externally accessible server address of server hosting invite * externally accessible server address of server hosting invite
* web scripts * web scripts
*/ */
private NominatedInvitation startInvite(String inviteeFirstName, private NominatedInvitation startNominatedInvite(
String inviteeLastName, String inviteeEmail, String inviteeFirstName,
String inviteeUserName, Invitation.ResourceType resourceType, String inviteeLastName,
String siteShortName, String inviteeSiteRole, String serverPath, String inviteeEmail,
String acceptUrl, String rejectUrl) { String inviteeUserName,
Invitation.ResourceType resourceType,
String siteShortName,
String inviteeSiteRole,
String serverPath,
String acceptUrl,
String rejectUrl) {
// get the inviter user name (the name of user web script is executed // get the inviter user name (the name of user web script is executed
// under) // under)
@@ -1003,7 +1114,8 @@ public class InvitationServiceImpl implements InvitationService
// else there are no existing people who have the given invitee // else there are no existing people who have the given invitee
// email address // email address
// so create invitee person // so create invitee person
else { else
{
inviteeUserName = createInviteePerson(inviteeFirstName, inviteeUserName = createInviteePerson(inviteeFirstName,
inviteeLastName, inviteeEmail); inviteeLastName, inviteeEmail);
@@ -1013,9 +1125,25 @@ public class InvitationServiceImpl implements InvitationService
+ inviteeUserName); + inviteeUserName);
} }
} }
else
{
// inviteeUserName was specified
NodeRef person = this.personService.getPerson(inviteeUserName);
Serializable firstNameVal = this.getNodeService().getProperty(person, ContentModel.PROP_FIRSTNAME);
Serializable lastNameVal = this.getNodeService().getProperty(person, ContentModel.PROP_LASTNAME);
Serializable emailVal = this.getNodeService().getProperty(person, ContentModel.PROP_EMAIL);
firstNameVal = DefaultTypeConverter.INSTANCE.convert(
String.class, firstNameVal);
lastNameVal = DefaultTypeConverter.INSTANCE.convert(
String.class, lastNameVal);
emailVal = DefaultTypeConverter.INSTANCE.convert(
String.class, emailVal);
}
// throw web script exception if person is already a member of the given /**
// site * throw exception if person is already a member of the given site
*/
if (this.siteService.isMember(siteShortName, inviteeUserName)) { if (this.siteService.isMember(siteShortName, inviteeUserName)) {
if (logger.isDebugEnabled()) if (logger.isDebugEnabled())
logger logger
@@ -1070,6 +1198,9 @@ public class InvitationServiceImpl implements InvitationService
workflowProps.put( workflowProps.put(
WorkflowModelNominatedInvitation.WF_PROP_INVITEE_USER_NAME, WorkflowModelNominatedInvitation.WF_PROP_INVITEE_USER_NAME,
inviteeUserName); inviteeUserName);
workflowProps.put(
WorkflowModelNominatedInvitation.WF_PROP_INVITEE_EMAIL,
inviteeEmail);
workflowProps.put(WorkflowModel.ASSOC_ASSIGNEE, inviteeNodeRef); workflowProps.put(WorkflowModel.ASSOC_ASSIGNEE, inviteeNodeRef);
workflowProps.put( workflowProps.put(
WorkflowModelNominatedInvitation.WF_PROP_INVITEE_FIRSTNAME, WorkflowModelNominatedInvitation.WF_PROP_INVITEE_FIRSTNAME,
@@ -1087,7 +1218,7 @@ public class InvitationServiceImpl implements InvitationService
WorkflowModelNominatedInvitation.WF_PROP_RESOURCE_TYPE, WorkflowModelNominatedInvitation.WF_PROP_RESOURCE_TYPE,
resourceType.toString()); resourceType.toString());
workflowProps.put( workflowProps.put(
WorkflowModelNominatedInvitation.WF_PROP_INVITEE_SITE_ROLE, WorkflowModelNominatedInvitation.WF_PROP_INVITEE_ROLE,
inviteeSiteRole); inviteeSiteRole);
workflowProps.put(WorkflowModelNominatedInvitation.WF_PROP_SERVER_PATH, workflowProps.put(WorkflowModelNominatedInvitation.WF_PROP_SERVER_PATH,
serverPath); serverPath);
@@ -1173,6 +1304,7 @@ public class InvitationServiceImpl implements InvitationService
workflowProps); workflowProps);
result.setTicket(inviteTicket); result.setTicket(inviteTicket);
result.setInviteId(workflowId); result.setInviteId(workflowId);
result.setSentInviteDate(new Date());
return result; return result;
} }
@@ -1195,4 +1327,19 @@ public class InvitationServiceImpl implements InvitationService
"invitation.invite.not_site_manager", objs); "invitation.invite.not_site_manager", objs);
} }
} }
/**
* Validator for invitationId
* @param invitationId
*/
private void validateInvitationId(String invitationId)
{
final String ID_SEPERATOR_REGEX = "\\$";
String[] parts = invitationId.split(ID_SEPERATOR_REGEX);
if (parts.length != 2)
{
Object objs[] = { invitationId };
throw new InvitationExceptionUserError("invitation.error.invalid_inviteId_format", objs);
}
}
} }

View File

@@ -24,13 +24,12 @@
*/ */
package org.alfresco.repo.invitation; package org.alfresco.repo.invitation;
import java.util.Date;
import java.util.List; import java.util.List;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.repo.security.authentication.AuthenticationComponent; import org.alfresco.repo.security.authentication.AuthenticationComponent;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.authentication.MutableAuthenticationDao; import org.alfresco.repo.security.authentication.MutableAuthenticationDao;
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
import org.alfresco.repo.site.SiteModel; import org.alfresco.repo.site.SiteModel;
import org.alfresco.service.cmr.invitation.InvitationExceptionUserError; import org.alfresco.service.cmr.invitation.InvitationExceptionUserError;
import org.alfresco.service.cmr.invitation.InvitationSearchCriteria; import org.alfresco.service.cmr.invitation.InvitationSearchCriteria;
@@ -39,21 +38,13 @@ import org.alfresco.service.cmr.invitation.Invitation;
import org.alfresco.service.cmr.invitation.ModeratedInvitation; import org.alfresco.service.cmr.invitation.ModeratedInvitation;
import org.alfresco.service.cmr.invitation.NominatedInvitation; import org.alfresco.service.cmr.invitation.NominatedInvitation;
import org.alfresco.service.cmr.invitation.Invitation.ResourceType; import org.alfresco.service.cmr.invitation.Invitation.ResourceType;
import org.alfresco.service.cmr.model.FileFolderService;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.ScriptService;
import org.alfresco.service.cmr.security.AuthorityService;
import org.alfresco.service.cmr.security.AuthorityType;
import org.alfresco.service.cmr.security.PersonService; import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.cmr.site.SiteInfo; import org.alfresco.service.cmr.site.SiteInfo;
import org.alfresco.service.cmr.site.SiteService; import org.alfresco.service.cmr.site.SiteService;
import org.alfresco.service.cmr.site.SiteVisibility; import org.alfresco.service.cmr.site.SiteVisibility;
import org.alfresco.service.cmr.tagging.TaggingService;
import org.alfresco.util.BaseAlfrescoSpringTest; import org.alfresco.util.BaseAlfrescoSpringTest;
import org.alfresco.util.PropertyMap; import org.alfresco.util.PropertyMap;
import junit.framework.TestCase;
/** /**
* *
* Unit tests of Invitation Service * Unit tests of Invitation Service
@@ -79,6 +70,10 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
public static String USER_ONE = "InvitationServiceAlice"; public static String USER_ONE = "InvitationServiceAlice";
public static String USER_TWO = "InvitationServiceBob"; public static String USER_TWO = "InvitationServiceBob";
public static String USER_EVE = "InvitationServiceEve"; public static String USER_EVE = "InvitationServiceEve";
public static String USER_ONE_FIRSTNAME = "One" ;
public static String USER_ONE_LASTNAME = "Test";
public static String USER_ONE_EMAIL = USER_ONE + "@alfrescotesting.com";
/** /**
* Called during the transaction setup * Called during the transaction setup
@@ -92,10 +87,10 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
this.authenticationComponent = (AuthenticationComponent)this.applicationContext.getBean("authenticationComponent"); this.authenticationComponent = (AuthenticationComponent)this.applicationContext.getBean("authenticationComponent");
this.mutableAuthenticationDao = (MutableAuthenticationDao)this.applicationContext.getBean("authenticationDao"); this.mutableAuthenticationDao = (MutableAuthenticationDao)this.applicationContext.getBean("authenticationDao");
createPerson(USER_MANAGER, ""); createPerson(USER_MANAGER, USER_MANAGER + "@alfrescotesting.com", PERSON_FIRSTNAME, PERSON_LASTNAME);
createPerson(USER_ONE, ""); createPerson(USER_ONE, USER_ONE_EMAIL,USER_ONE_FIRSTNAME, USER_ONE_LASTNAME);
createPerson(USER_TWO, ""); createPerson(USER_TWO, USER_TWO + "@alfrescotesting.com", PERSON_FIRSTNAME, PERSON_LASTNAME);
createPerson(USER_EVE, ""); createPerson(USER_EVE, USER_EVE + "@alfrescotesting.com", PERSON_FIRSTNAME, PERSON_LASTNAME);
this.authenticationComponent.setCurrentUser(USER_MANAGER); this.authenticationComponent.setCurrentUser(USER_MANAGER);
@@ -158,7 +153,120 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
} }
/** /**
* Create a Nominated Invitation * Test nominated user - new user
*
* @throws Exception
*/
public void testNominatedInvitationNewUser() throws Exception
{
Date startDate = new java.util.Date();
String inviteeFirstName = PERSON_FIRSTNAME;
String inviteeLastName = PERSON_LASTNAME;
String inviteeEmail = "123";
String inviteeUserName = null;
Invitation.ResourceType resourceType = Invitation.ResourceType.WEB_SITE;
String resourceName = SITE_SHORT_NAME_INVITE;
String inviteeRole = SiteModel.SITE_COLLABORATOR;
String serverPath = "wibble";
String acceptUrl = "froob";
String rejectUrl = "marshmallow";
this.authenticationComponent.setCurrentUser(USER_MANAGER);
NominatedInvitation nominatedInvitation = invitationService.inviteNominated(
inviteeFirstName,
inviteeLastName,
inviteeEmail,
resourceType,
resourceName,
inviteeRole,
serverPath,
acceptUrl,
rejectUrl) ;
assertNotNull("nominated invitation is null", nominatedInvitation);
String inviteId = nominatedInvitation.getInviteId();
assertEquals("first name wrong", inviteeFirstName, nominatedInvitation.getInviteeFirstName());
assertEquals("last name wrong", inviteeLastName, nominatedInvitation.getInviteeLastName());
assertEquals("email name wrong", inviteeEmail, nominatedInvitation.getInviteeEmail());
// Generated User Name should be returned
inviteeUserName = nominatedInvitation.getInviteeUserName();
assertNotNull("generated user name is null", inviteeUserName);
// sentInviteDate should be set to today
{
Date sentDate = nominatedInvitation.getSentInviteDate();
assertTrue("sentDate wrong - too early", sentDate.after(startDate));
assertTrue("sentDate wrong - too late", sentDate.before(new Date(new Date().getTime()+ 1)));
}
assertEquals("resource type name wrong", resourceType, nominatedInvitation.getResourceType());
assertEquals("resource name wrong", resourceName, nominatedInvitation.getResourceName());
assertEquals("role name wrong", inviteeRole, nominatedInvitation.getRoleName());
assertEquals("server path wrong", serverPath, nominatedInvitation.getServerPath());
assertEquals("accept URL wrong", acceptUrl, nominatedInvitation.getAcceptUrl());
assertEquals("reject URL wrong", rejectUrl, nominatedInvitation.getRejectUrl());
/**
* Now we have an invitation get it and check the details have been returned correctly.
*/
{
NominatedInvitation invitation = (NominatedInvitation)invitationService.getInvitation(inviteId);
assertNotNull("invitation is null", invitation);
assertEquals("invite id wrong", inviteId, invitation.getInviteId());
assertEquals("first name wrong", inviteeFirstName, invitation.getInviteeFirstName());
assertEquals("last name wrong", inviteeLastName, invitation.getInviteeLastName());
assertEquals("user name wrong", inviteeUserName, invitation.getInviteeUserName());
assertEquals("resource type name wrong", resourceType, invitation.getResourceType());
assertEquals("resource name wrong", resourceName, invitation.getResourceName());
assertEquals("role name wrong", inviteeRole, invitation.getRoleName());
assertEquals("server path wrong", serverPath, invitation.getServerPath());
assertEquals("accept URL wrong", acceptUrl, invitation.getAcceptUrl());
assertEquals("reject URL wrong", rejectUrl, invitation.getRejectUrl());
Date sentDate = invitation.getSentInviteDate();
// sentInviteDate should be set to today
assertTrue("sentDate wrong too early", sentDate.after(startDate));
assertTrue("sentDate wrong - too late", sentDate.before(new Date(new Date().getTime()+ 1)));
}
/**
* Search for the new invitation
*/
List<Invitation> invitations = invitationService.listPendingInvitationsForResource(resourceType, resourceName);
assertTrue("invitations is empty", !invitations.isEmpty());
NominatedInvitation firstInvite = (NominatedInvitation)invitations.get(0);
assertEquals("invite id wrong", inviteId, firstInvite.getInviteId());
assertEquals("first name wrong", inviteeFirstName, firstInvite.getInviteeFirstName());
assertEquals("last name wrong", inviteeLastName, firstInvite.getInviteeLastName());
assertEquals("user name wrong", inviteeUserName, firstInvite.getInviteeUserName());
/**
* Now accept the invitation
*/
NominatedInvitation acceptedInvitation = (NominatedInvitation)invitationService.accept(firstInvite.getInviteId(), firstInvite.getTicket());
assertEquals("invite id wrong", firstInvite.getInviteId(), acceptedInvitation.getInviteId());
assertEquals("first name wrong", inviteeFirstName, acceptedInvitation.getInviteeFirstName());
assertEquals("last name wrong", inviteeLastName, acceptedInvitation.getInviteeLastName());
assertEquals("user name wrong", inviteeUserName, acceptedInvitation.getInviteeUserName());
List<Invitation> it4 = invitationService.listPendingInvitationsForResource(resourceType, resourceName);
assertTrue("invitations is not empty", it4.isEmpty());
/**
* Now verify access control list
*/
String roleName = siteService.getMembersRole(resourceName, inviteeUserName);
assertEquals("role name wrong", roleName, inviteeRole);
siteService.removeMembership(resourceName, inviteeUserName);
}
/**
* Create a Nominated Invitation (for existing user, USER_ONE)
* read it. * read it.
* search for it * search for it
* cancel it * cancel it
@@ -171,12 +279,13 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
* read it. * read it.
* accept it * accept it
*/ */
public void testNominatedInvitation() throws Exception public void testNominatedInvitationExistingUser() throws Exception
{ {
String inviteeFirstName = PERSON_FIRSTNAME; String inviteeUserName = USER_ONE;
String inviteeLastName = PERSON_LASTNAME; String inviteeEmail = USER_ONE_EMAIL;
String inviteeEmail = "123"; String inviteeFirstName = USER_ONE_FIRSTNAME;
String inviteeUserName = "invitee@alfrescotesting.com"; String inviteeLastName = USER_ONE_LASTNAME;
Invitation.ResourceType resourceType = Invitation.ResourceType.WEB_SITE; Invitation.ResourceType resourceType = Invitation.ResourceType.WEB_SITE;
String resourceName = SITE_SHORT_NAME_INVITE; String resourceName = SITE_SHORT_NAME_INVITE;
String inviteeRole = SiteModel.SITE_COLLABORATOR; String inviteeRole = SiteModel.SITE_COLLABORATOR;
@@ -186,9 +295,7 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
this.authenticationComponent.setCurrentUser(USER_MANAGER); this.authenticationComponent.setCurrentUser(USER_MANAGER);
NominatedInvitation nominatedInvitation = invitationService.inviteNominated(inviteeFirstName, NominatedInvitation nominatedInvitation = invitationService.inviteNominated(
inviteeLastName,
inviteeEmail,
inviteeUserName, inviteeUserName,
resourceType, resourceType,
resourceName, resourceName,
@@ -199,8 +306,6 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
assertNotNull("nominated invitation is null", nominatedInvitation); assertNotNull("nominated invitation is null", nominatedInvitation);
String inviteId = nominatedInvitation.getInviteId(); String inviteId = nominatedInvitation.getInviteId();
assertEquals("first name wrong", inviteeFirstName, nominatedInvitation.getInviteeFirstName());
assertEquals("last name wrong", inviteeLastName, nominatedInvitation.getInviteeLastName());
assertEquals("user name wrong", inviteeUserName, nominatedInvitation.getInviteeUserName()); assertEquals("user name wrong", inviteeUserName, nominatedInvitation.getInviteeUserName());
assertEquals("resource type name wrong", resourceType, nominatedInvitation.getResourceType()); assertEquals("resource type name wrong", resourceType, nominatedInvitation.getResourceType());
assertEquals("resource name wrong", resourceName, nominatedInvitation.getResourceName()); assertEquals("resource name wrong", resourceName, nominatedInvitation.getResourceName());
@@ -209,6 +314,11 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
assertEquals("accept URL wrong", acceptUrl, nominatedInvitation.getAcceptUrl()); assertEquals("accept URL wrong", acceptUrl, nominatedInvitation.getAcceptUrl());
assertEquals("reject URL wrong", rejectUrl, nominatedInvitation.getRejectUrl()); assertEquals("reject URL wrong", rejectUrl, nominatedInvitation.getRejectUrl());
// These values should be read from the person record
assertEquals("first name wrong", inviteeFirstName, nominatedInvitation.getInviteeFirstName());
assertEquals("last name wrong", inviteeLastName, nominatedInvitation.getInviteeLastName());
assertEquals("email name wrong", inviteeEmail, nominatedInvitation.getInviteeEmail());
/** /**
* Now we have an invitation get it and check the details have been returned correctly. * Now we have an invitation get it and check the details have been returned correctly.
*/ */
@@ -216,9 +326,7 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
assertNotNull("invitation is null", invitation); assertNotNull("invitation is null", invitation);
assertEquals("invite id wrong", inviteId, invitation.getInviteId()); assertEquals("invite id wrong", inviteId, invitation.getInviteId());
assertEquals("first name wrong", inviteeFirstName, invitation.getInviteeFirstName()); assertEquals("user name wrong", inviteeUserName, nominatedInvitation.getInviteeUserName());
assertEquals("last name wrong", inviteeLastName, invitation.getInviteeLastName());
assertEquals("user name wrong", inviteeUserName, invitation.getInviteeUserName());
assertEquals("resource type name wrong", resourceType, invitation.getResourceType()); assertEquals("resource type name wrong", resourceType, invitation.getResourceType());
assertEquals("resource name wrong", resourceName, invitation.getResourceName()); assertEquals("resource name wrong", resourceName, invitation.getResourceName());
assertEquals("role name wrong", inviteeRole, invitation.getRoleName()); assertEquals("role name wrong", inviteeRole, invitation.getRoleName());
@@ -226,6 +334,11 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
assertEquals("accept URL wrong", acceptUrl, invitation.getAcceptUrl()); assertEquals("accept URL wrong", acceptUrl, invitation.getAcceptUrl());
assertEquals("reject URL wrong", rejectUrl, invitation.getRejectUrl()); assertEquals("reject URL wrong", rejectUrl, invitation.getRejectUrl());
// These values should have been read from the DB
assertEquals("first name wrong", inviteeFirstName, invitation.getInviteeFirstName());
assertEquals("last name wrong", inviteeLastName, invitation.getInviteeLastName());
assertEquals("email name wrong", inviteeEmail, invitation.getInviteeEmail());
/** /**
* Search for the new invitation * Search for the new invitation
*/ */
@@ -256,9 +369,7 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
/** /**
* Now invite and reject * Now invite and reject
*/ */
NominatedInvitation secondInvite = invitationService.inviteNominated(inviteeFirstName, NominatedInvitation secondInvite = invitationService.inviteNominated(
inviteeLastName,
inviteeEmail,
inviteeUserName, inviteeUserName,
resourceType, resourceType,
resourceName, resourceName,
@@ -269,8 +380,6 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
NominatedInvitation rejectedInvitation = (NominatedInvitation)invitationService.cancel(secondInvite.getInviteId()); NominatedInvitation rejectedInvitation = (NominatedInvitation)invitationService.cancel(secondInvite.getInviteId());
assertEquals("invite id wrong", secondInvite.getInviteId(), rejectedInvitation.getInviteId()); assertEquals("invite id wrong", secondInvite.getInviteId(), rejectedInvitation.getInviteId());
assertEquals("first name wrong", inviteeFirstName, rejectedInvitation.getInviteeFirstName());
assertEquals("last name wrong", inviteeLastName, rejectedInvitation.getInviteeLastName());
assertEquals("user name wrong", inviteeUserName, rejectedInvitation.getInviteeUserName()); assertEquals("user name wrong", inviteeUserName, rejectedInvitation.getInviteeUserName());
List<Invitation> it3 = invitationService.listPendingInvitationsForResource(resourceType, resourceName); List<Invitation> it3 = invitationService.listPendingInvitationsForResource(resourceType, resourceName);
@@ -279,9 +388,7 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
/** /**
* Now invite and accept * Now invite and accept
*/ */
NominatedInvitation thirdInvite = invitationService.inviteNominated(inviteeFirstName, NominatedInvitation thirdInvite = invitationService.inviteNominated(
inviteeLastName,
inviteeEmail,
inviteeUserName, inviteeUserName,
resourceType, resourceType,
resourceName, resourceName,
@@ -517,7 +624,7 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
*/ */
try try
{ {
invitationService.approve(invitationId, "No Way Hosea!"); invitationService.reject(invitationId, "No Way Hosea!");
assertTrue("excetion not thrown", false); assertTrue("excetion not thrown", false);
} }
@@ -532,7 +639,7 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
* Reject the invitation * Reject the invitation
*/ */
this.authenticationComponent.setCurrentUser(USER_MANAGER); this.authenticationComponent.setCurrentUser(USER_MANAGER);
invitationService.approve(invitationId, "Go away!"); invitationService.reject(invitationId, "Go away!");
/** /**
* Negative test * Negative test
@@ -584,9 +691,7 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
inviteeRole); inviteeRole);
String oneId = invitationOne.getInviteId(); String oneId = invitationOne.getInviteId();
NominatedInvitation invitationTwo = invitationService.inviteNominated(inviteeFirstName, NominatedInvitation invitationTwo = invitationService.inviteNominated(
inviteeLastName,
inviteeEmail,
USER_ONE, USER_ONE,
resourceType, resourceType,
SITE_SHORT_NAME_RED, SITE_SHORT_NAME_RED,
@@ -596,9 +701,7 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
rejectUrl) ; rejectUrl) ;
String twoId = invitationTwo.getInviteId(); String twoId = invitationTwo.getInviteId();
NominatedInvitation invitationThree = invitationService.inviteNominated(inviteeFirstName, NominatedInvitation invitationThree = invitationService.inviteNominated(
inviteeLastName,
inviteeEmail,
USER_ONE, USER_ONE,
resourceType, resourceType,
SITE_SHORT_NAME_BLUE, SITE_SHORT_NAME_BLUE,
@@ -683,11 +786,11 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
} }
catch (Exception e) catch (Exception e)
{ {
// should have gone here
} }
} }
private void createPerson(String userName, String emailAddress) private void createPerson(String userName, String emailAddress, String firstName, String lastName)
{ {
// if user with given user name doesn't already exist then create user // if user with given user name doesn't already exist then create user
if (this.authenticationService.authenticationExists(userName) == false) if (this.authenticationService.authenticationExists(userName) == false)
@@ -704,8 +807,8 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
// create person properties // create person properties
PropertyMap personProps = new PropertyMap(); PropertyMap personProps = new PropertyMap();
personProps.put(ContentModel.PROP_USERNAME, userName); personProps.put(ContentModel.PROP_USERNAME, userName);
personProps.put(ContentModel.PROP_FIRSTNAME, PERSON_FIRSTNAME); personProps.put(ContentModel.PROP_FIRSTNAME, firstName);
personProps.put(ContentModel.PROP_LASTNAME, PERSON_LASTNAME); personProps.put(ContentModel.PROP_LASTNAME, lastName);
personProps.put(ContentModel.PROP_EMAIL, emailAddress); personProps.put(ContentModel.PROP_EMAIL, emailAddress);
personProps.put(ContentModel.PROP_JOBTITLE, PERSON_JOBTITLE); personProps.put(ContentModel.PROP_JOBTITLE, PERSON_JOBTITLE);
personProps.put(ContentModel.PROP_ORGANIZATION, PERSON_ORG); personProps.put(ContentModel.PROP_ORGANIZATION, PERSON_ORG);

View File

@@ -53,13 +53,6 @@ public class ModeratedActionApprove extends JBPMSpringActionHandler
final String reviewer = (String)executionContext.getVariable(WorkflowModelModeratedInvitation.wfVarReviewer); final String reviewer = (String)executionContext.getVariable(WorkflowModelModeratedInvitation.wfVarReviewer);
final String reviewComments = (String)executionContext.getVariable(WorkflowModelModeratedInvitation.wfVarReviewComments); final String reviewComments = (String)executionContext.getVariable(WorkflowModelModeratedInvitation.wfVarReviewComments);
System.out.println("resourceType=" + resourceType);
System.out.println("resourceName=" + resourceName);
System.out.println("role=" + inviteeRole);
System.out.println("inviteeUserName=" + inviteeUserName);
System.out.println("reviewer=" + reviewer);
System.out.println("reviewComments=" + reviewComments);
/** /**
* Add invitee to the site * Add invitee to the site
*/ */
@@ -67,7 +60,9 @@ public class ModeratedActionApprove extends JBPMSpringActionHandler
{ {
public Object doWork() throws Exception public Object doWork() throws Exception
{ {
siteService.setMembership(resourceName, inviteeUserName, inviteeRole); // Add the new user to the web site
siteService.setMembership(resourceName, inviteeUserName, inviteeRole);
return null; return null;
} }

View File

@@ -1,7 +1,6 @@
package org.alfresco.repo.invitation; package org.alfresco.repo.invitation;
import org.alfresco.repo.invitation.WorkflowModelNominatedInvitation;
import org.alfresco.repo.security.authentication.MutableAuthenticationDao; import org.alfresco.repo.security.authentication.MutableAuthenticationDao;
import org.alfresco.repo.workflow.jbpm.JBPMSpringActionHandler; import org.alfresco.repo.workflow.jbpm.JBPMSpringActionHandler;
import org.alfresco.service.ServiceRegistry; import org.alfresco.service.ServiceRegistry;
@@ -40,6 +39,13 @@ public class ModeratedActionReject extends JBPMSpringActionHandler
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void execute(final ExecutionContext executionContext) throws Exception public void execute(final ExecutionContext executionContext) throws Exception
{ {
System.out.println("Reject woz ere!"); final String resourceType = (String)executionContext.getVariable(WorkflowModelModeratedInvitation.wfVarResourceType);
final String resourceName = (String)executionContext.getVariable(WorkflowModelModeratedInvitation.wfVarResourceName);
final String inviteeUserName = (String)executionContext.getVariable(WorkflowModelModeratedInvitation.wfVarInviteeUserName);
final String inviteeRole = (String)executionContext.getVariable(WorkflowModelModeratedInvitation.wfVarInviteeRole);
final String reviewer = (String)executionContext.getVariable(WorkflowModelModeratedInvitation.wfVarReviewer);
final String reviewComments = (String)executionContext.getVariable(WorkflowModelModeratedInvitation.wfVarReviewComments);
} }
} }

View File

@@ -25,7 +25,6 @@
package org.alfresco.repo.invitation; package org.alfresco.repo.invitation;
import org.alfresco.service.cmr.invitation.ModeratedInvitation; import org.alfresco.service.cmr.invitation.ModeratedInvitation;
import org.alfresco.service.cmr.invitation.Invitation.ResourceType;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import java.io.Serializable; import java.io.Serializable;
@@ -44,14 +43,15 @@ import java.util.Map;
private String roleName; private String roleName;
private String inviteeComments; private String inviteeComments;
private String inviteeUserName;
public ModeratedInvitationImpl() public ModeratedInvitationImpl()
{ {
super(); super();
} }
public ModeratedInvitationImpl(Map<QName, Serializable> workflowProps) public ModeratedInvitationImpl(Map<QName, Serializable> workflowProps)
{ {
super(); super();
setInviteeUserName((String)workflowProps.get(WorkflowModelModeratedInvitation.WF_PROP_INVITEE_USER_NAME)); setInviteeUserName((String)workflowProps.get(WorkflowModelModeratedInvitation.WF_PROP_INVITEE_USER_NAME));
@@ -62,8 +62,7 @@ import java.util.Map;
} }
roleName = (String)workflowProps.get(WorkflowModelModeratedInvitation.WF_PROP_INVITEE_ROLE); roleName = (String)workflowProps.get(WorkflowModelModeratedInvitation.WF_PROP_INVITEE_ROLE);
inviteeComments = (String)workflowProps.get(WorkflowModelModeratedInvitation.WF_PROP_INVITEE_COMMENTS); inviteeComments = (String)workflowProps.get(WorkflowModelModeratedInvitation.WF_PROP_INVITEE_COMMENTS);
}
}
public void setRoleName(String roleName) public void setRoleName(String roleName)
@@ -86,5 +85,16 @@ import java.util.Map;
this.inviteeComments = inviteeComments; this.inviteeComments = inviteeComments;
} }
public InvitationType getInvitationType() {
return InvitationType.MODERATED;
}
public void setInviteeUserName(String inviteeUserName) {
this.inviteeUserName = inviteeUserName;
}
public String getInviteeUserName() {
return inviteeUserName;
}
} }

View File

@@ -27,6 +27,8 @@ package org.alfresco.repo.invitation;
import org.alfresco.repo.workflow.WorkflowModel; import org.alfresco.repo.workflow.WorkflowModel;
import org.alfresco.service.cmr.invitation.Invitation; import org.alfresco.service.cmr.invitation.Invitation;
import org.alfresco.service.cmr.invitation.NominatedInvitation; import org.alfresco.service.cmr.invitation.NominatedInvitation;
import org.alfresco.service.cmr.invitation.Invitation.InvitationType;
import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import java.io.Serializable; import java.io.Serializable;
@@ -54,6 +56,11 @@ import java.util.Map;
private Date sentInviteDate; private Date sentInviteDate;
private String ticket; private String ticket;
/**
* Who is this invitation for
*/
private String inviteeUserName;
/** /**
* create a new nominated invitation * create a new nominated invitation
*/ */
@@ -68,6 +75,7 @@ import java.util.Map;
setInviteeUserName((String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_INVITEE_USER_NAME)); setInviteeUserName((String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_INVITEE_USER_NAME));
inviteeFirstName = (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_INVITEE_FIRSTNAME); inviteeFirstName = (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_INVITEE_FIRSTNAME);
inviteeLastName = (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_INVITEE_LASTNAME); inviteeLastName = (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_INVITEE_LASTNAME);
inviteeEmail = (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_INVITEE_EMAIL);
// inviteePassword = (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_INVITEE_GEN_PASSWORD); // inviteePassword = (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_INVITEE_GEN_PASSWORD);
setResourceName( (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_RESOURCE_NAME)); setResourceName( (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_RESOURCE_NAME));
@@ -75,12 +83,13 @@ import java.util.Map;
{ {
setResourceType(ResourceType.valueOf((String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_RESOURCE_TYPE))); setResourceType(ResourceType.valueOf((String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_RESOURCE_TYPE)));
} }
roleName = (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_INVITEE_SITE_ROLE); roleName = (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_INVITEE_ROLE);
serverPath = (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_SERVER_PATH); serverPath = (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_SERVER_PATH);
acceptUrl = (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_ACCEPT_URL); acceptUrl = (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_ACCEPT_URL);
rejectUrl = (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_REJECT_URL); rejectUrl = (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_REJECT_URL);
ticket = (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_INVITE_TICKET); ticket = (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_INVITE_TICKET);
} }
public void setInviteeFirstName(String inviteeFirstName) { public void setInviteeFirstName(String inviteeFirstName) {
@@ -154,4 +163,17 @@ import java.util.Map;
return roleName; return roleName;
} }
public InvitationType getInvitationType() {
return InvitationType.NOMINATED;
}
public void setInviteeUserName(String inviteeUserName) {
this.inviteeUserName = inviteeUserName;
}
public String getInviteeUserName() {
return inviteeUserName;
}
} }

View File

@@ -34,10 +34,10 @@ import org.alfresco.service.namespace.QName;
public interface WorkflowModelNominatedInvitation { public interface WorkflowModelNominatedInvitation {
// process name // process name
public static final QName WF_PROCESS_INVITE = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "invite"); public static final QName WF_PROCESS_INVITE = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "invitation-nominated");
// workflow definition name // workflow definition name
public static final String WORKFLOW_DEFINITION_NAME = "jbpm$wf:invite"; public static final String WORKFLOW_DEFINITION_NAME = "jbpm$wf:invitation-nominated";
// tasks // tasks
public static final QName WF_INVITE_TASK_INVITE_TO_SITE = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "inviteToSiteTask"); public static final QName WF_INVITE_TASK_INVITE_TO_SITE = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "inviteToSiteTask");
@@ -60,12 +60,12 @@ public interface WorkflowModelNominatedInvitation {
public static final QName WF_PROP_INVITE_TICKET = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "inviteTicket"); public static final QName WF_PROP_INVITE_TICKET = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "inviteTicket");
public static final QName WF_PROP_INVITER_USER_NAME = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "inviterUserName"); public static final QName WF_PROP_INVITER_USER_NAME = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "inviterUserName");
public static final QName WF_PROP_INVITEE_USER_NAME = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "inviteeUserName"); public static final QName WF_PROP_INVITEE_USER_NAME = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "inviteeUserName");
public static final QName WF_PROP_INVITEE_EMAIL = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "inviteeEmail");
public static final QName WF_PROP_INVITEE_FIRSTNAME = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "inviteeFirstName"); public static final QName WF_PROP_INVITEE_FIRSTNAME = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "inviteeFirstName");
public static final QName WF_PROP_INVITEE_LASTNAME = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "inviteeLastName"); public static final QName WF_PROP_INVITEE_LASTNAME = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "inviteeLastName");
public static final QName WF_PROP_RESOURCE_TYPE = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "resourceType"); public static final QName WF_PROP_RESOURCE_TYPE = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "resourceType");
public static final QName WF_PROP_RESOURCE_NAME = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "resourceName"); public static final QName WF_PROP_RESOURCE_NAME = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "resourceName");
public static final QName WF_PROP_INVITEE_SITE_ROLE = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "inviteeSiteRole"); public static final QName WF_PROP_INVITEE_ROLE = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "inviteeRole");
public static final QName WF_PROP_SENT_INVITE_DATE = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "sentInviteDate");
public static final QName WF_PROP_INVITEE_GEN_PASSWORD = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "inviteeGenPassword"); public static final QName WF_PROP_INVITEE_GEN_PASSWORD = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "inviteeGenPassword");
// workflow execution context variable names // workflow execution context variable names
@@ -74,6 +74,6 @@ public interface WorkflowModelNominatedInvitation {
public static final String wfVarResourceName = "wf_resourceName"; public static final String wfVarResourceName = "wf_resourceName";
public static final String wfVarResourceType = "wf_resourceType"; public static final String wfVarResourceType = "wf_resourceType";
public static final String wfVarWorkflowInstanceId = "workflowinstanceid"; public static final String wfVarWorkflowInstanceId = "workflowinstanceid";
public static final String wfVarRole = "wf_inviteeSiteRole"; public static final String wfVarRole = "wf_inviteeRole";
} }

View File

@@ -0,0 +1,76 @@
/*
* Copyright (C) 2009 Alfresco Software Limited.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* As a special exception to the terms and conditions of version 2.0 of
* the GPL, you may redistribute this Program in connection with Free/Libre
* and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing"
*/
package org.alfresco.repo.invitation.script;
import org.alfresco.service.cmr.invitation.Invitation;
import org.alfresco.service.cmr.invitation.InvitationService;
/**
* Java script invitation for the Java Script API
*
* @author mrogers
*/
public class ScriptInvitation
{
private Invitation invitation;
private InvitationService invitationService;
public ScriptInvitation(Invitation invitation, InvitationService invitationService)
{
this.invitation = invitation;
this.invitationService = invitationService;
}
public String getInviteId()
{
return invitation.getInviteId();
}
public String getInvitationType()
{
return invitation.getInvitationType().toString();
}
public String getResourceName()
{
return invitation.getResourceName();
}
public String getResourceType()
{
return invitation.getResourceType().toString();
}
protected Invitation getInvitation()
{
return invitation;
}
protected InvitationService getInvitationService()
{
return invitationService;
}
}

View File

@@ -0,0 +1,50 @@
/*
* Copyright (C) 2009 Alfresco Software Limited.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* As a special exception to the terms and conditions of version 2.0 of
* the GPL, you may redistribute this Program in connection with Free/Libre
* and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing"
*/
package org.alfresco.repo.invitation.script;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.service.cmr.invitation.Invitation;
import org.alfresco.service.cmr.invitation.InvitationService;
import org.alfresco.service.cmr.invitation.ModeratedInvitation;
import org.alfresco.service.cmr.invitation.NominatedInvitation;
public class ScriptInvitationFactory
{
public static ScriptInvitation toScriptInvitation(Invitation invitation, InvitationService invitationService)
{
if(invitation instanceof NominatedInvitation)
{
return new ScriptNominatedInvitation(invitation, invitationService);
}
if(invitation instanceof ModeratedInvitation)
{
return new ScriptModeratedInvitation(invitation, invitationService);
}
throw new AlfrescoRuntimeException("unknown invitation type");
}
}

View File

@@ -0,0 +1,93 @@
/*
* Copyright (C) 2009 Alfresco Software Limited.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* As a special exception to the terms and conditions of version 2.0 of
* the GPL, you may redistribute this Program in connection with Free/Libre
* and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing"
*/
package org.alfresco.repo.invitation.script;
import org.alfresco.service.cmr.invitation.Invitation;
import org.alfresco.service.cmr.invitation.InvitationService;
import org.alfresco.service.cmr.invitation.ModeratedInvitation;
import org.alfresco.service.cmr.invitation.NominatedInvitation;
/**
* Java script moderated invitation for the Java Script API
*
* @author mrogers
*/
public class ScriptModeratedInvitation extends ScriptInvitation implements java.io.Serializable
{
/**
*
*/
private static final long serialVersionUID = 4285823431857215500L;
public ScriptModeratedInvitation(Invitation invitation, InvitationService invitationService)
{
super(invitation, invitationService);
}
public void approve(String reason)
{
getInvitationService().approve(getInviteId(), reason);
}
public void reject(String reason)
{
getInvitationService().reject(getInviteId(), reason);
}
public void cancel()
{
getInvitationService().cancel(getInviteId());
}
/**
* Which role to be added with
* @return the roleName
*/
public String getRoleName()
{
return ((ModeratedInvitation)getInvitation()).getRoleName();
}
/**
* The invitee comments - why does the invitee want access ?
* @return invitee comments
*/
public String getInviteeComments()
{
return ((ModeratedInvitation)getInvitation()).getInviteeComments();
}
/**
* The inviteeUserName
* @return the invitee user name
*/
public String getInviteeUserName()
{
return ((ModeratedInvitation)getInvitation()).getInviteeUserName();
}
}

View File

@@ -0,0 +1,101 @@
/*
* Copyright (C) 2009 Alfresco Software Limited.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* As a special exception to the terms and conditions of version 2.0 of
* the GPL, you may redistribute this Program in connection with Free/Libre
* and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing"
*/
package org.alfresco.repo.invitation.script;
import org.alfresco.service.cmr.invitation.Invitation;
import org.alfresco.service.cmr.invitation.InvitationService;
import org.alfresco.service.cmr.invitation.NominatedInvitation;
import org.alfresco.util.ISO8601DateFormat;
import java.util.Date;
/**
* Java script moderated invitation for the Java Script API
*
* @author mrogers
*/
public class ScriptNominatedInvitation extends ScriptInvitation implements java.io.Serializable
{
/**
*
*/
private static final long serialVersionUID = 6079656007339750930L;
/**
*
*/
public ScriptNominatedInvitation(Invitation invitation, InvitationService invitationService)
{
super(invitation, invitationService);
}
public void accept(String reason)
{
getInvitationService().accept(getInviteId(), reason);
}
public void reject(String reason)
{
getInvitationService().reject(getInviteId(), reason);
}
public void cancel()
{
getInvitationService().cancel(getInviteId());
}
/**
* Which role to be added with
* @return the roleName
*/
public String getRoleName()
{
return ((NominatedInvitation)getInvitation()).getRoleName();
}
public String getInviteeUserName()
{
return ((NominatedInvitation)getInvitation()).getInviteeUserName();
}
/**
* Which role to be added with
* @return the roleName
*/
public Date getSentInviteDate()
{
return ((NominatedInvitation)getInvitation()).getSentInviteDate();
}
public String getSentInviteDateAsISO8601()
{
return ISO8601DateFormat.format(getSentInviteDate());
}
}

View File

@@ -139,7 +139,7 @@ public class InviteHelper
final String inviteeUserNameProp = (String) startInviteTask.properties.get( final String inviteeUserNameProp = (String) startInviteTask.properties.get(
WorkflowModelNominatedInvitation.WF_PROP_INVITEE_USER_NAME); WorkflowModelNominatedInvitation.WF_PROP_INVITEE_USER_NAME);
final String role = (String) startInviteTask.properties.get( final String role = (String) startInviteTask.properties.get(
WorkflowModelNominatedInvitation.WF_PROP_INVITEE_SITE_ROLE); WorkflowModelNominatedInvitation.WF_PROP_INVITEE_ROLE);
final String siteShortNameProp = (String) startInviteTask.properties.get( final String siteShortNameProp = (String) startInviteTask.properties.get(
WorkflowModelNominatedInvitation.WF_PROP_RESOURCE_NAME); WorkflowModelNominatedInvitation.WF_PROP_RESOURCE_NAME);

View File

@@ -29,6 +29,9 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.repo.invitation.InvitationSearchCriteriaImpl;
import org.alfresco.repo.invitation.script.ScriptInvitation;
import org.alfresco.repo.invitation.script.ScriptInvitationFactory;
import org.alfresco.repo.jscript.ContentAwareScriptableQNameMap; import org.alfresco.repo.jscript.ContentAwareScriptableQNameMap;
import org.alfresco.repo.jscript.ScriptNode; import org.alfresco.repo.jscript.ScriptNode;
import org.alfresco.repo.jscript.ScriptableHashMap; import org.alfresco.repo.jscript.ScriptableHashMap;
@@ -40,6 +43,11 @@ import org.alfresco.repo.security.permissions.AccessDeniedException;
import org.alfresco.repo.site.SiteModel; import org.alfresco.repo.site.SiteModel;
import org.alfresco.service.ServiceRegistry; import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.dictionary.PropertyDefinition; import org.alfresco.service.cmr.dictionary.PropertyDefinition;
import org.alfresco.service.cmr.invitation.Invitation;
import org.alfresco.service.cmr.invitation.InvitationException;
import org.alfresco.service.cmr.invitation.InvitationSearchCriteria;
import org.alfresco.service.cmr.invitation.InvitationService;
import org.alfresco.service.cmr.invitation.InvitationSearchCriteria.InvitationType;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.cmr.site.SiteInfo; import org.alfresco.service.cmr.site.SiteInfo;
@@ -47,6 +55,9 @@ import org.alfresco.service.cmr.site.SiteService;
import org.alfresco.service.cmr.site.SiteVisibility; import org.alfresco.service.cmr.site.SiteVisibility;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.util.ParameterCheck; import org.alfresco.util.ParameterCheck;
import org.alfresco.wcm.asset.AssetInfo;
import org.alfresco.wcm.sandbox.script.Asset;
import org.mozilla.javascript.NativeObject;
import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject; import org.mozilla.javascript.ScriptableObject;
@@ -594,6 +605,113 @@ public class Site implements Serializable
return this.customProperties; return this.customProperties;
} }
/**
* Create new moderated invitation to this web site
* @return the new invitation
*/
public ScriptInvitation inviteModerated(String inviteeComments, String inviteeUserName, String inviteeRole)
{
InvitationService invitationService = serviceRegistry.getInvitationService();
Invitation invitation = invitationService.inviteModerated(inviteeComments, inviteeUserName, Invitation.ResourceType.WEB_SITE, getShortName(), inviteeRole);
return ScriptInvitationFactory.toScriptInvitation(invitation, invitationService);
}
/**
* Create new nominated invitation to this web site
* @return the new invitation
*/
public ScriptInvitation inviteNominated(String inviteeFirstName, String inviteeLastName, String inviteeEmail, String inviteeRole, String serverPath, String acceptUrl, String rejectUrl)
{
InvitationService invitationService = serviceRegistry.getInvitationService();
Invitation invitation = invitationService.inviteNominated(inviteeFirstName, inviteeLastName, inviteeEmail, Invitation.ResourceType.WEB_SITE, getShortName(), inviteeRole, serverPath, acceptUrl, rejectUrl);
return ScriptInvitationFactory.toScriptInvitation(invitation, invitationService);
}
/**
* Create new nominated invitation to this web site
* @return the new invitation
*/
public ScriptInvitation inviteNominated(String inviteeUserName, String inviteeRole, String serverPath, String acceptUrl, String rejectUrl)
{
InvitationService invitationService = serviceRegistry.getInvitationService();
Invitation invitation = invitationService.inviteNominated(inviteeUserName, Invitation.ResourceType.WEB_SITE, getShortName(), inviteeRole, serverPath, acceptUrl, rejectUrl);
return ScriptInvitationFactory.toScriptInvitation(invitation, invitationService);
}
/**
* Get an invitation to this web site
* @return the invitation or null if it does not exist
*/
public ScriptInvitation getInvitation(String invitationId)
{
InvitationService invitationService = serviceRegistry.getInvitationService();
try
{
Invitation invitation = invitationService.getInvitation(invitationId);
return ScriptInvitationFactory.toScriptInvitation(invitation, invitationService);
}
catch (InvitationException e)
{
return null;
}
}
/**
* list the outstanding invitations for this site
*
* Map of name / invitation
*/
public ScriptInvitation[] listInvitations()
{
InvitationService invitationService = serviceRegistry.getInvitationService();
List<Invitation> invitations = invitationService.listPendingInvitationsForResource(Invitation.ResourceType.WEB_SITE, getShortName());
ScriptInvitation[] ret = new ScriptInvitation[invitations.size()];
int i = 0;
for(Invitation item : invitations)
{
ret[i++] = ScriptInvitationFactory.toScriptInvitation(item, invitationService);
}
return ret;
}
/**
* List the open invitations for this web site.
* props specifies optional properties to be searched.
*
* @param props inviteeUserName
*
* @return the invitations
*/
public ScriptInvitation[] listInvitations(Scriptable props)
{
InvitationService invitationService = serviceRegistry.getInvitationService();
InvitationSearchCriteriaImpl crit = new InvitationSearchCriteriaImpl();
crit.setResourceName(getShortName());
crit.setResourceType(Invitation.ResourceType.WEB_SITE);
if (props.has("inviteeUserName", props))
{
crit.setInvitee((String)props.get("inviteeUserName", props));
}
if (props.has("invitationType", props))
{
String invitationType = (String)props.get("inviteeUserName", props);
crit.setInvitationType(InvitationType.valueOf(invitationType));
}
List<Invitation> invitations = invitationService.searchInvitation(crit);
ScriptInvitation[] ret = new ScriptInvitation[invitations.size()];
int i = 0;
for(Invitation item : invitations)
{
ret[i++] = ScriptInvitationFactory.toScriptInvitation(item, invitationService);
}
return ret;
}
/** /**
* Custom property helper class * Custom property helper class
* *

View File

@@ -46,6 +46,16 @@ public interface Invitation
WEB_SITE WEB_SITE
} }
/**
* What type of invitation are we?
* (Just Web site for now)
*/
enum InvitationType
{
NOMINATED,
MODERATED
}
/** /**
* What sort of resource is it, for example a WEB_SITE? * What sort of resource is it, for example a WEB_SITE?
* @return the resource type * @return the resource type
@@ -58,16 +68,16 @@ public interface Invitation
*/ */
public String getResourceName(); public String getResourceName();
/**
* Who is this invitation for ?
* @return the user name of the invitee
*/
public String getInviteeUserName();
/** /**
* What is the unique reference for this invitation ? * What is the unique reference for this invitation ?
* @return the unique reference for this invitation * @return the unique reference for this invitation
*/ */
public String getInviteId(); public String getInviteId();
/**
* What sort of invitation is this ?
*/
public InvitationType getInvitationType();
} }

View File

@@ -38,14 +38,48 @@ import java.util.List;
*/ */
public interface InvitationService public interface InvitationService
{ {
/**
* Get the names of the workflows managed by the invitation service.
*
* @return the names of the workkflows managed by the invitation service.
*/
public List<String> getInvitationServiceWorkflowNames();
/** /**
* Start the invitation process for a NominatedInvitation * Start the invitation process for a NominatedInvitation for a user who does not yet have an Alfresco User Name
*
* @param inviteeUserName Alfresco user name of who should be invited
* @param ResourceType resourceType
* @param resourceName
* @param inviteeRole
* @param serverPath
* @param acceptUrl
* @param rejectUrl
*
* @return the nominated invitation which will contain the invitationId and
* ticket which will uniqely identify this invitation for the rest
* of the workflow.
*
* @throws InvitationException
* @throws InvitationExceptionUserError
* @throws InvitationExceptionForbidden
*/
public NominatedInvitation inviteNominated(
String inviteeUserName,
Invitation.ResourceType resourceType,
String resourceName,
String inviteeRole,
String serverPath,
String acceptUrl,
String rejectUrl) ;
/**
* Start the invitation process for a NominatedInvitation for a user who does not yet have an
* Alfresco User NameA new user name will be generated as part of the invitation process.
* *
* @param inviteeFirstName * @param inviteeFirstName
* @param inviteeLastName * @param inviteeLastName
* @param inviteeEmail * @param inviteeEmail
* @param inviteeUserName the alfresco user name of the invitee, may be null for a new user
* @param Invitation.ResourceType resourceType * @param Invitation.ResourceType resourceType
* @param resourceName * @param resourceName
* @param inviteeRole * @param inviteeRole
@@ -64,7 +98,6 @@ public interface InvitationService
String inviteeFirstName, String inviteeFirstName,
String inviteeLastName, String inviteeLastName,
String inviteeEmail, String inviteeEmail,
String inviteeUserName,
Invitation.ResourceType resourceType, Invitation.ResourceType resourceType,
String resourceName, String resourceName,
String inviteeRole, String inviteeRole,

View File

@@ -36,13 +36,7 @@ package org.alfresco.service.cmr.invitation;
* @author mrogers * @author mrogers
*/ */
public interface ModeratedInvitation extends Invitation public interface ModeratedInvitation extends Invitation
{ {
/**
* Which resource to be invited to?
* @return the resource name.
*/
public String getResourceName();
/** /**
* Which role to be added with * Which role to be added with
* @return the roleName * @return the roleName
@@ -54,5 +48,11 @@ public interface ModeratedInvitation extends Invitation
* @return invitee comments * @return invitee comments
*/ */
public String getInviteeComments(); public String getInviteeComments();
/**
* Who wants to be added
* @return inviteeUserName
*/
public String getInviteeUserName();
} }

View File

@@ -39,6 +39,7 @@ import java.util.Date;
*/ */
public interface NominatedInvitation extends Invitation public interface NominatedInvitation extends Invitation
{ {
public String getInviteeUserName();
public String getInviteeFirstName(); public String getInviteeFirstName();