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

import java.io.File
import scala.collection.Set
import scala.collection.mutable.{HashSet, ListBuffer}

private[sbt] object object sbt.ClasspathUtilitiesClasspathUtilities
{
	def (sbt.Path)BooleanisArchive(sbt.Pathpath: sbt.PathPath): BooleanBoolean = (java.io.File)BooleanisArchive(sbt.Pathpath.=> java.io.FileasFile)
	def (java.io.File)BooleanisArchive(java.io.Filefile: java.io.FileFile): BooleanBoolean = (String)BooleanisArchiveName(java.io.Filefile.()java.lang.StringgetName)
	def (String)BooleanisArchiveName(StringfileName: StringString) = StringfileName.(java.lang.String)BooleanendsWith(java.lang.String(".jar")".jar") (Boolean)Boolean|| StringfileName.(java.lang.String)BooleanendsWith(java.lang.String(".zip")".zip")
	// (jars, dirs)
	def (Iterable[java.io.File])(Iterable[java.io.File], Iterable[java.io.File])separate(Iterable[java.io.File]paths: Iterable[java.io.File]Iterable[File]): (Iterable[java.io.File], Iterable[java.io.File])(Iterable[File], Iterable[File]) = Iterable[java.io.File]paths.((java.io.File) => Boolean)(Iterable[java.io.File], Iterable[java.io.File])partition((java.io.File)BooleanisArchive)
	def (Iterable[sbt.Path])(Iterable[java.io.File], Iterable[java.io.File])separatePaths(Iterable[sbt.Path]paths: Iterable[sbt.Path]Iterable[Path]) = (Iterable[java.io.File])(Iterable[java.io.File], Iterable[java.io.File])separate(Iterable[sbt.Path]paths.((sbt.Path) => java.io.File)Iterable[java.io.File]map(sbt.Path_.=> java.io.FileasFile.()java.io.FilegetCanonicalFile))
	def (Iterable[sbt.Path])(scala.collection.Set[java.io.File], scala.collection.Set[java.io.File])buildSearchPaths(Iterable[sbt.Path]classpath: Iterable[sbt.Path]Iterable[Path]): (scala.collection.Set[java.io.File], scala.collection.Set[java.io.File])(Set[File], Set[File]) =
	{
		val (Iterable[java.io.File], Iterable[java.io.File])(Iterable[java.io.File]jars, Iterable[java.io.File]dirs) = (Iterable[sbt.Path])(Iterable[java.io.File], Iterable[java.io.File])separatePaths(Iterable[sbt.Path]classpath)
		(scala.collection.Set[java.io.File],scala.collection.Set[java.io.File])(scala.collection.Set[java.io.File], scala.collection.Set[java.io.File])((Iterable[java.io.File])scala.collection.Set[java.io.File]linkedSet(Iterable[java.io.File]jars (Iterable[java.io.File])Collection[java.io.File]++ => scala.collection.Set[java.io.File]extraJars), (Iterable[java.io.File])scala.collection.Set[java.io.File]linkedSet(Iterable[java.io.File]dirs (Iterable[java.io.File])Collection[java.io.File]++ => scala.collection.Set[java.io.File]extraDirs))
	}
	def (scala.collection.Set[java.io.File],Iterable[java.io.File],java.io.File)BooleanonClasspath(scala.collection.Set[java.io.File]classpathJars: scala.collection.Set[java.io.File]Set[File], Iterable[java.io.File]classpathDirectories: Iterable[java.io.File]Iterable[File], java.io.Filefile: java.io.FileFile): BooleanBoolean =
	{
		val java.io.Filef = java.io.Filefile.()java.io.FilegetCanonicalFile
		Booleanif(object sbt.ClasspathUtilitiesClasspathUtilities.(java.io.File)BooleanisArchive(java.io.Filef))
			scala.collection.Set[java.io.File]classpathJars.(java.io.File)Booleancontains(java.io.Filef)
		else
			Iterable[java.io.File]classpathDirectories.((java.io.File) => Boolean)Option[java.io.File]find(object sbt.PathPath.(java.io.File,java.io.File)Option[String]relativize(java.io.File_, java.io.Filef).=> BooleanisDefined).=> BooleanisDefined
	}
	
	private lazy val (scala.collection.Set[java.io.File], scala.collection.Set[java.io.File])(scala.collection.Set[java.io.File]extraJars, scala.collection.Set[java.io.File]extraDirs) =
	{
		import scala.tools.nsc.GenericRunnerCommand
		val scala.tools.nsc.GenericRunnerSettingssettings = ((List[String],(String) => Unit)scala.tools.nsc.GenericRunnerCommandnew scala.tools.nsc.GenericRunnerCommandGenericRunnerCommand(object NilNil, Stringmessage => (String)Nothingerror(Stringmessage))).=> scala.tools.nsc.GenericRunnerSettingssettings
		val List[java.io.File]bootPaths = object sbt.FileUtilitiesFileUtilities.(String)Array[java.lang.String]pathSplit(scala.tools.nsc.GenericRunnerSettingssettings.=> scala.tools.nsc.Settings.StringSettingbootclasspath.=> settings.bootclasspath.Tvalue).((java.lang.String) => java.io.File)Array[java.io.File]map(java.lang.Stringp => java.io.Filenew java.io.FileFile(java.lang.Stringp)).=> List[java.io.File]toList
		val (Iterable[java.io.File], Iterable[java.io.File])(Iterable[java.io.File]bootJars, Iterable[java.io.File]bootDirs) = (Iterable[java.io.File])(Iterable[java.io.File], Iterable[java.io.File])separate(List[java.io.File]bootPaths)
		val List[java.io.File]extJars =
		{
			val scala.collection.mutable.ListBuffer[java.io.File]buffer = scala.collection.mutable.ListBuffer[java.io.File]new scala.collection.mutable.ListBuffer[java.io.File]ListBuffer[File]
			def (java.io.File)UnitfindJars(java.io.Filedir: java.io.FileFile)
			{
				scala.collection.mutable.ListBuffer[java.io.File]buffer (Iterable[java.io.File])Unit++= java.io.Filedir.(java.io.FileFilter)Array[java.io.File]listFiles(sbt.SimpleFileFilternew sbt.SimpleFileFilterSimpleFileFilter((java.io.File)BooleanisArchive))
				for(((java.io.File) => Unit)Unitdir <- java.io.Filedir.(java.io.FileFilter)Array[java.io.File]listFiles(object sbt.DirectoryFilterDirectoryFilter))
					(java.io.File)UnitfindJars(java.io.Filedir)
			}
			for((((java.lang.String, java.io.File)) => Unit)Unitpath <- object sbt.FileUtilitiesFileUtilities.(String)Array[java.lang.String]pathSplit(scala.tools.nsc.GenericRunnerSettingssettings.=> scala.tools.nsc.Settings.StringSettingextdirs.=> settings.extdirs.Tvalue); val java.io.Filedir = java.io.Filenew java.io.FileFile(java.lang.Stringpath) if java.io.Filedir.()BooleanisDirectory)
				(java.io.File)UnitfindJars(java.io.Filedir)
			scala.collection.mutable.ListBuffer[java.io.File]buffer.=> List[java.io.File]readOnly.((java.io.File) => java.io.File)List[java.io.File]map(java.io.File_.()java.io.FilegetCanonicalFile)
		}
		(scala.collection.Set[java.io.File],scala.collection.Set[java.io.File])(scala.collection.Set[java.io.File], scala.collection.Set[java.io.File])((Iterable[java.io.File])scala.collection.Set[java.io.File]linkedSet(List[java.io.File]extJars (Iterable[java.io.File])List[java.io.File]++ Iterable[java.io.File]bootJars), (Iterable[java.io.File])scala.collection.Set[java.io.File]linkedSet(Iterable[java.io.File]bootDirs))
	}
	private def [T](Iterable[T])scala.collection.Set[T]linkedSet[>: Nothing <: AnyT](Iterable[T]s: Iterable[T]Iterable[T]): scala.collection.Set[T]Set[T] =
	{
		import scala.collection.jcl.Conversions.convertSet
		val scala.collection.mutable.Set[T]set: scala.collection.mutable.scala.collection.mutable.Set[T]Set[T] = (java.util.Set[T])java.lang.Object with scala.collection.jcl.SetWrapper[T]new java.util.java.util.LinkedHashSet[T]LinkedHashSet[T]
		scala.collection.mutable.Set[T]set (Iterable[T])Unit++= Iterable[T]s
		scala.collection.mutable.Set[T]set.=> scala.collection.Set[T]readOnly
	}
}

import java.net.{URL, URLClassLoader}
private abstract class class LoaderBase extends java.net.URLClassLoader with NotNull with ScalaObjectLoaderBase(Array[java.net.URL]urls: Array[java.net.URL]Array[URL], java.lang.ClassLoaderparent: java.lang.ClassLoaderClassLoader) extends java.net.URLClassLoaderURLClassLoader(Array[java.net.URL]urls, java.lang.ClassLoaderparent) with NotNullNotNull
{
	(Boolean)Unitrequire(java.lang.ClassLoaderparent (AnyRef)Boolean!= Null(null)null) // included because a null parent is legitimate in Java
	@throwsthrows(java.lang.Class[java.lang.ClassNotFoundException]classOf[ClassNotFoundException])
	override final def (String,Boolean)Class[_]loadClass(StringclassName: StringString, Booleanresolve: BooleanBoolean): Class[_]Class[_] =
	{
		val java.lang.Class[_]loaded = (java.lang.String)java.lang.Class[_]findLoadedClass(StringclassName)
		val java.lang.Class[_ >: _$2 with ?0]found =
			java.lang.Class[_8]if(java.lang.Class[_]loaded (AnyRef)Boolean== Null(null)null)
				(String)Class[_]doLoadClass(StringclassName)
			else
				java.lang.Class[_]loaded
			
		Unitif(Booleanresolve)
			(java.lang.Class[_])UnitresolveClass(java.lang.Class[_ >: _$2 with ?0]found)
		java.lang.Class[_ >: _$2 with ?0]found
	}
	protected def (String)Class[_]doLoadClass(StringclassName: StringString): Class[_]Class[_]
	protected final def (String)Class[_]selfLoadClass(StringclassName: StringString): Class[_]Class[_] = super.(java.lang.String,Boolean)java.lang.Class[_]loadClass(StringclassName, Boolean(false)false)
}
private class class IntermediateLoader extends sbt.LoaderBase with NotNull with ScalaObjectIntermediateLoader(Array[java.net.URL]urls: Array[java.net.URL]Array[URL], java.lang.ClassLoaderparent: java.lang.ClassLoaderClassLoader) extends sbt.LoaderBaseLoaderBase(Array[java.net.URL]urls, java.lang.ClassLoaderparent) with NotNullNotNull
{
	def (String)Class[_]doLoadClass(StringclassName: StringString): Class[_]Class[_] =
	{
		// if this loader is asked to load an sbt class, it must be because the project we are building is sbt itself,
		 // so we want to load the version of classes on the project classpath, not the parent
		java.lang.Class[_9]if(StringclassName.(java.lang.String)BooleanstartsWith(object sbt.LoadersLoaders.=> java.lang.StringSbtPackage))
			(java.lang.String)java.lang.Class[_]findClass(StringclassName)
		else
			(String)Class[_]selfLoadClass(StringclassName)
	}
}
private class class FilteredLoader extends java.net.URLClassLoader with NotNull with ScalaObjectFilteredLoader(Array[java.net.URL]urls: Array[java.net.URL]Array[URL], java.lang.ClassLoaderparent: java.lang.ClassLoaderClassLoader, sbt.ClassFilterfilter: sbt.ClassFilterClassFilter) extends java.net.URLClassLoaderURLClassLoader(Array[java.net.URL]urls, java.lang.ClassLoaderparent) with NotNullNotNull
{
	def (Array[java.net.URL],java.lang.ClassLoader,Iterable[String])sbt.FilteredLoaderthis(Array[java.net.URL]urls: Array[java.net.URL]Array[URL], java.lang.ClassLoaderparent: java.lang.ClassLoaderClassLoader, Iterable[String]includePackages: Iterable[String]Iterable[String]) =
		FilteredLoader.this.typethis(Array[java.net.URL]urls, java.lang.ClassLoaderparent, template $anon extends java.lang.Object with sbt.ClassFilternew sbt.ClassFilterClassFilter { def (String)Booleaninclude(StringclassName: StringString) = Iterable[String]includePackages.((String) => Boolean)Booleanexists(StringclassName.(java.lang.String)BooleanstartsWith) })
	(Boolean)Unitrequire(java.lang.ClassLoaderparent (AnyRef)Boolean!= Null(null)null) // included because a null parent is legitimate in Java
	@throwsthrows(java.lang.Class[java.lang.ClassNotFoundException]classOf[ClassNotFoundException])
	override final def (String,Boolean)Class[_]loadClass(StringclassName: StringString, Booleanresolve: BooleanBoolean): Class[_]Class[_] =
	{
		java.lang.Class[_10]if(sbt.ClassFilterfilter.(String)Booleaninclude(StringclassName))
			super.(java.lang.String,Boolean)java.lang.Class[_]loadClass(StringclassName, Booleanresolve)
		else
		{
			val java.lang.Class[_]loaded = java.lang.ClassLoaderparent.(java.lang.String)java.lang.Class[_]loadClass(StringclassName)
			Unitif(Booleanresolve)
				(java.lang.Class[_])UnitresolveClass(java.lang.Class[_]loaded)
			java.lang.Class[_]loaded
		}
	}
}
private trait trait ClassFilter extends java.lang.ObjectClassFilter
{
	def (String)Booleaninclude(StringclassName: StringString): BooleanBoolean
}
private class class LazyFrameworkLoader extends sbt.LoaderBase with NotNull with ScalaObjectLazyFrameworkLoader(StringrunnerClassName: StringString, Array[java.net.URL]urls: Array[java.net.URL]Array[URL], java.lang.ClassLoaderparent: java.lang.ClassLoaderClassLoader, java.lang.ClassLoadergrandparent: java.lang.ClassLoaderClassLoader)
	extends sbt.LoaderBaseLoaderBase(Array[java.net.URL]urls, java.lang.ClassLoaderparent) with NotNullNotNull
{
	def (String)Class[_]doLoadClass(StringclassName: StringString): Class[_]Class[_] =
	{
		java.lang.Class[_12]if(object sbt.LoadersLoaders.(String,String)BooleanisNestedOrSelf(StringclassName, StringrunnerClassName))
			(java.lang.String)java.lang.Class[_]findClass(StringclassName)
		else java.lang.Class[_11]if(StringclassName.(java.lang.String)BooleanstartsWith(object sbt.LoadersLoaders.=> java.lang.StringSbtPackage)) // we circumvent the parent loader because we know that we want the
			java.lang.ClassLoadergrandparent.(java.lang.String)java.lang.Class[_]loadClass(StringclassName)              // version of sbt that is currently the builder (not the project being built)
		else
			java.lang.ClassLoaderparent.(java.lang.String)java.lang.Class[_]loadClass(StringclassName)
	}
}
private object object sbt.LoadersLoaders
{
	val java.lang.StringSbtPackage = java.lang.String("sbt.")"sbt."
	def (String,String)BooleanisNestedOrSelf(StringclassName: StringString, StringcheckAgainst: StringString) =
		StringclassName (AnyRef)Boolean== StringcheckAgainst (Boolean)Boolean|| StringclassName.(java.lang.String)BooleanstartsWith(StringcheckAgainst (Any)java.lang.String+ java.lang.String("$")"$")
}