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.