/* sbt -- Simple Build Tool
 * Copyright 2009 Mark Harrah
 */
 
/** The beginnings of a library for interacting with native processes.  It is not ready
 * for general use. */
package sbt

import java.lang.ProcessBuilder
import java.io.{File, InputStream, OutputStream}

class class ProcessOptions extends java.lang.Object with NotNull with ScalaObjectProcessOptions(val java.io.FileworkingDirectory: java.io.FileFile, val BooleanredirectErrorStream: BooleanBoolean,
	val Map[String,String]environment: Map[String,String]Map[String, String], val BooleanuseDefaultEnvironment: BooleanBoolean) extends NotNullNotNull
{
	def (java.io.File)sbt.ProcessOptionsnewDirectory(java.io.Filedir: java.io.FileFile) = sbt.ProcessOptionsnew sbt.ProcessOptionsProcessOptions(java.io.Filedir, => BooleanredirectErrorStream, => Map[String,String]environment, => BooleanuseDefaultEnvironment)
	def => sbt.ProcessOptionsmergeErrorStream = sbt.ProcessOptionsnew sbt.ProcessOptionsProcessOptions(=> java.io.FileworkingDirectory, Boolean(true)true, => Map[String,String]environment, => BooleanuseDefaultEnvironment)
	def (Map[String,String])sbt.ProcessOptionssetEnvironment(Map[String,String]env: Map[String,String]Map[String, String]) =
		sbt.ProcessOptionsnew sbt.ProcessOptionsProcessOptions(=> java.io.FileworkingDirectory, => BooleanredirectErrorStream, Map[String,String]env, Boolean(true)true)
	def (Iterable[(String, String)])sbt.ProcessOptionsmodifyEnvironment(Iterable[(String, String)]modifiedMappings: Iterable[(String, String)]Iterable[(String, String)]) = 
		sbt.ProcessOptionsnew sbt.ProcessOptionsProcessOptions(=> java.io.FileworkingDirectory, => BooleanredirectErrorStream, => Map[String,String]environment (Iterable[(String, String)])scala.collection.immutable.Map[String,String]++ Iterable[(String, String)]modifiedMappings, => BooleanuseDefaultEnvironment)
}
class class ProcessIO extends java.lang.Object with NotNull with ScalaObjectProcessIO(val (java.io.OutputStream) => UnitconnectInput: OutputStream => Unit, val (java.io.InputStream) => UnitconnectOutput: InputStream => Unit,
	val (java.io.InputStream) => UnitconnectError: InputStream => Unit) extends NotNullNotNull
{
	def ()sbt.ProcessIOthis() = ProcessIO.this.typethis(object sbt.ProcessIOProcessIO.(java.io.Closeable)Unitclose, object sbt.ProcessIOProcessIO.(java.io.InputStream)UnitreadFully, object sbt.ProcessIOProcessIO.(java.io.InputStream)UnitreadFully)
	def (sbt.Logger)sbt.ProcessIOthis(sbt.Loggerlog: sbt.LoggerLogger) = ProcessIO.this.typethis(object sbt.ProcessIOProcessIO.(java.io.Closeable)Unitclose, object sbt.ProcessIOProcessIO.(sbt.Logger,sbt.Level.Value)(java.io.InputStream)UnitprocessFully(sbt.Loggerlog, object sbt.LevelLevel.=> sbt.Level.ValueInfo), object sbt.ProcessIOProcessIO.(sbt.Logger,sbt.Level.Value)(java.io.InputStream)UnitprocessFully(sbt.Loggerlog, object sbt.LevelLevel.=> sbt.Level.ValueError))
}
object object sbt.ProcessIOProcessIO
{
	import java.io.{BufferedReader, InputStreamReader}
	def (java.io.Closeable)Unitclose(java.io.Closeablec: java.io.java.io.CloseableCloseable) { java.io.Closeablec.()Unitclose() }
	def (java.io.InputStream)UnitreadFully(java.io.InputStreami: java.io.InputStreamInputStream) =
	{
		val Array[Byte]buffer = Array[Byte]new Array[Byte]Array[Byte](Int(8192)8192)
		def ()UnitreadFully()
		{
			Unitif(java.io.InputStreami.(Array[Byte])Intread(Array[Byte]buffer) (Int)Boolean>= Int(0)0)
				()UnitreadFully()
		}
		(=> Unit)UnitnewThread(try { ()UnitreadFully() } finally { java.io.InputStreami.()Unitclose() })
	}
	private def (=> Unit)UnitnewThread(=> Unitaction: => Unit)
	{
		val <refinement> extends java.lang.Object with java.lang.Runnablerunnable = template $anon extends java.lang.Object with java.lang.Runnablenew java.lang.RunnableRunnable { def ()Unitrun() { => Unitaction } }
		((java.lang.Runnable)java.lang.Threadnew java.lang.ThreadThread(<refinement> extends java.lang.Object with java.lang.Runnablerunnable)).()Unitstart()
	}
	def (sbt.Logger,sbt.Level.Value)(java.io.InputStream)UnitprocessFully(sbt.Loggerlog: sbt.LoggerLogger, sbt.Level.Valuelevel: Level.sbt.Level.ValueValue)(java.io.InputStreami: java.io.InputStreamInputStream) { ((String) => Unit)(java.io.InputStream)UnitprocessFully(Stringx => sbt.Loggerlog.(sbt.Level.Value,=> String)Unitlog(sbt.Level.Valuelevel, Stringx))(java.io.InputStreami) }
	// processLine will be called from a new thread
	def ((String) => Unit)(java.io.InputStream)UnitprocessFully((String) => UnitprocessLine: String => Unit)(java.io.InputStreami: java.io.InputStreamInputStream)
	{
		def (java.io.BufferedReader)UnitreadFully(java.io.BufferedReaderreader: java.io.BufferedReaderBufferedReader)
		{
			val java.lang.Stringline = java.io.BufferedReaderreader.()java.lang.StringreadLine()
			Unitif(java.lang.Stringline (AnyRef)Boolean!= Null(null)null)
			{
				(String)UnitprocessLine(java.lang.Stringline)
				(java.io.BufferedReader)UnitreadFully(java.io.BufferedReaderreader)
			}
		}
		(java.io.InputStream)((java.io.BufferedReader) => Unit)UnitwithReader(java.io.InputStreami)((java.io.BufferedReader)UnitreadFully)
	}
	def [T]((T, String) => T,T)(java.io.InputStream)Tfold[>: Nothing <: AnyT]((T, String) => Tprocess: (T,String) => T, Tinitial: TT)(java.io.InputStreami: java.io.InputStreamInputStream): TT =
	{
		var Tv = Tinitial
		((String) => Unit)(java.io.InputStream)UnitprocessFully( Stringline => Tv = (T,String)Tprocess(Tv, Stringline)  )(java.io.InputStreami)
		Tv
	}
	def => sbt.ProcessIOstandard: sbt.ProcessIOProcessIO = ((java.io.OutputStream) => Unit)sbt.ProcessIOstandard((java.io.Closeable)Unitclose)
	def ((java.io.OutputStream) => Unit)sbt.ProcessIOstandard((java.io.OutputStream) => UnittoProcessInput: OutputStream => Unit): sbt.ProcessIOProcessIO =
		 sbt.ProcessIOnew sbt.ProcessIOProcessIO((java.io.OutputStream) => UnittoProcessInput, ((String) => Unit)(java.io.InputStream)UnitprocessFully(object java.lang.SystemSystem.java.io.PrintStreamout.(java.lang.String)Unitprintln), ((String) => Unit)(java.io.InputStream)UnitprocessFully(object java.lang.SystemSystem.java.io.PrintStreamerr.(java.lang.String)Unitprintln))
	private def (java.io.InputStream)((java.io.BufferedReader) => Unit)UnitwithReader(java.io.InputStreami: java.io.InputStreamInputStream)((java.io.BufferedReader) => Unitf: BufferedReader =>Unit) =
	{
		val java.io.BufferedReaderreader = (java.io.Reader)java.io.BufferedReadernew java.io.BufferedReaderBufferedReader(java.io.InputStreamReadernew java.io.InputStreamReaderInputStreamReader(java.io.InputStreami))
		(=> Unit)UnitnewThread(try { (java.io.BufferedReader)Unitf(java.io.BufferedReaderreader) } finally { java.io.BufferedReaderreader.()Unitclose() })
	}
}
final class class ProcessRunner extends java.lang.Object with NotNull with ScalaObjectProcessRunner(val Stringcommand: StringString, val Seq[String]arguments: Seq[String]Seq[String], val sbt.ProcessOptionsoptions: sbt.ProcessOptionsProcessOptions, val sbt.ProcessIOio: sbt.ProcessIOProcessIO) extends NotNullNotNull
{
	(Boolean,=> Any)Unitrequire(=> Boolean!=> Stringcommand.implicit scala.Predef.stringWrapper : (String)scala.runtime.RichStringtrim.=> BooleanisEmpty, java.lang.String("Command cannot be empty.")"Command cannot be empty.")
	def (String,Seq[String],java.io.File,Boolean)sbt.ProcessRunnerthis(Stringcommand: StringString, Seq[String]arguments: Seq[String]Seq[String], java.io.FileworkingDirectory: java.io.FileFile, BooleanredirectErrorStream: BooleanBoolean) =
		ProcessRunner.this.typethis(Stringcommand, Seq[String]arguments, sbt.ProcessOptionsnew sbt.ProcessOptionsProcessOptions(java.io.FileworkingDirectory, BooleanredirectErrorStream, => collection.immutable.Map.typeMap.scala.collection.immutable.Map[String,Nothing]empty, Boolean(true)true), ()sbt.ProcessIOnew sbt.ProcessIOProcessIO)
	def (String,Seq[String],java.io.File)sbt.ProcessRunnerthis(Stringcommand: StringString, Seq[String]arguments: Seq[String]Seq[String], java.io.FileworkingDirectory: java.io.FileFile) = (String,Seq[String],java.io.File,Boolean)sbt.ProcessRunnerthis(Stringcommand, Seq[String]arguments, java.io.FileworkingDirectory, Boolean(false)false)
	def (String,Seq[String])sbt.ProcessRunnerthis(Stringcommand: StringString, Seq[String]arguments: Seq[String]Seq[String]) = (String,Seq[String],java.io.File)sbt.ProcessRunnerthis(Stringcommand, Seq[String]arguments, java.io.Filenew java.io.FileFile(java.lang.String(".")"."))
	def (String,String,String*)sbt.ProcessRunnerthis(Stringcommand: StringString, Stringargument0: StringString, String*arguments: String*String*) = (String,Seq[String],java.io.File)sbt.ProcessRunnerthis(Stringcommand, Stringargument0 (String)List[String]:: String*arguments.=> List[String]toList, java.io.Filenew java.io.FileFile(java.lang.String(".")"."))
	def (String)sbt.ProcessRunnerthis(Stringcommand: StringString) = (String,Seq[String])sbt.ProcessRunnerthis(Stringcommand, object NilNil)
	
	def (java.io.File)sbt.ProcessRunnerin(java.io.FilenewDirectory: java.io.FileFile) = sbt.ProcessRunnernew sbt.ProcessRunnerProcessRunner(=> Stringcommand, => Seq[String]arguments, => sbt.ProcessOptionsoptions.(java.io.File)sbt.ProcessOptionsnewDirectory(java.io.FilenewDirectory), => sbt.ProcessIOio)
	def (Map[String,String])sbt.ProcessRunnerwithEnvironment(Map[String,String]env: Map[String,String]Map[String, String]) =
		sbt.ProcessRunnernew sbt.ProcessRunnerProcessRunner(=> Stringcommand, => Seq[String]arguments, => sbt.ProcessOptionsoptions.(Map[String,String])sbt.ProcessOptionssetEnvironment(Map[String,String]env), => sbt.ProcessIOio)
	def ((String, String)*)sbt.ProcessRunnermodifyEnvironment((String, String)*modifiedMappings: (String, String)*(String, String)*) =
		sbt.ProcessRunnernew sbt.ProcessRunnerProcessRunner(=> Stringcommand, => Seq[String]arguments, => sbt.ProcessOptionsoptions.(Iterable[(String, String)])sbt.ProcessOptionsmodifyEnvironment((String, String)*modifiedMappings), => sbt.ProcessIOio)
	def => sbt.ProcessRunnermergeErrorStream = sbt.ProcessRunnernew sbt.ProcessRunnerProcessRunner(=> Stringcommand, => Seq[String]arguments, => sbt.ProcessOptionsoptions.=> sbt.ProcessOptionsmergeErrorStream, => sbt.ProcessIOio)
	def (sbt.ProcessIO)sbt.ProcessRunnerwithIO(sbt.ProcessIOpio: sbt.ProcessIOProcessIO) = sbt.ProcessRunnernew sbt.ProcessRunnerProcessRunner(=> Stringcommand, => Seq[String]arguments, => sbt.ProcessOptionsoptions, sbt.ProcessIOpio)
	def (sbt.Logger)sbt.ProcessRunnerlogIO(sbt.Loggerlog: sbt.LoggerLogger) = (sbt.ProcessIO)sbt.ProcessRunnerwithIO((sbt.Logger)sbt.ProcessIOnew sbt.ProcessIOProcessIO(sbt.Loggerlog))
	
	def => sbt.SProcessrun: sbt.SProcessSProcess =
	{
		val Array[String]commandArray = (=> Stringcommand (String)List[String]:: => Seq[String]arguments.=> List[String]toList).Array[String]toArray
		val java.lang.ProcessBuilderbuilder = (java.lang.String*)java.lang.ProcessBuildernew java.lang.ProcessBuilderProcessBuilder(Array[String]commandArray : _*)
		import options._
		java.lang.ProcessBuilderbuilder.(Boolean)java.lang.ProcessBuilderredirectErrorStream(=> BooleanredirectErrorStream).(java.io.File)java.lang.ProcessBuilderdirectory(=> java.io.FileworkingDirectory)
		
		val java.util.Map[java.lang.String,java.lang.String]env = java.lang.ProcessBuilderbuilder.()java.util.Map[java.lang.String,java.lang.String]environment
		Unitif(=> Boolean!=> BooleanuseDefaultEnvironment)
			java.util.Map[java.lang.String,java.lang.String]env.()Unitclear()
		for( (((String, String)) => Unit)Unit(Stringkey, Stringvalue) <- => Map[String,String]environment )
			java.util.Map[java.lang.String,java.lang.String]env.(java.lang.String,java.lang.String)java.lang.Stringput(Stringkey, Stringvalue)
			
		val java.lang.Processprocess = java.lang.ProcessBuilderbuilder.()java.lang.Processstart()
		import io._
		(java.io.OutputStream)UnitconnectInput(java.lang.Processprocess.()java.io.OutputStreamgetOutputStream)
		(java.io.InputStream)UnitconnectOutput(java.lang.Processprocess.()java.io.InputStreamgetInputStream)
		Unitif(=> Boolean!=> sbt.ProcessOptionsoptions.=> BooleanredirectErrorStream)
			(java.io.InputStream)UnitconnectError(java.lang.Processprocess.()java.io.InputStreamgetErrorStream)
		sbt.SProcessnew sbt.SProcessSProcess(java.lang.Processprocess)
	}
	def => StringcommandLine = (=> Stringcommand (String)List[String]:: => Seq[String]arguments.=> List[String]toList).(String)StringmkString(java.lang.String(" ")" ")
}
final class class SProcess extends java.lang.Object with NotNull with ScalaObjectSProcess(java.lang.Processp: java.lang.ProcessProcess) extends NotNullNotNull
{
	def ()IntexitValue(): IntInt = java.lang.Processp.()IntwaitFor()
	def ()Unitdestroy() { java.lang.Processp.()Unitdestroy }
}