reintroduced StringUtil.regexpReplace
[mir.git] / source / mir / util / ShellRoutines.java
1 /*
2  * Copyright (C) 2001, 2002 The Mir-coders group
3  *
4  * This file is part of Mir.
5  *
6  * Mir is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * Mir is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Mir; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  * In addition, as a special exception, The Mir-coders gives permission to link
21  * the code of this program with  any library licensed under the Apache Software License,
22  * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library
23  * (or with modified versions of the above that use the same license as the above),
24  * and distribute linked combinations including the two.  You must obey the
25  * GNU General Public License in all respects for all of the code used other than
26  * the above mentioned libraries.  If you modify this file, you may extend this
27  * exception to your version of the file, but you are not obligated to do so.
28  * If you do not wish to do so, delete this exception statement from your version.
29  */
30 package mir.util;
31
32 import mir.log.LoggerWrapper;
33
34 import java.io.File;
35 import java.io.IOException;
36 import java.io.InputStreamReader;
37 import java.io.PrintWriter;
38 import java.io.Reader;
39
40 /**
41  * Execute system commands. Warning: the current implementation is
42  * unix specific.
43  */
44 public class ShellRoutines {
45   protected ShellRoutines() {
46   }
47
48   /**
49    * Executes a full command (including arguments) in a subshell
50    * and returns the output of the command in a string. Output is
51    * redirected into a temporary fil which is then read into the string
52    */
53   public static String execIntoString(String command) throws IOException {
54     return new String(execIntoByteArray(command));
55   }
56
57   /**
58    * Executes a full command (including arguments) in a subshell
59    * and returns the output of the command in an array of
60    * bytes. Output is redirected into a temporary file which is then
61    * read into an array of bytes
62    */
63   public static byte[] execIntoByteArray(String command) throws IOException {
64     File commandOutput = File.createTempFile("mircmd", "");
65     try {
66       int exitStatus;
67       try {
68         // WARNING: unix specific
69
70         exitStatus = Runtime.getRuntime().exec(new String[]{
71           "/bin/sh", "-c",
72           command + " " +
73             ">" + commandOutput.getAbsolutePath()
74         }).waitFor();
75       }
76       catch (InterruptedException e) {
77         throw new IOException(e.toString());
78       }
79       if (exitStatus != 0) {
80         throw new IOException("command exit satus:" + exitStatus);
81       }
82       return FileRoutines.readFileIntoByteArray
83           (commandOutput.getAbsoluteFile());
84     }
85     finally {
86       commandOutput.delete();
87     }
88   }
89
90   /**
91    * Executes a full command (including arguments) in a subshell.
92    * Standard input and output go to /dev/null
93    */
94   public static void simpleExec(String command) throws IOException {
95     int exitStatus;
96     try {
97       // WARNING: unix specific
98 //      exitStatus =
99       Process process = Runtime.getRuntime().exec(
100            new String[]{
101                "/bin/sh", "-c", command
102       });
103       Reader errorStreamReader = new InputStreamReader(process.getErrorStream());
104       ReaderLogger logger =
105           new ReaderLogger(errorStreamReader, new LoggerWrapper("Utility"));
106
107       new Thread(logger).start();
108
109       Reader outputStreamReader = new InputStreamReader(process.getInputStream());
110       logger = new ReaderLogger(outputStreamReader, new LoggerWrapper("Utility"));
111       new Thread(logger).start();
112
113       exitStatus = process.waitFor();
114     }
115     catch (InterruptedException e) {
116       throw new IOException("Interrupted");
117     }
118
119     if (exitStatus != 0) {
120       throw new IOException("command exit satus:" + exitStatus);
121     }
122   }
123
124   private static class ReaderLogger implements Runnable {
125     private Reader reader;
126     private PrintWriter writer;
127
128     ReaderLogger(Reader aReader, LoggerWrapper aLogger) {
129       reader = aReader;
130       writer = aLogger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE);
131     }
132
133     public void run() {
134       try {
135         int size;
136         char[] buffer = new char[1024];
137         while ((size = reader.read(buffer)) >= 0) {
138           writer.write(buffer,0,size);
139         }
140       }
141       catch (IOException e) {
142       }
143
144       writer.close();
145       try {
146         reader.close();
147       }
148       catch (Exception e) {
149       }
150     }
151   }
152
153 }