blob: 69da2eff5a606651a42511163e842eaf1a88902e [file] [log] [blame]
package com.intellij.remoteServer.agent.impl;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.remoteServer.agent.RemoteAgent;
import com.intellij.remoteServer.agent.RemoteAgentManager;
import com.intellij.remoteServer.agent.RemoteAgentProxyFactory;
import com.intellij.util.Base64;
import com.intellij.util.PathUtil;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* @author michael.golubev
*/
public class RemoteAgentManagerImpl extends RemoteAgentManager {
private final RemoteAgentClassLoaderCache myClassLoaderCache = new RemoteAgentClassLoaderCache();
@Override
public <T extends RemoteAgent> T createAgent(RemoteAgentProxyFactory agentProxyFactory,
List<File> instanceLibraries,
List<Class<?>> commonJarClasses,
String specificsRuntimeModuleName,
String specificsBuildJarPath,
Class<T> agentInterface,
String agentClassName,
Class<?> pluginClass) throws Exception {
List<Class<?>> allCommonJarClasses = new ArrayList<Class<?>>();
allCommonJarClasses.addAll(commonJarClasses);
allCommonJarClasses.add(RemoteAgent.class);
allCommonJarClasses.add(Base64.class);
allCommonJarClasses.add(agentInterface);
List<File> libraries = new ArrayList<File>();
libraries.addAll(instanceLibraries);
for (Class<?> clazz : allCommonJarClasses) {
libraries.add(new File(PathUtil.getJarPathForClass(clazz)));
}
File plugin = new File(PathUtil.getJarPathForClass(pluginClass));
String allPluginsDir = plugin.getParent();
if (plugin.isDirectory()) {
// runtime behavior
File specificsModule = new File(allPluginsDir, specificsRuntimeModuleName);
libraries.add(specificsModule);
}
else {
// build behavior
File specificsDir = new File(allPluginsDir, FileUtil.toSystemDependentName(specificsBuildJarPath));
libraries.add(specificsDir);
}
return agentProxyFactory.createProxy(libraries, agentInterface, agentClassName);
}
public RemoteAgentProxyFactory createReflectiveThreadProxyFactory(ClassLoader callerClassLoader) {
return new RemoteAgentReflectiveThreadProxyFactory(myClassLoaderCache, callerClassLoader);
}
}