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 <[email protected]> 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; } } - }
