diff --git a/pom.xml b/pom.xml
index 1c9ee15..c957338 100644
--- a/pom.xml
+++ b/pom.xml
@@ -118,6 +118,19 @@
+
+ maven-javadoc-plugin
+
+
+ javadoc
+ package
+ jar
+
+ public
+
+
+
+
@@ -138,4 +151,4 @@
https://repos.inteligr8.com/nexus/repository/inteligr8-snapshots
-
\ No newline at end of file
+
diff --git a/src/main/java/com/inteligr8/rs/AccessTokenRequestFilter.java b/src/main/java/com/inteligr8/rs/AccessTokenRequestFilter.java
deleted file mode 100644
index d4e5b79..0000000
--- a/src/main/java/com/inteligr8/rs/AccessTokenRequestFilter.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.inteligr8.rs;
-
-import javax.ws.rs.client.ClientRequestContext;
-import javax.ws.rs.core.HttpHeaders;
-
-public class AccessTokenRequestFilter implements AuthorizationFilter {
-
- 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);
- }
-
-}
diff --git a/src/main/java/com/inteligr8/rs/AuthorizationFilter.java b/src/main/java/com/inteligr8/rs/AuthorizationFilter.java
index 258ed47..07f5c90 100755
--- a/src/main/java/com/inteligr8/rs/AuthorizationFilter.java
+++ b/src/main/java/com/inteligr8/rs/AuthorizationFilter.java
@@ -2,6 +2,12 @@ package com.inteligr8.rs;
import javax.ws.rs.client.ClientRequestFilter;
+/**
+ * This is a marker that allows the developer to segregate, restrict, or limit
+ * authorization specific implementations of the ClientRequestFilter.
+ *
+ * @author brian@inteligr8.com
+ */
public interface AuthorizationFilter extends ClientRequestFilter {
}
diff --git a/src/main/java/com/inteligr8/rs/BasicAuthRequestFilter.java b/src/main/java/com/inteligr8/rs/BasicAuthorizationFilter.java
old mode 100644
new mode 100755
similarity index 52%
rename from src/main/java/com/inteligr8/rs/BasicAuthRequestFilter.java
rename to src/main/java/com/inteligr8/rs/BasicAuthorizationFilter.java
index 57ffce8..8a6fcab
--- a/src/main/java/com/inteligr8/rs/BasicAuthRequestFilter.java
+++ b/src/main/java/com/inteligr8/rs/BasicAuthorizationFilter.java
@@ -6,16 +6,32 @@ import java.util.Base64;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.core.HttpHeaders;
-public class BasicAuthRequestFilter implements AuthorizationFilter {
+/**
+ * This class implements a simple 2-credential (username & password) based
+ * authorization filter.
+ *
+ * @author brian@inteligr8.com
+ */
+public class BasicAuthorizationFilter implements AuthorizationFilter {
private final String username;
private final String password;
- public BasicAuthRequestFilter(String username, String password) {
+ /**
+ * @param username A username or access key.
+ * @param password A password or secret key.
+ */
+ public BasicAuthorizationFilter(String username, String password) {
this.username = username;
this.password = password;
}
+ /**
+ * This method applies the 'Authorization' header to the {@link ClientRequestContext}.
+ *
+ * @param requestContext A request context.
+ * @throws UnsupportedEncodingException The 'utf-8' encoding is not supported.
+ */
@Override
public void filter(ClientRequestContext requestContext) throws UnsupportedEncodingException {
String userAndPass = this.username + ":" + this.password;
diff --git a/src/main/java/com/inteligr8/rs/BearerTokenAuthorizationFilter.java b/src/main/java/com/inteligr8/rs/BearerTokenAuthorizationFilter.java
new file mode 100755
index 0000000..fdb666b
--- /dev/null
+++ b/src/main/java/com/inteligr8/rs/BearerTokenAuthorizationFilter.java
@@ -0,0 +1,40 @@
+package com.inteligr8.rs;
+
+import java.io.UnsupportedEncodingException;
+
+import javax.ws.rs.client.ClientRequestContext;
+import javax.ws.rs.core.HttpHeaders;
+
+/**
+ * This class implements a simple long living or proxied token-based
+ * authorization filter. The token is expected to be acquired outside of the
+ * purview of this library.
+ *
+ * If you have the full authorization header and not just the bearer token, use
+ * the {@link ForwardingAuthorizationFilter}.
+ *
+ * @author brian@inteligr8.com
+ */
+public class BearerTokenAuthorizationFilter implements AuthorizationFilter {
+
+ private final String token;
+
+ /**
+ * @param token A 'Bearer' token.
+ */
+ public BearerTokenAuthorizationFilter(String token) {
+ this.token = token;
+ }
+
+ /**
+ * This method applies the 'Authorization' header to the {@link ClientRequestContext}.
+ *
+ * @param requestContext A request context.
+ * @throws UnsupportedEncodingException The 'utf-8' encoding is not supported.
+ */
+ @Override
+ public void filter(ClientRequestContext requestContext) {
+ requestContext.getHeaders().add(HttpHeaders.AUTHORIZATION, "Bearer " + this.token);
+ }
+
+}
diff --git a/src/main/java/com/inteligr8/rs/Client.java b/src/main/java/com/inteligr8/rs/Client.java
index b0b4b64..5483c72 100644
--- a/src/main/java/com/inteligr8/rs/Client.java
+++ b/src/main/java/com/inteligr8/rs/Client.java
@@ -6,16 +6,25 @@ import javax.ws.rs.client.WebTarget;
import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
/**
- * Configured JAX-RS Client & WebTarget
+ * A class that provides pre-configured JAX-RS Client & WebTarget objects.
+ *
+ * @author brian@inteligr8.com
*/
public abstract class Client {
protected abstract ClientConfiguration getConfig();
+ /**
+ * @return A pre-configured JAX-RS client (no URL) with configured authorization.
+ */
public final javax.ws.rs.client.Client getClient() {
return this.getClient(null);
}
+ /**
+ * @param authFilter A dynamic authorization filter.
+ * @return A pre-configured JAX-RS client (no URL) with the specified authorization.
+ */
public javax.ws.rs.client.Client getClient(AuthorizationFilter authFilter) {
ClientBuilder clientBuilder = ClientBuilder.newBuilder()
.register(new JacksonJaxbJsonProvider());
@@ -28,19 +37,40 @@ public abstract class Client {
return clientBuilder.build();
}
+ /**
+ * @return A pre-configured JAX-RS target (client w/ base URL) with configured authorization.
+ */
public final WebTarget getTarget() {
return this.getTarget(null);
}
+ /**
+ * @param authFilter A dynamic authorization filter.
+ * @return A pre-configured JAX-RS target (client w/ base URL) with the specified authorization.
+ */
public WebTarget getTarget(AuthorizationFilter authFilter) {
return this.getClient(authFilter)
.target(this.getConfig().getBaseUrl());
}
+ /**
+ * This method retrieves a JAX-RS implementation of the specified API.
+ *
+ * @param apiClass A JAX-RS annotation API class.
+ * @return An instance of the API class.
+ */
public final T getApi(Class apiClass) {
return this.getApi(null, apiClass);
}
-
+
+ /**
+ * This method retrieves a JAX-RS implementation of the specified API with
+ * the specified authorization.
+ *
+ * @param authFilter A dynamic authorization filter.
+ * @param apiClass A JAX-RS annotation API class.
+ * @return An instance of the API class.
+ */
public abstract T getApi(AuthorizationFilter authFilter, Class apiClass);
}
diff --git a/src/main/java/com/inteligr8/rs/ClientConfiguration.java b/src/main/java/com/inteligr8/rs/ClientConfiguration.java
index 1987e2b..af36a80 100644
--- a/src/main/java/com/inteligr8/rs/ClientConfiguration.java
+++ b/src/main/java/com/inteligr8/rs/ClientConfiguration.java
@@ -2,48 +2,101 @@ package com.inteligr8.rs;
import java.net.URI;
+/**
+ * This interface defines the configurable parameters of the clients; primarily
+ * their default authentication and authorization.
+ *
+ * @author brian@inteligr8.com
+ */
public interface ClientConfiguration {
+ /**
+ * @return The base or root URL of the service.
+ */
String getBaseUrl();
+ /**
+ * @return The username for BASIC authentication.
+ */
String getBasicAuthUsername();
-
+
+ /**
+ * @return The corresponding password for the username in BASIC authentication.
+ */
String getBasicAuthPassword();
- String getAccessToken();
+ /**
+ * @return The token for BEARER authorization.
+ */
+ String getBearerToken();
+ /**
+ * @return The token URL for OAuth authorization.
+ */
String getOAuthTokenUrl();
+ /**
+ * @return The client ID provided by the OAuth IdP administrator.
+ */
String getOAuthClientId();
-
+
+ /**
+ * @return The corresponding client secret for the client ID provided by the OAuth IdP administrator.
+ */
String getOAuthClientSecret();
+ /**
+ * @return The authorization code used in the OAuth Authorization Code flow.
+ */
String getOAuthAuthCode();
+ /**
+ * @return The redirect URL used in the OAuth Authorization Code flow.
+ */
String getOAuthAuthRedirectUri();
+ /**
+ * @return The username used in the OAuth Password Grant flow.
+ */
String getOAuthUsername();
+ /**
+ * @return The corresponding password for the username used in the OAuth Password Grant flow.
+ */
String getOAuthPassword();
+ /**
+ * This method creates an authorization filter based on the configuration
+ * available. A configuration element is considered to not be available
+ * when its value is null. If multiple configurations are specified, the
+ * filter is selected with the following precedence.
+ *
+ * - Bearer
+ * - OAuth Authorization Code
+ * - OAuth Password Grant
+ * - OAuth Client Credential
+ * - Basic
+ *
+ * @return An authorization filter; may be null
+ */
default AuthorizationFilter createAuthorizationFilter() {
- if (this.getAccessToken() != null) {
- return new AccessTokenRequestFilter(this.getAccessToken());
+ if (this.getBearerToken() != null) {
+ return new BearerTokenAuthorizationFilter(this.getBearerToken());
} else if (this.getOAuthTokenUrl() != null) {
if (this.getOAuthAuthCode() != null) {
- return new OAuthAuthorizationCodeRequestFilter(this.getOAuthTokenUrl(),
+ return new OAuthAuthorizationCodeAuthorizationFilter(this.getOAuthTokenUrl(),
this.getOAuthClientId(), this.getOAuthClientSecret(),
this.getOAuthAuthCode(), URI.create(this.getOAuthAuthRedirectUri()));
} else if (this.getOAuthUsername() != null) {
- return new OAuthPasswordGrantRequestFilter(this.getOAuthTokenUrl(),
+ return new OAuthPasswordGrantAuthorizationFilter(this.getOAuthTokenUrl(),
this.getOAuthClientId(), this.getOAuthClientSecret(),
this.getOAuthUsername(), this.getOAuthPassword());
} else {
- return new OAuthClientCredentialRequestFilter(this.getOAuthTokenUrl(),
+ return new OAuthClientCredentialAuthorizationFilter(this.getOAuthTokenUrl(),
this.getOAuthClientId(), this.getOAuthClientSecret());
}
} else if (this.getBasicAuthUsername() != null) {
- return new BasicAuthRequestFilter(this.getBasicAuthUsername(), this.getBasicAuthPassword());
+ return new BasicAuthorizationFilter(this.getBasicAuthUsername(), this.getBasicAuthPassword());
} else {
return null;
}
diff --git a/src/main/java/com/inteligr8/rs/ClientCxfConfiguration.java b/src/main/java/com/inteligr8/rs/ClientCxfConfiguration.java
index 57836a5..292c31b 100644
--- a/src/main/java/com/inteligr8/rs/ClientCxfConfiguration.java
+++ b/src/main/java/com/inteligr8/rs/ClientCxfConfiguration.java
@@ -1,7 +1,22 @@
package com.inteligr8.rs;
+/**
+ * This interface defines additional configurations specific to the Apache CXF
+ * JAX-RS library and its nuances.
+ *
+ * @author brian@inteligr8.com
+ */
public interface ClientCxfConfiguration extends ClientConfiguration {
+ /**
+ * Apache CXF uses a global bus configuration where interceptors could
+ * wreck havoc on your implementation. This method allows you to
+ * explicitly by-pass the default bus.
+ *
+ * @see https://cxf.apache.org/docs/bus-configuration.html
+ *
+ * @return true to use the default bus; false otherwise.
+ */
default boolean isDefaultBusEnabled() {
return true;
}
diff --git a/src/main/java/com/inteligr8/rs/ClientCxfImpl.java b/src/main/java/com/inteligr8/rs/ClientCxfImpl.java
index 0aecdc1..57871b0 100644
--- a/src/main/java/com/inteligr8/rs/ClientCxfImpl.java
+++ b/src/main/java/com/inteligr8/rs/ClientCxfImpl.java
@@ -16,7 +16,10 @@ import org.springframework.beans.factory.InitializingBean;
import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
/**
- * Configured JAX-RS Client & WebTarget & CXF WebClient for CXF
+ * A class that provides pre-configured JAX-RS Client & WebTarget &
+ * CXF WebClient objects.
+ *
+ * @author brian@inteligr8.com
*/
public abstract class ClientCxfImpl extends Client implements InitializingBean {
@@ -27,6 +30,14 @@ public abstract class ClientCxfImpl extends Client implements InitializingBean {
@Override
public void afterPropertiesSet() {
+ this.register();
+ }
+
+ /**
+ * This method registers the Apache CXF library as the default provider for
+ * the JAX-RS specification.
+ */
+ public void register() {
if (RuntimeDelegate.getInstance() == null) {
this.logger.info("Setting JAX-RS runtime delegate to the CXF library");
RuntimeDelegate.setInstance(new RuntimeDelegateImpl());
@@ -41,10 +52,17 @@ public abstract class ClientCxfImpl extends Client implements InitializingBean {
this.logger.info("API Base URL: " + this.getConfig().getBaseUrl());
}
+ /**
+ * @return A CXF client (not JAX-RS).
+ */
public WebClient getCxfClient() {
return this.getCxfClient(null);
}
+ /**
+ * @param authFilter A post-configuration authorization filter.
+ * @return A CXF client (not JAX-RS).
+ */
public WebClient getCxfClient(AuthorizationFilter authFilter) {
List