This is an automated email from the ASF dual-hosted git repository. wujimin pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git
commit 2b15544f8a7f0532180dbb1b8f20742b76328da2 Author: yaohaishi <yaohai...@huawei.com> AuthorDate: Tue May 29 15:38:14 2018 +0800 [SCB-616] make VertxRestAccessLogItemCreator extensible --- .../impl/VertxRestAccessLogPatternParser.java | 21 ++++-- ....accesslog.parser.VertxRestAccessLogItemCreator | 18 ++++++ .../impl/VertxRestAccessLogPatternParserTest.java | 74 ++++++++++++++++++++++ 3 files changed, 109 insertions(+), 4 deletions(-) diff --git a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/impl/VertxRestAccessLogPatternParser.java b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/impl/VertxRestAccessLogPatternParser.java index f299426..69776cc 100644 --- a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/impl/VertxRestAccessLogPatternParser.java +++ b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/impl/VertxRestAccessLogPatternParser.java @@ -22,11 +22,14 @@ import java.util.Comparator; import java.util.Iterator; import java.util.List; +import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils; import org.apache.servicecomb.transport.rest.vertx.accesslog.element.AccessLogItem; import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.PlainTextItem; import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.AccessLogItemMeta; import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.AccessLogPatternParser; import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.VertxRestAccessLogItemCreator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import io.vertx.ext.web.RoutingContext; @@ -34,6 +37,8 @@ import io.vertx.ext.web.RoutingContext; * The parser is used for rest-over-vertx transport. */ public class VertxRestAccessLogPatternParser implements AccessLogPatternParser<RoutingContext> { + private static final Logger LOGGER = LoggerFactory.getLogger(VertxRestAccessLogPatternParser.class); + public static final Comparator<AccessLogItemMetaWrapper> accessLogItemMetaWrapperComparator = (w1, w2) -> { AccessLogItemMeta meta1 = w1.getAccessLogItemMeta(); AccessLogItemMeta meta2 = w2.getAccessLogItemMeta(); @@ -56,13 +61,17 @@ public class VertxRestAccessLogPatternParser implements AccessLogPatternParser<R : result; }; - private List<VertxRestAccessLogItemCreator> creators = new ArrayList<>(); + private List<VertxRestAccessLogItemCreator> creators; private List<AccessLogItemMetaWrapper> accessLogItemMetaWrappers = new ArrayList<>(); public VertxRestAccessLogPatternParser() { - creators.add(new DefaultAccessLogItemCreator()); - for (VertxRestAccessLogItemCreator creator : creators) { + List<VertxRestAccessLogItemCreator> creators = loadVertxRestAccessLogItemCreators(); + this.creators = creators; + if (null == creators) { + LOGGER.error("cannot load VertxRestAccessLogItemCreator!"); + } + for (VertxRestAccessLogItemCreator creator : this.creators) { for (AccessLogItemMeta accessLogItemMeta : creator.getAccessLogItemMeta()) { accessLogItemMetaWrappers.add(new AccessLogItemMetaWrapper(accessLogItemMeta, creator)); } @@ -70,6 +79,10 @@ public class VertxRestAccessLogPatternParser implements AccessLogPatternParser<R sortAccessLogItemMetaWrapper(accessLogItemMetaWrappers); } + private List<VertxRestAccessLogItemCreator> loadVertxRestAccessLogItemCreators() { + return SPIServiceUtils.getOrLoadSortedService(VertxRestAccessLogItemCreator.class); + } + /** * Behavior of this compare: * 1. comparePlaceholderString("abc","bbc") < 0 @@ -135,6 +148,7 @@ public class VertxRestAccessLogPatternParser implements AccessLogPatternParser<R */ @Override public List<AccessLogItem<RoutingContext>> parsePattern(String rawPattern) { + LOGGER.info("parse the pattern of access log: [{}]", rawPattern); List<AccessLogItemLocation> locationList = matchAccessLogItem(rawPattern); locationList = fillInPlainTextLocation(rawPattern, locationList); @@ -364,4 +378,3 @@ public class VertxRestAccessLogPatternParser implements AccessLogPatternParser<R } } } - diff --git a/transports/transport-rest/transport-rest-vertx/src/main/resources/META-INF/services/org.apache.servicecomb.transport.rest.vertx.accesslog.parser.VertxRestAccessLogItemCreator b/transports/transport-rest/transport-rest-vertx/src/main/resources/META-INF/services/org.apache.servicecomb.transport.rest.vertx.accesslog.parser.VertxRestAccessLogItemCreator new file mode 100644 index 0000000..92e596a --- /dev/null +++ b/transports/transport-rest/transport-rest-vertx/src/main/resources/META-INF/services/org.apache.servicecomb.transport.rest.vertx.accesslog.parser.VertxRestAccessLogItemCreator @@ -0,0 +1,18 @@ +# +# 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. +# + +org.apache.servicecomb.transport.rest.vertx.accesslog.parser.impl.DefaultAccessLogItemCreator \ No newline at end of file diff --git a/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/impl/VertxRestAccessLogPatternParserTest.java b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/impl/VertxRestAccessLogPatternParserTest.java index 0cfd2cd..57e9100 100644 --- a/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/impl/VertxRestAccessLogPatternParserTest.java +++ b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/accesslog/parser/impl/VertxRestAccessLogPatternParserTest.java @@ -18,7 +18,9 @@ package org.apache.servicecomb.transport.rest.vertx.accesslog.parser.impl; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Locale; @@ -46,11 +48,15 @@ import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.TraceI import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.UrlPathItem; import org.apache.servicecomb.transport.rest.vertx.accesslog.element.impl.UrlPathWithQueryItem; import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.AccessLogItemMeta; +import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.VertxRestAccessLogItemCreator; import org.apache.servicecomb.transport.rest.vertx.accesslog.parser.impl.VertxRestAccessLogPatternParser.AccessLogItemMetaWrapper; import org.junit.Assert; import org.junit.Test; import io.vertx.ext.web.RoutingContext; +import mockit.Deencapsulation; +import mockit.Mock; +import mockit.MockUp; public class VertxRestAccessLogPatternParserTest { private static final String ROW_PATTERN = "[cs-method] %m %s%T%D%h%v%p%B%b%r%U%q" @@ -262,4 +268,72 @@ public class VertxRestAccessLogPatternParserTest { VertxRestAccessLogPatternParser.comparePlaceholderString("ab", "abc") > 0 ); } + + @Test + public void testExtendedVertxRestAccessLogItemCreator() { + final List<AccessLogItemMeta> metaList0 = new ArrayList<>(); + metaList0.add(new AccessLogItemMeta("%{", "}abc")); + metaList0.add(new AccessLogItemMeta("%{", "}a")); + metaList0.add(new AccessLogItemMeta("%{", null)); + metaList0.add(new AccessLogItemMeta("%_", null, -1)); + + final List<AccessLogItemMeta> metaList1 = new ArrayList<>(); + metaList0.add(new AccessLogItemMeta("%a", "}abc")); + metaList0.add(new AccessLogItemMeta("%0", "}abc", 1)); + metaList0.add(new AccessLogItemMeta("%m", null)); + + final VertxRestAccessLogItemCreator accessLogItemCreator0 = new VertxRestAccessLogItemCreator() { + @Override + public List<AccessLogItemMeta> getAccessLogItemMeta() { + return metaList0; + } + + @Override + public AccessLogItem<RoutingContext> createItem(AccessLogItemMeta accessLogItemMeta, String config) { + return null; + } + }; + + final VertxRestAccessLogItemCreator accessLogItemCreator1 = new VertxRestAccessLogItemCreator() { + @Override + public List<AccessLogItemMeta> getAccessLogItemMeta() { + return metaList1; + } + + @Override + public AccessLogItem<RoutingContext> createItem(AccessLogItemMeta accessLogItemMeta, String config) { + return null; + } + }; + + new MockUp<VertxRestAccessLogPatternParser>() { + @Mock + List<VertxRestAccessLogItemCreator> loadVertxRestAccessLogItemCreators() { + List<VertxRestAccessLogItemCreator> creators = new ArrayList<>(1); + creators.add(accessLogItemCreator0); + creators.add(accessLogItemCreator1); + return creators; + } + }; + + VertxRestAccessLogPatternParser parser = new VertxRestAccessLogPatternParser(); + + List<AccessLogItemMetaWrapper> accessLogItemMetaWrappers = + Deencapsulation.getField(parser, "accessLogItemMetaWrappers"); + + assertEquals(7, accessLogItemMetaWrappers.size()); + assertEquals("%_", accessLogItemMetaWrappers.get(0).getPrefix()); + assertEquals("%a", accessLogItemMetaWrappers.get(1).getPrefix()); + assertEquals("}abc", accessLogItemMetaWrappers.get(1).getSuffix()); + assertEquals("%{", accessLogItemMetaWrappers.get(2).getPrefix()); + assertEquals("}abc", accessLogItemMetaWrappers.get(2).getSuffix()); + assertEquals("%{", accessLogItemMetaWrappers.get(3).getPrefix()); + assertEquals("}a", accessLogItemMetaWrappers.get(3).getSuffix()); + assertEquals("%m", accessLogItemMetaWrappers.get(4).getPrefix()); + assertNull(accessLogItemMetaWrappers.get(4).getSuffix()); + assertEquals("%{", accessLogItemMetaWrappers.get(5).getPrefix()); + assertNull(accessLogItemMetaWrappers.get(5).getSuffix()); + assertEquals("%0", accessLogItemMetaWrappers.get(6).getPrefix()); + assertEquals("}abc", accessLogItemMetaWrappers.get(6).getSuffix()); + } } -- To stop receiving notification emails like this one, please contact wuji...@apache.org.