Changeset 31631
- Timestamp:
- 2017-04-21T20:00:54+12:00 (7 years ago)
- Location:
- main/trunk/greenstone3/src/java/org/greenstone
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
main/trunk/greenstone3/src/java/org/greenstone/gsdl3/build/GS2PerlConstructor.java
r31602 r31631 485 485 // handle each incoming line from stdout and stderr streams, and any exceptions that occur then 486 486 SafeProcess.CustomProcessHandler processOutHandler 487 = new SynchronizedProcessHandler(bw, S ynchronizedProcessHandler.STDOUT);487 = new SynchronizedProcessHandler(bw, SafeProcess.STDOUT); 488 488 SafeProcess.CustomProcessHandler processErrHandler 489 = new SynchronizedProcessHandler(bw, S ynchronizedProcessHandler.STDERR);489 = new SynchronizedProcessHandler(bw, SafeProcess.STDERR); 490 490 491 491 // GS2PerlConstructor will do further handling of exceptions that may occur during the perl … … 700 700 // exceptions when reading from our perl process' stderr and stdout streams are handled by 701 701 // SynchronizedProcessHandler.gotException() below, since they happen in separate threads 702 // from this one (the ine from which the perl process is run).702 // from this one (the one from which the perl process is run). 703 703 public synchronized void gotException(Exception e) { 704 704 … … 719 719 // we do that here too, to continue original behaviour. These calls are also synchronized to make their 720 720 // use of the EventListeners threadsafe. 721 protected class SynchronizedProcessHandler implements SafeProcess.CustomProcessHandler721 protected class SynchronizedProcessHandler extends SafeProcess.CustomProcessHandler 722 722 { 723 public static final int STDERR = 0;724 public static final int STDOUT = 1;725 726 private final int source;727 723 private final BufferedWriter bwHandle; // needs to be final to synchronize on the object 728 724 729 730 725 public SynchronizedProcessHandler(BufferedWriter bw, int src) { 726 super(src); // will set this.source to STDERR or STDOUT 731 727 this.bwHandle = bw; // caller will close bw, since many more than one 732 728 // SynchronizedProcessHandlers are using it 733 this.source = src; // STDERR or STDOUT734 729 } 735 730 … … 751 746 752 747 753 //if(this.source == S TDERR) {748 //if(this.source == SafeProcess.STDERR) { 754 749 ///System.err.println("ERROR: " + line); 755 750 //} else { … … 767 762 } 768 763 } catch(IOException ioe) { 769 String msg = ( source ==STDERR) ? "stderr" : "stdout";764 String msg = (this.source == SafeProcess.STDERR) ? "stderr" : "stdout"; 770 765 msg = "Exception when writing out a line read from perl process' " + msg + " stream."; 771 766 GS2PerlConstructor.logger.error(msg, ioe); … … 780 775 } catch (IOException ioe) { // problem with reading in from process with BufferedReader br 781 776 782 String msg = ( source ==STDERR) ? "stderr" : "stdout";777 String msg = (this.source == SafeProcess.STDERR) ? "stderr" : "stdout"; 783 778 msg = "Got exception when processing the perl process' " + msg + " stream."; 784 779 GS2PerlConstructor.logger.error(msg, ioe); … … 821 816 // http://stackoverflow.com/questions/14211629/java-util-logger-write-synchronization 822 817 823 String msg = ( source ==STDERR) ? "stderr" : "stdout";818 String msg = (this.source == SafeProcess.STDERR) ? "stderr" : "stdout"; 824 819 msg = "IOException when writing out a line read from perl process' " + msg + " stream."; 825 820 msg += "\nGot line: " + line + "\n"; -
main/trunk/greenstone3/src/java/org/greenstone/util/SafeProcess.java
r31620 r31631 20 20 21 21 public class SafeProcess { 22 23 public static final int STDERR = 0; 24 public static final int STDOUT = 1; 25 public static final int STDIN = 2; 22 26 23 27 static Logger logger = Logger.getLogger(org.greenstone.util.SafeProcess.class.getName()); … … 204 208 } 205 209 206 // Runs a process with default stream processing 210 // Runs a process with default stream processing. Returns the exitValue 207 211 public int runProcess() { 208 212 return runProcess(null, null, null); // use default processing of all 3 of the process' iostreams … … 210 214 211 215 // Run a process with custom stream processing (any custom handlers passed in that are null 212 // will use the default stream processing) 216 // will use the default stream processing). 217 // Returns the exitValue from running the Process 213 218 public int runProcess(CustomProcessHandler procInHandler, 214 219 CustomProcessHandler procOutHandler, … … 239 244 if(procErrHandler == null) { 240 245 errorGobbler // ReaderFromProcessOutputStream 241 = new SafeProcess.InputStreamGobbler(prcs.getErrorStream(), splitStdErrorNewLines); 246 = new SafeProcess.InputStreamGobbler(prcs.getErrorStream(), splitStdErrorNewLines); 242 247 } else { 243 248 errorGobbler … … 414 419 415 420 416 //******************** Inner class interface definitions ********************//421 //******************** Inner class and interface definitions ********************// 417 422 // Static inner classes can be instantiated without having to instantiate an object of the outer class first 418 423 … … 423 428 public static interface ExceptionHandler { 424 429 425 // SHOULD I DECLARE THIS SYNCHRONIZED? 426 // It ends up being thread safe for the particular instance I'm using it for, but that doesn't 427 // make it future proof... 428 public void gotException(Exception e); 430 // when implementing ExceptionHandler.gotException(), if it manipulates anything that's 431 // not threadsafe, declare gotException() as a synchronized method to ensure thread safety 432 public void gotException(Exception e); // can't declare as synchronized in interface method declaration 429 433 } 430 434 431 435 // Write your own run() body for any StreamGobbler. You need to create an instance of a class 432 // implementing CustomProcessHandler for EACH IOSTREAM of the process that you want to handle.436 // extending CustomProcessHandler for EACH IOSTREAM of the process that you want to handle. 433 437 // Do not create a single CustomProcessHandler instance and reuse it for all three streams, 434 438 // i.e. don't call SafeProcess' runProcess(x, x, x); It should be runProcess(x, y, z). 435 439 // Make sure your implementation is threadsafe if you're sharing immutable objects between the threaded streams 436 440 // example implementation is in the GS2PerlConstructor.SynchronizedProcessHandler class. 437 public static interface CustomProcessHandler { 438 public void run(Closeable stream); //InputStream or OutputStream 441 // CustomProcessHandler is made an abstract class instead of an interface to force classes that want 442 // to use a CustomProcessHandler to create a separate class that extends CustomProcessHandler, rather than 443 // that the classes that wish to use it "implementing" the CustomProcessHandler interface itself: the 444 // CustomProcessHandler.run() method may then be called in the major thread from which the Process is being 445 // executed, rather than from the individual threads that deal with each iostream of the Process. 446 public static abstract class CustomProcessHandler { 447 448 protected final int source; 449 450 protected CustomProcessHandler(int src) { 451 this.source = src; // STDERR or STDOUT or STDIN 452 } 453 454 public abstract void run(Closeable stream); //InputStream or OutputStream 439 455 } 440 456 441 // When using the default stream processing to read from a process' stdout or stderr stream, 442 // you can create a LineByLineHandler for the process' err and out streams457 // When using the default stream processing to read from a process' stdout or stderr stream, you can 458 // create a class extending LineByLineHandler for the process' err stream and one for its output stream 443 459 // to do something on a line by line basis, such as sending the line to a log 444 public static interface LineByLineHandler { 445 public void gotLine(String line); 446 public void gotException(Exception e); // for when an exception occurs instead of getting a line 460 public static abstract class LineByLineHandler { 461 protected final int source; 462 463 protected LineByLineHandler(int src) { 464 this.source = src; // STDERR or STDOUT 465 } 466 467 public abstract void gotLine(String line); // first non-null line 468 public abstract void gotException(Exception e); // for when an exception occurs instead of getting a line 447 469 } 448 470
Note:
See TracChangeset
for help on using the changeset viewer.