/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.rest.service.api.repository;
import java.util.Calendar;
import org.activiti.engine.repository.Model;
import org.activiti.engine.test.Deployment;
import org.activiti.rest.service.BaseSpringRestTestCase;
import org.activiti.rest.service.api.RestUrls;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
/**
* @author Frederik Heremans
*/
public class ModelResourceTest extends BaseSpringRestTestCase {
@Deployment(resources={"org/activiti/rest/service/api/repository/oneTaskProcess.bpmn20.xml"})
public void testGetModel() throws Exception {
Model model = null;
try {
Calendar now = Calendar.getInstance();
now.set(Calendar.MILLISECOND, 0);
processEngineConfiguration.getClock().setCurrentTime(now.getTime());
model = repositoryService.newModel();
model.setCategory("Model category");
model.setKey("Model key");
model.setMetaInfo("Model metainfo");
model.setName("Model name");
model.setVersion(2);
model.setDeploymentId(deploymentId);
model.setTenantId("myTenant");
repositoryService.saveModel(model);
repositoryService.addModelEditorSource(model.getId(), "This is the editor source".getBytes());
repositoryService.addModelEditorSourceExtra(model.getId(), "This is the extra editor source".getBytes());
HttpGet httpGet = new HttpGet(SERVER_URL_PREFIX +
RestUrls.createRelativeResourceUrl(RestUrls.URL_MODEL, model.getId()));
CloseableHttpResponse response = executeRequest(httpGet, HttpStatus.SC_OK);
JsonNode responseNode = objectMapper.readTree(response.getEntity().getContent());
closeResponse(response);
assertNotNull(responseNode);
assertEquals("Model name", responseNode.get("name").textValue());
assertEquals("Model key", responseNode.get("key").textValue());
assertEquals("Model category", responseNode.get("category").textValue());
assertEquals(2, responseNode.get("version").intValue());
assertEquals("Model metainfo", responseNode.get("metaInfo").textValue());
assertEquals(deploymentId, responseNode.get("deploymentId").textValue());
assertEquals(model.getId(), responseNode.get("id").textValue());
assertEquals("myTenant", responseNode.get("tenantId").textValue());
assertEquals(now.getTime().getTime(), getDateFromISOString(responseNode.get("createTime").textValue()).getTime());
assertEquals(now.getTime().getTime(), getDateFromISOString(responseNode.get("lastUpdateTime").textValue()).getTime());
assertTrue(responseNode.get("url").textValue().endsWith(RestUrls.createRelativeResourceUrl(RestUrls.URL_MODEL, model.getId())));
assertTrue(responseNode.get("deploymentUrl").textValue().endsWith(RestUrls.createRelativeResourceUrl(RestUrls.URL_DEPLOYMENT, deploymentId)));
assertTrue(responseNode.get("sourceUrl").textValue().endsWith(RestUrls.createRelativeResourceUrl(RestUrls.URL_MODEL_SOURCE, model.getId())));
assertTrue(responseNode.get("sourceExtraUrl").textValue().endsWith(RestUrls.createRelativeResourceUrl(RestUrls.URL_MODEL_SOURCE_EXTRA, model.getId())));
} finally
{
try {
repositoryService.deleteModel(model.getId());
} catch(Throwable ignore) {
// Ignore, model might not be created
}
}
}
public void testGetUnexistingModel() throws Exception {
HttpGet httpGet = new HttpGet(SERVER_URL_PREFIX +
RestUrls.createRelativeResourceUrl(RestUrls.URL_MODEL, "unexisting"));
closeResponse(executeRequest(httpGet, HttpStatus.SC_NOT_FOUND));
}
public void testDeleteModel() throws Exception {
Model model = null;
try {
Calendar now = Calendar.getInstance();
now.set(Calendar.MILLISECOND, 0);
processEngineConfiguration.getClock().setCurrentTime(now.getTime());
model = repositoryService.newModel();
model.setCategory("Model category");
model.setKey("Model key");
model.setMetaInfo("Model metainfo");
model.setName("Model name");
model.setVersion(2);
repositoryService.saveModel(model);
HttpDelete httpDelete = new HttpDelete(SERVER_URL_PREFIX +
RestUrls.createRelativeResourceUrl(RestUrls.URL_MODEL, model.getId()));
closeResponse(executeRequest(httpDelete, HttpStatus.SC_NO_CONTENT));
// Check if the model is really gone
assertNull(repositoryService.createModelQuery().modelId(model.getId()).singleResult());
model = null;
} finally
{
if(model != null) {
try {
repositoryService.deleteModel(model.getId());
} catch(Throwable ignore) {
// Ignore, model might not be created
}
}
}
}
public void testDeleteUnexistingModel() throws Exception {
HttpDelete httpDelete = new HttpDelete(SERVER_URL_PREFIX +
RestUrls.createRelativeResourceUrl(RestUrls.URL_MODEL, "unexisting"));
closeResponse(executeRequest(httpDelete, HttpStatus.SC_NOT_FOUND));
}
@Deployment(resources={"org/activiti/rest/service/api/repository/oneTaskProcess.bpmn20.xml"})
public void testUpdateModel() throws Exception {
Model model = null;
try {
Calendar createTime = Calendar.getInstance();
createTime.set(Calendar.MILLISECOND, 0);
processEngineConfiguration.getClock().setCurrentTime(createTime.getTime());
model = repositoryService.newModel();
model.setCategory("Model category");
model.setKey("Model key");
model.setMetaInfo("Model metainfo");
model.setName("Model name");
model.setVersion(2);
repositoryService.saveModel(model);
Calendar updateTime = Calendar.getInstance();
updateTime.set(Calendar.MILLISECOND, 0);
updateTime.add(Calendar.HOUR, 1);
processEngineConfiguration.getClock().setCurrentTime(updateTime.getTime());
// Create update request
ObjectNode requestNode = objectMapper.createObjectNode();
requestNode.put("name", "Updated name");
requestNode.put("category", "Updated category");
requestNode.put("key", "Updated key");
requestNode.put("metaInfo", "Updated metainfo");
requestNode.put("deploymentId", deploymentId);
requestNode.put("version", 3);
requestNode.put("tenantId", "myTenant");
HttpPut httpPut = new HttpPut(SERVER_URL_PREFIX +
RestUrls.createRelativeResourceUrl(RestUrls.URL_MODEL, model.getId()));
httpPut.setEntity(new StringEntity(requestNode.toString()));
CloseableHttpResponse response = executeRequest(httpPut, HttpStatus.SC_OK);
JsonNode responseNode = objectMapper.readTree(response.getEntity().getContent());
closeResponse(response);
assertNotNull(responseNode);
assertEquals("Updated name", responseNode.get("name").textValue());
assertEquals("Updated key", responseNode.get("key").textValue());
assertEquals("Updated category", responseNode.get("category").textValue());
assertEquals(3, responseNode.get("version").intValue());
assertEquals("Updated metainfo", responseNode.get("metaInfo").textValue());
assertEquals(deploymentId, responseNode.get("deploymentId").textValue());
assertEquals(model.getId(), responseNode.get("id").textValue());
assertEquals("myTenant", responseNode.get("tenantId").textValue());
assertEquals(createTime.getTime().getTime(), getDateFromISOString(responseNode.get("createTime").textValue()).getTime());
assertEquals(updateTime.getTime().getTime(), getDateFromISOString(responseNode.get("lastUpdateTime").textValue()).getTime());
assertTrue(responseNode.get("url").textValue().endsWith(RestUrls.createRelativeResourceUrl(RestUrls.URL_MODEL, model.getId())));
assertTrue(responseNode.get("deploymentUrl").textValue().endsWith(RestUrls.createRelativeResourceUrl(RestUrls.URL_DEPLOYMENT, deploymentId)));
} finally
{
try {
repositoryService.deleteModel(model.getId());
} catch(Throwable ignore) {
// Ignore, model might not be created
}
}
}
@Deployment(resources={"org/activiti/rest/service/api/repository/oneTaskProcess.bpmn20.xml"})
public void testUpdateModelOverrideWithNull() throws Exception {
Model model = null;
try {
Calendar createTime = Calendar.getInstance();
createTime.set(Calendar.MILLISECOND, 0);
processEngineConfiguration.getClock().setCurrentTime(createTime.getTime());
model = repositoryService.newModel();
model.setCategory("Model category");
model.setKey("Model key");
model.setMetaInfo("Model metainfo");
model.setName("Model name");
model.setTenantId("myTenant");
model.setVersion(2);
repositoryService.saveModel(model);
Calendar updateTime = Calendar.getInstance();
updateTime.set(Calendar.MILLISECOND, 0);
processEngineConfiguration.getClock().setCurrentTime(updateTime.getTime());
// Create update request
ObjectNode requestNode = objectMapper.createObjectNode();
requestNode.put("name", (String) null);
requestNode.put("category", (String) null);
requestNode.put("key", (String) null);
requestNode.put("metaInfo", (String) null);
requestNode.put("deploymentId", (String) null);
requestNode.put("version", (String) null);
requestNode.put("tenantId", (String) null);
HttpPut httpPut = new HttpPut(SERVER_URL_PREFIX +
RestUrls.createRelativeResourceUrl(RestUrls.URL_MODEL, model.getId()));
httpPut.setEntity(new StringEntity(requestNode.toString()));
CloseableHttpResponse response = executeRequest(httpPut, HttpStatus.SC_OK);
JsonNode responseNode = objectMapper.readTree(response.getEntity().getContent());
closeResponse(response);
assertNotNull(responseNode);
assertNull(responseNode.get("name").textValue());
assertNull(responseNode.get("key").textValue());
assertNull(responseNode.get("category").textValue());
assertNull(responseNode.get("version").textValue());
assertNull(responseNode.get("metaInfo").textValue());
assertNull(responseNode.get("deploymentId").textValue());
assertNull(responseNode.get("tenantId").textValue());
assertEquals(model.getId(), responseNode.get("id").textValue());
assertEquals(createTime.getTime().getTime(), getDateFromISOString(responseNode.get("createTime").textValue()).getTime());
assertEquals(updateTime.getTime().getTime(), getDateFromISOString(responseNode.get("lastUpdateTime").textValue()).getTime());
assertTrue(responseNode.get("url").textValue().endsWith(RestUrls.createRelativeResourceUrl(RestUrls.URL_MODEL, model.getId())));
model = repositoryService.getModel(model.getId());
assertNull(model.getName());
assertNull(model.getKey());
assertNull(model.getCategory());
assertNull(model.getMetaInfo());
assertNull(model.getDeploymentId());
assertEquals("", model.getTenantId());
} finally {
try {
repositoryService.deleteModel(model.getId());
} catch(Throwable ignore) {
// Ignore, model might not be created
}
}
}
@Deployment(resources={"org/activiti/rest/service/api/repository/oneTaskProcess.bpmn20.xml"})
public void testUpdateModelNoFields() throws Exception {
Model model = null;
try {
Calendar now = Calendar.getInstance();
now.set(Calendar.MILLISECOND, 0);
processEngineConfiguration.getClock().setCurrentTime(now.getTime());
model = repositoryService.newModel();
model.setCategory("Model category");
model.setKey("Model key");
model.setMetaInfo("Model metainfo");
model.setName("Model name");
model.setVersion(2);
model.setDeploymentId(deploymentId);
repositoryService.saveModel(model);
// Use empty request-node, nothing should be changed after update
ObjectNode requestNode = objectMapper.createObjectNode();
HttpPut httpPut = new HttpPut(SERVER_URL_PREFIX +
RestUrls.createRelativeResourceUrl(RestUrls.URL_MODEL, model.getId()));
httpPut.setEntity(new StringEntity(requestNode.toString()));
CloseableHttpResponse response = executeRequest(httpPut, HttpStatus.SC_OK);
JsonNode responseNode = objectMapper.readTree(response.getEntity().getContent());
closeResponse(response);
assertNotNull(responseNode);
assertEquals("Model name", responseNode.get("name").textValue());
assertEquals("Model key", responseNode.get("key").textValue());
assertEquals("Model category", responseNode.get("category").textValue());
assertEquals(2, responseNode.get("version").intValue());
assertEquals("Model metainfo", responseNode.get("metaInfo").textValue());
assertEquals(deploymentId, responseNode.get("deploymentId").textValue());
assertEquals(model.getId(), responseNode.get("id").textValue());
assertEquals(now.getTime().getTime(), getDateFromISOString(responseNode.get("createTime").textValue()).getTime());
assertEquals(now.getTime().getTime(), getDateFromISOString(responseNode.get("lastUpdateTime").textValue()).getTime());
assertTrue(responseNode.get("url").textValue().endsWith(RestUrls.createRelativeResourceUrl(RestUrls.URL_MODEL, model.getId())));
assertTrue(responseNode.get("deploymentUrl").textValue().endsWith(RestUrls.createRelativeResourceUrl(RestUrls.URL_DEPLOYMENT, deploymentId)));
} finally {
try {
repositoryService.deleteModel(model.getId());
} catch(Throwable ignore) {
// Ignore, model might not be created
}
}
}
public void testUpdateUnexistingModel() throws Exception {
HttpPut httpPut = new HttpPut(SERVER_URL_PREFIX +
RestUrls.createRelativeResourceUrl(RestUrls.URL_MODEL, "unexisting"));
httpPut.setEntity(new StringEntity(objectMapper.createObjectNode().toString()));
closeResponse(executeRequest(httpPut, HttpStatus.SC_NOT_FOUND));
}
}