From e52e4c5717d40e7a895416a1c3053cf2c148f06d Mon Sep 17 00:00:00 2001 From: Costin Leau Date: Thu, 12 Nov 2009 02:31:50 +0000 Subject: [PATCH] + commit actual jboss adapter --- .../jboss/JBossTranslatorAdapter.java | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBossTranslatorAdapter.java diff --git a/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBossTranslatorAdapter.java b/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBossTranslatorAdapter.java new file mode 100644 index 00000000000..6b134afa18e --- /dev/null +++ b/org.springframework.context/src/main/java/org/springframework/instrument/classloading/jboss/JBossTranslatorAdapter.java @@ -0,0 +1,81 @@ +/* + * Copyright 2006-2009 the original author or authors. + * + * Licensed 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.springframework.instrument.classloading.jboss; + +import java.lang.instrument.ClassFileTransformer; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.security.ProtectionDomain; + +/** + * Adapter that implements JBoss Translator interface, delegating to a + * standard JDK {@link ClassFileTransformer} underneath. + * + *

To avoid compile time checks again the vendor API, a dynamic proxy is + * being used. + * + * @author Costin Leau + */ +class JBossTranslatorAdapter implements InvocationHandler { + + private final ClassFileTransformer transformer; + + /** + * Creates a new {@link JBossTranslatorAdapter}. + * @param transformer the {@link ClassFileTransformer} to be adapted (must + * not be null) + */ + public JBossTranslatorAdapter(ClassFileTransformer transformer) { + this.transformer = transformer; + } + + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + String name = method.getName(); + + if ("equals".equals(name)) { + return (Boolean.valueOf(proxy == args[0])); + } else if ("hashCode".equals(name)) { + return hashCode(); + } else if ("toString".equals(name)) { + return toString(); + } else if ("transform".equals(name)) { + return transform((ClassLoader) args[0], (String) args[1], (Class) args[2], (ProtectionDomain) args[3], + (byte[]) args[4]); + } else if ("unregisterClassLoader".equals(name)) { + unregisterClassLoader((ClassLoader) args[0]); + return null; + + } else { + throw new IllegalArgumentException("Unknown method: " + method); + } + } + + public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, + ProtectionDomain protectionDomain, byte[] classfileBuffer) throws Exception { + return transformer.transform(loader, className, classBeingRedefined, protectionDomain, classfileBuffer); + } + + public void unregisterClassLoader(ClassLoader loader) { + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(getClass().getName()); + builder.append(" for transformer: "); + builder.append(this.transformer); + return builder.toString(); + } +} \ No newline at end of file