package net.sf.hajdbc.util;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.PrivilegedExceptionAction;
import java.util.Map;
import net.sf.hajdbc.logging.Level;
import net.sf.hajdbc.logging.Logger;
import net.sf.hajdbc.logging.LoggerFactory;
import net.sf.hajdbc.messages.Messages;
import net.sf.hajdbc.messages.MessagesFactory;
public class Processes
{
private static final Messages messages = MessagesFactory.getMessages();
private static final Logger logger = LoggerFactory.getLogger(Processes.class);
public static Map<String, String> environment(final ProcessBuilder builder)
{
PrivilegedAction<Map<String, String>> action = new PrivilegedAction<Map<String, String>>()
{
@Override
public Map<String, String> run()
{
return builder.environment();
}
};
return AccessController.doPrivileged(action);
}
public static void run(final ProcessBuilder processBuilder) throws Exception
{
processBuilder.redirectErrorStream(true);
logger.log(Level.DEBUG, Strings.join(processBuilder.command(), " "));
PrivilegedExceptionAction<Process> action = new PrivilegedExceptionAction<Process>()
{
@Override
public Process run() throws Exception
{
return processBuilder.start();
}
};
Process process = AccessController.doPrivileged(action);
try
{
int status = process.waitFor();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = reader.readLine();
while (line != null)
{
logger.log(Level.DEBUG, line);
line = reader.readLine();
}
if (status != 0)
{
throw new Exception(messages.status(processBuilder, status));
}
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
throw new Exception(processBuilder.toString(), e);
}
}
private Processes()
{
// Hide
}
}