package org.nodeclipse.ui.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.FileLocator;
import org.nodeclipse.ui.Activator;
import org.nodeclipse.ui.preferences.PreferenceConstants;
import org.osgi.framework.Bundle;
/**
* @author ?
* @author Tomoyuki Inagaki
* @author Paul Verest
*/
public class ProcessUtils {
public static String getNodePath() {
return Activator.getDefault().getPreferenceStore()
.getString(PreferenceConstants.NODE_PATH);
}
public static String getNodeFolder() {
String nodePath = getNodePath();
return nodePath.substring(0, nodePath.lastIndexOf(File.separator));
}
public static String getNpmPath() {
String nodePath = Activator.getDefault().getPreferenceStore()
.getString(PreferenceConstants.NODE_PATH);
String npmPath = nodePath.substring(0,
nodePath.lastIndexOf(File.separator) + 1);
if (OSUtils.isWindows()) {
return npmPath + Constants.NPM_CMD;
} else {
return npmPath + Constants.NPM;
}
}
public static String getExpressPath() {
return Activator.getDefault().getPreferenceStore()
.getString(PreferenceConstants.EXPRESS_PATH);
}
public static String getExpressVersion() {
return Activator.getDefault().getPreferenceStore()
.getString(PreferenceConstants.EXPRESS_VERSION);
}
/* actually getting from PreferenceConstants.EXPRESS_VERSION */
public static int getExpressMajorVersion() {
String ver = getExpressVersion();
int idx = ver.indexOf('.');
if(idx < 0) {
return 3;
}
ver = ver.substring(0, idx);
int ret = Integer.parseInt(ver);
return ret;
}
public static String getCurrentVersionOf(String nodeAppPath) {
List<String> cmdLine = new ArrayList<String>();
cmdLine.add(getNodePath());
cmdLine.add(nodeAppPath);
cmdLine.add("--version");
String ret = Constants.BLANK_STRING;
try {
ret = exec(cmdLine, null);
} catch (InvocationTargetException e) {
NodeclipseConsole.write(e.getLocalizedMessage()+"\n");
}
return ret;
}
public static String getCompletionsJsonPath() {
return Activator.getDefault().getPreferenceStore()
.getString(PreferenceConstants.COMPLETIONS_JSON_PATH);
}
/**
* @return existing lib folder in Node.js sources, "" otherwise
*/
public static String getSourcesLibPath() {
String path = Activator.getDefault().getPreferenceStore()
.getString(PreferenceConstants.NODE_SOURCES_PATH);
if (! "".equals(path)){
path += "/lib/".replace('/', File.separatorChar);
}
// TODO //if (workspace.validateLinkLocation(location).isOK()) {
return path;
}
public static String getSourcesAllJsonPath() {
String path = Activator.getDefault().getPreferenceStore()
.getString(PreferenceConstants.NODE_SOURCES_PATH);
if (! "".equals(path)){
path += "/doc/api/all.json".replace('/', File.separatorChar);
}
// TODO check if exists
return path;
}
public static String getBundledExpressPath() {
try {
Class clazz = Class.forName("org.nodeclipse.bundle.express.BundlePath");
Method m = clazz.getMethod("getPath");
String path = (String)m.invoke(clazz, null);
return path;
} catch (Exception e) {
}
return "";
// return getBundledPath("node_modules/express/bin/express");
}
public static String getBundledCoffeePath() {
try {
Class clazz = Class.forName("org.nodeclipse.bundle.coffee.BundlePath");
Method m = clazz.getMethod("getPath");
String path = (String)m.invoke(clazz, null);
return path;
} catch (Exception e) {
}
return "";
// return getBundledPath("node_modules/coffee-script/bin/coffee");
}
public static String getBundledPath(String path) {
Bundle bundle = Activator.getDefault().getBundle();
if (bundle == null) {
LogUtil.info("getBundlePath(" + path + " bundle is null");
return "";
}
try {
URL location = FileLocator.toFileURL(bundle.getEntry("/"));
File file = new File(location.getPath(), path);
LogUtil.info("BundledPath: " + file.getAbsolutePath());
return file.getAbsolutePath();
} catch(Exception ex) {
LogUtil.error(ex);
return "";
}
}
public static boolean npmInstall(String name) {
List<String> cmdLine = new ArrayList<String>();
cmdLine.add("sudo");
cmdLine.add(getNpmPath());
cmdLine.add("install");
cmdLine.add("-g");
cmdLine.add(name);
try {
exec(cmdLine, null);
} catch(InvocationTargetException ex) {
ex.printStackTrace();
return false;
}
return true;
}
/* run command and return output as String*/
public static String exec(List<String> cmdLine, File dir)
throws InvocationTargetException {
String[] cmds = {};
cmds = cmdLine.toArray(cmds);
ProcessBuilder builder = new ProcessBuilder(cmds);
if (dir != null) {
builder.directory(dir);
}
if(OSUtils.isMacOS()) {
Map<String, String> env = builder.environment();
env.put("PATH", getNodeFolder());
}
StringBuilder sb = new StringBuilder();
try {
Process p = builder.start();
String line;
BufferedReader bri = new BufferedReader(
new InputStreamReader(p.getInputStream()));
BufferedReader bre = new BufferedReader(
new InputStreamReader(p.getErrorStream()));
while ((line = bri.readLine()) != null) {
sb.append(line);
System.out.println(line);
}
bri.close();
while ((line = bre.readLine()) != null) {
sb.append(line);
System.out.println(line);
}
bre.close();
p.waitFor();
} catch (Exception e) {
throw new InvocationTargetException(e);
}
return sb.toString();
}
}