// Path: src/main/java/org/zeroturnaround/exec/close/ProcessCloser.java
// public interface ProcessCloser {
// 
//   /**
//    * Closes standard streams of a given sub process.
//    *
//    * @param process sub process (not <code>null</code>).
//    * @throws IOException if I/O errors occur while closing the underlying stream
//    * @throws InterruptedException if underlying throws a InterruptedException
//    */
//   void close(Process process) throws IOException, InterruptedException;
// 
// }
// 
// Path: src/main/java/org/zeroturnaround/exec/listener/ProcessListener.java
// public abstract class ProcessListener {
// 
//   /**
//    * Invoked before a process is started.
//    *
//    * @param executor executor used for starting a process.
//    *    Any changes made here apply to the starting process.
//    *    Once the process has started it is not affected by the {@link ProcessExecutor} any more.
//    */
//   public void beforeStart(ProcessExecutor executor) {
//     // do nothing
//   }
// 
//   /**
//    * Invoked after a process has started.
//    *
//    * @param process the process started.
//    * @param executor executor used for starting the process.
//    *    Modifying the {@link ProcessExecutor} only affects the following processes
//    *    not the one just started.
//    */
//   public void afterStart(Process process, ProcessExecutor executor) {
//     // do nothing
//   }
// 
//   /**
//    * Invoked after a process has finished successfully.
//    *
//    * @param process process just finished.
//    * @param result result of the finished process.
//    * @since 1.8
//    */
//   public void afterFinish(Process process, ProcessResult result) {
//     // do nothing
//   }
// 
//   /**
//    * Invoked after a process has exited (whether finished or cancelled).
//    *
//    * @param process process just stopped.
//    */
//   public void afterStop(Process process) {
//     // do nothing
//   }
// 
// }
// 
// Path: src/main/java/org/zeroturnaround/exec/stop/ProcessStopper.java
// public interface ProcessStopper {
// 
//   /**
//    * Stops a given sub process.
//    * It does not wait for the process to actually stop and it has no guarantee that the process terminates.
//    *
//    * @param process sub process being stopped (not <code>null</code>).
//    */
//   void stop(Process process);
// 
// }


import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.concurrent.Callable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.zeroturnaround.exec.close.ProcessCloser;
import org.zeroturnaround.exec.listener.ProcessListener;
import org.zeroturnaround.exec.stop.ProcessStopper;
/*
 * Copyright (C) 2014 ZeroTurnaround <support@zeroturnaround.com>
 * Contains fragments of code from Apache Commons Exec, rights owned
 * by Apache Software Foundation (ASF).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.zeroturnaround.exec;




/**
 * Handles the executed process.
 *
 * @author Rein Raudjärv
 */
class WaitForProcess implements Callable<ProcessResult> {

  private static final Logger log = LoggerFactory.getLogger(WaitForProcess.class);

  private final Process process;

  /**
   * Set of main attributes used to start the process.
   */
  private final ProcessAttributes attributes;

  /**
   * Helper for stopping the process in case of interruption.
   */
// Path: src/main/java/org/zeroturnaround/exec/close/ProcessCloser.java
// public interface ProcessCloser {
// 
//   /**
//    * Closes standard streams of a given sub process.
//    *
//    * @param process sub process (not <code>null</code>).
//    * @throws IOException if I/O errors occur while closing the underlying stream
//    * @throws InterruptedException if underlying throws a InterruptedException
//    */
//   void close(Process process) throws IOException, InterruptedException;
// 
// }
// 
// Path: src/main/java/org/zeroturnaround/exec/listener/ProcessListener.java
// public abstract class ProcessListener {
// 
//   /**
//    * Invoked before a process is started.
//    *
//    * @param executor executor used for starting a process.
//    *    Any changes made here apply to the starting process.
//    *    Once the process has started it is not affected by the {@link ProcessExecutor} any more.
//    */
//   public void beforeStart(ProcessExecutor executor) {
//     // do nothing
//   }
// 
//   /**
//    * Invoked after a process has started.
//    *
//    * @param process the process started.
//    * @param executor executor used for starting the process.
//    *    Modifying the {@link ProcessExecutor} only affects the following processes
//    *    not the one just started.
//    */
//   public void afterStart(Process process, ProcessExecutor executor) {
//     // do nothing
//   }
// 
//   /**
//    * Invoked after a process has finished successfully.
//    *
//    * @param process process just finished.
//    * @param result result of the finished process.
//    * @since 1.8
//    */
//   public void afterFinish(Process process, ProcessResult result) {
//     // do nothing
//   }
// 
//   /**
//    * Invoked after a process has exited (whether finished or cancelled).
//    *
//    * @param process process just stopped.
//    */
//   public void afterStop(Process process) {
//     // do nothing
//   }
// 
// }
// 
// Path: src/main/java/org/zeroturnaround/exec/stop/ProcessStopper.java
// public interface ProcessStopper {
// 
//   /**
//    * Stops a given sub process.
//    * It does not wait for the process to actually stop and it has no guarantee that the process terminates.
//    *
//    * @param process sub process being stopped (not <code>null</code>).
//    */
//   void stop(Process process);
// 
// }


// Path: src/main/java/org/zeroturnaround/exec/WaitForProcess.java
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.concurrent.Callable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.zeroturnaround.exec.close.ProcessCloser;
import org.zeroturnaround.exec.listener.ProcessListener;
import org.zeroturnaround.exec.stop.ProcessStopper;

/*
 * Copyright (C) 2014 ZeroTurnaround <support@zeroturnaround.com>
 * Contains fragments of code from Apache Commons Exec, rights owned
 * by Apache Software Foundation (ASF).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.zeroturnaround.exec;




/**
 * Handles the executed process.
 *
 * @author Rein Raudjärv
 */
class WaitForProcess implements Callable<ProcessResult> {

  private static final Logger log = LoggerFactory.getLogger(WaitForProcess.class);

  private final Process process;

  /**
   * Set of main attributes used to start the process.
   */
  private final ProcessAttributes attributes;

  /**
   * Helper for stopping the process in case of interruption.
   */
  private final ProcessStopper stopper;