Merge branch 'develop' into stable

This commit is contained in:
Brian Long 2021-06-16 16:02:42 -04:00
commit 8c31f098d4
14 changed files with 228 additions and 245 deletions

26
pom.xml
View File

@ -24,29 +24,9 @@
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.12.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.29</version>
</dependency>
<dependency>
<groupId>jakarta.ws.rs</groupId>
<artifactId>jakarta.ws.rs-api</artifactId>
<version>2.1.6</version>
<groupId>com.inteligr8</groupId>
<artifactId>common-rest-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>

View File

@ -1,20 +0,0 @@
package com.inteligr8.alfresco.activiti;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.core.HttpHeaders;
public class AccessTokenRequestFilter implements ClientRequestFilter {
private final String token;
public AccessTokenRequestFilter(String token) {
this.token = token;
}
@Override
public void filter(ClientRequestContext requestContext) {
requestContext.getHeaders().add(HttpHeaders.AUTHORIZATION, "Bearer " + this.token);
}
}

View File

@ -1,71 +0,0 @@
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.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;
/**
* Alfresco Process Services Spring Client
*/
@Component("apsClient")
public class ApsClient {
@Autowired
private ApsClientConfiguration config;
protected ApsClientConfiguration getConfig() {
return this.config;
}
public Client getClient() {
ClientRequestFilter authFilter = this.config.getAuthorizationFilter();
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> T getApi(Class<T> 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);
}
}

View File

@ -1,14 +1,14 @@
package com.inteligr8.alfresco.activiti;
import javax.ws.rs.client.ClientRequestFilter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import com.inteligr8.rs.ClientConfiguration;
@Configuration
@ComponentScan
public class ApsClientConfiguration {
public class ApsClientConfiguration extends ClientConfiguration {
@Value("${process.service.baseUrl:http://localhost:8080/activiti-app}")
private String baseUrl;
@ -21,19 +21,70 @@ public class ApsClientConfiguration {
@Value("${process.service.security.accessToken:#{null}}")
private String accessToken;
@Value("${process.service.security.oauth.tokenUrl:#{null}}")
private String oAuthTokenUrl;
@Value("${process.service.security.oauth.clientId:#{null}}")
private String oAuthClientId;
@Value("${process.service.security.oauth.clientSecret:#{null}}")
private String oAuthClientSecret;
@Value("${process.service.security.oauth.authCode:#{null}}")
private String oAuthAuthCode;
@Value("${process.service.security.oauth.authRedirectUri:#{null}}")
private String oAuthAuthRedirectUri;
@Value("${process.service.security.oauth.grantUsername:#{null}}")
private String oAuthUsername;
@Value("${process.service.security.oauth.grantPassword:#{null}}")
private String oAuthPassword;
public String getBaseUrl() {
return this.baseUrl;
}
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;
}
public String getBasicAuthUsername() {
return this.basicAuthUsername;
}
public String getBasicAuthPassword() {
return this.basicAuthPassword;
}
public String getAccessToken() {
return this.accessToken;
}
public String getOAuthTokenUrl() {
return this.oAuthTokenUrl;
}
public String getOAuthClientId() {
return this.oAuthClientId;
}
public String getOAuthClientSecret() {
return this.oAuthClientSecret;
}
public String getOAuthAuthCode() {
return this.oAuthAuthCode;
}
public String getOAuthAuthRedirectUri() {
return this.oAuthAuthRedirectUri;
}
public String getOAuthUsername() {
return this.oAuthUsername;
}
public String getOAuthPassword() {
return this.oAuthPassword;
}
}

View File

@ -1,58 +1,25 @@
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.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
import com.inteligr8.rs.ClientConfiguration;
import com.inteligr8.rs.ClientCxfImpl;
/**
* Alfresco Process Services Spring Client for CXF
* Configured JAX-RS Client & WebTarget for APS & CXF
*/
@Component("apsClient.cxf")
@Component("aps.client.cxf")
@Lazy
public class ApsClientCxfImpl extends ApsClient implements InitializingBean {
public class ApsClientCxfImpl extends ClientCxfImpl {
private final Logger logger = LoggerFactory.getLogger(ApsClientCxfImpl.class);
@Autowired
private ApsClientConfiguration config;
@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<Object> providersAndFilters = new LinkedList<Object>();
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> T getApi(Class<T> apiClass) {
return JAXRSClientFactory.fromClient(this.getCxfClient(), apiClass);
protected ClientConfiguration getConfig() {
return this.config;
}
}

View File

@ -1,40 +1,25 @@
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.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import com.inteligr8.rs.ClientConfiguration;
import com.inteligr8.rs.ClientJerseyImpl;
/**
* Alfresco Process Services Spring Client for Jersey
* Configured JAX-RS Client & WebTarget for APS & Jersey
*/
@Component("apsClient.jersey")
@Component("aps.client.jersey")
@Lazy
public class ApsClientJerseyImpl extends ApsClient implements InitializingBean {
public class ApsClientJerseyImpl extends ClientJerseyImpl {
private final Logger logger = LoggerFactory.getLogger(ApsClientJerseyImpl.class);
@Autowired
private ApsClientConfiguration config;
@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> T getApi(Class<T> apiClass) {
return WebResourceFactory.newResource(apiClass, this.getTarget());
protected ClientConfiguration getConfig() {
return this.config;
}
}

View File

@ -0,0 +1,39 @@
package com.inteligr8.alfresco.activiti;
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;
import com.inteligr8.rs.ClientConfiguration;
/**
* Alfresco Process Services Spring-ready API
*/
public abstract class ApsPublicRestApi {
protected abstract ClientConfiguration getConfig();
protected abstract <T> T getApi(Class<T> apiClass);
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);
}
}

View File

@ -0,0 +1,29 @@
package com.inteligr8.alfresco.activiti;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import com.inteligr8.rs.ClientConfiguration;
/**
* Alfresco Process Services Spring-ready API for CXF
*/
@Component("aps.api.cxf")
@Lazy
public class ApsPublicRestApiCxfImpl extends ApsPublicRestApi {
@Autowired
private ApsClientCxfImpl client;
@Override
protected ClientConfiguration getConfig() {
return this.client.getConfig();
}
@Override
protected <T> T getApi(Class<T> apiClass) {
return this.client.getApi(apiClass);
}
}

View File

@ -0,0 +1,29 @@
package com.inteligr8.alfresco.activiti;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import com.inteligr8.rs.ClientConfiguration;
/**
* Alfresco Process Services Spring-ready API for Jersey
*/
@Component("aps.api.jersey")
@Lazy
public class ApsPublicRestApiJerseyImpl extends ApsPublicRestApi {
@Autowired
private ApsClientJerseyImpl client;
@Override
protected ClientConfiguration getConfig() {
return this.client.getConfig();
}
@Override
protected <T> T getApi(Class<T> apiClass) {
return this.client.getApi(apiClass);
}
}

View File

@ -1,28 +0,0 @@
package com.inteligr8.alfresco.activiti;
import java.io.UnsupportedEncodingException;
import java.util.Base64;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.core.HttpHeaders;
public class BasicAuthRequestFilter implements ClientRequestFilter {
private final String username;
private final String password;
public BasicAuthRequestFilter(String username, String password) {
this.username = username;
this.password = password;
}
@Override
public void filter(ClientRequestContext requestContext) throws UnsupportedEncodingException {
String userAndPass = this.username + ":" + this.password;
String userAndPassEncoded = Base64.getEncoder().encodeToString(userAndPass.getBytes("utf-8"));
requestContext.getHeaders().add(HttpHeaders.AUTHORIZATION, "Basic " + userAndPassEncoded);
}
}

View File

@ -6,13 +6,25 @@ 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.activiti.model.Tenant;
import com.inteligr8.rs.ClientConfiguration;
@TestPropertySource(locations = {"/local.properties"})
@SpringJUnitConfig(classes = {ApsClientConfiguration.class, ApsPublicRestApiJerseyImpl.class, ApsClientJerseyImpl.class})
public class ArrayResponseUnitTest extends ConditionalIT {
@Autowired
private ApsClient client;
@Qualifier("aps.api.jersey")
private ApsPublicRestApi client;
@Override
public ClientConfiguration getConfiguration() {
return this.client.getConfig();
}
@Test
@EnabledIf("hostExists")

View File

@ -6,19 +6,15 @@ 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 {
import com.inteligr8.rs.ClientConfiguration;
public abstract class ConditionalIT {
@Autowired
private ApsClient client;
public abstract ClientConfiguration getConfiguration();
public boolean hostExists() {
String uri = this.client.getConfig().getBaseUrl();
String uri = this.getConfiguration().getBaseUrl();
HttpUriRequest request = RequestBuilder.get()
.setUri(uri)

View File

@ -2,6 +2,7 @@ package com.inteligr8.alfresco.activiti;
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;
@ -9,17 +10,23 @@ import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import com.inteligr8.alfresco.activiti.model.AppVersion;
import com.inteligr8.alfresco.activiti.model.User;
import com.inteligr8.rs.ClientConfiguration;
@TestPropertySource(locations = {"/local.properties"})
@SpringJUnitConfig(classes = {ApsClientConfiguration.class, ApsClient.class, ApsClientCxfImpl.class})
public class ConnectionCxfClientIT {
@SpringJUnitConfig(classes = {ApsClientConfiguration.class, ApsPublicRestApiCxfImpl.class, ApsClientCxfImpl.class})
public class ConnectionCxfClientIT extends ConditionalIT {
@Autowired
@Qualifier("apsClient.cxf")
private ApsClient client;
@Qualifier("aps.api.cxf")
private ApsPublicRestApi client;
@Override
public ClientConfiguration getConfiguration() {
return this.client.getConfig();
}
@Test
//@EnabledIf("hostExists")
@EnabledIf("hostExists")
public void testAppVersion() {
AppVersion obj = this.client.getAppVersionApi().get();
@ -29,7 +36,7 @@ public class ConnectionCxfClientIT {
}
@Test
//@EnabledIf("hostExists")
@EnabledIf("hostExists")
public void testProfile() {
User obj = this.client.getProfileApi().get();

View File

@ -2,6 +2,7 @@ package com.inteligr8.alfresco.activiti;
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;
@ -9,17 +10,23 @@ import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import com.inteligr8.alfresco.activiti.model.AppVersion;
import com.inteligr8.alfresco.activiti.model.User;
import com.inteligr8.rs.ClientConfiguration;
@TestPropertySource(locations = {"/local.properties"})
@SpringJUnitConfig(classes = {ApsClientConfiguration.class, ApsClient.class, ApsClientJerseyImpl.class})
public class ConnectionJerseyClientIT {
@SpringJUnitConfig(classes = {ApsClientConfiguration.class, ApsPublicRestApiCxfImpl.class, ApsClientJerseyImpl.class})
public class ConnectionJerseyClientIT extends ConditionalIT {
@Autowired
@Qualifier("apsClient.jersey")
private ApsClient client;
@Qualifier("aps.api.jersey")
private ApsPublicRestApi client;
@Override
public ClientConfiguration getConfiguration() {
return this.client.getConfig();
}
@Test
//@EnabledIf("hostExists")
@EnabledIf("hostExists")
public void testAppVersion() {
AppVersion obj = this.client.getAppVersionApi().get();
@ -29,7 +36,7 @@ public class ConnectionJerseyClientIT {
}
@Test
//@EnabledIf("hostExists")
@EnabledIf("hostExists")
public void testProfile() {
User obj = this.client.getProfileApi().get();