You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2019/06/13 09:37:17 UTC

[sling-whiteboard] 08/08: Reduced duplication in the transformer implementations

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

rombert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git

commit a75f55a71891b03d5a2d6bd3b47e011973b0a598
Author: Robert Munteanu <ro...@apache.org>
AuthorDate: Thu Jun 13 10:51:41 2019 +0200

    Reduced duplication in the transformer implementations
---
 .../uca/impl/HttpClient4TimeoutTransformer.java    | 45 ++-------------------
 .../sling/uca/impl/OkHttpTimeoutTransformer.java   | 46 ++--------------------
 ...dateFieldsInConstructorTimeoutTransformer.java} | 28 +++++++------
 3 files changed, 22 insertions(+), 97 deletions(-)

diff --git a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/HttpClient4TimeoutTransformer.java b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/HttpClient4TimeoutTransformer.java
index d389518..5b5b317 100644
--- a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/HttpClient4TimeoutTransformer.java
+++ b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/HttpClient4TimeoutTransformer.java
@@ -16,14 +16,6 @@
  */
 package org.apache.sling.uca.impl;
 
-import java.lang.instrument.ClassFileTransformer;
-import java.lang.instrument.IllegalClassFormatException;
-import java.security.ProtectionDomain;
-
-import javassist.ClassPool;
-import javassist.CtClass;
-import javassist.CtConstructor;
-import javassist.CtField;
 import javassist.bytecode.Descriptor;
 
 /**
@@ -32,45 +24,14 @@ import javassist.bytecode.Descriptor;
  * <p>It inserts two calls to <tt>org.apache.http.client.config.RequestConfig$Builder</tt> that set default
  * values for <tt>connectTimeout</tt> and <tt>socketTimeout</tt>.</p>
  */
-public class HttpClient4TimeoutTransformer implements ClassFileTransformer {
+public class HttpClient4TimeoutTransformer extends UpdateFieldsInConstructorTimeoutTransformer {
 
     // org.apache.http.client.config.RequestConfig.Builder
     
     private static final String REQUEST_CONFIG_BUILDER_CLASS_NAME = Descriptor.toJvmName("org.apache.http.client.config.RequestConfig$Builder");
     
-    private final long connectTimeoutMillis;
-    private final long readTimeoutMillis;
-    
     public HttpClient4TimeoutTransformer(long connectTimeoutMillis, long readTimeoutMillis) {
-        this.connectTimeoutMillis = connectTimeoutMillis;
-        this.readTimeoutMillis = readTimeoutMillis;
+        super(REQUEST_CONFIG_BUILDER_CLASS_NAME, "connectTimeout", "socketTimeout",
+            connectTimeoutMillis, readTimeoutMillis);
     }
-
-    @Override
-    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
-            ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
-        try {
-            if ( REQUEST_CONFIG_BUILDER_CLASS_NAME.equals(className) ) {
-                Log.get().log("%s asked to transform %s", getClass().getSimpleName(), className);
-                
-                ClassPool defaultPool = ClassPool.getDefault();
-                CtClass cc = defaultPool.get(Descriptor.toJavaName(className));
-                
-                CtConstructor noArgCtor = cc.getConstructor(Descriptor.ofConstructor(new CtClass[0]));
-                CtField connectTimeout = cc.getDeclaredField("connectTimeout");
-                CtField socketTimeout = cc.getDeclaredField("socketTimeout");
-                noArgCtor.insertAfter("this." + connectTimeout.getName() + " = " + connectTimeoutMillis + ";");
-                noArgCtor.insertAfter("this." + socketTimeout.getName() + " = " + readTimeoutMillis + ";");
-                
-                classfileBuffer = cc.toBytecode();
-                cc.detach();
-                Log.get().log("Transformation complete.");
-            }
-            return classfileBuffer;
-        } catch (Exception e) {
-            Log.get().fatal("Transformation failed", e);
-            return null;
-        }
-    }
-
 }
diff --git a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/OkHttpTimeoutTransformer.java b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/OkHttpTimeoutTransformer.java
index 22a660e..bcfae7c 100644
--- a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/OkHttpTimeoutTransformer.java
+++ b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/OkHttpTimeoutTransformer.java
@@ -16,14 +16,6 @@
  */
 package org.apache.sling.uca.impl;
 
-import java.lang.instrument.ClassFileTransformer;
-import java.lang.instrument.IllegalClassFormatException;
-import java.security.ProtectionDomain;
-
-import javassist.ClassPool;
-import javassist.CtClass;
-import javassist.CtConstructor;
-import javassist.CtField;
 import javassist.bytecode.Descriptor;
 
 /**
@@ -32,43 +24,13 @@ import javassist.bytecode.Descriptor;
  * <p>It inserts two calls to <tt>okhttp3.OkHttpClient$Builder</tt> that set default
  * values for <tt>connectTimeout</tt> and <tt>readTimeout</tt>.</p>
  */
-public class OkHttpTimeoutTransformer implements ClassFileTransformer {
+public class OkHttpTimeoutTransformer extends UpdateFieldsInConstructorTimeoutTransformer {
 
     private static final String REQUEST_CONFIG_BUILDER_CLASS_NAME = Descriptor.toJvmName("okhttp3.OkHttpClient$Builder");
     
-    private final long connectTimeoutMillis;
-    private final long readTimeoutMillis;
-    
     public OkHttpTimeoutTransformer(long connectTimeoutMillis, long readTimeoutMillis) {
-        this.connectTimeoutMillis = connectTimeoutMillis;
-        this.readTimeoutMillis = readTimeoutMillis;
+        
+        super(REQUEST_CONFIG_BUILDER_CLASS_NAME, "connectTimeout", "readTimeout", 
+            connectTimeoutMillis, readTimeoutMillis);
     }
-
-    @Override
-    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
-            ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
-        try {
-            if ( REQUEST_CONFIG_BUILDER_CLASS_NAME.equals(className) ) {
-                Log.get().log("%s asked to transform %s", getClass().getSimpleName(), className);
-                
-                ClassPool defaultPool = ClassPool.getDefault();
-                CtClass cc = defaultPool.get(Descriptor.toJavaName(className));
-                
-                CtConstructor noArgCtor = cc.getConstructor(Descriptor.ofConstructor(new CtClass[0]));
-                CtField connectTimeout = cc.getDeclaredField("connectTimeout");
-                CtField readTimeout = cc.getDeclaredField("readTimeout");
-                noArgCtor.insertAfter("this." + connectTimeout.getName() + " = " + connectTimeoutMillis + ";");
-                noArgCtor.insertAfter("this." + readTimeout.getName() + " = " + readTimeoutMillis + ";");
-                
-                classfileBuffer = cc.toBytecode();
-                cc.detach();
-                Log.get().log("Transformation complete.");
-            }
-            return classfileBuffer;
-        } catch (Exception e) {
-            Log.get().fatal("Transformation failed", e);
-            return null;
-        }
-    }
-
 }
diff --git a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/OkHttpTimeoutTransformer.java b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/UpdateFieldsInConstructorTimeoutTransformer.java
similarity index 73%
copy from url-connection-agent/src/main/java/org/apache/sling/uca/impl/OkHttpTimeoutTransformer.java
copy to url-connection-agent/src/main/java/org/apache/sling/uca/impl/UpdateFieldsInConstructorTimeoutTransformer.java
index 22a660e..274bcd4 100644
--- a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/OkHttpTimeoutTransformer.java
+++ b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/UpdateFieldsInConstructorTimeoutTransformer.java
@@ -27,19 +27,22 @@ import javassist.CtField;
 import javassist.bytecode.Descriptor;
 
 /**
- * Sets timeouts for HTTP calls done using <em>OkHttp 3.x</em>
- * 
- * <p>It inserts two calls to <tt>okhttp3.OkHttpClient$Builder</tt> that set default
- * values for <tt>connectTimeout</tt> and <tt>readTimeout</tt>.</p>
+ * Support class for transformers that update the timeout fields in the default constructor
  */
-public class OkHttpTimeoutTransformer implements ClassFileTransformer {
+public abstract class UpdateFieldsInConstructorTimeoutTransformer implements ClassFileTransformer {
 
-    private static final String REQUEST_CONFIG_BUILDER_CLASS_NAME = Descriptor.toJvmName("okhttp3.OkHttpClient$Builder");
-    
+    private final String className;
+    private final String connectTimeoutFieldName;
+    private final String readTimeoutFieldName;
     private final long connectTimeoutMillis;
     private final long readTimeoutMillis;
-    
-    public OkHttpTimeoutTransformer(long connectTimeoutMillis, long readTimeoutMillis) {
+
+    public UpdateFieldsInConstructorTimeoutTransformer(String className, String connectTimeoutFieldName,
+            String readTimeoutFieldName, long connectTimeoutMillis, long readTimeoutMillis) {
+
+        this.className = className;
+        this.connectTimeoutFieldName = connectTimeoutFieldName;
+        this.readTimeoutFieldName = readTimeoutFieldName;
         this.connectTimeoutMillis = connectTimeoutMillis;
         this.readTimeoutMillis = readTimeoutMillis;
     }
@@ -48,15 +51,15 @@ public class OkHttpTimeoutTransformer implements ClassFileTransformer {
     public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
             ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
         try {
-            if ( REQUEST_CONFIG_BUILDER_CLASS_NAME.equals(className) ) {
+            if ( this.className.equals(className) ) {
                 Log.get().log("%s asked to transform %s", getClass().getSimpleName(), className);
                 
                 ClassPool defaultPool = ClassPool.getDefault();
                 CtClass cc = defaultPool.get(Descriptor.toJavaName(className));
                 
                 CtConstructor noArgCtor = cc.getConstructor(Descriptor.ofConstructor(new CtClass[0]));
-                CtField connectTimeout = cc.getDeclaredField("connectTimeout");
-                CtField readTimeout = cc.getDeclaredField("readTimeout");
+                CtField connectTimeout = cc.getDeclaredField(connectTimeoutFieldName);
+                CtField readTimeout = cc.getDeclaredField(readTimeoutFieldName);
                 noArgCtor.insertAfter("this." + connectTimeout.getName() + " = " + connectTimeoutMillis + ";");
                 noArgCtor.insertAfter("this." + readTimeout.getName() + " = " + readTimeoutMillis + ";");
                 
@@ -70,5 +73,4 @@ public class OkHttpTimeoutTransformer implements ClassFileTransformer {
             return null;
         }
     }
-
 }