You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by wu...@apache.org on 2018/06/05 07:29:47 UTC
[incubator-servicecomb-java-chassis] 05/06: [SCB-616] make
VertxRestAccessLogItemCreator extensible
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 <ya...@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
wujimin@apache.org.