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...") } }
