/* sbt -- Simple Build Tool
 * Copyright 2009 Mark Harrah
 */
package sbt

import java.io.{File, FileOutputStream}
import java.util.jar.{JarEntry, JarFile, JarOutputStream, Pack200}
import scala.collection.Map
import scala.collection.jcl.Conversions
import FileUtilities._

object object sbt.PackPack
{
	def (sbt.Path,sbt.Path,sbt.Logger)Option[String]pack(sbt.PathjarPath: sbt.PathPath, sbt.Pathout: sbt.PathPath, sbt.Loggerlog: sbt.LoggerLogger): Option[String]Option[String] = (sbt.Path,sbt.Path,scala.collection.Map[String,String],sbt.Logger)Option[String]pack(sbt.PathjarPath, sbt.Pathout, => scala.collection.Map[String,String]defaultPackerOptions, sbt.Loggerlog)
	def (sbt.Path,sbt.Path,scala.collection.Map[String,String],sbt.Logger)Option[String]pack(sbt.PathjarPath: sbt.PathPath, sbt.Pathout: sbt.PathPath, scala.collection.Map[String,String]options: scala.collection.Map[String,String]Map[String, String], sbt.Loggerlog: sbt.LoggerLogger): Option[String]Option[String] =
	{
		val java.util.jar.Pack200.Packerpacker = object java.util.jar.Pack200Pack200.()java.util.jar.Pack200.PackernewPacker
		val <refinement> extends java.lang.Object with scala.collection.jcl.MapWrapper[java.lang.String,java.lang.String]properties = object scala.collection.jcl.ConversionsConversions.(java.util.Map[java.lang.String,java.lang.String])java.lang.Object with scala.collection.jcl.MapWrapper[java.lang.String,java.lang.String]convertMap(java.util.jar.Pack200.Packerpacker.()java.util.SortedMap[java.lang.String,java.lang.String]properties)
		<refinement> extends java.lang.Object with scala.collection.jcl.MapWrapper[java.lang.String,java.lang.String]properties (Iterable[(java.lang.String, java.lang.String)])Unit++= scala.collection.Map[String,String]options
		 
		object sbt.OpenResourceOpenResource.(Boolean)sbt.OpenFile[sbt.CloseableJarFile]openJarFile(Boolean(false)false).(java.io.File,String,sbt.Logger)((sbt.CloseableJarFile) => Option[String])Option[String]ioOption(sbt.PathjarPath.=> java.io.FileasFile, java.lang.String("applying pack200 compression to jar")"applying pack200 compression to jar", sbt.Loggerlog) {
			sbt.CloseableJarFilef => (java.io.File,sbt.Logger)((java.io.OutputStream) => Option[String])Option[String]writeStream(sbt.Pathout.=> java.io.FileasFile, sbt.Loggerlog) { java.io.OutputStreamstream => java.util.jar.Pack200.Packerpacker.(java.util.jar.JarFile,java.io.OutputStream)Unitpack(sbt.CloseableJarFilef, java.io.OutputStreamstream); object NoneNone }
		}
	}
	def (sbt.Path,sbt.Path,sbt.Logger)Option[String]unpack(sbt.PathpackedPath: sbt.PathPath, sbt.PathtoJarPath: sbt.PathPath, sbt.Loggerlog: sbt.LoggerLogger): Option[String]Option[String] =
	{
		val java.util.jar.Pack200.Unpackerunpacker = object java.util.jar.Pack200Pack200.()java.util.jar.Pack200.UnpackernewUnpacker
		(java.io.File,sbt.Logger)((java.io.OutputStream) => Option[String])Option[String]writeStream(sbt.PathtoJarPath.=> java.io.FileasFile, sbt.Loggerlog) { java.io.OutputStreamfileStream =>
			val java.util.jar.JarOutputStreamjarOut = (java.io.OutputStream)java.util.jar.JarOutputStreamnew java.util.jar.JarOutputStreamJarOutputStream(java.io.OutputStreamfileStream)
			object sbt.ControlControl.(=> String,sbt.Logger)(=> Option[String])(=> Unit)Option[String]trapUnitAndFinally(java.lang.String("Error unpacking '")"Error unpacking '" (Any)java.lang.String+ sbt.PathpackedPath (Any)java.lang.String+ java.lang.String("': ")"': ", sbt.Loggerlog)
				{ java.util.jar.Pack200.Unpackerunpacker.(java.io.File,java.util.jar.JarOutputStream)Unitunpack(sbt.PathpackedPath.=> java.io.FileasFile, java.util.jar.JarOutputStreamjarOut); object NoneNone }
				{ java.util.jar.JarOutputStreamjarOut.()Unitclose() }
		}
	}
	def => scala.collection.Map[String,String]defaultPackerOptions: scala.collection.Map[String,String]Map[String, String] = scala.collection.immutable.((String, Nothing)*)scala.collection.immutable.Map[String,Nothing]Map()
}

import java.net.URL
/** This is somewhat of a mess and is not entirely correct.  jarsigner doesn't work properly
* on scalaz and it is difficult to determine whether a jar is both signed and valid.  */
object object sbt.SignJarSignJar
{
	final class class SignOption extends java.lang.Object with NotNull with ScalaObjectSignOption private[SignJar](val List[String]toList: List[String]List[String], val BooleansignOnly: BooleanBoolean) extends NotNullNotNull
	{
		override def ()StringtoString = => List[String]toList.(String)StringmkString(java.lang.String(" ")" ")
	}
	def (java.net.URL)sbt.SignJar.SignOptionkeyStore(java.net.URLurl: java.net.URLURL) = sbt.SignJar.SignOptionnew sbt.SignJar.SignOptionSignOption(java.lang.String("-keystore")"-keystore" (java.lang.String)List[java.lang.String]:: java.net.URLurl.()java.lang.StringtoExternalForm (java.lang.String)List[java.lang.String]:: object NilNil, Boolean(true)true)
	def (sbt.Path)sbt.SignJar.SignOptionsignedJar(sbt.Pathp: sbt.PathPath) = sbt.SignJar.SignOptionnew sbt.SignJar.SignOptionSignOption(java.lang.String("-signedjar")"-signedjar" (java.lang.String)List[java.lang.String]:: sbt.Pathp.=> java.io.FileasFile.()java.lang.StringgetAbsolutePath (java.lang.String)List[java.lang.String]:: object NilNil, Boolean(true)true)
	def => sbt.SignJar.SignOptionverbose = sbt.SignJar.SignOptionnew sbt.SignJar.SignOptionSignOption(java.lang.String("-verbose")"-verbose" (java.lang.String)List[java.lang.String]:: object NilNil, Boolean(false)false)
	def (String)sbt.SignJar.SignOptionsigFile(Stringname: StringString) = sbt.SignJar.SignOptionnew sbt.SignJar.SignOptionSignOption(java.lang.String("-sigfile")"-sigfile" (String)List[String]:: Stringname (String)List[String]:: object NilNil, Boolean(true)true)
	def (String)sbt.SignJar.SignOptionstoreType(Stringt: StringString) = sbt.SignJar.SignOptionnew sbt.SignJar.SignOptionSignOption(java.lang.String("-storetype")"-storetype" (String)List[String]:: Stringt (String)List[String]:: object NilNil, Boolean(false)false)
	def (String)sbt.SignJar.SignOptionprovider(Stringp: StringString) = sbt.SignJar.SignOptionnew sbt.SignJar.SignOptionSignOption(java.lang.String("-provider")"-provider" (String)List[String]:: Stringp (String)List[String]:: object NilNil, Boolean(false)false)
	def (String)sbt.SignJar.SignOptionproviderName(Stringp: StringString) = sbt.SignJar.SignOptionnew sbt.SignJar.SignOptionSignOption(java.lang.String("-providerName")"-providerName" (String)List[String]:: Stringp (String)List[String]:: object NilNil, Boolean(false)false)
	def (String)sbt.SignJar.SignOptionstorePassword(Stringp: StringString) = sbt.SignJar.SignOptionnew sbt.SignJar.SignOptionSignOption(java.lang.String("-storepass")"-storepass" (String)List[String]:: Stringp (String)List[String]:: object NilNil, Boolean(true)true)
	def (String)sbt.SignJar.SignOptionkeyPassword(Stringp: StringString) = sbt.SignJar.SignOptionnew sbt.SignJar.SignOptionSignOption(java.lang.String("-keypass")"-keypass" (String)List[String]:: Stringp (String)List[String]:: object NilNil, Boolean(true)true)
	
	private def => java.lang.StringVerifyOption = java.lang.String("-verify")"-verify"
	
	/** Uses jarsigner to sign the given jar.  */
	def (sbt.Path,String,Seq[sbt.SignJar.SignOption],sbt.Logger)Option[String]sign(sbt.PathjarPath: sbt.PathPath, Stringalias: StringString, Seq[sbt.SignJar.SignOption]options: Seq[sbt.SignJar.SignOption]Seq[SignOption], sbt.Loggerlog: sbt.LoggerLogger): Option[String]Option[String] =
	{
		(Boolean,=> Any)Unitrequire(=> Boolean!Stringalias.implicit scala.Predef.stringWrapper : (String)scala.runtime.RichStringtrim.=> BooleanisEmpty, java.lang.String("Alias cannot be empty")"Alias cannot be empty")
		val List[String]arguments = Seq[sbt.SignJar.SignOption]options.=> List[sbt.SignJar.SignOption]toList.((sbt.SignJar.SignOption) => Iterable[String])List[String]flatMap(sbt.SignJar.SignOption_.=> List[String]toList) (List[String])List[String]::: sbt.PathjarPath.=> java.io.FileasFile.()java.lang.StringgetAbsolutePath (String)List[String]:: Stringalias (String)List[String]:: object NilNil
		val sbt.ProcessRunnerpr = ((String,Seq[String])sbt.ProcessRunnernew sbt.ProcessRunnerProcessRunner(=> java.lang.StringCommandName, List[String]arguments)).(sbt.Logger)sbt.ProcessRunnerlogIO(sbt.Loggerlog)
		val IntexitCode = sbt.ProcessRunnerpr.=> sbt.SProcessrun.()IntexitValue()
		Option[String]if(IntexitCode (Int)Boolean== Int(0)0)
		{
			sbt.Loggerlog.(=> String)Unitdebug(java.lang.String("Signed ")"Signed " (Any)java.lang.String+ sbt.PathjarPath)
			object NoneNone
		}
		else
			(java.lang.String)Some[java.lang.String]Some(java.lang.String("Error signing jar (exit code was ")"Error signing jar (exit code was " (Any)java.lang.String+ IntexitCode (Any)java.lang.String+ java.lang.String(".)")".)")
	}
	/** Uses jarsigner to verify the given jar.*/
	def (sbt.Path,Seq[sbt.SignJar.SignOption],sbt.Logger)Option[String]verify(sbt.PathjarPath: sbt.PathPath, Seq[sbt.SignJar.SignOption]options: Seq[sbt.SignJar.SignOption]Seq[SignOption], sbt.Loggerlog: sbt.LoggerLogger): Option[String]Option[String] =
	{
		val List[java.lang.String]arguments = Seq[sbt.SignJar.SignOption]options.((sbt.SignJar.SignOption) => Boolean)Seq[sbt.SignJar.SignOption]filter(=> Boolean!sbt.SignJar.SignOption_.=> BooleansignOnly).=> List[sbt.SignJar.SignOption]toList.((sbt.SignJar.SignOption) => Iterable[String])List[String]flatMap(sbt.SignJar.SignOption_.=> List[String]toList) (List[java.lang.String])List[java.lang.String]::: => java.lang.StringVerifyOption (java.lang.String)List[java.lang.String]:: sbt.PathjarPath.=> java.io.FileasFile.()java.lang.StringgetAbsolutePath (java.lang.String)List[java.lang.String]:: object NilNil
		val sbt.ProcessRunnerpr = ((String,Seq[String])sbt.ProcessRunnernew sbt.ProcessRunnerProcessRunner(=> java.lang.StringCommandName, List[java.lang.String]arguments)).(sbt.Logger)sbt.ProcessRunnerlogIO(sbt.Loggerlog)
		val IntexitCode = sbt.ProcessRunnerpr.=> sbt.SProcessrun.()IntexitValue()
		Option[String]if(IntexitCode (Int)Boolean== Int(0)0)
		{
			sbt.Loggerlog.(=> String)Unitdebug(java.lang.String("Verified ")"Verified " (Any)java.lang.String+ sbt.PathjarPath)
			object NoneNone
		}
		else
			(java.lang.String)Some[java.lang.String]Some(java.lang.String("Error verifying jar (exit code was ")"Error verifying jar (exit code was " (Any)java.lang.String+ IntexitCode (Any)java.lang.String+ java.lang.String(".)")".)")
	}
	
	val java.lang.StringCommandName = java.lang.String("jarsigner")"jarsigner"
}