bb8f62966e2164cf53a8fd07fd9f2bf2299b28d0
[idea/community.git] / java / execution / impl / src / com / intellij / execution / util / JavaParametersUtil.java
1 /*
2  * Copyright 2000-2011 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.execution.util;
17
18 import com.intellij.execution.CantRunException;
19 import com.intellij.execution.CommonJavaRunConfigurationParameters;
20 import com.intellij.execution.JavaExecutionUtil;
21 import com.intellij.execution.configurations.JavaParameters;
22 import com.intellij.execution.configurations.RunConfigurationModule;
23 import com.intellij.execution.configurations.SimpleJavaParameters;
24 import com.intellij.execution.junit.JUnitUtil;
25 import com.intellij.openapi.module.Module;
26 import com.intellij.openapi.project.Project;
27 import com.intellij.openapi.projectRoots.JavaSdk;
28 import com.intellij.openapi.projectRoots.Sdk;
29 import com.intellij.openapi.projectRoots.ex.PathUtilEx;
30 import com.intellij.openapi.roots.ModuleRootManager;
31 import com.intellij.openapi.util.text.StringUtil;
32 import com.intellij.openapi.vfs.VirtualFile;
33 import com.intellij.psi.PsiClass;
34 import com.intellij.psi.PsiFile;
35
36 import java.util.Map;
37
38 /**
39  * @author lex
40  * @since Nov 26, 2003
41  */
42 public class JavaParametersUtil {
43   private JavaParametersUtil() { }
44
45   public static void configureConfiguration(SimpleJavaParameters parameters, CommonJavaRunConfigurationParameters configuration) {
46     ProgramParametersUtil.configureConfiguration(parameters, configuration);
47
48     Project project = configuration.getProject();
49     Module module = ProgramParametersUtil.getModule(configuration);
50
51     String vmParameters = configuration.getVMParameters();
52     if (vmParameters != null) {
53       vmParameters = ProgramParametersUtil.expandPath(vmParameters, module, project);
54
55       if (parameters.getEnv() != null) {
56         for (Map.Entry<String, String> each : parameters.getEnv().entrySet()) {
57           vmParameters = StringUtil.replace(vmParameters, "$" + each.getKey() + "$", each.getValue(), false); //replace env usages
58         }
59       }
60     }
61
62     parameters.getVMParametersList().addParametersString(vmParameters);
63   }
64
65   public static int getClasspathType(final RunConfigurationModule configurationModule, final String mainClassName,
66                                      final boolean classMustHaveSource) throws CantRunException {
67     final Module module = configurationModule.getModule();
68     if (module == null) throw CantRunException.noModuleConfigured(configurationModule.getModuleName());
69     final PsiClass psiClass = JavaExecutionUtil.findMainClass(module, mainClassName);
70     if (psiClass == null) {
71       if (!classMustHaveSource) return JavaParameters.JDK_AND_CLASSES_AND_TESTS;
72       throw CantRunException.classNotFound(mainClassName, module);
73     }
74     final PsiFile psiFile = psiClass.getContainingFile();
75     if (psiFile == null) throw CantRunException.classNotFound(mainClassName, module);
76     final VirtualFile virtualFile = psiFile.getVirtualFile();
77     if (virtualFile == null) throw CantRunException.classNotFound(mainClassName, module);
78     Module classModule = new JUnitUtil.ModuleOfClass().convert(psiClass);
79     if (classModule == null) classModule = module;
80     return ModuleRootManager.getInstance(classModule).getFileIndex().
81       isInTestSourceContent(virtualFile) ? JavaParameters.JDK_AND_CLASSES_AND_TESTS : JavaParameters.JDK_AND_CLASSES;
82   }
83
84   public static void configureModule(final RunConfigurationModule runConfigurationModule,
85                                      final JavaParameters parameters,
86                                      final int classPathType,
87                                      final String jreHome) throws CantRunException {
88     Module module = runConfigurationModule.getModule();
89     if (module == null) {
90       throw CantRunException.noModuleConfigured(runConfigurationModule.getModuleName());
91     }
92     configureModule(module, parameters, classPathType, jreHome);
93   }
94
95   public static void configureModule(Module module, JavaParameters parameters, int classPathType, String jreHome) throws CantRunException {
96     parameters.configureByModule(module, classPathType, createModuleJdk(module, jreHome));
97   }
98
99   public static void configureProject(Project project, final JavaParameters parameters, final int classPathType, final String jreHome)
100     throws CantRunException {
101     parameters.configureByProject(project, classPathType, createProjectJdk(project, jreHome));
102   }
103
104   private static Sdk createModuleJdk(final Module module, final String jreHome) throws CantRunException {
105     return jreHome == null ? JavaParameters.getModuleJdk(module) : createAlternativeJdk(jreHome);
106   }
107
108   private static Sdk createProjectJdk(final Project project, final String jreHome) throws CantRunException {
109     return jreHome == null ? createProjectJdk(project) : createAlternativeJdk(jreHome);
110   }
111
112   private static Sdk createProjectJdk(final Project project) throws CantRunException {
113     final Sdk jdk = PathUtilEx.getAnyJdk(project);
114     if (jdk == null) {
115       throw CantRunException.noJdkConfigured();
116     }
117     return jdk;
118   }
119
120   private static Sdk createAlternativeJdk(final String jreHome) throws CantRunException {
121     final Sdk jdk = JavaSdk.getInstance().createJdk("", jreHome);
122     if (jdk == null) throw CantRunException.noJdkConfigured();
123     return jdk;
124   }
125 }