From 1396678baa0a0b9b47e50bb2da4970aca1351b2e Mon Sep 17 00:00:00 2001
From: Ismael Juma <ismael@juma.me.uk>
Date: Fri, 27 May 2011 09:37:34 +0100
Subject: [PATCH] Move REPL classes to separate module.

---
 core/src/main/scala/spark/ClosureCleaner.scala |  17 +++++++++++++----
 core/src/main/scala/spark/Executor.scala       |  10 +++++++++-
 project/build/SparkProject.scala               |   6 ++++++
 {core => repl}/lib/jline.jar                   | Bin
 .../scala/spark/repl/ExecutorClassLoader.scala |   0
 .../src/main/scala/spark/repl/Main.scala       |   0
 .../scala/spark/repl/SparkCompletion.scala     |   0
 .../spark/repl/SparkCompletionOutput.scala     |   0
 .../spark/repl/SparkInteractiveReader.scala    |   0
 .../scala/spark/repl/SparkInterpreter.scala    |   0
 .../spark/repl/SparkInterpreterLoop.scala      |   0
 .../spark/repl/SparkInterpreterSettings.scala  |   0
 .../scala/spark/repl/SparkJLineReader.scala    |   0
 .../scala/spark/repl/SparkSimpleReader.scala   |   0
 .../src/test/scala/spark/repl/ReplSuite.scala  |   0
 15 files changed, 28 insertions(+), 5 deletions(-)
 rename {core => repl}/lib/jline.jar (100%)
 rename {core => repl}/src/main/scala/spark/repl/ExecutorClassLoader.scala (100%)
 rename {core => repl}/src/main/scala/spark/repl/Main.scala (100%)
 rename {core => repl}/src/main/scala/spark/repl/SparkCompletion.scala (100%)
 rename {core => repl}/src/main/scala/spark/repl/SparkCompletionOutput.scala (100%)
 rename {core => repl}/src/main/scala/spark/repl/SparkInteractiveReader.scala (100%)
 rename {core => repl}/src/main/scala/spark/repl/SparkInterpreter.scala (100%)
 rename {core => repl}/src/main/scala/spark/repl/SparkInterpreterLoop.scala (100%)
 rename {core => repl}/src/main/scala/spark/repl/SparkInterpreterSettings.scala (100%)
 rename {core => repl}/src/main/scala/spark/repl/SparkJLineReader.scala (100%)
 rename {core => repl}/src/main/scala/spark/repl/SparkSimpleReader.scala (100%)
 rename {core => repl}/src/test/scala/spark/repl/ReplSuite.scala (100%)

diff --git a/core/src/main/scala/spark/ClosureCleaner.scala b/core/src/main/scala/spark/ClosureCleaner.scala
index 0e0b3954d4..c21e49e3ae 100644
--- a/core/src/main/scala/spark/ClosureCleaner.scala
+++ b/core/src/main/scala/spark/ClosureCleaner.scala
@@ -64,10 +64,19 @@ object ClosureCleaner extends Logging {
       accessedFields(cls) = Set[String]()
     for (cls <- func.getClass :: innerClasses)
       getClassReader(cls).accept(new FieldAccessFinder(accessedFields), 0)
-    
+
+    val isInterpNull = {
+      try {
+        val klass = Class.forName("spark.repl.Main")
+        klass.getMethod("interp").invoke(null) == null
+      } catch {
+        case _: ClassNotFoundException => true
+      }
+    }
+
     var outer: AnyRef = null
     for ((cls, obj) <- (outerClasses zip outerObjects).reverse) {
-      outer = instantiateClass(cls, outer);
+      outer = instantiateClass(cls, outer, isInterpNull);
       for (fieldName <- accessedFields(cls)) {
         val field = cls.getDeclaredField(fieldName)
         field.setAccessible(true)
@@ -85,8 +94,8 @@ object ClosureCleaner extends Logging {
     }
   }
   
-  private def instantiateClass(cls: Class[_], outer: AnyRef): AnyRef = {
-    if (spark.repl.Main.interp == null) {
+  private def instantiateClass(cls: Class[_], outer: AnyRef, isInterpNull: Boolean): AnyRef = {
+    if (isInterpNull) {
       // This is a bona fide closure class, whose constructor has no effects
       // other than to set its fields, so use its constructor
       val cons = cls.getConstructors()(0)
diff --git a/core/src/main/scala/spark/Executor.scala b/core/src/main/scala/spark/Executor.scala
index e534f48879..f32e66bef4 100644
--- a/core/src/main/scala/spark/Executor.scala
+++ b/core/src/main/scala/spark/Executor.scala
@@ -105,7 +105,15 @@ class Executor extends mesos.Executor with Logging {
     val classUri = System.getProperty("spark.repl.class.uri")
     if (classUri != null) {
       logInfo("Using REPL class URI: " + classUri)
-      loader = new repl.ExecutorClassLoader(classUri, loader)
+      loader = {
+        try {
+          val klass = Class.forName("spark.repl.ExecutorClassLoader").asInstanceOf[Class[_ <: ClassLoader]]
+          val constructor = klass.getConstructor(classUri.getClass, loader.getClass)
+          constructor.newInstance(classUri, loader)
+        } catch {
+          case _: ClassNotFoundException => loader
+        }
+      }
     }
 
     return loader
diff --git a/project/build/SparkProject.scala b/project/build/SparkProject.scala
index 508e2018b3..413091f16a 100644
--- a/project/build/SparkProject.scala
+++ b/project/build/SparkProject.scala
@@ -10,6 +10,8 @@ class SparkProject(info: ProjectInfo) extends ParentProject(info) with IdeaProje
 
   lazy val core = project("core", "Spark Core", new CoreProject(_))
 
+  lazy val repl = project("repl", "Spark REPL", new ReplProject(_), core)
+
   lazy val examples = project("examples", "Spark Examples", new ExamplesProject(_), core)
 
   lazy val bagel = project("bagel", "Bagel", new BagelProject(_), core)
@@ -34,6 +36,10 @@ class SparkProject(info: ProjectInfo) extends ParentProject(info) with IdeaProje
     val jetty = jettyWebapp
   }
 
+  class ReplProject(info: ProjectInfo) extends DefaultProject(info) with BaseProject with DepJar with XmlTestReport {
+    val jetty = jettyWebapp
+  }
+
   class ExamplesProject(info: ProjectInfo) extends DefaultProject(info) with BaseProject {
     val colt = "colt" % "colt" % "1.2.0"
   }
diff --git a/core/lib/jline.jar b/repl/lib/jline.jar
similarity index 100%
rename from core/lib/jline.jar
rename to repl/lib/jline.jar
diff --git a/core/src/main/scala/spark/repl/ExecutorClassLoader.scala b/repl/src/main/scala/spark/repl/ExecutorClassLoader.scala
similarity index 100%
rename from core/src/main/scala/spark/repl/ExecutorClassLoader.scala
rename to repl/src/main/scala/spark/repl/ExecutorClassLoader.scala
diff --git a/core/src/main/scala/spark/repl/Main.scala b/repl/src/main/scala/spark/repl/Main.scala
similarity index 100%
rename from core/src/main/scala/spark/repl/Main.scala
rename to repl/src/main/scala/spark/repl/Main.scala
diff --git a/core/src/main/scala/spark/repl/SparkCompletion.scala b/repl/src/main/scala/spark/repl/SparkCompletion.scala
similarity index 100%
rename from core/src/main/scala/spark/repl/SparkCompletion.scala
rename to repl/src/main/scala/spark/repl/SparkCompletion.scala
diff --git a/core/src/main/scala/spark/repl/SparkCompletionOutput.scala b/repl/src/main/scala/spark/repl/SparkCompletionOutput.scala
similarity index 100%
rename from core/src/main/scala/spark/repl/SparkCompletionOutput.scala
rename to repl/src/main/scala/spark/repl/SparkCompletionOutput.scala
diff --git a/core/src/main/scala/spark/repl/SparkInteractiveReader.scala b/repl/src/main/scala/spark/repl/SparkInteractiveReader.scala
similarity index 100%
rename from core/src/main/scala/spark/repl/SparkInteractiveReader.scala
rename to repl/src/main/scala/spark/repl/SparkInteractiveReader.scala
diff --git a/core/src/main/scala/spark/repl/SparkInterpreter.scala b/repl/src/main/scala/spark/repl/SparkInterpreter.scala
similarity index 100%
rename from core/src/main/scala/spark/repl/SparkInterpreter.scala
rename to repl/src/main/scala/spark/repl/SparkInterpreter.scala
diff --git a/core/src/main/scala/spark/repl/SparkInterpreterLoop.scala b/repl/src/main/scala/spark/repl/SparkInterpreterLoop.scala
similarity index 100%
rename from core/src/main/scala/spark/repl/SparkInterpreterLoop.scala
rename to repl/src/main/scala/spark/repl/SparkInterpreterLoop.scala
diff --git a/core/src/main/scala/spark/repl/SparkInterpreterSettings.scala b/repl/src/main/scala/spark/repl/SparkInterpreterSettings.scala
similarity index 100%
rename from core/src/main/scala/spark/repl/SparkInterpreterSettings.scala
rename to repl/src/main/scala/spark/repl/SparkInterpreterSettings.scala
diff --git a/core/src/main/scala/spark/repl/SparkJLineReader.scala b/repl/src/main/scala/spark/repl/SparkJLineReader.scala
similarity index 100%
rename from core/src/main/scala/spark/repl/SparkJLineReader.scala
rename to repl/src/main/scala/spark/repl/SparkJLineReader.scala
diff --git a/core/src/main/scala/spark/repl/SparkSimpleReader.scala b/repl/src/main/scala/spark/repl/SparkSimpleReader.scala
similarity index 100%
rename from core/src/main/scala/spark/repl/SparkSimpleReader.scala
rename to repl/src/main/scala/spark/repl/SparkSimpleReader.scala
diff --git a/core/src/test/scala/spark/repl/ReplSuite.scala b/repl/src/test/scala/spark/repl/ReplSuite.scala
similarity index 100%
rename from core/src/test/scala/spark/repl/ReplSuite.scala
rename to repl/src/test/scala/spark/repl/ReplSuite.scala
-- 
GitLab