Repository: incubator-geode Updated Branches: refs/heads/develop 58e0026c6 -> bb3db4a6a
GEODE-1247: unable to stop server using http connection Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/bb3db4a6 Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/bb3db4a6 Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/bb3db4a6 Branch: refs/heads/develop Commit: bb3db4a6a6f5057c8d4ebb87961708d131e5b447 Parents: 58e0026 Author: Jinmei Liao <jil...@pivotal.io> Authored: Mon Nov 14 12:41:17 2016 -0800 Committer: Jinmei Liao <jil...@pivotal.io> Committed: Tue Nov 15 15:40:42 2016 -0600 ---------------------------------------------------------------------- .../org/apache/geode/internal/util/IOUtils.java | 9 ++- .../web/shell/AbstractHttpOperationInvoker.java | 47 +++++++----- .../commands/QueryNamesOverHttpDUnitTest.java | 79 ++++++++++++++++++++ 3 files changed, 112 insertions(+), 23 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/bb3db4a6/geode-core/src/main/java/org/apache/geode/internal/util/IOUtils.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/internal/util/IOUtils.java b/geode-core/src/main/java/org/apache/geode/internal/util/IOUtils.java index 4c1cc5f..c1a1952 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/util/IOUtils.java +++ b/geode-core/src/main/java/org/apache/geode/internal/util/IOUtils.java @@ -14,6 +14,9 @@ */ package org.apache.geode.internal.util; +import org.apache.geode.internal.lang.ObjectUtils; +import org.apache.geode.internal.lang.StringUtils; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.Closeable; @@ -25,9 +28,6 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.ObjectStreamClass; -import org.apache.geode.internal.lang.ObjectUtils; -import org.apache.geode.internal.lang.StringUtils; - /** * Reusable Input/Output operation utility methods. * <p/> @@ -168,7 +168,8 @@ public abstract class IOUtils { ObjectInputStream objIn = null; try { - objIn = new ClassLoaderObjectInputStream(new ByteArrayInputStream(objBytes), loader); + ByteArrayInputStream bis = new ByteArrayInputStream(objBytes); + objIn = new ClassLoaderObjectInputStream(bis, loader); return objIn.readObject(); } finally { close(objIn); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/bb3db4a6/geode-core/src/main/java/org/apache/geode/management/internal/web/shell/AbstractHttpOperationInvoker.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/web/shell/AbstractHttpOperationInvoker.java b/geode-core/src/main/java/org/apache/geode/management/internal/web/shell/AbstractHttpOperationInvoker.java index 25eee82..fa05248 100644 --- a/geode-core/src/main/java/org/apache/geode/management/internal/web/shell/AbstractHttpOperationInvoker.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/web/shell/AbstractHttpOperationInvoker.java @@ -15,23 +15,6 @@ package org.apache.geode.management.internal.web.shell; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.URI; -import java.util.Arrays; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import javax.management.ObjectName; -import javax.management.QueryExp; - import org.apache.geode.internal.GemFireVersion; import org.apache.geode.internal.lang.StringUtils; import org.apache.geode.internal.logging.LogService; @@ -50,17 +33,35 @@ import org.apache.geode.management.internal.web.shell.support.HttpMBeanProxyFact import org.apache.geode.management.internal.web.util.UriUtils; import org.apache.geode.security.AuthenticationFailedException; import org.apache.geode.security.NotAuthorizedException; - import org.apache.logging.log4j.Logger; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.client.ResourceAccessException; import org.springframework.web.client.ResponseErrorHandler; import org.springframework.web.client.RestTemplate; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URI; +import java.util.Arrays; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import javax.management.ObjectName; +import javax.management.QueryExp; + /** * The AbstractHttpOperationInvoker class is an abstract base class encapsulating common * functionality for all HTTP-based OperationInvoker implementations. @@ -184,7 +185,15 @@ public abstract class AbstractHttpOperationInvoker implements HttpOperationInvok // add our custom HttpMessageConverter for serializing DTO Objects into the HTTP request message // body // and de-serializing HTTP response message body content back into DTO Objects - this.restTemplate.getMessageConverters().add(new SerializableObjectHttpMessageConverter()); + List<HttpMessageConverter<?>> converters = this.restTemplate.getMessageConverters(); + // remove the MappingJacksonHttpConverter + for (int i = converters.size() - 1; i >= 0; i--) { + HttpMessageConverter converter = converters.get(i); + if (converter instanceof MappingJackson2HttpMessageConverter) { + converters.remove(converter); + } + } + converters.add(new SerializableObjectHttpMessageConverter()); // set the ResponseErrorHandler handling any errors originating from our HTTP request this.restTemplate.setErrorHandler(new ResponseErrorHandler() { http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/bb3db4a6/geode-web/src/test/java/org/apache/geode/management/internal/cli/commands/QueryNamesOverHttpDUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-web/src/test/java/org/apache/geode/management/internal/cli/commands/QueryNamesOverHttpDUnitTest.java b/geode-web/src/test/java/org/apache/geode/management/internal/cli/commands/QueryNamesOverHttpDUnitTest.java new file mode 100644 index 0000000..1a19e5e --- /dev/null +++ b/geode-web/src/test/java/org/apache/geode/management/internal/cli/commands/QueryNamesOverHttpDUnitTest.java @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package org.apache.geode.management.internal.cli.commands; + +import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_BIND_ADDRESS; +import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT; +import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; + +import org.apache.geode.internal.AvailablePortHelper; +import org.apache.geode.management.internal.cli.shell.Gfsh; +import org.apache.geode.management.internal.web.domain.Link; +import org.apache.geode.management.internal.web.domain.LinkIndex; +import org.apache.geode.management.internal.web.http.HttpMethod; +import org.apache.geode.management.internal.web.shell.RestHttpOperationInvoker; +import org.apache.geode.test.dunit.rules.LocatorStarterRule; +import org.apache.geode.test.junit.categories.IntegrationTest; +import org.junit.Rule; +import org.junit.Test; +import org.junit.experimental.categories.Category; + +import java.net.URI; +import java.util.HashMap; +import java.util.Properties; +import java.util.Set; +import javax.management.ObjectName; +import javax.management.Query; +import javax.management.QueryExp; + +@Category(IntegrationTest.class) +public class QueryNamesOverHttpDUnitTest { + + + protected static int[] ports = AvailablePortHelper.getRandomAvailableTCPPorts(2); + protected static int jmxPort = ports[0]; + protected static int httpPort = ports[1]; + + private static Properties locatorProps = new Properties() { + { + setProperty(HTTP_SERVICE_BIND_ADDRESS, "localhost"); + setProperty(HTTP_SERVICE_PORT, httpPort + ""); + setProperty(JMX_MANAGER_PORT, jmxPort + ""); + } + }; + + @Rule + public LocatorStarterRule locatorRule = new LocatorStarterRule(locatorProps); + + + @Test + public void testQueryNameOverHttp() throws Exception { + + LinkIndex links = new LinkIndex(); + links.add(new Link("mbean-query", + new URI("http://localhost:" + httpPort + "/gemfire/v1/mbean/query"), HttpMethod.POST)); + RestHttpOperationInvoker invoker = + new RestHttpOperationInvoker(links, mock(Gfsh.class), new HashMap<>()); + + ObjectName objectName = ObjectName.getInstance("GemFire:type=Member,*"); + QueryExp query = Query.eq(Query.attr("Name"), Query.value("mock")); + + Set<ObjectName> names = invoker.queryNames(objectName, query); + assertTrue(names.isEmpty()); + } +}