SIRONA-64 dump on exit flag for javaagent + fixing tests on java 8

git-svn-id: https://svn.apache.org/repos/asf/incubator/sirona/trunk@1766254 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java b/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java
index 58ff0b9..c908f0c 100644
--- a/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java
+++ b/agent/javaagent/src/main/java/org/apache/sirona/javaagent/SironaAgent.java
@@ -16,10 +16,14 @@
  */
 package org.apache.sirona.javaagent;
 
+import org.apache.sirona.counters.Counter;
+import org.apache.sirona.repositories.Repository;
 import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
 import java.lang.instrument.Instrumentation;
 import java.lang.reflect.Method;
 import java.net.URL;
@@ -27,7 +31,6 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Timer;
 import java.util.jar.JarFile;
 
 import static java.util.Arrays.asList;
@@ -45,10 +48,9 @@
     public static void agentmain(final String agentArgs, final Instrumentation instrumentation) {
 
         // just to get information on weird issues :-)
-        Thread.currentThread().setUncaughtExceptionHandler( new Thread.UncaughtExceptionHandler(){
+        Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
             @Override
-            public void uncaughtException( Thread thread, Throwable throwable )
-            {
+            public void uncaughtException(Thread thread, Throwable throwable) {
                 System.out.println("uncaughtException for thread: " + thread.getName() + ", message:" + throwable.getMessage());
                 throwable.printStackTrace();
 
@@ -76,6 +78,37 @@
         final boolean autoEvictClassLoaders = "true".equalsIgnoreCase(extractConfig(agentArgs, "autoEvictClassLoaders="));
         final String tempClassLoaders = extractConfig(agentArgs, "tempClassLoaders=");
         final boolean envrtDebug = debug || "true".equalsIgnoreCase(extractConfig(agentArgs, "environment-debug="));
+        final String dumpOnExit = extractConfig(agentArgs, "dumpOnExit=");
+        if (dumpOnExit != null) {
+            Runtime.getRuntime().addShutdownHook(new Thread() {
+                {
+                    setName("sirona-dump-on-exit");
+                }
+
+                @Override
+                public void run() {
+                    FileWriter writer = null;
+                    try {
+                        writer = new FileWriter(dumpOnExit);
+                        writer.write("name;role;unit;average;min;max;hits;max concurrency");
+                        for (final Counter c : Repository.INSTANCE.counters()) {
+                            writer.write(c.getKey().getName() + ";" + c.getKey().getRole().getName() + ";" + c.getKey().getRole().getUnit().getName()
+                                    + ";" + c.getMean() + ";" + c.getMin() + ";" + c.getMax() + ";" + c.getHits() + ";" + c.getMaxConcurrency());
+                        }
+                    } catch (final IOException e) {
+                        throw new IllegalStateException(e);
+                    } finally {
+                        if (writer != null) {
+                            try {
+                                writer.close();
+                            } catch (final IOException e) {
+                                // no-op
+                            }
+                        }
+                    }
+                }
+            });
+        }
 
         final StringBuilder out = new StringBuilder();
         final String libs = extractConfig(agentArgs, "libs=");
@@ -110,13 +143,13 @@
         try {
             // setup agent parameters
             Class<?> clazz = Class.forName("org.apache.sirona.javaagent.AgentContext", true, loader);
-            Method addAgentParameterMethod = clazz.getMethod( "addAgentParameter", new Class[]{ String.class, String.class } );
-            Map<String,String> agentParameters=extractParameters( agentArgs );
-            for (Map.Entry<String,String> entry : agentParameters.entrySet() ){
-                addAgentParameterMethod.invoke( null, new String[]{entry.getKey(), entry.getValue() == null ? "" : entry.getValue()} );
+            Method addAgentParameterMethod = clazz.getMethod("addAgentParameter", new Class[]{String.class, String.class});
+            Map<String, String> agentParameters = extractParameters(agentArgs);
+            for (Map.Entry<String, String> entry : agentParameters.entrySet()) {
+                addAgentParameterMethod.invoke(null, new String[]{entry.getKey(), entry.getValue() == null ? "" : entry.getValue()});
 
             }
-        } catch ( final Exception e ) {
+        } catch (final Exception e) {
             e.printStackTrace();
         }
 
@@ -164,7 +197,7 @@
                             && instrumentation.isModifiableClass(clazz)) {
                         try {
 
-                            debug( loader, "reload clazz: {0}", clazz.getName() );
+                            debug(loader, "reload clazz: {0}", clazz.getName());
 
                             instrumentation.retransformClasses(clazz);
                         } catch (final Exception e) {
@@ -176,13 +209,13 @@
                     }
                 }
             } else {
-                if (isDebug(loader)){
+                if (isDebug(loader)) {
                     System.out.println("do not reload classes");
                 }
             }
         } catch (final Exception e) {
             if (isDebug(loader)) {
-                System.out.println( "finished instrumentation setup with exception:" + e.getMessage() );
+                System.out.println("finished instrumentation setup with exception:" + e.getMessage());
             }
             e.printStackTrace();
         }
@@ -203,30 +236,24 @@
     }
 
     private static void debug(ClassLoader loader, String msg, Object... objects) {
-        try
-        {
-            Method method =loader //
-                .loadClass( "org.apache.sirona.javaagent.logging.SironaAgentLogging") //
-                    .getMethod( "debug", String.class, Object.class );
+        try {
+            Method method = loader //
+                    .loadClass("org.apache.sirona.javaagent.logging.SironaAgentLogging") //
+                    .getMethod("debug", String.class, Object.class);
 
-            method.invoke( null, msg, objects );
-        }
-        catch ( Exception e )
-        {
+            method.invoke(null, msg, objects);
+        } catch (Exception e) {
             e.printStackTrace();
         }
     }
 
-    private static boolean isDebug( ClassLoader loader ) {
-        try
-        {
+    private static boolean isDebug(ClassLoader loader) {
+        try {
             return Boolean.class.cast(
-                loader.loadClass( "org.apache.sirona.javaagent.logging.SironaAgentLogging") //
-                    .getField( "AGENT_DEBUG" ) //
-                    .get( null ) );
-        }
-        catch ( Exception e )
-        {
+                    loader.loadClass("org.apache.sirona.javaagent.logging.SironaAgentLogging") //
+                            .getField("AGENT_DEBUG") //
+                            .get(null));
+        } catch (Exception e) {
             e.printStackTrace();
         }
         return false;
@@ -244,7 +271,7 @@
 
         final StringBuilder result = new StringBuilder(fileName.length());
         final ByteArrayOutputStream out = new ByteArrayOutputStream();
-        for (int i = 0; i < fileName.length();) {
+        for (int i = 0; i < fileName.length(); ) {
             final char c = fileName.charAt(i);
             if (c == '%') {
                 out.reset();
@@ -287,27 +314,26 @@
     }
 
     /**
-     *
      * @param agentArgs foo=bar|beer=palepale|etc...
      * @return parameters
      */
-    protected static Map<String, String> extractParameters(String agentArgs){
-        if(agentArgs==null||agentArgs.length()<1){
+    protected static Map<String, String> extractParameters(String agentArgs) {
+        if (agentArgs == null || agentArgs.length() < 1) {
             return Collections.emptyMap();
         }
 
-        String[] separatorSplitted = agentArgs.split( "\\|" );
+        String[] separatorSplitted = agentArgs.split("\\|");
 
-        Map<String,String> params = new HashMap<String, String>( separatorSplitted.length / 2 );
+        Map<String, String> params = new HashMap<String, String>(separatorSplitted.length / 2);
 
-        for (final String agentArg:separatorSplitted){
-            int idx = agentArg.indexOf( '=' );
-            if (idx>=0){
-                String key = agentArg.substring( 0, idx);
-                String value = agentArg.substring(idx+1, agentArg.length());
-                params.put( key, value);
+        for (final String agentArg : separatorSplitted) {
+            int idx = agentArg.indexOf('=');
+            if (idx >= 0) {
+                String key = agentArg.substring(0, idx);
+                String value = agentArg.substring(idx + 1, agentArg.length());
+                params.put(key, value);
             } else {
-                params.put( agentArg, "" );
+                params.put(agentArg, "");
             }
         }
 
diff --git a/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java b/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java
index eb4d088..1e2e554 100644
--- a/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java
+++ b/agent/javaagent/src/test/java/org/apache/sirona/javaagent/JavaAgentRunner.java
@@ -184,7 +184,7 @@
                 String key = prop[0];
                 String value = "";
                 if (prop.length > 1) {
-                    value = prop[1];
+                    value = prop[1].replace("${project.build.directory}", new File("target").getAbsolutePath());
                 }
                 args.add("-D" + key + "=" + StrSubstitutor.replace(value, System.getProperties()));
             }
diff --git a/agent/javaagent/src/test/java/org/apache/sirona/javaagent/listener/PathTrackingInvocationRecursiveTest.java b/agent/javaagent/src/test/java/org/apache/sirona/javaagent/listener/PathTrackingInvocationRecursiveTest.java
index 7bc0cec..ac6067e 100644
--- a/agent/javaagent/src/test/java/org/apache/sirona/javaagent/listener/PathTrackingInvocationRecursiveTest.java
+++ b/agent/javaagent/src/test/java/org/apache/sirona/javaagent/listener/PathTrackingInvocationRecursiveTest.java
@@ -68,7 +68,7 @@
 
         Assert.assertTrue( !all.isEmpty() );
 
-        Assert.assertEquals( 2, all.size() );
+        Assert.assertEquals(2, all.size() );
 
     }
 
diff --git a/agent/javaagent/src/test/resources/pathtracking/sirona.properties b/agent/javaagent/src/test/resources/pathtracking/sirona.properties
index 0c37694..8c28e33 100644
--- a/agent/javaagent/src/test/resources/pathtracking/sirona.properties
+++ b/agent/javaagent/src/test/resources/pathtracking/sirona.properties
@@ -15,9 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 excludes = \
-    prefix:java,\
-    prefix:sun,\
-    prefix:com,\
+    container:jvm,\
     regex:org.apache.test.*Test\\..*,\
     prefix:org.junit,\
     prefix:junit, \