http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/a2f7c6bd/geode-core/src/main/java/com/gemstone/gemfire/management/internal/web/shell/AbstractHttpOperationInvoker.java
----------------------------------------------------------------------
diff --git
a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/web/shell/AbstractHttpOperationInvoker.java
b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/web/shell/AbstractHttpOperationInvoker.java
index 944644f..c142cdf 100644
---
a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/web/shell/AbstractHttpOperationInvoker.java
+++
b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/web/shell/AbstractHttpOperationInvoker.java
@@ -50,6 +50,7 @@ import
com.gemstone.gemfire.management.internal.web.http.HttpMethod;
import
com.gemstone.gemfire.management.internal.web.http.converter.SerializableObjectHttpMessageConverter;
import
com.gemstone.gemfire.management.internal.web.shell.support.HttpMBeanProxyFactory;
import com.gemstone.gemfire.management.internal.web.util.UriUtils;
+import com.gemstone.gemfire.security.AuthenticationFailedException;
import com.gemstone.gemfire.security.NotAuthorizedException;
import org.apache.logging.log4j.Logger;
@@ -65,7 +66,6 @@ import org.springframework.web.client.RestTemplate;
/**
* The AbstractHttpOperationInvoker class is an abstract base class
encapsulating common functionality for all
* HTTP-based OperationInvoker implementations.
- *
* @see com.gemstone.gemfire.management.internal.cli.shell.Gfsh
* @see com.gemstone.gemfire.management.internal.cli.shell.OperationInvoker
* @see com.gemstone.gemfire.management.internal.web.shell.HttpOperationInvoker
@@ -118,10 +118,10 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
private final String baseUrl;
- protected Map<String,String> securityProperties;
+ protected Map<String, String> securityProperties;
/**
- * Default, public, no-arg constructor to create an instance of the
AbstractHttpOperationInvoker class
+ * Default, public, no-arg constructor to create an instance of the
AbstractHttpOperationInvoker class
* for testing purposes.
*/
AbstractHttpOperationInvoker(final String baseUrl) {
@@ -134,14 +134,13 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Constructs an instance of the AbstractHttpOperationInvoker class with a
reference to the GemFire shell (Gfsh)
* instance using this HTTP-based OperationInvoker to send commands to the
GemFire Manager via HTTP for processing.
- *
* @param gfsh a reference to the instance of the GemFire shell (Gfsh) using
this HTTP-based OperationInvoker for
* command processing.
* @throws AssertionError if the reference to the Gfsh instance is null.
* @see
#AbstractHttpOperationInvoker(com.gemstone.gemfire.management.internal.cli.shell.Gfsh,
String, Map)
* @see com.gemstone.gemfire.management.internal.cli.shell.Gfsh
*/
- public AbstractHttpOperationInvoker(final Gfsh gfsh, Map<String,String>
securityProperties) {
+ public AbstractHttpOperationInvoker(final Gfsh gfsh, Map<String, String>
securityProperties) {
this(gfsh, REST_API_URL, securityProperties);
}
@@ -149,7 +148,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
* Constructs an instance of the AbstractHttpOperationInvoker class with a
reference to the GemFire shell (Gfsh)
* instance using this HTTP-based OperationInvoker to send commands to the
GemFire Manager via HTTP for procsessing
* along with the base URL to the GemFire Manager's embedded HTTP service
hosting the HTTP (REST) interface.
- *
* @param gfsh a reference to the instance of the GemFire shell (Gfsh) using
this HTTP-based OperationInvoker for
* command processing.
* @param baseUrl a String specifying the base URL to the GemFire Manager's
embedded HTTP service hosting the REST
@@ -157,7 +155,7 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
* @throws AssertionError if the reference to the Gfsh instance is null.
* @see com.gemstone.gemfire.management.internal.cli.shell.Gfsh
*/
- public AbstractHttpOperationInvoker(final Gfsh gfsh, final String baseUrl,
Map<String,String> securityProperties) {
+ public AbstractHttpOperationInvoker(final Gfsh gfsh, final String baseUrl,
Map<String, String> securityProperties) {
assertNotNull(gfsh, "The reference to the GemFire shell (Gfsh) cannot be
null!");
this.gfsh = gfsh;
@@ -213,10 +211,15 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
gfsh.logSevere(body, null);
}
- if(response.getRawStatusCode()==403)
+ if (response.getRawStatusCode() == 401) {
+ throw new AuthenticationFailedException(message);
+ }
+ else if (response.getRawStatusCode() == 403) {
throw new NotAuthorizedException(message);
- else
+ }
+ else {
throw new RuntimeException(message);
+ }
}
private String readBody(final ClientHttpResponse response) throws
IOException {
@@ -244,7 +247,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Asserts the argument is valid, as determined by the caller passing the
result of an evaluated expression to this
* assertion.
- *
* @param validArg a boolean value indicating the evaluation of the
expression validating the argument.
* @param message a String value used as the message when constructing an
IllegalArgumentException.
* @param args Object arguments used to populate placeholder's in the
message.
@@ -259,7 +261,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Asserts the Object reference is not null!
- *
* @param obj the reference to the Object.
* @param message the String value used as the message when constructing and
throwing a NullPointerException.
* @param args Object arguments used to populate placeholder's in the
message.
@@ -274,7 +275,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Asserts whether state, based on the evaluation of a conditional
expression, passed to this assertion is valid.
- *
* @param validState a boolean value indicating the evaluation of the
expression from which the conditional state
* is based. For example, a caller might use an expression of the form
(initableObj.isInitialized()).
* @param message a String values used as the message when constructing an
IllegalStateException.
@@ -290,7 +290,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Gets a list of acceptable content/media types supported by Gfsh.
- *
* @return a List of acceptable content/media types supported by Gfsh.
* @see org.springframework.http.MediaType
*/
@@ -301,7 +300,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Returns the base URL to GemFire's REST interface hosted in the GemFire
Manager's embedded HTTP service
* (Tomcat server).
- *
* @return a String value specifying the base URL to the GemFire REST
interface.
*/
protected String getBaseUrl() {
@@ -310,7 +308,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Determines whether Gfsh is in debug mode (or whether the user enabled
debugging in Gfsh).
- *
* @return a boolean value indicating if debugging has been turned on in
Gfsh.
* @see com.gemstone.gemfire.management.internal.cli.shell.Gfsh#getDebug()
*/
@@ -320,21 +317,19 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Gets the ExecutorService used by this HTTP OperationInvoker to scheduled
periodic or delayed tasks.
- *
* @return an instance of the ScheduledExecutorService for scheduling
periodic or delayed tasks.
* @see java.util.concurrent.ScheduledExecutorService
*/
protected final ScheduledExecutorService getExecutorService() {
assertState(this.executorService != null,
"The ExecutorService for this HTTP OperationInvoker (%1$s) was not
properly initialized!",
- getClass().getName());
+ getClass().getName());
return this.executorService;
}
/**
* Returns the reference to the GemFire shell (Gfsh) instance using this
HTTP-based OperationInvoker to send commands
* to the GemFire Manager for remote execution and processing.
- *
* @return a reference to the instance of the GemFire shell (Gfsh) using
this HTTP-based OperationInvoker to process
* commands.
* @see com.gemstone.gemfire.management.internal.cli.shell.Gfsh
@@ -346,7 +341,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Returns a reference to the Spring RestTemplate used by this HTTP-based
OperationInvoker to send HTTP requests to
* GemFire's REST interface, making REST API calls.
- *
* @return an instance of the Spring RestTemplate used to make REST API web
service calls.
* @see org.springframework.web.client.RestTemplate
*/
@@ -357,7 +351,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Creates an instance of a client HTTP request with the specified Link
targeting the resource as well as the intended
* operation on the resource.
- *
* @param link a Link with the URI targeting and identifying the resource as
well as the method of operation on the
* resource.
* @return a client HTTP request with the details of the request.
@@ -369,10 +362,10 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
request.addHeaderValues(HttpHeader.USER_AGENT.getName(),
USER_AGENT_HTTP_REQUEST_HEADER_VALUE);
request.getHeaders().setAccept(getAcceptableMediaTypes());
- if(this.securityProperties != null){
+ if (this.securityProperties != null) {
Iterator<Entry<String, String>> it =
this.securityProperties.entrySet().iterator();
- while(it.hasNext()){
- Entry<String,String> entry= it.next();
+ while (it.hasNext()) {
+ Entry<String, String> entry = it.next();
request.addHeaderValues(entry.getKey(), entry.getValue());
}
}
@@ -381,7 +374,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Creates a Link with the specified relation and URI of the remote resource.
- *
* @param relation a String indicating the link relation, or relative state
transition, operation.
* @param href the URI identifying the resource and it's location.
* @return a Link with the providing relation and URI.
@@ -394,7 +386,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Creates a Link with the specified relation and URI of the remote resource
along with the method of the operation.
- *
* @param relation a String indicating the link relation, or relative state
transition, operation.
* @param href the URI identifying the resource and it's location.
* @param method the HTTP method for the operation of the request.
@@ -411,7 +402,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
* Decodes the encoded String value using the default encoding UTF-8. It is
assumed the String value was encoded
* with the URLEncoder using the UTF-8 encoding. This method handles
UnsupportedEncodingException by just returning
* the encodedValue.
- *
* @param encodedValue the encoded String value to decode.
* @return the decoded value of the String or encodedValue if the UTF-8
encoding is unsupported.
* @see
com.gemstone.gemfire.management.internal.web.util.UriUtils#decode(String)
@@ -424,7 +414,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
* Decodes the encoded String value using the specified encoding (such as
UTF-8). It is assumed the String value
* was encoded with the URLEncoder using the specified encoding. This
method handles UnsupportedEncodingException
* by just returning the encodedValue.
- *
* @param encodedValue a String value encoded in the encoding.
* @param encoding a String value specifying the encoding.
* @return the decoded value of the String or encodedValue if the specified
encoding is unsupported.
@@ -436,7 +425,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Encode the String value using the default encoding UTF-8.
- *
* @param value the String value to encode.
* @return an encoded value of the String using the default encoding UTF-8
or value if the UTF-8 encoding
* is unsupported.
@@ -448,7 +436,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Encode the String value using the specified encoding (such as UTF-8).
- *
* @param value the String value to encode.
* @param encoding a String value indicating the encoding.
* @return an encoded value of the String using the specified encoding or
value if the specified encoding
@@ -461,7 +448,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Finds a Link containing the HTTP request URI for the relational operation
(state transition) on the resource.
- *
* @param relation a String describing the relational operation, or state
transition on the resource.
* @return an instance of Link containing the HTTP request URI used to
perform the intended operation on the resource.
* @see com.gemstone.gemfire.management.internal.web.domain.Link
@@ -473,7 +459,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Handles resource access errors such as ConnectExceptions when the
server-side process/service is not listening
* for client connections, or the connection to the server/service fails.
- *
* @param e the ResourceAccessException resulting in some sort of I/O error.
* @return a user-friendly String message describing the problem and
appropriate action/response by the user.
* @see #stop()
@@ -483,13 +468,12 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
stop();
return String.format("The connection to the GemFire Manager's HTTP service
@ %1$s failed with: %2$s. "
- + "Please try reconnecting or see the GemFire Manager's log file for
further details.",
+ + "Please try reconnecting or see the GemFire Manager's log file for
further details.",
getBaseUrl(), e.getMessage());
}
/**
* Displays the message inside GemFire shell at debug level.
- *
* @param message the String containing the message to display inside Gfsh.
* @see #isDebugEnabled()
* @see #printInfo(String, Object...)
@@ -502,7 +486,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Displays the message inside GemFire shell at info level.
- *
* @param message the String containing the message to display inside Gfsh.
* @see
com.gemstone.gemfire.management.internal.cli.shell.Gfsh#printAsInfo(String)
*/
@@ -512,7 +495,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Displays the message inside GemFire shell at warning level.
- *
* @param message the String containing the message to display inside Gfsh.
* @see
com.gemstone.gemfire.management.internal.cli.shell.Gfsh#printAsWarning(String)
*/
@@ -522,7 +504,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Displays the message inside GemFire shell at severe level.
- *
* @param message the String containing the message to display inside Gfsh.
* @see
com.gemstone.gemfire.management.internal.cli.shell.Gfsh#printAsSevere(String)
*/
@@ -533,7 +514,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Sends the HTTP request, using Spring's RestTemplate, to the GemFire REST
API web service endpoint, expecting the
* specified response type from the server in return.
- *
* @param <T> the response type.
* @param request the client HTTP request to send.
* @param responseType the expected Class type of the return value in the
server's response.
@@ -549,7 +529,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Sends the HTTP request, using Spring's RestTemplate, to the GemFire REST
API web service endpoint, expecting the
* specified response type from the server in return.
- *
* @param request the client HTTP request to send.
* @param responseType the expected Class type of the return value in the
server's response.
* @param uriVariables a Mapping of URI template path variables to values.
@@ -587,7 +566,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Determines whether this HTTP-based OperationInvoker is successfully
connected to the remote GemFire Manager's
* HTTP service in order to send commands for execution/processing.
- *
* @return a boolean value indicating the connection state of the HTTP-based
OperationInvoker.
*/
@Override
@@ -598,7 +576,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Determines whether this HTTP-based OperationInvoker is ready to send
commands to the GemFire Manager for remote
* execution/processing.
- *
* @return a boolean value indicating whether this HTTP-based
OperationInvoker is ready for command invocations.
* @see #isConnected()
*/
@@ -608,10 +585,10 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
}
// TODO research the use of Jolokia instead
+
/**
* Read the attribute identified by name from a remote resource identified
by name. The intent of this method
* is to return the value of an attribute on an MBean located in the remote
MBeanServer.
- *
* @param resourceName name/url of the remote resource from which to fetch
the attribute value.
* @param attributeName name of the attribute who's value will be fetched.
* @return the value of the named attribute for the named resource
(typically an MBean).
@@ -640,12 +617,12 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
catch (IOException e) {
throw new MBeanAccessException(String.format(
"De-serializing the result of accessing attribute (%1$s) on MBean
(%2$s) failed!",
- resourceName, attributeName), e);
+ resourceName, attributeName), e);
}
catch (ClassNotFoundException e) {
throw new MBeanAccessException(String.format(
"The Class type of the result when accessing attribute (%1$s) on
MBean (%2$s) was not found!",
- resourceName, attributeName), e);
+ resourceName, attributeName), e);
}
}
else {
@@ -657,7 +634,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Gets the identifier of the GemFire cluster.
- *
* @return an integer value indicating the identifier of the GemFire cluster.
* @see #initClusterId()
*/
@@ -681,7 +657,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Gets a proxy to the remote DistributedSystem MXBean to access attributes
and invoke operations on the distributed
* system, or the GemFire cluster.
- *
* @return a proxy instance of the GemFire Manager's DistributedSystem
MXBean.
* @see #getMBeanProxy(javax.management.ObjectName, Class)
* @see com.gemstone.gemfire.management.DistributedSystemMXBean
@@ -693,7 +668,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Gets a proxy to an MXBean on a remote MBeanServer using HTTP for remoting.
- *
* @param <T> the class type of the remote MXBean.
* @param objectName the JMX ObjectName uniquely identifying the remote
MXBean.
* @param mbeanInterface the interface of the remote MXBean to proxy for
attribute/operation access.
@@ -708,7 +682,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
/**
* Invoke an operation identified by name on a remote resource identified by
name with the given arguments.
* The intent of this method is to invoke an arbitrary operation on an MBean
located in the remote MBeanServer.
- *
* @param resourceName name/url (object name) of the remote resource (MBea)
on which operation is to be invoked.
* @param operationName name of the operation to be invoked.
* @param params an array of arguments for the parameters to be set when the
operation is invoked.
@@ -742,12 +715,12 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
catch (IOException e) {
throw new MBeanAccessException(String.format(
"De-serializing the result from invoking operation (%1$s) on MBean
(%2$s) failed!",
- resourceName, operationName), e);
+ resourceName, operationName), e);
}
catch (ClassNotFoundException e) {
throw new MBeanAccessException(String.format(
"The Class type of the result from invoking operation (%1$s) on
MBean (%2$s) was not found!",
- resourceName, operationName), e);
+ resourceName, operationName), e);
}
}
else {
@@ -761,7 +734,6 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
* This method searches the MBean server, based on the OperationsInvoker's
JMX-based or remoting capable MBean server
* connection, for MBeans matching a specific ObjectName or matching an
ObjectName pattern along with satisfying
* criteria from the Query expression.
- *
* @param objectName the ObjectName or pattern for which matching MBeans in
the target MBean server will be returned.
* @param queryExpression the JMX-based query expression used to filter
matching MBeans.
* @return a set of ObjectName's matching MBeans in the MBean server
matching the ObjectName and Query expression
@@ -790,11 +762,12 @@ public abstract class AbstractHttpOperationInvoker
implements HttpOperationInvok
catch (Exception e) {
throw new MBeanAccessException(String.format(
"An error occurred while querying for MBean names using ObjectName
pattern (%1$s) and Query expression (%2$s)!",
- objectName, queryExpression), e);
+ objectName, queryExpression), e);
}
}
else {
- printSevere("Running a query to get the ObjectNames of all MBeans
matching the ObjectName pattern (%1$s) and Query expression (%2$s) is currently
unsupported!",
+ printSevere(
+ "Running a query to get the ObjectNames of all MBeans matching the
ObjectName pattern (%1$s) and Query expression (%2$s) is currently
unsupported!",
objectName, queryExpression);
throw new
RestApiCallForCommandNotFoundException(MBEAN_QUERY_LINK_RELATION);
}