package org.rzo.yajsw.os.posix.bsd;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.rzo.yajsw.boot.WrapperLoader;
import org.rzo.yajsw.io.CyclicBufferFileInputStream;
import org.rzo.yajsw.io.CyclicBufferFilePrintStream;
import org.rzo.yajsw.os.OperatingSystem;
import org.rzo.yajsw.os.Process;
import org.rzo.yajsw.os.posix.PosixProcess;
import com.sun.jna.ptr.IntByReference;
public class BSDProcess extends PosixProcess
{
java.lang.Process _process;
public boolean start()
{
_terminated = false;
_exitCode = -1;
ArrayList<String> cmdList = new ArrayList();
cmdList.add(getCurrentJava());
cmdList.add("-classpath");
cmdList.add(getStartClasspath());
if (_pipeStreams)
cmdList.add("-Dwrapperx.pipeStreams=true");
if (_user != null)
cmdList.add("-Dwrapperx.user=" + _user);
if (_password != null)
cmdList.add("-Dwrapperx.password=" + _password);
String[] xenv = getXEnv();
cmdList.add(AppStarter.class.getName());
for (int i = 0; i < _arrCmd.length; i++)
cmdList.add(_arrCmd[i]);
String[] cmd = new String[cmdList.size()];
for (int i = 0; i < cmd.length; i++)
{
cmd[i] = cmdList.get(i);
System.out.print(cmd[i] + " ");
}
System.out.println();
System.out.flush();
final java.lang.Process p;
try
{
p = Runtime.getRuntime().exec(cmd, xenv, new File(_workingDir));
}
catch (IOException e)
{
e.printStackTrace();
_terminated = true;
return false;
}
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
try
{
do
{
line = in.readLine();
if (line != null && line.contains("PID:"))
{
setPid(Integer.parseInt(line.substring(4)));
line = null;
}
else
System.out.println(line);
}
while (line != null);
}
catch (IOException e)
{
e.printStackTrace();
_terminated = true;
return false;
}
_process = p;
executor.execute(new Runnable()
{
public void run()
{
try
{
p.waitFor();
}
catch (InterruptedException e)
{
e.printStackTrace();
Thread.currentThread().interrupt();
}
_terminated = true;
_exitCode = p.exitValue();
System.out.println("exit code bsd process " + _exitCode);
BSDProcess.this.setTerminated(true);
}
});
if (_teeName != null && _tmpPath != null)
{
File f = new File(_tmpPath);
try
{
if (!f.exists())
f.mkdir();
}
catch (Exception ex)
{
ex.printStackTrace();
}
try
{
// System.out.println("opening tee streams out");
_inputStream = new CyclicBufferFileInputStream(createRWfile(_tmpPath, "out_" + _teeName));
}
catch (Exception e)
{
e.printStackTrace();
}
try
{
// System.out.println("opening tee streams err");
_errorStream = new CyclicBufferFileInputStream(createRWfile(_tmpPath, "err_" + _teeName));
}
catch (Exception e)
{
e.printStackTrace();
}
try
{
// System.out.println("opening tee streams in");
_outputStream = new CyclicBufferFilePrintStream(createRWfile(_tmpPath, "in_" + _teeName));
}
catch (Exception e)
{
e.printStackTrace();
}
}
if (_pipeStreams && _teeName == null && _tmpPath == null)
{
_outputStream = _process.getOutputStream();
_inputStream = _process.getInputStream();
_errorStream = _process.getErrorStream();
}
if (_cpuAffinity != AFFINITY_UNDEFINED)
{
IntByReference affinity = new IntByReference();
affinity.setValue(_cpuAffinity);
if (CLibrary.INSTANCE.sched_setaffinity(_pid, 4, affinity) == -1)
System.out.println("error setting affinity");
}
System.out.println("started process " + _pid);
return true;
}
private String[] getXEnv()
{
List<String[]> env = getEnvironment();
if (env != null && !env.isEmpty())
{
String [] result = new String[env.size()];
int i = 0;
for (String[] x : env)
{
result[i] = x[0]+"="+x[1];
System.out.println("bsd env "+result[i]);
i++;
}
return result;
}
return null;
}
private String getStartClasspath()
{
String wrapperJar = WrapperLoader.getWrapperJar();
File wrapperHome = new File(wrapperJar).getParentFile();
File jnaFile = new File(wrapperHome, "lib/core/jna/jna-3.3.0.jar");
try
{
return wrapperJar + ":" + jnaFile.getCanonicalPath();
}
catch (IOException e)
{
e.printStackTrace();
}
return null;
}
private String getCurrentJava()
{
int myPid = OperatingSystem.instance().processManagerInstance().currentProcessId();
Process myProcess = OperatingSystem.instance().processManagerInstance().getProcess(myPid);
String cmd = myProcess.getCommand();
String jvm = null;
if (cmd.startsWith("\""))
jvm = cmd.substring(0, cmd.indexOf("\" ") + 1);
else
jvm = cmd.substring(0, cmd.indexOf(" "));
return jvm;
}
public String getCommandInternal()
{
if (_pid < 0)
return null;
String cmd = String.format("ps -p %1$s -o command", _pid);
String res = _utils.osCommand(cmd, 5000);
if (res == null)
return null;
String[] resx = res.split(System.getProperty("line.separator"));
return resx[1];
}
public String getUserInternal()
{
if (_pid < 0)
return null;
String cmd = String.format("ps -p %1$s -o user", _pid);
String res = _utils.osCommand(cmd, 5000);
if (res == null)
return null;
String[] resx = res.split(System.getProperty("line.separator"));
return resx[1];
}
public String getWorkingDirInternal()
{
if (_pid < 0)
return null;
return null;
}
public static Process getProcess(int pid)
{
BSDProcess result = null;
result = new BSDProcess();
result.setPid(pid);
result.setUser(result.getUserInternal());
result.setCommand(result.getCommandInternal());
result.setWorkingDir(result.getWorkingDirInternal());
if (result.getCommand() == null)
return null;
return result;
}
public static void main(String[] args)
{
BSDProcess p = new BSDProcess();
System.out.println(p.getCurrentJava());
p.setCommand(new String[]
{ "ping", "localhost" });
p.setPipeStreams(true, false);
p.start();
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
try
{
do
{
line = in.readLine();
System.out.println(line);
}
while (line != null);
}
catch (IOException e)
{
e.printStackTrace();
}
}
}