diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/AppDefinitionsCxfApi.java b/src/main/java/com/inteligr8/alfresco/activiti/api/AppDefinitionsCxfApi.java index b798e13..0d20916 100644 --- a/src/main/java/com/inteligr8/alfresco/activiti/api/AppDefinitionsCxfApi.java +++ b/src/main/java/com/inteligr8/alfresco/activiti/api/AppDefinitionsCxfApi.java @@ -9,10 +9,9 @@ import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; -import org.apache.cxf.jaxrs.ext.multipart.MultipartBody; - import com.inteligr8.alfresco.activiti.model.AppDefinitionRepresentation; import com.inteligr8.alfresco.activiti.model.AppDefinitionUpdateResultRepresentation; +import com.inteligr8.alfresco.activiti.model.FileMultipartCxf; @Path("/api/enterprise/app-definitions") public interface AppDefinitionsCxfApi { @@ -22,7 +21,7 @@ public interface AppDefinitionsCxfApi { @Consumes({ MediaType.MULTIPART_FORM_DATA }) @Produces({ MediaType.APPLICATION_JSON }) AppDefinitionRepresentation import_( - MultipartBody body, + FileMultipartCxf body, @QueryParam("renewIdmEntries") Boolean renewIdmEntries); @POST @@ -31,7 +30,7 @@ public interface AppDefinitionsCxfApi { @Produces({ MediaType.APPLICATION_JSON }) AppDefinitionRepresentation import_( @PathParam("modelId") Long appId, - MultipartBody body, + FileMultipartCxf body, @QueryParam("renewIdmEntries") Boolean renewIdmEntries); @POST @@ -39,7 +38,7 @@ public interface AppDefinitionsCxfApi { @Consumes({ MediaType.MULTIPART_FORM_DATA }) @Produces({ MediaType.APPLICATION_JSON }) AppDefinitionUpdateResultRepresentation publishApp( - MultipartBody body); + FileMultipartCxf body); @POST @Path("{modelId}/publish-app") @@ -47,6 +46,6 @@ public interface AppDefinitionsCxfApi { @Produces({ MediaType.APPLICATION_JSON }) AppDefinitionUpdateResultRepresentation publishApp( @PathParam("modelId") Long appId, - MultipartBody body); + FileMultipartCxf body); } diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/AppDefinitionsJerseyApi.java b/src/main/java/com/inteligr8/alfresco/activiti/api/AppDefinitionsJerseyApi.java index 37ebfda..866ce7d 100644 --- a/src/main/java/com/inteligr8/alfresco/activiti/api/AppDefinitionsJerseyApi.java +++ b/src/main/java/com/inteligr8/alfresco/activiti/api/AppDefinitionsJerseyApi.java @@ -9,11 +9,9 @@ import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; -import org.glassfish.jersey.media.multipart.FormDataMultiPart; -import org.glassfish.jersey.media.multipart.FormDataParam; - import com.inteligr8.alfresco.activiti.model.AppDefinitionRepresentation; import com.inteligr8.alfresco.activiti.model.AppDefinitionUpdateResultRepresentation; +import com.inteligr8.alfresco.activiti.model.FileMultipartJersey; @Path("/api/enterprise/app-definitions") public interface AppDefinitionsJerseyApi { @@ -23,7 +21,7 @@ public interface AppDefinitionsJerseyApi { @Consumes({ MediaType.MULTIPART_FORM_DATA }) @Produces({ MediaType.APPLICATION_JSON }) AppDefinitionRepresentation importApp( - @FormDataParam("file") FormDataMultiPart file, + FileMultipartJersey file, @QueryParam("renewIdmEntries") Boolean renewIdmEntries); @POST @@ -32,7 +30,7 @@ public interface AppDefinitionsJerseyApi { @Produces({ MediaType.APPLICATION_JSON }) AppDefinitionRepresentation importApp( @PathParam("modelId") Long appId, - @FormDataParam("file") FormDataMultiPart file, + FileMultipartJersey file, @QueryParam("renewIdmEntries") Boolean renewIdmEntries); @POST @@ -40,7 +38,7 @@ public interface AppDefinitionsJerseyApi { @Consumes({ MediaType.MULTIPART_FORM_DATA }) @Produces({ MediaType.APPLICATION_JSON }) AppDefinitionUpdateResultRepresentation publishApp( - FormDataMultiPart file); + FileMultipartJersey file); @POST @Path("{modelId}/publish-app") @@ -48,6 +46,6 @@ public interface AppDefinitionsJerseyApi { @Produces({ MediaType.APPLICATION_JSON }) AppDefinitionUpdateResultRepresentation publishApp( @PathParam("modelId") Long appId, - FormDataMultiPart file); + FileMultipartJersey file); } diff --git a/src/main/java/com/inteligr8/alfresco/activiti/model/FileMultipartCxf.java b/src/main/java/com/inteligr8/alfresco/activiti/model/FileMultipartCxf.java new file mode 100644 index 0000000..ce84a6d --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/activiti/model/FileMultipartCxf.java @@ -0,0 +1,38 @@ +package com.inteligr8.alfresco.activiti.model; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.List; + +import org.apache.cxf.jaxrs.ext.multipart.Attachment; +import org.apache.cxf.jaxrs.ext.multipart.ContentDisposition; +import org.apache.cxf.jaxrs.ext.multipart.MultipartBody; + +public class FileMultipartCxf extends MultipartBody { + + public static FileMultipartCxf from(String filename, InputStream istream) throws IOException { + return new FileMultipartCxf(Arrays.asList(toAttachment(filename, istream))); + } + + public FileMultipartCxf(List atts) throws IOException { + super(atts); + } + + public FileMultipartCxf(List atts, boolean outbound) { + super(atts, outbound); + } + + public Attachment getFileAttachment() { + return this.getAttachment("file"); + } + + private static Attachment toAttachment(String filename, InputStream istream) { + if (filename == null) { + return new Attachment("file", istream, new ContentDisposition("form-data; name=\"file\"")); + } else { + return new Attachment("file", istream, new ContentDisposition("form-data; name=\"file\"; filename=\"" + filename + "\"")); + } + } + +} diff --git a/src/main/java/com/inteligr8/alfresco/activiti/model/FileMultipartJersey.java b/src/main/java/com/inteligr8/alfresco/activiti/model/FileMultipartJersey.java new file mode 100644 index 0000000..99160c5 --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/activiti/model/FileMultipartJersey.java @@ -0,0 +1,38 @@ +package com.inteligr8.alfresco.activiti.model; + +import java.io.InputStream; +import java.text.ParseException; + +import org.glassfish.jersey.media.multipart.BodyPart; +import org.glassfish.jersey.media.multipart.FormDataBodyPart; +import org.glassfish.jersey.media.multipart.FormDataContentDisposition; +import org.glassfish.jersey.media.multipart.FormDataMultiPart; + +public class FileMultipartJersey extends FormDataMultiPart { + + public static FileMultipartJersey from(String filename, InputStream istream) throws ParseException { + FileMultipartJersey multipart = new FileMultipartJersey(); + multipart.bodyPart(toBodyPart(filename, istream)); + return multipart; + } + + private FileMultipartJersey() { + } + + public FormDataBodyPart getFileAttachment() { + return this.getField("file"); + } + + private static BodyPart toBodyPart(String filename, InputStream istream) throws ParseException { + if (filename == null) { + return new FormDataBodyPart() + .contentDisposition(new FormDataContentDisposition("form-data; name=\"file\"")) + .entity(istream); + } else { + return new FormDataBodyPart() + .contentDisposition(new FormDataContentDisposition("form-data; name=\"file\"; filename=\"" + filename + "\"")) + .entity(istream); + } + } + +}