Merged HEAD-QA to HEAD (4.2) - final one

r54310-54386


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@54387 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Samuel Langlois
2013-08-22 08:25:02 +00:00
parent 150d9784e0
commit 5416d83ac2
51 changed files with 2907 additions and 399 deletions

View File

@@ -71,7 +71,7 @@ public class PublicApiHttpClient
private static final String OLD_BASE_URL = "http://{0}:{1}{2}/{3}/{4}/api/";
private static final String INDEX_URL = "http://{0}:{1}{2}/{3}";
private static final String BASE_URL = "http://{0}:{1}{2}/{3}/{4}/{5}/alfresco/versions/1";
private static final String BASE_URL = "http://{0}:{1}{2}/{3}/{4}/{5}/{6}/versions/1";
private static final String PUBLICAPI_CMIS_SERVICE_URL = "http://{0}:{1}{2}/{3}/cmis/versions/{4}/{5}";
private static final String PUBLICAPI_CMIS_URL = "http://{0}:{1}{2}/{3}/{4}/{5}/cmis/versions/{6}/{7}";
private static final String ATOM_PUB_URL = "http://{0}:{1}{2}/cmisatom";
@@ -86,6 +86,9 @@ public class PublicApiHttpClient
private ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
private MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(this.resourcePatternResolver);
// can be overriden by other clients like the workflow client
protected String apiName = "alfresco";
public PublicApiHttpClient(String host, int port, String contextPath, String servletName, AuthenticatedHttp authenticatedHttp)
{
super();
@@ -500,7 +503,7 @@ public class PublicApiHttpClient
Pair<String, String> relationshipCollectionInfo = getRelationCollectionInfo(resourceClass);
sb.append(MessageFormat.format(BASE_URL, new Object[] {host, String.valueOf(port), contextPath, servletName,
tenantDomain == null ? TenantUtil.DEFAULT_TENANT : tenantDomain, scope.toString()}));
tenantDomain == null ? TenantUtil.DEFAULT_TENANT : tenantDomain, scope.toString(), apiName}));
if(relationshipCollectionInfo != null)
{
@@ -578,7 +581,7 @@ public class PublicApiHttpClient
tenantDomain = TenantUtil.DEFAULT_TENANT;
}
sb.append(MessageFormat.format(BASE_URL, new Object[] {host, String.valueOf(port), contextPath, servletName,
tenantDomain, scope}));
tenantDomain, scope, apiName}));
if(collectionName != null)
{

View File

@@ -2,9 +2,12 @@ package org.alfresco.rest.workflow.api.tests;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.InputStream;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.repository.DeploymentBuilder;
@@ -23,11 +26,11 @@ import org.alfresco.rest.api.tests.client.AuthenticationDetailsProvider;
import org.alfresco.rest.api.tests.client.HttpClientProvider;
import org.alfresco.rest.api.tests.client.HttpResponse;
import org.alfresco.rest.api.tests.client.PublicApiException;
import org.alfresco.rest.api.tests.client.PublicApiHttpClient;
import org.alfresco.rest.api.tests.client.RequestContext;
import org.alfresco.rest.api.tests.client.UserAuthenticationDetailsProviderImpl;
import org.alfresco.rest.api.tests.client.UserData;
import org.alfresco.rest.api.tests.client.UserDataService;
import org.alfresco.rest.api.tests.client.data.MemberOfSite;
import org.alfresco.rest.workflow.api.model.ProcessInfo;
import org.alfresco.rest.workflow.api.tests.WorkflowApiClient.ProcessesClient;
import org.alfresco.service.ServiceRegistry;
@@ -85,7 +88,7 @@ public class EnterpriseWorkflowTestApi extends EnterpriseTestApi
};
AuthenticationDetailsProvider authenticationDetailsProvider = new UserAuthenticationDetailsProviderImpl(userDataService, "admin", "admin");
AuthenticatedHttp authenticatedHttp = new AuthenticatedHttp(httpClientProvider, authenticationDetailsProvider);
this.httpClient = new PublicApiHttpClient("localhost", TestFixture.PORT, TestFixture.CONTEXT_PATH,
this.httpClient = new WorkflowApiHttpClient("localhost", TestFixture.PORT, TestFixture.CONTEXT_PATH,
TestFixture.PUBLIC_API_SERVLET_NAME, authenticatedHttp);
this.publicApiClient = new WorkflowApiClient(httpClient, userDataService);
activitiProcessEngine = (ProcessEngine) applicationContext.getBean("activitiProcessEngine");
@@ -116,6 +119,29 @@ public class EnterpriseWorkflowTestApi extends EnterpriseTestApi
return requestContext;
}
protected TestNetwork getOtherNetwork(String usedNetworkId) throws Exception {
Iterator<TestNetwork> networkIt = getTestFixture().getNetworksIt();
while(networkIt.hasNext()) {
TestNetwork network = networkIt.next();
if(!usedNetworkId.equals(network.getId())) {
return network;
}
}
fail("Need more than one network to test permissions");
return null;
}
protected TestPerson getOtherPersonInNetwork(String usedPerson, String networkId) throws Exception {
TestNetwork usedNetwork = getTestFixture().getNetwork(networkId);
for(TestPerson person : usedNetwork.getPeople()) {
if(!person.getId().equals(usedPerson)) {
return person;
}
}
fail("Network doesn't have additonal users, cannot perform test");
return null;
}
protected Date parseDate(JSONObject entry, String fieldName) {
String dateText = (String) entry.get(fieldName);
if (dateText!=null) {
@@ -188,10 +214,17 @@ public class EnterpriseWorkflowTestApi extends EnterpriseTestApi
}
/**
* Start an adhoc-process through the public REST-API.
* Start an adhoc-process without business key through the public REST-API.
*/
protected ProcessInfo startAdhocProcess(final RequestContext requestContext, NodeRef[] documentRefs) throws PublicApiException {
return startAdhocProcess(requestContext, documentRefs, null);
}
/**
* Start an adhoc-process with possible business key through the public REST-API.
*/
@SuppressWarnings("unchecked")
protected ProcessInfo startAdhocProcess(final RequestContext requestContext, NodeRef[] documentRefs) throws PublicApiException {
protected ProcessInfo startAdhocProcess(final RequestContext requestContext, NodeRef[] documentRefs, String businessKey) throws PublicApiException {
org.activiti.engine.repository.ProcessDefinition processDefinition = activitiProcessEngine
.getRepositoryService()
.createProcessDefinitionQuery()
@@ -202,8 +235,13 @@ public class EnterpriseWorkflowTestApi extends EnterpriseTestApi
final JSONObject createProcessObject = new JSONObject();
createProcessObject.put("processDefinitionId", processDefinition.getId());
if (businessKey != null)
{
createProcessObject.put("businessKey", businessKey);
}
final JSONObject variablesObject = new JSONObject();
variablesObject.put("bpm_priority", 1);
variablesObject.put("wf_notifyMe", Boolean.FALSE);
TenantUtil.runAsUserTenant(new TenantRunAsWork<Void>()
{
@@ -220,7 +258,7 @@ public class EnterpriseWorkflowTestApi extends EnterpriseTestApi
final JSONArray itemsObject = new JSONArray();
for (NodeRef nodeRef : documentRefs)
{
itemsObject.add(nodeRef.toString());
itemsObject.add(nodeRef.getId());
}
createProcessObject.put("items", itemsObject);
}
@@ -229,4 +267,43 @@ public class EnterpriseWorkflowTestApi extends EnterpriseTestApi
return processesClient.createProcess(createProcessObject.toJSONString());
}
/**
* Start a review pooled process through the public REST-API.
*/
@SuppressWarnings("unchecked")
protected ProcessInfo startReviewPooledProcess(final RequestContext requestContext) throws PublicApiException {
org.activiti.engine.repository.ProcessDefinition processDefinition = activitiProcessEngine
.getRepositoryService()
.createProcessDefinitionQuery()
.processDefinitionKey("@" + requestContext.getNetworkId() + "@activitiReviewPooled")
.singleResult();
ProcessesClient processesClient = publicApiClient.processesClient();
final JSONObject createProcessObject = new JSONObject();
createProcessObject.put("processDefinitionId", processDefinition.getId());
final JSONObject variablesObject = new JSONObject();
variablesObject.put("bpm_priority", 1);
variablesObject.put("wf_notifyMe", Boolean.FALSE);
TenantUtil.runAsUserTenant(new TenantRunAsWork<Void>()
{
@Override
public Void doWork() throws Exception
{
List<MemberOfSite> memberships = getTestFixture().getNetwork(requestContext.getNetworkId()).getSiteMemberships(requestContext.getRunAsUser());
assertTrue(memberships.size() > 0);
MemberOfSite memberOfSite = memberships.get(0);
String group = "GROUP_site_" + memberOfSite.getSiteId() + "_" + memberOfSite.getRole().name();
variablesObject.put("bpm_groupAssignee", group);
return null;
}
}, requestContext.getRunAsUser(), requestContext.getNetworkId());
createProcessObject.put("variables", variablesObject);
return processesClient.createProcess(createProcessObject.toJSONString());
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2005-2012 Alfresco Software Limited.
* Copyright (C) 2005-2013 Alfresco Software Limited.
*
* This file is part of Alfresco
*
@@ -34,6 +34,8 @@ public class ProcessDefinitionParser extends ListParser<ProcessDefinition>
processDefinition.setVersion(((Number) entry.get("version")).intValue());
processDefinition.setName((String) entry.get("name"));
processDefinition.setDeploymentId((String) entry.get("deploymentId"));
processDefinition.setTitle((String) entry.get("title"));
processDefinition.setDescription((String) entry.get("description"));
processDefinition.setCategory((String) entry.get("category"));
processDefinition.setStartFormResourceKey((String) entry.get("startFormResourceKey"));
processDefinition.setGraphicNotationDefined((Boolean) entry.get("graphicNotationDefined"));

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2005-2012 Alfresco Software Limited.
* Copyright (C) 2005-2013 Alfresco Software Limited.
*
* This file is part of Alfresco
*
@@ -29,6 +29,9 @@ import java.util.List;
import java.util.Map;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.rest.api.tests.RepoService.TestNetwork;
import org.alfresco.rest.api.tests.client.HttpResponse;
import org.alfresco.rest.api.tests.client.PublicApiClient.ListResponse;
import org.alfresco.rest.api.tests.client.PublicApiException;
import org.alfresco.rest.api.tests.client.RequestContext;
@@ -40,8 +43,7 @@ import org.junit.Test;
import org.springframework.http.HttpStatus;
/**
*
*
* @author Tijs Rademakers
* @author Frederik Heremans
*/
public class ProcessDefinitionWorkflowApiTest extends EnterpriseWorkflowTestApi
@@ -57,11 +59,11 @@ public class ProcessDefinitionWorkflowApiTest extends EnterpriseWorkflowTestApi
ListResponse<ProcessDefinition> processDefinitionsResponse = processDefinitionsClient.getProcessDefinitions(null);
Map<String, ProcessDefinition> processDefinitionMap = getProcessDefinitionMapByKey(processDefinitionsResponse.getList());
assertTrue(processDefinitionMap.containsKey(createProcessDefinitionKey("activitiReviewPooled", requestContext)));
assertTrue(processDefinitionMap.containsKey(createProcessDefinitionKey("activitiReview", requestContext)));
assertTrue(processDefinitionMap.containsKey(createProcessDefinitionKey("activitiParallelGroupReview", requestContext)));
assertTrue(processDefinitionMap.containsKey(createProcessDefinitionKey("activitiParallelReview", requestContext)));
assertTrue(processDefinitionMap.containsKey(createProcessDefinitionKey("activitiAdhoc", requestContext)));
assertTrue(processDefinitionMap.containsKey("activitiReviewPooled"));
assertTrue(processDefinitionMap.containsKey("activitiReview"));
assertTrue(processDefinitionMap.containsKey("activitiParallelGroupReview"));
assertTrue(processDefinitionMap.containsKey("activitiParallelReview"));
assertTrue(processDefinitionMap.containsKey("activitiAdhoc"));
assertEquals(5, processDefinitionMap.size());
@@ -74,16 +76,18 @@ public class ProcessDefinitionWorkflowApiTest extends EnterpriseWorkflowTestApi
assertNotNull(activitiDefinition);
ProcessDefinition adhocDefinition = processDefinitionMap.get(adhocKey);
ProcessDefinition adhocDefinitionRest = processDefinitionMap.get("activitiAdhoc");
assertEquals(activitiDefinition.getId(), adhocDefinition.getId());
assertEquals(activitiDefinition.getKey(), adhocDefinition.getKey());
assertEquals(activitiDefinition.getDeploymentId(), adhocDefinition.getDeploymentId());
assertEquals(activitiDefinition.getCategory(), adhocDefinition.getCategory());
assertEquals(activitiDefinition.getName(), adhocDefinition.getName());
assertEquals(activitiDefinition.getVersion(), adhocDefinition.getVersion());
assertEquals(((ProcessDefinitionEntity) activitiDefinition).isGraphicalNotationDefined(), adhocDefinition.isGraphicNotationDefined());
assertEquals("wf:submitAdhocTask", adhocDefinition.getStartFormResourceKey());
assertEquals(activitiDefinition.getId(), adhocDefinitionRest.getId());
assertEquals("activitiAdhoc", adhocDefinitionRest.getKey());
assertEquals(activitiDefinition.getDeploymentId(), adhocDefinitionRest.getDeploymentId());
assertEquals(activitiDefinition.getCategory(), adhocDefinitionRest.getCategory());
assertEquals(activitiDefinition.getName(), adhocDefinitionRest.getName());
assertEquals(activitiDefinition.getVersion(), adhocDefinitionRest.getVersion());
assertEquals(((ProcessDefinitionEntity) activitiDefinition).isGraphicalNotationDefined(), adhocDefinitionRest.isGraphicNotationDefined());
assertEquals("wf:submitAdhocTask", adhocDefinitionRest.getStartFormResourceKey());
assertEquals("New Task", adhocDefinitionRest.getTitle());
assertEquals("Assign a new task to yourself or a colleague", adhocDefinitionRest.getDescription());
}
@Test
@@ -104,11 +108,11 @@ public class ProcessDefinitionWorkflowApiTest extends EnterpriseWorkflowTestApi
// Filter on category equals
Map<String, ProcessDefinition> processDefinitionMap = getProcessDefinitions(processDefinitionsClient, "(category = 'http://alfresco.org')");
assertTrue(processDefinitionMap.containsKey(createProcessDefinitionKey("activitiReviewPooled", requestContext)));
assertTrue(processDefinitionMap.containsKey(createProcessDefinitionKey("activitiReview", requestContext)));
assertTrue(processDefinitionMap.containsKey(createProcessDefinitionKey("activitiParallelGroupReview", requestContext)));
assertTrue(processDefinitionMap.containsKey(createProcessDefinitionKey("activitiParallelReview", requestContext)));
assertTrue(processDefinitionMap.containsKey(createProcessDefinitionKey("activitiAdhoc", requestContext)));
assertTrue(processDefinitionMap.containsKey("activitiReviewPooled"));
assertTrue(processDefinitionMap.containsKey("activitiReview"));
assertTrue(processDefinitionMap.containsKey("activitiParallelGroupReview"));
assertTrue(processDefinitionMap.containsKey("activitiParallelReview"));
assertTrue(processDefinitionMap.containsKey("activitiAdhoc"));
assertEquals(5, processDefinitionMap.size());
processDefinitionMap = getProcessDefinitions(processDefinitionsClient, "(category = 'unexisting')");
@@ -116,15 +120,15 @@ public class ProcessDefinitionWorkflowApiTest extends EnterpriseWorkflowTestApi
// Filter on name equals
processDefinitionMap = getProcessDefinitions(processDefinitionsClient, "(name = 'Adhoc Activiti Process')");
assertTrue(processDefinitionMap.containsKey(createProcessDefinitionKey("activitiAdhoc", requestContext)));
assertTrue(processDefinitionMap.containsKey("activitiAdhoc"));
assertEquals(1, processDefinitionMap.size());
processDefinitionMap = getProcessDefinitions(processDefinitionsClient, "(name = 'unexisting')");
assertEquals(0, processDefinitionMap.size());
// Filter on key equals
processDefinitionMap = getProcessDefinitions(processDefinitionsClient, "(key='" + adhocKey +"')");
assertTrue(processDefinitionMap.containsKey(createProcessDefinitionKey("activitiAdhoc", requestContext)));
processDefinitionMap = getProcessDefinitions(processDefinitionsClient, "(key='activitiAdhoc')");
assertTrue(processDefinitionMap.containsKey("activitiAdhoc"));
assertEquals(1, processDefinitionMap.size());
processDefinitionMap = getProcessDefinitions(processDefinitionsClient, "(key='unexisting')");
@@ -139,7 +143,7 @@ public class ProcessDefinitionWorkflowApiTest extends EnterpriseWorkflowTestApi
// Filter on deploymentId equals
processDefinitionMap = getProcessDefinitions(processDefinitionsClient, "(deploymentId='" + activitiDefinition.getDeploymentId() + "')");
assertTrue(processDefinitionMap.containsKey(createProcessDefinitionKey("activitiAdhoc", requestContext)));
assertTrue(processDefinitionMap.containsKey("activitiAdhoc"));
assertEquals(1, processDefinitionMap.size());
processDefinitionMap = getProcessDefinitions(processDefinitionsClient, "(deploymentId='unexisting')");
@@ -148,11 +152,11 @@ public class ProcessDefinitionWorkflowApiTest extends EnterpriseWorkflowTestApi
// Filter on category matches
processDefinitionMap = getProcessDefinitions(processDefinitionsClient, "(category matches('%alfresco.o%'))");
assertTrue(processDefinitionMap.containsKey(createProcessDefinitionKey("activitiReviewPooled", requestContext)));
assertTrue(processDefinitionMap.containsKey(createProcessDefinitionKey("activitiReview", requestContext)));
assertTrue(processDefinitionMap.containsKey(createProcessDefinitionKey("activitiParallelGroupReview", requestContext)));
assertTrue(processDefinitionMap.containsKey(createProcessDefinitionKey("activitiParallelReview", requestContext)));
assertTrue(processDefinitionMap.containsKey(createProcessDefinitionKey("activitiAdhoc", requestContext)));
assertTrue(processDefinitionMap.containsKey("activitiReviewPooled"));
assertTrue(processDefinitionMap.containsKey("activitiReview"));
assertTrue(processDefinitionMap.containsKey("activitiParallelGroupReview"));
assertTrue(processDefinitionMap.containsKey("activitiParallelReview"));
assertTrue(processDefinitionMap.containsKey("activitiAdhoc"));
assertEquals(5, processDefinitionMap.size());
processDefinitionMap = getProcessDefinitions(processDefinitionsClient, "(category matches('unexisting'))");
@@ -160,15 +164,15 @@ public class ProcessDefinitionWorkflowApiTest extends EnterpriseWorkflowTestApi
// Filter on name matches
processDefinitionMap = getProcessDefinitions(processDefinitionsClient, "(name matches('Adhoc Activiti %'))");
assertTrue(processDefinitionMap.containsKey(createProcessDefinitionKey("activitiAdhoc", requestContext)));
assertTrue(processDefinitionMap.containsKey("activitiAdhoc"));
assertEquals(1, processDefinitionMap.size());
processDefinitionMap = getProcessDefinitions(processDefinitionsClient, "(name matches('unexisting'))");
assertEquals(0, processDefinitionMap.size());
// Filter on key matches
processDefinitionMap = getProcessDefinitions(processDefinitionsClient, "(key matches('" + adhocKey.substring(0, adhocKey.length() - 3) +"%'))");
assertTrue(processDefinitionMap.containsKey(createProcessDefinitionKey("activitiAdhoc", requestContext)));
processDefinitionMap = getProcessDefinitions(processDefinitionsClient, "(key matches('activitiAd%'))");
assertTrue(processDefinitionMap.containsKey("activitiAdhoc"));
assertEquals(1, processDefinitionMap.size());
}
@@ -193,7 +197,7 @@ public class ProcessDefinitionWorkflowApiTest extends EnterpriseWorkflowTestApi
// Check fields of a resulting process-definition
assertEquals(activitiDefinition.getId(), adhocDefinition.getId());
assertEquals(activitiDefinition.getKey(), adhocDefinition.getKey());
assertEquals("activitiAdhoc", adhocDefinition.getKey());
assertEquals(activitiDefinition.getDeploymentId(), adhocDefinition.getDeploymentId());
assertEquals(activitiDefinition.getCategory(), adhocDefinition.getCategory());
assertEquals(activitiDefinition.getName(), adhocDefinition.getName());
@@ -254,10 +258,10 @@ public class ProcessDefinitionWorkflowApiTest extends EnterpriseWorkflowTestApi
// Check well-known properties and their types
// Validate bpm:description
JSONObject modelEntry = modelFieldsByName.get("bpm_description");
JSONObject modelEntry = modelFieldsByName.get("bpm_workflowDescription");
assertNotNull(modelEntry);
assertEquals("Description", modelEntry.get("title"));
assertEquals("{http://www.alfresco.org/model/bpm/1.0}description", modelEntry.get("qualifiedName"));
assertEquals("{http://www.alfresco.org/model/bpm/1.0}workflowDescription", modelEntry.get("qualifiedName"));
assertEquals("d:text", modelEntry.get("dataType"));
assertFalse((Boolean)modelEntry.get("required"));
@@ -286,13 +290,13 @@ public class ProcessDefinitionWorkflowApiTest extends EnterpriseWorkflowTestApi
assertFalse((Boolean)modelEntry.get("required"));
// Validate bpm:priority
modelEntry = modelFieldsByName.get("bpm_priority");
modelEntry = modelFieldsByName.get("bpm_workflowPriority");
assertNotNull(modelEntry);
assertEquals("Priority", modelEntry.get("title"));
assertEquals("{http://www.alfresco.org/model/bpm/1.0}priority", modelEntry.get("qualifiedName"));
assertEquals("Workflow Priority", modelEntry.get("title"));
assertEquals("{http://www.alfresco.org/model/bpm/1.0}workflowPriority", modelEntry.get("qualifiedName"));
assertEquals("d:int", modelEntry.get("dataType"));
assertEquals("2", modelEntry.get("defaultValue"));
assertTrue((Boolean)modelEntry.get("required"));
assertFalse((Boolean)modelEntry.get("required"));
// Validate bpm:package
modelEntry = modelFieldsByName.get("bpm_package");
@@ -301,6 +305,196 @@ public class ProcessDefinitionWorkflowApiTest extends EnterpriseWorkflowTestApi
assertEquals("{http://www.alfresco.org/model/bpm/1.0}package", modelEntry.get("qualifiedName"));
assertEquals("bpm:workflowPackage", modelEntry.get("dataType"));
assertFalse((Boolean)modelEntry.get("required"));
// Validate bpm:status
modelEntry = modelFieldsByName.get("bpm_status");
assertNotNull(modelEntry);
assertEquals("Status", modelEntry.get("title"));
assertEquals("{http://www.alfresco.org/model/bpm/1.0}status", modelEntry.get("qualifiedName"));
assertEquals("d:text", modelEntry.get("dataType"));
assertEquals("Not Yet Started", modelEntry.get("defaultValue"));
assertTrue((Boolean)modelEntry.get("required"));
JSONArray allowedValues = (JSONArray) modelEntry.get("allowedValues");
assertNotNull(allowedValues);
assertEquals(5, allowedValues.size());
assertTrue(allowedValues.contains("Not Yet Started"));
assertTrue(allowedValues.contains("In Progress"));
assertTrue(allowedValues.contains("On Hold"));
assertTrue(allowedValues.contains("Cancelled"));
assertTrue(allowedValues.contains("Completed"));
}
@Test
public void testGetProcessDefinitionStartModelUnexisting() throws Exception
{
initApiClientWithTestUser();
ProcessDefinitionsClient processDefinitionsClient = publicApiClient.processDefinitionsClient();
try
{
processDefinitionsClient.findStartFormModel("unexisting");
fail("Exception expected");
}
catch(PublicApiException expected)
{
assertEquals(HttpStatus.NOT_FOUND.value(), expected.getHttpResponse().getStatusCode());
assertErrorSummary("The entity with id: unexisting was not found", expected.getHttpResponse());
}
}
@Test
public void testMethodNotAllowedURIs() throws Exception
{
RequestContext requestContext = initApiClientWithTestUser();
HttpResponse response = publicApiClient.get("public", "process-definitions", null, null, null, null);
assertEquals(200, response.getStatusCode());
response = publicApiClient.post("public", "process-definitions", null, null, null, null);
assertEquals(405, response.getStatusCode());
response = publicApiClient.delete("public", "process-definitions", null, null, null);
assertEquals(405, response.getStatusCode());
response = publicApiClient.put("public", "process-definitions", null, null, null, null, null);
assertEquals(405, response.getStatusCode());
String adhocKey = createProcessDefinitionKey("activitiAdhoc", requestContext);
org.activiti.engine.repository.ProcessDefinition processDefinition = activitiProcessEngine.getRepositoryService()
.createProcessDefinitionQuery()
.processDefinitionKey(adhocKey)
.singleResult();
assertNotNull(processDefinition);
response = publicApiClient.get("public", "process-definitions", processDefinition.getId(), null, null, null);
assertEquals(200, response.getStatusCode());
response = publicApiClient.post("public", "process-definitions", processDefinition.getId(), null, null, null);
assertEquals(405, response.getStatusCode());
response = publicApiClient.delete("public", "process-definitions", processDefinition.getId(), null, null);
assertEquals(405, response.getStatusCode());
response = publicApiClient.put("public", "process-definitions", processDefinition.getId(), null, null, null, null);
assertEquals(405, response.getStatusCode());
response = publicApiClient.get("public", "process-definitions", processDefinition.getId(), "start-form-model", null, null);
assertEquals(200, response.getStatusCode());
response = publicApiClient.post("public", "process-definitions", processDefinition.getId(), "start-form-model", null, null);
assertEquals(405, response.getStatusCode());
response = publicApiClient.delete("public", "process-definitions", processDefinition.getId(), "start-form-model", null);
assertEquals(405, response.getStatusCode());
response = publicApiClient.put("public", "process-definitions", processDefinition.getId(), "start-form-model", null, null, null);
assertEquals(405, response.getStatusCode());
}
@Test
public void testAuthenticationAndAuthorization() throws Exception
{
// Fetching process definitions as admin should be possible
RequestContext requestContext = initApiClientWithTestUser();
String tenantAdmin = AuthenticationUtil.getAdminUserName() + "@" + requestContext.getNetworkId();
publicApiClient.setRequestContext(new RequestContext(requestContext.getNetworkId(), tenantAdmin));
ProcessDefinitionsClient processDefinitionsClient = publicApiClient.processDefinitionsClient();
ListResponse<ProcessDefinition> processDefinitionsResponse = processDefinitionsClient.getProcessDefinitions(null);
Map<String, ProcessDefinition> processDefinitionMap = getProcessDefinitionMapByKey(processDefinitionsResponse.getList());
assertTrue(processDefinitionMap.containsKey("activitiReviewPooled"));
assertTrue(processDefinitionMap.containsKey("activitiReview"));
assertTrue(processDefinitionMap.containsKey("activitiParallelGroupReview"));
assertTrue(processDefinitionMap.containsKey("activitiParallelReview"));
assertTrue(processDefinitionMap.containsKey("activitiAdhoc"));
assertEquals(5, processDefinitionMap.size());
// Fetching process definitions as admin from another tenant shouldn't be possible
TestNetwork anotherNetwork = getOtherNetwork(requestContext.getNetworkId());
tenantAdmin = AuthenticationUtil.getAdminUserName() + "@" + anotherNetwork.getId();
RequestContext otherContext = new RequestContext(anotherNetwork.getId(), tenantAdmin);
publicApiClient.setRequestContext(otherContext);
processDefinitionsResponse = processDefinitionsClient.getProcessDefinitions(null);
processDefinitionMap = getProcessDefinitionMapByKey(processDefinitionsResponse.getList());
// the response should contain process definitions from the new tenant
assertTrue(processDefinitionMap.containsKey("activitiReviewPooled"));
assertTrue(processDefinitionMap.containsKey("activitiReview"));
assertTrue(processDefinitionMap.containsKey("activitiParallelGroupReview"));
assertTrue(processDefinitionMap.containsKey("activitiParallelReview"));
assertTrue(processDefinitionMap.containsKey("activitiAdhoc"));
assertEquals(5, processDefinitionMap.size());
// Fetching a specific process definitions as admin should be possible
publicApiClient.setRequestContext(requestContext);
String adhocKey = createProcessDefinitionKey("activitiAdhoc", requestContext);
org.activiti.engine.repository.ProcessDefinition activitiDefinition = activitiProcessEngine.getRepositoryService()
.createProcessDefinitionQuery()
.processDefinitionKey(adhocKey)
.singleResult();
assertNotNull(activitiDefinition);
// Get a single process definitions
ProcessDefinition adhocDefinition = processDefinitionsClient.findProcessDefinitionById(activitiDefinition.getId());
assertNotNull(adhocDefinition);
// Check fields of a resulting process-definition
assertEquals(activitiDefinition.getId(), adhocDefinition.getId());
assertEquals("activitiAdhoc", adhocDefinition.getKey());
assertEquals(activitiDefinition.getDeploymentId(), adhocDefinition.getDeploymentId());
assertEquals(activitiDefinition.getCategory(), adhocDefinition.getCategory());
assertEquals(activitiDefinition.getName(), adhocDefinition.getName());
assertEquals(activitiDefinition.getVersion(), adhocDefinition.getVersion());
assertEquals(((ProcessDefinitionEntity) activitiDefinition).isGraphicalNotationDefined(), adhocDefinition.isGraphicNotationDefined());
assertEquals("wf:submitAdhocTask", adhocDefinition.getStartFormResourceKey());
// Fetching a specific process definitions as admin from another tenant should not be possible
publicApiClient.setRequestContext(otherContext);
try
{
adhocDefinition = processDefinitionsClient.findProcessDefinitionById(activitiDefinition.getId());
fail("not found expected");
}
catch (PublicApiException e)
{
assertEquals(HttpStatus.NOT_FOUND.value(), e.getHttpResponse().getStatusCode());
}
// Fetching the start form model of a process definition as admin should be possible
publicApiClient.setRequestContext(requestContext);
JSONObject model = processDefinitionsClient.findStartFormModel(activitiDefinition.getId());
assertNotNull(model);
JSONArray entries = (JSONArray) model.get("entries");
assertNotNull(entries);
// Add all entries to a map, to make lookup easier
Map<String, JSONObject> modelFieldsByName = new HashMap<String, JSONObject>();
JSONObject entry = null;
for(int i=0; i<entries.size(); i++)
{
entry = (JSONObject) entries.get(i);
assertNotNull(entry);
entry = (JSONObject) entry.get("entry");
assertNotNull(entry);
modelFieldsByName.put((String) entry.get("name"), entry);
}
// Check well-known properties and their types
// Validate bpm:description
JSONObject modelEntry = modelFieldsByName.get("bpm_workflowDescription");
assertNotNull(modelEntry);
assertEquals("Description", modelEntry.get("title"));
assertEquals("{http://www.alfresco.org/model/bpm/1.0}workflowDescription", modelEntry.get("qualifiedName"));
assertEquals("d:text", modelEntry.get("dataType"));
assertFalse((Boolean)modelEntry.get("required"));
// Fetching a specific process definitions as admin from another tenant should not be possible
publicApiClient.setRequestContext(otherContext);
try
{
model = processDefinitionsClient.findStartFormModel(activitiDefinition.getId());
fail("not found expected");
}
catch (PublicApiException e)
{
assertEquals(HttpStatus.NOT_FOUND.value(), e.getHttpResponse().getStatusCode());
}
}
protected String createProcessDefinitionKey(String key, RequestContext requestContext)
@@ -325,6 +519,7 @@ public class ProcessDefinitionWorkflowApiTest extends EnterpriseWorkflowTestApi
{
params = Collections.singletonMap("where", whereClause);
}
ListResponse<ProcessDefinition> processDefinitionsResponse = processDefinitionsClient.getProcessDefinitions(params);
return getProcessDefinitionMapByKey(processDefinitionsResponse.getList());
}

View File

@@ -38,10 +38,14 @@ public class ProcessesParser extends ListParser<ProcessInfo>
processesRest.setProcessDefinitionKey((String) entry.get("processDefinitionKey"));
processesRest.setStartedAt(WorkflowApiClient.parseDate(entry, "startedAt"));
processesRest.setEndedAt(WorkflowApiClient.parseDate(entry, "endedAt"));
processesRest.setDurationInMillis((Long) entry.get("durationInMillis"));
processesRest.setDurationInMs((Long) entry.get("durationInMs"));
processesRest.setDeleteReason((String) entry.get("deleteReason"));
processesRest.setBusinessKey((String) entry.get("businessKey"));
processesRest.setSuperProcessInstanceId((String) entry.get("superProcessInstanceId"));
processesRest.setStartActivityId((String) entry.get("startActivityId"));
processesRest.setStartUserId((String) entry.get("startUserId"));
processesRest.setEndActivityId((String) entry.get("endActivityId"));
processesRest.setCompleted((Boolean) entry.get("completed"));
processesRest.setVariables((Map<String,Object>) entry.get("variables"));
processesRest.setItems((Set<String>) entry.get("item"));
return processesRest;

View File

@@ -31,7 +31,6 @@ import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -50,7 +49,6 @@ import org.alfresco.repo.workflow.WorkflowConstants;
import org.alfresco.repo.workflow.activiti.ActivitiConstants;
import org.alfresco.repo.workflow.activiti.ActivitiScriptNode;
import org.alfresco.rest.api.tests.RepoService.TestNetwork;
import org.alfresco.rest.api.tests.RepoService.TestPerson;
import org.alfresco.rest.api.tests.client.PublicApiException;
import org.alfresco.rest.api.tests.client.RequestContext;
import org.alfresco.rest.api.tests.client.data.MemberOfSite;
@@ -806,6 +804,53 @@ public class TaskWorkflowApiTest extends EnterpriseWorkflowTestApi
}
}
@Test
@SuppressWarnings("unchecked")
public void testChangeDueDate() throws Exception
{
RequestContext requestContext = initApiClientWithTestUser();
ProcessInstance processInstance = startAdhocProcess(requestContext.getRunAsUser(), requestContext.getNetworkId(), null);
try
{
Task task = activitiProcessEngine.getTaskService().createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
TasksClient tasksClient = publicApiClient.tasksClient();
JSONObject taskObject = tasksClient.findTaskById(task.getId());
assertNull(taskObject.get("dueAt"));
List<String> selectedFields = new ArrayList<String>();
selectedFields.addAll(Arrays.asList(new String[] { "name", "description", "dueAt", "priority", "assignee", "owner"}));
// set due date
JSONObject taskBody = new JSONObject();
String dueAt = formatDate(new Date());
taskBody.put("dueAt", dueAt);
tasksClient.updateTask(task.getId(), taskBody, selectedFields);
taskObject = tasksClient.findTaskById(task.getId());
assertNotNull(taskObject.get("dueAt"));
taskBody = new JSONObject();
taskBody.put("dueAt", taskObject.get("dueAt"));
tasksClient.updateTask(task.getId(), taskBody, selectedFields);
taskObject = tasksClient.findTaskById(task.getId());
assertNotNull(taskObject.get("dueAt"));
JSONObject variableBody = new JSONObject();
variableBody.put("name", "bpm_workflowDueDate");
variableBody.put("value", formatDate(new Date()));
variableBody.put("type", "d:datetime");
variableBody.put("scope", "global");
tasksClient.updateTaskVariable(task.getId(), "bpm_workflowDueDate", variableBody);
}
finally
{
cleanupProcessInstance(processInstance);
}
}
@Test
public void testGetTasks() throws Exception
{
@@ -922,27 +967,28 @@ public class TaskWorkflowApiTest extends EnterpriseWorkflowTestApi
activitiProcessEngine.getTaskService().saveTask(activeTask);
activitiProcessEngine.getTaskService().addCandidateUser(activeTask.getId(), anotherUserId);
activitiProcessEngine.getTaskService().addCandidateGroup(activeTask.getId(), "sales");
activitiProcessEngine.getTaskService().setVariableLocal(activeTask.getId(), "numberVar", 10);
TasksClient tasksClient = publicApiClient.tasksClient();
// Test status filtering - active
Map<String, String> params = new HashMap<String, String>();
params.put("where", "(status = 'active' AND processInstanceId = '" + processInstance.getId() + "')");
params.put("where", "(status = 'active' AND processId = '" + processInstance.getId() + "')");
assertTasksPresentInTaskQuery(params, tasksClient, false, activeTask.getId());
// Test status filtering - completed
params.clear();
params.put("where", "(status = 'completed' AND processInstanceId = '" + processInstance.getId() + "')");
params.put("where", "(status = 'completed' AND processId = '" + processInstance.getId() + "')");
assertTasksPresentInTaskQuery(params, tasksClient, false, completedTask.getId());
// Test status filtering - any
params.clear();
params.put("where", "(status = 'any' AND processInstanceId = '" + processInstance.getId() + "')");
params.put("where", "(status = 'any' AND processId = '" + processInstance.getId() + "')");
assertTasksPresentInTaskQuery(params, tasksClient, false, activeTask.getId(), completedTask.getId());
// Test status filtering - no value should default to 'active'
params.clear();
params.put("where", "(processInstanceId = '" + processInstance.getId() + "')");
params.put("where", "(processId = '" + processInstance.getId() + "')");
assertTasksPresentInTaskQuery(params, tasksClient, false, activeTask.getId());
// Test status filtering - illegal status
@@ -1021,11 +1067,11 @@ public class TaskWorkflowApiTest extends EnterpriseWorkflowTestApi
// Candidate group filtering, only available for active tasks. When used with completed/any 400 is returned
params.clear();
params.put("where", "(status = 'active' AND candidateGroup = 'sales' AND processInstanceId='" + processInstance.getId() +"')");
params.put("where", "(status = 'active' AND candidateGroup = 'sales' AND processId='" + processInstance.getId() +"')");
assertTasksPresentInTaskQuery(params, tasksClient, activeTask.getId());
params.clear();
params.put("where", "(status = 'completed' AND candidateGroup = 'sales' AND processInstanceId='" + processInstance.getId() +"')");
params.put("where", "(status = 'completed' AND candidateGroup = 'sales' AND processId='" + processInstance.getId() +"')");
try
{
tasksClient.findTasks(params);
@@ -1038,7 +1084,7 @@ public class TaskWorkflowApiTest extends EnterpriseWorkflowTestApi
}
params.clear();
params.put("where", "(status = 'any' AND candidateGroup = 'sales' AND processInstanceId='" + processInstance.getId() +"')");
params.put("where", "(status = 'any' AND candidateGroup = 'sales' AND processId='" + processInstance.getId() +"')");
try
{
tasksClient.findTasks(params);
@@ -1052,94 +1098,94 @@ public class TaskWorkflowApiTest extends EnterpriseWorkflowTestApi
// Name filtering
params.clear();
params.put("where", "(status = 'active' AND name = 'Task name' AND processInstanceId='" + processInstance.getId() +"')");
params.put("where", "(status = 'active' AND name = 'Task name' AND processId='" + processInstance.getId() +"')");
assertTasksPresentInTaskQuery(params, tasksClient, activeTask.getId());
params.clear();
params.put("where", "(status = 'completed' AND name = 'Another task name' AND processInstanceId='" + processInstance.getId() +"')");
params.put("where", "(status = 'completed' AND name = 'Another task name' AND processId='" + processInstance.getId() +"')");
assertTasksPresentInTaskQuery(params, tasksClient, completedTask.getId());
params.clear();
params.put("where", "(status = 'any' AND name = 'Another task name' AND processInstanceId='" + processInstance.getId() +"')");
params.put("where", "(status = 'any' AND name = 'Another task name' AND processId='" + processInstance.getId() +"')");
assertTasksPresentInTaskQuery(params, tasksClient, completedTask.getId());
// Description filtering
params.clear();
params.put("where", "(status = 'active' AND description = 'This is a test description' AND processInstanceId='" + processInstance.getId() +"')");
params.put("where", "(status = 'active' AND description = 'This is a test description' AND processId='" + processInstance.getId() +"')");
assertTasksPresentInTaskQuery(params, tasksClient, activeTask.getId());
params.clear();
params.put("where", "(status = 'completed' AND description = 'This is another test description' AND processInstanceId='" + processInstance.getId() +"')");
params.put("where", "(status = 'completed' AND description = 'This is another test description' AND processId='" + processInstance.getId() +"')");
assertTasksPresentInTaskQuery(params, tasksClient, completedTask.getId());
params.clear();
params.put("where", "(status = 'any' AND description = 'This is another test description' AND processInstanceId='" + processInstance.getId() +"')");
params.put("where", "(status = 'any' AND description = 'This is another test description' AND processId='" + processInstance.getId() +"')");
assertTasksPresentInTaskQuery(params, tasksClient, completedTask.getId());
// Priority filtering
params.clear();
params.put("where", "(status = 'active' AND priority = 2 AND processInstanceId='" + processInstance.getId() +"')");
params.put("where", "(status = 'active' AND priority = 2 AND processId='" + processInstance.getId() +"')");
assertTasksPresentInTaskQuery(params, tasksClient, activeTask.getId());
params.put("where", "(status = 'completed' AND priority = 3 AND processInstanceId='" + processInstance.getId() +"')");
params.put("where", "(status = 'completed' AND priority = 3 AND processId='" + processInstance.getId() +"')");
assertTasksPresentInTaskQuery(params, tasksClient, completedTask.getId());
params.put("where", "(status = 'any' AND priority = 3 AND processInstanceId='" + processInstance.getId() +"')");
params.put("where", "(status = 'any' AND priority = 3 AND processId='" + processInstance.getId() +"')");
assertTasksPresentInTaskQuery(params, tasksClient, completedTask.getId());
// Process instance business-key filtering
params.clear();
params.put("where", "(status = 'active' AND processInstanceBusinessKey = '" + businessKey + "')");
params.put("where", "(status = 'active' AND processBusinessKey = '" + businessKey + "')");
assertTasksPresentInTaskQuery(params, tasksClient, activeTask.getId());
params.clear();
params.put("where", "(status = 'completed' AND processInstanceBusinessKey = '" + businessKey + "')");
params.put("where", "(status = 'completed' AND processBusinessKey = '" + businessKey + "')");
assertTasksPresentInTaskQuery(params, tasksClient, completedTask.getId());
params.clear();
params.put("where", "(status = 'any' AND processInstanceBusinessKey = '" + businessKey + "')");
params.put("where", "(status = 'any' AND processBusinessKey = '" + businessKey + "')");
assertTasksPresentInTaskQuery(params, tasksClient, completedTask.getId(), activeTask.getId());
// Activity definition id filtering
params.clear();
params.put("where", "(status = 'active' AND activityDefinitionId = 'verifyTaskDone' AND processInstanceId='" + processInstance.getId() +"')");
params.put("where", "(status = 'active' AND activityDefinitionId = 'verifyTaskDone' AND processId='" + processInstance.getId() +"')");
assertTasksPresentInTaskQuery(params, tasksClient, activeTask.getId());
params.clear();
params.put("where", "(status = 'completed' AND activityDefinitionId = 'adhocTask' AND processInstanceId='" + processInstance.getId() +"')");
params.put("where", "(status = 'completed' AND activityDefinitionId = 'adhocTask' AND processId='" + processInstance.getId() +"')");
assertTasksPresentInTaskQuery(params, tasksClient, completedTask.getId());
params.clear();
params.put("where", "(status = 'any' AND activityDefinitionId = 'adhocTask' AND processInstanceId='" + processInstance.getId() +"')");
params.put("where", "(status = 'any' AND activityDefinitionId = 'adhocTask' AND processId='" + processInstance.getId() +"')");
assertTasksPresentInTaskQuery(params, tasksClient, completedTask.getId());
// Process definition id filtering
params.clear();
params.put("where", "(status = 'active' AND processDefinitionId = '" + processInstance.getProcessDefinitionId() +
"' AND processInstanceId='" + processInstance.getId() +"')");
"' AND processId='" + processInstance.getId() +"')");
assertTasksPresentInTaskQuery(params, tasksClient, activeTask.getId());
params.clear();
params.put("where", "(status = 'completed' AND processDefinitionId = '" + processInstance.getProcessDefinitionId() +
"' AND processInstanceId='" + processInstance.getId() +"')");
"' AND processId='" + processInstance.getId() +"')");
assertTasksPresentInTaskQuery(params, tasksClient, completedTask.getId());
params.clear();
params.put("where", "(status = 'any' AND processDefinitionId = '" + processInstance.getProcessDefinitionId() +
"' AND processInstanceId='" + processInstance.getId() +"')");
"' AND processId='" + processInstance.getId() +"')");
assertTasksPresentInTaskQuery(params, tasksClient, activeTask.getId(), completedTask.getId());
// Process definition name filerting
params.clear();
params.put("where", "(status = 'active' AND processDefinitionName = 'Adhoc Activiti Process' AND processInstanceId='" + processInstance.getId() +"')");
params.put("where", "(status = 'active' AND processDefinitionName = 'Adhoc Activiti Process' AND processId='" + processInstance.getId() +"')");
assertTasksPresentInTaskQuery(params, tasksClient, activeTask.getId());
params.clear();
params.put("where", "(status = 'completed' AND processDefinitionName = 'Adhoc Activiti Process' AND processInstanceId='" + processInstance.getId() +"')");
params.put("where", "(status = 'completed' AND processDefinitionName = 'Adhoc Activiti Process' AND processId='" + processInstance.getId() +"')");
assertTasksPresentInTaskQuery(params, tasksClient, completedTask.getId());
params.clear();
params.put("where", "(status = 'any' AND processDefinitionName = 'Adhoc Activiti Process' AND processInstanceId='" + processInstance.getId() +"')");
params.put("where", "(status = 'any' AND processDefinitionName = 'Adhoc Activiti Process' AND processId='" + processInstance.getId() +"')");
assertTasksPresentInTaskQuery(params, tasksClient, activeTask.getId(), completedTask.getId());
// Due date filtering
@@ -1167,6 +1213,38 @@ public class TaskWorkflowApiTest extends EnterpriseWorkflowTestApi
params.clear();
params.put("where", "(status = 'any' AND startedAt = '" + ISO8601DateFormat.format(taskCreated.getTime()) +"')");
assertTasksPresentInTaskQuery(params, tasksClient, completedTask.getId(), activeTask.getId());
params.clear();
params.put("where", "(variables/numberVar > 'd:int 5')");
assertTasksPresentInTaskQuery(params, tasksClient, activeTask.getId());
params.clear();
params.put("where", "(variables/numberVar > 'd:int 10')");
assertEquals(0, getResultSizeForTaskQuery(params, tasksClient));
params.clear();
params.put("where", "(variables/numberVar >= 'd_int 10')");
assertTasksPresentInTaskQuery(params, tasksClient, activeTask.getId());
params.clear();
params.put("where", "(variables/numberVar >= 'd:int 11')");
assertEquals(0, getResultSizeForTaskQuery(params, tasksClient));
params.clear();
params.put("where", "(variables/numberVar <= 'd:int 10')");
assertTasksPresentInTaskQuery(params, tasksClient, activeTask.getId());
params.clear();
params.put("where", "(variables/numberVar <= 'd:int 9')");
assertEquals(0, getResultSizeForTaskQuery(params, tasksClient));
params.clear();
params.put("where", "(variables/numberVar < 'd_int 15')");
assertTasksPresentInTaskQuery(params, tasksClient, activeTask.getId());
params.clear();
params.put("where", "(variables/numberVar < 'd:int 10')");
assertEquals(0, getResultSizeForTaskQuery(params, tasksClient));
}
@Test
@@ -1240,7 +1318,7 @@ public class TaskWorkflowApiTest extends EnterpriseWorkflowTestApi
TasksClient tasksClient = publicApiClient.tasksClient();
Map<String, String> params = new HashMap<String, String>();
params.put("processInstanceId", processInstance.getId());
params.put("processId", processInstance.getId());
JSONObject resultingTasks = tasksClient.findTasks(params);
assertNotNull(resultingTasks);
@@ -1864,6 +1942,64 @@ public class TaskWorkflowApiTest extends EnterpriseWorkflowTestApi
}
}
@Test
@SuppressWarnings("unchecked")
public void testCreateTaskVariablesPresentInModel() throws Exception
{
RequestContext requestContext = initApiClientWithTestUser();
ProcessInstance processInstance = startAdhocProcess(requestContext.getRunAsUser(), requestContext.getNetworkId(), null);
try
{
Task task = activitiProcessEngine.getTaskService().createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
assertNotNull(task);
Map<String, Object> actualLocalVariables = activitiProcessEngine.getTaskService().getVariablesLocal(task.getId());
Map<String, Object> actualGlobalVariables = activitiProcessEngine.getRuntimeService().getVariables(processInstance.getId());
assertEquals(5, actualGlobalVariables.size());
assertEquals(7, actualLocalVariables.size());
// Update a global value that is present in the model with type given
JSONArray variablesArray = new JSONArray();
JSONObject variableBody = new JSONObject();
variableBody.put("name", "bpm_percentComplete");
variableBody.put("value", 20);
variableBody.put("type", "d:int");
variableBody.put("scope", "global");
variablesArray.add(variableBody);
variableBody = new JSONObject();
variableBody.put("name", "bpm_workflowPriority");
variableBody.put("value", 50);
variableBody.put("type", "d:int");
variableBody.put("scope", "local");
variablesArray.add(variableBody);
TasksClient tasksClient = publicApiClient.tasksClient();
JSONObject result = tasksClient.createTaskVariables(task.getId(), variablesArray);
assertNotNull(result);
JSONObject resultObject = (JSONObject) result.get("list");
JSONArray resultList = (JSONArray) resultObject.get("entries");
assertEquals(2, resultList.size());
JSONObject firstResultObject = (JSONObject) ((JSONObject) resultList.get(0)).get("entry");
assertEquals("bpm_percentComplete", firstResultObject.get("name"));
assertEquals(20L, firstResultObject.get("value"));
assertEquals("d:int", firstResultObject.get("type"));
assertEquals("global", firstResultObject.get("scope"));
assertEquals(20, activitiProcessEngine.getRuntimeService().getVariable(processInstance.getId(), "bpm_percentComplete"));
JSONObject secondResultObject = (JSONObject) ((JSONObject) resultList.get(1)).get("entry");
assertEquals("bpm_workflowPriority", secondResultObject.get("name"));
assertEquals(50L, secondResultObject.get("value"));
assertEquals("d:int", secondResultObject.get("type"));
assertEquals("local", secondResultObject.get("scope"));
assertEquals(50, activitiProcessEngine.getTaskService().getVariable(task.getId(), "bpm_workflowPriority"));
}
finally
{
cleanupProcessInstance(processInstance);
}
}
@Test
public void testGetTaskVariablesRawVariableTypes() throws Exception
{
@@ -2244,16 +2380,8 @@ public class TaskWorkflowApiTest extends EnterpriseWorkflowTestApi
// Check well-known properties and their types
// Validate bpm:description
JSONObject modelEntry = modelFieldsByName.get("bpm_description");
assertNotNull(modelEntry);
assertEquals("Description", modelEntry.get("title"));
assertEquals("{http://www.alfresco.org/model/bpm/1.0}description", modelEntry.get("qualifiedName"));
assertEquals("d:text", modelEntry.get("dataType"));
assertFalse((Boolean)modelEntry.get("required"));
// Validate bpm:description
modelEntry = modelFieldsByName.get("bpm_completionDate");
// Validate bpm:completionDate
JSONObject modelEntry = modelFieldsByName.get("bpm_completionDate");
assertNotNull(modelEntry);
assertEquals("Completion Date", modelEntry.get("title"));
assertEquals("{http://www.alfresco.org/model/bpm/1.0}completionDate", modelEntry.get("qualifiedName"));
@@ -2268,15 +2396,6 @@ public class TaskWorkflowApiTest extends EnterpriseWorkflowTestApi
assertEquals("d:text", modelEntry.get("dataType"));
assertFalse((Boolean)modelEntry.get("required"));
// Validate bpm:priority
modelEntry = modelFieldsByName.get("bpm_priority");
assertNotNull(modelEntry);
assertEquals("Priority", modelEntry.get("title"));
assertEquals("{http://www.alfresco.org/model/bpm/1.0}priority", modelEntry.get("qualifiedName"));
assertEquals("d:int", modelEntry.get("dataType"));
assertEquals("2", modelEntry.get("defaultValue"));
assertTrue((Boolean)modelEntry.get("required"));
// Validate bpm:package
modelEntry = modelFieldsByName.get("bpm_package");
assertNotNull(modelEntry);
@@ -2322,7 +2441,7 @@ public class TaskWorkflowApiTest extends EnterpriseWorkflowTestApi
JSONObject entryJSON = (JSONObject) entryObjectJSON.get("entry");
if (entryJSON.get("name").equals("Test Doc1")) {
doc1Found = true;
assertEquals(docNodeRefs[0].toString(), entryJSON.get("id"));
assertEquals(docNodeRefs[0].getId(), entryJSON.get("id"));
assertEquals("Test Doc1", entryJSON.get("name"));
assertEquals("Test Doc1 Title", entryJSON.get("title"));
assertEquals("Test Doc1 Description", entryJSON.get("description"));
@@ -2334,7 +2453,7 @@ public class TaskWorkflowApiTest extends EnterpriseWorkflowTestApi
assertNotNull(entryJSON.get("mimeType"));
} else {
doc2Found = true;
assertEquals(docNodeRefs[1].toString(), entryJSON.get("id"));
assertEquals(docNodeRefs[1].getId(), entryJSON.get("id"));
assertEquals("Test Doc2", entryJSON.get("name"));
assertEquals("Test Doc2 Title", entryJSON.get("title"));
assertEquals("Test Doc2 Description", entryJSON.get("description"));
@@ -2430,27 +2549,4 @@ public class TaskWorkflowApiTest extends EnterpriseWorkflowTestApi
log("Error while cleaning up process instance");
}
}
protected TestNetwork getOtherNetwork(String usedNetworkId) throws Exception {
Iterator<TestNetwork> networkIt = getTestFixture().getNetworksIt();
while(networkIt.hasNext()) {
TestNetwork network = networkIt.next();
if(!usedNetworkId.equals(network.getId())) {
return network;
}
}
fail("Need more than one network to test permissions");
return null;
}
protected TestPerson getOtherPersonInNetwork(String usedPerson, String networkId) throws Exception {
TestNetwork usedNetwork = getTestFixture().getNetwork(networkId);
for(TestPerson person : usedNetwork.getPeople()) {
if(!person.getId().equals(usedPerson)) {
return person;
}
}
fail("Network doesn't have additonal users, cannot perform test");
return null;
}
}

View File

@@ -16,6 +16,7 @@ import org.alfresco.rest.workflow.api.model.Deployment;
import org.alfresco.rest.workflow.api.model.ProcessDefinition;
import org.alfresco.rest.workflow.api.model.ProcessInfo;
import org.apache.commons.lang.StringUtils;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
public class WorkflowApiClient extends PublicApiClient
@@ -143,6 +144,20 @@ public class WorkflowApiClient extends PublicApiClient
return ProcessesParser.INSTANCE.parseEntry(entry);
}
public JSONObject getTasks(String processInstanceId, Map<String, String> params) throws PublicApiException
{
HttpResponse response = getAll("processes", processInstanceId, "tasks", null, params, "Failed to get task instances of processInstanceId " + processInstanceId);
JSONObject list = (JSONObject) response.getJsonResponse().get("list");
return list;
}
public JSONObject getActivities(String processInstanceId, Map<String, String> params) throws PublicApiException
{
HttpResponse response = getAll("processes", processInstanceId, "activities", null, params, "Failed to get activity instances of processInstanceId " + processInstanceId);
JSONObject list = (JSONObject) response.getJsonResponse().get("list");
return list;
}
public JSONObject findProcessItems(String processInstanceId) throws PublicApiException
{
HttpResponse response = getAll("processes", processInstanceId, "items", null, null,
@@ -159,6 +174,12 @@ public class WorkflowApiClient extends PublicApiClient
return list;
}
public JSONObject createVariables(String processId, JSONArray variables) throws PublicApiException
{
HttpResponse response = create("processes", processId, "variables", null, variables.toJSONString(), "Failed to create variables");
return response.getJsonResponse();
}
public JSONObject updateVariable(String processId, String variableName, JSONObject variable) throws PublicApiException
{
HttpResponse response = update("processes", processId, "variables", variableName, variable.toJSONString(), "Failed to update variable");
@@ -170,6 +191,11 @@ public class WorkflowApiClient extends PublicApiClient
remove("processes", processId, "variables", variableName, "Failed to delete variable");
}
public void addProcessItem(String processId, String body) throws PublicApiException
{
create("processes", processId, "items", null, body, "Failed to add item");
}
public void deleteProcessItem(String processId, String itemId) throws PublicApiException
{
remove("processes", processId, "items", itemId, "Failed to delete item");
@@ -234,6 +260,12 @@ public class WorkflowApiClient extends PublicApiClient
return findTaskVariables(taskId, null);
}
public JSONObject createTaskVariables(String taskId, JSONArray variables) throws PublicApiException
{
HttpResponse response = create("tasks", taskId, "variables", null, variables.toJSONString(), "Failed to create task variables");
return response.getJsonResponse();
}
public JSONObject updateTaskVariable(String taskId, String variableName, JSONObject variable) throws PublicApiException
{
HttpResponse response = update("tasks", taskId, "variables", variableName, variable.toJSONString(), "Failed to update task variable");

View File

@@ -0,0 +1,14 @@
package org.alfresco.rest.workflow.api.tests;
import org.alfresco.rest.api.tests.client.AuthenticatedHttp;
import org.alfresco.rest.api.tests.client.PublicApiHttpClient;
public class WorkflowApiHttpClient extends PublicApiHttpClient
{
public WorkflowApiHttpClient(String host, int port, String contextPath, String servletName, AuthenticatedHttp authenticatedHttp)
{
super(host, port, contextPath, servletName, authenticatedHttp);
apiName = "workflow";
}
}