From 9634930c678b4e875b63cc19f854bb866d4ea196 Mon Sep 17 00:00:00 2001 From: Maciej Swiderski Date: Fri, 12 Aug 2016 18:57:49 +0200 Subject: [PATCH] minor document related improvements to make it easier to consume (#568) --- .../model/instance/DocumentInstanceList.java | 2 +- .../remote/rest/jbpm/DocumentResource.java | 13 ++- .../services/jbpm/DocumentServiceBase.java | 10 ++- .../services/jbpm/JbpmKieServerExtension.java | 7 +- .../META-INF/kie-deployment-descriptor.xml | 1 - .../jbpm/DocumentServiceIntegrationTest.java | 20 +++-- .../jbpm/rest/JbpmRestIntegrationTest.java | 82 +++++++++++++++++++ 7 files changed, 115 insertions(+), 20 deletions(-) diff --git a/kie-server-parent/kie-server-api/src/main/java/org/kie/server/api/model/instance/DocumentInstanceList.java b/kie-server-parent/kie-server-api/src/main/java/org/kie/server/api/model/instance/DocumentInstanceList.java index 4caa08c20d..727cf107fd 100644 --- a/kie-server-parent/kie-server-api/src/main/java/org/kie/server/api/model/instance/DocumentInstanceList.java +++ b/kie-server-parent/kie-server-api/src/main/java/org/kie/server/api/model/instance/DocumentInstanceList.java @@ -29,7 +29,7 @@ @XmlRootElement(name = "document-instance-list") public class DocumentInstanceList implements ItemList { - @XmlElement(name="document-instance") + @XmlElement(name="document-instances") private DocumentInstance[] documentInstances; public DocumentInstanceList() { diff --git a/kie-server-parent/kie-server-remote/kie-server-rest/kie-server-rest-jbpm/src/main/java/org/kie/server/remote/rest/jbpm/DocumentResource.java b/kie-server-parent/kie-server-remote/kie-server-rest/kie-server-rest-jbpm/src/main/java/org/kie/server/remote/rest/jbpm/DocumentResource.java index e84253fe31..738baef21d 100644 --- a/kie-server-parent/kie-server-remote/kie-server-rest/kie-server-rest-jbpm/src/main/java/org/kie/server/remote/rest/jbpm/DocumentResource.java +++ b/kie-server-parent/kie-server-remote/kie-server-rest/kie-server-rest-jbpm/src/main/java/org/kie/server/remote/rest/jbpm/DocumentResource.java @@ -17,9 +17,12 @@ import java.io.IOException; import java.io.OutputStream; +import java.net.URLEncoder; import java.text.MessageFormat; +import javax.mail.internet.MimeUtility; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; +import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; @@ -78,7 +81,7 @@ public Response getDocumentContent(@javax.ws.rs.core.Context HttpHeaders headers if (document == null) { return notFound("Document with id " + documentId + " not found", v, conversationIdHeader); } - + String fileName = MimeUtility.encodeWord(document.getName(), "utf-8", "Q"); StreamingOutput entity = new StreamingOutput() { @Override @@ -87,10 +90,12 @@ public void write(OutputStream output) throws IOException, WebApplicationExcepti } }; if (conversationIdHeader != null) { - return Response.ok().entity(entity).header(conversationIdHeader.getName(), conversationIdHeader.getValue()).build(); + return Response.ok().entity(entity) + .header(conversationIdHeader.getName(), conversationIdHeader.getValue()) + .header("Content-Disposition", "attachment; filename=\"" + fileName + "\"").build(); } - return Response.ok().entity(entity).build(); + return Response.ok().entity(entity).header("Content-Disposition", "attachment; filename=\"" + fileName + "\"").build(); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format(UNEXPECTED_ERROR, e.getMessage()), v, conversationIdHeader); @@ -119,7 +124,7 @@ public Response getDocument(@javax.ws.rs.core.Context HttpHeaders headers, @Path @GET @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) - public Response listDocuments(@javax.ws.rs.core.Context HttpHeaders headers, @QueryParam("page") Integer page, @QueryParam("pageSize") Integer pageSize) { + public Response listDocuments(@javax.ws.rs.core.Context HttpHeaders headers, @QueryParam("page") @DefaultValue("0") Integer page, @QueryParam("pageSize") @DefaultValue("10") Integer pageSize) { Variant v = getVariant(headers); // no container id available so only used to transfer conversation id if given by client Header conversationIdHeader = buildConversationIdHeader("", context, headers); diff --git a/kie-server-parent/kie-server-services/kie-server-services-jbpm/src/main/java/org/kie/server/services/jbpm/DocumentServiceBase.java b/kie-server-parent/kie-server-services/kie-server-services-jbpm/src/main/java/org/kie/server/services/jbpm/DocumentServiceBase.java index 28b6826a11..d8defb4047 100644 --- a/kie-server-parent/kie-server-services/kie-server-services-jbpm/src/main/java/org/kie/server/services/jbpm/DocumentServiceBase.java +++ b/kie-server-parent/kie-server-services/kie-server-services-jbpm/src/main/java/org/kie/server/services/jbpm/DocumentServiceBase.java @@ -55,7 +55,7 @@ public DocumentInstance getDocument(String documentId) { if (document == null) { throw new KieServerRuntimeException("No document found with id " + documentId); } - return convertDocument(document); + return convertDocument(document, true); } public String storeDocument(String documentPayload, String marshallingType) { @@ -117,13 +117,13 @@ protected List convertDocumentList(List documents) { List list = new ArrayList(); for (Document doc : documents) { - list.add(convertDocument(doc)); + list.add(convertDocument(doc, false)); } return list; } - protected DocumentInstance convertDocument(Document document) { + protected DocumentInstance convertDocument(Document document, boolean withContent) { if (document == null) { return null; } @@ -135,7 +135,9 @@ protected DocumentInstance convertDocument(Document document) { .lastModified(document.getLastModified()) .content(document.getContent()) .build(); - + if (!withContent) { + documentInstance.setContent(null); + } return documentInstance; } } diff --git a/kie-server-parent/kie-server-services/kie-server-services-jbpm/src/main/java/org/kie/server/services/jbpm/JbpmKieServerExtension.java b/kie-server-parent/kie-server-services/kie-server-services-jbpm/src/main/java/org/kie/server/services/jbpm/JbpmKieServerExtension.java index ef5fbc2684..d58b7c98b1 100644 --- a/kie-server-parent/kie-server-services/kie-server-services-jbpm/src/main/java/org/kie/server/services/jbpm/JbpmKieServerExtension.java +++ b/kie-server-parent/kie-server-services/kie-server-services-jbpm/src/main/java/org/kie/server/services/jbpm/JbpmKieServerExtension.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.ServiceLoader; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import javax.naming.InitialContext; @@ -33,6 +34,7 @@ import javax.persistence.spi.PersistenceUnitInfo; import org.drools.compiler.kie.builder.impl.InternalKieContainer; +import org.jbpm.document.service.impl.DocumentImpl; import org.jbpm.executor.ExecutorServiceFactory; import org.jbpm.executor.impl.ExecutorImpl; import org.jbpm.executor.impl.ExecutorServiceImpl; @@ -352,7 +354,10 @@ public void createContainer(String id, KieContainerInstance kieContainerInstance deploymentService.deploy(unit); // in case it was deployed successfully pass all known classes to marshallers (jaxb, json etc) DeployedUnit deployedUnit = deploymentService.getDeployedUnit(unit.getIdentifier()); - kieContainerInstance.addJaxbClasses(new HashSet>(deployedUnit.getDeployedClasses())); + Set> customClasses = new HashSet>(deployedUnit.getDeployedClasses()); + // add custom classes that come from extension itself + customClasses.add(DocumentImpl.class); + kieContainerInstance.addJaxbClasses(customClasses); // add any query result mappers from kjar List addedMappers = QueryMapperRegistry.get().discoverAndAddMappers(kieContainer.getClassLoader()); diff --git a/kie-server-parent/kie-server-tests/kie-server-integ-tests-jbpm/src/test/filtered-resources/kjars-sources/definition-project/src/main/resources/META-INF/kie-deployment-descriptor.xml b/kie-server-parent/kie-server-tests/kie-server-integ-tests-jbpm/src/test/filtered-resources/kjars-sources/definition-project/src/main/resources/META-INF/kie-deployment-descriptor.xml index 2188bb1e72..157693190f 100644 --- a/kie-server-parent/kie-server-tests/kie-server-integ-tests-jbpm/src/test/filtered-resources/kjars-sources/definition-project/src/main/resources/META-INF/kie-deployment-descriptor.xml +++ b/kie-server-parent/kie-server-tests/kie-server-integ-tests-jbpm/src/test/filtered-resources/kjars-sources/definition-project/src/main/resources/META-INF/kie-deployment-descriptor.xml @@ -50,6 +50,5 @@ - org.jbpm.document.service.impl.DocumentImpl diff --git a/kie-server-parent/kie-server-tests/kie-server-integ-tests-jbpm/src/test/java/org/kie/server/integrationtests/jbpm/DocumentServiceIntegrationTest.java b/kie-server-parent/kie-server-tests/kie-server-integ-tests-jbpm/src/test/java/org/kie/server/integrationtests/jbpm/DocumentServiceIntegrationTest.java index ab70175e96..dc7dae708d 100644 --- a/kie-server-parent/kie-server-tests/kie-server-integ-tests-jbpm/src/test/java/org/kie/server/integrationtests/jbpm/DocumentServiceIntegrationTest.java +++ b/kie-server-parent/kie-server-tests/kie-server-integ-tests-jbpm/src/test/java/org/kie/server/integrationtests/jbpm/DocumentServiceIntegrationTest.java @@ -63,7 +63,7 @@ public static void buildAndDeployArtifacts() { @Before public void createData() { - File storagePath = new File(System.getProperty(KieServerConstants.CFG_DOCUMENT_STORAGE_PATH)); + File storagePath = new File(System.getProperty(KieServerConstants.CFG_DOCUMENT_STORAGE_PATH, "target/docs")); deleteFolder(storagePath); content = "just text content"; @@ -105,7 +105,7 @@ public void testCreateLoadDeleteDocument() throws Exception { DocumentInstance fromServer = documentClient.getDocument(documentId); assertEquals(documentId, fromServer.getIdentifier()); - assertDocumentInstances(document, fromServer); + assertDocumentInstances(document, fromServer, true); documentClient.deleteDocument(documentId); @@ -125,7 +125,7 @@ public void testCreateDocument() { DocumentInstance fromServer = documentClient.getDocument(documentId); assertEquals(documentId, fromServer.getIdentifier()); - assertDocumentInstances(document, fromServer); + assertDocumentInstances(document, fromServer, true); } @Test @@ -144,7 +144,7 @@ public void testCreateEmptyDocument() { DocumentInstance fromServer = documentClient.getDocument(documentId); assertEquals(documentId, fromServer.getIdentifier()); - assertDocumentInstances(document, fromServer); + assertDocumentInstances(document, fromServer, true); } @Test(expected = KieServicesException.class) @@ -160,7 +160,7 @@ public void testUpdateDocument() { DocumentInstance fromServer = documentClient.getDocument(documentId); assertEquals(documentId, fromServer.getIdentifier()); - assertDocumentInstances(document, fromServer); + assertDocumentInstances(document, fromServer, true); String udpatedDoc = "here comes the update"; @@ -173,7 +173,7 @@ public void testUpdateDocument() { DocumentInstance updatedFromServer = documentClient.getDocument(documentId); assertEquals(documentId, updatedFromServer.getIdentifier()); - assertDocumentInstances(fromServer, updatedFromServer); + assertDocumentInstances(fromServer, updatedFromServer, true); } @Test @@ -223,7 +223,7 @@ public void testListDocuments() { DocumentInstance fromServer = docs.get(0); assertEquals(documentId, fromServer.getIdentifier()); - assertDocumentInstances(document, fromServer); + assertDocumentInstances(document, fromServer, false); } @Test @@ -334,7 +334,7 @@ public void testDocumentProcess() { } - private void assertDocumentInstances(DocumentInstance expected, DocumentInstance actual) { + private void assertDocumentInstances(DocumentInstance expected, DocumentInstance actual, boolean assertContent) { assertNotNull(actual); assertNotNull(actual.getIdentifier()); assertNotNull(actual.getName()); @@ -342,7 +342,9 @@ private void assertDocumentInstances(DocumentInstance expected, DocumentInstance assertNotNull(actual.getSize()); assertEquals(expected.getName(), actual.getName()); assertEquals(expected.getSize(), actual.getSize()); - assertEquals(new String(expected.getContent()), new String(actual.getContent())); + if (assertContent) { + assertEquals(new String(expected.getContent()), new String(actual.getContent())); + } } private void assertDocuments(Document expected, Document actual) { diff --git a/kie-server-parent/kie-server-tests/kie-server-integ-tests-jbpm/src/test/java/org/kie/server/integrationtests/jbpm/rest/JbpmRestIntegrationTest.java b/kie-server-parent/kie-server-tests/kie-server-integ-tests-jbpm/src/test/java/org/kie/server/integrationtests/jbpm/rest/JbpmRestIntegrationTest.java index d241fe5e7f..304aca7f3e 100644 --- a/kie-server-parent/kie-server-tests/kie-server-integ-tests-jbpm/src/test/java/org/kie/server/integrationtests/jbpm/rest/JbpmRestIntegrationTest.java +++ b/kie-server-parent/kie-server-tests/kie-server-integ-tests-jbpm/src/test/java/org/kie/server/integrationtests/jbpm/rest/JbpmRestIntegrationTest.java @@ -18,10 +18,14 @@ import static org.junit.Assert.*; import static org.kie.server.api.rest.RestURI.*; +import java.util.Date; import java.util.HashMap; +import java.util.HashSet; +import java.util.List; import java.util.Map; import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.junit.Assert; @@ -31,10 +35,15 @@ import org.junit.Test; import org.junit.rules.ExternalResource; import org.kie.scanner.KieModuleMetaData; +import org.kie.server.api.marshalling.Marshaller; +import org.kie.server.api.marshalling.MarshallerFactory; import org.kie.server.api.marshalling.MarshallingFormat; import org.kie.server.api.model.KieContainerResource; import org.kie.server.api.model.ReleaseId; +import org.kie.server.api.model.instance.DocumentInstance; +import org.kie.server.api.model.instance.DocumentInstanceList; import org.kie.server.api.model.type.JaxbLong; +import org.kie.server.api.model.type.JaxbString; import org.kie.server.integrationtests.config.TestConfig; import org.kie.server.integrationtests.jbpm.DBExternalResource; import org.kie.server.integrationtests.shared.KieServerDeployer; @@ -200,4 +209,77 @@ public void testBasicJbpmRequestManyAcceptHeaders() throws Exception { } } + + @Test + public void testUploadListDownloadDocument() throws Exception { + Marshaller marshaller = MarshallerFactory.getMarshaller(new HashSet>(extraClasses.values()), marshallingFormat, client.getClassLoader()); + + DocumentInstance documentInstance = DocumentInstance.builder().name("test file.txt").size(50).content("test content".getBytes()).lastModified(new Date()).build(); + String documentEntity = marshaller.marshall(documentInstance); + + Map empty = new HashMap<>(); + Response response = null; + try { + // create document + WebTarget clientRequest = newRequest(build(TestConfig.getKieServerHttpUrl(), DOCUMENT_URI, empty)); + logger.info( "[POST] " + clientRequest.getUri()); + response = clientRequest.request(acceptHeadersByFormat.get(marshallingFormat)).post(createEntity(documentEntity)); + Assert.assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatus()); + + String documentId = response.readEntity(JaxbString.class).unwrap(); + assertNotNull(documentId); + + // list available documents without paging info + Map valuesMap = new HashMap(); + valuesMap.put(DOCUMENT_ID, documentId); + clientRequest = newRequest(build(TestConfig.getKieServerHttpUrl(), DOCUMENT_URI, valuesMap)); + logger.info( "[GET] " + clientRequest.getUri()); + response = clientRequest.request(getMediaType()).get(); + Assert.assertEquals(Response.Status.OK.getStatusCode(), response.getStatus()); + + DocumentInstanceList docList = marshaller.unmarshall(response.readEntity(String.class), DocumentInstanceList.class); + assertNotNull(docList); + + List docs = docList.getItems(); + assertNotNull(docs); + assertEquals(1, docs.size()); + DocumentInstance doc = docs.get(0); + assertNotNull(doc); + assertEquals(documentInstance.getName(), doc.getName()); + assertEquals(documentId, doc.getIdentifier()); + + // download document content + valuesMap = new HashMap(); + valuesMap.put(DOCUMENT_ID, documentId); + clientRequest = newRequest(build(TestConfig.getKieServerHttpUrl(), DOCUMENT_URI + "/" + DOCUMENT_INSTANCE_CONTENT_GET_URI, valuesMap)); + logger.info( "[GET] " + clientRequest.getUri()); + response = clientRequest.request(getMediaType()).accept(MediaType.APPLICATION_OCTET_STREAM_TYPE).get(); + Assert.assertEquals(Response.Status.OK.getStatusCode(), response.getStatus()); + + String contentDisposition = response.getHeaderString("Content-Disposition"); + assertTrue(contentDisposition.contains(documentInstance.getName())); + + byte[] content = response.readEntity(byte[].class); + assertNotNull(content); + String stringContent = new String(content); + assertEquals("test content", stringContent); + response.close(); + + // delete document + valuesMap = new HashMap(); + valuesMap.put(DOCUMENT_ID, documentId); + clientRequest = newRequest(build(TestConfig.getKieServerHttpUrl(), DOCUMENT_URI + "/" + DOCUMENT_INSTANCE_DELETE_URI, valuesMap)); + logger.info( "[DELETE] " + clientRequest.getUri()); + + response = clientRequest.request(getMediaType()).delete(); + int noContentStatusCode = Response.Status.NO_CONTENT.getStatusCode(); + int okStatusCode = Response.Status.OK.getStatusCode(); + assertTrue("Wrong status code returned: " + response.getStatus(), + response.getStatus() == noContentStatusCode || response.getStatus() == okStatusCode); + + } finally { + response.close(); + } + + } }