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

View File

@@ -1,7 +1,9 @@
#
# 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.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
#
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-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.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
#
# Invite Workflow
# Invitation Nominated Workflow
#
wf_invite.workflow.title=Invitation (Nominated)
wf_invite.workflow.description=Invitation to a Share Site, nominated by a site manager
wf_invitation-nominated.workflow.title=Invitation - Nominated
wf_invitation-nominated.workflow.description=Invitation to a Share Site, nominated by a site manager
# Invite Task Definitions
wf_invite-workflow-model.type.wf_inviteToSiteTask.title=Start Invite
wf_invite-workflow-model.type.wf_inviteToSiteTask.description=Start an invite to a Site
wf_invite-workflow-model.type.wf_invitePendingTask.title=Site Invite
wf_invite-workflow-model.type.wf_invitePendingTask.description=Invite to a Site
wf_invite-workflow-model.type.wf_rejectInviteTask.title=Rejected
wf_invite-workflow-model.type.wf_rejectInviteTask.description=Rejected
wf_invite-workflow-model.type.wf_acceptInviteTask.title=Accepted
wf_invite-workflow-model.type.wf_acceptInviteTask.description=Accepted
wf_invitation-nominated-workflow-model.type.wf_inviteToSiteTask.title=Start task
wf_invitation-nominated-workflow-model.type.wf_inviteToSiteTask.description=Start a nominated invitation
wf_invitation-nominated-workflow-model.type.wf_invitePendingTask.title=Pending invitation
wf_invitation-nominated-workflow-model.type.wf_invitePendingTask.description=Pending invitation
wf_invitation-nominated-workflow-model.type.wf_rejectInviteTask.title=Rejected
wf_invitation-nominated-workflow-model.type.wf_rejectInviteTask.description=Rejected
wf_invitation-nominated-workflow-model.type.wf_acceptInviteTask.title=Accepted
wf_invitation-nominated-workflow-model.type.wf_acceptInviteTask.description=Accepted
# Invite Process Definitions
wf_invite.node.start.title=Start
wf_invite.node.start.description=Start
wf_invite.node.invitePending.title=Invite Pending
wf_invite.node.invitePending.description=Invite Pending
wf_invite.node.invitePending.transition.reject.title=Reject
wf_invite.node.invitePending.transition.reject.description=Reject
wf_invite.node.invitePending.transition.accept.title=Accept
wf_invite.node.invitePending.transition.accept.description=Accept
wf_invite.node.inviteRejected.title=Rejected
wf_invite.node.inviteRejected.description=Rejected
wf_invite.task.wf_rejectInviteTask.title=Rejected
wf_invite.task.wf_rejectInviteTask.description=Rejected
wf_invite.node.inviteAccepted.title=Accepted
wf_invite.node.inviteAccepted.description=Accepted
wf_invite.task.wf_acceptInviteTask.title=Accepted
wf_invite.task.wf_acceptInviteTask.description=Accepted
wf_invite.node.end.title=End
wf_invite.node.end.description=End
wf_invitation-nominated.node.start.title=Start
wf_invitation-nominated.node.start.description=Start
wf_invitation-nominated.node.invitePending.title=Invite Pending
wf_invitation-nominated.node.invitePending.description=Invite Pending
wf_invitation-nominated.node.invitePending.transition.reject.title=Reject
wf_invitation-nominated.node.invitePending.transition.reject.description=Reject
wf_invitation-nominated.node.invitePending.transition.accept.title=Accept
wf_invitation-nominated.node.invitePending.transition.accept.description=Accept
wf_invitation-nominated.node.invitePending.transition.cancel.title=Cancel
wf_invitation-nominated.node.invitePending.transition.cancel.description=Cancel
wf_invitation-nominated.node.inviteRejected.title=Rejected
wf_invitation-nominated.node.inviteRejected.description=Rejected
wf_invitation-nominated.task.wf_rejectInviteTask.title=Rejected
wf_invitation-nominated.task.wf_rejectInviteTask.description=Rejected
wf_invitation-nominated.node.inviteAccepted.title=Accepted
wf_invitation-nominated.node.inviteAccepted.description=Accepted
wf_invitation-nominated.task.wf_acceptInviteTask.title=Accepted
wf_invitation-nominated.task.wf_acceptInviteTask.description=Accepted
wf_invitation-nominated.node.end.title=End
wf_invitation-nominated.node.end.description=End

View File

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

View File

@@ -2,7 +2,8 @@
<!-- 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"/>
@@ -40,7 +41,7 @@
args["inviteePersonRef"] = inviteePerson.nodeRef.toString();
args["inviterPersonRef"] = inviterPerson.nodeRef.toString();
args["siteName"] = siteName;
args["inviteeSiteRole"] = wf_inviteeSiteRole;
args["inviteeSiteRole"] = wf_inviteeRole;
args["inviteeUserName"] = wf_inviteeUserName;
args["inviteeGenPassword"] = wf_inviteeGenPassword;
args["acceptLink"] = acceptLink;

View File

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

View File

@@ -26,6 +26,7 @@ package org.alfresco.repo.invitation;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
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.site.SiteService;
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.WorkflowPath;
import org.alfresco.service.cmr.workflow.WorkflowService;
@@ -86,6 +88,64 @@ public class InvitationServiceImpl implements InvitationService
// does not already belong to an existing person
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
*
@@ -111,11 +171,40 @@ public class InvitationServiceImpl implements InvitationService
* @throws InvitationExceptionUserError
* @throws InvitationExceptionForbidden
*/
public NominatedInvitation inviteNominated(String inviteeFirstName,
String inviteeLastName, String inviteeEmail,
String inviteeUserName, Invitation.ResourceType resourceType,
String resourceName, String inviteeRole, String serverPath,
String acceptUrl, String rejectUrl)
public NominatedInvitation inviteNominated(
String inviteeFirstName,
String inviteeLastName,
String inviteeEmail,
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
@@ -123,7 +212,7 @@ public class InvitationServiceImpl implements InvitationService
if (resourceType == Invitation.ResourceType.WEB_SITE)
{
return startInvite(inviteeFirstName, inviteeLastName, inviteeEmail,
return startNominatedInvite(inviteeFirstName, inviteeLastName, inviteeEmail,
inviteeUserName, resourceType, resourceName, inviteeRole,
serverPath, acceptUrl, rejectUrl);
}
@@ -151,7 +240,7 @@ public class InvitationServiceImpl implements InvitationService
{
if (resourceType == Invitation.ResourceType.WEB_SITE)
{
return startInvite(inviteeComments, inviteeUserName, resourceType,
return startModeratedInvite(inviteeComments, inviteeUserName, resourceType,
resourceName, inviteeRole);
}
throw new InvitationException("unknown resource type");
@@ -335,10 +424,23 @@ public class InvitationServiceImpl implements InvitationService
*
* @throws InvitationExceptionNotFound
* the invitation does not exist.
* @throws InvitationExceptionUserError
* @return the invitation.
*/
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) {
Object objs[] = { invitationId };
throw new InvitationExceptionNotFound("invitation.error.not_found",
@@ -363,11 +465,14 @@ public class InvitationServiceImpl implements InvitationService
// should also be 0 or 1
if (inviteStartTasks.size() < 1) {
return null;
Object objs[] = { invitationId };
throw new InvitationExceptionNotFound("invitation.error.not_found",
objs);
} else {
WorkflowTask task = inviteStartTasks.get(0);
NominatedInvitationImpl result = new NominatedInvitationImpl(
task.properties);
result.setSentInviteDate(task.path.instance.startDate);
result.setInviteId(invitationId);
return result;
}
@@ -836,7 +941,7 @@ public class InvitationServiceImpl implements InvitationService
* @param inviteeRole
* @return the new moderated invitation
*/
private ModeratedInvitation startInvite(String inviteeComments,
private ModeratedInvitation startModeratedInvite(String inviteeComments,
String inviteeUserName, Invitation.ResourceType resourceType,
String resourceName, String inviteeRole)
{
@@ -878,10 +983,10 @@ public class InvitationServiceImpl implements InvitationService
WorkflowModelModeratedInvitation.WF_PROP_INVITEE_USER_NAME,
inviteeUserName);
workflowProps.put(
WorkflowModelNominatedInvitation.WF_PROP_RESOURCE_NAME,
WorkflowModelModeratedInvitation.WF_PROP_RESOURCE_NAME,
resourceName);
workflowProps.put(
WorkflowModelNominatedInvitation.WF_PROP_RESOURCE_TYPE,
WorkflowModelModeratedInvitation.WF_PROP_RESOURCE_TYPE,
resourceType.toString());
// get the moderated workflow
@@ -945,11 +1050,17 @@ public class InvitationServiceImpl implements InvitationService
* externally accessible server address of server hosting invite
* web scripts
*/
private NominatedInvitation startInvite(String inviteeFirstName,
String inviteeLastName, String inviteeEmail,
String inviteeUserName, Invitation.ResourceType resourceType,
String siteShortName, String inviteeSiteRole, String serverPath,
String acceptUrl, String rejectUrl) {
private NominatedInvitation startNominatedInvite(
String inviteeFirstName,
String inviteeLastName,
String inviteeEmail,
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
// under)
@@ -1003,7 +1114,8 @@ public class InvitationServiceImpl implements InvitationService
// else there are no existing people who have the given invitee
// email address
// so create invitee person
else {
else
{
inviteeUserName = createInviteePerson(inviteeFirstName,
inviteeLastName, inviteeEmail);
@@ -1013,9 +1125,25 @@ public class InvitationServiceImpl implements InvitationService
+ inviteeUserName);
}
}
else
{
// inviteeUserName was specified
NodeRef person = this.personService.getPerson(inviteeUserName);
// throw web script exception if person is already a member of the given
// site
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 exception if person is already a member of the given site
*/
if (this.siteService.isMember(siteShortName, inviteeUserName)) {
if (logger.isDebugEnabled())
logger
@@ -1070,6 +1198,9 @@ public class InvitationServiceImpl implements InvitationService
workflowProps.put(
WorkflowModelNominatedInvitation.WF_PROP_INVITEE_USER_NAME,
inviteeUserName);
workflowProps.put(
WorkflowModelNominatedInvitation.WF_PROP_INVITEE_EMAIL,
inviteeEmail);
workflowProps.put(WorkflowModel.ASSOC_ASSIGNEE, inviteeNodeRef);
workflowProps.put(
WorkflowModelNominatedInvitation.WF_PROP_INVITEE_FIRSTNAME,
@@ -1087,7 +1218,7 @@ public class InvitationServiceImpl implements InvitationService
WorkflowModelNominatedInvitation.WF_PROP_RESOURCE_TYPE,
resourceType.toString());
workflowProps.put(
WorkflowModelNominatedInvitation.WF_PROP_INVITEE_SITE_ROLE,
WorkflowModelNominatedInvitation.WF_PROP_INVITEE_ROLE,
inviteeSiteRole);
workflowProps.put(WorkflowModelNominatedInvitation.WF_PROP_SERVER_PATH,
serverPath);
@@ -1173,6 +1304,7 @@ public class InvitationServiceImpl implements InvitationService
workflowProps);
result.setTicket(inviteTicket);
result.setInviteId(workflowId);
result.setSentInviteDate(new Date());
return result;
}
@@ -1195,4 +1327,19 @@ public class InvitationServiceImpl implements InvitationService
"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;
import java.util.Date;
import java.util.List;
import org.alfresco.model.ContentModel;
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.AuthenticationUtil.RunAsWork;
import org.alfresco.repo.site.SiteModel;
import org.alfresco.service.cmr.invitation.InvitationExceptionUserError;
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.NominatedInvitation;
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.site.SiteInfo;
import org.alfresco.service.cmr.site.SiteService;
import org.alfresco.service.cmr.site.SiteVisibility;
import org.alfresco.service.cmr.tagging.TaggingService;
import org.alfresco.util.BaseAlfrescoSpringTest;
import org.alfresco.util.PropertyMap;
import junit.framework.TestCase;
/**
*
* Unit tests of Invitation Service
@@ -79,6 +70,10 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
public static String USER_ONE = "InvitationServiceAlice";
public static String USER_TWO = "InvitationServiceBob";
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
@@ -92,10 +87,10 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
this.authenticationComponent = (AuthenticationComponent)this.applicationContext.getBean("authenticationComponent");
this.mutableAuthenticationDao = (MutableAuthenticationDao)this.applicationContext.getBean("authenticationDao");
createPerson(USER_MANAGER, "");
createPerson(USER_ONE, "");
createPerson(USER_TWO, "");
createPerson(USER_EVE, "");
createPerson(USER_MANAGER, USER_MANAGER + "@alfrescotesting.com", PERSON_FIRSTNAME, PERSON_LASTNAME);
createPerson(USER_ONE, USER_ONE_EMAIL,USER_ONE_FIRSTNAME, USER_ONE_LASTNAME);
createPerson(USER_TWO, USER_TWO + "@alfrescotesting.com", PERSON_FIRSTNAME, PERSON_LASTNAME);
createPerson(USER_EVE, USER_EVE + "@alfrescotesting.com", PERSON_FIRSTNAME, PERSON_LASTNAME);
this.authenticationComponent.setCurrentUser(USER_MANAGER);
@@ -158,25 +153,18 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
}
/**
* Create a Nominated Invitation
* read it.
* search for it
* cancel it
* search for it again (and fail to find it)
* Create a Nominated Invitation
* read it.
* search for it
* reject it
* Create a Nominated Invitation
* read it.
* accept it
* Test nominated user - new user
*
* @throws Exception
*/
public void testNominatedInvitation() 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 = "invitee@alfrescotesting.com";
String inviteeUserName = null;
Invitation.ResourceType resourceType = Invitation.ResourceType.WEB_SITE;
String resourceName = SITE_SHORT_NAME_INVITE;
String inviteeRole = SiteModel.SITE_COLLABORATOR;
@@ -186,10 +174,10 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
this.authenticationComponent.setCurrentUser(USER_MANAGER);
NominatedInvitation nominatedInvitation = invitationService.inviteNominated(inviteeFirstName,
NominatedInvitation nominatedInvitation = invitationService.inviteNominated(
inviteeFirstName,
inviteeLastName,
inviteeEmail,
inviteeUserName,
resourceType,
resourceName,
inviteeRole,
@@ -201,7 +189,18 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
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("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());
@@ -212,6 +211,7 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
/**
* 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);
@@ -226,6 +226,119 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
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.
* search for it
* cancel it
* search for it again (and fail to find it)
* Create a Nominated Invitation
* read it.
* search for it
* reject it
* Create a Nominated Invitation
* read it.
* accept it
*/
public void testNominatedInvitationExistingUser() throws Exception
{
String inviteeUserName = USER_ONE;
String inviteeEmail = USER_ONE_EMAIL;
String inviteeFirstName = USER_ONE_FIRSTNAME;
String inviteeLastName = USER_ONE_LASTNAME;
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(
inviteeUserName,
resourceType,
resourceName,
inviteeRole,
serverPath,
acceptUrl,
rejectUrl) ;
assertNotNull("nominated invitation is null", nominatedInvitation);
String inviteId = nominatedInvitation.getInviteId();
assertEquals("user name wrong", inviteeUserName, nominatedInvitation.getInviteeUserName());
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());
// 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.
*/
NominatedInvitation invitation = (NominatedInvitation)invitationService.getInvitation(inviteId);
assertNotNull("invitation is null", invitation);
assertEquals("invite id wrong", inviteId, invitation.getInviteId());
assertEquals("user name wrong", inviteeUserName, nominatedInvitation.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());
// 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
*/
@@ -256,9 +369,7 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
/**
* Now invite and reject
*/
NominatedInvitation secondInvite = invitationService.inviteNominated(inviteeFirstName,
inviteeLastName,
inviteeEmail,
NominatedInvitation secondInvite = invitationService.inviteNominated(
inviteeUserName,
resourceType,
resourceName,
@@ -269,8 +380,6 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
NominatedInvitation rejectedInvitation = (NominatedInvitation)invitationService.cancel(secondInvite.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());
List<Invitation> it3 = invitationService.listPendingInvitationsForResource(resourceType, resourceName);
@@ -279,9 +388,7 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
/**
* Now invite and accept
*/
NominatedInvitation thirdInvite = invitationService.inviteNominated(inviteeFirstName,
inviteeLastName,
inviteeEmail,
NominatedInvitation thirdInvite = invitationService.inviteNominated(
inviteeUserName,
resourceType,
resourceName,
@@ -517,7 +624,7 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
*/
try
{
invitationService.approve(invitationId, "No Way Hosea!");
invitationService.reject(invitationId, "No Way Hosea!");
assertTrue("excetion not thrown", false);
}
@@ -532,7 +639,7 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
* Reject the invitation
*/
this.authenticationComponent.setCurrentUser(USER_MANAGER);
invitationService.approve(invitationId, "Go away!");
invitationService.reject(invitationId, "Go away!");
/**
* Negative test
@@ -584,9 +691,7 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
inviteeRole);
String oneId = invitationOne.getInviteId();
NominatedInvitation invitationTwo = invitationService.inviteNominated(inviteeFirstName,
inviteeLastName,
inviteeEmail,
NominatedInvitation invitationTwo = invitationService.inviteNominated(
USER_ONE,
resourceType,
SITE_SHORT_NAME_RED,
@@ -596,9 +701,7 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
rejectUrl) ;
String twoId = invitationTwo.getInviteId();
NominatedInvitation invitationThree = invitationService.inviteNominated(inviteeFirstName,
inviteeLastName,
inviteeEmail,
NominatedInvitation invitationThree = invitationService.inviteNominated(
USER_ONE,
resourceType,
SITE_SHORT_NAME_BLUE,
@@ -683,11 +786,11 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
}
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 (this.authenticationService.authenticationExists(userName) == false)
@@ -704,8 +807,8 @@ public class InvitationServiceImplTest extends BaseAlfrescoSpringTest
// create person properties
PropertyMap personProps = new PropertyMap();
personProps.put(ContentModel.PROP_USERNAME, userName);
personProps.put(ContentModel.PROP_FIRSTNAME, PERSON_FIRSTNAME);
personProps.put(ContentModel.PROP_LASTNAME, PERSON_LASTNAME);
personProps.put(ContentModel.PROP_FIRSTNAME, firstName);
personProps.put(ContentModel.PROP_LASTNAME, lastName);
personProps.put(ContentModel.PROP_EMAIL, emailAddress);
personProps.put(ContentModel.PROP_JOBTITLE, PERSON_JOBTITLE);
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 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
*/
@@ -67,7 +60,9 @@ public class ModeratedActionApprove extends JBPMSpringActionHandler
{
public Object doWork() throws Exception
{
// Add the new user to the web site
siteService.setMembership(resourceName, inviteeUserName, inviteeRole);
return null;
}

View File

@@ -1,7 +1,6 @@
package org.alfresco.repo.invitation;
import org.alfresco.repo.invitation.WorkflowModelNominatedInvitation;
import org.alfresco.repo.security.authentication.MutableAuthenticationDao;
import org.alfresco.repo.workflow.jbpm.JBPMSpringActionHandler;
import org.alfresco.service.ServiceRegistry;
@@ -40,6 +39,13 @@ public class ModeratedActionReject extends JBPMSpringActionHandler
@SuppressWarnings("unchecked")
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;
import org.alfresco.service.cmr.invitation.ModeratedInvitation;
import org.alfresco.service.cmr.invitation.Invitation.ResourceType;
import org.alfresco.service.namespace.QName;
import java.io.Serializable;
@@ -44,6 +43,7 @@ import java.util.Map;
private String roleName;
private String inviteeComments;
private String inviteeUserName;
public ModeratedInvitationImpl()
{
@@ -62,7 +62,6 @@ import java.util.Map;
}
roleName = (String)workflowProps.get(WorkflowModelModeratedInvitation.WF_PROP_INVITEE_ROLE);
inviteeComments = (String)workflowProps.get(WorkflowModelModeratedInvitation.WF_PROP_INVITEE_COMMENTS);
}
@@ -86,5 +85,16 @@ import java.util.Map;
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.service.cmr.invitation.Invitation;
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 java.io.Serializable;
@@ -54,6 +56,11 @@ import java.util.Map;
private Date sentInviteDate;
private String ticket;
/**
* Who is this invitation for
*/
private String inviteeUserName;
/**
* create a new nominated invitation
*/
@@ -68,6 +75,7 @@ import java.util.Map;
setInviteeUserName((String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_INVITEE_USER_NAME));
inviteeFirstName = (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_INVITEE_FIRSTNAME);
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);
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)));
}
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);
acceptUrl = (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_ACCEPT_URL);
rejectUrl = (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_REJECT_URL);
ticket = (String)workflowProps.get(WorkflowModelNominatedInvitation.WF_PROP_INVITE_TICKET);
}
public void setInviteeFirstName(String inviteeFirstName) {
@@ -154,4 +163,17 @@ import java.util.Map;
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 {
// 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
public static final String WORKFLOW_DEFINITION_NAME = "jbpm$wf:invite";
public static final String WORKFLOW_DEFINITION_NAME = "jbpm$wf:invitation-nominated";
// tasks
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_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_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_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_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_SENT_INVITE_DATE = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "sentInviteDate");
public static final QName WF_PROP_INVITEE_ROLE = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "inviteeRole");
public static final QName WF_PROP_INVITEE_GEN_PASSWORD = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "inviteeGenPassword");
// workflow execution context variable names
@@ -74,6 +74,6 @@ public interface WorkflowModelNominatedInvitation {
public static final String wfVarResourceName = "wf_resourceName";
public static final String wfVarResourceType = "wf_resourceType";
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(
WorkflowModelNominatedInvitation.WF_PROP_INVITEE_USER_NAME);
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(
WorkflowModelNominatedInvitation.WF_PROP_RESOURCE_NAME);

View File

@@ -29,6 +29,9 @@ import java.util.List;
import java.util.Map;
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.ScriptNode;
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.service.ServiceRegistry;
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.security.PermissionService;
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.namespace.QName;
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.ScriptableObject;
@@ -594,6 +605,113 @@ public class Site implements Serializable
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
*

View File

@@ -46,6 +46,16 @@ public interface Invitation
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?
* @return the resource type
@@ -58,16 +68,16 @@ public interface Invitation
*/
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 ?
* @return the unique reference for this invitation
*/
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
{
/**
* 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 inviteeLastName
* @param inviteeEmail
* @param inviteeUserName the alfresco user name of the invitee, may be null for a new user
* @param Invitation.ResourceType resourceType
* @param resourceName
* @param inviteeRole
@@ -64,7 +98,6 @@ public interface InvitationService
String inviteeFirstName,
String inviteeLastName,
String inviteeEmail,
String inviteeUserName,
Invitation.ResourceType resourceType,
String resourceName,
String inviteeRole,

View File

@@ -37,12 +37,6 @@ package org.alfresco.service.cmr.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
* @return the roleName
@@ -55,4 +49,10 @@ public interface ModeratedInvitation extends Invitation
*/
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 String getInviteeUserName();
public String getInviteeFirstName();