package org.hotswap.agent.plugin.deltaspike.proxy;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.hotswap.agent.command.MergeableCommand;
import org.hotswap.agent.logging.AgentLogger;
public class PartialBeanClassRefreshCommand extends MergeableCommand {
private static AgentLogger LOGGER = AgentLogger.getLogger(PartialBeanClassRefreshCommand.class);
ClassLoader classLoader;
Object partialBean;
String className;
Object repositoryComponent;
public PartialBeanClassRefreshCommand(ClassLoader classLoader, Object partialBean, String className) {
this.classLoader = classLoader;
this.partialBean = partialBean;
this.className = className;
}
public void setRepositoryComponent(Object repositoryComponent) {
this.repositoryComponent = repositoryComponent;
}
@Override
public void executeCommand() {
boolean reloaded = false;
try {
LOGGER.debug("Executing PartialBeanClassRefreshAgent.refreshPartialBeanClass('{}')", className);
Class<?> agentClazz = Class.forName(PartialBeanClassRefreshAgent.class.getName(), true, classLoader);
Method m = agentClazz.getDeclaredMethod("refreshPartialBeanClass", new Class[] {ClassLoader.class, Object.class});
m.invoke(null, classLoader, partialBean);
reloaded = true;
} catch (NoSuchMethodException e) {
throw new IllegalStateException("Plugin error, method not found", e);
} catch (InvocationTargetException e) {
LOGGER.error("Error refreshing class {} in classLoader {}", e, className, classLoader);
} catch (IllegalAccessException e) {
throw new IllegalStateException("Plugin error, illegal access", e);
} catch (ClassNotFoundException e) {
throw new IllegalStateException("Plugin error, CDI class not found in classloader", e);
}
if (reloaded) {
if (repositoryComponent != null) {
try {
Method reinitializeMethod = resolveClass("org.apache.deltaspike.data.impl.meta.RepositoryComponent").getDeclaredMethod("__reinitialize");
reinitializeMethod.invoke(repositoryComponent);
} catch (Exception e) {
LOGGER.error("Error reinitializing repository {}", e, className);
}
}
}
}
private Class<?> resolveClass(String name) throws ClassNotFoundException {
return Class.forName(name, true, classLoader);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PartialBeanClassRefreshCommand that = (PartialBeanClassRefreshCommand) o;
if (!classLoader.equals(that.classLoader)) return false;
if (!partialBean.equals(that.partialBean)) return false;
return true;
}
@Override
public int hashCode() {
int result = classLoader.hashCode();
result = 31 * result + partialBean.hashCode();
return result;
}
@Override
public String toString() {
return "PartialBeanClassRefreshCommand{" +
"classLoader=" + classLoader +
", partialBean='" + partialBean + '\'' +
'}';
}
}