/**************************************************************************************
* Copyright (c) Jonas Bon�r, Alexandre Vasseur. All rights reserved. *
* http://aspectwerkz.codehaus.org *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the LGPL license *
* a copy of which has been included with this distribution in the license.txt file. *
**************************************************************************************/
package org.codehaus.aspectwerkz.transform.inlining.deployer;
import org.codehaus.aspectwerkz.util.ContextClassLoader;
import org.codehaus.aspectwerkz.exception.WrappedRuntimeException;
/**
* Factory for the different redefiner implementations.
*
* @author <a href="mailto:jboner@codehaus.org">Jonas Bon�r </a>
*/
public class RedefinerFactory {
private static final String HOTSWAP_REDEFINER_CLASS_NAME =
"org.codehaus.aspectwerkz.extension.hotswap.HotSwapRedefiner";
private static final String JVMTI_REDEFINER_CLASS_NAME =
"org.codehaus.aspectwerkz.hook.JVMTIRedefiner";
/**
* Creates a new redefiner instance.
* Try first with JDK 5 and failover on Java 1.4 HotSwap (requires native AW module)
*
*
* @return the redefiner instance
*/
public static Redefiner newRedefiner(final Type type) {
if (type.equals(Type.HOTSWAP)) {
try {
Class redefinerClass = ContextClassLoader.forName(JVMTI_REDEFINER_CLASS_NAME);
return (Redefiner) redefinerClass.newInstance();
} catch (Throwable t) {
try {
Class redefinerClass = ContextClassLoader.forName(HOTSWAP_REDEFINER_CLASS_NAME);
return (Redefiner) redefinerClass.newInstance();
} catch (ClassNotFoundException e) {
// TODO this message will be wrong if Java 5 did not started a preMain
throw new WrappedRuntimeException(
"redefiner class [HotSwapRedefiner] could not be found on classpath, make sure you have the aspectwerkz extensions jar file in your classpath",
e
);
} catch (Exception e) {
// TODO this message will be wrong upon Java 5..
throw new WrappedRuntimeException("redefiner class [HotSwapRedefiner] could not be instantiated", e);
}
}
} else if (type.equals(Type.JVMTI)) {
throw new UnsupportedOperationException("JVMTI is not supported yet");
} else {
throw new UnsupportedOperationException("unknown redefiner type: " + type.toString());
}
}
/**
* Type-safe enum for the different redefiner implementations.
*
* @author <a href="mailto:jboner@codehaus.org">Jonas Bon�r </a>
*/
public static class Type {
public static final Type HOTSWAP = new Type("HOTSWAP");
public static final Type JVMTI = new Type("JVMTI");
private final String m_name;
private Type(String name) {
m_name = name;
}
public String toString() {
return m_name;
}
}
}