package org.hotswap.agent.plugin.proxy;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.WeakHashMap;
import org.hotswap.agent.javassist.ClassPool;
import org.hotswap.agent.javassist.LoaderClassPath;
import org.hotswap.agent.logging.AgentLogger;
/**
*
* @author Erki Ehtla
*
*/
public class ProxyTransformationUtils {
private static AgentLogger LOGGER = AgentLogger.getLogger(ProxyTransformationUtils.class);
private static Map<ClassLoader, ClassPool> classPoolMap = new WeakHashMap<>(3);
/**
* Creates one ClassPool per ClassLoader and caches it
*
* @param classLoader
* @return
*/
public static ClassPool getClassPool(ClassLoader classLoader) {
ClassPool classPool = classPoolMap.get(classLoader);
if (classPool == null) {
synchronized (classPoolMap) {
classPool = classPoolMap.get(classLoader);
if (classPool == null) {
classPool = createClassPool(classLoader);
classPoolMap.put(classLoader, classPool);
}
}
}
return classPool;
}
/**
* Creates a ClassPool with supplied ClassLoader
*
* @param classLoader
* @return
*/
public static ClassPool createClassPool(final ClassLoader classLoader) {
ClassPool cp = new ClassPool() {
@Override
public ClassLoader getClassLoader() {
return classLoader;
}
};
cp.appendSystemPath();
if (classLoader != null) {
LOGGER.trace("Adding loader classpath " + classLoader);
cp.appendClassPath(new LoaderClassPath(classLoader));
}
return cp;
}
private static final int BUFFER_SIZE = 8192;
public static byte[] copyToByteArray(InputStream in) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream(BUFFER_SIZE);
try {
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead = -1;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
out.flush();
return out.toByteArray();
} finally {
try {
in.close();
} catch (IOException ex) {
}
try {
out.close();
} catch (IOException ex) {
}
}
}
}