mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
MERGE DEV/3.2_INVITATION to HEAD
MOB-124 First cut of invitation service First cut group site membership git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@13378 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -6,29 +6,5 @@
|
|||||||
startup for beans in the Remote API project.
|
startup for beans in the Remote API project.
|
||||||
-->
|
-->
|
||||||
<beans>
|
<beans>
|
||||||
<bean id="remote-api.workflowBootstrap" parent="workflowDeployer">
|
|
||||||
<property name="workflowDefinitions">
|
|
||||||
<list>
|
|
||||||
<!-- Remote API invite workflow definition -->
|
|
||||||
<props>
|
|
||||||
<prop key="engineId">jbpm</prop>
|
|
||||||
<prop key="location">alfresco/workflow/invite_processdefinition.xml</prop>
|
|
||||||
<prop key="mimetype">text/xml</prop>
|
|
||||||
<prop key="redeploy">false</prop>
|
|
||||||
</props>
|
|
||||||
</list>
|
|
||||||
</property>
|
|
||||||
<property name="models">
|
|
||||||
<list>
|
|
||||||
<!-- Remote API invite workflow Model -->
|
|
||||||
<value>alfresco/workflow/invite-workflow-model.xml</value>
|
|
||||||
</list>
|
|
||||||
</property>
|
|
||||||
<property name="labels">
|
|
||||||
<list>
|
|
||||||
<!-- Remote API invite workflow Model -->
|
|
||||||
<value>alfresco/workflow/invite-workflow-messages</value>
|
|
||||||
</list>
|
|
||||||
</property>
|
|
||||||
</bean>
|
|
||||||
</beans>
|
</beans>
|
@@ -11,6 +11,7 @@
|
|||||||
"tagScope" : "${url.serviceContext + "/api/tagscopes/" + site.node.storeType + "/" + site.node.storeId + "/" + site.node.id}",
|
"tagScope" : "${url.serviceContext + "/api/tagscopes/" + site.node.storeType + "/" + site.node.storeId + "/" + site.node.id}",
|
||||||
</#if>
|
</#if>
|
||||||
"isPublic" : ${site.isPublic?string("true", "false")},
|
"isPublic" : ${site.isPublic?string("true", "false")},
|
||||||
|
"visibility" : "${site.visibility}",
|
||||||
<#if site.customProperties?size != 0>
|
<#if site.customProperties?size != 0>
|
||||||
"customProperties" :
|
"customProperties" :
|
||||||
{
|
{
|
||||||
|
@@ -6,10 +6,36 @@ function main()
|
|||||||
|
|
||||||
if (site != null)
|
if (site != null)
|
||||||
{
|
{
|
||||||
// Update the sites details
|
// Updafte the sites details
|
||||||
site.title = json.get("title");
|
if (json.has("title") == true)
|
||||||
site.description = json.get("description");
|
{
|
||||||
site.isPublic = json.getBoolean("isPublic");
|
site.title = json.get("title");
|
||||||
|
}
|
||||||
|
if (json.has("description") == true)
|
||||||
|
{
|
||||||
|
site.description = json.get("description");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use the visibility flag before the isPublic flag
|
||||||
|
if (json.has("visibility") == true)
|
||||||
|
{
|
||||||
|
site.visibility = json.get("visibility");
|
||||||
|
}
|
||||||
|
else if (json.has("isPublic") == true)
|
||||||
|
{
|
||||||
|
// Deal with deprecated isPublic flag accordingly
|
||||||
|
var isPublic = json.getBoolean("isPublic");
|
||||||
|
if (isPublic == true)
|
||||||
|
{
|
||||||
|
site.visibility = siteService.PUBLIC_SITE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
site.visibility = siteService.PRIVATE_SITE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save the site
|
||||||
site.save();
|
site.save();
|
||||||
|
|
||||||
// Pass the model to the template
|
// Pass the model to the template
|
||||||
|
@@ -8,15 +8,15 @@ function main()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// See if the shortName is available
|
// See if the shortName is available
|
||||||
var site = siteService.getSite(shortName);
|
var site = siteService.getSite(shortName);
|
||||||
if (site != null)
|
if (site != null)
|
||||||
{
|
{
|
||||||
status.setCode(status.STATUS_INTERNAL_SERVER_ERROR, "error.duplicateShortName");
|
status.setCode(status.STATUS_INTERNAL_SERVER_ERROR, "error.duplicateShortName");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var sitePreset = json.get("sitePreset");
|
var sitePreset = json.get("sitePreset");
|
||||||
if (shortName == null || shortName.length == 0)
|
if (shortName == null || shortName.length == 0)
|
||||||
{
|
{
|
||||||
status.setCode(status.STATUS_BAD_REQUEST, "Site preset missing when creating site");
|
status.setCode(status.STATUS_BAD_REQUEST, "Site preset missing when creating site");
|
||||||
@@ -25,10 +25,28 @@ function main()
|
|||||||
|
|
||||||
var title = json.get("title");
|
var title = json.get("title");
|
||||||
var description = json.get("description");
|
var description = json.get("description");
|
||||||
var isPublic = json.getBoolean("isPublic");
|
|
||||||
|
// Use the visibility flag before the isPublic flag
|
||||||
|
var visibility = siteService.PUBLIC_SITE;
|
||||||
|
if (json.has("visibility") == true)
|
||||||
|
{
|
||||||
|
visibility = json.get("visibility");
|
||||||
|
}
|
||||||
|
else if (json.has("isPublic") == true)
|
||||||
|
{
|
||||||
|
var isPublic = json.getBoolean("isPublic");
|
||||||
|
if (isPublic == true)
|
||||||
|
{
|
||||||
|
visibility = siteService.PUBLIC_SITE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
visibility = siteService.PRIVATE_SITE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Create the site
|
// Create the site
|
||||||
var site = siteService.createSite(sitePreset, shortName, title, description, isPublic);
|
var site = siteService.createSite(sitePreset, shortName, title, description, visibility);
|
||||||
|
|
||||||
// Put the created site into the model
|
// Put the created site into the model
|
||||||
model.site = site;
|
model.site = site;
|
||||||
|
@@ -1,40 +0,0 @@
|
|||||||
# Display labels for out-of-the-box Site-oriented Workflows
|
|
||||||
|
|
||||||
#
|
|
||||||
# Invite Workflow
|
|
||||||
#
|
|
||||||
|
|
||||||
wf_invite.workflow.title=Site Invite
|
|
||||||
wf_invite.workflow.description=Invite to a Share Site
|
|
||||||
|
|
||||||
# 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
|
|
||||||
|
|
||||||
# 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
|
|
@@ -1,69 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<model name="wf:invite-workflow-model" xmlns="http://www.alfresco.org/model/dictionary/1.0">
|
|
||||||
|
|
||||||
<imports>
|
|
||||||
<import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d" />
|
|
||||||
<import uri="http://www.alfresco.org/model/bpm/1.0" prefix="bpm" />
|
|
||||||
<import uri="http://www.alfresco.org/model/workflow/1.0" prefix="wf" />
|
|
||||||
</imports>
|
|
||||||
|
|
||||||
<types>
|
|
||||||
<!-- Custom Tasks -->
|
|
||||||
|
|
||||||
<type name="wf:inviteToSiteTask">
|
|
||||||
<parent>bpm:startTask</parent>
|
|
||||||
<properties>
|
|
||||||
<property name="wf:serverPath">
|
|
||||||
<type>d:text</type>
|
|
||||||
</property>
|
|
||||||
<property name="wf:acceptUrl">
|
|
||||||
<type>d:text</type>
|
|
||||||
</property>
|
|
||||||
<property name="wf:rejectUrl">
|
|
||||||
<type>d:text</type>
|
|
||||||
</property>
|
|
||||||
<property name="wf:inviteTicket">
|
|
||||||
<type>d:text</type>
|
|
||||||
</property>
|
|
||||||
<property name="wf:inviterUserName">
|
|
||||||
<type>d:text</type>
|
|
||||||
</property>
|
|
||||||
<property name="wf:inviteeUserName">
|
|
||||||
<type>d:text</type>
|
|
||||||
</property>
|
|
||||||
<property name="wf:inviteeFirstName">
|
|
||||||
<type>d:text</type>
|
|
||||||
</property>
|
|
||||||
<property name="wf:inviteeLastName">
|
|
||||||
<type>d:text</type>
|
|
||||||
</property>
|
|
||||||
<property name="wf:inviteeGenPassword">
|
|
||||||
<type>d:text</type>
|
|
||||||
</property>
|
|
||||||
<property name="wf:siteShortName">
|
|
||||||
<type>d:text</type>
|
|
||||||
</property>
|
|
||||||
<property name="wf:inviteeSiteRole">
|
|
||||||
<type>d:text</type>
|
|
||||||
</property>
|
|
||||||
</properties>
|
|
||||||
<mandatory-aspects>
|
|
||||||
<aspect>bpm:assignee</aspect>
|
|
||||||
</mandatory-aspects>
|
|
||||||
</type>
|
|
||||||
|
|
||||||
<type name="wf:invitePendingTask">
|
|
||||||
<parent>bpm:workflowTask</parent>
|
|
||||||
</type>
|
|
||||||
|
|
||||||
<type name="wf:acceptInviteTask">
|
|
||||||
<parent>bpm:workflowTask</parent>
|
|
||||||
</type>
|
|
||||||
|
|
||||||
<type name="wf:rejectInviteTask">
|
|
||||||
<parent>bpm:workflowTask</parent>
|
|
||||||
</type>
|
|
||||||
|
|
||||||
</types>
|
|
||||||
</model>
|
|
@@ -1,84 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="wf:invite">
|
|
||||||
|
|
||||||
<swimlane name="initiator"/>
|
|
||||||
|
|
||||||
<start-state name="start">
|
|
||||||
<task name="wf:inviteToSiteTask" swimlane="initiator" />
|
|
||||||
<transition name="sendInvite" to="invitePending">
|
|
||||||
<action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
|
|
||||||
<script>
|
|
||||||
var workflowId = workflowinstanceid;
|
|
||||||
var inviterPerson = people.getPerson(wf_inviterUserName);
|
|
||||||
var inviteePerson = people.getPerson(wf_inviteeUserName);
|
|
||||||
var site = siteService.getSite(wf_siteShortName);
|
|
||||||
var siteName = site.shortName;
|
|
||||||
if (site.title.length() > 0)
|
|
||||||
{
|
|
||||||
siteName = site.title;
|
|
||||||
}
|
|
||||||
var params = "?inviteId=" + workflowId +
|
|
||||||
"&inviteeUserName=" + wf_inviteeUserName +
|
|
||||||
"&siteShortName=" + wf_siteShortName +
|
|
||||||
"&inviteTicket=" + wf_inviteTicket;
|
|
||||||
var acceptLink = wf_serverPath + wf_acceptUrl + params;
|
|
||||||
var rejectLink = wf_serverPath + wf_rejectUrl + params;
|
|
||||||
var mail = actions.create("mail");
|
|
||||||
mail.parameters.from = inviterPerson.properties["cm:email"];
|
|
||||||
mail.parameters.to = inviteePerson.properties["cm:email"];
|
|
||||||
mail.parameters.subject = "Invitation to join '" + siteName + "' site";
|
|
||||||
|
|
||||||
var results = search.luceneSearch(" PATH:\"app:company_home/app:dictionary/app:email_templates/cm:invite/cm:invite-email.ftl\"");
|
|
||||||
var template = results[0];
|
|
||||||
|
|
||||||
var args = [];
|
|
||||||
args["inviteePersonRef"] = inviteePerson.nodeRef.toString();
|
|
||||||
args["inviterPersonRef"] = inviterPerson.nodeRef.toString();
|
|
||||||
args["siteName"] = siteName;
|
|
||||||
args["inviteeSiteRole"] = wf_inviteeSiteRole;
|
|
||||||
args["inviteeUserName"] = wf_inviteeUserName;
|
|
||||||
args["inviteeGenPassword"] = wf_inviteeGenPassword;
|
|
||||||
args["acceptLink"] = acceptLink;
|
|
||||||
args["rejectLink"] = rejectLink;
|
|
||||||
var mail_text = inviteePerson.processTemplate(template, args);
|
|
||||||
|
|
||||||
mail.parameters.text = mail_text;
|
|
||||||
mail.execute(bpm_package);
|
|
||||||
</script>
|
|
||||||
</action>
|
|
||||||
</transition>
|
|
||||||
</start-state>
|
|
||||||
|
|
||||||
<swimlane name="assignee">
|
|
||||||
<assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
|
|
||||||
<actor>#{bpm_assignee.properties['cm:userName']}</actor>
|
|
||||||
</assignment>
|
|
||||||
</swimlane>
|
|
||||||
|
|
||||||
<task-node name="invitePending">
|
|
||||||
<task name="wf:invitePendingTask" swimlane="assignee" />
|
|
||||||
<transition name="accept" to="inviteAccepted">
|
|
||||||
<action class="org.alfresco.repo.web.scripts.invite.AcceptInviteAction"/>
|
|
||||||
</transition>
|
|
||||||
<transition name="reject" to="inviteRejected">
|
|
||||||
<action class="org.alfresco.repo.web.scripts.invite.RejectInviteAction"/>
|
|
||||||
</transition>
|
|
||||||
<transition name="cancel" to="end">
|
|
||||||
<action class="org.alfresco.repo.web.scripts.invite.CancelInviteAction"/>
|
|
||||||
</transition>
|
|
||||||
</task-node>
|
|
||||||
|
|
||||||
<task-node name="inviteAccepted">
|
|
||||||
<task name="wf:acceptInviteTask" swimlane="initiator" />
|
|
||||||
<transition name="end" to="end"/>
|
|
||||||
</task-node>
|
|
||||||
|
|
||||||
<task-node name="inviteRejected">
|
|
||||||
<task name="wf:rejectInviteTask" swimlane="initiator" />
|
|
||||||
<transition name="end" to="end"/>
|
|
||||||
</task-node>
|
|
||||||
|
|
||||||
<end-state name="end" />
|
|
||||||
|
|
||||||
</process-definition>
|
|
@@ -31,9 +31,9 @@ import java.util.Map;
|
|||||||
|
|
||||||
import org.alfresco.error.AlfrescoRuntimeException;
|
import org.alfresco.error.AlfrescoRuntimeException;
|
||||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||||
import org.alfresco.repo.site.SiteInfo;
|
|
||||||
import org.alfresco.repo.site.SiteService;
|
|
||||||
import org.alfresco.service.cmr.activities.ActivityService;
|
import org.alfresco.service.cmr.activities.ActivityService;
|
||||||
|
import org.alfresco.service.cmr.site.SiteInfo;
|
||||||
|
import org.alfresco.service.cmr.site.SiteService;
|
||||||
import org.alfresco.util.JSONtoFmModel;
|
import org.alfresco.util.JSONtoFmModel;
|
||||||
import org.alfresco.web.scripts.DeclarativeWebScript;
|
import org.alfresco.web.scripts.DeclarativeWebScript;
|
||||||
import org.alfresco.web.scripts.Status;
|
import org.alfresco.web.scripts.Status;
|
||||||
|
@@ -30,12 +30,12 @@ import java.util.List;
|
|||||||
|
|
||||||
import org.alfresco.model.ContentModel;
|
import org.alfresco.model.ContentModel;
|
||||||
import org.alfresco.repo.security.authentication.AuthenticationComponent;
|
import org.alfresco.repo.security.authentication.AuthenticationComponent;
|
||||||
import org.alfresco.repo.site.SiteInfo;
|
|
||||||
import org.alfresco.repo.site.SiteModel;
|
import org.alfresco.repo.site.SiteModel;
|
||||||
import org.alfresco.repo.site.SiteService;
|
|
||||||
import org.alfresco.repo.web.scripts.BaseWebScriptTest;
|
import org.alfresco.repo.web.scripts.BaseWebScriptTest;
|
||||||
import org.alfresco.service.cmr.security.AuthenticationService;
|
import org.alfresco.service.cmr.security.AuthenticationService;
|
||||||
import org.alfresco.service.cmr.security.PersonService;
|
import org.alfresco.service.cmr.security.PersonService;
|
||||||
|
import org.alfresco.service.cmr.site.SiteInfo;
|
||||||
|
import org.alfresco.service.cmr.site.SiteService;
|
||||||
import org.alfresco.util.PropertyMap;
|
import org.alfresco.util.PropertyMap;
|
||||||
import org.alfresco.web.scripts.TestWebScriptServer.DeleteRequest;
|
import org.alfresco.web.scripts.TestWebScriptServer.DeleteRequest;
|
||||||
import org.alfresco.web.scripts.TestWebScriptServer.GetRequest;
|
import org.alfresco.web.scripts.TestWebScriptServer.GetRequest;
|
||||||
|
@@ -29,12 +29,12 @@ import java.util.List;
|
|||||||
|
|
||||||
import org.alfresco.model.ContentModel;
|
import org.alfresco.model.ContentModel;
|
||||||
import org.alfresco.repo.security.authentication.AuthenticationComponent;
|
import org.alfresco.repo.security.authentication.AuthenticationComponent;
|
||||||
import org.alfresco.repo.site.SiteInfo;
|
|
||||||
import org.alfresco.repo.site.SiteModel;
|
import org.alfresco.repo.site.SiteModel;
|
||||||
import org.alfresco.repo.site.SiteService;
|
|
||||||
import org.alfresco.repo.web.scripts.BaseWebScriptTest;
|
import org.alfresco.repo.web.scripts.BaseWebScriptTest;
|
||||||
import org.alfresco.service.cmr.security.AuthenticationService;
|
import org.alfresco.service.cmr.security.AuthenticationService;
|
||||||
import org.alfresco.service.cmr.security.PersonService;
|
import org.alfresco.service.cmr.security.PersonService;
|
||||||
|
import org.alfresco.service.cmr.site.SiteInfo;
|
||||||
|
import org.alfresco.service.cmr.site.SiteService;
|
||||||
import org.alfresco.util.PropertyMap;
|
import org.alfresco.util.PropertyMap;
|
||||||
import org.alfresco.web.scripts.TestWebScriptServer.DeleteRequest;
|
import org.alfresco.web.scripts.TestWebScriptServer.DeleteRequest;
|
||||||
import org.alfresco.web.scripts.TestWebScriptServer.GetRequest;
|
import org.alfresco.web.scripts.TestWebScriptServer.GetRequest;
|
||||||
|
@@ -1,94 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 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.SiteService;
|
|
||||||
import org.alfresco.repo.workflow.jbpm.JBPMSpringActionHandler;
|
|
||||||
import org.alfresco.service.ServiceRegistry;
|
|
||||||
import org.jbpm.graph.exe.ExecutionContext;
|
|
||||||
import org.springframework.beans.factory.BeanFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This class contains logic that gets executed when
|
|
||||||
* the wf:invitePendingTask in the invite workflow gets completed
|
|
||||||
* along the "accept" transition
|
|
||||||
*
|
|
||||||
* @author glen johnson at alfresco com
|
|
||||||
*/
|
|
||||||
public class AcceptInviteAction extends JBPMSpringActionHandler
|
|
||||||
{
|
|
||||||
private static final long serialVersionUID = 8133039174866049136L;
|
|
||||||
|
|
||||||
private SiteService siteService;
|
|
||||||
private MutableAuthenticationDao mutableAuthenticationDao;
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.alfresco.repo.workflow.jbpm.JBPMSpringActionHandler#initialiseHandler(org.springframework.beans.factory.BeanFactory)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected void initialiseHandler(BeanFactory factory)
|
|
||||||
{
|
|
||||||
ServiceRegistry services = (ServiceRegistry)factory.getBean(ServiceRegistry.SERVICE_REGISTRY);
|
|
||||||
mutableAuthenticationDao = (MutableAuthenticationDao) factory.getBean("authenticationDao");
|
|
||||||
siteService = services.getSiteService();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.jbpm.graph.def.ActionHandler#execute(org.jbpm.graph.exe.ExecutionContext)
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public void execute(final ExecutionContext executionContext) throws Exception
|
|
||||||
{
|
|
||||||
final String inviteeUserName = (String) executionContext.getVariable("wf_inviteeUserName");
|
|
||||||
final String siteShortName = (String) executionContext.getVariable("wf_siteShortName");
|
|
||||||
final String inviterUserName = (String) executionContext.getVariable("wf_inviterUserName");
|
|
||||||
final String inviteeSiteRole = (String) executionContext.getVariable("wf_inviteeSiteRole");
|
|
||||||
|
|
||||||
// if there is already a user account for the invitee and that account
|
|
||||||
// is disabled, then enable the account because he/she has accepted the
|
|
||||||
// site invitation
|
|
||||||
if ((this.mutableAuthenticationDao.userExists(inviteeUserName))
|
|
||||||
&& (this.mutableAuthenticationDao.getEnabled(inviteeUserName) == false))
|
|
||||||
{
|
|
||||||
this.mutableAuthenticationDao.setEnabled(inviteeUserName, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// add Invitee to Site with the site role that the inviter "started" the invite process with
|
|
||||||
AuthenticationUtil.runAs(new RunAsWork<Object>()
|
|
||||||
{
|
|
||||||
public Object doWork() throws Exception
|
|
||||||
{
|
|
||||||
AcceptInviteAction.this.siteService.setMembership(siteShortName,
|
|
||||||
inviteeUserName, inviteeSiteRole);
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}, inviterUserName);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,101 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 org.alfresco.repo.security.authentication.AuthenticationUtil;
|
|
||||||
import org.alfresco.repo.security.authentication.MutableAuthenticationDao;
|
|
||||||
import org.alfresco.repo.site.SiteModel;
|
|
||||||
import org.alfresco.repo.site.SiteService;
|
|
||||||
import org.alfresco.repo.workflow.jbpm.JBPMSpringActionHandler;
|
|
||||||
import org.alfresco.service.ServiceRegistry;
|
|
||||||
import org.alfresco.service.cmr.security.PersonService;
|
|
||||||
import org.alfresco.service.cmr.workflow.WorkflowService;
|
|
||||||
import org.alfresco.web.scripts.Status;
|
|
||||||
import org.alfresco.web.scripts.WebScriptException;
|
|
||||||
import org.jbpm.graph.exe.ExecutionContext;
|
|
||||||
import org.springframework.beans.factory.BeanFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This class contains logic that gets executed when
|
|
||||||
* the wf:invitePendingTask in the invite workflow gets cancelled
|
|
||||||
* along the "cancel" transition
|
|
||||||
*
|
|
||||||
* @author glen johnson at alfresco com
|
|
||||||
*/
|
|
||||||
public class CancelInviteAction extends JBPMSpringActionHandler
|
|
||||||
{
|
|
||||||
private static final long serialVersionUID = 776961141883350908L;
|
|
||||||
|
|
||||||
private MutableAuthenticationDao mutableAuthenticationDao;
|
|
||||||
private PersonService personService;
|
|
||||||
private WorkflowService workflowService;
|
|
||||||
private SiteService siteService;
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.alfresco.repo.workflow.jbpm.JBPMSpringActionHandler#initialiseHandler(org.springframework.beans.factory.BeanFactory)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected void initialiseHandler(BeanFactory factory)
|
|
||||||
{
|
|
||||||
ServiceRegistry services = (ServiceRegistry)factory.getBean(ServiceRegistry.SERVICE_REGISTRY);
|
|
||||||
mutableAuthenticationDao = (MutableAuthenticationDao) factory.getBean("authenticationDao");
|
|
||||||
personService = (PersonService) services.getPersonService();
|
|
||||||
workflowService = (WorkflowService) services.getWorkflowService();
|
|
||||||
siteService = (SiteService) services.getSiteService();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.jbpm.graph.def.ActionHandler#execute(org.jbpm.graph.exe.ExecutionContext)
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public void execute(final ExecutionContext executionContext) throws Exception
|
|
||||||
{
|
|
||||||
// get the invitee user name and site short name variables off the execution context
|
|
||||||
final String inviteeUserName = (String) executionContext.getVariable(
|
|
||||||
InviteWorkflowModel.wfVarInviteeUserName);
|
|
||||||
final String siteShortName = (String) executionContext.getVariable(
|
|
||||||
InviteWorkflowModel.wfVarSiteShortName);
|
|
||||||
final String inviteId = (String) executionContext.getVariable(
|
|
||||||
InviteWorkflowModel.wfVarWorkflowInstanceId);
|
|
||||||
|
|
||||||
// throw http status 'forbidden' Web Script Exception if current user is not a Site Manager of the site
|
|
||||||
// associated with the invite (identified by inviteID)
|
|
||||||
String currentUserName = AuthenticationUtil.getFullyAuthenticatedUser();
|
|
||||||
String currentUserSiteRole = this.siteService.getMembersRole(siteShortName, currentUserName);
|
|
||||||
if ((currentUserSiteRole == null) || (currentUserSiteRole.equals(SiteModel.SITE_MANAGER) == false))
|
|
||||||
{
|
|
||||||
throw new WebScriptException(Status.STATUS_FORBIDDEN,
|
|
||||||
"Current user '" + currentUserName + "' cannot cancel invite having ID '" + inviteId
|
|
||||||
+ "' because he\\she is not a Site Manager of the site with short name:'" + siteShortName
|
|
||||||
+ "'");
|
|
||||||
}
|
|
||||||
|
|
||||||
// clean up invitee's user account and person node if they are not in use i.e.
|
|
||||||
// account is still disabled and there are no pending invites outstanding for the
|
|
||||||
// invitee
|
|
||||||
InviteHelper.cleanUpStaleInviteeResources(inviteeUserName, mutableAuthenticationDao, personService,
|
|
||||||
workflowService);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -31,20 +31,24 @@ import java.util.Map;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.alfresco.model.ContentModel;
|
import org.alfresco.model.ContentModel;
|
||||||
|
import org.alfresco.repo.invitation.WorkflowModelNominatedInvitation;
|
||||||
|
import org.alfresco.repo.invitation.site.InviteHelper;
|
||||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||||
import org.alfresco.repo.security.authentication.MutableAuthenticationDao;
|
import org.alfresco.repo.security.authentication.MutableAuthenticationDao;
|
||||||
import org.alfresco.repo.security.authentication.PasswordGenerator;
|
import org.alfresco.repo.security.authentication.PasswordGenerator;
|
||||||
import org.alfresco.repo.security.authentication.UserNameGenerator;
|
import org.alfresco.repo.security.authentication.UserNameGenerator;
|
||||||
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
|
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
|
||||||
import org.alfresco.repo.site.SiteModel;
|
import org.alfresco.repo.site.SiteModel;
|
||||||
import org.alfresco.repo.site.SiteService;
|
|
||||||
import org.alfresco.repo.workflow.WorkflowModel;
|
import org.alfresco.repo.workflow.WorkflowModel;
|
||||||
|
import org.alfresco.service.cmr.invitation.Invitation;
|
||||||
|
import org.alfresco.service.cmr.invitation.InvitationExceptionForbidden;
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
import org.alfresco.service.cmr.repository.NodeService;
|
import org.alfresco.service.cmr.repository.NodeService;
|
||||||
import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter;
|
import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter;
|
||||||
import org.alfresco.service.cmr.security.AuthenticationService;
|
import org.alfresco.service.cmr.security.AuthenticationService;
|
||||||
import org.alfresco.service.cmr.security.PermissionService;
|
import org.alfresco.service.cmr.security.PermissionService;
|
||||||
import org.alfresco.service.cmr.security.PersonService;
|
import org.alfresco.service.cmr.security.PersonService;
|
||||||
|
import org.alfresco.service.cmr.site.SiteService;
|
||||||
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
|
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
|
||||||
import org.alfresco.service.cmr.workflow.WorkflowException;
|
import org.alfresco.service.cmr.workflow.WorkflowException;
|
||||||
import org.alfresco.service.cmr.workflow.WorkflowPath;
|
import org.alfresco.service.cmr.workflow.WorkflowPath;
|
||||||
@@ -374,7 +378,14 @@ public class Invite extends DeclarativeWebScript
|
|||||||
}
|
}
|
||||||
|
|
||||||
// process action 'cancel' with provided parameters
|
// process action 'cancel' with provided parameters
|
||||||
cancelInvite(model, inviteId);
|
try
|
||||||
|
{
|
||||||
|
cancelInvite(model, inviteId);
|
||||||
|
}
|
||||||
|
catch(InvitationExceptionForbidden fe)
|
||||||
|
{
|
||||||
|
throw new WebScriptException(Status.STATUS_FORBIDDEN, "Unable to cancel workflow" , fe);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// handle action not recognised
|
// handle action not recognised
|
||||||
else
|
else
|
||||||
@@ -589,16 +600,16 @@ public class Invite extends DeclarativeWebScript
|
|||||||
//
|
//
|
||||||
|
|
||||||
WorkflowDefinition wfDefinition = this.workflowService
|
WorkflowDefinition wfDefinition = this.workflowService
|
||||||
.getDefinitionByName(InviteWorkflowModel.WORKFLOW_DEFINITION_NAME);
|
.getDefinitionByName(WorkflowModelNominatedInvitation.WORKFLOW_DEFINITION_NAME);
|
||||||
|
|
||||||
// handle workflow definition does not exist
|
// handle workflow definition does not exist
|
||||||
if (wfDefinition == null)
|
if (wfDefinition == null)
|
||||||
{
|
{
|
||||||
if (logger.isInfoEnabled())
|
if (logger.isInfoEnabled())
|
||||||
logger.info("Workflow definition for name " + InviteWorkflowModel.WORKFLOW_DEFINITION_NAME + " does not exist.");
|
logger.info("Workflow definition for name " + WorkflowModelNominatedInvitation.WORKFLOW_DEFINITION_NAME + " does not exist.");
|
||||||
|
|
||||||
throw new WebScriptException(Status.STATUS_INTERNAL_SERVER_ERROR,
|
throw new WebScriptException(Status.STATUS_INTERNAL_SERVER_ERROR,
|
||||||
"Workflow definition for name " + InviteWorkflowModel.WORKFLOW_DEFINITION_NAME + " does not exist.");
|
"Workflow definition for name " + WorkflowModelNominatedInvitation.WORKFLOW_DEFINITION_NAME + " does not exist.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get invitee person NodeRef to add as assignee
|
// Get invitee person NodeRef to add as assignee
|
||||||
@@ -606,18 +617,19 @@ public class Invite extends DeclarativeWebScript
|
|||||||
|
|
||||||
// create workflow properties
|
// create workflow properties
|
||||||
Map<QName, Serializable> workflowProps = new HashMap<QName, Serializable>(16);
|
Map<QName, Serializable> workflowProps = new HashMap<QName, Serializable>(16);
|
||||||
workflowProps.put(InviteWorkflowModel.WF_PROP_INVITER_USER_NAME, inviterUserName);
|
workflowProps.put(WorkflowModelNominatedInvitation.WF_PROP_INVITER_USER_NAME, inviterUserName);
|
||||||
workflowProps.put(InviteWorkflowModel.WF_PROP_INVITEE_USER_NAME, inviteeUserName);
|
workflowProps.put(WorkflowModelNominatedInvitation.WF_PROP_INVITEE_USER_NAME, inviteeUserName);
|
||||||
workflowProps.put(WorkflowModel.ASSOC_ASSIGNEE, inviteeNodeRef);
|
workflowProps.put(WorkflowModel.ASSOC_ASSIGNEE, inviteeNodeRef);
|
||||||
workflowProps.put(InviteWorkflowModel.WF_PROP_INVITEE_FIRSTNAME, inviteeFirstName);
|
workflowProps.put(WorkflowModelNominatedInvitation.WF_PROP_INVITEE_FIRSTNAME, inviteeFirstName);
|
||||||
workflowProps.put(InviteWorkflowModel.WF_PROP_INVITEE_LASTNAME, inviteeLastName);
|
workflowProps.put(WorkflowModelNominatedInvitation.WF_PROP_INVITEE_LASTNAME, inviteeLastName);
|
||||||
workflowProps.put(InviteWorkflowModel.WF_PROP_INVITEE_GEN_PASSWORD, inviteePassword);
|
workflowProps.put(WorkflowModelNominatedInvitation.WF_PROP_INVITEE_GEN_PASSWORD, inviteePassword);
|
||||||
workflowProps.put(InviteWorkflowModel.WF_PROP_SITE_SHORT_NAME, siteShortName);
|
workflowProps.put(WorkflowModelNominatedInvitation.WF_PROP_RESOURCE_TYPE, Invitation.ResourceType.WEB_SITE);
|
||||||
workflowProps.put(InviteWorkflowModel.WF_PROP_INVITEE_SITE_ROLE, inviteeSiteRole);
|
workflowProps.put(WorkflowModelNominatedInvitation.WF_PROP_RESOURCE_NAME, siteShortName);
|
||||||
workflowProps.put(InviteWorkflowModel.WF_PROP_SERVER_PATH, serverPath);
|
workflowProps.put(WorkflowModelNominatedInvitation.WF_PROP_INVITEE_SITE_ROLE, inviteeSiteRole);
|
||||||
workflowProps.put(InviteWorkflowModel.WF_PROP_ACCEPT_URL, acceptUrl);
|
workflowProps.put(WorkflowModelNominatedInvitation.WF_PROP_SERVER_PATH, serverPath);
|
||||||
workflowProps.put(InviteWorkflowModel.WF_PROP_REJECT_URL, rejectUrl);
|
workflowProps.put(WorkflowModelNominatedInvitation.WF_PROP_ACCEPT_URL, acceptUrl);
|
||||||
workflowProps.put(InviteWorkflowModel.WF_PROP_INVITE_TICKET, inviteTicket);
|
workflowProps.put(WorkflowModelNominatedInvitation.WF_PROP_REJECT_URL, rejectUrl);
|
||||||
|
workflowProps.put(WorkflowModelNominatedInvitation.WF_PROP_INVITE_TICKET, inviteTicket);
|
||||||
|
|
||||||
// start the workflow
|
// start the workflow
|
||||||
WorkflowPath wfPath = this.workflowService.startWorkflow(wfDefinition.getId(), workflowProps);
|
WorkflowPath wfPath = this.workflowService.startWorkflow(wfDefinition.getId(), workflowProps);
|
||||||
@@ -649,7 +661,7 @@ public class Invite extends DeclarativeWebScript
|
|||||||
|
|
||||||
String wfTaskName = wfTasks.get(0).name;
|
String wfTaskName = wfTasks.get(0).name;
|
||||||
QName wfTaskNameQName = QName.createQName(wfTaskName, this.namespaceService);
|
QName wfTaskNameQName = QName.createQName(wfTaskName, this.namespaceService);
|
||||||
QName inviteToSiteTaskQName = InviteWorkflowModel.WF_INVITE_TASK_INVITE_TO_SITE;
|
QName inviteToSiteTaskQName = WorkflowModelNominatedInvitation.WF_INVITE_TASK_INVITE_TO_SITE;
|
||||||
if (!wfTaskNameQName.equals(inviteToSiteTaskQName))
|
if (!wfTaskNameQName.equals(inviteToSiteTaskQName))
|
||||||
{
|
{
|
||||||
if (logger.isInfoEnabled())
|
if (logger.isInfoEnabled())
|
||||||
@@ -679,7 +691,7 @@ public class Invite extends DeclarativeWebScript
|
|||||||
logger.debug("Transitioning Invite workflow task...");
|
logger.debug("Transitioning Invite workflow task...");
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
this.workflowService.endTask(wfStartTask.id, InviteWorkflowModel.WF_TRANSITION_SEND_INVITE);
|
this.workflowService.endTask(wfStartTask.id, WorkflowModelNominatedInvitation.WF_TRANSITION_SEND_INVITE);
|
||||||
}
|
}
|
||||||
catch (RuntimeException err)
|
catch (RuntimeException err)
|
||||||
{
|
{
|
||||||
@@ -723,9 +735,14 @@ public class Invite extends DeclarativeWebScript
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
// complete the wf:invitePendingTask along the 'cancel' transition because the invitation has been cancelled
|
// complete the wf:invitePendingTask along the 'cancel' transition because the invitation has been cancelled
|
||||||
InviteHelper.completeInviteTask(inviteId, InviteWorkflowModel.WF_INVITE_TASK_INVITE_PENDING,
|
InviteHelper.completeInviteTask(inviteId, WorkflowModelNominatedInvitation.WF_INVITE_TASK_INVITE_PENDING,
|
||||||
InviteWorkflowModel.WF_TRANSITION_CANCEL, this.workflowService);
|
WorkflowModelNominatedInvitation.WF_TRANSITION_CANCEL, this.workflowService);
|
||||||
}
|
}
|
||||||
|
catch(InvitationExceptionForbidden fe)
|
||||||
|
{
|
||||||
|
throw new WebScriptException(Status.STATUS_FORBIDDEN, "Unable to cancel workflow" , fe);
|
||||||
|
}
|
||||||
|
|
||||||
catch (WorkflowException wfe)
|
catch (WorkflowException wfe)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -734,7 +751,12 @@ public class Invite extends DeclarativeWebScript
|
|||||||
//
|
//
|
||||||
|
|
||||||
Throwable indirectCause = wfe.getCause().getCause();
|
Throwable indirectCause = wfe.getCause().getCause();
|
||||||
if (indirectCause instanceof WebScriptException)
|
|
||||||
|
if(indirectCause instanceof InvitationExceptionForbidden)
|
||||||
|
{
|
||||||
|
throw new WebScriptException(Status.STATUS_FORBIDDEN, "Unable to cancel workflow" , indirectCause);
|
||||||
|
}
|
||||||
|
else if (indirectCause instanceof WebScriptException)
|
||||||
{
|
{
|
||||||
WebScriptException wse = (WebScriptException) indirectCause;
|
WebScriptException wse = (WebScriptException) indirectCause;
|
||||||
throw wse;
|
throw wse;
|
||||||
|
@@ -27,9 +27,12 @@ package org.alfresco.repo.web.scripts.invite;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.alfresco.repo.invitation.WorkflowModelNominatedInvitation;
|
||||||
|
import org.alfresco.repo.invitation.site.InviteHelper;
|
||||||
|
import org.alfresco.repo.invitation.site.InviteInfo;
|
||||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||||
import org.alfresco.repo.site.SiteService;
|
|
||||||
import org.alfresco.service.ServiceRegistry;
|
import org.alfresco.service.ServiceRegistry;
|
||||||
|
import org.alfresco.service.cmr.site.SiteService;
|
||||||
import org.alfresco.service.cmr.workflow.WorkflowService;
|
import org.alfresco.service.cmr.workflow.WorkflowService;
|
||||||
import org.alfresco.service.cmr.workflow.WorkflowTask;
|
import org.alfresco.service.cmr.workflow.WorkflowTask;
|
||||||
import org.alfresco.web.scripts.DeclarativeWebScript;
|
import org.alfresco.web.scripts.DeclarativeWebScript;
|
||||||
@@ -103,7 +106,7 @@ public class InviteByTicket extends DeclarativeWebScript
|
|||||||
|
|
||||||
// check whether tickets match, throw error otherwise
|
// check whether tickets match, throw error otherwise
|
||||||
String ticket = (String) workflowTask.properties.get(
|
String ticket = (String) workflowTask.properties.get(
|
||||||
InviteWorkflowModel.WF_PROP_INVITE_TICKET);
|
WorkflowModelNominatedInvitation.WF_PROP_INVITE_TICKET);
|
||||||
if (ticket == null || (! ticket.equals(inviteTicket)))
|
if (ticket == null || (! ticket.equals(inviteTicket)))
|
||||||
{
|
{
|
||||||
throw new WebScriptException(Status.STATUS_NOT_FOUND,
|
throw new WebScriptException(Status.STATUS_NOT_FOUND,
|
||||||
|
@@ -1,268 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.Date;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
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.SiteInfo;
|
|
||||||
import org.alfresco.repo.site.SiteService;
|
|
||||||
import org.alfresco.repo.template.TemplateNode;
|
|
||||||
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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper class to house utility methods common to
|
|
||||||
* more than one Invite Service Web Script
|
|
||||||
*/
|
|
||||||
public class InviteHelper
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Find an invite start task by the given task id.
|
|
||||||
*
|
|
||||||
* @return a WorkflowTask or null if not found.
|
|
||||||
*/
|
|
||||||
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(NamespaceService.WORKFLOW_MODEL_1_0_URI, "invite"));
|
|
||||||
|
|
||||||
// filter to find only the invite start task
|
|
||||||
wfTaskQuery.setTaskState(WorkflowTaskState.COMPLETED);
|
|
||||||
wfTaskQuery.setTaskName(InviteWorkflowModel.WF_INVITE_TASK_INVITE_TO_SITE);
|
|
||||||
|
|
||||||
// query for invite workflow task associate
|
|
||||||
List<WorkflowTask> inviteStartTasks = workflowService
|
|
||||||
.queryTasks(wfTaskQuery);
|
|
||||||
|
|
||||||
// should also be 0 or 1
|
|
||||||
if (inviteStartTasks.size() < 1)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return inviteStartTasks.get(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Find invitePending tasks (in-progress) by the given invitee user name
|
|
||||||
*
|
|
||||||
* @return a list of workflow tasks
|
|
||||||
*/
|
|
||||||
public static List<WorkflowTask> findInvitePendingTasks(String inviteeUserName, WorkflowService workflowService)
|
|
||||||
{
|
|
||||||
// create workflow task query
|
|
||||||
WorkflowTaskQuery wfTaskQuery = new WorkflowTaskQuery();
|
|
||||||
|
|
||||||
// set process name to "wf:invite" so that only tasks associated with
|
|
||||||
// invite workflow instances are returned by query
|
|
||||||
wfTaskQuery.setProcessName(InviteWorkflowModel.WF_PROCESS_INVITE);
|
|
||||||
|
|
||||||
// set query to only pick up invite workflow instances
|
|
||||||
// associated with the given invitee user name
|
|
||||||
Map<QName, Object> processCustomProps = new HashMap<QName, Object>(1, 1.0f);
|
|
||||||
processCustomProps.put(InviteWorkflowModel.WF_PROP_INVITEE_USER_NAME, inviteeUserName);
|
|
||||||
wfTaskQuery.setProcessCustomProps(processCustomProps);
|
|
||||||
|
|
||||||
// set query to only pick up in-progress invite pending tasks
|
|
||||||
wfTaskQuery.setTaskState(WorkflowTaskState.IN_PROGRESS);
|
|
||||||
wfTaskQuery.setTaskName(InviteWorkflowModel.WF_INVITE_TASK_INVITE_PENDING);
|
|
||||||
|
|
||||||
// query for invite workflow task associate
|
|
||||||
List<WorkflowTask> inviteStartTasks = workflowService
|
|
||||||
.queryTasks(wfTaskQuery);
|
|
||||||
|
|
||||||
return inviteStartTasks;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns an InviteInfo instance for the given startInvite task
|
|
||||||
* (used for rendering the response).
|
|
||||||
*
|
|
||||||
* @param startInviteTask startInvite task to get invite info properties from
|
|
||||||
* @param serviceRegistry service registry instance
|
|
||||||
* @param siteService site service instance
|
|
||||||
*
|
|
||||||
* @return InviteInfo instance containing invite information
|
|
||||||
*/
|
|
||||||
public static InviteInfo getPendingInviteInfo(final WorkflowTask startInviteTask,
|
|
||||||
final ServiceRegistry serviceRegistry, final SiteService siteService)
|
|
||||||
{
|
|
||||||
final PersonService personService = serviceRegistry.getPersonService();
|
|
||||||
|
|
||||||
// get the inviter, invitee, role and site short name
|
|
||||||
final String inviterUserNameProp = (String) startInviteTask.properties.get(
|
|
||||||
InviteWorkflowModel.WF_PROP_INVITER_USER_NAME);
|
|
||||||
final String inviteeUserNameProp = (String) startInviteTask.properties.get(
|
|
||||||
InviteWorkflowModel.WF_PROP_INVITEE_USER_NAME);
|
|
||||||
final String role = (String) startInviteTask.properties.get(
|
|
||||||
InviteWorkflowModel.WF_PROP_INVITEE_SITE_ROLE);
|
|
||||||
final String siteShortNameProp = (String) startInviteTask.properties.get(
|
|
||||||
InviteWorkflowModel.WF_PROP_SITE_SHORT_NAME);
|
|
||||||
|
|
||||||
// get the site info
|
|
||||||
SiteInfo siteInfo = siteService.getSite(siteShortNameProp);
|
|
||||||
|
|
||||||
// get workflow instance id (associated with workflow task) to place
|
|
||||||
// as "inviteId" onto model
|
|
||||||
String workflowId = startInviteTask.path.instance.id;
|
|
||||||
|
|
||||||
// set the invite start date to the time the workflow instance
|
|
||||||
// (associated with the task) was started
|
|
||||||
Date sentInviteDate = startInviteTask.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);
|
|
||||||
TemplateNode inviterPerson = null;
|
|
||||||
if (inviterRef != null)
|
|
||||||
{
|
|
||||||
inviterPerson = new TemplateNode(inviterRef, serviceRegistry, null);
|
|
||||||
//inviterPerson = new ScriptNode(inviterRef, serviceRegistry);
|
|
||||||
}
|
|
||||||
|
|
||||||
// fetch the person node for the invitee
|
|
||||||
NodeRef inviteeRef = personService.getPerson(inviteeUserNameProp);
|
|
||||||
TemplateNode inviteePerson = null;
|
|
||||||
if (inviteeRef != null)
|
|
||||||
{
|
|
||||||
inviteePerson = new TemplateNode(inviteeRef, serviceRegistry, null);
|
|
||||||
//inviteePerson = new ScriptNode(inviteeRef, serviceRegistry);
|
|
||||||
}
|
|
||||||
|
|
||||||
// create and return a invite info
|
|
||||||
InviteInfo inviteInfo = new InviteInfo(invitationStatus, inviterUserNameProp, inviterPerson,
|
|
||||||
inviteeUserNameProp, inviteePerson, role, siteShortNameProp, siteInfo, sentInviteDate, workflowId);
|
|
||||||
|
|
||||||
return inviteInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clean up invitee user account and person node when no longer in use.
|
|
||||||
* They are deemed to no longer be in use when the invitee user account
|
|
||||||
* is still disabled and there are no outstanding pending invites for that invitee.
|
|
||||||
*
|
|
||||||
* @param inviteeUserName
|
|
||||||
* @param authenticationDao
|
|
||||||
* @param personService
|
|
||||||
* @param workflowService
|
|
||||||
*/
|
|
||||||
public static void cleanUpStaleInviteeResources(final String inviteeUserName,
|
|
||||||
final MutableAuthenticationDao authenticationDao, final PersonService personService,
|
|
||||||
final WorkflowService workflowService)
|
|
||||||
{
|
|
||||||
AuthenticationUtil.runAs(new RunAsWork<Object>()
|
|
||||||
{
|
|
||||||
public Object doWork() throws Exception
|
|
||||||
{
|
|
||||||
// see if there are any pending invites (invite workflow instances with invitePending task in-progress)
|
|
||||||
// outstanding for given invitee user name
|
|
||||||
List<WorkflowTask> pendingTasks = InviteHelper.findInvitePendingTasks(inviteeUserName, workflowService);
|
|
||||||
boolean invitesPending = (pendingTasks != null) && (pendingTasks.size() > 0);
|
|
||||||
|
|
||||||
// if invitee's user account is still disabled and there are no pending invites outstanding
|
|
||||||
// for the invitee, then remove the account and delete the invitee's person node
|
|
||||||
if ((authenticationDao.userExists(inviteeUserName))
|
|
||||||
&& (authenticationDao.getEnabled(inviteeUserName) == false)
|
|
||||||
&& (invitesPending == false))
|
|
||||||
{
|
|
||||||
// delete the invitee's user account
|
|
||||||
authenticationDao.deleteUser(inviteeUserName);
|
|
||||||
|
|
||||||
// delete the invitee's person node if one exists
|
|
||||||
if (personService.personExists(inviteeUserName))
|
|
||||||
{
|
|
||||||
personService.deletePerson(inviteeUserName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}, AuthenticationUtil.getSystemUserName());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Complete the specified Invite Workflow Task for the invite workflow
|
|
||||||
* instance associated with the given invite ID, and follow the given
|
|
||||||
* transition upon completing the task
|
|
||||||
*
|
|
||||||
* @param inviteId the invite ID of the invite workflow instance for which
|
|
||||||
* we want to complete the given task
|
|
||||||
* @param fullTaskName qualified name of invite workflow task to complete
|
|
||||||
* @param transitionId the task transition to take on completion of
|
|
||||||
* the task (or null, for the default transition)
|
|
||||||
*/
|
|
||||||
public static void completeInviteTask(String inviteId, QName fullTaskName, String transitionId,
|
|
||||||
final WorkflowService workflowService)
|
|
||||||
{
|
|
||||||
// create workflow task query
|
|
||||||
WorkflowTaskQuery wfTaskQuery = new WorkflowTaskQuery();
|
|
||||||
|
|
||||||
// set the given invite ID as the workflow process ID in the workflow query
|
|
||||||
wfTaskQuery.setProcessId(inviteId);
|
|
||||||
|
|
||||||
// find incomplete invite workflow tasks with given task name
|
|
||||||
wfTaskQuery.setActive(Boolean.TRUE);
|
|
||||||
wfTaskQuery.setTaskState(WorkflowTaskState.IN_PROGRESS);
|
|
||||||
wfTaskQuery.setTaskName(fullTaskName);
|
|
||||||
|
|
||||||
// set process name to "wf:invite" so that only
|
|
||||||
// invite workflow instances are considered by this query
|
|
||||||
wfTaskQuery.setProcessName(InviteWorkflowModel.WF_PROCESS_INVITE);
|
|
||||||
|
|
||||||
// query for invite workflow tasks with the constructed query
|
|
||||||
List<WorkflowTask> wf_invite_tasks = workflowService
|
|
||||||
.queryTasks(wfTaskQuery);
|
|
||||||
|
|
||||||
// end all tasks found with this name
|
|
||||||
for (WorkflowTask workflowTask : wf_invite_tasks)
|
|
||||||
{
|
|
||||||
workflowService.endTask(workflowTask.id, transitionId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,171 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.io.Serializable;
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
import org.alfresco.repo.template.TemplateNode;
|
|
||||||
import org.alfresco.repo.site.SiteInfo;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holds properties pertaining to an invitation that has been sent out by a Site Manager (Inviter)
|
|
||||||
* to another person (Invitee) to join his/her Site
|
|
||||||
*
|
|
||||||
* @author glen dot johnson at alfresco dot com
|
|
||||||
*/
|
|
||||||
public class InviteInfo implements Serializable
|
|
||||||
{
|
|
||||||
private static final long serialVersionUID = -4514253998906200208L;
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
private TemplateNode inviterPerson;
|
|
||||||
private String inviteeUserName;
|
|
||||||
private TemplateNode inviteePerson;
|
|
||||||
private String role;
|
|
||||||
private String siteShortName;
|
|
||||||
private SiteInfo siteInfo;
|
|
||||||
private Date sentInviteDate;
|
|
||||||
private String inviteId;
|
|
||||||
|
|
||||||
public InviteInfo(String invitationStatus, String inviterUserName, TemplateNode inviterPerson,
|
|
||||||
String inviteeUserName, TemplateNode inviteePerson, String role,
|
|
||||||
String siteShortName, SiteInfo siteInfo, Date sentInviteDate, String inviteId)
|
|
||||||
{
|
|
||||||
this.invitationStatus = invitationStatus;
|
|
||||||
this.inviterUserName = inviterUserName;
|
|
||||||
this.inviterPerson = inviterPerson;
|
|
||||||
this.inviteeUserName = inviteeUserName;
|
|
||||||
this.inviteePerson = inviteePerson;
|
|
||||||
this.role = role;
|
|
||||||
this.siteShortName = siteShortName;
|
|
||||||
this.siteInfo = siteInfo;
|
|
||||||
this.sentInviteDate = sentInviteDate;
|
|
||||||
this.inviteId = inviteId;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the inviter user name
|
|
||||||
*
|
|
||||||
* @return the inviterUserName
|
|
||||||
*/
|
|
||||||
public String getInviterUserName()
|
|
||||||
{
|
|
||||||
return inviterUserName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the invitee user name
|
|
||||||
*
|
|
||||||
* @return the inviteeUserName
|
|
||||||
*/
|
|
||||||
public String getInviteeUserName()
|
|
||||||
{
|
|
||||||
return inviteeUserName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the site short name
|
|
||||||
*
|
|
||||||
* @return the siteShortName
|
|
||||||
*/
|
|
||||||
public String getSiteShortName()
|
|
||||||
{
|
|
||||||
return siteShortName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the invite ID
|
|
||||||
*
|
|
||||||
* @return the inviteId
|
|
||||||
*/
|
|
||||||
public String getInviteId()
|
|
||||||
{
|
|
||||||
return inviteId;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the invitee person
|
|
||||||
*
|
|
||||||
* @return the invitee person
|
|
||||||
*/
|
|
||||||
public TemplateNode getInviteePerson()
|
|
||||||
{
|
|
||||||
return inviteePerson;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the inviter person
|
|
||||||
*
|
|
||||||
* @return the inviter person
|
|
||||||
*/
|
|
||||||
public TemplateNode getInviterPerson()
|
|
||||||
{
|
|
||||||
return inviterPerson;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the sent invite date
|
|
||||||
*
|
|
||||||
* @return the sent invite date
|
|
||||||
*/
|
|
||||||
public Date getSentInviteDate()
|
|
||||||
{
|
|
||||||
return sentInviteDate;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the invitation status
|
|
||||||
*
|
|
||||||
* @return the invitation status
|
|
||||||
*/
|
|
||||||
public String getInvitationStatus()
|
|
||||||
{
|
|
||||||
return invitationStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the role that invitee has been invited to the site as
|
|
||||||
*
|
|
||||||
* @return the role that the invitee has been invited to the site as
|
|
||||||
*/
|
|
||||||
public String getRole()
|
|
||||||
{
|
|
||||||
return role;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SiteInfo getSiteInfo()
|
|
||||||
{
|
|
||||||
return siteInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@@ -27,6 +27,8 @@ package org.alfresco.repo.web.scripts.invite;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.alfresco.repo.invitation.WorkflowModelNominatedInvitation;
|
||||||
|
import org.alfresco.repo.invitation.site.InviteHelper;
|
||||||
import org.alfresco.service.cmr.workflow.WorkflowService;
|
import org.alfresco.service.cmr.workflow.WorkflowService;
|
||||||
import org.alfresco.service.cmr.workflow.WorkflowTask;
|
import org.alfresco.service.cmr.workflow.WorkflowTask;
|
||||||
import org.alfresco.web.scripts.DeclarativeWebScript;
|
import org.alfresco.web.scripts.DeclarativeWebScript;
|
||||||
@@ -90,7 +92,7 @@ public class InviteResponse extends DeclarativeWebScript
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check the ticket for a match
|
// check the ticket for a match
|
||||||
String ticket = (String) inviteStartTask.properties.get(InviteWorkflowModel.WF_PROP_INVITE_TICKET);
|
String ticket = (String) inviteStartTask.properties.get(WorkflowModelNominatedInvitation.WF_PROP_INVITE_TICKET);
|
||||||
if (ticket == null || (! ticket.equals(inviteTicket)))
|
if (ticket == null || (! ticket.equals(inviteTicket)))
|
||||||
{
|
{
|
||||||
throw new WebScriptException(Status.STATUS_NOT_FOUND,
|
throw new WebScriptException(Status.STATUS_NOT_FOUND,
|
||||||
@@ -133,11 +135,11 @@ public class InviteResponse extends DeclarativeWebScript
|
|||||||
private void acceptInvite(Map<String, Object> model, String inviteId, WorkflowTask inviteStartTask)
|
private void acceptInvite(Map<String, Object> model, String inviteId, WorkflowTask inviteStartTask)
|
||||||
{
|
{
|
||||||
String siteShortName = (String) inviteStartTask.properties.get(
|
String siteShortName = (String) inviteStartTask.properties.get(
|
||||||
InviteWorkflowModel.WF_PROP_SITE_SHORT_NAME);
|
WorkflowModelNominatedInvitation.WF_PROP_RESOURCE_NAME);
|
||||||
|
|
||||||
// complete the wf:invitePendingTask along the 'accept' transition because the invitation has been accepted
|
// complete the wf:invitePendingTask along the 'accept' transition because the invitation has been accepted
|
||||||
InviteHelper.completeInviteTask(inviteId, InviteWorkflowModel.WF_INVITE_TASK_INVITE_PENDING,
|
InviteHelper.completeInviteTask(inviteId, WorkflowModelNominatedInvitation.WF_INVITE_TASK_INVITE_PENDING,
|
||||||
InviteWorkflowModel.WF_TRANSITION_ACCEPT, this.workflowService);
|
WorkflowModelNominatedInvitation.WF_TRANSITION_ACCEPT, this.workflowService);
|
||||||
|
|
||||||
// add model properties for template to render
|
// add model properties for template to render
|
||||||
model.put(MODEL_PROP_KEY_RESPONSE, RESPONSE_ACCEPT);
|
model.put(MODEL_PROP_KEY_RESPONSE, RESPONSE_ACCEPT);
|
||||||
@@ -161,11 +163,11 @@ public class InviteResponse extends DeclarativeWebScript
|
|||||||
private void rejectInvite(Map<String, Object> model, String inviteId, WorkflowTask inviteStartTask)
|
private void rejectInvite(Map<String, Object> model, String inviteId, WorkflowTask inviteStartTask)
|
||||||
{
|
{
|
||||||
String siteShortName = (String) inviteStartTask.properties.get(
|
String siteShortName = (String) inviteStartTask.properties.get(
|
||||||
InviteWorkflowModel.WF_PROP_SITE_SHORT_NAME);
|
WorkflowModelNominatedInvitation.WF_PROP_RESOURCE_NAME);
|
||||||
|
|
||||||
// complete the wf:invitePendingTask task along the 'reject' transition because the invitation has been rejected
|
// complete the wf:invitePendingTask task along the 'reject' transition because the invitation has been rejected
|
||||||
InviteHelper.completeInviteTask(inviteId, InviteWorkflowModel.WF_INVITE_TASK_INVITE_PENDING,
|
InviteHelper.completeInviteTask(inviteId, WorkflowModelNominatedInvitation.WF_INVITE_TASK_INVITE_PENDING,
|
||||||
InviteWorkflowModel.WF_TRANSITION_REJECT, this.workflowService);
|
WorkflowModelNominatedInvitation.WF_TRANSITION_REJECT, this.workflowService);
|
||||||
|
|
||||||
// add model properties for template to render
|
// add model properties for template to render
|
||||||
model.put(MODEL_PROP_KEY_RESPONSE, RESPONSE_REJECT);
|
model.put(MODEL_PROP_KEY_RESPONSE, RESPONSE_REJECT);
|
||||||
|
@@ -30,13 +30,12 @@ import java.util.Set;
|
|||||||
|
|
||||||
import org.alfresco.model.ContentModel;
|
import org.alfresco.model.ContentModel;
|
||||||
import org.alfresco.repo.content.MimetypeMap;
|
import org.alfresco.repo.content.MimetypeMap;
|
||||||
|
import org.alfresco.repo.invitation.WorkflowModelNominatedInvitation;
|
||||||
import org.alfresco.repo.security.authentication.AuthenticationComponent;
|
import org.alfresco.repo.security.authentication.AuthenticationComponent;
|
||||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||||
import org.alfresco.repo.security.authentication.MutableAuthenticationDao;
|
import org.alfresco.repo.security.authentication.MutableAuthenticationDao;
|
||||||
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
|
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
|
||||||
import org.alfresco.repo.site.SiteInfo;
|
|
||||||
import org.alfresco.repo.site.SiteModel;
|
import org.alfresco.repo.site.SiteModel;
|
||||||
import org.alfresco.repo.site.SiteService;
|
|
||||||
import org.alfresco.repo.transaction.RetryingTransactionHelper;
|
import org.alfresco.repo.transaction.RetryingTransactionHelper;
|
||||||
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
|
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
|
||||||
import org.alfresco.repo.web.scripts.BaseWebScriptTest;
|
import org.alfresco.repo.web.scripts.BaseWebScriptTest;
|
||||||
@@ -47,6 +46,8 @@ import org.alfresco.service.cmr.security.AuthenticationService;
|
|||||||
import org.alfresco.service.cmr.security.AuthorityService;
|
import org.alfresco.service.cmr.security.AuthorityService;
|
||||||
import org.alfresco.service.cmr.security.AuthorityType;
|
import org.alfresco.service.cmr.security.AuthorityType;
|
||||||
import org.alfresco.service.cmr.security.PersonService;
|
import org.alfresco.service.cmr.security.PersonService;
|
||||||
|
import org.alfresco.service.cmr.site.SiteInfo;
|
||||||
|
import org.alfresco.service.cmr.site.SiteService;
|
||||||
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
|
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
|
||||||
import org.alfresco.service.cmr.workflow.WorkflowInstance;
|
import org.alfresco.service.cmr.workflow.WorkflowInstance;
|
||||||
import org.alfresco.service.cmr.workflow.WorkflowService;
|
import org.alfresco.service.cmr.workflow.WorkflowService;
|
||||||
@@ -137,10 +138,10 @@ public class InviteServiceTest extends BaseWebScriptTest
|
|||||||
|
|
||||||
// redeploy invite process definition in case it has been modified
|
// redeploy invite process definition in case it has been modified
|
||||||
WorkflowDefinition inviteWfDefinition = this.workflowService.getDefinitionByName(
|
WorkflowDefinition inviteWfDefinition = this.workflowService.getDefinitionByName(
|
||||||
"jbpm$" + InviteWorkflowModel.WF_PROCESS_INVITE.toPrefixString(this.namespaceService));
|
"jbpm$" + WorkflowModelNominatedInvitation.WF_PROCESS_INVITE.toPrefixString(this.namespaceService));
|
||||||
this.workflowService.undeployDefinition(inviteWfDefinition.id);
|
this.workflowService.undeployDefinition(inviteWfDefinition.id);
|
||||||
ClassPathResource inviteWfResource = new ClassPathResource(
|
ClassPathResource inviteWfResource = new ClassPathResource(
|
||||||
"alfresco/workflow/invite_processdefinition.xml");
|
"alfresco/workflow/invitation-nominated_processdefinition.xml");
|
||||||
workflowService.deployDefinition(
|
workflowService.deployDefinition(
|
||||||
"jbpm", inviteWfResource.getInputStream(), MimetypeMap.MIMETYPE_XML);
|
"jbpm", inviteWfResource.getInputStream(), MimetypeMap.MIMETYPE_XML);
|
||||||
|
|
||||||
|
@@ -1,46 +0,0 @@
|
|||||||
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_INVITE_TASK_INVITE_PENDING = QName.createQName(NamespaceService.WORKFLOW_MODEL_1_0_URI, "invitePendingTask");
|
|
||||||
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");
|
|
||||||
|
|
||||||
// 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_CANCEL = "cancel";
|
|
||||||
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");
|
|
||||||
|
|
||||||
// workflow execution context variable names
|
|
||||||
public static final String wfVarInviteeUserName = "wf_inviteeUserName";
|
|
||||||
public static final String wfVarSiteShortName = "wf_siteShortName";
|
|
||||||
public static final String wfVarWorkflowInstanceId = "workflowinstanceid";
|
|
||||||
}
|
|
@@ -29,8 +29,11 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.alfresco.repo.site.SiteService;
|
import org.alfresco.repo.invitation.WorkflowModelNominatedInvitation;
|
||||||
|
import org.alfresco.repo.invitation.site.InviteHelper;
|
||||||
|
import org.alfresco.repo.invitation.site.InviteInfo;
|
||||||
import org.alfresco.service.ServiceRegistry;
|
import org.alfresco.service.ServiceRegistry;
|
||||||
|
import org.alfresco.service.cmr.site.SiteService;
|
||||||
import org.alfresco.service.cmr.workflow.WorkflowService;
|
import org.alfresco.service.cmr.workflow.WorkflowService;
|
||||||
import org.alfresco.service.cmr.workflow.WorkflowTask;
|
import org.alfresco.service.cmr.workflow.WorkflowTask;
|
||||||
import org.alfresco.service.cmr.workflow.WorkflowTaskQuery;
|
import org.alfresco.service.cmr.workflow.WorkflowTaskQuery;
|
||||||
@@ -183,17 +186,17 @@ public class Invites extends DeclarativeWebScript
|
|||||||
1.0f);
|
1.0f);
|
||||||
if (inviterUserNameProvided)
|
if (inviterUserNameProvided)
|
||||||
{
|
{
|
||||||
wfQueryProps.put(InviteWorkflowModel.WF_PROP_INVITER_USER_NAME,
|
wfQueryProps.put(WorkflowModelNominatedInvitation.WF_PROP_INVITER_USER_NAME,
|
||||||
inviterUserName);
|
inviterUserName);
|
||||||
}
|
}
|
||||||
if (inviteeUserNameProvided)
|
if (inviteeUserNameProvided)
|
||||||
{
|
{
|
||||||
wfQueryProps.put(InviteWorkflowModel.WF_PROP_INVITEE_USER_NAME,
|
wfQueryProps.put(WorkflowModelNominatedInvitation.WF_PROP_INVITEE_USER_NAME,
|
||||||
inviteeUserName);
|
inviteeUserName);
|
||||||
}
|
}
|
||||||
if (siteShortNameProvided)
|
if (siteShortNameProvided)
|
||||||
{
|
{
|
||||||
wfQueryProps.put(InviteWorkflowModel.WF_PROP_SITE_SHORT_NAME,
|
wfQueryProps.put(WorkflowModelNominatedInvitation.WF_PROP_RESOURCE_NAME,
|
||||||
siteShortName);
|
siteShortName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -206,12 +209,12 @@ public class Invites extends DeclarativeWebScript
|
|||||||
|
|
||||||
// pick up the start task
|
// pick up the start task
|
||||||
wfTaskQuery.setTaskState(WorkflowTaskState.IN_PROGRESS);
|
wfTaskQuery.setTaskState(WorkflowTaskState.IN_PROGRESS);
|
||||||
wfTaskQuery.setTaskName(InviteWorkflowModel.WF_INVITE_TASK_INVITE_PENDING);
|
wfTaskQuery.setTaskName(WorkflowModelNominatedInvitation.WF_INVITE_TASK_INVITE_PENDING);
|
||||||
|
|
||||||
// set process name to "wf:invite" so that only tasks associated with
|
// set process name to "wf:invite" so that only tasks associated with
|
||||||
// invite workflow instances
|
// invite workflow instances
|
||||||
// are returned by query
|
// are returned by query
|
||||||
wfTaskQuery.setProcessName(InviteWorkflowModel.WF_PROCESS_INVITE);
|
wfTaskQuery.setProcessName(WorkflowModelNominatedInvitation.WF_PROCESS_INVITE);
|
||||||
|
|
||||||
// query for invite workflow tasks
|
// query for invite workflow tasks
|
||||||
List<WorkflowTask> wf_invite_tasks = this.workflowService
|
List<WorkflowTask> wf_invite_tasks = this.workflowService
|
||||||
|
@@ -1,77 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 org.alfresco.repo.security.authentication.MutableAuthenticationDao;
|
|
||||||
import org.alfresco.repo.workflow.jbpm.JBPMSpringActionHandler;
|
|
||||||
import org.alfresco.service.ServiceRegistry;
|
|
||||||
import org.alfresco.service.cmr.security.PersonService;
|
|
||||||
import org.alfresco.service.cmr.workflow.WorkflowService;
|
|
||||||
import org.jbpm.graph.exe.ExecutionContext;
|
|
||||||
import org.springframework.beans.factory.BeanFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This class contains logic that gets executed when
|
|
||||||
* the wf:invitePendingTask in the invite workflow gets completed
|
|
||||||
* along the "reject" transition
|
|
||||||
*
|
|
||||||
* @author glen johnson at alfresco com
|
|
||||||
*/
|
|
||||||
public class RejectInviteAction extends JBPMSpringActionHandler
|
|
||||||
{
|
|
||||||
private static final long serialVersionUID = 4377660284993206875L;
|
|
||||||
|
|
||||||
private MutableAuthenticationDao mutableAuthenticationDao;
|
|
||||||
private PersonService personService;
|
|
||||||
private WorkflowService workflowService;
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.alfresco.repo.workflow.jbpm.JBPMSpringActionHandler#initialiseHandler(org.springframework.beans.factory.BeanFactory)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected void initialiseHandler(BeanFactory factory)
|
|
||||||
{
|
|
||||||
ServiceRegistry services = (ServiceRegistry)factory.getBean(ServiceRegistry.SERVICE_REGISTRY);
|
|
||||||
mutableAuthenticationDao = (MutableAuthenticationDao) factory.getBean("authenticationDao");
|
|
||||||
personService = (PersonService) services.getPersonService();
|
|
||||||
workflowService = (WorkflowService) services.getWorkflowService();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.jbpm.graph.def.ActionHandler#execute(org.jbpm.graph.exe.ExecutionContext)
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public void execute(final ExecutionContext executionContext) throws Exception
|
|
||||||
{
|
|
||||||
// get the invitee user name
|
|
||||||
final String inviteeUserName = (String) executionContext.getVariable(InviteWorkflowModel.wfVarInviteeUserName);
|
|
||||||
|
|
||||||
// clean up invitee's user account and person node if they are not in use i.e.
|
|
||||||
// account is still disabled and there are no pending invites outstanding for the
|
|
||||||
// invitee
|
|
||||||
InviteHelper.cleanUpStaleInviteeResources(inviteeUserName, mutableAuthenticationDao, personService,
|
|
||||||
workflowService);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -32,14 +32,15 @@ import java.util.Map;
|
|||||||
|
|
||||||
import org.alfresco.model.ContentModel;
|
import org.alfresco.model.ContentModel;
|
||||||
import org.alfresco.repo.security.authentication.AuthenticationComponent;
|
import org.alfresco.repo.security.authentication.AuthenticationComponent;
|
||||||
import org.alfresco.repo.site.SiteInfo;
|
|
||||||
import org.alfresco.repo.site.SiteModel;
|
import org.alfresco.repo.site.SiteModel;
|
||||||
import org.alfresco.repo.site.SiteService;
|
|
||||||
import org.alfresco.repo.web.scripts.BaseWebScriptTest;
|
import org.alfresco.repo.web.scripts.BaseWebScriptTest;
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
import org.alfresco.service.cmr.repository.NodeService;
|
import org.alfresco.service.cmr.repository.NodeService;
|
||||||
import org.alfresco.service.cmr.security.AuthenticationService;
|
import org.alfresco.service.cmr.security.AuthenticationService;
|
||||||
import org.alfresco.service.cmr.security.PersonService;
|
import org.alfresco.service.cmr.security.PersonService;
|
||||||
|
import org.alfresco.service.cmr.site.SiteInfo;
|
||||||
|
import org.alfresco.service.cmr.site.SiteService;
|
||||||
|
import org.alfresco.service.cmr.site.SiteVisibility;
|
||||||
import org.alfresco.service.namespace.QName;
|
import org.alfresco.service.namespace.QName;
|
||||||
import org.alfresco.util.GUID;
|
import org.alfresco.util.GUID;
|
||||||
import org.alfresco.util.PropertyMap;
|
import org.alfresco.util.PropertyMap;
|
||||||
@@ -48,6 +49,7 @@ import org.alfresco.web.scripts.TestWebScriptServer.GetRequest;
|
|||||||
import org.alfresco.web.scripts.TestWebScriptServer.PostRequest;
|
import org.alfresco.web.scripts.TestWebScriptServer.PostRequest;
|
||||||
import org.alfresco.web.scripts.TestWebScriptServer.PutRequest;
|
import org.alfresco.web.scripts.TestWebScriptServer.PutRequest;
|
||||||
import org.alfresco.web.scripts.TestWebScriptServer.Response;
|
import org.alfresco.web.scripts.TestWebScriptServer.Response;
|
||||||
|
import org.htmlparser.parserapplications.SiteCapturer;
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
@@ -133,20 +135,21 @@ public class SiteServiceTest extends BaseWebScriptTest
|
|||||||
String shortName = GUID.generate();
|
String shortName = GUID.generate();
|
||||||
|
|
||||||
// Create a new site
|
// Create a new site
|
||||||
JSONObject result = createSite("myPreset", shortName, "myTitle", "myDescription", true, 200);
|
JSONObject result = createSite("myPreset", shortName, "myTitle", "myDescription", SiteVisibility.PUBLIC, 200);
|
||||||
assertEquals("myPreset", result.get("sitePreset"));
|
assertEquals("myPreset", result.get("sitePreset"));
|
||||||
assertEquals(shortName, result.get("shortName"));
|
assertEquals(shortName, result.get("shortName"));
|
||||||
assertEquals("myTitle", result.get("title"));
|
assertEquals("myTitle", result.get("title"));
|
||||||
assertEquals("myDescription", result.get("description"));
|
assertEquals("myDescription", result.get("description"));
|
||||||
assertNotNull(result.get("node"));
|
assertNotNull(result.get("node"));
|
||||||
assertNotNull(result.get("tagScope"));
|
assertNotNull(result.get("tagScope"));
|
||||||
|
assertEquals(SiteVisibility.PUBLIC.toString(), result.get("visibility"));
|
||||||
assertTrue(result.getBoolean("isPublic"));
|
assertTrue(result.getBoolean("isPublic"));
|
||||||
|
|
||||||
// Check for duplicate names
|
// Check for duplicate names
|
||||||
createSite("myPreset", shortName, "myTitle", "myDescription", true, 500);
|
createSite("myPreset", shortName, "myTitle", "myDescription", SiteVisibility.PUBLIC, 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
private JSONObject createSite(String sitePreset, String shortName, String title, String description, boolean isPublic, int expectedStatus)
|
private JSONObject createSite(String sitePreset, String shortName, String title, String description, SiteVisibility visibility, int expectedStatus)
|
||||||
throws Exception
|
throws Exception
|
||||||
{
|
{
|
||||||
JSONObject site = new JSONObject();
|
JSONObject site = new JSONObject();
|
||||||
@@ -154,7 +157,7 @@ public class SiteServiceTest extends BaseWebScriptTest
|
|||||||
site.put("shortName", shortName);
|
site.put("shortName", shortName);
|
||||||
site.put("title", title);
|
site.put("title", title);
|
||||||
site.put("description", description);
|
site.put("description", description);
|
||||||
site.put("isPublic", isPublic);
|
site.put("visibility", visibility.toString());
|
||||||
Response response = sendRequest(new PostRequest(URL_SITES, site.toString(), "application/json"), expectedStatus);
|
Response response = sendRequest(new PostRequest(URL_SITES, site.toString(), "application/json"), expectedStatus);
|
||||||
this.createdSites.add(shortName);
|
this.createdSites.add(shortName);
|
||||||
return new JSONObject(response.getContentAsString());
|
return new JSONObject(response.getContentAsString());
|
||||||
@@ -167,11 +170,11 @@ public class SiteServiceTest extends BaseWebScriptTest
|
|||||||
assertNotNull(result);
|
assertNotNull(result);
|
||||||
assertEquals(0, result.length());
|
assertEquals(0, result.length());
|
||||||
|
|
||||||
createSite("myPreset", GUID.generate(), "myTitle", "myDescription", true, 200);
|
createSite("myPreset", GUID.generate(), "myTitle", "myDescription", SiteVisibility.PUBLIC, 200);
|
||||||
createSite("myPreset", GUID.generate(), "myTitle", "myDescription", true, 200);
|
createSite("myPreset", GUID.generate(), "myTitle", "myDescription", SiteVisibility.PUBLIC, 200);
|
||||||
createSite("myPreset", GUID.generate(), "myTitle", "myDescription", true, 200);
|
createSite("myPreset", GUID.generate(), "myTitle", "myDescription", SiteVisibility.PUBLIC, 200);
|
||||||
createSite("myPreset", GUID.generate(), "myTitle", "myDescription", true, 200);
|
createSite("myPreset", GUID.generate(), "myTitle", "myDescription", SiteVisibility.PUBLIC, 200);
|
||||||
createSite("myPreset", GUID.generate(), "myTitle", "myDescription", true, 200);
|
createSite("myPreset", GUID.generate(), "myTitle", "myDescription", SiteVisibility.PUBLIC, 200);
|
||||||
|
|
||||||
response = sendRequest(new GetRequest(URL_SITES), 200);
|
response = sendRequest(new GetRequest(URL_SITES), 200);
|
||||||
result = new JSONArray(response.getContentAsString());
|
result = new JSONArray(response.getContentAsString());
|
||||||
@@ -196,7 +199,7 @@ public class SiteServiceTest extends BaseWebScriptTest
|
|||||||
|
|
||||||
// Create a site and get it
|
// Create a site and get it
|
||||||
String shortName = GUID.generate();
|
String shortName = GUID.generate();
|
||||||
JSONObject result = createSite("myPreset", shortName, "myTitle", "myDescription", true, 200);
|
JSONObject result = createSite("myPreset", shortName, "myTitle", "myDescription", SiteVisibility.PUBLIC, 200);
|
||||||
response = sendRequest(new GetRequest(URL_SITES + "/" + shortName), 200);
|
response = sendRequest(new GetRequest(URL_SITES + "/" + shortName), 200);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -205,17 +208,18 @@ public class SiteServiceTest extends BaseWebScriptTest
|
|||||||
{
|
{
|
||||||
// Create a site
|
// Create a site
|
||||||
String shortName = GUID.generate();
|
String shortName = GUID.generate();
|
||||||
JSONObject result = createSite("myPreset", shortName, "myTitle", "myDescription", true, 200);
|
JSONObject result = createSite("myPreset", shortName, "myTitle", "myDescription", SiteVisibility.PUBLIC, 200);
|
||||||
|
|
||||||
// Update the site
|
// Update the site
|
||||||
result.put("title", "abs123abc");
|
result.put("title", "abs123abc");
|
||||||
result.put("description", "123abc123");
|
result.put("description", "123abc123");
|
||||||
result.put("isPublic", false);
|
result.put("visibility", SiteVisibility.PRIVATE.toString());
|
||||||
Response response = sendRequest(new PutRequest(URL_SITES + "/" + shortName, result.toString(), "application/json"), 200);
|
Response response = sendRequest(new PutRequest(URL_SITES + "/" + shortName, result.toString(), "application/json"), 200);
|
||||||
result = new JSONObject(response.getContentAsString());
|
result = new JSONObject(response.getContentAsString());
|
||||||
assertEquals("abs123abc", result.get("title"));
|
assertEquals("abs123abc", result.get("title"));
|
||||||
assertEquals("123abc123", result.get("description"));
|
assertEquals("123abc123", result.get("description"));
|
||||||
assertFalse(result.getBoolean("isPublic"));
|
assertFalse(result.getBoolean("isPublic"));
|
||||||
|
assertEquals(SiteVisibility.PRIVATE.toString(), result.get("visibility"));
|
||||||
|
|
||||||
// Try and get the site and double check it's changed
|
// Try and get the site and double check it's changed
|
||||||
response = sendRequest(new GetRequest(URL_SITES + "/" + shortName), 200);
|
response = sendRequest(new GetRequest(URL_SITES + "/" + shortName), 200);
|
||||||
@@ -223,16 +227,17 @@ public class SiteServiceTest extends BaseWebScriptTest
|
|||||||
assertEquals("abs123abc", result.get("title"));
|
assertEquals("abs123abc", result.get("title"));
|
||||||
assertEquals("123abc123", result.get("description"));
|
assertEquals("123abc123", result.get("description"));
|
||||||
assertFalse(result.getBoolean("isPublic"));
|
assertFalse(result.getBoolean("isPublic"));
|
||||||
|
assertEquals(SiteVisibility.PRIVATE.toString(), result.get("visibility"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testDeleteSite() throws Exception
|
public void testDeleteSite() throws Exception
|
||||||
{
|
{
|
||||||
// Delete non-existant site
|
// Delete non-existent site
|
||||||
Response response = sendRequest(new DeleteRequest(URL_SITES + "/" + "somerandomshortname"), 404);
|
Response response = sendRequest(new DeleteRequest(URL_SITES + "/" + "somerandomshortname"), 404);
|
||||||
|
|
||||||
// Create a site
|
// Create a site
|
||||||
String shortName = GUID.generate();
|
String shortName = GUID.generate();
|
||||||
JSONObject result = createSite("myPreset", shortName, "myTitle", "myDescription", true, 200);
|
JSONObject result = createSite("myPreset", shortName, "myTitle", "myDescription", SiteVisibility.PUBLIC, 200);
|
||||||
|
|
||||||
// Get the site
|
// Get the site
|
||||||
response = sendRequest(new GetRequest(URL_SITES + "/" + shortName), 200);
|
response = sendRequest(new GetRequest(URL_SITES + "/" + shortName), 200);
|
||||||
@@ -248,7 +253,7 @@ public class SiteServiceTest extends BaseWebScriptTest
|
|||||||
{
|
{
|
||||||
// Create a site
|
// Create a site
|
||||||
String shortName = GUID.generate();
|
String shortName = GUID.generate();
|
||||||
createSite("myPreset", shortName, "myTitle", "myDescription", true, 200);
|
createSite("myPreset", shortName, "myTitle", "myDescription", SiteVisibility.PUBLIC, 200);
|
||||||
|
|
||||||
// Check the memberships
|
// Check the memberships
|
||||||
Response response = sendRequest(new GetRequest(URL_SITES + "/" + shortName + URL_MEMBERSHIPS), 200);
|
Response response = sendRequest(new GetRequest(URL_SITES + "/" + shortName + URL_MEMBERSHIPS), 200);
|
||||||
@@ -264,7 +269,7 @@ public class SiteServiceTest extends BaseWebScriptTest
|
|||||||
{
|
{
|
||||||
// Create a site
|
// Create a site
|
||||||
String shortName = GUID.generate();
|
String shortName = GUID.generate();
|
||||||
createSite("myPreset", shortName, "myTitle", "myDescription", true, 200);
|
createSite("myPreset", shortName, "myTitle", "myDescription", SiteVisibility.PUBLIC, 200);
|
||||||
|
|
||||||
// Build the JSON membership object
|
// Build the JSON membership object
|
||||||
JSONObject membership = new JSONObject();
|
JSONObject membership = new JSONObject();
|
||||||
@@ -273,7 +278,7 @@ public class SiteServiceTest extends BaseWebScriptTest
|
|||||||
person.put("userName", USER_TWO);
|
person.put("userName", USER_TWO);
|
||||||
membership.put("person", person);
|
membership.put("person", person);
|
||||||
|
|
||||||
// Post the memebership
|
// Post the membership
|
||||||
Response response = sendRequest(new PostRequest(URL_SITES + "/" + shortName + URL_MEMBERSHIPS, membership.toString(), "application/json"), 200);
|
Response response = sendRequest(new PostRequest(URL_SITES + "/" + shortName + URL_MEMBERSHIPS, membership.toString(), "application/json"), 200);
|
||||||
JSONObject result = new JSONObject(response.getContentAsString());
|
JSONObject result = new JSONObject(response.getContentAsString());
|
||||||
|
|
||||||
@@ -292,7 +297,7 @@ public class SiteServiceTest extends BaseWebScriptTest
|
|||||||
{
|
{
|
||||||
// Create a site
|
// Create a site
|
||||||
String shortName = GUID.generate();
|
String shortName = GUID.generate();
|
||||||
createSite("myPreset", shortName, "myTitle", "myDescription", true, 200);
|
createSite("myPreset", shortName, "myTitle", "myDescription", SiteVisibility.PUBLIC, 200);
|
||||||
|
|
||||||
// Test error conditions
|
// Test error conditions
|
||||||
sendRequest(new GetRequest(URL_SITES + "/badsite" + URL_MEMBERSHIPS + "/" + USER_ONE), 404);
|
sendRequest(new GetRequest(URL_SITES + "/badsite" + URL_MEMBERSHIPS + "/" + USER_ONE), 404);
|
||||||
@@ -311,7 +316,7 @@ public class SiteServiceTest extends BaseWebScriptTest
|
|||||||
{
|
{
|
||||||
// Create a site
|
// Create a site
|
||||||
String shortName = GUID.generate();
|
String shortName = GUID.generate();
|
||||||
createSite("myPreset", shortName, "myTitle", "myDescription", true, 200);
|
createSite("myPreset", shortName, "myTitle", "myDescription", SiteVisibility.PUBLIC, 200);
|
||||||
|
|
||||||
// Test error conditions
|
// Test error conditions
|
||||||
// TODO
|
// TODO
|
||||||
@@ -323,7 +328,7 @@ public class SiteServiceTest extends BaseWebScriptTest
|
|||||||
person.put("userName", USER_TWO);
|
person.put("userName", USER_TWO);
|
||||||
membership.put("person", person);
|
membership.put("person", person);
|
||||||
|
|
||||||
// Post the memebership
|
// Post the membership
|
||||||
Response response = sendRequest(new PostRequest(URL_SITES + "/" + shortName + URL_MEMBERSHIPS, membership.toString(), "application/json"), 200);
|
Response response = sendRequest(new PostRequest(URL_SITES + "/" + shortName + URL_MEMBERSHIPS, membership.toString(), "application/json"), 200);
|
||||||
JSONObject newMember = new JSONObject(response.getContentAsString());
|
JSONObject newMember = new JSONObject(response.getContentAsString());
|
||||||
|
|
||||||
@@ -347,7 +352,7 @@ public class SiteServiceTest extends BaseWebScriptTest
|
|||||||
{
|
{
|
||||||
// Create a site
|
// Create a site
|
||||||
String shortName = GUID.generate();
|
String shortName = GUID.generate();
|
||||||
createSite("myPreset", shortName, "myTitle", "myDescription", true, 200);
|
createSite("myPreset", shortName, "myTitle", "myDescription", SiteVisibility.PUBLIC, 200);
|
||||||
|
|
||||||
// Build the JSON membership object
|
// Build the JSON membership object
|
||||||
JSONObject membership = new JSONObject();
|
JSONObject membership = new JSONObject();
|
||||||
@@ -371,9 +376,9 @@ public class SiteServiceTest extends BaseWebScriptTest
|
|||||||
{
|
{
|
||||||
// Create a site
|
// Create a site
|
||||||
String shortName = GUID.generate();
|
String shortName = GUID.generate();
|
||||||
createSite("myPreset", shortName, "myTitle", "myDescription", true, 200);
|
createSite("myPreset", shortName, "myTitle", "myDescription", SiteVisibility.PUBLIC, 200);
|
||||||
String shortName2 = GUID.generate();
|
String shortName2 = GUID.generate();
|
||||||
createSite("myPreset", shortName2, "myTitle", "myDescription", true, 200);
|
createSite("myPreset", shortName2, "myTitle", "myDescription", SiteVisibility.PUBLIC, 200);
|
||||||
|
|
||||||
Response response = sendRequest(new GetRequest("/api/people/" + USER_TWO + "/sites"), 200);
|
Response response = sendRequest(new GetRequest("/api/people/" + USER_TWO + "/sites"), 200);
|
||||||
JSONArray result = new JSONArray(response.getContentAsString());
|
JSONArray result = new JSONArray(response.getContentAsString());
|
||||||
@@ -381,7 +386,7 @@ public class SiteServiceTest extends BaseWebScriptTest
|
|||||||
assertNotNull(result);
|
assertNotNull(result);
|
||||||
assertEquals(0, result.length());
|
assertEquals(0, result.length());
|
||||||
|
|
||||||
// Add some memeberships
|
// Add some memberships
|
||||||
JSONObject membership = new JSONObject();
|
JSONObject membership = new JSONObject();
|
||||||
membership.put("role", SiteModel.SITE_CONSUMER);
|
membership.put("role", SiteModel.SITE_CONSUMER);
|
||||||
JSONObject person = new JSONObject();
|
JSONObject person = new JSONObject();
|
||||||
@@ -430,7 +435,7 @@ public class SiteServiceTest extends BaseWebScriptTest
|
|||||||
throws Exception
|
throws Exception
|
||||||
{
|
{
|
||||||
// Create a site with a custom property
|
// Create a site with a custom property
|
||||||
SiteInfo siteInfo = this.siteService.createSite("testPreset", "mySiteWithCustomProperty2", "testTitle", "testDescription", true);
|
SiteInfo siteInfo = this.siteService.createSite("testPreset", "mySiteWithCustomProperty2", "testTitle", "testDescription", SiteVisibility.PUBLIC);
|
||||||
NodeRef siteNodeRef = siteInfo.getNodeRef();
|
NodeRef siteNodeRef = siteInfo.getNodeRef();
|
||||||
Map<QName, Serializable> properties = new HashMap<QName, Serializable>(1);
|
Map<QName, Serializable> properties = new HashMap<QName, Serializable>(1);
|
||||||
properties.put(QName.createQName(SiteModel.SITE_CUSTOM_PROPERTY_URL, "additionalInformation"), "information");
|
properties.put(QName.createQName(SiteModel.SITE_CUSTOM_PROPERTY_URL, "additionalInformation"), "information");
|
||||||
|
Reference in New Issue
Block a user