Bug 534037 - disable class instrumentation on unsupported JREs

Also cleaned up other messages produced by the javaagent

Change-Id: I4e54f3d4fee90568c299e624035edfea79aa6d5b
Signed-off-by: Igor Fedorenko <igor@ifedorenko.com>
diff --git a/org.eclipse.jdt.launching.javaagent/src/main/java/org/eclipse/jdt/launching/internal/javaagent/Premain.java b/org.eclipse.jdt.launching.javaagent/src/main/java/org/eclipse/jdt/launching/internal/javaagent/Premain.java
index e286992..d4546a5 100644
--- a/org.eclipse.jdt.launching.javaagent/src/main/java/org/eclipse/jdt/launching/internal/javaagent/Premain.java
+++ b/org.eclipse.jdt.launching.javaagent/src/main/java/org/eclipse/jdt/launching/internal/javaagent/Premain.java
@@ -10,6 +10,7 @@
  *******************************************************************************/
 package org.eclipse.jdt.launching.internal.javaagent;
 
+import java.io.InputStream;
 import java.lang.instrument.ClassFileTransformer;
 import java.lang.instrument.IllegalClassFormatException;
 import java.lang.instrument.Instrumentation;
@@ -18,12 +19,33 @@
 import java.security.ProtectionDomain;
 
 import org.eclipse.jdt.launching.internal.weaving.ClassfileTransformer;
+import org.objectweb.asm.ClassReader;
 
 public class Premain {
 	private static final ClassfileTransformer transformer = new ClassfileTransformer();
 
-	public static void premain(@SuppressWarnings("unused") String agentArgs, Instrumentation inst) {
-		// System.err.println("Advanced source lookup support loaded."); //$NON-NLS-1$
+	public static void premain(final String agentArgs, final Instrumentation inst) {
+		final boolean debuglog = "debuglog".equals(agentArgs); //$NON-NLS-1$
+
+		// disable instrumentation if ASM is not able to read Object.class definition
+		try {
+			InputStream is = ClassLoader.getSystemResourceAsStream("java/lang/Object.class"); //$NON-NLS-1$
+			try {
+				new ClassReader(is);
+			}
+			finally {
+				is.close();
+			}
+		}
+		catch (Exception e) {
+			String vendor = System.getProperty("java.vendor"); //$NON-NLS-1$
+			String version = System.getProperty("java.version"); //$NON-NLS-1$
+			System.err.printf("JRE %s/%s is not supported, advanced source lookup disabled: %s.\n", vendor, version, e.getMessage()); //$NON-NLS-1$
+			if (debuglog) {
+				e.printStackTrace(System.err);
+			}
+			return;
+		}
 
 		inst.addTransformer(new ClassFileTransformer() {
 			public byte[] transform(ClassLoader loader, final String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
@@ -51,11 +73,17 @@
 					return transformer.transform(classfileBuffer, location);
 				}
 				catch (Exception e) {
-					System.err.print("Could not instrument class " + className + ": "); //$NON-NLS-1$ //$NON-NLS-2$
-					e.printStackTrace(System.err);
+					System.err.printf("Could not instrument class %s: %s.\n", className, e.getMessage()); //$NON-NLS-1$
+					if (debuglog) {
+						e.printStackTrace(System.err);
+					}
 				}
 				return null;
 			}
 		});
+
+		if (debuglog) {
+			System.err.println("Advanced source lookup enabled."); //$NON-NLS-1$
+		}
 	}
 }
diff --git a/org.eclipse.jdt.launching/lib/javaagent-shaded.jar b/org.eclipse.jdt.launching/lib/javaagent-shaded.jar
index 43df9bf..fc80401 100644
--- a/org.eclipse.jdt.launching/lib/javaagent-shaded.jar
+++ b/org.eclipse.jdt.launching/lib/javaagent-shaded.jar
Binary files differ