Commit 432f24c9 authored by Brian Long's avatar Brian Long
Browse files

refactored to support both jersey/cxf

parent faa3d499
Loading
Loading
Loading
Loading
+18 −6
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
		<junit.version>5.7.2</junit.version>
		<spring.version>5.2.14.RELEASE</spring.version>
		<jersey.version>2.34</jersey.version>
		<cxf.version>3.3.2</cxf.version>
	</properties>

	<dependencies>
@@ -49,11 +50,28 @@
			<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>jakarta.ws.rs</groupId>
			<artifactId>jakarta.ws.rs-api</artifactId>
			<version>2.1.6</version>
		</dependency>
		<dependency>
			<groupId>org.glassfish.jersey.ext</groupId>
			<artifactId>jersey-proxy-client</artifactId>
			<version>${jersey.version}</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-rs-client</artifactId>
			<version>${cxf.version}</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.glassfish.jersey.core</groupId>
			<artifactId>jersey-client</artifactId>
@@ -72,12 +90,6 @@
			<version>${jersey.version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.glassfish.jersey.ext</groupId>
			<artifactId>jersey-proxy-client</artifactId>
			<version>${jersey.version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.junit.jupiter</groupId>
			<artifactId>junit-jupiter-api</artifactId>
+143 −7
Original line number Diff line number Diff line
@@ -2,29 +2,61 @@ package com.inteligr8.alfresco.acs;

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.core.util.JacksonFeature;
import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
import com.inteligr8.alfresco.acs.api.ActionsApi;
import com.inteligr8.alfresco.acs.api.ActivitiesApi;
import com.inteligr8.alfresco.acs.api.AspectsApi;
import com.inteligr8.alfresco.acs.api.AuditApi;
import com.inteligr8.alfresco.acs.api.AuthenticationApi;
import com.inteligr8.alfresco.acs.api.CommentsApi;
import com.inteligr8.alfresco.acs.api.DiscoveryApi;
import com.inteligr8.alfresco.acs.api.DownloadsApi;
import com.inteligr8.alfresco.acs.api.FavoritesApi;
import com.inteligr8.alfresco.acs.api.GroupsApi;
import com.inteligr8.alfresco.acs.api.NetworksApi;
import com.inteligr8.alfresco.acs.api.NodesApi;
import com.inteligr8.alfresco.acs.api.PeopleApi;
import com.inteligr8.alfresco.acs.api.PreferencesApi;
import com.inteligr8.alfresco.acs.api.ProbesApi;
import com.inteligr8.alfresco.acs.api.QueriesApi;
import com.inteligr8.alfresco.acs.api.RatingsApi;
import com.inteligr8.alfresco.acs.api.RenditionsApi;
import com.inteligr8.alfresco.acs.api.SearchApi;
import com.inteligr8.alfresco.acs.api.SharedLinksApi;
import com.inteligr8.alfresco.acs.api.SitesApi;
import com.inteligr8.alfresco.acs.api.TagsApi;
import com.inteligr8.alfresco.acs.api.TrashcanApi;
import com.inteligr8.alfresco.acs.api.TypesApi;
import com.inteligr8.alfresco.acs.api.VersionsApi;

/**
 * Afresco Content Services Spring Client
 */
@Component
@Component("acsClient")
public class AcsClient {
	
	@Autowired
	private AcsClientConfiguration config;
	
	protected AcsClientConfiguration getConfig() {
		return this.config;
	}
	
	public Client getClient() {
		Client client = ClientBuilder.newBuilder()
				.register(JacksonFeature.class)
				.build();
		ClientRequestFilter authFilter = this.config.getAuthorizationFilter();
		
		this.config.authorize(client);
		return client;
		ClientBuilder clientBuilder = ClientBuilder.newBuilder()
				.register(new JacksonJaxbJsonProvider());
		if (authFilter != null)
			clientBuilder.register(authFilter);
		
		return clientBuilder.build();
	}

	public WebTarget getTarget() {
@@ -32,4 +64,108 @@ public class AcsClient {
				.target(this.config.getBaseUrl());
	}
	
	protected <T> T getApi(Class<T> apiClass) {
		throw new UnsupportedOperationException();
	}
	
	public ActionsApi getActionsApi() {
		return this.getApi(ActionsApi.class);
	}
	
	public ActivitiesApi getActivitiesApi() {
		return this.getApi(ActivitiesApi.class);
	}
	
	public AspectsApi getAspectsApi() {
		return this.getApi(AspectsApi.class);
	}
	
	public AuditApi getAuditApi() {
		return this.getApi(AuditApi.class);
	}
	
	public AuthenticationApi getAuthenticationApi() {
		return this.getApi(AuthenticationApi.class);
	}
	
	public CommentsApi getCommentsApi() {
		return this.getApi(CommentsApi.class);
	}
	
	public DiscoveryApi getDiscoveryApi() {
		return this.getApi(DiscoveryApi.class);
	}
	
	public DownloadsApi getDownloadsApi() {
		return this.getApi(DownloadsApi.class);
	}
	
	public FavoritesApi getFavoritesApi() {
		return this.getApi(FavoritesApi.class);
	}
	
	public GroupsApi getGroupsApi() {
		return this.getApi(GroupsApi.class);
	}
	
	public NetworksApi getNetworksApi() {
		return this.getApi(NetworksApi.class);
	}
	
	public NodesApi getNodesApi() {
		return this.getApi(NodesApi.class);
	}
	
	public PeopleApi getPeopleApi() {
		return this.getApi(PeopleApi.class);
	}
	
	public PreferencesApi getPreferencesApi() {
		return this.getApi(PreferencesApi.class);
	}
	
	public ProbesApi getProbesApi() {
		return this.getApi(ProbesApi.class);
	}
	
	public QueriesApi getQueriesApi() {
		return this.getApi(QueriesApi.class);
	}
	
	public RatingsApi getRatingsApi() {
		return this.getApi(RatingsApi.class);
	}
	
	public RenditionsApi getRenditionsApi() {
		return this.getApi(RenditionsApi.class);
	}
	
	public SearchApi getSearchApi() {
		return this.getApi(SearchApi.class);
	}
	
	public SharedLinksApi getSharedLinksApi() {
		return this.getApi(SharedLinksApi.class);
	}
	
	public SitesApi getSitesApi() {
		return this.getApi(SitesApi.class);
	}
	
	public TagsApi getTagsApi() {
		return this.getApi(TagsApi.class);
	}
	
	public TrashcanApi getTrashcanApi() {
		return this.getApi(TrashcanApi.class);
	}
	
	public TypesApi getTypesApi() {
		return this.getApi(TypesApi.class);
	}
	
	public VersionsApi getVersionsApi() {
		return this.getApi(VersionsApi.class);
	}

}
+7 −5
Original line number Diff line number Diff line
package com.inteligr8.alfresco.acs;

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;
@@ -19,18 +19,20 @@ public class AcsClientConfiguration {
	@Value("${content.service.security.basicAuth.password:admin}")
	private String basicAuthPassword;

	@Value("${content.service.security.accessToken}")
	@Value("${content.service.security.accessToken:#{null}}")
	private String accessToken;
	
	public String getBaseUrl() {
		return this.baseUrl;
	}

	public void authorize(Client client) {
	public ClientRequestFilter getAuthorizationFilter() {
		if (this.accessToken != null) {
			client.register(new AccessTokenRequestFilter(this.accessToken));
			return new AccessTokenRequestFilter(this.accessToken);
		} else if (this.basicAuthUsername != null) {
			client.register(new BasicAuthRequestFilter(this.basicAuthUsername, this.basicAuthPassword));
			return new BasicAuthRequestFilter(this.basicAuthUsername, this.basicAuthPassword);
		} else {
			return null;
		}
	}

+58 −0
Original line number Diff line number Diff line
package com.inteligr8.alfresco.acs;

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;

/**
 * Afresco Content Services Spring Client for Jersey
 */
@Component("acsClient.cxf")
@Lazy
public class AcsClientCxfImpl extends AcsClient implements InitializingBean {
	
	private final Logger logger = LoggerFactory.getLogger(AcsClientCxfImpl.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<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);
	}

}
+40 −0
Original line number Diff line number Diff line
package com.inteligr8.alfresco.acs;

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;

/**
 * Afresco Content Services Spring Client for Jersey
 */
@Component("acsClient.jersey")
@Lazy
public class AcsClientJerseyImpl extends AcsClient implements InitializingBean {
	
	private final Logger logger = LoggerFactory.getLogger(AcsClientJerseyImpl.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> T getApi(Class<T> apiClass) {
		return WebResourceFactory.newResource(apiClass, this.getTarget());
	}

}
Loading