blob: 5cef06dbab948e0ab331b5209da04b6a9557be73 [file] [log] [blame]
/*
* Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.compiler.server.impl;
import com.intellij.compiler.server.BuildProcessParametersProvider;
import com.intellij.compiler.server.CompileServerPlugin;
import com.intellij.ide.plugins.IdeaPluginDescriptor;
import com.intellij.ide.plugins.PluginManager;
import com.intellij.openapi.application.PluginPathManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.PluginId;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.PathUtil;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.List;
/**
* @author nik
*/
public class BuildProcessClasspathManager {
private static final Logger LOG = Logger.getInstance("#com.intellij.compiler.server.impl.BuildProcessClasspathManager");
private List<String> myCompileServerPluginsClasspath;
public List<String> getBuildProcessPluginsClasspath(Project project) {
List<String> staticClasspath = getStaticClasspath();
List<String> dynamicClasspath = getDynamicClasspath(project);
if (dynamicClasspath.isEmpty()) {
return staticClasspath;
}
else {
dynamicClasspath.addAll(staticClasspath);
return dynamicClasspath;
}
}
private List<String> getStaticClasspath() {
if (myCompileServerPluginsClasspath == null) {
myCompileServerPluginsClasspath = computeCompileServerPluginsClasspath();
}
return myCompileServerPluginsClasspath;
}
private static List<String> computeCompileServerPluginsClasspath() {
final List<String> classpath = ContainerUtil.newArrayList();
for (CompileServerPlugin serverPlugin : CompileServerPlugin.EP_NAME.getExtensions()) {
final PluginId pluginId = serverPlugin.getPluginDescriptor().getPluginId();
final IdeaPluginDescriptor plugin = PluginManager.getPlugin(pluginId);
LOG.assertTrue(plugin != null, pluginId);
final File baseFile = plugin.getPath();
if (baseFile.isFile()) {
classpath.add(baseFile.getPath());
}
else if (baseFile.isDirectory()) {
for (String relativePath : StringUtil.split(serverPlugin.getClasspath(), ";")) {
final File jarFile = new File(new File(baseFile, "lib"), relativePath);
File classesDir = new File(baseFile, "classes");
if (jarFile.exists()) {
classpath.add(jarFile.getPath());
}
else if (classesDir.isDirectory()) {
//'plugin run configuration': all module output are copied to 'classes' folder
classpath.add(classesDir.getPath());
}
else {
//development mode: add directory out/classes/production/<jar-name> to classpath, assuming that jar-name is equal to module name
final String moduleName = FileUtil.getNameWithoutExtension(PathUtil.getFileName(relativePath));
File baseOutputDir = baseFile.getParentFile();
if (baseOutputDir.getName().equals("test")) {
baseOutputDir = new File(baseOutputDir.getParentFile(), "production");
}
final File dir = new File(baseOutputDir, moduleName);
if (dir.exists()) {
classpath.add(dir.getPath());
}
else {
//looks like <jar-name> refers to a library, try to find it under <plugin-dir>/lib
File pluginDir = getPluginDir(plugin);
if (pluginDir != null) {
File libraryFile = new File(pluginDir, "lib" + File.separator + PathUtil.getFileName(relativePath));
if (libraryFile.exists()) {
classpath.add(libraryFile.getPath());
}
else {
LOG.error("Cannot add " + relativePath + " from plugin '" + plugin.getName() + "' to external compiler classpath: " +
"library " + libraryFile.getAbsolutePath() + " not found");
}
}
else {
LOG.error("Cannot add " + relativePath + " from plugin '" + plugin.getName() +
"' to external compiler classpath: home directory of plugin not found");
}
}
}
}
}
}
return classpath;
}
@Nullable
private static File getPluginDir(IdeaPluginDescriptor plugin) {
String pluginDirName = StringUtil.getShortName(plugin.getPluginId().getIdString());
String extraDir = System.getProperty("idea.external.build.development.plugins.dir");
if (extraDir != null) {
File extraDirFile = new File(extraDir, pluginDirName);
if (extraDirFile.isDirectory()) {
return extraDirFile;
}
}
File pluginHome = PluginPathManager.getPluginHome(pluginDirName);
if (!pluginHome.isDirectory() && StringUtil.isCapitalized(pluginDirName)) {
pluginHome = PluginPathManager.getPluginHome(StringUtil.decapitalize(pluginDirName));
}
return pluginHome.isDirectory() ? pluginHome : null;
}
private static List<String> getDynamicClasspath(Project project) {
final List<String> classpath = ContainerUtil.newArrayList();
for (BuildProcessParametersProvider provider : project.getExtensions(BuildProcessParametersProvider.EP_NAME)) {
classpath.addAll(provider.getClassPath());
}
return classpath;
}
public static List<String> getLauncherClasspath(Project project) {
final List<String> classpath = ContainerUtil.newArrayList();
for (BuildProcessParametersProvider provider : project.getExtensions(BuildProcessParametersProvider.EP_NAME)) {
classpath.addAll(provider.getLauncherClassPath());
}
return classpath;
}
}