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;
}
}
-
}