org.flowable.rest.service.api.repository.ModelResourceTest.java Source code

Java tutorial

Introduction

Here is the source code for org.flowable.rest.service.api.repository.ModelResourceTest.java

Source

/* 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.flowable.rest.service.api.repository;

import java.util.Calendar;

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 org.flowable.engine.repository.Model;
import org.flowable.engine.test.Deployment;
import org.flowable.rest.service.BaseSpringRestTestCase;
import org.flowable.rest.service.api.RestUrls;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

/**
 * @author Frederik Heremans
 */
public class ModelResourceTest extends BaseSpringRestTestCase {

    @Deployment(resources = { "org/flowable/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/flowable/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/flowable/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/flowable/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));
    }
}