commit 8e970e4892a42dabe6ed0f3ded814d8ecd2844d5 Author: Brian M. Long Date: Tue May 3 13:15:11 2022 -0400 split from acs-public-rest-api diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c5c31ee --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +# Maven +pom.xml.versionsBackup +target + +# Eclipse +.project +.classpath +.settings + +# Visual Studio Code +.factorypath + +# Swagger Codegen +.swagger-codegen +.swagger-codegen-ignore + +# Personal +personal*.properties + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..056d9b5 --- /dev/null +++ b/pom.xml @@ -0,0 +1,213 @@ + + 4.0.0 + com.inteligr8.alfresco + acs-public-rest-client + 2.0-SNAPSHOT + Alfresco Content Services ReST API Client for Java + + + utf-8 + 8 + 8 + lines,vars,source + + + http://localhost:8080/alfresco + acs7 + src/test/none + + 5.7.2 + 5.2.14.RELEASE + 2.35 + 3.4.7 + + + + + com.inteligr8 + common-rest-client + 2.0-SNAPSHOT + ${jaxrs.impl} + + + com.inteligr8.alfresco + acs-public-rest-api + 2.0-SNAPSHOT + ${acs.platform.tag} + + + org.junit.jupiter + junit-jupiter-api + ${junit.version} + test + + + org.springframework + spring-test + ${spring.version} + test + + + org.apache.httpcomponents + httpclient + 4.5.9 + test + + + org.apache.logging.log4j + log4j-slf4j-impl + 2.17.2 + test + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.2.0 + + + add-jaxrs-src + add-source + + + src/main/${jaxrs.impl} + + + + + add-test-src + add-test-source + + + src/test/${jaxrs.impl} + + + + + + + maven-jar-plugin + + ${jaxrs.impl} + + + + maven-surefire-plugin + 3.0.0-M5 + + + org.junit.jupiter + junit-jupiter-engine + ${junit.version} + + + + + maven-failsafe-plugin + 3.0.0-M5 + + + org.junit.jupiter + junit-jupiter-engine + ${junit.version} + + + + + maven-javadoc-plugin + + + javadoc + package + jar + + public + + + + + + + + + + jaxrs-jersey + + true + + jaxrs.impl + jersey + + + + jersey + + + + org.glassfish.jersey.inject + jersey-hk2 + ${jersey.version} + test + + + org.glassfish.jersey.media + jersey-media-json-jackson + ${jersey.version} + test + + + + + jaxrs-cxf + + + jaxrs.impl + cxf + + + + cxf + + + + org.apache.cxf + cxf-rt-rs-client + ${cxf.version} + provided + + + + + + + + inteligr8-releases + https://repos.inteligr8.com/nexus/repository/inteligr8-public + true + false + + + inteligr8-snapshots + https://repos.inteligr8.com/nexus/repository/inteligr8-snapshots + false + true + + + + + + inteligr8-releases + https://repos.inteligr8.com/nexus/repository/inteligr8-public + + + inteligr8-snapshots + https://repos.inteligr8.com/nexus/repository/inteligr8-snapshots + + + diff --git a/src/main/cxf/com/inteligr8/alfresco/acs/AcsClientCxfConfiguration.java b/src/main/cxf/com/inteligr8/alfresco/acs/AcsClientCxfConfiguration.java new file mode 100644 index 0000000..bfd1b40 --- /dev/null +++ b/src/main/cxf/com/inteligr8/alfresco/acs/AcsClientCxfConfiguration.java @@ -0,0 +1,32 @@ +package com.inteligr8.alfresco.acs; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +import com.inteligr8.rs.ClientCxfConfiguration; + +/** + * This class provides a POJO & Spring-based implementation of the + * ClientCxfConfiguration interface. You can use it outside of the Spring + * context, but you will need the spring-context and spring-beans libraries in + * your non-Spring application. + * + * @author brian@inteligr8.com + */ +@Configuration +@ComponentScan +public class AcsClientCxfConfiguration extends AcsClientConfiguration implements ClientCxfConfiguration { + + @Value("${content.service.cxf.defaultBusEnabled:true}") + private boolean defaultBusEnabled; + + public boolean isDefaultBusEnabled() { + return this.defaultBusEnabled; + } + + public void setDefaultBusEnabled(boolean defaultBusEnabled) { + this.defaultBusEnabled = defaultBusEnabled; + } + +} diff --git a/src/main/cxf/com/inteligr8/alfresco/acs/AcsClientCxfImpl.java b/src/main/cxf/com/inteligr8/alfresco/acs/AcsClientCxfImpl.java new file mode 100644 index 0000000..4931c45 --- /dev/null +++ b/src/main/cxf/com/inteligr8/alfresco/acs/AcsClientCxfImpl.java @@ -0,0 +1,29 @@ +package com.inteligr8.alfresco.acs; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import com.inteligr8.rs.ClientCxfImpl; + +/** + * This class provides a POJO & Spring-based implementation of the Apache + * CXF client. You can use it outside of the Spring context, but you will need + * the spring-context and spring-beans libraries in your non-Spring + * application. + * + * @author brian@inteligr8.com + */ +@Component("acs.client.cxf") +@Lazy +public class AcsClientCxfImpl extends ClientCxfImpl { + + /** + * This constructor is for Spring or POJO use + */ + @Autowired + public AcsClientCxfImpl(AcsClientCxfConfiguration config) { + super(config); + } + +} diff --git a/src/main/cxf/com/inteligr8/alfresco/acs/AcsPublicRestApiCxfImpl.java b/src/main/cxf/com/inteligr8/alfresco/acs/AcsPublicRestApiCxfImpl.java new file mode 100644 index 0000000..9144701 --- /dev/null +++ b/src/main/cxf/com/inteligr8/alfresco/acs/AcsPublicRestApiCxfImpl.java @@ -0,0 +1,25 @@ +package com.inteligr8.alfresco.acs; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +/** + * This class provides the Apache CXF client to the JAX-RS API for the ACS + * Public ReST API. + * + * @author brian@inteligr8.com + */ +@Component("acs.api.cxf") +@Lazy +public class AcsPublicRestApiCxfImpl extends AcsPublicRestApiImpl implements AcsPublicRestCxfApi { + + /** + * This constructor is for Spring or POJO use + */ + @Autowired + public AcsPublicRestApiCxfImpl(AcsClientCxfImpl client) { + super(client); + } + +} diff --git a/src/main/java/com/inteligr8/alfresco/acs/AcsClientConfiguration.java b/src/main/java/com/inteligr8/alfresco/acs/AcsClientConfiguration.java new file mode 100644 index 0000000..8781e29 --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/acs/AcsClientConfiguration.java @@ -0,0 +1,138 @@ +package com.inteligr8.alfresco.acs; + +import org.springframework.beans.factory.annotation.Value; + +import com.inteligr8.rs.ClientConfiguration; + +/** + * This class provides a POJO & Spring-based implementation of the + * ClientConfiguration interface. You can use it outside of the Spring + * context, but you will need the spring-context and spring-beans libraries in + * your non-Spring application. + * + * @author brian@inteligr8.com + */ +public abstract class AcsClientConfiguration implements ClientConfiguration { + + @Value("${content.service.baseUrl:http://localhost:8080/alfresco}") + private String baseUrl; + + @Value("${content.service.security.basicAuth.username:admin}") + private String basicAuthUsername; + + @Value("${content.service.security.basicAuth.password:admin}") + private String basicAuthPassword; + + @Value("${content.service.security.bearerToken:#{null}}") + private String bearerToken; + + @Value("${content.service.security.oauth.tokenUrl:#{null}}") + private String oAuthTokenUrl; + + @Value("${content.service.security.oauth.clientId:#{null}}") + private String oAuthClientId; + + @Value("${content.service.security.oauth.clientSecret:#{null}}") + private String oAuthClientSecret; + + @Value("${content.service.security.oauth.authCode:#{null}}") + private String oAuthAuthCode; + + @Value("${content.service.security.oauth.authRedirectUri:#{null}}") + private String oAuthAuthRedirectUri; + + @Value("${content.service.security.oauth.grantUsername:#{null}}") + private String oAuthUsername; + + @Value("${content.service.security.oauth.grantPassword:#{null}}") + private String oAuthPassword; + + public String getBaseUrl() { + return this.baseUrl; + } + + public void setBaseUrl(String baseUrl) { + this.baseUrl = baseUrl; + } + + public String getBasicAuthUsername() { + return this.basicAuthUsername; + } + + public void setBasicAuthUsername(String basicAuthUsername) { + this.basicAuthUsername = basicAuthUsername; + } + + public String getBasicAuthPassword() { + return this.basicAuthPassword; + } + + public void setBasicAuthPassword(String basicAuthPassword) { + this.basicAuthPassword = basicAuthPassword; + } + + public String getBearerToken() { + return this.bearerToken; + } + + public void setBearerToken(String bearerToken) { + this.bearerToken = bearerToken; + } + + public String getOAuthTokenUrl() { + return this.oAuthTokenUrl; + } + + public void setOAuthTokenUrl(String oAuthTokenUrl) { + this.oAuthTokenUrl = oAuthTokenUrl; + } + + public String getOAuthClientId() { + return this.oAuthClientId; + } + + public void setOAuthClientId(String oAuthClientId) { + this.oAuthClientId = oAuthClientId; + } + + public String getOAuthClientSecret() { + return this.oAuthClientSecret; + } + + public void setOAuthClientSecret(String oAuthClientSecret) { + this.oAuthClientSecret = oAuthClientSecret; + } + + public String getOAuthAuthCode() { + return this.oAuthAuthCode; + } + + public void setOAuthAuthCode(String oAuthAuthCode) { + this.oAuthAuthCode = oAuthAuthCode; + } + + public String getOAuthAuthRedirectUri() { + return this.oAuthAuthRedirectUri; + } + + public void setOAuthAuthRedirectUri(String oAuthAuthRedirectUri) { + this.oAuthAuthRedirectUri = oAuthAuthRedirectUri; + } + + public String getOAuthUsername() { + return this.oAuthUsername; + } + + public void setOAuthUsername(String oAuthUsername) { + this.oAuthUsername = oAuthUsername; + } + + public String getOAuthPassword() { + return this.oAuthPassword; + } + + public void setOAuthPassword(String oAuthPassword) { + this.oAuthPassword = oAuthPassword; + } + +} diff --git a/src/main/java/com/inteligr8/alfresco/acs/AcsPublicRestApiImpl.java b/src/main/java/com/inteligr8/alfresco/acs/AcsPublicRestApiImpl.java new file mode 100644 index 0000000..1ff37ff --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/acs/AcsPublicRestApiImpl.java @@ -0,0 +1,27 @@ +package com.inteligr8.alfresco.acs; + +import com.inteligr8.rs.Client; + +/** + * This class serves as the entrypoint to the JAX-RS API for the ACS Public + * ReST API. + * + * @author brian@inteligr8.com + */ +public class AcsPublicRestApiImpl implements AcsPublicRestApi { + + private Client client; + + public AcsPublicRestApiImpl(Client client) { + this.client = client; + } + + public Client getClient() { + return this.client; + } + + public final T getApi(Class apiClass) { + return this.client.getApi(apiClass); + } + +} diff --git a/src/main/jersey/com/inteligr8/alfresco/acs/AcsClientJerseyConfiguration.java b/src/main/jersey/com/inteligr8/alfresco/acs/AcsClientJerseyConfiguration.java new file mode 100644 index 0000000..b70cbc5 --- /dev/null +++ b/src/main/jersey/com/inteligr8/alfresco/acs/AcsClientJerseyConfiguration.java @@ -0,0 +1,32 @@ +package com.inteligr8.alfresco.acs; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +import com.inteligr8.rs.ClientJerseyConfiguration; + +/** + * This class provides a POJO & Spring-based implementation of the + * ClientJerseyConfiguration interface. You can use it outside of the Spring + * context, but you will need the spring-context and spring-beans libraries in + * your non-Spring application. + * + * @author brian@inteligr8.com + */ +@Configuration +@ComponentScan +public class AcsClientJerseyConfiguration extends AcsClientConfiguration implements ClientJerseyConfiguration { + + @Value("${content.service.jersey.putBodyRequired:true}") + private boolean putBodyRequired; + + public boolean isPutBodyRequired() { + return this.putBodyRequired; + } + + public void setPutBodyRequired(boolean putBodyRequired) { + this.putBodyRequired = putBodyRequired; + } + +} diff --git a/src/main/jersey/com/inteligr8/alfresco/acs/AcsClientJerseyImpl.java b/src/main/jersey/com/inteligr8/alfresco/acs/AcsClientJerseyImpl.java new file mode 100644 index 0000000..d7f31a1 --- /dev/null +++ b/src/main/jersey/com/inteligr8/alfresco/acs/AcsClientJerseyImpl.java @@ -0,0 +1,29 @@ +package com.inteligr8.alfresco.acs; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import com.inteligr8.rs.ClientJerseyImpl; + +/** + * This class provides a POJO & Spring-based implementation of the Jersey + * client configured for APS. You can use it outside of the Spring context, + * but you will need the spring-context and spring-beans libraries in your + * non-Spring application. + * + * @author brian@inteligr8.com + */ +@Component("acs.client.jersey") +@Lazy +public class AcsClientJerseyImpl extends ClientJerseyImpl { + + /** + * This constructor is for Spring and POJO use + */ + @Autowired + public AcsClientJerseyImpl(AcsClientJerseyConfiguration config) { + super(config); + } + +} diff --git a/src/main/jersey/com/inteligr8/alfresco/acs/AcsPublicRestApiJerseyImpl.java b/src/main/jersey/com/inteligr8/alfresco/acs/AcsPublicRestApiJerseyImpl.java new file mode 100644 index 0000000..2ef9c15 --- /dev/null +++ b/src/main/jersey/com/inteligr8/alfresco/acs/AcsPublicRestApiJerseyImpl.java @@ -0,0 +1,25 @@ +package com.inteligr8.alfresco.acs; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +/** + * This class provides the Jersey client to the JAX-RS API for the ACS Public + * ReST API. + * + * @author brian@inteligr8.com + */ +@Component("acs.api.jersey") +@Lazy +public class AcsPublicRestApiJerseyImpl extends AcsPublicRestApiImpl implements AcsPublicRestJerseyApi { + + /** + * This constructor is for Spring or POJO use + */ + @Autowired + public AcsPublicRestApiJerseyImpl(AcsClientJerseyImpl client) { + super(client); + } + +} 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/cxf/com/inteligr8/alfresco/acs/ConnectionCxfClientIT.java b/src/test/cxf/com/inteligr8/alfresco/acs/ConnectionCxfClientIT.java new file mode 100644 index 0000000..a37ad9c --- /dev/null +++ b/src/test/cxf/com/inteligr8/alfresco/acs/ConnectionCxfClientIT.java @@ -0,0 +1,28 @@ +package com.inteligr8.alfresco.acs; + +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.rs.ClientConfiguration; + +@TestPropertySource(locations = {"/local.properties"}) +@SpringJUnitConfig(classes = {AcsClientCxfConfiguration.class, AcsPublicRestApiCxfImpl.class, AcsClientCxfImpl.class}) +public class ConnectionCxfClientIT extends ConnectionClientIT { + + @Autowired + @Qualifier("acs.api.cxf") + private AcsPublicRestApiImpl api; + + @Override + public AcsPublicRestApi getApi() { + return this.api; + } + + @Override + public ClientConfiguration getConfiguration() { + return this.api.getClient().getConfig(); + } + +} diff --git a/src/test/cxf/com/inteligr8/alfresco/acs/CxfUploadIT.java b/src/test/cxf/com/inteligr8/alfresco/acs/CxfUploadIT.java new file mode 100644 index 0000000..f088422 --- /dev/null +++ b/src/test/cxf/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 = {AcsClientCxfConfiguration.class, AcsPublicRestApiCxfImpl.class, AcsClientCxfImpl.class}) +public class CxfUploadIT extends UploadIT { + + @Autowired + @Qualifier("acs.api.cxf") + private AcsPublicRestApiCxfImpl api; + + @Override + public AcsPublicRestApi getApi() { + return this.api; + } + + @Override + public ClientConfiguration getConfiguration() { + return this.api.getClient().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.api.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/ConditionalIT.java b/src/test/java/com/inteligr8/alfresco/acs/ConditionalIT.java new file mode 100644 index 0000000..90c6ecd --- /dev/null +++ b/src/test/java/com/inteligr8/alfresco/acs/ConditionalIT.java @@ -0,0 +1,35 @@ +package com.inteligr8.alfresco.acs; + +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.client.methods.RequestBuilder; +import org.apache.http.impl.client.DefaultRedirectStrategy; +import org.apache.http.impl.client.HttpClientBuilder; + +import com.inteligr8.rs.ClientConfiguration; + +public abstract class ConditionalIT { + + public abstract ClientConfiguration getConfiguration(); + + public boolean hostExists() { + String uri = this.getConfiguration().getBaseUrl(); + + HttpUriRequest request = RequestBuilder.get() + .setUri(uri) + .build(); + + HttpClient client = HttpClientBuilder.create() + .setRedirectStrategy(DefaultRedirectStrategy.INSTANCE) + .build(); + + try { + HttpResponse response = client.execute(request); + return response.getStatusLine().getStatusCode() < 300; + } catch (Exception e) { + return false; + } + } + +} diff --git a/src/test/java/com/inteligr8/alfresco/acs/ConnectionClientIT.java b/src/test/java/com/inteligr8/alfresco/acs/ConnectionClientIT.java new file mode 100644 index 0000000..7196c3f --- /dev/null +++ b/src/test/java/com/inteligr8/alfresco/acs/ConnectionClientIT.java @@ -0,0 +1,94 @@ +package com.inteligr8.alfresco.acs; + +import java.util.List; +import java.util.UUID; + +import javax.ws.rs.NotFoundException; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIf; + +import com.inteligr8.alfresco.acs.api.DiscoveryApi; +import com.inteligr8.alfresco.acs.api.NodesApi; +import com.inteligr8.alfresco.acs.api.V0Api; +import com.inteligr8.alfresco.acs.model.RepositoryInfo; +import com.inteligr8.alfresco.acs.model.v0.ClassInfo; +import com.inteligr8.alfresco.acs.model.v0.MimeTypesData; +import com.inteligr8.alfresco.acs.model.v0.PropertyInfo; +import com.inteligr8.alfresco.acs.model.v0.ServerData; + +public abstract class ConnectionClientIT extends ConditionalIT { + + public abstract AcsPublicRestApi getApi(); + + @Test + @EnabledIf("hostExists") + public void testDiscovery() { + DiscoveryApi api = this.getApi().getDiscoveryApi(); + RepositoryInfo repoInfo = api.getRepositoryInformation().getEntry().getRepository(); + + Assertions.assertNotNull(repoInfo); + Assertions.assertFalse(repoInfo.getStatus().isIsReadOnly()); + Assertions.assertEquals("6", repoInfo.getVersion().getMajor()); + } + + @Test + @EnabledIf("hostExists") + public void testMissingNode() { + NodesApi api = this.getApi().getNodesApi(); + + Assertions.assertThrows(NotFoundException.class, () -> { + api.getNode(UUID.randomUUID().toString(), null, null, null); + }); + } + + @Test + @EnabledIf("hostExists") + public void testV0ServerInfo() { + V0Api api = this.getApi().getV0Api(); + ServerData server = api.getServer(); + + Assertions.assertNotNull(server); + Assertions.assertNotNull(server.getData()); + Assertions.assertNotNull(server.getData().getEdition()); + Assertions.assertTrue(server.getData().getEdition().length() > 5); + Assertions.assertTrue(server.getData().getVersion().length() > 5); + Assertions.assertTrue(server.getData().getSchema().length() > 3); + } + + @Test + @EnabledIf("hostExists") + public void testV0MimeTypes() { + V0Api api = this.getApi().getV0Api(); + MimeTypesData mimeTypes = api.getMimeTypes(); + + Assertions.assertNotNull(mimeTypes); + Assertions.assertNotNull(mimeTypes.getData()); + Assertions.assertTrue(mimeTypes.getData().getMimeTypes().size() > 50); + Assertions.assertNotNull(mimeTypes.getData().getMimeTypeInfo("application/pdf")); + Assertions.assertEquals("pdf", mimeTypes.getData().getMimeTypeInfo("application/pdf").getExtensions().getDefault()); + } + + @Test + @EnabledIf("hostExists") + public void testV0Classes() { + V0Api api = this.getApi().getV0Api(); + List classes = api.getClasses(null, null, null); + + Assertions.assertNotNull(classes); + Assertions.assertTrue(classes.size() > 50); + } + + @Test + @EnabledIf("hostExists") + public void testV0Property() { + V0Api api = this.getApi().getV0Api(); + List props = api.getProperties(null, "cm:content", null); + + Assertions.assertNotNull(props); + Assertions.assertEquals(1, props.size()); + Assertions.assertEquals("d:content", props.iterator().next().getDataType()); + } + +} 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..4bf00a7 --- /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 getApi(); + + 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.getApi().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 diff --git a/src/test/jersey/com/inteligr8/alfresco/acs/ConnectionJerseyClientIT.java b/src/test/jersey/com/inteligr8/alfresco/acs/ConnectionJerseyClientIT.java new file mode 100644 index 0000000..e282036 --- /dev/null +++ b/src/test/jersey/com/inteligr8/alfresco/acs/ConnectionJerseyClientIT.java @@ -0,0 +1,28 @@ +package com.inteligr8.alfresco.acs; + +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.rs.ClientConfiguration; + +@TestPropertySource(locations = {"/local.properties"}) +@SpringJUnitConfig(classes = {AcsClientJerseyConfiguration.class, AcsPublicRestApiJerseyImpl.class, AcsClientJerseyImpl.class}) +public class ConnectionJerseyClientIT extends ConnectionClientIT { + + @Autowired + @Qualifier("acs.api.jersey") + private AcsPublicRestApiImpl api; + + @Override + public AcsPublicRestApi getApi() { + return this.api; + } + + @Override + public ClientConfiguration getConfiguration() { + return this.api.getClient().getConfig(); + } + +} diff --git a/src/test/jersey/com/inteligr8/alfresco/acs/JerseyUploadIT.java b/src/test/jersey/com/inteligr8/alfresco/acs/JerseyUploadIT.java new file mode 100644 index 0000000..f3a1341 --- /dev/null +++ b/src/test/jersey/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 = {AcsClientJerseyConfiguration.class, AcsPublicRestApiJerseyImpl.class, AcsClientJerseyImpl.class}) +public class JerseyUploadIT extends UploadIT { + + @Autowired + @Qualifier("acs.api.jersey") + private AcsPublicRestApiJerseyImpl api; + + @Override + public AcsPublicRestApi getApi() { + return this.api; + } + + @Override + public ClientConfiguration getConfiguration() { + return this.api.getClient().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.api.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/resources/local-oauth.properties b/src/test/resources/local-oauth.properties new file mode 100644 index 0000000..c9ea910 --- /dev/null +++ b/src/test/resources/local-oauth.properties @@ -0,0 +1,5 @@ +content.service.baseUrl=http://localhost:8080/alfresco +content.service.security.oauth.tokenUrl=http://auth.example.org:8080/auth/realms/alfresco/protocol/openid-connect/token +content.service.security.oauth.clientId=alfresco +content.service.security.oauth.grantUsername=admin +content.service.security.oauth.grantPassword=admin diff --git a/src/test/resources/local.properties b/src/test/resources/local.properties new file mode 100644 index 0000000..17bb34c --- /dev/null +++ b/src/test/resources/local.properties @@ -0,0 +1,3 @@ +content.service.baseUrl=http://localhost:8080/alfresco +content.service.security.basicAuth.username=admin +content.service.security.basicAuth.password=admin diff --git a/src/test/resources/log4j2.properties b/src/test/resources/log4j2.properties new file mode 100644 index 0000000..df444d4 --- /dev/null +++ b/src/test/resources/log4j2.properties @@ -0,0 +1,19 @@ +rootLogger.level=trace +rootLogger.appenderRef.stdout.ref=STDOUT + +logger.spring.name=org.springframework +logger.spring.level=info + +logger.common-rest-api.name=com.inteligr8.rs +logger.common-rest-api.level=trace + +logger.this.name=com.inteligr8.alfresco.acs +logger.this.level=trace + +logger.jaxrslog.name=jaxrs.request +logger.jaxrslog.level=trace + +appender.stdout.type=Console +appender.stdout.name=STDOUT +appender.stdout.layout.type=PatternLayout +appender.stdout.layout.pattern=%C [%t] %m%n diff --git a/src/test/vscode/createNode.http b/src/test/vscode/createNode.http new file mode 100644 index 0000000..99f9ed1 --- /dev/null +++ b/src/test/vscode/createNode.http @@ -0,0 +1,53 @@ +@baseUrl = http://localhost:8080/alfresco +@username = admin +@password = admin + +### Find Folder +# @name find +POST {{baseUrl}}/api/-default-/public/search/versions/1/search HTTP/1.1 +Authorization: Basic {{username}}:{{password}} + +{ + "query": { + "language": "afts", + "query": "=@cm:name:'Shared'" + } +} + +@folderNodeId = {{find.response.body.list.entries[0].entry.id}} + +### Upload File +# @name upload +POST {{baseUrl}}/api/-default-/public/alfresco/versions/1/nodes/{{folderNodeId}}/children?autoRename=true +Authorization: Basic {{username}}:{{password}} +Content-type: application/json + +{ + "name": "TestFolder", + "nodeType": "cm:content", + "properties": null +} + +### Upload File +# @name upload-form +POST {{baseUrl}}/api/-default-/public/alfresco/versions/1/nodes/{{folderNodeId}}/children +Authorization: Basic {{username}}:{{password}} +Content-type: multipart/form-data; boundary=----Test + +------Test +Content-disposition: form-data; name="name" + +TestFolder +------Test +Content-disposition: form-data; name="nodeType" + +cm:content +------Test +Content-disposition: form-data; name="autoRename" + +true +------Test +Content-disposition: form-data; name="filedata"; filename="test.txt" + +This is a test +------Test-- \ No newline at end of file