001: /*
002:
003: Derby - Class org.apache.derbyTesting.functionTests.util.ExecProcUtil
004:
005: Licensed to the Apache Software Foundation (ASF) under one or more
006: contributor license agreements. See the NOTICE file distributed with
007: this work for additional information regarding copyright ownership.
008: The ASF licenses this file to You under the Apache License, Version 2.0
009: (the "License"); you may not use this file except in compliance with
010: the License. You may obtain a copy of the License at
011:
012: http://www.apache.org/licenses/LICENSE-2.0
013:
014: Unless required by applicable law or agreed to in writing, software
015: distributed under the License is distributed on an "AS IS" BASIS,
016: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017: See the License for the specific language governing permissions and
018: limitations under the License.
019:
020: */
021: package org.apache.derbyTesting.functionTests.util;
022:
023: import org.apache.derbyTesting.functionTests.harness.ProcessStreamResult;
024: import org.apache.derbyTesting.functionTests.harness.TimedProcess;
025: import java.util.Vector;
026: import java.io.BufferedOutputStream;
027:
028: /**
029: * Utility class to hold helper methods to exec new processes
030: */
031: public class ExecProcUtil {
032:
033: /**
034: * For each new exec process done, set
035: * timeout for ProcessStreamResult after which the thread that
036: * handles the streams for the process exits. Timeout is in minutes.
037: * Note: timeout handling will only come into effect when
038: * ProcessStreamResult#Wait() is called
039: */
040: private static String timeoutMinutes = "2";
041:
042: /**
043: * timeout in seconds for the processes spawned.
044: */
045: private static int timeoutSecondsForProcess = 180;
046:
047: /**
048: * Execute the given command and dump the results to standard out
049: *
050: * @param args command and arguments
051: * @param vCmd java command line arguments.
052: * @param bos buffered stream (System.out) to dump results to.
053: * @exception Exception
054: */
055: public static void execCmdDumpResults(String[] args, Vector vCmd,
056: BufferedOutputStream bos) throws Exception {
057: // We need the process inputstream and errorstream
058: ProcessStreamResult prout = null;
059: ProcessStreamResult prerr = null;
060:
061: StringBuffer sb = new StringBuffer();
062:
063: for (int i = 0; i < args.length; i++) {
064: sb.append(args[i] + " ");
065: }
066: System.out.println(sb.toString());
067: int totalSize = vCmd.size() + args.length;
068: String serverCmd[] = new String[totalSize];
069:
070: int i = 0;
071: for (i = 0; i < vCmd.size(); i++)
072: serverCmd[i] = (String) vCmd.elementAt(i);
073:
074: for (int j = 0; i < totalSize; i++)
075: serverCmd[i] = args[j++];
076:
077: System.out.flush();
078: bos.flush();
079:
080: // Start a process to run the command
081: Process pr = Runtime.getRuntime().exec(serverCmd);
082:
083: // TimedProcess, kill process if process doesnt finish in a certain
084: // amount of time
085: TimedProcess tp = new TimedProcess(pr);
086: prout = new ProcessStreamResult(pr.getInputStream(), bos,
087: timeoutMinutes);
088: prerr = new ProcessStreamResult(pr.getErrorStream(), bos,
089: timeoutMinutes);
090:
091: // wait until all the results have been processed
092: boolean outTimedOut = prout.Wait();
093: boolean errTimedOut = prerr.Wait();
094:
095: // wait for this process to terminate, upto a wait period
096: // of 'timeoutSecondsForProcess'
097: // if process has already been terminated, this call will
098: // return immediately.
099: tp.waitFor(timeoutSecondsForProcess);
100: pr = null;
101:
102: if (outTimedOut || errTimedOut)
103: System.out
104: .println(" Reading from process streams timed out.. ");
105:
106: System.out.flush();
107: }
108:
109: }
|