From 96996da2f6ad26bbec9a246c6e66604d7411c76c Mon Sep 17 00:00:00 2001
From: Jaspal Singh Dhillon <jaspal.iiith@gmail.com>
Date: Mon, 19 May 2014 13:42:36 +0530
Subject: [PATCH] java: Don't throw exceptions at user when the main class is
 not found

Fixes https://github.com/cloudius-systems/mgmt/issues/33

If a user runs 'java xyz', instead of throwing the stacktrace, a simple
message informing the user about the missing class, should suffice.

Signed-off-by: Jaspal Singh Dhillon <jaspal.iiith@gmail.com>
Reviewed-by: Tomasz Grabiec <tgrabiec@gmail.com>
Signed-off-by: Pekka Enberg <penberg@cloudius-systems.com>
---
 .../src/main/java/io/osv/ContextIsolator.java | 13 +++++++++---
 .../io/osv/MainClassNotFoundException.java    | 21 +++++++++++++++++++
 .../runjava/src/main/java/io/osv/RunJava.java |  8 ++++++-
 3 files changed, 38 insertions(+), 4 deletions(-)
 create mode 100644 java/runjava/src/main/java/io/osv/MainClassNotFoundException.java

diff --git a/java/runjava/src/main/java/io/osv/ContextIsolator.java b/java/runjava/src/main/java/io/osv/ContextIsolator.java
index 96e00504b..19e8e200c 100644
--- a/java/runjava/src/main/java/io/osv/ContextIsolator.java
+++ b/java/runjava/src/main/java/io/osv/ContextIsolator.java
@@ -107,7 +107,9 @@ public class ContextIsolator {
                     runMain(loadClass(mainClass), args);
                 } catch (InterruptedException e) {
                     Thread.currentThread().interrupt();
-                } catch (Throwable e) {
+                } catch (MainClassNotFoundException e) {
+		    context.setException(e);
+		} catch (Throwable e) {
                     getUncaughtExceptionHandler().uncaughtException(this, e);
                 }
             }
@@ -253,8 +255,13 @@ public class ContextIsolator {
         return new File(path).isDirectory();
     }
 
-    private static Class<?> loadClass(String name) throws ClassNotFoundException {
-        return Thread.currentThread().getContextClassLoader().loadClass(name);
+    private static Class<?> loadClass(String name) throws MainClassNotFoundException {
+        try {
+	    Class<?> clazz = Thread.currentThread().getContextClassLoader().loadClass(name);
+	    return clazz;
+	} catch (ClassNotFoundException ex) {
+	    throw new MainClassNotFoundException(name);
+	}
     }
 
     // Expand classpath, as given in the "-classpath" option, to a list of
diff --git a/java/runjava/src/main/java/io/osv/MainClassNotFoundException.java b/java/runjava/src/main/java/io/osv/MainClassNotFoundException.java
new file mode 100644
index 000000000..9c57060a9
--- /dev/null
+++ b/java/runjava/src/main/java/io/osv/MainClassNotFoundException.java
@@ -0,0 +1,21 @@
+package io.osv;
+
+/*
+ *   Copyright (C) 2014 Jaspal Singh Dhillon
+ *
+ *   This work is open source software, licensed under the terms of the
+ *   BSD license as described in the LICENSE file in the top-level directory.
+ */
+
+public class MainClassNotFoundException extends Exception {
+
+    private String mainClassName;
+
+    public MainClassNotFoundException(String mainClass) {
+	mainClassName = mainClass;
+    }
+
+    public String getClassName() {
+        return mainClassName;
+    }
+}
diff --git a/java/runjava/src/main/java/io/osv/RunJava.java b/java/runjava/src/main/java/io/osv/RunJava.java
index 6c8c00580..a826f24c1 100644
--- a/java/runjava/src/main/java/io/osv/RunJava.java
+++ b/java/runjava/src/main/java/io/osv/RunJava.java
@@ -26,7 +26,13 @@ public class RunJava {
             ContextIsolator.getInstance().runSync(args);
         } catch (IllegalArgumentException ex) {
             System.err.println("RunJava: " + ex.getMessage());
-        } catch (Throwable ex) {
+        } catch (ContextFailedException ex) {
+	    if (ex.getCause() instanceof MainClassNotFoundException) {
+	        System.err.println("Error: Could not find or load main class " + ((MainClassNotFoundException)ex.getCause()).getClassName());
+	    } else {
+	        ex.printStackTrace();
+	    }
+	} catch (Throwable ex) {
             ex.printStackTrace();
         }
     }
-- 
GitLab