Skip to content

Commit

Permalink
minor document related improvements to make it easier to consume (kie…
Browse files Browse the repository at this point in the history
  • Loading branch information
mswiderski authored Aug 12, 2016
1 parent 0054516 commit 9634930
Show file tree
Hide file tree
Showing 7 changed files with 115 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
@XmlRootElement(name = "document-instance-list")
public class DocumentInstanceList implements ItemList<DocumentInstance> {

@XmlElement(name="document-instance")
@XmlElement(name="document-instances")
private DocumentInstance[] documentInstances;

public DocumentInstanceList() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand All @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -117,13 +117,13 @@ protected List<DocumentInstance> convertDocumentList(List<Document> documents) {

List<DocumentInstance> list = new ArrayList<DocumentInstance>();
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;
}
Expand All @@ -135,7 +135,9 @@ protected DocumentInstance convertDocument(Document document) {
.lastModified(document.getLastModified())
.content(document.getContent())
.build();

if (!withContent) {
documentInstance.setContent(null);
}
return documentInstance;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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<Class<?>>(deployedUnit.getDeployedClasses()));
Set<Class<?>> customClasses = new HashSet<Class<?>>(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<String> addedMappers = QueryMapperRegistry.get().discoverAndAddMappers(kieContainer.getClassLoader());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,5 @@
<configurations/>
<required-roles/>
<remoteable-classes>
<remoteable-class>org.jbpm.document.service.impl.DocumentImpl</remoteable-class>
</remoteable-classes>
</deployment-descriptor>
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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);

Expand All @@ -125,7 +125,7 @@ public void testCreateDocument() {

DocumentInstance fromServer = documentClient.getDocument(documentId);
assertEquals(documentId, fromServer.getIdentifier());
assertDocumentInstances(document, fromServer);
assertDocumentInstances(document, fromServer, true);
}

@Test
Expand All @@ -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)
Expand All @@ -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";
Expand All @@ -173,7 +173,7 @@ public void testUpdateDocument() {

DocumentInstance updatedFromServer = documentClient.getDocument(documentId);
assertEquals(documentId, updatedFromServer.getIdentifier());
assertDocumentInstances(fromServer, updatedFromServer);
assertDocumentInstances(fromServer, updatedFromServer, true);
}

@Test
Expand Down Expand Up @@ -223,7 +223,7 @@ public void testListDocuments() {

DocumentInstance fromServer = docs.get(0);
assertEquals(documentId, fromServer.getIdentifier());
assertDocumentInstances(document, fromServer);
assertDocumentInstances(document, fromServer, false);
}

@Test
Expand Down Expand Up @@ -334,15 +334,17 @@ 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());
assertNotNull(actual.getLastModified());
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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -200,4 +209,77 @@ public void testBasicJbpmRequestManyAcceptHeaders() throws Exception {
}

}

@Test
public void testUploadListDownloadDocument() throws Exception {
Marshaller marshaller = MarshallerFactory.getMarshaller(new HashSet<Class<?>>(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<String, Object> 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<String, Object> valuesMap = new HashMap<String, Object>();
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<DocumentInstance> 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<String, Object>();
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<String, Object>();
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();
}

}
}

0 comments on commit 9634930

Please sign in to comment.