/*
* Copyright (C) 2014 Mark Clarke
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package za.co.jumpingbean.gc.service;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Mark Clarke
*/
public class ControlableProcess extends ProcessObject {
private final ProcessParams params;
private final Process process;
private final ProcOutputReaderList procOutputReader;
private BufferedReader reader;
public ControlableProcess(String name,Process proc, ProcessParams params,
ProcOutputReaderList output, JMXQueryRunner qry) {
super(name,qry);
this.process = proc;
this.params = params;
procOutputReader = output;
if (!params.getLogFilename().isEmpty()){
try {
reader = new BufferedReader(new FileReader(new File(params.getLogFilename())));
} catch (FileNotFoundException ex) {
reader=null;
System.out.println("log file not found");
}
}
}
public ProcessParams getParams() {
return params;
}
public Process getProcess() {
return process;
}
String getGCLogEntries(){
if (reader!=null){
try {
StringBuilder line=new StringBuilder();
String l = reader.readLine();
while(l!=null){
line.append(String.format("%s%n",l));
l = reader.readLine();
}
return line.toString();
} catch (IOException ex) {
System.out.println("Error reading line from log file");
return "";
}
}
return readProcessOutputLine();
}
String readProcessOutputLine() {
List<String> list = procOutputReader.readList();
if (list.isEmpty()){
return "";
}
StringBuilder str = new StringBuilder(200);
for (String tmpStr : list) {
str.append(String.format("%s%n",tmpStr));
}
return str.toString();
}
public void stop() {
this.procOutputReader.stop();
this.process.destroy();
try {
synchronized (process) {
process.wait(500L);
process.exitValue();
}
} catch (InterruptedException ex) {
Logger.getLogger(GeneratorService.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalThreadStateException ex) {
throw new IllegalStateException("failed to stop process" + process.toString());
}
}
}