/**
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
/*
* Created on 05/08/2005
*/
package org.python.pydev.runners;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.python.copiedfromeclipsesrc.JDTNotAvailableException;
import org.python.copiedfromeclipsesrc.JavaVmLocationFinder;
import org.python.pydev.core.ArrayUtils;
import org.python.pydev.core.IInterpreterManager;
import org.python.pydev.core.MisconfigurationException;
import org.python.pydev.core.docutils.StringUtils;
import org.python.pydev.plugin.PydevPlugin;
import org.python.pydev.plugin.nature.PythonNature;
import org.python.pydev.plugin.preferences.PydevPrefs;
import org.python.pydev.ui.pythonpathconf.InterpreterInfo;
import com.aptana.shared_core.string.FastStringBuffer;
import com.aptana.shared_core.structure.Tuple;
public class SimpleJythonRunner extends SimpleRunner {
/**
* Error risen when java is not available to the jython environment
*
* @author Fabio
*/
@SuppressWarnings("serial")
public static class JavaNotConfiguredException extends RuntimeException {
public JavaNotConfiguredException(String string) {
super(string);
}
}
public Tuple<String, String> runAndGetOutputWithJar(String script, String jythonJar, String[] args,
File workingDir, IProject project, IProgressMonitor monitor, String encoding) {
File javaExecutable = JavaVmLocationFinder.findDefaultJavaExecutable();
if (javaExecutable == null) {
throw new JavaNotConfiguredException(
"Error: the java environment must be configured before jython.\n\n"
+ "Please make sure that the java executable to be\nused is correctly configured in the preferences at:\n\n"
+ "Java > Installed JREs.");
}
return runAndGetOutputWithJar(javaExecutable, script, jythonJar, args, workingDir, project, monitor, null,
encoding);
}
public Tuple<String, String> runAndGetOutputWithJar(File javaExecutable, String script, String jythonJar,
String[] args, File workingDir, IProject project, IProgressMonitor monitor, String additionalPythonpath,
String encoding) {
//"C:\Program Files\Java\jdk1.5.0_04\bin\java.exe" "-Dpython.home=C:\bin\jython21"
//-classpath "C:\bin\jython21\jython.jar;%CLASSPATH%" org.python.util.jython %ARGS%
//used just for getting info without any classpath nor pythonpath
try {
String javaLoc = javaExecutable.getCanonicalPath();
String[] s;
//In Jython 2.5b0, if we don't set python.home, it won't be able to calculate the correct PYTHONPATH
//(see http://bugs.jython.org/issue1214 )
String pythonHome = new File(jythonJar).getParent().toString();
if (additionalPythonpath != null) {
jythonJar += SimpleRunner.getPythonPathSeparator();
jythonJar += additionalPythonpath;
s = new String[] { javaLoc, "-Dpython.path=" + additionalPythonpath, "-Dpython.home=" + pythonHome,
"-classpath", jythonJar, "org.python.util.jython", script };
} else {
s = new String[] { javaLoc, "-Dpython.home=" + pythonHome, "-classpath", jythonJar,
"org.python.util.jython", script };
}
if (args != null && args.length > 0) {
s = ArrayUtils.concatArrays(s, args);
}
return runAndGetOutput(s, workingDir, PythonNature.getPythonNature(project), monitor, encoding);
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static String[] makeExecutableCommandStr(String jythonJar, String script, String basePythonPath,
String... args) throws IOException, JDTNotAvailableException, MisconfigurationException {
return makeExecutableCommandStrWithVMArgs(jythonJar, script, basePythonPath, "", args);
}
/**
* @param script
* @return
* @throws IOException
* @throws MisconfigurationException
*/
public static String[] makeExecutableCommandStrWithVMArgs(String jythonJar, String script, String basePythonPath,
String vmArgs, String... args) throws IOException, JDTNotAvailableException, MisconfigurationException {
IInterpreterManager interpreterManager = PydevPlugin.getJythonInterpreterManager();
String javaLoc = JavaVmLocationFinder.findDefaultJavaExecutable().getCanonicalPath();
File file = new File(javaLoc);
if (file.exists() == false) {
throw new RuntimeException("The java location found does not exist. " + javaLoc);
}
if (file.isDirectory() == true) {
throw new RuntimeException("The java location found is a directory. " + javaLoc);
}
if (!new File(jythonJar).exists()) {
throw new RuntimeException(com.aptana.shared_core.string.StringUtils.format(
"Error. The default configured interpreter: %s does not exist!", jythonJar));
}
InterpreterInfo info = (InterpreterInfo) interpreterManager.getInterpreterInfo(jythonJar,
new NullProgressMonitor());
//pythonpath is: base path + libs path.
String libs = SimpleRunner.makePythonPathEnvFromPaths(info.libs);
FastStringBuffer jythonPath = new FastStringBuffer(basePythonPath, 128);
String pathSeparator = SimpleRunner.getPythonPathSeparator();
if (jythonPath.length() != 0) {
jythonPath.append(pathSeparator);
}
jythonPath.append(libs);
//may have the dir or be null
String cacheDir = null;
try {
cacheDir = PydevPrefs.getChainedPrefStore().getString(IInterpreterManager.JYTHON_CACHE_DIR);
} catch (NullPointerException e) {
//this may happen while running the tests... it should be ok.
cacheDir = null;
}
if (cacheDir != null && cacheDir.trim().length() == 0) {
cacheDir = null;
}
if (cacheDir != null) {
cacheDir = "-Dpython.cachedir=" + cacheDir.trim();
}
String[] s;
if (cacheDir != null) {
s = new String[] { javaLoc, cacheDir, "-Dpython.path=" + jythonPath.toString(), "-classpath",
jythonJar + pathSeparator + jythonPath, vmArgs, "org.python.util.jython", script };
} else {
s = new String[] { javaLoc,
//cacheDir, no cache dir if it's not available
"-Dpython.path=" + jythonPath.toString(), "-classpath", jythonJar + pathSeparator + jythonPath,
vmArgs, "org.python.util.jython", script };
}
List<String> asList = new ArrayList<String>(Arrays.asList(s));
asList.addAll(Arrays.asList(args));
return asList.toArray(new String[0]);
}
}