This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new 979fa73  add aspectJ path (#3080)
979fa73 is described below

commit 979fa73343b45325a65a3053075ecf92d3e64cbc
Author: li.can <[email protected]>
AuthorDate: Mon Jul 15 17:18:44 2019 +0800

    add aspectJ path (#3080)
---
 .../patch/AopExpressionMatchInterceptor.java       | 48 +++-----------
 .../AspectJExpressionPointCutInterceptor.java      | 54 +++++++++++++++
 .../apm/plugin/spring/patch/MatchUtil.java         | 61 +++++++++++++++++
 .../AspectJExpressionPointCutInstrumentation.java  | 77 ++++++++++++++++++++++
 .../src/main/resources/skywalking-plugin.def       |  1 +
 5 files changed, 201 insertions(+), 40 deletions(-)

diff --git 
a/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/src/main/java/org/apache/skywalking/apm/plugin/spring/patch/AopExpressionMatchInterceptor.java
 
b/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/src/main/java/org/apache/skywalking/apm/plugin/spring/patch/AopExpressionMatchInterceptor.java
index 5c99a88..da6c0c2 100644
--- 
a/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/src/main/java/org/apache/skywalking/apm/plugin/spring/patch/AopExpressionMatchInterceptor.java
+++ 
b/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/src/main/java/org/apache/skywalking/apm/plugin/spring/patch/AopExpressionMatchInterceptor.java
@@ -17,14 +17,12 @@
 
 package org.apache.skywalking.apm.plugin.spring.patch;
 
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
 import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
 import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
 import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.StaticMethodsAroundInterceptor;
 
+import java.lang.reflect.Method;
+
 /**
  * {@link AopExpressionMatchInterceptor} check if the method is match the 
enhanced method
  * if yes,return false else return true;
@@ -33,24 +31,16 @@ import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.StaticMet
  */
 public class AopExpressionMatchInterceptor implements 
StaticMethodsAroundInterceptor {
 
-    private List<Method> methods = new ArrayList<Method>(2);
-
-    public AopExpressionMatchInterceptor() {
-        
methods.addAll(Arrays.asList(EnhancedInstance.class.getDeclaredMethods()));
-    }
-
     @Override
-    public void beforeMethod(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes,
-        MethodInterceptResult result) {
+    public void beforeMethod(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes, MethodInterceptResult result) {
 
     }
 
     @Override
-    public Object afterMethod(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes,
-        Object ret) {
-        Method targetAopMethod = (Method)allArguments[1];
-        Class<?> targetAopClass = (Class<?>)allArguments[2];
-        if (targetAopClass != null && 
EnhancedInstance.class.isAssignableFrom(targetAopClass) && 
isEnhancedMethod(targetAopMethod)) {
+    public Object afterMethod(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes, Object ret) {
+        Method targetAopMethod = (Method) allArguments[1];
+        Class<?> targetAopClass = (Class<?>) allArguments[2];
+        if (targetAopClass != null && 
EnhancedInstance.class.isAssignableFrom(targetAopClass) && 
MatchUtil.isEnhancedMethod(targetAopMethod)) {
             return false;
         }
         return ret;
@@ -58,30 +48,8 @@ public class AopExpressionMatchInterceptor implements 
StaticMethodsAroundInterce
 
     @Override
     public void handleMethodException(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes,
-        Throwable t) {
+                                      Throwable t) {
 
     }
 
-    private boolean isEnhancedMethod(Method targetMethod) {
-        for (Method method : methods) {
-            if (method.getName().equals(targetMethod.getName())
-                && method.getReturnType().equals(targetMethod.getReturnType())
-                && equalParamTypes(method.getParameterTypes(), 
targetMethod.getParameterTypes())) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private boolean equalParamTypes(Class<?>[] params1, Class<?>[] params2) {
-        if (params1.length != params2.length) {
-            return false;
-        }
-        for (int i = 0; i < params1.length; i++) {
-            if (!params1[i].equals(params2[i])) {
-                return false;
-            }
-        }
-        return true;
-    }
 }
diff --git 
a/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/src/main/java/org/apache/skywalking/apm/plugin/spring/patch/AspectJExpressionPointCutInterceptor.java
 
b/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/src/main/java/org/apache/skywalking/apm/plugin/spring/patch/AspectJExpressionPointCutInterceptor.java
new file mode 100644
index 0000000..1ce974f
--- /dev/null
+++ 
b/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/src/main/java/org/apache/skywalking/apm/plugin/spring/patch/AspectJExpressionPointCutInterceptor.java
@@ -0,0 +1,54 @@
+/*
+ * 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.skywalking.apm.plugin.spring.patch;
+
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
+
+import java.lang.reflect.Method;
+
+/**
+ * {@link AspectJExpressionPointCutInterceptor} check if the method is match 
the enhanced method
+ * if yes,return false else return true;
+ *
+ * @author lican
+ */
+public class AspectJExpressionPointCutInterceptor implements 
InstanceMethodsAroundInterceptor {
+
+
+    @Override
+    public void beforeMethod(EnhancedInstance objInst, Method method, Object[] 
allArguments, Class<?>[] argumentsTypes, MethodInterceptResult result) throws 
Throwable {
+
+    }
+
+    @Override
+    public Object afterMethod(EnhancedInstance objInst, Method method, 
Object[] allArguments, Class<?>[] argumentsTypes, Object ret) throws Throwable {
+        Method targetAopMethod = (Method) allArguments[0];
+        Class<?> targetAopClass = (Class<?>) allArguments[1];
+        if (targetAopClass != null && 
EnhancedInstance.class.isAssignableFrom(targetAopClass) && 
MatchUtil.isEnhancedMethod(targetAopMethod)) {
+            return false;
+        }
+        return ret;
+    }
+
+    @Override
+    public void handleMethodException(EnhancedInstance objInst, Method method, 
Object[] allArguments, Class<?>[] argumentsTypes, Throwable t) {
+
+    }
+}
\ No newline at end of file
diff --git 
a/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/src/main/java/org/apache/skywalking/apm/plugin/spring/patch/MatchUtil.java
 
b/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/src/main/java/org/apache/skywalking/apm/plugin/spring/patch/MatchUtil.java
new file mode 100644
index 0000000..fc39ba9
--- /dev/null
+++ 
b/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/src/main/java/org/apache/skywalking/apm/plugin/spring/patch/MatchUtil.java
@@ -0,0 +1,61 @@
+/*
+ * 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.skywalking.apm.plugin.spring.patch;
+
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author lican
+ */
+public class MatchUtil {
+
+
+    private static List<Method> METHODS = new ArrayList<Method>(2);
+
+    static {
+        
METHODS.addAll(Arrays.asList(EnhancedInstance.class.getDeclaredMethods()));
+    }
+
+    static boolean isEnhancedMethod(Method targetMethod) {
+        for (Method method : METHODS) {
+            if (method.getName().equals(targetMethod.getName())
+                    && 
method.getReturnType().equals(targetMethod.getReturnType())
+                    && equalParamTypes(method.getParameterTypes(), 
targetMethod.getParameterTypes())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private static boolean equalParamTypes(Class<?>[] params1, Class<?>[] 
params2) {
+        if (params1.length != params2.length) {
+            return false;
+        }
+        for (int i = 0; i < params1.length; i++) {
+            if (!params1[i].equals(params2[i])) {
+                return false;
+            }
+        }
+        return true;
+    }
+}
diff --git 
a/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/src/main/java/org/apache/skywalking/apm/plugin/spring/patch/define/AspectJExpressionPointCutInstrumentation.java
 
b/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/src/main/java/org/apache/skywalking/apm/plugin/spring/patch/define/AspectJExpressionPointCutInstrumentation.java
new file mode 100644
index 0000000..f0f1730
--- /dev/null
+++ 
b/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/src/main/java/org/apache/skywalking/apm/plugin/spring/patch/define/AspectJExpressionPointCutInstrumentation.java
@@ -0,0 +1,77 @@
+/*
+ * 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.skywalking.apm.plugin.spring.patch.define;
+
+import net.bytebuddy.description.method.MethodDescription;
+import net.bytebuddy.matcher.ElementMatcher;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.DeclaredInstanceMethodsInterceptPoint;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
+import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch;
+import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch;
+
+import static net.bytebuddy.matcher.ElementMatchers.named;
+import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
+
+/**
+ * {@link AspectJExpressionPointCutInstrumentation} indicates that exclude 
enhanced method in @{link EnhancedInstance} to prevent
+ * side effect when use  pointcut way to intercept your code
+ *
+ * @author lican
+ */
+public class AspectJExpressionPointCutInstrumentation extends 
ClassInstanceMethodsEnhancePluginDefine {
+
+    private static final String ENHANCE_CLASS = 
"org.springframework.aop.aspectj.AspectJExpressionPointcut";
+    private static final String ENHANCE_METHOD = "matches";
+    private static final String INTERCEPT_CLASS = 
"org.apache.skywalking.apm.plugin.spring.patch.AspectJExpressionPointCutInterceptor";
+
+
+    @Override
+    protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
+        return new ConstructorInterceptPoint[0];
+    }
+
+    @Override
+    protected InstanceMethodsInterceptPoint[] 
getInstanceMethodsInterceptPoints() {
+        return new DeclaredInstanceMethodsInterceptPoint[]{new 
DeclaredInstanceMethodsInterceptPoint() {
+            @Override
+            public ElementMatcher<MethodDescription> getMethodsMatcher() {
+                return named(ENHANCE_METHOD).and(takesArguments(3));
+            }
+
+            @Override
+            public String getMethodsInterceptor() {
+                return INTERCEPT_CLASS;
+            }
+
+            @Override
+            public boolean isOverrideArgs() {
+                return false;
+            }
+        }
+
+        };
+    }
+
+    @Override
+    protected ClassMatch enhanceClass() {
+        return NameMatch.byName(ENHANCE_CLASS);
+    }
+
+}
diff --git 
a/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/src/main/resources/skywalking-plugin.def
 
b/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/src/main/resources/skywalking-plugin.def
index 6d885db..e51178b 100644
--- 
a/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/src/main/resources/skywalking-plugin.def
+++ 
b/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/src/main/resources/skywalking-plugin.def
@@ -17,4 +17,5 @@
 
spring-core-patch=org.apache.skywalking.apm.plugin.spring.patch.define.AopProxyFactoryInstrumentation
 
spring-core-patch=org.apache.skywalking.apm.plugin.spring.patch.define.AutowiredAnnotationProcessorInstrumentation
 
spring-core-patch=org.apache.skywalking.apm.plugin.spring.patch.define.AopExpressionMatchInstrumentation
+spring-core-patch=org.apache.skywalking.apm.plugin.spring.patch.define.AspectJExpressionPointCutInstrumentation
 
spring-core-patch=org.apache.skywalking.apm.plugin.spring.patch.define.BeanWrapperImplInstrumentation

Reply via email to