Commit 093936aa authored by Brian Long's avatar Brian Long
Browse files

Merge branch 'develop' into develop-jersey

parents 3f34ddb5 52cffffa
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -43,9 +43,9 @@
		<maven.compiler.source>11</maven.compiler.source>
		<maven.compiler.target>11</maven.compiler.target>

		<junit.version>5.10.0</junit.version>
		<spring.version>6.0.19</spring.version>
		<jackson.version>2.17.2</jackson.version>
		<junit.version>5.12.0</junit.version>
		<spring.version>6.0.23</spring.version>
		<jackson.version>2.17.3</jackson.version>
		<jersey.version>3.1.8</jersey.version>
	</properties>

@@ -78,12 +78,12 @@
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>3.14.0</version>
			<version>3.17.0</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>2.0.13</version>
			<version>2.0.17</version>
		</dependency>
		<dependency>
			<groupId>jakarta.ws.rs</groupId>
@@ -168,7 +168,7 @@
			</plugin>
			<plugin>
				<artifactId>maven-surefire-plugin</artifactId>
				<version>3.1.0</version>
				<version>3.4.0</version>
				<dependencies>
					<dependency>
						<groupId>org.junit.jupiter</groupId>
@@ -179,7 +179,7 @@
			</plugin>
			<plugin>
				<artifactId>maven-failsafe-plugin</artifactId>
				<version>3.1.0</version>
				<version>3.4.0</version>
				<dependencies>
					<dependency>
						<groupId>org.junit.jupiter</groupId>
@@ -235,7 +235,7 @@
					<plugin>
						<groupId>org.sonatype.plugins</groupId>
						<artifactId>nexus-staging-maven-plugin</artifactId>
						<version>1.6.13</version>
						<version>1.6.14</version>
						<configuration>
							<serverId>ossrh</serverId>
							<nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
+2 −0
Original line number Diff line number Diff line
@@ -34,6 +34,8 @@ public class BasicAuthorizationFilter implements AuthorizationFilter {
	private final String password;
	
	/**
	 * This constructor instantiates the filter with required fields.
	 * 
	 * @param username A username or access key.
	 * @param password A password or secret key.
	 */
+2 −0
Original line number Diff line number Diff line
@@ -32,6 +32,8 @@ public class BearerTokenAuthorizationFilter implements AuthorizationFilter {
	private final String token;
	
	/**
	 * This constructor instantiates the filter with required fields.
	 * 
	 * @param token A 'Bearer' token.
	 */
	public BearerTokenAuthorizationFilter(String token) {
+30 −13
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.jakarta.rs.json.JacksonJsonProvider;

/**
 * A class that provides pre-configured JAX-RS Client &amp; WebTarget objects.
 * A class that provides pre-configured Jakarta RS Client &amp; WebTarget objects.
 * 
 * @author brian@inteligr8.com
 */
@@ -36,12 +36,17 @@ public abstract class Client {
	private jakarta.ws.rs.client.Client client;
	
	/**
	 * This method retrieves the configuration for the client.
	 * 
	 * @return The client configuration.
	 */
	public abstract ClientConfiguration getConfig();
	
	/**
	 * @return A pre-configured JAX-RS client (no URL) with configured authorization.
	 * This method retrieves an anonymous cached instance of the underlying
	 * Jakarta RS client.
	 * 
	 * @return A pre-configured Jakarta RS client (no URL) with configured authorization.
	 */
	public final jakarta.ws.rs.client.Client getClient() {
		synchronized (this.sync) {
@@ -53,8 +58,11 @@ public abstract class Client {
	}
	
	/**
	 * This method retrieves either an anonymous cached instance or builds an
	 * authorized instance of the underlying Jakarta RS client.
	 * 
	 * @param authFilter A dynamic authorization filter.
	 * @return A pre-configured JAX-RS client (no URL) with the specified authorization.
	 * @return A pre-configured Jakarta RS client (no URL) with the specified authorization.
	 */
	public jakarta.ws.rs.client.Client getClient(AuthorizationFilter authFilter) {
		if (authFilter == null) {
@@ -65,8 +73,10 @@ public abstract class Client {
	}
	
	/**
	 * This method builds a new Jakarta RS client with optional authorization.
	 * 
	 * @param authFilter A dynamic authorization filter.
	 * @return A pre-configured JAX-RS client (no URL) with the specified authorization.
	 * @return A pre-configured Jakarta RS client (no URL) with the specified authorization.
	 */
	public final jakarta.ws.rs.client.Client buildClient(AuthorizationFilter authFilter) {
	    ObjectMapper om = new ObjectMapper();
@@ -101,14 +111,19 @@ public abstract class Client {
	}
    
    /**
     * @param clientBuilder A client builder
	 * This method allows sub-classes to extend the Jakarta RS client builder
	 * before the client is built.
	 * 
     * @param clientBuilder A Jakarta RS client builder.
     */
    public void buildClient(ClientBuilder clientBuilder) {
        // for extension purposes
    }

	/**
	 * @return A pre-configured JAX-RS target (client w/ base URL) with configured authorization.
	 * This method builds an anonymous Jakarta RS target.
	 * 
	 * @return A pre-configured Jakarta RS target (client w/ base URL) with configured authorization.
	 */
	public final WebTarget getTarget() {
		return this.getClient()
@@ -116,8 +131,10 @@ public abstract class Client {
	}

	/**
	 * This method builds an authorized Jakarta RS target.
	 * 
	 * @param authFilter A dynamic authorization filter.
	 * @return A pre-configured JAX-RS target (client w/ base URL) with the specified authorization.
	 * @return A pre-configured Jakarta RS target (client w/ base URL) with the specified authorization.
	 */
	public WebTarget getTarget(AuthorizationFilter authFilter) {
		if (authFilter == null) {
@@ -129,10 +146,10 @@ public abstract class Client {
	}
	
	/**
	 * This method retrieves a JAX-RS implementation of the specified API.
	 * This method retrieves a Jakarta RS implementation of the specified API.
	 * 
	 * @param <T> A JAX-RS annotated API class.
	 * @param apiClass A JAX-RS annotated API class.
	 * @param <T> A Jakarta RS annotated API class.
	 * @param apiClass A Jakarta RS annotated API class.
	 * @return An instance of the API class.
	 */
	public final <T> T getApi(Class<T> apiClass) {
@@ -140,12 +157,12 @@ public abstract class Client {
	}

	/**
	 * This method retrieves a JAX-RS implementation of the specified API with
	 * This method retrieves a Jakarta RS implementation of the specified API with
	 * the specified authorization.
	 * 
	 * @param <T> A JAX-RS annotated API class.
	 * @param <T> A Jakarta RS annotated API class.
	 * @param authFilter A dynamic authorization filter.
	 * @param apiClass A JAX-RS annotated API class.
	 * @param apiClass A Jakarta RS annotated API class.
	 * @return An instance of the API class.
	 */
	public abstract <T> T getApi(AuthorizationFilter authFilter, Class<T> apiClass);
+76 −17
Original line number Diff line number Diff line
@@ -30,89 +30,127 @@ import jakarta.ws.rs.client.ClientBuilder;
public interface ClientConfiguration {
	
	/**
	 * @return The base or root URL of the service.
	 * This method retrieves the base/root URL of the client service.
	 * 
	 * @return The URL.
	 */
	String getBaseUrl();
	
	/**
	 * @return The username for BASIC authentication.
	 * This method retrieves the username to use in HTTP BASIC authentication/authorization.
	 * 
	 * @return A username.
	 */
	default String getBasicAuthUsername() {
		return null;
	}

	/**
	 * @return The corresponding password for the username in BASIC authentication.
	 * This method retrieves the password to use in HTTP BASIC authentication/authorization.
	 * 
	 * @return The corresponding password for the username.
	 */
	default String getBasicAuthPassword() {
		return null;
	}
	
	/**
	 * @return The client ID for Client Enforcement authentication.
	 * This method retrieves the client identifier to use in Client Enforcement authorization.
	 * 
	 * @return A client identifier.
	 */
	default String getClientId() {
		return null;
	}

	/**
	 * @return The corresponding client secret for the client ID in Client Enforcement authentication.
	 * This method retrieves the client secret to use in Client Enforcement authorization.
	 * 
	 * @return The corresponding client secret for the client identifier.
	 */
	default String getClientSecret() {
		return null;
	}
	
	/**
	 * @return The token for BEARER authorization.
	 * This method retrieves the token to use in HTTP BEARER authorization.
	 * This is provided in a response to the token URL.
	 * 
	 * @return An access token.
	 */
	default String getBearerToken() {
		return null;
	}
	
	/**
	 * @return The token URL for OAuth authorization.
	 * This method retrieves the token URL to use for OAuth authorization.
	 * The value can be pulled from OAuth endpoint well-known meta-data.  That
	 * endpoint or the token URL itself may also be provided OAuth IdP
	 * administrator.
	 * 
	 * @return An OAuth token URL.
	 */
	default String getOAuthTokenUrl() {
		return null;
	}
	
	/**
	 * @return The client ID provided by the OAuth IdP administrator.
	 * This method retrieves the client identifier to use in OAuth
	 * authorization.  This is provided by the OAuth IdP administrator or
	 * tooling.
	 * 
	 * @return A client identifier.
	 */
	default String getOAuthClientId() {
		return this.getClientId();
	}

	/**
	 * @return The corresponding client secret for the client ID provided by the OAuth IdP administrator.
	 * This method retrieves the client secret to use in OAuth authorization.
	 * This is provided by the OAuth IdP administrator or tooling.
	 * 
	 * @return The corresponding client secret for the client identifier.
	 */
	default String getOAuthClientSecret() {
		return this.getClientSecret();
	}
	
	/**
	 * @return The authorization code used in the OAuth Authorization Code flow.
	 * This method retrieves the authorization code to use in OAuth
	 * Authorization Code flow.  This is provided by the OAuth IdP
	 * administrator or tooling.
	 * 
	 * @return An authorization code.
	 */
	default String getOAuthAuthCode() {
		return null;
	}
	
	/**
	 * @return The redirect URL used in the OAuth Authorization Code flow.
	 * This method retrieves the redirect URL to use in OAuth Authorization
	 * Code flow.  This has meaning to the client-side web application.
	 * 
	 * @return A URL for the OAuth flow to redirect to when complete.
	 */
	default String getOAuthAuthRedirectUri() {
		return null;
	}
	
	/**
	 * @return The username used in the OAuth Password Grant flow.
	 * This method retrieves the username to use in OAuth Password Grant flow.
	 * This is provided by the OAuth IdP administrator or tooling.
	 * 
	 * @return A username.
	 */
	default String getOAuthUsername() {
		return null;
	}
	
	/**
	 * @return The corresponding password for the username used in the OAuth Password Grant flow.
	 * This method retrieves the password to use in OAuth Password Grant flow.
	 * This is provided by the OAuth IdP administrator or tooling.
	 * 
	 * @return The corresponding password for the username.
	 */
	default String getOAuthPassword() {
		return null;
@@ -120,10 +158,22 @@ public interface ClientConfiguration {
	
	
	
	/**
	 * This method retrieves the connection (before request sent) timeout for
	 * the client.
	 * 
	 * @return A timeout in milliseconds.
	 */
	default Integer getConnectTimeoutInMillis() {
	    return null;
	}
	
	/**
	 * This method retrieves the response (after request sent) timeout for the
	 * client.
	 * 
	 * @return A timeout in milliseconds.
	 */
	default Integer getResponseTimeoutInMillis() {
	    return null;
	}
@@ -131,27 +181,36 @@ public interface ClientConfiguration {
	

	/**
	 * @return true to enable Jackson UNWRAP_ROOT_VALUE feature; false otherwise.
	 * This method enables/disables the JackSON UNWRAP_ROOT_VALUE feature.
	 * 
	 * @return `true` to enable; `false` otherwise.
	 */
	default boolean isUnwrapRootValueEnabled() {
		return false;
	}

	/**
	 * @return true to enable Jackson WRAP_ROOT_VALUE feature; false otherwise.
	 * This method enables/disables the JackSON WRAP_ROOT_VALUE feature.
	 * 
	 * @return `true` to enable; `false` otherwise.
	 */
	default boolean isWrapRootValueEnabled() {
		return false;
	}
    
    /**
     * @param mapper A Jackson object mapper to configure.
	 * This method allows sub-classes to extend the JackSON mapper
	 * configuration and behavior.
	 * 
     * @param mapper A JackSON object mapper.
     */
    default void configureJacksonMapper(ObjectMapper mapper) {
    }
	
	/**
	 * @param provider A Jackson Jakarta RS provider to configure.
	 * This method allows sub-classes to extend the JackSON JSON provider.
	 * 
	 * @param provider A JackSON Jakarta RS provider.
	 */
	default void configureJacksonProvider(JacksonJsonProvider provider) {
	}
Loading