Repository: incubator-gearpump
Updated Branches:
  refs/heads/master fb0f1ef31 -> d191e134c


[GEARPUMP-272] Don't warn on classname as first argument

Author: manuzhang <[email protected]>

Closes #148 from manuzhang/app_submit.


Project: http://git-wip-us.apache.org/repos/asf/incubator-gearpump/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-gearpump/commit/d191e134
Tree: http://git-wip-us.apache.org/repos/asf/incubator-gearpump/tree/d191e134
Diff: http://git-wip-us.apache.org/repos/asf/incubator-gearpump/diff/d191e134

Branch: refs/heads/master
Commit: d191e134c7281a3de5eba27f4e719b81b70ba6bd
Parents: fb0f1ef
Author: manuzhang <[email protected]>
Authored: Tue Feb 14 16:16:21 2017 +0800
Committer: manuzhang <[email protected]>
Committed: Tue Feb 14 16:16:29 2017 +0800

----------------------------------------------------------------------
 .../gearpump/cluster/main/AppSubmitter.scala    | 31 +++++++++++-------
 .../gearpump/cluster/main/ArgumentsParser.scala | 34 +++++++++-----------
 2 files changed, 35 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-gearpump/blob/d191e134/core/src/main/scala/org/apache/gearpump/cluster/main/AppSubmitter.scala
----------------------------------------------------------------------
diff --git 
a/core/src/main/scala/org/apache/gearpump/cluster/main/AppSubmitter.scala 
b/core/src/main/scala/org/apache/gearpump/cluster/main/AppSubmitter.scala
index 81cfcbc..1aa449e 100644
--- a/core/src/main/scala/org/apache/gearpump/cluster/main/AppSubmitter.scala
+++ b/core/src/main/scala/org/apache/gearpump/cluster/main/AppSubmitter.scala
@@ -23,6 +23,8 @@ import java.util.jar.JarFile
 
 import org.apache.gearpump.util.{AkkaApp, Constants, LogUtil, Util}
 
+import scala.util.{Failure, Success, Try}
+
 /** Tool to submit an application jar to cluster */
 object AppSubmitter extends AkkaApp with ArgumentsParser {
 
@@ -86,18 +88,25 @@ object AppSubmitter extends AkkaApp with ArgumentsParser {
     }
   }
 
-  private def parseMain(jar: File, remainArgs: Array[String], classLoader: 
ClassLoader)
-    : (String, Array[String]) = {
-    val mainInManifest = Option(new JarFile(jar).getManifest.getMainAttributes.
-      getValue("Main-Class")).getOrElse("")
-
-    if (remainArgs.length > 0) {
-      classLoader.loadClass(remainArgs(0))
-      (remainArgs(0), remainArgs.drop(1))
-    } else if (mainInManifest.nonEmpty) {
-      (mainInManifest, remainArgs)
+  private def parseMain(jar: File, remainArgs: Array[String],
+      classLoader: ClassLoader): (String, Array[String]) = {
+    if (remainArgs.nonEmpty && 
Try(classLoader.loadClass(remainArgs.head)).isSuccess) {
+      (remainArgs.head, remainArgs.tail)
     } else {
-      throw new Exception("No main class specified")
+      val mainInManifest =
+        new JarFile(jar).getManifest.getMainAttributes.getValue("Main-Class")
+      Try(classLoader.loadClass(mainInManifest)) match {
+        case Success(_) =>
+          // scalastyle:off println
+          Console.println(
+            s"""Can't load main class ${remainArgs.head} in arguments;
+              |Loading $mainInManifest in manifest""".stripMargin)
+          // scalastyle:on println
+          (mainInManifest, remainArgs)
+        case Failure(_) =>
+          throw new IllegalArgumentException(
+            s"Can't load main class ${remainArgs.head} in arguments or 
$mainInManifest in manifest")
+      }
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-gearpump/blob/d191e134/core/src/main/scala/org/apache/gearpump/cluster/main/ArgumentsParser.scala
----------------------------------------------------------------------
diff --git 
a/core/src/main/scala/org/apache/gearpump/cluster/main/ArgumentsParser.scala 
b/core/src/main/scala/org/apache/gearpump/cluster/main/ArgumentsParser.scala
index 02c6f1a..1714e3b 100644
--- a/core/src/main/scala/org/apache/gearpump/cluster/main/ArgumentsParser.scala
+++ b/core/src/main/scala/org/apache/gearpump/cluster/main/ArgumentsParser.scala
@@ -24,13 +24,13 @@ case class CLIOption[+T](
     description: String = "", required: Boolean = false, defaultValue: 
Option[T] = None)
 
 class ParseResult(optionMap: Map[String, String], remainArguments: 
Array[String]) {
-  def getInt(key: String): Int = optionMap.get(key).get.toInt
+  def getInt(key: String): Int = optionMap(key).toInt
 
-  def getString(key: String): String = optionMap.get(key).get
+  def getString(key: String): String = optionMap(key)
 
-  def getBoolean(key: String): Boolean = optionMap.get(key).get.toBoolean
+  def getBoolean(key: String): Boolean = optionMap(key).toBoolean
 
-  def exists(key: String): Boolean = !(optionMap.getOrElse(key, "").isEmpty)
+  def exists(key: String): Boolean = !optionMap.getOrElse(key, "").isEmpty
 
   def remainArgs: Array[String] = this.remainArguments
 }
@@ -47,15 +47,13 @@ trait ArgumentsParser {
   // scalastyle:off println
   def help(): Unit = {
     Console.println(s"\nHelp: $description")
-    var usage = List.empty[String]
-    options.map(kv => if (kv._2.required) {
-      usage = usage :+ s"-${kv._1} 
(required:${kv._2.required})${kv._2.description}"
+    val usage = options.map(kv => if (kv._2.required) {
+      s"-${kv._1} (required:${kv._2.required})${kv._2.description}"
     } else {
-      usage = usage :+ s"-${kv._1} (required:${kv._2.required}, " +
+      s"-${kv._1} (required:${kv._2.required}, " +
         s"default:${kv._2.defaultValue.getOrElse("")})${kv._2.description}"
-    })
-    usage :+= remainArgs.map(k => s"<$k>").mkString(" ")
-    usage.foreach(Console.println(_))
+    }) ++ remainArgs.map(k => s"<$k>").mkString(" ")
+    usage.foreach(Console.println)
   }
   // scalastyle:on println
 
@@ -72,14 +70,16 @@ trait ArgumentsParser {
 object ArgumentsParser {
 
   case class Syntax(
-      val options: Array[(String, CLIOption[Any])], val remainArgs: 
Array[String],
-      val ignoreUnknownArgument: Boolean)
+      options: Array[(String, CLIOption[Any])],
+      remainArgs: Array[String],
+      ignoreUnknownArgument: Boolean)
 
   def parse(syntax: Syntax, args: Array[String]): ParseResult = {
     import syntax.{ignoreUnknownArgument, options, remainArgs}
     var config = Map.empty[String, String]
     var remain = Array.empty[String]
 
+    @annotation.tailrec
     def doParse(argument: List[String]): Unit = {
       argument match {
         case Nil => Unit // true if everything processed successfully
@@ -107,9 +107,6 @@ object ArgumentsParser {
           doParse(rest)
 
         case value :: rest =>
-          // scalastyle:off println
-          Console.err.println(s"Warning: get unknown argument $value, maybe it 
is a main class")
-          // scalastyle:on println
           remain ++= value :: rest
           doParse(Nil)
       }
@@ -123,10 +120,9 @@ object ArgumentsParser {
       }
     }
 
-    options.foreach { pair =>
-      val (key, value) = pair
+    options.foreach { case (key, _) =>
       if (config.get(key).isEmpty) {
-        throw new Exception(s"Missing option ${key}...")
+        throw new Exception(s"Missing option $key...")
       }
     }
 

Reply via email to