diff --git a/pom.xml b/pom.xml
index 9427ef6..4b9cf45 100644
--- a/pom.xml
+++ b/pom.xml
@@ -17,6 +17,7 @@
http://localhost:8080/api-explorer
acs6
com.inteligr8.alfresco.acs
+ src/test/none
5.7.2
5.2.14.RELEASE
@@ -124,6 +125,21 @@
+
+ add-services
+ process-test-resources
+
+ add-test-resource
+
+
+
+
+ ${it.directory}
+ false
+
+
+
+
@@ -142,6 +158,12 @@
${junit.version}
+
+
+ **/*Jersey*
+ **/*Cxf*
+
+
maven-failsafe-plugin
@@ -153,6 +175,12 @@
${junit.version}
+
+
+ **/*Jersey*
+ **/*Cxf*
+
+
maven-javadoc-plugin
@@ -171,6 +199,96 @@
+
+ it-jersey
+
+ src/test/jersey
+
+
+
+
+ maven-surefire-plugin
+ 3.0.0-M5
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ ${junit.version}
+
+
+
+
+ **/*Jersey*
+
+
+ **/*IT.java
+
+
+
+
+ maven-failsafe-plugin
+ 3.0.0-M5
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ ${junit.version}
+
+
+
+
+ **/*Jersey*IT.java
+
+
+
+
+
+
+
+ it-cxf
+
+ src/test/cxf
+
+
+
+
+ maven-surefire-plugin
+ 3.0.0-M5
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ ${junit.version}
+
+
+
+
+ **/*Cxf*
+
+
+ **/*IT.java
+
+
+
+
+ maven-failsafe-plugin
+ 3.0.0-M5
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ ${junit.version}
+
+
+
+
+ **/*Cxf*IT.java
+
+
+
+
+
+
swagger-codegen
diff --git a/src/gen/java/com/inteligr8/alfresco/acs/api/NodesApi.java b/src/gen/java/com/inteligr8/alfresco/acs/api/NodesApi.java
index ae43fe5..d5d76ed 100644
--- a/src/gen/java/com/inteligr8/alfresco/acs/api/NodesApi.java
+++ b/src/gen/java/com/inteligr8/alfresco/acs/api/NodesApi.java
@@ -1,5 +1,21 @@
package com.inteligr8.alfresco.acs.api;
+import java.io.File;
+import java.util.Date;
+import java.util.List;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+
import com.inteligr8.alfresco.acs.model.AssociationBody;
import com.inteligr8.alfresco.acs.model.AssociationEntry;
import com.inteligr8.alfresco.acs.model.ChildAssociationBody;
@@ -13,14 +29,11 @@ import com.inteligr8.alfresco.acs.model.NodeBodyMove;
import com.inteligr8.alfresco.acs.model.NodeBodyUpdate;
import com.inteligr8.alfresco.acs.model.NodeChildAssociationPaging;
import com.inteligr8.alfresco.acs.model.NodeEntry;
+
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
-import java.io.File;
-import java.util.Date;
-import java.util.List;
-import javax.ws.rs.*;
/**
* Alfresco Content Services REST API
diff --git a/src/main/java/com/inteligr8/alfresco/acs/api/NodesCxfApi.java b/src/main/java/com/inteligr8/alfresco/acs/api/NodesCxfApi.java
index f4f69ea..3221254 100644
--- a/src/main/java/com/inteligr8/alfresco/acs/api/NodesCxfApi.java
+++ b/src/main/java/com/inteligr8/alfresco/acs/api/NodesCxfApi.java
@@ -7,9 +7,8 @@ import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
-import org.apache.cxf.jaxrs.ext.multipart.MultipartBody;
-
import com.inteligr8.alfresco.acs.model.Error;
+import com.inteligr8.alfresco.acs.model.NodeBodyCreateMultipartCxf;
import com.inteligr8.alfresco.acs.model.NodeEntry;
import io.swagger.annotations.Api;
@@ -40,7 +39,7 @@ public interface NodesCxfApi {
@ApiResponse(code = 200, message = "Unexpected error", response = Error.class) })
public NodeEntry createNode(
@PathParam("nodeId") String nodeId,
- MultipartBody body);
+ NodeBodyCreateMultipartCxf body);
/*
* This better impl doesn't work
*
diff --git a/src/main/java/com/inteligr8/alfresco/acs/api/NodesJerseyApi.java b/src/main/java/com/inteligr8/alfresco/acs/api/NodesJerseyApi.java
index d5d59b2..a2e492e 100644
--- a/src/main/java/com/inteligr8/alfresco/acs/api/NodesJerseyApi.java
+++ b/src/main/java/com/inteligr8/alfresco/acs/api/NodesJerseyApi.java
@@ -1,8 +1,5 @@
package com.inteligr8.alfresco.acs.api;
-import java.io.InputStream;
-import java.util.List;
-
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
@@ -10,11 +7,8 @@ import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
-import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
-import org.glassfish.jersey.media.multipart.FormDataParam;
-
import com.inteligr8.alfresco.acs.model.Error;
-import com.inteligr8.alfresco.acs.model.NodeBodyCreate;
+import com.inteligr8.alfresco.acs.model.NodeBodyCreateMultipartJersey;
import com.inteligr8.alfresco.acs.model.NodeEntry;
import io.swagger.annotations.Api;
@@ -45,13 +39,6 @@ public interface NodesJerseyApi {
@ApiResponse(code = 200, message = "Unexpected error", response = Error.class) })
public NodeEntry createNode(
@PathParam("nodeId") String nodeId,
- NodeBodyCreate nodeBodyCreate,
- @FormDataParam("autoRename") Boolean autoRename,
- @FormDataParam("majorVersion") Boolean majorVersion,
- @FormDataParam("versioningEnabled") Boolean versioningEnabled,
- @FormDataParam("include") List include,
- @FormDataParam("fields") List fields,
- @FormDataParam("filedata") InputStream filedataStream,
- @FormDataParam("filedata") FormDataContentDisposition filedataDisposition);
+ NodeBodyCreateMultipartJersey file);
}
diff --git a/src/main/java/com/inteligr8/alfresco/acs/model/NodeBodyCreateFile.java b/src/main/java/com/inteligr8/alfresco/acs/model/NodeBodyCreateFile.java
deleted file mode 100644
index 61b5fb3..0000000
--- a/src/main/java/com/inteligr8/alfresco/acs/model/NodeBodyCreateFile.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.inteligr8.alfresco.acs.model;
-
-import java.io.File;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-import io.swagger.annotations.ApiModelProperty;
-
-public class NodeBodyCreateFile extends NodeBodyCreate {
-
- @ApiModelProperty
- private File filedata;
-
- @JsonProperty
- public File getFiledata() {
- return this.filedata;
- }
-
- public void setFiledata(File filedata) {
- this.filedata = filedata;
- }
-
- public NodeBodyCreateFile filedata(File filedata) {
- this.filedata = filedata;
- return this;
- }
-
-}
diff --git a/src/main/java/com/inteligr8/alfresco/acs/api/NodeBodyCreateMultipart.java b/src/main/java/com/inteligr8/alfresco/acs/model/NodeBodyCreateMultipartCxf.java
similarity index 59%
rename from src/main/java/com/inteligr8/alfresco/acs/api/NodeBodyCreateMultipart.java
rename to src/main/java/com/inteligr8/alfresco/acs/model/NodeBodyCreateMultipartCxf.java
index 90236f8..663c668 100644
--- a/src/main/java/com/inteligr8/alfresco/acs/api/NodeBodyCreateMultipart.java
+++ b/src/main/java/com/inteligr8/alfresco/acs/model/NodeBodyCreateMultipartCxf.java
@@ -1,28 +1,29 @@
-package com.inteligr8.alfresco.acs.api;
+package com.inteligr8.alfresco.acs.model;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import javax.ws.rs.core.MediaType;
import org.apache.cxf.jaxrs.ext.multipart.Attachment;
import org.apache.cxf.jaxrs.ext.multipart.ContentDisposition;
import org.apache.cxf.jaxrs.ext.multipart.MultipartBody;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.inteligr8.alfresco.acs.model.NodeBodyCreate;
-public class NodeBodyCreateMultipart extends MultipartBody {
+public class NodeBodyCreateMultipartCxf extends MultipartBody {
+ private static final Logger logger = LoggerFactory.getLogger(NodeBodyCreateMultipartCxf.class);
private static final ObjectMapper om = new ObjectMapper();
- public static NodeBodyCreateMultipart from(
+ public static NodeBodyCreateMultipartCxf from(
NodeBodyCreate nodeBody, String filename, InputStream istream,
Boolean autoRename, Boolean majorVersion, Boolean versioningEnabled) throws IOException {
List atts = new LinkedList<>();
@@ -34,14 +35,14 @@ public class NodeBodyCreateMultipart extends MultipartBody {
if (versioningEnabled != null)
atts.add(toAttachment("versioningEnabled", String.valueOf(versioningEnabled)));
atts.add(toAttachment(filename, istream));
- return new NodeBodyCreateMultipart(atts, true);
+ return new NodeBodyCreateMultipartCxf(atts, true);
}
- public NodeBodyCreateMultipart(List atts) throws IOException {
+ public NodeBodyCreateMultipartCxf(List atts) throws IOException {
super(atts);
}
- public NodeBodyCreateMultipart(List atts, boolean outbound) throws IOException {
+ public NodeBodyCreateMultipartCxf(List atts, boolean outbound) throws IOException {
super(atts, outbound);
}
@@ -63,37 +64,35 @@ public class NodeBodyCreateMultipart extends MultipartBody {
- @SuppressWarnings("unchecked")
private static List toAttachments(NodeBodyCreate nodeBody) throws IOException {
List atts = new LinkedList<>();
atts.add(toAttachment("name", nodeBody.getName()));
atts.add(toAttachment("nodeType", nodeBody.getNodeType()));
- if (nodeBody.getAspectNames() != null)
- atts.add(toAttachment("aspectNames", nodeBody.getAspectNames()));
- if (nodeBody.getProperties() != null)
- atts.add(toAttachment("properties", (Map)nodeBody.getProperties()));
+ if (nodeBody.getAspectNames() != null && !nodeBody.getAspectNames().isEmpty())
+ logger.warn("The ACS Public REST API does not support the explicit inclusion of aspects while creating content");
+ if (nodeBody.getProperties() != null) {
+ @SuppressWarnings("unchecked")
+ Map props = (Map)nodeBody.getProperties();
+ for (Entry prop : props.entrySet()) {
+ if (prop.getValue() != null) {
+ // FIXME convert dates as ACS would expect them to be formatted
+ atts.add(toAttachment(prop.getKey(), prop.getValue().toString()));
+ }
+ }
+ }
return atts;
}
private static Attachment toAttachment(String name, String value) {
return new Attachment(name, new ByteArrayInputStream(value.getBytes()), new ContentDisposition("form-data; name=\"" + name + "\""));
}
-
- private static Attachment toAttachment(String name, Collection c) throws JsonProcessingException {
- return toJsonAttachment(name, c);
- }
-
- private static Attachment toAttachment(String name, Map map) throws JsonProcessingException {
- return toJsonAttachment(name, map);
- }
-
- private static Attachment toJsonAttachment(String name, Object obj) throws JsonProcessingException {
- String json = om.writeValueAsString(obj);
- return new Attachment(name, new ByteArrayInputStream(json.getBytes()), new ContentDisposition("form-data; name=\"" + name + "\""));
- }
private static Attachment toAttachment(String filename, InputStream istream) {
- return new Attachment("filedata", istream, new ContentDisposition("form-data; name=\"filedata\"; filename=\"" + filename + "\""));
+ if (filename == null) {
+ return new Attachment("filedata", istream, new ContentDisposition("form-data; name=\"filedata\""));
+ } else {
+ return new Attachment("filedata", istream, new ContentDisposition("form-data; name=\"filedata\"; filename=\"" + filename + "\""));
+ }
}
}
diff --git a/src/main/java/com/inteligr8/alfresco/acs/model/NodeBodyCreateMultipartJersey.java b/src/main/java/com/inteligr8/alfresco/acs/model/NodeBodyCreateMultipartJersey.java
new file mode 100644
index 0000000..4411293
--- /dev/null
+++ b/src/main/java/com/inteligr8/alfresco/acs/model/NodeBodyCreateMultipartJersey.java
@@ -0,0 +1,95 @@
+package com.inteligr8.alfresco.acs.model;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.ParseException;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.ws.rs.core.MediaType;
+
+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;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class NodeBodyCreateMultipartJersey extends FormDataMultiPart {
+
+ private static final Logger logger = LoggerFactory.getLogger(NodeBodyCreateMultipartJersey.class);
+ private static final ObjectMapper om = new ObjectMapper();
+
+ public static NodeBodyCreateMultipartJersey from(
+ NodeBodyCreate nodeBody, String filename, InputStream istream,
+ Boolean autoRename, Boolean majorVersion, Boolean versioningEnabled) throws IOException, ParseException {
+ NodeBodyCreateMultipartJersey multipart = new NodeBodyCreateMultipartJersey();
+ multipart.field("autoRename", String.valueOf(autoRename))
+ .field("majorVersion", String.valueOf(majorVersion))
+ .field("versioningEnabled", String.valueOf(versioningEnabled))
+ .bodyPart(toBodyPart(filename, istream))
+ .getBodyParts().addAll(toFields(nodeBody));
+ return multipart;
+ }
+
+ private NodeBodyCreateMultipartJersey() throws IOException {
+ }
+
+ public NodeBodyCreate getBody() throws IOException {
+ BodyPart bodyPart = this.getField("");
+ if (bodyPart == null)
+ throw new IllegalStateException();
+ if (!MediaType.APPLICATION_JSON_TYPE.equals(bodyPart.getMediaType()))
+ throw new IllegalStateException();
+
+ InputStream istream = bodyPart.getEntityAs(InputStream.class);
+ try {
+ return om.readValue(istream, NodeBodyCreate.class);
+ } finally {
+ istream.close();
+ }
+ }
+
+ public FormDataBodyPart getFiledataAttachment() {
+ return this.getField("filedata");
+ }
+
+
+
+ private static List toFields(NodeBodyCreate nodeBody) throws IOException {
+ List fields = new LinkedList<>();
+ fields.add(new FormDataBodyPart("name", nodeBody.getName()));
+ fields.add(new FormDataBodyPart("nodeType", nodeBody.getNodeType()));
+ if (nodeBody.getAspectNames() != null && !nodeBody.getAspectNames().isEmpty())
+ logger.warn("The ACS Public REST API does not support the explicit inclusion of aspects while creating content");
+ if (nodeBody.getProperties() != null) {
+ @SuppressWarnings("unchecked")
+ Map props = (Map)nodeBody.getProperties();
+ for (Entry prop : props.entrySet()) {
+ if (prop.getValue() != null) {
+ // FIXME convert dates as ACS would expect them to be formatted
+ fields.add(new FormDataBodyPart(prop.getKey(), prop.getValue().toString()));
+ }
+ }
+ }
+
+ return fields;
+ }
+
+ private static BodyPart toBodyPart(String filename, InputStream istream) throws ParseException {
+ if (filename == null) {
+ return new FormDataBodyPart()
+ .contentDisposition(new FormDataContentDisposition("form-data; name=\"filedata\""))
+ .entity(istream);
+ } else {
+ return new FormDataBodyPart()
+ .contentDisposition(new FormDataContentDisposition("form-data; name=\"filedata\"; filename=\"" + filename + "\""))
+ .entity(istream);
+ }
+ }
+
+}
diff --git a/src/test/cxf/META-INF/services/javax.ws.rs.client.ClientBuilder b/src/test/cxf/META-INF/services/javax.ws.rs.client.ClientBuilder
new file mode 100644
index 0000000..018e11f
--- /dev/null
+++ b/src/test/cxf/META-INF/services/javax.ws.rs.client.ClientBuilder
@@ -0,0 +1 @@
+org.apache.cxf.jaxrs.client.spec.ClientBuilderImpl
\ No newline at end of file
diff --git a/src/test/java/com/inteligr8/alfresco/acs/ConnectionCxfClientIT.java b/src/test/java/com/inteligr8/alfresco/acs/ConnectionCxfClientIT.java
index 31379e7..1f9ca9b 100644
--- a/src/test/java/com/inteligr8/alfresco/acs/ConnectionCxfClientIT.java
+++ b/src/test/java/com/inteligr8/alfresco/acs/ConnectionCxfClientIT.java
@@ -1,21 +1,10 @@
package com.inteligr8.alfresco.acs;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-
-import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
-import com.inteligr8.alfresco.acs.api.NodeBodyCreateMultipart;
-import com.inteligr8.alfresco.acs.model.NodeBodyCreate;
-import com.inteligr8.alfresco.acs.model.RequestQuery;
-import com.inteligr8.alfresco.acs.model.RequestQuery.LanguageEnum;
-import com.inteligr8.alfresco.acs.model.ResultNode;
-import com.inteligr8.alfresco.acs.model.ResultSetPaging;
-import com.inteligr8.alfresco.acs.model.SearchRequest;
import com.inteligr8.rs.ClientConfiguration;
@TestPropertySource(locations = {"/local.properties"})
@@ -36,25 +25,4 @@ public class ConnectionCxfClientIT extends ConnectionClientIT {
return this.client.getConfig();
}
- @Test
- public void uploadFile() throws IOException {
- RequestQuery query = new RequestQuery();
- query.setLanguage(LanguageEnum.AFTS);
- query.setQuery("=@cm:name:'Shared'");
-
- SearchRequest searchRequest = new SearchRequest();
- searchRequest.setQuery(query);
-
- ResultSetPaging paging = this.client.getSearchApi().search(searchRequest);
- ResultNode folderNode = paging.getList().getEntries().iterator().next().getEntry();
- String folderNodeId = folderNode.getId();
-
- NodeBodyCreate nodeBody = new NodeBodyCreate().nodeType("cm:content").name("TestFolder");
-
- ByteArrayInputStream istream = new ByteArrayInputStream("This is a test".getBytes());
- NodeBodyCreateMultipart body = NodeBodyCreateMultipart.from(nodeBody, "test.txt", istream, true, null, null);
-
- this.client.getNodesExtApi().createNode(folderNodeId, body);
- }
-
}
diff --git a/src/test/java/com/inteligr8/alfresco/acs/CxfUploadIT.java b/src/test/java/com/inteligr8/alfresco/acs/CxfUploadIT.java
new file mode 100644
index 0000000..3f5a5b7
--- /dev/null
+++ b/src/test/java/com/inteligr8/alfresco/acs/CxfUploadIT.java
@@ -0,0 +1,57 @@
+package com.inteligr8.alfresco.acs;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.Collections;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.EnabledIf;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
+
+import com.inteligr8.alfresco.acs.model.Node;
+import com.inteligr8.alfresco.acs.model.NodeBodyCreate;
+import com.inteligr8.alfresco.acs.model.NodeBodyCreateMultipartCxf;
+import com.inteligr8.rs.ClientConfiguration;
+
+@TestPropertySource(locations = {"/local.properties"})
+@SpringJUnitConfig(classes = {AcsClientConfiguration.class, AcsPublicRestApiCxfImpl.class, AcsClientCxfImpl.class})
+public class CxfUploadIT extends UploadIT {
+
+ @Autowired
+ @Qualifier("acs.api.cxf")
+ private AcsPublicRestApiCxfImpl client;
+
+ @Override
+ public AcsPublicRestApi getClient() {
+ return this.client;
+ }
+
+ @Override
+ public ClientConfiguration getConfiguration() {
+ return this.client.getConfig();
+ }
+
+ @Test
+ @EnabledIf("hostExists")
+ public void uploadFile() throws IOException {
+ String folderNodeId = this.getSharedFolder();
+
+ NodeBodyCreate nodeBody = new NodeBodyCreate().nodeType("trx:transferReport").name("test-name1.txt")
+ .properties(Collections.singletonMap("cm:author", "Brian"));
+
+ ByteArrayInputStream istream = new ByteArrayInputStream("This is a test".getBytes());
+ NodeBodyCreateMultipartCxf body = NodeBodyCreateMultipartCxf.from(nodeBody, "test-name2.txt", istream, true, null, null);
+
+ Node newNode = this.client.getNodesExtApi().createNode(folderNodeId, body).getEntry();
+ Assertions.assertNotNull(newNode);
+ Assertions.assertNotNull(newNode.getId());
+ Assertions.assertEquals(folderNodeId, newNode.getParentId());
+ Assertions.assertEquals(nodeBody.getNodeType(), newNode.getNodeType());
+ Assertions.assertTrue(newNode.getName().startsWith("test-name1"));
+ }
+
+}
diff --git a/src/test/java/com/inteligr8/alfresco/acs/JerseyUploadIT.java b/src/test/java/com/inteligr8/alfresco/acs/JerseyUploadIT.java
new file mode 100644
index 0000000..142f2bb
--- /dev/null
+++ b/src/test/java/com/inteligr8/alfresco/acs/JerseyUploadIT.java
@@ -0,0 +1,58 @@
+package com.inteligr8.alfresco.acs;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.text.ParseException;
+import java.util.Collections;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.EnabledIf;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
+
+import com.inteligr8.alfresco.acs.model.Node;
+import com.inteligr8.alfresco.acs.model.NodeBodyCreate;
+import com.inteligr8.alfresco.acs.model.NodeBodyCreateMultipartJersey;
+import com.inteligr8.rs.ClientConfiguration;
+
+@TestPropertySource(locations = {"/local.properties"})
+@SpringJUnitConfig(classes = {AcsClientConfiguration.class, AcsPublicRestApiJerseyImpl.class, AcsClientJerseyImpl.class})
+public class JerseyUploadIT extends UploadIT {
+
+ @Autowired
+ @Qualifier("acs.api.jersey")
+ private AcsPublicRestApiJerseyImpl client;
+
+ @Override
+ public AcsPublicRestApi getClient() {
+ return this.client;
+ }
+
+ @Override
+ public ClientConfiguration getConfiguration() {
+ return this.client.getConfig();
+ }
+
+ @Test
+ @EnabledIf("hostExists")
+ public void uploadFile() throws IOException, ParseException {
+ String folderNodeId = this.getSharedFolder();
+
+ NodeBodyCreate nodeBody = new NodeBodyCreate().nodeType("trx:transferReport").name("test-name1.txt")
+ .properties(Collections.singletonMap("cm:author", "Brian"));
+
+ ByteArrayInputStream istream = new ByteArrayInputStream("This is a test".getBytes());
+ NodeBodyCreateMultipartJersey body = NodeBodyCreateMultipartJersey.from(nodeBody, "test-name2.txt", istream, true, null, null);
+
+ Node newNode = this.client.getNodesExtApi().createNode(folderNodeId, body).getEntry();
+ Assertions.assertNotNull(newNode);
+ Assertions.assertNotNull(newNode.getId());
+ Assertions.assertEquals(folderNodeId, newNode.getParentId());
+ Assertions.assertEquals(nodeBody.getNodeType(), newNode.getNodeType());
+ Assertions.assertTrue(newNode.getName().startsWith("test-name1"));
+ }
+
+}
diff --git a/src/test/java/com/inteligr8/alfresco/acs/UploadIT.java b/src/test/java/com/inteligr8/alfresco/acs/UploadIT.java
new file mode 100644
index 0000000..56dd8aa
--- /dev/null
+++ b/src/test/java/com/inteligr8/alfresco/acs/UploadIT.java
@@ -0,0 +1,26 @@
+package com.inteligr8.alfresco.acs;
+
+import com.inteligr8.alfresco.acs.model.RequestQuery;
+import com.inteligr8.alfresco.acs.model.RequestQuery.LanguageEnum;
+import com.inteligr8.alfresco.acs.model.ResultNode;
+import com.inteligr8.alfresco.acs.model.ResultSetPaging;
+import com.inteligr8.alfresco.acs.model.SearchRequest;
+
+public abstract class UploadIT extends ConditionalIT {
+
+ public abstract AcsPublicRestApi getClient();
+
+ public String getSharedFolder() {
+ RequestQuery query = new RequestQuery();
+ query.setLanguage(LanguageEnum.AFTS);
+ query.setQuery("=@cm:name:'Shared'");
+
+ SearchRequest searchRequest = new SearchRequest();
+ searchRequest.setQuery(query);
+
+ ResultSetPaging paging = this.getClient().getSearchApi().search(searchRequest);
+ ResultNode folderNode = paging.getList().getEntries().iterator().next().getEntry();
+ return folderNode.getId();
+ }
+
+}
diff --git a/src/test/jersey/META-INF/services/javax.ws.rs.client.ClientBuilder b/src/test/jersey/META-INF/services/javax.ws.rs.client.ClientBuilder
new file mode 100644
index 0000000..48b9fa5
--- /dev/null
+++ b/src/test/jersey/META-INF/services/javax.ws.rs.client.ClientBuilder
@@ -0,0 +1 @@
+org.glassfish.jersey.client.JerseyClientBuilder
\ No newline at end of file