- added webscript to get invite information for a given id and ticket

- invite response webscript now uses correct api and put/delete method and only requires invite id and ticket
- improved invite accept/reject pages ui, correct handling in case the invite has already been canceled
- fixed buggy digit-only usernames handling in memberships webscript
- slightly changed comment activities wording

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@10506 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Michael Ru
2008-08-22 19:58:31 +00:00
parent ad30bbbbbe
commit 03a08a20f9
23 changed files with 440 additions and 284 deletions

View File

@@ -3,12 +3,12 @@
<#assign username = firstName + " " + lastName>
</#if>
<entry xmlns='http://www.w3.org/2005/Atom'>
<title>New comment for ${(itemTitle!'')?html?xml}</title>
<title>${username?html?xml} commented on ${(itemTitle!'')?html?xml}</title>
<link rel="alternate" type="text/html" href="${(browsePostUrl!'')?xml}" />
<id>${id}</id>
<updated>${xmldate(date)}</updated>
<summary type="html">
<![CDATA[${username} added a comment to <a href="${(browseItemUrl!'')}">${(itemTitle!'unknown')?html}</a>]]>
<![CDATA[${username} commented on <a href="${(browseItemUrl!'')}">${(itemTitle!'unknown')?html}</a>]]>
</summary>
<author>
<name>${userId!""}</name>

View File

@@ -3,12 +3,12 @@
<#assign username = firstName + " " + lastName>
</#if>
<entry xmlns='http://www.w3.org/2005/Atom'>
<title>Comment deleted</title>
<title>${username} deleted comment</title>
<link rel="alternate" type="text/html" href="${(browsePostListUrl!'')?xml}" />
<id>${id}</id>
<updated>${xmldate(date)}</updated>
<summary type="html">
<![CDATA[${username} deleted comment on <a href="${(browseItemUrl!'')}">${(itemTitle!'unknown')?html}</a>]]>
<![CDATA[${username?html} deleted comment on <a href="${(browseItemUrl!'')}">${(itemTitle!'unknown')?html}</a>]]>
</summary>
<author>
<name>${userId!""}</name>

View File

@@ -3,12 +3,12 @@
<#assign username = firstName + " " + lastName>
</#if>
<entry xmlns='http://www.w3.org/2005/Atom'>
<title>Comment updated</title>
<title>${username?html?xml} updated comment</title>
<link rel="alternate" type="text/html" href="${(browsePostUrl!'')?xml}" />
<id>${id}</id>
<updated>${xmldate(date)}</updated>
<summary type="html">
<![CDATA[${username} updated comment on <a href="${(browseItemUrl!'')}">${(itemTitle!'unknown')?html}</a>]]>
<![CDATA[${username?html} updated comment on <a href="${(browseItemUrl!'')}">${(itemTitle!'unknown')?html}</a>]]>
</summary>
<author>
<name>${userId!""}</name>

View File

@@ -0,0 +1,8 @@
<webscript>
<shortname>Invite by ticket</shortname>
<description>Returns invite information for a given inviteId and inviteTicket. No authentication is required</description>
<url>/api/invite/{inviteId}/{inviteTicket}</url>
<format default="json"/>
<authentication>none</authentication>
<transaction>required</transaction>
</webscript>

View File

@@ -0,0 +1,4 @@
<#import "invite.lib.ftl" as inviteLib/>
{
"invite" : <@inviteLib.inviteJSON invite=invite/>
}

View File

@@ -3,6 +3,9 @@
<#if inviteId??>
"inviteId" : "${inviteId}",
</#if>
<#if inviteTicket??>
"inviteTicket" : "${inviteTicket}",
</#if>
<#if inviteeUserName??>
"inviteeUserName" : "${inviteeUserName}",
</#if>

View File

@@ -32,7 +32,12 @@
},
</#if>
"role" : "${invite.role}",
"siteShortName" : "${invite.siteShortName!''}",
"site" : {
"shortName" : "${invite.siteShortName!''}"
<#if invite.siteInfo??>
, "title" : "${invite.siteInfo.title}"
</#if>
},
"invitationStatus" : "${invite.invitationStatus}",
"sentInviteDate" : "${invite.sentInviteDate?string("MMM dd yyyy HH:mm:ss 'GMT'Z '('zzz')'")}"
}

View File

@@ -0,0 +1,8 @@
<webscript>
<shortname>Invite reject</shortname>
<description>Rejects an invite</description>
<url>/api/invite/{inviteId}/{inviteTicket}</url>
<format default="json"/>
<authentication>none</authentication>
<transaction>required</transaction>
</webscript>

View File

@@ -1,8 +0,0 @@
<webscript>
<shortname>Invite Response</shortname>
<description>Processes invite response from Invitee ({response} is either 'accept' or 'reject' )</description>
<url>/api/inviteresponse/{response}?inviteId={inviteId}&amp;inviteeUserName={inviteeUserName}&amp;siteShortName={siteShortName}</url>
<format default="json"/>
<authentication>none</authentication>
<transaction>required</transaction>
</webscript>

View File

@@ -1,7 +0,0 @@
<#if response == "accept">
<p>Your acceptance to join site ${siteShortName} has been processed</p>
<#elseif response == "reject">
<p>Your rejection to join site ${siteShortName} has been processed</p>
<#else>
<p>Error: unknown invite response ${response}</p>
</#if>

View File

@@ -0,0 +1,8 @@
<webscript>
<shortname>Invite accept</shortname>
<description>Accepts an invite</description>
<url>/api/invite/{inviteId}/{inviteTicket}</url>
<format default="json"/>
<authentication>none</authentication>
<transaction>required</transaction>
</webscript>

View File

@@ -0,0 +1,4 @@
{
"response" : "${response}",
"siteShortName" : "${siteShortName}"
}

View File

@@ -16,11 +16,13 @@ for (userName in memberships)
}
// also copy over the memberships.
var mems = [];
var mems = {};
var pos = 0; // memberships[userName] won't return the correct value if userName is a digit-only value
for (userName in memberships)
{
var membershipType = memberships[userName];
var membershipType = memberships[pos];
mems["_" + userName] = membershipType; // make sure the keys are strings
pos++;
}
// Pass the information to the template

View File

@@ -294,7 +294,6 @@
<property name="personService" ref="personService"/>
<property name="authenticationService" ref="authenticationService"/>
<property name="mutableAuthenticationDao" ref="authenticationDao"/>
<property name="namespaceService" ref="NamespaceService"/>
<property name="siteService" ref="SiteService"/>
<property name="nodeService" ref="NodeService"/>
<property name="userNameGenerator" ref="userNameGenerator"/>
@@ -302,18 +301,29 @@
</bean>
<!-- -->
<!-- Invite Response Web Script - invoked by Invitee to either 'accept' an invitation from a -->
<!-- Site Manager (Inviter), or to reject an invitation that has already been sent out -->
<!-- Invite Accept Web Script - accepts a pending invite -->
<!-- -->
<bean id="webscript.org.alfresco.repository.invite.inviteresponse.get"
<bean id="webscript.org.alfresco.repository.invite.inviteresponse.put"
class="org.alfresco.repo.web.scripts.invite.InviteResponse"
parent="webscript">
<property name="workflowService" ref="workflowServiceImpl"/>
<property name="mutableAuthenticationDao" ref="authenticationDao"/>
<property name="siteService" ref="siteService"/>
<property name="personService" ref="personService"/>
</bean>
<!-- -->
<!-- Invite Reject Web Script - rejects a pending invite -->
<!-- -->
<bean id="webscript.org.alfresco.repository.invite.inviteresponse.delete"
class="org.alfresco.repo.web.scripts.invite.InviteResponse"
parent="webscript">
<property name="workflowService" ref="workflowServiceImpl"/>
<property name="mutableAuthenticationDao" ref="authenticationDao"/>
<property name="siteService" ref="siteService"/>
<property name="personService" ref="personService"/>
<property name="namespaceService" ref="namespaceService"/>
</bean>
<!-- -->
@@ -326,11 +336,22 @@
class="org.alfresco.repo.web.scripts.invite.Invites"
parent="webscript">
<property name="workflowService" ref="WorkflowService"/>
<property name="namespaceService" ref="NamespaceService"/>
<property name="personService" ref="PersonService"/>
<property name="serviceRegistry" ref="ServiceRegistry"/>
<property name="siteService" ref="SiteService"/>
</bean>
<!-- -->
<!-- Returns invite information when for a given inviteId and inviteTicket -->
<!-- This webscript is accessible without authentication -->
<!-- -->
<bean id="webscript.org.alfresco.repository.invite.invite-by-ticket.get"
class="org.alfresco.repo.web.scripts.invite.InviteByTicket"
parent="webscript">
<property name="workflowService" ref="WorkflowService"/>
<property name="serviceRegistry" ref="ServiceRegistry"/>
<property name="siteService" ref="SiteService"/>
</bean>
<!-- -->

View File

@@ -45,9 +45,6 @@ import org.alfresco.service.cmr.workflow.WorkflowDefinition;
import org.alfresco.service.cmr.workflow.WorkflowPath;
import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.alfresco.service.cmr.workflow.WorkflowTaskQuery;
import org.alfresco.service.cmr.workflow.WorkflowTaskState;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.GUID;
import org.alfresco.web.scripts.DeclarativeWebScript;
@@ -67,10 +64,10 @@ public class Invite extends DeclarativeWebScript
{
private static final String ACTION_START = "start";
private static final String ACTION_CANCEL = "cancel";
private static final String TRANSITION_SEND_INVITE = "sendInvite";
private static final String MODEL_PROP_KEY_ACTION = "action";
private static final String MODEL_PROP_KEY_INVITE_ID = "inviteId";
private static final String MODEL_PROP_KEY_INVITE_TICKET = "inviteTicket";
private static final String MODEL_PROP_KEY_INVITEE_USER_NAME = "inviteeUserName";
private static final String MODEL_PROP_KEY_INVITEE_FIRSTNAME = "inviteeFirstName";
private static final String MODEL_PROP_KEY_INVITEE_LASTNAME = "inviteeLastName";
@@ -93,30 +90,12 @@ public class Invite extends DeclarativeWebScript
private PersonService personService;
private AuthenticationService authenticationService;
private MutableAuthenticationDao mutableAuthenticationDao;
private NamespaceService namespaceService;
private SiteService siteService;
private NodeService nodeService;
// user name and password generation beans
private UserNameGenerator usernameGenerator;
private PasswordGenerator passwordGenerator;
// workflow properties
public static final String WF_PROP_SERVER_PATH = "wf:serverPath";
public static final String WF_PROP_ACCEPT_URL = "wf:acceptUrl";
public static final String WF_PROP_REJECT_URL = "wf:rejectUrl";
public static final String WF_PROP_INVITE_TICKET = "wf:inviteTicket";
public static final String WF_PROP_INVITER_USER_NAME = "wf:inviterUserName";
public static final String WF_PROP_INVITEE_USER_NAME = "wf:inviteeUserName";
public static final String WF_PROP_INVITEE_FIRSTNAME = "wf:inviteeFirstName";
public static final String WF_PROP_INVITEE_LASTNAME = "wf:inviteeLastName";
public static final String WF_PROP_SITE_SHORT_NAME = "wf:siteShortName";
public static final String WF_PROP_INVITEE_SITE_ROLE = "wf:inviteeSiteRole";
public static final String WF_PROP_SENT_INVITE_DATE = "wf:sentInviteDate";
private static final String WF_PROP_INVITEE_GEN_PASSWORD = "wf:inviteeGenPassword";
public static final String WF_INVITE_TASK_INVITE_TO_SITE = "wf:inviteToSiteTask";
public static final String WORKFLOW_DEFINITION_NAME = "jbpm$wf:invite";
// maximum number of tries to generate a invitee user name which
// does not already belong to an existing person
@@ -168,17 +147,6 @@ public class Invite extends DeclarativeWebScript
this.mutableAuthenticationDao = mutableAuthenticationDao;
}
/**
* Set the namespace service
*
* @param namespaceService the namespace service to set
*/
public void setNamespaceService(
NamespaceService namespaceService)
{
this.namespaceService = namespaceService;
}
/**
* Set the user name generator service
*
@@ -454,7 +422,7 @@ public class Invite extends DeclarativeWebScript
* @param siteShortName
* @return whether there is an invite in progress
*/
private boolean isInviteAlreadyInProgress(String inviteeUserName, String siteShortName)
/*private boolean isInviteAlreadyInProgress(String inviteeUserName, String siteShortName)
{
// create workflow task query
WorkflowTaskQuery wfTaskQuery = new WorkflowTaskQuery();
@@ -462,16 +430,15 @@ public class Invite extends DeclarativeWebScript
// set query properties to look up task instances of inviteToSite task
// in active invite workflow instances
wfTaskQuery.setActive(Boolean.TRUE);
wfTaskQuery.setProcessName(QName.createQName("wf:invite", this.namespaceService));
wfTaskQuery.setProcessName(InviteWorkflowModel.WF_PROCESS_INVITE);
wfTaskQuery.setTaskState(WorkflowTaskState.COMPLETED);
wfTaskQuery.setTaskName(QName.createQName(Invite.WF_INVITE_TASK_INVITE_TO_SITE,
this.namespaceService));
wfTaskQuery.setTaskName(InviteWorkflowModel.WF_INVITE_TASK_INVITE_TO_SITE);
// set query process custom properties
HashMap<QName, Object> wfQueryProps = new HashMap<QName, Object>(2, 1.0f);
wfQueryProps.put(QName.createQName(Invite.WF_PROP_INVITEE_USER_NAME, this.namespaceService),
wfQueryProps.put(InviteWorkflowModel.WF_PROP_INVITEE_USER_NAME,
inviteeUserName);
wfQueryProps.put(QName.createQName(Invite.WF_PROP_SITE_SHORT_NAME, this.namespaceService),
wfQueryProps.put(InviteWorkflowModel.WF_PROP_SITE_SHORT_NAME,
siteShortName);
wfTaskQuery.setTaskCustomProps(wfQueryProps);
@@ -483,7 +450,7 @@ public class Invite extends DeclarativeWebScript
// throw web script exception if person (having the given invitee email address) already
// has an invitation in progress for the given site short name
return (inviteTasksInProgress.size() > 0);
}
}*/
/**
* Starts the Invite workflow
@@ -585,40 +552,40 @@ public class Invite extends DeclarativeWebScript
//
WorkflowDefinition wfDefinition = this.workflowService
.getDefinitionByName(WORKFLOW_DEFINITION_NAME);
.getDefinitionByName(InviteWorkflowModel.WORKFLOW_DEFINITION_NAME);
// handle workflow definition does not exist
if (wfDefinition == null)
{
throw new WebScriptException(Status.STATUS_INTERNAL_SERVER_ERROR,
"Workflow definition " + "for name "
+ WORKFLOW_DEFINITION_NAME + " does not exist");
+ InviteWorkflowModel.WORKFLOW_DEFINITION_NAME + " does not exist");
}
// create workflow properties
Map<QName, Serializable> workflowProps = new HashMap<QName, Serializable>(
7);
workflowProps.put(QName.createQName(WF_PROP_INVITER_USER_NAME, this.namespaceService),
workflowProps.put(InviteWorkflowModel.WF_PROP_INVITER_USER_NAME,
inviterUserName);
workflowProps.put(QName.createQName(WF_PROP_INVITEE_USER_NAME, this.namespaceService),
workflowProps.put(InviteWorkflowModel.WF_PROP_INVITEE_USER_NAME,
inviteeUserName);
workflowProps.put(QName.createQName(WF_PROP_INVITEE_FIRSTNAME, this.namespaceService),
workflowProps.put(InviteWorkflowModel.WF_PROP_INVITEE_FIRSTNAME,
inviteeFirstName);
workflowProps.put(QName.createQName(WF_PROP_INVITEE_LASTNAME, this.namespaceService),
workflowProps.put(InviteWorkflowModel.WF_PROP_INVITEE_LASTNAME,
inviteeLastName);
workflowProps.put(QName.createQName(WF_PROP_INVITEE_GEN_PASSWORD, this.namespaceService),
workflowProps.put(InviteWorkflowModel.WF_PROP_INVITEE_GEN_PASSWORD,
inviteePassword);
workflowProps.put(QName.createQName(WF_PROP_SITE_SHORT_NAME, this.namespaceService),
workflowProps.put(InviteWorkflowModel.WF_PROP_SITE_SHORT_NAME,
siteShortName);
workflowProps.put(QName.createQName(WF_PROP_INVITEE_SITE_ROLE, this.namespaceService),
workflowProps.put(InviteWorkflowModel.WF_PROP_INVITEE_SITE_ROLE,
inviteeSiteRole);
workflowProps.put(QName.createQName(WF_PROP_SERVER_PATH, this.namespaceService),
workflowProps.put(InviteWorkflowModel.WF_PROP_SERVER_PATH,
serverPath);
workflowProps.put(QName.createQName(WF_PROP_ACCEPT_URL, this.namespaceService),
workflowProps.put(InviteWorkflowModel.WF_PROP_ACCEPT_URL,
acceptUrl);
workflowProps.put(QName.createQName(WF_PROP_REJECT_URL, this.namespaceService),
workflowProps.put(InviteWorkflowModel.WF_PROP_REJECT_URL,
rejectUrl);
workflowProps.put(QName.createQName(WF_PROP_INVITE_TICKET, this.namespaceService),
workflowProps.put(InviteWorkflowModel.WF_PROP_INVITE_TICKET,
inviteTicket);
// start the workflow
@@ -644,11 +611,11 @@ public class Invite extends DeclarativeWebScript
// first task in workflow task list associated with the workflow path id above
// should be "wf:inviteToSiteTask", otherwise throw web script exception
String wfTaskTitle = wfTasks.get(0).title;
if (!wfTaskTitle.equals(WF_INVITE_TASK_INVITE_TO_SITE))
if (!wfTaskTitle.equals("wf:inviteToSiteTask"))
{
throw new WebScriptException(Status.STATUS_INTERNAL_SERVER_ERROR,
"First workflow task found on workflow path ID: " + wfPathId
+ " should be " + WF_INVITE_TASK_INVITE_TO_SITE);
+ " should be " + "wf:inviteToSiteTask");
}
// get "inviteToSite" task
@@ -660,11 +627,12 @@ public class Invite extends DeclarativeWebScript
Map<QName, Serializable> wfTaskProps = new HashMap<QName, Serializable>(1, 1.0f);
wfTaskProps.put(WorkflowModel.ASSOC_PACKAGE, wfPackage);
this.workflowService.updateTask(wfStartTask.id, wfTaskProps, null, null);
this.workflowService.endTask(wfStartTask.id, TRANSITION_SEND_INVITE);
this.workflowService.endTask(wfStartTask.id, InviteWorkflowModel.WF_TRANSITION_SEND_INVITE);
// add model properties for template to render
model.put(MODEL_PROP_KEY_ACTION, ACTION_START);
model.put(MODEL_PROP_KEY_INVITE_ID, workflowId);
model.put(MODEL_PROP_KEY_INVITE_TICKET, inviteTicket);
model.put(MODEL_PROP_KEY_INVITEE_USER_NAME, inviteeUserName);
model.put(MODEL_PROP_KEY_INVITEE_FIRSTNAME, inviteeFirstName);
model.put(MODEL_PROP_KEY_INVITEE_LASTNAME, inviteeLastName);

View File

@@ -0,0 +1,126 @@
/*
* Copyright (C) 2005-2007 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 received 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.web.scripts.invite;
import java.util.HashMap;
import java.util.Map;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.site.SiteService;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.alfresco.web.scripts.DeclarativeWebScript;
import org.alfresco.web.scripts.Status;
import org.alfresco.web.scripts.WebScriptException;
import org.alfresco.web.scripts.WebScriptRequest;
/**
* Web Script which returns invite information given an inviteId and inviteTicket.
*
* Note: This Web Script is accessible without authentication.
*
* @author glen dot johnson at alfresco dot com
*/
public class InviteByTicket extends DeclarativeWebScript
{
// service instances
private WorkflowService workflowService;
private ServiceRegistry serviceRegistry;
private SiteService siteService;
/**
* Set the workflow service property
*
* @param workflowService
* the workflow service to set
*/
public void setWorkflowService(WorkflowService workflowService)
{
this.workflowService = workflowService;
}
public void setServiceRegistry(ServiceRegistry serviceRegistry) {
this.serviceRegistry = serviceRegistry;
}
public void setSiteService(SiteService siteService) {
this.siteService = siteService;
}
/*
* (non-Javadoc)
*
* @see
* org.alfresco.web.scripts.DeclarativeWebScript#executeImpl(org.alfresco
* .web.scripts.WebScriptRequest,
* org.alfresco.web.scripts.WebScriptResponse)
*/
@Override
protected Map<String, Object> executeImpl(WebScriptRequest req,
Status status)
{
// initialise model to pass on for template to render
Map<String, Object> model = new HashMap<String, Object>();
// Extract inviteId and inviteTicket
String extPath = req.getExtensionPath();
int separatorIndex = extPath.indexOf('/');
if (separatorIndex < 0)
{
// should not happen as descriptor would not match
throw new WebScriptException(Status.STATUS_INTERNAL_SERVER_ERROR,
"Parameters missing");
}
String inviteId = extPath.substring(0, separatorIndex);
String inviteTicket = extPath.substring(separatorIndex + 1);
// authenticate as system for the rest of the webscript
AuthenticationUtil.setSystemUserAsCurrentUser();
// find the workflow for the given id
WorkflowTask workflowTask = InviteHelper.findInviteStartTask(inviteId, workflowService);
if (workflowTask == null)
{
throw new WebScriptException(Status.STATUS_NOT_FOUND,
"No invite found for given id");
}
// check whether tickets match, throw error otherwise
String ticket = (String) workflowTask.properties.get(
InviteWorkflowModel.WF_PROP_INVITE_TICKET);
if (ticket == null || (! ticket.equals(inviteTicket)))
{
throw new WebScriptException(Status.STATUS_NOT_FOUND,
"Ticket mismatch");
}
// return the invite info
InviteInfo inviteInfo = InviteHelper.getPendingInviteInfo(workflowTask, serviceRegistry, siteService);
model.put("invite", inviteInfo);
return model;
}
}

View File

@@ -24,8 +24,15 @@
*/
package org.alfresco.repo.web.scripts.invite;
import java.util.Date;
import java.util.List;
import org.alfresco.repo.jscript.ScriptNode;
import org.alfresco.repo.site.SiteInfo;
import org.alfresco.repo.site.SiteService;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.alfresco.service.cmr.workflow.WorkflowTaskQuery;
@@ -38,58 +45,98 @@ import org.alfresco.service.namespace.QName;
* more than one Invite Service Web Script
*/
public class InviteHelper
{
{
/**
* Gets the invitee site role from the invite
* workflow instance associated with the given invite ID.
* i.e. if the inviter 'starts' an invite (which is allocated some invite ID
* '12345' when it is processed), and that invite is requesting an invitee to
* to join some site under a given site role, then that site role is returned
* by this method when invite ID '12345' is passed in.
* Find an invite start task given the task id.
*
* @param inviteId the ID of the invitation (invite workflow instance)
* from which to retrieve the invitee site role
* @return the site role under which the invitee was invited to
* join the site. Returns <pre>null</pre> if no invite
* workflow instance was found matching the given invite ID
* @return a WorkflowTask or null if not found.
*/
static String getInviteeSiteRoleFromInvite(String inviteId, WorkflowService workflowService,
NamespaceService namespaceService)
public static WorkflowTask findInviteStartTask(String inviteId, WorkflowService workflowService)
{
// create workflow task query
WorkflowTaskQuery wfTaskQuery = new WorkflowTaskQuery();
wfTaskQuery.setProcessId(inviteId);
// set process name to "wf:invite" so that only tasks associated with
// invite workflow instances are returned by query
wfTaskQuery.setProcessName(QName.createQName("wf:invite", namespaceService));
wfTaskQuery.setProcessName(QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "invite"));
// pick up the start task because it has the "wf:inviteeSiteRole" property set with the
// site role value that we want to retrieve
wfTaskQuery.setTaskState(WorkflowTaskState.COMPLETED);
wfTaskQuery.setTaskName(QName.createQName(Invite.WF_INVITE_TASK_INVITE_TO_SITE, namespaceService));
wfTaskQuery.setTaskName(InviteWorkflowModel.WF_INVITE_TASK_INVITE_TO_SITE);
// query for invite workflow task associate
List<WorkflowTask> inviteStartTasks = workflowService
.queryTasks(wfTaskQuery);
// if no results were returned for given inviteID, then return
// site role as null
if (inviteStartTasks.size() == 0)
// should also be 0 or 1
if (inviteStartTasks.size() < 1)
{
return null;
}
else
{
// there should be only one start task returned for the given invite ID
// so just take the first one in the list
WorkflowTask inviteStartTask = inviteStartTasks.get(0);
String inviteeSiteRole = (String) inviteStartTask.properties.get(
QName.createQName(Invite.WF_PROP_INVITEE_SITE_ROLE, namespaceService));
return inviteeSiteRole;
return inviteStartTasks.get(0);
}
}
/**
* Returns an InviteInfo object usable for rendering the response.
*
* @return object containing invite information
*/
public static InviteInfo getPendingInviteInfo(WorkflowTask workflowTask,
ServiceRegistry serviceRegistry, SiteService siteService)
{
PersonService personService = serviceRegistry.getPersonService();
// get the inviter, invitee, role and site short name
String inviterUserNameProp = (String) workflowTask.properties.get(
InviteWorkflowModel.WF_PROP_INVITER_USER_NAME);
String inviteeUserNameProp = (String) workflowTask.properties.get(
InviteWorkflowModel.WF_PROP_INVITEE_USER_NAME);
String role = (String) workflowTask.properties.get(
InviteWorkflowModel.WF_PROP_INVITEE_SITE_ROLE);
String siteShortNameProp = (String) workflowTask.properties.get(
InviteWorkflowModel.WF_PROP_SITE_SHORT_NAME);
// fetch the site object
SiteInfo siteInfo = siteService.getSite(siteShortNameProp);
// get workflow instance id (associated with workflow task) to place
// as "inviteId" onto model
String workflowId = workflowTask.path.instance.id;
// set the invite start date to the time the workflow instance
// (associated with the task) was started
Date sentInviteDate = workflowTask.path.instance.startDate;
// TODO: glen johnson at alfresco com - as this web script only returns
// pending invites, this is hard coded to "pending" for now
String invitationStatus = InviteInfo.INVITATION_STATUS_PENDING;
// fetch the person node for the inviter
NodeRef inviterRef = personService.getPerson(inviterUserNameProp);
ScriptNode inviterPerson = null;
if (inviterRef != null)
{
inviterPerson = new ScriptNode(inviterRef, serviceRegistry);
}
// fetch the person node for the invitee
NodeRef inviteeRef = personService.getPerson(inviteeUserNameProp);
ScriptNode inviteePerson = null;
if (inviteeRef != null)
{
inviteePerson = new ScriptNode(inviteeRef, serviceRegistry);
}
// create and add InviteInfo to inviteInfoList
InviteInfo inviteInfo = new InviteInfo(invitationStatus, inviterUserNameProp, inviterPerson,
inviteeUserNameProp, inviteePerson, role, siteShortNameProp, siteInfo, sentInviteDate, workflowId);
return inviteInfo;
}
}

View File

@@ -27,6 +27,7 @@ package org.alfresco.repo.web.scripts.invite;
import java.util.Date;
import org.alfresco.repo.jscript.ScriptNode;
import org.alfresco.repo.site.SiteInfo;
/**
* Holds properties pertaining to an invitation that has been sent out by a Site Manager (Inviter)
@@ -36,6 +37,11 @@ import org.alfresco.repo.jscript.ScriptNode;
*/
public class InviteInfo
{
// invitation statuses
public static final String INVITATION_STATUS_PENDING = "pending";
public static final String INVITATION_STATUS_ACCEPTED = "accepted";
public static final String INVITATION_STATUS_REJECTED = "rejected";
// private instances to hold property values
private String invitationStatus;
private String inviterUserName;
@@ -44,12 +50,13 @@ public class InviteInfo
private ScriptNode inviteePerson;
private String role;
private String siteShortName;
private SiteInfo siteInfo;
private Date sentInviteDate;
private String inviteId;
public InviteInfo(String invitationStatus, String inviterUserName, ScriptNode inviterPerson,
String inviteeUserName, ScriptNode inviteePerson, String role,
String siteShortName, Date sentInviteDate, String inviteId)
String siteShortName, SiteInfo siteInfo, Date sentInviteDate, String inviteId)
{
this.invitationStatus = invitationStatus;
this.inviterUserName = inviterUserName;
@@ -58,6 +65,7 @@ public class InviteInfo
this.inviteePerson = inviteePerson;
this.role = role;
this.siteShortName = siteShortName;
this.siteInfo = siteInfo;
this.sentInviteDate = sentInviteDate;
this.inviteId = inviteId;
}
@@ -151,4 +159,9 @@ public class InviteInfo
{
return role;
}
public SiteInfo getSiteInfo() {
return siteInfo;
}
}

View File

@@ -37,7 +37,6 @@ import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.alfresco.service.cmr.workflow.WorkflowTaskQuery;
import org.alfresco.service.cmr.workflow.WorkflowTaskState;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.web.scripts.DeclarativeWebScript;
import org.alfresco.web.scripts.Status;
@@ -88,13 +87,6 @@ public class InviteResponse extends DeclarativeWebScript
private static final String RESPONSE_ACCEPT = "accept";
private static final String RESPONSE_REJECT = "reject";
private static final String WF_TASK_ACCEPT_INVITE = "wf:acceptInviteTask";
private static final String WF_TASK_REJECT_INVITE = "wf:rejectInviteTask";
private static final String WF_TASK_INVITE_PENDING = "wf:invitePendingTask";
private static final String WF_TRANSITION_ACCEPT = "accept";
private static final String WF_TRANSITION_REJECT = "reject";
private static final String WF_TRANSITION_ACCEPT_INVITE_END = "end";
private static final String WF_TRANSITION_REJECT_INVITE_END = "end";
private static final String MODEL_PROP_KEY_RESPONSE = "response";
private static final String MODEL_PROP_KEY_SITE_SHORT_NAME = "siteShortName";
private static final String USER_ADMIN = "admin";
@@ -104,7 +96,6 @@ public class InviteResponse extends DeclarativeWebScript
private MutableAuthenticationDao mutableAuthenticationDao;
private SiteService siteService;
private PersonService personService;
private NamespaceService namespaceService;
/**
* Sets the workflow service property
@@ -150,17 +141,6 @@ public class InviteResponse extends DeclarativeWebScript
{
this.personService = personService;
}
/**
* Sets the namespaceService property
*
* @param namespaceService
* the namespace service to set
*/
public void setNamespaceService(NamespaceService namespaceService)
{
this.namespaceService = namespaceService;
}
/*
* (non-Javadoc)
@@ -177,57 +157,52 @@ public class InviteResponse extends DeclarativeWebScript
// initialise model to pass on for template to render
Map<String, Object> model = new HashMap<String, Object>();
// get the URL parameter values
String inviteId = req.getParameter("inviteId");
String inviteeUserName = req.getParameter("inviteeUserName");
String siteShortName = req.getParameter("siteShortName");
// get the invite response value
String response = req.getExtensionPath();
// check that response has been provided
if ((response == null) || (response.length() == 0))
// Extract inviteId and inviteTicket
/*String extPath = req.getExtensionPath();
int separatorIndex = extPath.indexOf('/');
if (separatorIndex < 0)
{
// handle response not provided
throw new WebScriptException(Status.STATUS_BAD_REQUEST,
"response has not been provided as part of URL.");
// should not happen as descriptor would not match
throw new WebScriptException(Status.STATUS_INTERNAL_SERVER_ERROR,
"Parameters missing");
}
// check that invite id URL parameter has been provided
else if ((inviteId == null) || (inviteId.length() == 0))
String inviteId = extPath.substring(0, separatorIndex);
String inviteTicket = extPath.substring(separatorIndex + 1);*/
String inviteId = req.getServiceMatch().getTemplateVars().get("inviteId");
String inviteTicket = req.getServiceMatch().getTemplateVars().get("inviteTicket");
// fetch the start task - it might not exist if the workflow has been finished/canceled already
WorkflowTask inviteStartTask = InviteHelper.findInviteStartTask(inviteId, workflowService);
if (inviteStartTask == null)
{
// handle invite id not provided
throw new WebScriptException(Status.STATUS_BAD_REQUEST,
"invite id parameter has not been provided in the URL.");
throw new WebScriptException(Status.STATUS_NOT_FOUND,
"No invite workflow for given id found");
}
// check that inviteeUserName URL parameter has been provided
else if ((inviteeUserName == null) || (inviteeUserName.length() == 0))
// check the ticket for a match
String ticket = (String) inviteStartTask.properties.get(InviteWorkflowModel.WF_PROP_INVITE_TICKET);
if (ticket == null || (! ticket.equals(inviteTicket)))
{
// handle inviteeUserName not provided
throw new WebScriptException(Status.STATUS_BAD_REQUEST,
"inviteeUserName parameter has not been provided in the URL.");
throw new WebScriptException(Status.STATUS_NOT_FOUND,
"Invalid ticket");
}
// check that siteShortName URL parameter has been provided
else if ((siteShortName == null) || (siteShortName.length() == 0))
// process response
String method = req.getServiceMatch().getWebScript().getDescription().getMethod();
if (method.equals("PUT"))
{
// handle siteShortName not provided
acceptInvite(model, inviteId, inviteStartTask);
}
else if (method.equals("DELETE"))
{
rejectInvite(model, inviteId, inviteStartTask);
}
else
{
/* handle unrecognised method */
throw new WebScriptException(Status.STATUS_BAD_REQUEST,
"siteShortName parameter has not been provided in the URL.");
} else
{
// process response
if (response.equals(RESPONSE_ACCEPT))
{
acceptInvite(model, inviteId, inviteeUserName, siteShortName);
} else if (response.equals(RESPONSE_REJECT))
{
rejectInvite(model, inviteId, inviteeUserName, siteShortName);
} else
{
/* handle unrecognised response */
throw new WebScriptException(Status.STATUS_BAD_REQUEST,
"response, " + response
+ ", provided in URL has not been recognised.");
}
"method " + method + " is not supported by this webscript.");
}
return model;
@@ -241,17 +216,19 @@ public class InviteResponse extends DeclarativeWebScript
* for rendering
* @param inviteId
* ID of invite
* @param inviteeUserName
* user name of invitee
* @param siteShortName
* short name of site for which invitee is accepting
* invitation to join
* @param inviteStartTask
*/
private void acceptInvite(Map<String, Object> model, String inviteId,
String inviteeUserName, String siteShortName)
private void acceptInvite(Map<String, Object> model, String inviteId, WorkflowTask inviteStartTask)
{
String inviteeUserName = (String) inviteStartTask.properties.get(
InviteWorkflowModel.WF_PROP_INVITEE_USER_NAME);
String siteShortName = (String) inviteStartTask.properties.get(
InviteWorkflowModel.WF_PROP_SITE_SHORT_NAME);
String inviteeSiteRole = (String) inviteStartTask.properties.get(
InviteWorkflowModel.WF_PROP_INVITEE_SITE_ROLE);
// complete the wf:invitePendingTask task because the invitation has been accepted
completeInviteTask(inviteId, QName.createQName(WF_TASK_INVITE_PENDING, this.namespaceService), WF_TRANSITION_ACCEPT);
completeInviteTask(inviteId, InviteWorkflowModel.WF_TASK_INVITE_PENDING, InviteWorkflowModel.WF_TRANSITION_ACCEPT);
// TODO glen dot johnson at alfresco dot com - farm the code that follows (up until adding properties onto
// the model) out into workflow action class that gets run when task wf:acceptInviteTask
@@ -265,11 +242,7 @@ public class InviteResponse extends DeclarativeWebScript
{
this.mutableAuthenticationDao.setEnabled(inviteeUserName, true);
}
// retrieve the site role with which the invitee was invited to the site
String inviteeSiteRole = InviteHelper.getInviteeSiteRoleFromInvite(inviteId, this.workflowService,
this.namespaceService);
// add Invitee to Site with the site role that the inviter "started" the invite process with
RunAsWork<Boolean> setSiteMembershipWorker = new InviteResponse.SetSiteMembershipWorker(
siteShortName, inviteeUserName, inviteeSiteRole);
@@ -280,7 +253,7 @@ public class InviteResponse extends DeclarativeWebScript
// starting from above where wf:invitePendingTask is completed, up to here). This code
// block will soon be farmed out into a workflow action which gets executed when
// wf:acceptInviteTask gets completed
completeInviteTask(inviteId, QName.createQName(WF_TASK_ACCEPT_INVITE, this.namespaceService), WF_TRANSITION_ACCEPT_INVITE_END);
completeInviteTask(inviteId, InviteWorkflowModel.WF_TASK_ACCEPT_INVITE, InviteWorkflowModel.WF_TRANSITION_ACCEPT_INVITE_END);
// add model properties for template to render
model.put(MODEL_PROP_KEY_RESPONSE, RESPONSE_ACCEPT);
@@ -301,11 +274,15 @@ public class InviteResponse extends DeclarativeWebScript
* short name of site for which invitee is rejecting
* invitation to join
*/
private void rejectInvite(Map<String, Object> model, String inviteId,
String inviteeUserName, String siteShortName)
private void rejectInvite(Map<String, Object> model, String inviteId, WorkflowTask inviteStartTask)
{
String inviteeUserName = (String) inviteStartTask.properties.get(
InviteWorkflowModel.WF_PROP_INVITEE_USER_NAME);
String siteShortName = (String) inviteStartTask.properties.get(
InviteWorkflowModel.WF_PROP_SITE_SHORT_NAME);
// complete the wf:invitePendingTask task because the invitation has been accepted
completeInviteTask(inviteId, QName.createQName(WF_TASK_INVITE_PENDING, this.namespaceService), WF_TRANSITION_REJECT);
completeInviteTask(inviteId, InviteWorkflowModel.WF_TASK_INVITE_PENDING, InviteWorkflowModel.WF_TRANSITION_REJECT);
// TODO glen dot johnson at alfresco dot com - farm the code that follows (up until adding properties onto
// the model) out into workflow action class that gets run when task wf:rejectInviteTask
@@ -331,7 +308,7 @@ public class InviteResponse extends DeclarativeWebScript
// starting from above where wf:invitePendingTask is completed, up to here). This code
// block will soon be farmed out into a workflow action which gets executed when
// wf:rejectInviteTask gets completed
completeInviteTask(inviteId, QName.createQName(WF_TASK_REJECT_INVITE, this.namespaceService), WF_TRANSITION_REJECT_INVITE_END);
completeInviteTask(inviteId, InviteWorkflowModel.WF_TASK_REJECT_INVITE, InviteWorkflowModel.WF_TRANSITION_REJECT_INVITE_END);
// add model properties for template to render
model.put(MODEL_PROP_KEY_RESPONSE, RESPONSE_REJECT);
@@ -364,7 +341,7 @@ public class InviteResponse extends DeclarativeWebScript
// set process name to "wf:invite" so that only
// invite workflow instances are considered by this query
wfTaskQuery.setProcessName(QName.createQName("wf:invite", this.namespaceService));
wfTaskQuery.setProcessName(InviteWorkflowModel.WF_PROCESS_INVITE);
// query for invite workflow tasks with the constructed query
List<WorkflowTask> wf_invite_tasks = this.workflowService

View File

@@ -494,18 +494,16 @@ public class InviteServiceTest extends BaseWebScriptTest
// get hold of invite ID of started invite
String inviteId = result.getString("inviteId");
String inviteTicket = result.getString("inviteTicket");
// get hold of invitee user name that was generated as part of starting
// the invite
String inviteeUserName = result.getString("inviteeUserName");
// Invitee accepts invitation to a Site from Inviter
String acceptInviteUrl = URL_INVITERSP_SERVICE + "/"
+ INVITE_RSP_ACCEPT + "?inviteId=" + inviteId
+ "&inviteeUserName=" + inviteeUserName + "&siteShortName="
+ SITE_SHORT_NAME_INVITE_1;
MockHttpServletResponse response = getRequest(acceptInviteUrl,
Status.STATUS_OK);
String acceptInviteUrl = URL_INVITE_SERVICE + "/" + inviteId + "/" + inviteTicket;
MockHttpServletResponse response = putRequest(acceptInviteUrl,
Status.STATUS_OK, null, null);
//
// test that invitation represented by invite ID (of invitation started
@@ -530,17 +528,15 @@ public class InviteServiceTest extends BaseWebScriptTest
// get hold of invite ID of started invite
String inviteId = result.getString("inviteId");
String inviteTicket = result.getString("inviteTicket");
// get hold of invitee user name that was generated as part of starting
// the invite
String inviteeUserName = result.getString("inviteeUserName");
// Invitee rejects invitation to a Site from Inviter
String rejectInviteUrl = URL_INVITERSP_SERVICE + "/"
+ INVITE_RSP_REJECT + "?inviteId=" + inviteId
+ "&inviteeUserName=" + inviteeUserName + "&siteShortName="
+ SITE_SHORT_NAME_INVITE_1;
MockHttpServletResponse response = getRequest(rejectInviteUrl,
String rejectInviteUrl = URL_INVITE_SERVICE + "/" + inviteId + "/" + inviteTicket;
MockHttpServletResponse response = deleteRequest(rejectInviteUrl,
Status.STATUS_OK);
//
@@ -646,6 +642,6 @@ public class InviteServiceTest extends BaseWebScriptTest
JSONObject inviteJSONObj = getInvitesResult.getJSONArray("invites").getJSONObject(0);
assertEquals(siteShortName, inviteJSONObj.get("siteShortName"));
assertEquals(siteShortName, inviteJSONObj.getJSONObject("site").get("shortName"));
}
}

View File

@@ -0,0 +1,42 @@
package org.alfresco.repo.web.scripts.invite;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
public interface InviteWorkflowModel {
// process name
public static final QName WF_PROCESS_INVITE = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "invite");
// workflow definition name
public static final String WORKFLOW_DEFINITION_NAME = "jbpm$wf:invite";
// 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_TASK_ACCEPT_INVITE = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "acceptInviteTask");
public static final QName WF_TASK_REJECT_INVITE = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "rejectInviteTask");
public static final QName WF_TASK_INVITE_PENDING = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "invitePendingTask");
// transition names
public static final String WF_TRANSITION_SEND_INVITE = "sendInvite";
public static final String WF_TRANSITION_ACCEPT = "accept";
public static final String WF_TRANSITION_REJECT = "reject";
public static final String WF_TRANSITION_ACCEPT_INVITE_END = "end";
public static final String WF_TRANSITION_REJECT_INVITE_END = "end";
// workflow properties
public static final QName WF_PROP_SERVER_PATH = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "serverPath");
public static final QName WF_PROP_ACCEPT_URL = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "acceptUrl");
public static final QName WF_PROP_REJECT_URL = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "rejectUrl");
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_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_SITE_SHORT_NAME = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "siteShortName");
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_GEN_PASSWORD = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "inviteeGenPassword");
}

View File

@@ -25,20 +25,16 @@
package org.alfresco.repo.web.scripts.invite;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.alfresco.repo.jscript.ScriptNode;
import org.alfresco.repo.site.SiteService;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.cmr.workflow.WorkflowService;
import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.alfresco.service.cmr.workflow.WorkflowTaskQuery;
import org.alfresco.service.cmr.workflow.WorkflowTaskState;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.web.scripts.DeclarativeWebScript;
import org.alfresco.web.scripts.Status;
@@ -76,17 +72,11 @@ public class Invites extends DeclarativeWebScript
// model key names
private static final String MODEL_KEY_NAME_INVITES = "invites";
// invitation statuses
private static final String INVITATION_STATUS_PENDING = "pending";
private static final String INVITATION_STATUS_ACCEPTED = "accepted";
private static final String INVITATION_STATUS_REJECTED = "rejected";
// service instances
private WorkflowService workflowService;
private NamespaceService namespaceService;
private PersonService personService;
private ServiceRegistry serviceRegistry;
private SiteService siteService;
/**
* Set the workflow service property
@@ -99,25 +89,14 @@ public class Invites extends DeclarativeWebScript
this.workflowService = workflowService;
}
/**
* Set the namespace service
*
* @param namespaceService the namespace service to set
*/
public void setNamespaceService(
NamespaceService namespaceService)
{
this.namespaceService = namespaceService;
}
public void setPersonService(PersonService personService) {
this.personService = personService;
}
public void setServiceRegistry(ServiceRegistry serviceRegistry) {
this.serviceRegistry = serviceRegistry;
}
public void setSiteService(SiteService siteService) {
this.siteService = siteService;
}
/*
* (non-Javadoc)
*
@@ -204,17 +183,17 @@ public class Invites extends DeclarativeWebScript
1.0f);
if (inviterUserName != null)
{
wfQueryProps.put(QName.createQName(Invite.WF_PROP_INVITER_USER_NAME, this.namespaceService),
wfQueryProps.put(InviteWorkflowModel.WF_PROP_INVITER_USER_NAME,
inviterUserName);
}
if (inviteeUserName != null)
{
wfQueryProps.put(QName.createQName(Invite.WF_PROP_INVITEE_USER_NAME, this.namespaceService),
wfQueryProps.put(InviteWorkflowModel.WF_PROP_INVITEE_USER_NAME,
inviteeUserName);
}
if (siteShortName != null)
{
wfQueryProps.put(QName.createQName(Invite.WF_PROP_SITE_SHORT_NAME, this.namespaceService),
wfQueryProps.put(InviteWorkflowModel.WF_PROP_SITE_SHORT_NAME,
siteShortName);
}
@@ -227,12 +206,12 @@ public class Invites extends DeclarativeWebScript
// pick up the start task
wfTaskQuery.setTaskState(WorkflowTaskState.COMPLETED);
wfTaskQuery.setTaskName(QName.createQName(Invite.WF_INVITE_TASK_INVITE_TO_SITE, this.namespaceService));
wfTaskQuery.setTaskName(InviteWorkflowModel.WF_INVITE_TASK_INVITE_TO_SITE);
// set process name to "wf:invite" so that only tasks associated with
// invite workflow instances
// are returned by query
wfTaskQuery.setProcessName(QName.createQName("wf:invite", this.namespaceService));
wfTaskQuery.setProcessName(InviteWorkflowModel.WF_PROCESS_INVITE);
// query for invite workflow tasks
List<WorkflowTask> wf_invite_tasks = this.workflowService
@@ -247,48 +226,7 @@ public class Invites extends DeclarativeWebScript
// onto model for each invite workflow task returned by the query
for (WorkflowTask workflowTask : wf_invite_tasks)
{
// get wf:inviterUserName, wf:inviteeUserName, wf:siteShortName
// properties from workflow path associated with workflow task
String inviterUserNameProp = (String) workflowTask.properties.get(
QName.createQName(Invite.WF_PROP_INVITER_USER_NAME, this.namespaceService));
String inviteeUserNameProp = (String) workflowTask.properties.get(
QName.createQName(Invite.WF_PROP_INVITEE_USER_NAME, this.namespaceService));
String siteShortNameProp = (String) workflowTask.properties.get(
QName.createQName(Invite.WF_PROP_SITE_SHORT_NAME, this.namespaceService));
// get workflow instance id (associated with workflow task) to place
// as "inviteId" onto model
String workflowId = workflowTask.path.instance.id;
// set the invite start date to the time the workflow instance
// (associated with the task) was started
Date sentInviteDate = workflowTask.path.instance.startDate;
// get role that invitee was invited to the site as
String role = InviteHelper.getInviteeSiteRoleFromInvite(inviteId, workflowService, namespaceService);
// TODO: glen johnson at alfresco com - as this web script only returns
// pending invites, this is hard coded to "pending" for now
String invitationStatus = INVITATION_STATUS_PENDING;
// check whether we can find a person node for inviter/invitee
NodeRef inviterRef = personService.getPerson(inviterUserNameProp);
ScriptNode inviterPerson = null;
if (inviterRef != null)
{
inviterPerson = new ScriptNode(inviterRef, serviceRegistry);
}
NodeRef inviteeRef = personService.getPerson(inviteeUserNameProp);
ScriptNode inviteePerson = null;
if (inviteeRef != null)
{
inviteePerson = new ScriptNode(inviteeRef, serviceRegistry);
}
// create and add InviteInfo to inviteInfoList
InviteInfo inviteInfo = new InviteInfo(invitationStatus, inviterUserNameProp, inviterPerson,
inviteeUserNameProp, inviteePerson, role, siteShortNameProp, sentInviteDate, workflowId);
InviteInfo inviteInfo = InviteHelper.getPendingInviteInfo(workflowTask, serviceRegistry, siteService);
inviteInfoList.add(inviteInfo);
}
@@ -298,4 +236,5 @@ public class Invites extends DeclarativeWebScript
return model;
}
}