package org.hotswap.agent.plugin.elresolver;
import java.lang.reflect.Method;
import java.util.Set;
import org.hotswap.agent.command.MergeableCommand;
import org.hotswap.agent.logging.AgentLogger;
/**
* Purge caches in registered class loaders. It calls __purgeClassCache(...) injected to BeanELResolver in ELResolverPlugin.
*
*/
public class PurgeBeanELResolverCacheCommand extends MergeableCommand {
private static AgentLogger LOGGER = AgentLogger.getLogger(PurgeBeanELResolverCacheCommand.class);
private ClassLoader appClassLoader;
private Set<Object> registeredBeanELResolvers;
public PurgeBeanELResolverCacheCommand(ClassLoader appClassLoader, Set<Object> registeredBeanELResolvers)
{
this.appClassLoader = appClassLoader;
this.registeredBeanELResolvers = registeredBeanELResolvers;
}
@Override
public void executeCommand() {
LOGGER.debug("Purging BeanELResolver cache.");
try {
Class<?> beanElResolverClass = Class.forName("javax.el.BeanELResolver", true, appClassLoader);
Method beanElResolverMethod = beanElResolverClass.getDeclaredMethod(ELResolverPlugin.PURGE_CLASS_CACHE_METHOD_NAME, ClassLoader.class);
for (Object registeredBeanELResolver : registeredBeanELResolvers) {
beanElResolverMethod.invoke(registeredBeanELResolver, appClassLoader);
}
} catch (ClassNotFoundException e) {
LOGGER.debug("BeanELResolver class not found in class loader {}.", appClassLoader);
} catch (Exception e) {
LOGGER.error("Error purging BeanELResolver cache.", e);
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PurgeBeanELResolverCacheCommand that = (PurgeBeanELResolverCacheCommand) o;
if (!appClassLoader.equals(that.appClassLoader)) return false;
return true;
}
@Override
public int hashCode() {
int result = appClassLoader.hashCode();
return result;
}
@Override
public String toString() {
return "PurgeBeanELResolverCacheCommand{" + "appClassLoader=" + appClassLoader + '}';
}
}