diff --git a/common/common-rest/src/main/java/io/servicecomb/common/rest/definition/RestOperationMeta.java b/common/common-rest/src/main/java/io/servicecomb/common/rest/definition/RestOperationMeta.java index 41f4fa3acc6..786b76dcea0 100644 --- a/common/common-rest/src/main/java/io/servicecomb/common/rest/definition/RestOperationMeta.java +++ b/common/common-rest/src/main/java/io/servicecomb/common/rest/definition/RestOperationMeta.java @@ -36,7 +36,7 @@ import io.swagger.models.Operation; import io.swagger.models.Swagger; import io.swagger.models.parameters.Parameter; -import io.vertx.ext.web.impl.Utils; +import io.vertx.ext.web.impl.MimeTypesUtils; public class RestOperationMeta { private static final Logger LOGGER = LoggerFactory.getLogger(RestOperationMeta.class); @@ -209,7 +209,7 @@ public ProduceProcessor ensureFindProduceProcessor(String acceptType) { return defaultProcessor; } - List mimeTyps = Utils.getSortedAcceptableMimeTypes(acceptType.toLowerCase(Locale.US)); + List mimeTyps = MimeTypesUtils.getSortedAcceptableMimeTypes(acceptType.toLowerCase(Locale.US)); for (String mime : mimeTyps) { ProduceProcessor processor = this.produceProcessorMap.get(mime); if (null != processor) { diff --git a/foundations/foundation-metrics/src/main/java/io/servicecomb/foundation/metrics/MetricsServoRegistry.java b/foundations/foundation-metrics/src/main/java/io/servicecomb/foundation/metrics/MetricsServoRegistry.java index 14e2ea53a22..f05fcdccd5d 100644 --- a/foundations/foundation-metrics/src/main/java/io/servicecomb/foundation/metrics/MetricsServoRegistry.java +++ b/foundations/foundation-metrics/src/main/java/io/servicecomb/foundation/metrics/MetricsServoRegistry.java @@ -416,7 +416,6 @@ public String call() { protected final Func0 getTpsAndLatency = new Func0() { @Override public String call() { - Collection instances = HystrixCommandMetrics.getInstances(); List tpsAndLatencyData = HystrixCommandMetrics.getInstances().stream().map(instance -> new TpsAndLatencyData(instance.getRollingCount(HystrixEventType.SUCCESS), instance.getRollingCount(HystrixEventType.FAILURE) diff --git a/foundations/foundation-metrics/src/main/java/io/servicecomb/foundation/metrics/output/servo/SimpleMetricsContentConvertor.java b/foundations/foundation-metrics/src/main/java/io/servicecomb/foundation/metrics/output/servo/SimpleMetricsContentConvertor.java index 2cbdd9b8700..6a98b7da20f 100644 --- a/foundations/foundation-metrics/src/main/java/io/servicecomb/foundation/metrics/output/servo/SimpleMetricsContentConvertor.java +++ b/foundations/foundation-metrics/src/main/java/io/servicecomb/foundation/metrics/output/servo/SimpleMetricsContentConvertor.java @@ -20,19 +20,12 @@ import java.util.List; import java.util.Map; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; -import com.fasterxml.jackson.databind.ObjectMapper; import com.netflix.servo.Metric; @Component public class SimpleMetricsContentConvertor implements MetricsContentConvertor { - - private static final Logger logger = LoggerFactory.getLogger(SimpleMetricsContentConvertor.class); - private final ObjectMapper mapper = new ObjectMapper(); - @Override public Map convert(List metrics) { Map pickedMetrics = new HashMap<>(); @@ -40,7 +33,8 @@ public Map convert(List metrics) { if (isTotalRequestInstanceLevelMetric(metric.getConfig().getName())) { pickedMetrics.put(metric.getConfig().getName().replace(" INSTANCE_LEVEL", ""), metric.getValue().toString()); } else if ("RequestQueueRelated".equals(metric.getConfig().getName())) { - String instanceContent = metric.getValue().toString() + String instanceContent = metric.getValue() + .toString() .substring(metric.getValue().toString().indexOf("InstanceLevel={") + "InstanceLevel={".length()); instanceContent = instanceContent.substring(0, instanceContent.indexOf('}')); String[] keyAndValueStrings = instanceContent.split(","); diff --git a/foundations/foundation-metrics/src/test/java/io/servicecomb/foundation/metrics/TestFileOutputMetricObserverAndContentConvertor.java b/foundations/foundation-metrics/src/test/java/io/servicecomb/foundation/metrics/TestFileOutputMetricObserverAndContentConvertor.java index e497ce67a32..b06369e7f1c 100644 --- a/foundations/foundation-metrics/src/test/java/io/servicecomb/foundation/metrics/TestFileOutputMetricObserverAndContentConvertor.java +++ b/foundations/foundation-metrics/src/test/java/io/servicecomb/foundation/metrics/TestFileOutputMetricObserverAndContentConvertor.java @@ -37,6 +37,7 @@ import io.servicecomb.foundation.metrics.output.servo.MetricsContentFormatter; public class TestFileOutputMetricObserverAndContentConvertor { + @SuppressWarnings("unchecked") @Test public void testMetricObserverUpdateImpl() { @@ -75,6 +76,7 @@ public Map format(Map input) { FileOutputMetricObserver observer = new FileOutputMetricObserver(output, convertor, formatter); observer.updateImpl(metrics); + @SuppressWarnings("rawtypes") ArgumentCaptor outputMetrics = ArgumentCaptor.forClass(Map.class); verify(output).output(outputMetrics.capture()); diff --git a/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/AsyncResultCallback.java b/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/AsyncResultCallback.java index abb35fa5613..635dbeeb704 100644 --- a/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/AsyncResultCallback.java +++ b/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/AsyncResultCallback.java @@ -16,10 +16,11 @@ package io.servicecomb.foundation.vertx; -import io.vertx.core.AsyncResultHandler; +import io.vertx.core.AsyncResult; import io.vertx.core.Future; +import io.vertx.core.Handler; -public interface AsyncResultCallback extends AsyncResultHandler { +public interface AsyncResultCallback extends Handler> { default void success(T data) { handle(Future.succeededFuture(data)); } diff --git a/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/server/TcpParser.java b/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/server/TcpParser.java index 7820fc6e478..4e7b559afd4 100644 --- a/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/server/TcpParser.java +++ b/foundations/foundation-vertx/src/main/java/io/servicecomb/foundation/vertx/server/TcpParser.java @@ -22,7 +22,6 @@ import io.vertx.core.Handler; import io.vertx.core.buffer.Buffer; import io.vertx.core.parsetools.RecordParser; -import io.vertx.core.parsetools.impl.RecordParserImpl; /** * TcpParser @@ -70,7 +69,7 @@ public TcpParser(TcpBufferHandler output) { * 在解析出错时,通过重新创建parser对象,将整个缓冲区重置 */ protected void reset() { - parser = RecordParserImpl.newFixed(TCP_HEADER_LENGTH, this::onParse); + parser = RecordParser.newFixed(TCP_HEADER_LENGTH, this::onParse); status = ParseStatus.TCP_HEADER; parser.handle(Buffer.buffer(0)); diff --git a/foundations/foundation-vertx/src/main/java/io/vertx/ext/web/impl/MimeTypesUtils.java b/foundations/foundation-vertx/src/main/java/io/vertx/ext/web/impl/MimeTypesUtils.java new file mode 100644 index 00000000000..b9c31844ebe --- /dev/null +++ b/foundations/foundation-vertx/src/main/java/io/vertx/ext/web/impl/MimeTypesUtils.java @@ -0,0 +1,85 @@ +/* + * Copyright 2017 Huawei Technologies Co., Ltd + * + * Licensed 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 io.vertx.ext.web.impl; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.regex.Pattern; + +// copy from old io.vertx.ext.web.impl.Utils +// because new vertx deleted getSortedAcceptableMimeTypes, and did not log the reason +public class MimeTypesUtils { + private static final Pattern COMMA_SPLITTER = Pattern.compile(" *, *"); + + private static final Pattern SEMICOLON_SPLITTER = Pattern.compile(" *; *"); + + private static final Pattern EQUAL_SPLITTER = Pattern.compile(" *= *"); + + private static final Comparator ACCEPT_X_COMPARATOR = new Comparator() { + float getQuality(String s) { + if (s == null) { + return 0; + } + + String[] params = SEMICOLON_SPLITTER.split(s); + for (int i = 1; i < params.length; i++) { + String[] q = EQUAL_SPLITTER.split(params[1]); + if ("q".equals(q[0])) { + return Float.parseFloat(q[1]); + } + } + return 1; + } + + @Override + public int compare(String o1, String o2) { + float f1 = getQuality(o1); + float f2 = getQuality(o2); + return Float.compare(f2, f1); + } + }; + + public static List getSortedAcceptableMimeTypes(String acceptHeader) { + // accept anything when accept is not present + if (acceptHeader == null) { + return Collections.emptyList(); + } + + // parse + String[] items = COMMA_SPLITTER.split(acceptHeader); + // sort on quality + Arrays.sort(items, ACCEPT_X_COMPARATOR); + + List list = new ArrayList<>(items.length); + + for (String item : items) { + // find any ; e.g.: "application/json;q=0.8" + int space = item.indexOf(';'); + + if (space != -1) { + list.add(item.substring(0, space)); + } else { + list.add(item); + } + } + + return list; + } +} diff --git a/foundations/foundation-vertx/src/test/java/io/servicecomb/foundation/vertx/TestTcp.java b/foundations/foundation-vertx/src/test/java/io/servicecomb/foundation/vertx/TestTcp.java index 8c03b6fcfa4..f33419965db 100644 --- a/foundations/foundation-vertx/src/test/java/io/servicecomb/foundation/vertx/TestTcp.java +++ b/foundations/foundation-vertx/src/test/java/io/servicecomb/foundation/vertx/TestTcp.java @@ -39,6 +39,7 @@ import io.vertx.core.buffer.Buffer; import io.vertx.core.net.NetClient; import io.vertx.core.net.NetSocket; +import io.vertx.core.net.SocketAddress; import io.vertx.core.net.impl.NetSocketImpl; import io.vertx.core.net.impl.SocketAddressImpl; import mockit.Deencapsulation; @@ -71,6 +72,23 @@ public NetClient connect(int port, String host, Handler> @Override public void close() { } + + @Override + public NetClient connect(int port, String host, String serverName, + Handler> connectHandler) { + return null; + } + + @Override + public NetClient connect(SocketAddress remoteAddress, Handler> connectHandler) { + return null; + } + + @Override + public NetClient connect(SocketAddress remoteAddress, String serverName, + Handler> connectHandler) { + return null; + } }; TcpClientConnection oTcpClient = new TcpClientConnection(Mockito.mock(Context.class), oNetClient, "highway://127.2.0.1:8080", diff --git a/foundations/foundation-vertx/src/test/java/io/vertx/ext/web/impl/TestMimeTypesUtils.java b/foundations/foundation-vertx/src/test/java/io/vertx/ext/web/impl/TestMimeTypesUtils.java new file mode 100644 index 00000000000..1bdd8aa4bed --- /dev/null +++ b/foundations/foundation-vertx/src/test/java/io/vertx/ext/web/impl/TestMimeTypesUtils.java @@ -0,0 +1,97 @@ +/* + * Copyright 2017 Huawei Technologies Co., Ltd + * + * Licensed 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 io.vertx.ext.web.impl; + +import static org.junit.Assert.assertEquals; + +import java.util.Collections; +import java.util.List; + +import org.junit.Assert; +import org.junit.Test; + +public class TestMimeTypesUtils { + @Test + public void testSortedAcceptableMimeTypes1() { + String accept = "text/html"; + List types = MimeTypesUtils.getSortedAcceptableMimeTypes(accept); + assertEquals(1, types.size()); + assertEquals("text/html", types.get(0)); + } + + @Test + public void testSortedAcceptableMimeTypes2() { + String accept = "text/html, application/json"; + List types = MimeTypesUtils.getSortedAcceptableMimeTypes(accept); + assertEquals(2, types.size()); + assertEquals("text/html", types.get(0)); + assertEquals("application/json", types.get(1)); + } + + @Test + public void testSortedAcceptableMimeTypes3() { + String accept = "text/html,application/json"; + List types = MimeTypesUtils.getSortedAcceptableMimeTypes(accept); + assertEquals(2, types.size()); + assertEquals("text/html", types.get(0)); + assertEquals("application/json", types.get(1)); + } + + @Test + public void testSortedAcceptableMimeTypes4() { + String accept = "text/html; q=0.8,application/json; q=0.9"; + List types = MimeTypesUtils.getSortedAcceptableMimeTypes(accept); + assertEquals(2, types.size()); + assertEquals("application/json", types.get(0)); + assertEquals("text/html", types.get(1)); + } + + @Test + public void testSortedAcceptableMimeTypes5() { + String accept = "text/html;q=0.8,application/json;q=0.9"; + List types = MimeTypesUtils.getSortedAcceptableMimeTypes(accept); + assertEquals(2, types.size()); + assertEquals("application/json", types.get(0)); + assertEquals("text/html", types.get(1)); + } + + @Test + public void testSortedAcceptableMimeTypes6() { + String accept = "text/html; q=0.8,application/json; q=0.9, text/plain"; + List types = MimeTypesUtils.getSortedAcceptableMimeTypes(accept); + assertEquals(3, types.size()); + assertEquals("text/plain", types.get(0)); + assertEquals("application/json", types.get(1)); + assertEquals("text/html", types.get(2)); + } + + @Test + public void testSortedAcceptableMimeTypes7() { + String accept = "text/html;q=0.8,application/json;q=0.9,text/plain"; + List types = MimeTypesUtils.getSortedAcceptableMimeTypes(accept); + assertEquals(3, types.size()); + assertEquals("text/plain", types.get(0)); + assertEquals("application/json", types.get(1)); + assertEquals("text/html", types.get(2)); + } + + @Test + public void getSortedAcceptableMimeTypesNull() { + List types = MimeTypesUtils.getSortedAcceptableMimeTypes(null); + Assert.assertSame(Collections.emptyList(), types); + } +} diff --git a/java-chassis-dependencies/pom.xml b/java-chassis-dependencies/pom.xml index cabfac75f09..5e3c53c919a 100644 --- a/java-chassis-dependencies/pom.xml +++ b/java-chassis-dependencies/pom.xml @@ -30,7 +30,7 @@ 2.8.10 - 3.3.3 + 3.5.0 0.8 4.3.5.RELEASE 1.7.7 @@ -765,7 +765,7 @@ handler-flowcontrol-qps 0.4.1-SNAPSHOT - + io.servicecomb handler-publickey-auth 0.4.1-SNAPSHOT