package org.nodeclipse.enide.maven.launch; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Platform; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.model.ILaunchConfigurationDelegate; import org.eclipse.debug.core.model.RuntimeProcess; import org.eclipse.jface.preference.IPreferenceStore; import org.nodeclipse.common.preferences.CommonDialogs; import org.nodeclipse.enide.maven.Activator; import org.nodeclipse.enide.maven.preferences.MavenConstants; import org.nodeclipse.enide.maven.util.NodeclipseLogger; import org.nodeclipse.enide.maven.util.VariablesUtil; /** * pom.xml Run As Maven build<br> * see LaunchConfigurationDelegate in .debug and .phantomjs, .jjs module for comparison. * * @since 0.10 * @author Paul Verest */ public class LaunchConfigurationDelegate implements ILaunchConfigurationDelegate { boolean isWindows = Platform.getOS().startsWith("win"); IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore(); protected File workingDirectoryDefault = null; //is different for different launch types private boolean warned = false; //DONE shared processing function for 2 launch types. @Override public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException { //{ copy-paste part //IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore(); // Using configuration to build command line List<String> cmdLine = new ArrayList<String>(); // Maven home to use is stored in preference. //String mavenPath = preferenceStore.getString(MavenConstants.MAVEN_PATH); String mavenHomeToUse = preferenceStore.getString(MavenConstants.MAVEN_HOME_TO_USE); String mavenPath = mavenHomeToUse+ (isWindows?"\\bin\\mvn.bat":"/bin/mvn"); // Check if the maven location is correctly configured File mavenFile = new File(mavenPath); if( ("".equals(mavenHomeToUse)) || (!mavenFile.exists()) ){ // If the location is not valid than show a dialog which prompts the user to goto the preferences page CommonDialogs.showPreferencesDialog(MavenConstants.PREFERENCES_PAGE, "Maven home to use is not correctly configured.\n\n" + "Please goto Window -> Preferences -> "+MavenConstants.PREFERENCE_PAGE_NAME +" and configure the correct location"); return; } cmdLine.add(mavenPath); if (preferenceStore.getBoolean(MavenConstants.MAVEN_OPTION_SHOW_VERSION)) cmdLine.add("-V"); //-V, --show-version if (preferenceStore.getBoolean(MavenConstants.MAVEN_OPTION_DEBUG)) cmdLine.add("-X"); if (preferenceStore.getBoolean(MavenConstants.MAVEN_OPTION_QUIET)) cmdLine.add("-q"); if (preferenceStore.getBoolean(MavenConstants.MAVEN_OPTION_FORCED_DEPENDENCIES_UPDATE)) cmdLine.add("-U"); if (preferenceStore.getBoolean(MavenConstants.MAVEN_OPTION_OFFLINE)) cmdLine.add("-o"); if (preferenceStore.getBoolean(MavenConstants.MAVEN_OPTION_TEST_SKIP)) cmdLine.add("-Dmaven.test.skip=true"); // TODO won't be so simple on Windows! String mavenOptionAlternativeSettings = preferenceStore.getString(MavenConstants.MAVEN_OPTION_ALTERNATIVE_SETTINGS); if( !"".equals(mavenOptionAlternativeSettings) ){ // Check if the settings.xml location is correctly configured File mavenOptionAlternativeSettingsFile = new File(mavenOptionAlternativeSettings); if(!mavenOptionAlternativeSettingsFile.exists()){ // If the location is not valid than show a dialog which prompts the user to goto the preferences page CommonDialogs.showPreferencesDialog(MavenConstants.PREFERENCES_PAGE, "Alternative settings.xml location is not correctly configured.\n\n" + "Please goto Window -> Preferences -> "+MavenConstants.PREFERENCE_PAGE_NAME +" and configure the correct location"); return; } cmdLine.add("-s "+mavenOptionAlternativeSettings); } //} copy-paste part specialOptions(configuration, preferenceStore, cmdLine); launchTail(cmdLine,configuration,launch); } // -f pom.xml package protected void specialOptions(ILaunchConfiguration configuration, IPreferenceStore preferenceStore, List<String> cmdLine) throws CoreException { // special for `mvn package` String mavenOptions= preferenceStore.getString(MavenConstants.MAVEN_OPTIONS); if(!mavenOptions.equals("")) { String[] sa = mavenOptions.split(" "); for(String s : sa) { cmdLine.add(s); } } String file = configuration.getAttribute("KEY_FILE_PATH", ""); String filePath = ResourcesPlugin.getWorkspace().getRoot().findMember(file).getLocation().toOSString(); // path is relative, so cannot find it, unless get absolute path cmdLine.add("-f"); // -f,--file <arg> Force the use of an alternate POM cmdLine.add(filePath); cmdLine.add("package"); //workingPath = (new File(filePath)).getParentFile(); //setWorkingDirectoryDefault(filePath); workingDirectoryDefault = (new File(filePath)).getParentFile(); } // protected File getWorkingDirectoryDefault(String filePath){ // return (new File(filePath)).getParentFile(); //} // protected void setWorkingDirectoryDefault(String filePath){ // workingDirectoryDefault = (new File(filePath)).getParentFile(); // } // protected File getWorkingDirectoryDefault(){ // return workingDirectoryDefault; // } protected void launchTail( List<String> cmdLine, ILaunchConfiguration configuration, //String mode, ILaunch launch //, IProgressMonitor monitor ) throws CoreException { //{ copy-paste tail part //TODO rename workingPath to workingDirectory, workingDirectory to workingDirectoryConfig //workingDirectory is pom.xml location - differs : filePath File workingPath = null; String workingDirectory = configuration.getAttribute(MavenConstants.ATTR_WORKING_DIRECTORY, ""); if(workingDirectory.length() > 0) { workingDirectory = VariablesUtil.resolveValue(workingDirectory); if(workingDirectory != null) { workingPath = new File(workingDirectory); } } if (workingPath == null){ //workingPath = (new File(filePath)).getParentFile(); //File workingPath = getWorkingPath(configuration); //workingPath = getWorkingDirectoryDefault(); workingPath = workingDirectoryDefault; } //env String[] envp = getEnvironmentVariables(configuration); StringBuilder sb = new StringBuilder(100); for(String s : cmdLine) sb.append(s).append(' '); NodeclipseLogger.log(sb.append('\n').toString()); String[] cmds = {}; cmds = cmdLine.toArray(cmds); // Launch a process to debug.eg, Process p = DebugPlugin.exec(cmds, workingPath, envp); RuntimeProcess process = (RuntimeProcess)DebugPlugin.newProcess(launch, p, MavenConstants.PROCESS_MESSAGE); //} copy-paste tail part } // protected String[] getEnvironmentVariables(ILaunchConfiguration configuration) throws CoreException { // return getEnvironmentVariables(configuration, null); // } /** Get EnvironmentVariables from ILaunchConfiguration * and adds JAVA_HOME, M2_HOME, PATH, TEMP, SystemDrive, HOME</br> * Used in .launch and .launchexec * @param configuration ILaunchConfiguration * @return String[] * @throws CoreException */ protected String[] getEnvironmentVariables(ILaunchConfiguration configuration) throws CoreException { //, IPreferenceStore preferenceStore Map<String, String> envm = new HashMap<String, String>(); envm = configuration.getAttribute(MavenConstants.ATTR_ENVIRONMENT_VARIABLES, envm); int envmSizeDelta = 4 + 2; Map<String,String> all = null; IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore(); boolean passAllEnvVars = preferenceStore.getBoolean(MavenConstants.PASS_ALL_ENVIRONMENT_VARIABLES);//@since 0.12 if (passAllEnvVars){ all = System.getenv(); envmSizeDelta = all.size(); } String[] envp = new String[envm.size() + (2+2) + envmSizeDelta]; int idx = 0; for(String key : envm.keySet()) { String value = envm.get(key); envp[idx++] = key + "=" + value; } // #137 String javaHomeToUse = preferenceStore.getString(MavenConstants.MAVEN_JAVA_HOME_TO_USE);//@since 0.15 if(!javaHomeToUse.equals("")) { envp[idx++] = "JAVA_HOME=" + javaHomeToUse; }else{ envp[idx++] = "JAVA_HOME=" + System.getProperty("java.home"); //System.getenv("JAVA_HOME"); } //ERROR: M2_HOME not found in your environment. //Please set the M2_HOME variable in your environment to match the //location of the Maven installation // note: MAVEN_HOME does not substitute M2_HOME when called from Java envp[idx++] = "M2_HOME=" + preferenceStore.getString(MavenConstants.MAVEN_HOME_TO_USE); envp[idx++] = "MAVEN_OPTS=" + preferenceStore.getString(MavenConstants.MAVEN_OPTS); envp[idx++] = getEnvVariableEqualsString("JAVA_OPTS"); if (passAllEnvVars){ for (Map.Entry<String, String> entry : all.entrySet()) { //System.out.println(entry.getKey() + "/" + entry.getValue()); envp[idx++] = entry.getKey() + "=" + entry.getValue(); } }else{ //+ #81 envp[idx++] = getEnvVariableEqualsString("PATH"); envp[idx++] = getEnvVariableEqualsString("TEMP"); envp[idx++] = getEnvVariableEqualsString("TMP"); envp[idx++] = getEnvVariableEqualsString("SystemDrive"); //+ envp[idx++] = getEnvVariableEqualsString("HOME"); envp[idx++] = getEnvVariableEqualsString("USERPROFILE"); } if (!warned ){ NodeclipseLogger.log(" Warning: JAVA_HOME, M2_HOME and others environment variables will be applied automatically to every `mvn` launch.\n"); StringBuilder sb = new StringBuilder(100); for(int i=0; i<envp.length; i++){ sb.append(" ").append(envp[i]).append('\n'); } NodeclipseLogger.log(sb.toString()); warned = true; } return envp; } protected String getEnvVariableEqualsString(String envvarName){ String envvarValue = System.getenv(envvarName); if (envvarValue==null) envvarValue = ""; return envvarName + "=" + envvarValue; } }