From 4fb9724d0766b7c5b8dc06f1038e90eb5eeb59c6 Mon Sep 17 00:00:00 2001 From: Brian Long Date: Fri, 4 Jun 2021 13:35:19 -0400 Subject: [PATCH] massive refactoring for jaxrs --- pom.xml | 32 ++++- .../alfresco/activiti/ApsClient.java | 68 +++++++--- .../activiti/ApsClientConfiguration.java | 22 ++-- .../alfresco/activiti/ApsClientCxfImpl.java | 58 +++++++++ .../activiti/ApsClientJerseyImpl.java | 40 ++++++ .../alfresco/activiti/ExtendedResponse.java | 32 ----- .../alfresco/activiti/api/AdminAPI.java | 32 ----- .../alfresco/activiti/api/AdminApi.java | 22 ++++ .../alfresco/activiti/api/AppVersionAPI.java | 29 ----- .../alfresco/activiti/api/AppVersionApi.java | 17 +++ .../alfresco/activiti/api/EnterpriseAPI.java | 44 ------- .../alfresco/activiti/api/PathElement.java | 25 ---- .../activiti/api/ProcessInstanceAPI.java | 110 ---------------- .../activiti/api/ProcessInstancesAPI.java | 35 ----- .../activiti/api/ProcessInstancesApi.java | 72 +++++++++++ .../alfresco/activiti/api/ProfileAPI.java | 29 ----- .../alfresco/activiti/api/ProfileApi.java | 17 +++ .../alfresco/activiti/api/TaskAPI.java | 120 ------------------ .../alfresco/activiti/api/TasksAPI.java | 19 --- .../alfresco/activiti/api/TasksApi.java | 54 ++++++++ .../activiti/ArrayResponseUnitTest.java | 39 +----- .../alfresco/activiti/ConditionalIT.java | 39 ++++++ .../activiti/ConnectionClientUnitTest.java | 74 ----------- .../activiti/ConnectionCxfClientIT.java | 40 ++++++ .../activiti/ConnectionJerseyClientIT.java | 40 ++++++ 25 files changed, 495 insertions(+), 614 deletions(-) create mode 100644 src/main/java/com/inteligr8/alfresco/activiti/ApsClientCxfImpl.java create mode 100644 src/main/java/com/inteligr8/alfresco/activiti/ApsClientJerseyImpl.java delete mode 100644 src/main/java/com/inteligr8/alfresco/activiti/ExtendedResponse.java delete mode 100644 src/main/java/com/inteligr8/alfresco/activiti/api/AdminAPI.java create mode 100644 src/main/java/com/inteligr8/alfresco/activiti/api/AdminApi.java delete mode 100644 src/main/java/com/inteligr8/alfresco/activiti/api/AppVersionAPI.java create mode 100644 src/main/java/com/inteligr8/alfresco/activiti/api/AppVersionApi.java delete mode 100644 src/main/java/com/inteligr8/alfresco/activiti/api/EnterpriseAPI.java delete mode 100644 src/main/java/com/inteligr8/alfresco/activiti/api/PathElement.java delete mode 100644 src/main/java/com/inteligr8/alfresco/activiti/api/ProcessInstanceAPI.java delete mode 100644 src/main/java/com/inteligr8/alfresco/activiti/api/ProcessInstancesAPI.java create mode 100644 src/main/java/com/inteligr8/alfresco/activiti/api/ProcessInstancesApi.java delete mode 100644 src/main/java/com/inteligr8/alfresco/activiti/api/ProfileAPI.java create mode 100644 src/main/java/com/inteligr8/alfresco/activiti/api/ProfileApi.java delete mode 100644 src/main/java/com/inteligr8/alfresco/activiti/api/TaskAPI.java delete mode 100644 src/main/java/com/inteligr8/alfresco/activiti/api/TasksAPI.java create mode 100644 src/main/java/com/inteligr8/alfresco/activiti/api/TasksApi.java create mode 100644 src/test/java/com/inteligr8/alfresco/activiti/ConditionalIT.java delete mode 100644 src/test/java/com/inteligr8/alfresco/activiti/ConnectionClientUnitTest.java create mode 100644 src/test/java/com/inteligr8/alfresco/activiti/ConnectionCxfClientIT.java create mode 100644 src/test/java/com/inteligr8/alfresco/activiti/ConnectionJerseyClientIT.java diff --git a/pom.xml b/pom.xml index f7785b9..2633a82 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.inteligr8.alfresco aps-public-rest-api - 1.0-v1-SNAPSHOT + 1.0-SNAPSHOT-v1 Alfresco Process Services ReST API Client for Java @@ -18,8 +18,8 @@ 5.7.2 5.2.14.RELEASE - 2.3.10.RELEASE 2.34 + 3.3.2 @@ -33,11 +33,33 @@ jackson-databind 2.12.2 + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + 2.12.2 + + + org.slf4j + slf4j-api + 1.7.29 + jakarta.ws.rs jakarta.ws.rs-api 2.1.6 + + org.glassfish.jersey.ext + jersey-proxy-client + ${jersey.version} + provided + + + org.apache.cxf + cxf-rt-rs-client + ${cxf.version} + provided + org.glassfish.jersey.core jersey-client @@ -68,6 +90,12 @@ ${spring.version} test + + org.apache.httpcomponents + httpclient + 4.5.9 + test + diff --git a/src/main/java/com/inteligr8/alfresco/activiti/ApsClient.java b/src/main/java/com/inteligr8/alfresco/activiti/ApsClient.java index d5ce59b..9b10b5b 100644 --- a/src/main/java/com/inteligr8/alfresco/activiti/ApsClient.java +++ b/src/main/java/com/inteligr8/alfresco/activiti/ApsClient.java @@ -1,35 +1,71 @@ package com.inteligr8.alfresco.activiti; +import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.ClientRequestFilter; +import javax.ws.rs.client.WebTarget; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.inteligr8.alfresco.activiti.api.EnterpriseAPI; +import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; +import com.inteligr8.alfresco.activiti.api.AdminApi; +import com.inteligr8.alfresco.activiti.api.AppVersionApi; +import com.inteligr8.alfresco.activiti.api.ProcessInstancesApi; +import com.inteligr8.alfresco.activiti.api.ProfileApi; +import com.inteligr8.alfresco.activiti.api.TasksApi; /** - * Afresco Process Services Spring Client + * Alfresco Process Services Spring Client */ -@Component +@Component("apsClient") public class ApsClient { - private static final ApsClient INSTANCE = new ApsClient(); - - public static ApsClient getInstance() { - return ApsClient.INSTANCE; - } - - - @Autowired private ApsClientConfiguration config; - public EnterpriseAPI getEnterpriseAPI() { - javax.ws.rs.client.Client client = ClientBuilder - .newClient(); + protected ApsClientConfiguration getConfig() { + return this.config; + } + + public Client getClient() { + ClientRequestFilter authFilter = this.config.getAuthorizationFilter(); - this.config.authorize(client); - return new EnterpriseAPI(this.config.getBaseUrl() + "/api", client); + ClientBuilder clientBuilder = ClientBuilder.newBuilder() + .register(new JacksonJaxbJsonProvider()); + if (authFilter != null) + clientBuilder.register(authFilter); + + return clientBuilder.build(); + } + + public WebTarget getTarget() { + return this.getClient() + .target(this.config.getBaseUrl()); + } + + protected T getApi(Class apiClass) { + throw new UnsupportedOperationException(); + } + + public AdminApi getAdminApi() { + return this.getApi(AdminApi.class); + } + + public AppVersionApi getAppVersionApi() { + return this.getApi(AppVersionApi.class); + } + + public ProcessInstancesApi getProcessInstancesApi() { + return this.getApi(ProcessInstancesApi.class); + } + + public ProfileApi getProfileApi() { + return this.getApi(ProfileApi.class); + } + + public TasksApi getTasksApi() { + return this.getApi(TasksApi.class); } } diff --git a/src/main/java/com/inteligr8/alfresco/activiti/ApsClientConfiguration.java b/src/main/java/com/inteligr8/alfresco/activiti/ApsClientConfiguration.java index 3ef1e4c..6b39ac1 100644 --- a/src/main/java/com/inteligr8/alfresco/activiti/ApsClientConfiguration.java +++ b/src/main/java/com/inteligr8/alfresco/activiti/ApsClientConfiguration.java @@ -1,6 +1,6 @@ package com.inteligr8.alfresco.activiti; -import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientRequestFilter; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.ComponentScan; @@ -10,27 +10,29 @@ import org.springframework.context.annotation.Configuration; @ComponentScan public class ApsClientConfiguration { - @Value("${process.service.baseUrl}") + @Value("${process.service.baseUrl:http://localhost:8080/activiti-app}") private String baseUrl; - @Value("${process.service.security.basicAuth.username}") + @Value("${process.service.security.basicAuth.username:admin@app.activiti.com}") private String basicAuthUsername; - @Value("${process.service.security.basicAuth.password}") + @Value("${process.service.security.basicAuth.password:admin}") private String basicAuthPassword; - @Value("${process.service.security.accessToken}") + @Value("${process.service.security.accessToken:#{null}}") private String accessToken; public String getBaseUrl() { return this.baseUrl; } - public void authorize(Client client) { - if (this.basicAuthUsername != null) { - client.register(new BasicAuthRequestFilter(this.basicAuthUsername, this.basicAuthPassword)); - } else if (this.accessToken != null) { - client.register(new AccessTokenRequestFilter(this.accessToken)); + public ClientRequestFilter getAuthorizationFilter() { + if (this.accessToken != null) { + return new AccessTokenRequestFilter(this.accessToken); + } else if (this.basicAuthUsername != null) { + return new BasicAuthRequestFilter(this.basicAuthUsername, this.basicAuthPassword); + } else { + return null; } } diff --git a/src/main/java/com/inteligr8/alfresco/activiti/ApsClientCxfImpl.java b/src/main/java/com/inteligr8/alfresco/activiti/ApsClientCxfImpl.java new file mode 100644 index 0000000..0d7636c --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/activiti/ApsClientCxfImpl.java @@ -0,0 +1,58 @@ +package com.inteligr8.alfresco.activiti; + +import java.util.LinkedList; +import java.util.List; + +import javax.ws.rs.client.ClientRequestFilter; +import javax.ws.rs.ext.RuntimeDelegate; + +import org.apache.cxf.jaxrs.client.JAXRSClientFactory; +import org.apache.cxf.jaxrs.client.WebClient; +import org.apache.cxf.jaxrs.impl.RuntimeDelegateImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; + +/** + * Alfresco Process Services Spring Client for CXF + */ +@Component("apsClient.cxf") +@Lazy +public class ApsClientCxfImpl extends ApsClient implements InitializingBean { + + private final Logger logger = LoggerFactory.getLogger(ApsClientCxfImpl.class); + + @Override + public void afterPropertiesSet() { + if (RuntimeDelegate.getInstance() == null) { + this.logger.info("Setting JAX-RS runtime delegate to the CXF library"); + RuntimeDelegate.setInstance(new RuntimeDelegateImpl()); + } else if (RuntimeDelegate.getInstance() instanceof RuntimeDelegateImpl) { + this.logger.info("JAX-RS runtime delegate already the CXF library"); + } else { + this.logger.warn("Setting JAX-RS runtime delegate to the CXF library; was: " + RuntimeDelegate.getInstance().getClass().getName()); + RuntimeDelegate.setInstance(new RuntimeDelegateImpl()); + } + } + + public WebClient getCxfClient() { + List providersAndFilters = new LinkedList(); + providersAndFilters.add(new JacksonJaxbJsonProvider()); + + ClientRequestFilter authFilter = this.getConfig().getAuthorizationFilter(); + if (authFilter != null) + providersAndFilters.add(authFilter); + + return WebClient.create(this.getConfig().getBaseUrl(), providersAndFilters); + } + + @Override + protected T getApi(Class apiClass) { + return JAXRSClientFactory.fromClient(this.getCxfClient(), apiClass); + } + +} diff --git a/src/main/java/com/inteligr8/alfresco/activiti/ApsClientJerseyImpl.java b/src/main/java/com/inteligr8/alfresco/activiti/ApsClientJerseyImpl.java new file mode 100644 index 0000000..4262599 --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/activiti/ApsClientJerseyImpl.java @@ -0,0 +1,40 @@ +package com.inteligr8.alfresco.activiti; + +import javax.ws.rs.ext.RuntimeDelegate; + +import org.glassfish.jersey.client.proxy.WebResourceFactory; +import org.glassfish.jersey.internal.RuntimeDelegateImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +/** + * Alfresco Process Services Spring Client for Jersey + */ +@Component("apsClient.jersey") +@Lazy +public class ApsClientJerseyImpl extends ApsClient implements InitializingBean { + + private final Logger logger = LoggerFactory.getLogger(ApsClientJerseyImpl.class); + + @Override + public void afterPropertiesSet() { + if (RuntimeDelegate.getInstance() == null) { + this.logger.info("Setting JAX-RS runtime delegate to the Jersey library"); + RuntimeDelegate.setInstance(new RuntimeDelegateImpl()); + } else if (RuntimeDelegate.getInstance() instanceof RuntimeDelegateImpl) { + this.logger.info("JAX-RS runtime delegate already the Jersey library"); + } else { + this.logger.warn("Setting JAX-RS runtime delegate to the Jersey library; was: " + RuntimeDelegate.getInstance().getClass().getName()); + RuntimeDelegate.setInstance(new RuntimeDelegateImpl()); + } + } + + @Override + protected T getApi(Class apiClass) { + return WebResourceFactory.newResource(apiClass, this.getTarget()); + } + +} diff --git a/src/main/java/com/inteligr8/alfresco/activiti/ExtendedResponse.java b/src/main/java/com/inteligr8/alfresco/activiti/ExtendedResponse.java deleted file mode 100644 index d5c92d6..0000000 --- a/src/main/java/com/inteligr8/alfresco/activiti/ExtendedResponse.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.inteligr8.alfresco.activiti; - -import java.io.IOException; -import java.util.List; - -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; - -public class ExtendedResponse { - - private final Response response; - - public ExtendedResponse(Response response) { - this.response = response; - } - - @SuppressWarnings("unchecked") - public List readArrayEntity(Class genericType) { - ArrayNode nodes = this.response.readEntity(ArrayNode.class); - - ObjectMapper om = new ObjectMapper(); - try { - return (List)om.readerForListOf(genericType).readValue(nodes); - } catch (IOException ie) { - throw new WebApplicationException(ie); - } - } - -} diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/AdminAPI.java b/src/main/java/com/inteligr8/alfresco/activiti/api/AdminAPI.java deleted file mode 100644 index 2bf9a5a..0000000 --- a/src/main/java/com/inteligr8/alfresco/activiti/api/AdminAPI.java +++ /dev/null @@ -1,32 +0,0 @@ - -package com.inteligr8.alfresco.activiti.api; - -import java.util.List; - -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.client.Client; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status.Family; - -import com.inteligr8.alfresco.activiti.ExtendedResponse; -import com.inteligr8.alfresco.activiti.model.Tenant; - -public class AdminAPI extends PathElement { - - private final Client client; - - public AdminAPI(EnterpriseAPI api) { - super(api, "admin"); - this.client = api.getClient(); - } - - public List getTenants() { - Response response = this.client.target(this.getBaseUrl() + "/tenants") - .request() - .get(); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - return new ExtendedResponse(response).readArrayEntity(Tenant.class); - } - -} diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/AdminApi.java b/src/main/java/com/inteligr8/alfresco/activiti/api/AdminApi.java new file mode 100644 index 0000000..d466dbf --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/activiti/api/AdminApi.java @@ -0,0 +1,22 @@ + +package com.inteligr8.alfresco.activiti.api; + +import java.util.List; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; + +import com.inteligr8.alfresco.activiti.model.Tenant; + +@Path("/api/enterprise/admin") +public interface AdminApi { + + @GET + @Path("/tenants") + @Consumes({ "application/json" }) + @Produces({ "application/json" }) + public List getTenants(); + +} diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/AppVersionAPI.java b/src/main/java/com/inteligr8/alfresco/activiti/api/AppVersionAPI.java deleted file mode 100644 index 71c9249..0000000 --- a/src/main/java/com/inteligr8/alfresco/activiti/api/AppVersionAPI.java +++ /dev/null @@ -1,29 +0,0 @@ - -package com.inteligr8.alfresco.activiti.api; - -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.client.Client; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status.Family; - -import com.inteligr8.alfresco.activiti.model.AppVersion; - -public class AppVersionAPI extends PathElement { - - private final Client client; - - public AppVersionAPI(EnterpriseAPI api) { - super(api, "app-version"); - this.client = api.getClient(); - } - - public AppVersion get() { - Response response = this.client.target(this.getBaseUrl()) - .request() - .get(); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - return response.readEntity(AppVersion.class); - } - -} diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/AppVersionApi.java b/src/main/java/com/inteligr8/alfresco/activiti/api/AppVersionApi.java new file mode 100644 index 0000000..50556fb --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/activiti/api/AppVersionApi.java @@ -0,0 +1,17 @@ + +package com.inteligr8.alfresco.activiti.api; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; + +import com.inteligr8.alfresco.activiti.model.AppVersion; + +@Path("/api/enterprise/app-version") +public interface AppVersionApi { + + @GET + @Produces({ "application/json" }) + public AppVersion get(); + +} diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/EnterpriseAPI.java b/src/main/java/com/inteligr8/alfresco/activiti/api/EnterpriseAPI.java deleted file mode 100644 index b532b4e..0000000 --- a/src/main/java/com/inteligr8/alfresco/activiti/api/EnterpriseAPI.java +++ /dev/null @@ -1,44 +0,0 @@ - -package com.inteligr8.alfresco.activiti.api; - -import javax.ws.rs.client.Client; - -public class EnterpriseAPI extends PathElement { - - private final Client client; - - public EnterpriseAPI(String baseUrl, Client client) { - super(baseUrl, "enterprise"); - this.client = client; - } - - public EnterpriseAPI(PathElement parent, Client client) { - super(parent, "enterprise"); - this.client = client; - } - - protected Client getClient() { - return this.client; - } - - public AdminAPI getAdminAPI() { - return new AdminAPI(this); - } - - public AppVersionAPI getAppVersionAPI() { - return new AppVersionAPI(this); - } - - public ProcessInstancesAPI getProcessInstanceAPI() { - return new ProcessInstancesAPI(this); - } - - public ProfileAPI getProfileAPI() { - return new ProfileAPI(this); - } - - public TasksAPI getTasksAPI() { - return new TasksAPI(this); - } - -} diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/PathElement.java b/src/main/java/com/inteligr8/alfresco/activiti/api/PathElement.java deleted file mode 100644 index 11ef7e6..0000000 --- a/src/main/java/com/inteligr8/alfresco/activiti/api/PathElement.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.inteligr8.alfresco.activiti.api; - -public abstract class PathElement { - - private final String baseUrl; - private final String name; - - public PathElement(String baseUrl, String name) { - this.baseUrl = baseUrl + "/" + name; - this.name = name; - } - - public PathElement(PathElement pelement, String name) { - this(pelement.getBaseUrl(), name); - } - - protected String getBaseUrl() { - return this.baseUrl; - } - - public String getName() { - return this.name; - } - -} diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/ProcessInstanceAPI.java b/src/main/java/com/inteligr8/alfresco/activiti/api/ProcessInstanceAPI.java deleted file mode 100644 index ced6fe9..0000000 --- a/src/main/java/com/inteligr8/alfresco/activiti/api/ProcessInstanceAPI.java +++ /dev/null @@ -1,110 +0,0 @@ - -package com.inteligr8.alfresco.activiti.api; - -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.util.List; - -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.Entity; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status.Family; - -import com.inteligr8.alfresco.activiti.ExtendedResponse; -import com.inteligr8.alfresco.activiti.model.ProcessInstance; -import com.inteligr8.alfresco.activiti.model.Variable; - -public class ProcessInstanceAPI extends PathElement { - - private final Client client; - - public ProcessInstanceAPI(ProcessInstancesAPI api, String processInstanceId) throws UnsupportedEncodingException { - super(api, URLEncoder.encode(processInstanceId, "utf-8")); - this.client = api.getClient(); - } - - protected Client getClient() { - return this.client; - } - - public ProcessInstance get() { - Response response = this.client.target(this.getBaseUrl()) - .request() - .get(); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - return response.readEntity(ProcessInstance.class); - } - - public void delete() { - Response response = this.client.target(this.getBaseUrl()) - .request() - .delete(); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - } - - public ProcessInstance activate() { - Response response = this.client.target(this.getBaseUrl() + "/activate") - .request() - .put(null); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - return response.readEntity(ProcessInstance.class); - } - - public ProcessInstance suspend() { - Response response = this.client.target(this.getBaseUrl() + "/suspend") - .request() - .put(null); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - return response.readEntity(ProcessInstance.class); - } - - public List getVariables() { - Response response = this.client.target(this.getBaseUrl() + "/variables") - .request() - .get(); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - return new ExtendedResponse(response).readArrayEntity(Variable.class); - } - - public List setVariables(List variables) { - Response response = this.client.target(this.getBaseUrl() + "/variables") - .request() - .put(Entity.json(variables)); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - return new ExtendedResponse(response).readArrayEntity(Variable.class); - } - - public Variable getVariable(String variableName) throws UnsupportedEncodingException { - Response response = this.client.target(this.getBaseUrl() + "/variables/" + URLEncoder.encode(variableName, "utf-8")) - .request() - .get(); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - return response.readEntity(Variable.class); - } - - public Variable setVariable(String variableName, Variable variable) throws UnsupportedEncodingException { - Response response = this.client.target(this.getBaseUrl() + "/variables/" + URLEncoder.encode(variableName, "utf-8")) - .request() - .put(Entity.json(variable)); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - return response.readEntity(Variable.class); - } - - public void deleteVariable(String variableName) throws UnsupportedEncodingException { - Response response = this.client.target(this.getBaseUrl() + "/variables/" + URLEncoder.encode(variableName, "utf-8")) - .request() - .delete(); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - } - -} diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/ProcessInstancesAPI.java b/src/main/java/com/inteligr8/alfresco/activiti/api/ProcessInstancesAPI.java deleted file mode 100644 index f9e0823..0000000 --- a/src/main/java/com/inteligr8/alfresco/activiti/api/ProcessInstancesAPI.java +++ /dev/null @@ -1,35 +0,0 @@ - -package com.inteligr8.alfresco.activiti.api; - -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.Entity; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status.Family; - -import com.inteligr8.alfresco.activiti.model.CreateProcessInstance; -import com.inteligr8.alfresco.activiti.model.ProcessInstance; - -public class ProcessInstancesAPI extends PathElement { - - private final Client client; - - public ProcessInstancesAPI(EnterpriseAPI api) { - super(api, "process-instances"); - this.client = api.getClient(); - } - - protected Client getClient() { - return this.client; - } - - public ProcessInstance create(CreateProcessInstance processInstance) { - Response response = this.client.target(this.getBaseUrl()) - .request() - .post(Entity.json(processInstance)); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - return response.readEntity(ProcessInstance.class); - } - -} diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/ProcessInstancesApi.java b/src/main/java/com/inteligr8/alfresco/activiti/api/ProcessInstancesApi.java new file mode 100644 index 0000000..49678d9 --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/activiti/api/ProcessInstancesApi.java @@ -0,0 +1,72 @@ + +package com.inteligr8.alfresco.activiti.api; + +import java.util.List; + +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +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 com.inteligr8.alfresco.activiti.model.CreateProcessInstance; +import com.inteligr8.alfresco.activiti.model.ProcessInstance; +import com.inteligr8.alfresco.activiti.model.Variable; + +@Path("/api/enterprise/process-instances") +public interface ProcessInstancesApi { + + @POST + @Consumes({ "application/json" }) + @Produces({ "application/json" }) + ProcessInstance create(CreateProcessInstance processInstance); + + @GET + @Path("{processInstanceId}") + @Produces({ "application/json" }) + ProcessInstance get(@PathParam("processInstanceId") String processInstanceId); + + @DELETE + @Path("{processInstanceId}") + void delete(@PathParam("processInstanceId") String processInstanceId); + + @PUT + @Path("{processInstanceId}/activate") + @Produces({ "application/json" }) + ProcessInstance activate(@PathParam("processInstanceId") String processInstanceId); + + @PUT + @Path("{processInstanceId}/suspend") + @Produces({ "application/json" }) + ProcessInstance suspend(@PathParam("processInstanceId") String processInstanceId); + + @GET + @Path("{processInstanceId}/variables") + @Produces({ "application/json" }) + List getVariables(@PathParam("processInstanceId") String processInstanceId); + + @PUT + @Path("{processInstanceId}/variables") + @Consumes({ "application/json" }) + @Produces({ "application/json" }) + List setVariables(@PathParam("processInstanceId") String processInstanceId, List variables); + + @GET + @Path("{processInstanceId}/variables/{variableName}") + @Produces({ "application/json" }) + Variable getVariable(@PathParam("processInstanceId") String processInstanceId, @PathParam("variableName") String variableName); + + @PUT + @Path("{processInstanceId}/variables/{variableName}") + @Consumes({ "application/json" }) + @Produces({ "application/json" }) + Variable setVariable(@PathParam("processInstanceId") String processInstanceId, @PathParam("variableName") String variableName, Variable variable); + + @DELETE + @Path("{processInstanceId}/variables/{variableName}") + void deleteVariable(@PathParam("processInstanceId") String processInstanceId, @PathParam("variableName") String variableName); + +} diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/ProfileAPI.java b/src/main/java/com/inteligr8/alfresco/activiti/api/ProfileAPI.java deleted file mode 100644 index 2e6f2e6..0000000 --- a/src/main/java/com/inteligr8/alfresco/activiti/api/ProfileAPI.java +++ /dev/null @@ -1,29 +0,0 @@ - -package com.inteligr8.alfresco.activiti.api; - -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.client.Client; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status.Family; - -import com.inteligr8.alfresco.activiti.model.User; - -public class ProfileAPI extends PathElement { - - private final Client client; - - public ProfileAPI(EnterpriseAPI api) { - super(api, "profile"); - this.client = api.getClient(); - } - - public User get() { - Response response = this.client.target(this.getBaseUrl()) - .request() - .get(); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - return response.readEntity(User.class); - } - -} diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/ProfileApi.java b/src/main/java/com/inteligr8/alfresco/activiti/api/ProfileApi.java new file mode 100644 index 0000000..fca46e9 --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/activiti/api/ProfileApi.java @@ -0,0 +1,17 @@ + +package com.inteligr8.alfresco.activiti.api; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; + +import com.inteligr8.alfresco.activiti.model.User; + +@Path("/api/enterprise/profile") +public interface ProfileApi { + + @GET + @Produces({ "application/json" }) + User get(); + +} diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/TaskAPI.java b/src/main/java/com/inteligr8/alfresco/activiti/api/TaskAPI.java deleted file mode 100644 index ad88099..0000000 --- a/src/main/java/com/inteligr8/alfresco/activiti/api/TaskAPI.java +++ /dev/null @@ -1,120 +0,0 @@ - -package com.inteligr8.alfresco.activiti.api; - -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.util.List; - -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.Entity; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status.Family; - -import com.inteligr8.alfresco.activiti.ExtendedResponse; -import com.inteligr8.alfresco.activiti.model.Task; -import com.inteligr8.alfresco.activiti.model.TaskUpdate; -import com.inteligr8.alfresco.activiti.model.Variable; - -public class TaskAPI extends PathElement { - - private final Client client; - - public TaskAPI(TasksAPI api, String taskId) throws UnsupportedEncodingException { - super(api, URLEncoder.encode(taskId, "utf-8")); - this.client = api.getClient(); - } - - protected Client getClient() { - return this.client; - } - - public Task update(TaskUpdate taskUpdate) { - Response response = this.client.target(this.getBaseUrl()) - .request() - .put(Entity.json(taskUpdate)); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - return response.readEntity(Task.class); - } - - public List getVariables(String scope) { - Response response = this.client.target(this.getBaseUrl() + "/variables") - .queryParam("scope", scope) - .request() - .get(); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - return new ExtendedResponse(response).readArrayEntity(Variable.class); - } - - public List setVariables(List variables) { - Response response = this.client.target(this.getBaseUrl() + "/variables") - .request() - .post(Entity.json(variables)); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - return new ExtendedResponse(response).readArrayEntity(Variable.class); - } - - public void deleteVariable(String variableName, String scope) throws UnsupportedEncodingException { - Response response = this.client.target(this.getBaseUrl() + "/variables/" + URLEncoder.encode(variableName, "utf-8")) - .queryParam("scope", scope) - .request() - .delete(); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - } - - public Variable getVariable(String variableName, String scope) throws UnsupportedEncodingException { - Response response = this.client.target(this.getBaseUrl() + "/variables/" + URLEncoder.encode(variableName, "utf-8")) - .queryParam("scope", scope) - .request() - .get(); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - return response.readEntity(Variable.class); - } - - public Variable setVariable(String variableName, Variable variable) throws UnsupportedEncodingException { - Response response = this.client.target(this.getBaseUrl() + "/variables/" + URLEncoder.encode(variableName, "utf-8")) - .request() - .put(Entity.json(variable)); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - return response.readEntity(Variable.class); - } - - public void claim() { - Response response = this.client.target(this.getBaseUrl() + "/action/claim") - .request() - .put(null); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - } - - public void unclaim() { - Response response = this.client.target(this.getBaseUrl() + "/action/unclaim") - .request() - .put(null); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - } - - public void complete() { - Response response = this.client.target(this.getBaseUrl() + "/action/complete") - .request() - .put(null); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - } - - public void resolve() { - Response response = this.client.target(this.getBaseUrl() + "/action/resolve") - .request() - .put(null); - if (!Family.SUCCESSFUL.equals(response.getStatusInfo().getFamily())) - throw new WebApplicationException(response); - } - -} diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/TasksAPI.java b/src/main/java/com/inteligr8/alfresco/activiti/api/TasksAPI.java deleted file mode 100644 index 7da7622..0000000 --- a/src/main/java/com/inteligr8/alfresco/activiti/api/TasksAPI.java +++ /dev/null @@ -1,19 +0,0 @@ - -package com.inteligr8.alfresco.activiti.api; - -import javax.ws.rs.client.Client; - -public class TasksAPI extends PathElement { - - private final Client client; - - public TasksAPI(EnterpriseAPI api) { - super(api, "tasks"); - this.client = api.getClient(); - } - - protected Client getClient() { - return this.client; - } - -} diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/TasksApi.java b/src/main/java/com/inteligr8/alfresco/activiti/api/TasksApi.java new file mode 100644 index 0000000..33a373d --- /dev/null +++ b/src/main/java/com/inteligr8/alfresco/activiti/api/TasksApi.java @@ -0,0 +1,54 @@ + +package com.inteligr8.alfresco.activiti.api; + +import java.util.List; + +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +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.activiti.model.Task; +import com.inteligr8.alfresco.activiti.model.TaskUpdate; +import com.inteligr8.alfresco.activiti.model.Variable; + +@Path("/api/enterprise/tasks") +public interface TasksApi { + + @PUT + @Path("{taskId}") + @Consumes({ "application/json" }) + @Produces({ "application/json" }) + public Task update(@PathParam("taskId") String taskId, TaskUpdate taskUpdate); + + @GET + @Path("{taskId}/variables") + @Produces({ "application/json" }) + List getVariables(@PathParam("taskId") String taskId, @QueryParam("scope") String scope); + + @PUT + @Path("{taskId}/variables") + @Consumes({ "application/json" }) + @Produces({ "application/json" }) + List setVariables(@PathParam("taskId") String taskId, List variables); + + @GET + @Path("{taskId}/variables/{variableName}") + @Produces({ "application/json" }) + Variable getVariable(@PathParam("taskId") String taskId, @PathParam("variableName") String variableName, @QueryParam("scope") String scope); + + @PUT + @Path("{taskId}/variables/{variableName}") + @Consumes({ "application/json" }) + @Produces({ "application/json" }) + Variable setVariable(@PathParam("taskId") String taskId, @PathParam("variableName") String variableName, Variable variable); + + @DELETE + @Path("{taskId}/variables/{variableName}") + void deleteVariable(@PathParam("taskId") String taskId, @PathParam("variableName") String variableName, @QueryParam("scope") String scope); + +} diff --git a/src/test/java/com/inteligr8/alfresco/activiti/ArrayResponseUnitTest.java b/src/test/java/com/inteligr8/alfresco/activiti/ArrayResponseUnitTest.java index 706defc..2966658 100644 --- a/src/test/java/com/inteligr8/alfresco/activiti/ArrayResponseUnitTest.java +++ b/src/test/java/com/inteligr8/alfresco/activiti/ArrayResponseUnitTest.java @@ -1,60 +1,25 @@ package com.inteligr8.alfresco.activiti; -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpClient.Redirect; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.net.http.HttpResponse.BodyHandlers; import java.util.List; 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.test.context.TestPropertySource; -import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; import com.inteligr8.alfresco.activiti.model.Tenant; -@TestPropertySource(locations = {"/local.properties"}) -@SpringJUnitConfig(classes = {ApsClientConfiguration.class, ApsClient.class}) -public class ArrayResponseUnitTest { +public class ArrayResponseUnitTest extends ConditionalIT { @Autowired private ApsClient client; - @Autowired - private ApsClientConfiguration config; - @Test @EnabledIf("hostExists") public void testTenants() { - List objs = this.client - .getEnterpriseAPI() - .getAdminAPI() - .getTenants(); + List objs = this.client.getAdminApi().getTenants(); Assertions.assertNotNull(objs); } - - public boolean hostExists() { - String baseUrl = this.config.getBaseUrl(); - - HttpRequest request = HttpRequest.newBuilder(URI.create(baseUrl)) - .GET() - .build(); - - HttpClient client = HttpClient.newBuilder() - .followRedirects(Redirect.ALWAYS) - .build(); - - try { - HttpResponse response = client.send(request, BodyHandlers.discarding()); - return response.statusCode() < 300; - } catch (Exception e) { - return false; - } - } } diff --git a/src/test/java/com/inteligr8/alfresco/activiti/ConditionalIT.java b/src/test/java/com/inteligr8/alfresco/activiti/ConditionalIT.java new file mode 100644 index 0000000..8c54b7b --- /dev/null +++ b/src/test/java/com/inteligr8/alfresco/activiti/ConditionalIT.java @@ -0,0 +1,39 @@ +package com.inteligr8.alfresco.activiti; + +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 org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestPropertySource; + +@TestPropertySource(locations = {"/local.properties"}) +@ContextConfiguration(classes = {ApsClientConfiguration.class, ApsClient.class}) +public class ConditionalIT { + + @Autowired + private ApsClient client; + + public boolean hostExists() { + String uri = this.client.getConfig().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/activiti/ConnectionClientUnitTest.java b/src/test/java/com/inteligr8/alfresco/activiti/ConnectionClientUnitTest.java deleted file mode 100644 index 0c20b65..0000000 --- a/src/test/java/com/inteligr8/alfresco/activiti/ConnectionClientUnitTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.inteligr8.alfresco.activiti; - -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpClient.Redirect; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.net.http.HttpResponse.BodyHandlers; - -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.test.context.TestPropertySource; -import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; - -import com.inteligr8.alfresco.activiti.model.AppVersion; -import com.inteligr8.alfresco.activiti.model.User; - -@TestPropertySource(locations = {"/local.properties"}) -@SpringJUnitConfig(classes = {ApsClientConfiguration.class, ApsClient.class}) -public class ConnectionClientUnitTest { - - @Autowired - private ApsClient client; - - @Autowired - private ApsClientConfiguration config; - - @Test - @EnabledIf("hostExists") - public void testAppVersion() { - AppVersion obj = this.client - .getEnterpriseAPI() - .getAppVersionAPI() - .get(); - - Assertions.assertNotNull(obj); - Assertions.assertEquals("1", obj.getMajorVersion()); - Assertions.assertEquals("bpmSuite", obj.getType()); - } - - @Test - @EnabledIf("hostExists") - public void testProfile() { - User obj = this.client - .getEnterpriseAPI() - .getProfileAPI() - .get(); - - Assertions.assertNotNull(obj); - Assertions.assertEquals("admin@app.activiti.com", obj.getEmail()); - } - - public boolean hostExists() { - String baseUrl = this.config.getBaseUrl(); - - HttpRequest request = HttpRequest.newBuilder(URI.create(baseUrl)) - .GET() - .build(); - - HttpClient client = HttpClient.newBuilder() - .followRedirects(Redirect.ALWAYS) - .build(); - - try { - HttpResponse response = client.send(request, BodyHandlers.discarding()); - return response.statusCode() < 300; - } catch (Exception e) { - return false; - } - } - -} diff --git a/src/test/java/com/inteligr8/alfresco/activiti/ConnectionCxfClientIT.java b/src/test/java/com/inteligr8/alfresco/activiti/ConnectionCxfClientIT.java new file mode 100644 index 0000000..1586eb8 --- /dev/null +++ b/src/test/java/com/inteligr8/alfresco/activiti/ConnectionCxfClientIT.java @@ -0,0 +1,40 @@ +package com.inteligr8.alfresco.activiti; + +import org.junit.jupiter.api.Assertions; +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.activiti.model.AppVersion; +import com.inteligr8.alfresco.activiti.model.User; + +@TestPropertySource(locations = {"/local.properties"}) +@SpringJUnitConfig(classes = {ApsClientConfiguration.class, ApsClient.class, ApsClientCxfImpl.class}) +public class ConnectionCxfClientIT { + + @Autowired + @Qualifier("apsClient.cxf") + private ApsClient client; + + @Test + //@EnabledIf("hostExists") + public void testAppVersion() { + AppVersion obj = this.client.getAppVersionApi().get(); + + Assertions.assertNotNull(obj); + Assertions.assertEquals("1", obj.getMajorVersion()); + Assertions.assertEquals("bpmSuite", obj.getType()); + } + + @Test + //@EnabledIf("hostExists") + public void testProfile() { + User obj = this.client.getProfileApi().get(); + + Assertions.assertNotNull(obj); + Assertions.assertEquals("admin@app.activiti.com", obj.getEmail()); + } + +} diff --git a/src/test/java/com/inteligr8/alfresco/activiti/ConnectionJerseyClientIT.java b/src/test/java/com/inteligr8/alfresco/activiti/ConnectionJerseyClientIT.java new file mode 100644 index 0000000..6115986 --- /dev/null +++ b/src/test/java/com/inteligr8/alfresco/activiti/ConnectionJerseyClientIT.java @@ -0,0 +1,40 @@ +package com.inteligr8.alfresco.activiti; + +import org.junit.jupiter.api.Assertions; +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.activiti.model.AppVersion; +import com.inteligr8.alfresco.activiti.model.User; + +@TestPropertySource(locations = {"/local.properties"}) +@SpringJUnitConfig(classes = {ApsClientConfiguration.class, ApsClient.class, ApsClientJerseyImpl.class}) +public class ConnectionJerseyClientIT { + + @Autowired + @Qualifier("apsClient.jersey") + private ApsClient client; + + @Test + //@EnabledIf("hostExists") + public void testAppVersion() { + AppVersion obj = this.client.getAppVersionApi().get(); + + Assertions.assertNotNull(obj); + Assertions.assertEquals("1", obj.getMajorVersion()); + Assertions.assertEquals("bpmSuite", obj.getType()); + } + + @Test + //@EnabledIf("hostExists") + public void testProfile() { + User obj = this.client.getProfileApi().get(); + + Assertions.assertNotNull(obj); + Assertions.assertEquals("admin@app.activiti.com", obj.getEmail()); + } + +}