aplcache

Details

diff --git a/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/FlowchartWorkFlow.java b/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/FlowchartWorkFlow.java
index 38e05d0..44b9b09 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/FlowchartWorkFlow.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/FlowchartWorkFlow.java
@@ -10,7 +10,7 @@ import java.util.logging.Logger;
 
 public final class FlowchartWorkFlow {
 
-    private static final Logger logger = Logger.getLogger(FlowchartWorkFlow.class.getName());
+    private static final Logger LOGGER = Logger.getLogger(FlowchartWorkFlow.class.getName());
 
     private List<Method> methods;
 
@@ -20,41 +20,41 @@ public final class FlowchartWorkFlow {
     }
 
     private void countStats() {
-        logger.log(Level.INFO, "Counting stats of {0} methods", this.methods.size());
+        LOGGER.log(Level.INFO, "Counting stats of {0} methods", this.methods.size());
         Collections.sort(this.methods, (m1, m2) -> Integer.compare(m1.getOccurrencesSize(), m2.getOccurrencesSize()));
         this.methods.stream().parallel().forEach(Method::calculateMetrics);
     }
 
     private void calculateThresholds() {
-        logger.log(Level.INFO, "Calculating thresholds");
+        LOGGER.log(Level.INFO, "Calculating thresholds");
         Thresholds.reset();
         Thresholds.population = getPopulation();
         this.methods.stream().forEach(Method::calculateThresholds);
 
-        logger.log(Level.INFO, "Average ExecutionTime: {0}", Thresholds.getAverageExecutionTime());
-        logger.log(Level.INFO, "Average HitRatio: {0}", Thresholds.getAverageHitRatio());
-        logger.log(Level.INFO, "Average MissRatio: {0}", Thresholds.getAverageMissRatio());
-        logger.log(Level.INFO, "Average shareability: {0}", Thresholds.getAverageShareability());
-        logger.log(Level.INFO, "StdDv ExecutionTime: {0}", Thresholds.getStdDevExecutionTimeRatio());
-        logger.log(Level.INFO, "StdDv HitRatio: {0}", Thresholds.getStdDevHitRatio());
-        logger.log(Level.INFO, "StdDv MissRatio: {0}", Thresholds.getStdDevMissRatio());
-        logger.log(Level.INFO, "StdDv shareability: {0}", Thresholds.getStdDevShareability());
-        logger.log(Level.INFO, "StdDv frequency: {0}", Thresholds.getStdDevFrequency());
+        LOGGER.log(Level.INFO, "Average ExecutionTime: {0}", Thresholds.getAverageExecutionTime());
+        LOGGER.log(Level.INFO, "Average HitRatio: {0}", Thresholds.getAverageHitRatio());
+        LOGGER.log(Level.INFO, "Average MissRatio: {0}", Thresholds.getAverageMissRatio());
+        LOGGER.log(Level.INFO, "Average shareability: {0}", Thresholds.getAverageShareability());
+        LOGGER.log(Level.INFO, "StdDv ExecutionTime: {0}", Thresholds.getStdDevExecutionTimeRatio());
+        LOGGER.log(Level.INFO, "StdDv HitRatio: {0}", Thresholds.getStdDevHitRatio());
+        LOGGER.log(Level.INFO, "StdDv MissRatio: {0}", Thresholds.getStdDevMissRatio());
+        LOGGER.log(Level.INFO, "StdDv shareability: {0}", Thresholds.getStdDevShareability());
+        LOGGER.log(Level.INFO, "StdDv frequency: {0}", Thresholds.getStdDevFrequency());
 
         int k = 0;
-        logger.log(Level.INFO, "Using {0} stdDev to calculate thresholds...", k);
-        logger.log(Level.INFO, "Threshold ExecutionTime: {0}", Thresholds.expensivenessThreshold(k));
-        logger.log(Level.INFO, "Threshold HitRatio: {0}", Thresholds.hitThreshold(k));
-        logger.log(Level.INFO, "Threshold MissRatio: {0}", Thresholds.missThreshold(k));
-        logger.log(Level.INFO, "Threshold Shareability: {0}", Thresholds.shareabilityThreshold(k));
-        logger.log(Level.INFO, "Threshold frequency: {0}", Thresholds.frequencyThreshold(k));
+        LOGGER.log(Level.INFO, "Using {0} stdDev to calculate thresholds...", k);
+        LOGGER.log(Level.INFO, "Threshold ExecutionTime: {0}", Thresholds.expensivenessThreshold(k));
+        LOGGER.log(Level.INFO, "Threshold HitRatio: {0}", Thresholds.hitThreshold(k));
+        LOGGER.log(Level.INFO, "Threshold MissRatio: {0}", Thresholds.missThreshold(k));
+        LOGGER.log(Level.INFO, "Threshold Shareability: {0}", Thresholds.shareabilityThreshold(k));
+        LOGGER.log(Level.INFO, "Threshold frequency: {0}", Thresholds.frequencyThreshold(k));
     }
 
     public void filterCacheableInputs() {
         countStats();
         calculateThresholds();
 
-        logger.log(Level.INFO, "Deciding if methods are cacheable...");
+        LOGGER.log(Level.INFO, "Deciding if methods are cacheable...");
 
         Iterator<Method> iterator = this.methods.iterator();
         while (iterator.hasNext()) {
@@ -65,7 +65,7 @@ public final class FlowchartWorkFlow {
             }
         }
 
-        logger.log(Level.INFO, "{0} cacheable methods detected", this.methods.size());
+        LOGGER.log(Level.INFO, "{0} cacheable methods detected", this.methods.size());
     }
 
     private long getPopulation() {
diff --git a/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/Method.java b/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/Method.java
index 9132058..1661515 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/Method.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/Method.java
@@ -24,7 +24,7 @@ import java.util.stream.Collectors;
  */
 public class Method {
 
-    private static final Logger logger = Logger.getLogger(Method.class.getName());
+    private static final Logger LOGGER = Logger.getLogger(Method.class.getName());
 
     private final String name;
     private final List<Occurrence> occurrences;
@@ -35,6 +35,10 @@ public class Method {
         this.occurrences = new ArrayList<>();
     }
 
+    public String getName() {
+        return name;
+    }
+
     public Method addOccurrence(Occurrence occurrence) {
         this.occurrences.add(occurrence);
         return this;
@@ -54,7 +58,7 @@ public class Method {
     }
 
     public void groupByParameter() {
-        logger.log(Level.INFO, "Grouping by parameters {0} occurrences of {1}", new Object[]{this.name, this.occurrences.size()});
+        LOGGER.log(Level.INFO, "Grouping by parameters {0} occurrences of {1}", new Object[]{this.name, this.occurrences.size()});
         Map<String, GroupOfOccurrences> groupByParameter = new HashMap<>();
         this.occurrences.stream().parallel().forEach(new Consumer<Occurrence>() {
             int i = 0;
diff --git a/src/main/java/br/ufrgs/inf/prosoft/approachescomparison/adapter/Main.java b/src/main/java/br/ufrgs/inf/prosoft/approachescomparison/adapter/Main.java
index d0863d8..ba421a7 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/approachescomparison/adapter/Main.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/approachescomparison/adapter/Main.java
@@ -9,6 +9,10 @@ import br.ufrgs.inf.prosoft.adaptivecaching.analysis.decision.flowchart.Flowchar
 import br.ufrgs.inf.prosoft.adaptivecaching.monitoring.application.metadata.Method;
 import br.ufrgs.inf.prosoft.trace.Trace;
 import br.ufrgs.inf.prosoft.trace.reader.Mode;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import java.io.FileWriter;
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 import java.util.logging.Level;
@@ -27,9 +31,8 @@ public class Main {
     public static void main(String[] args) {
         System.setProperty("java.util.logging.SimpleFormatter.format", "[%1$tF %1$tT+%1$tL] [%4$-7s] [APLCache] %5$s %n");
 
-        if (args.length < 1) {
-            System.err.println("--trace=<TracePath>");
-            System.err.println("--trace=<TracePath> [--mode=<complete|hashed|partial>]");
+        if (args.length < 2) {
+            System.err.println("--trace=<TracePath> --output=<OutputPath> [--mode=<complete|hashed|partial>]");
             System.exit(1);
         }
 
@@ -37,7 +40,7 @@ public class Main {
             arg = arg.replaceFirst("--", "");
             String[] split = arg.split("=");
             if (split.length < 2) {
-                return new String[]{"", ""};
+                return new String[]{arg, ""};
             }
             return split;
         }).collect(Collectors.toMap(array -> {
@@ -51,6 +54,11 @@ public class Main {
             System.err.println("<TracePath> is required");
             System.exit(1);
         }
+        String outputPath = arguments.get("output");
+        if (outputPath == null) {
+            System.err.println("<OutputPath> is required");
+            System.exit(1);
+        }
         String mode = arguments.get("mode");
         if (mode == null) {
             mode = "complete";
@@ -68,14 +76,22 @@ public class Main {
         methods.forEach(method -> {
             System.out.println(method + " : " + method.getGroupsOfOccurrences().size() + " parameters");
         });
-        methods.forEach(method -> {
-            System.out.println(method);
-            method.getGroupsOfOccurrences().forEach(group -> {
-                System.out.println("parameters: " + group.getParameters());
-                System.out.println("stats: " + group.getMetrics());
-                System.out.println();
+        try (FileWriter fileWriter = new FileWriter(outputPath)) {
+            JsonObject jsonCacheableParameters = new JsonObject();
+            methods.forEach(method -> {
+                JsonArray cacheableParameters = new JsonArray();
+                method.getGroupsOfOccurrences().forEach(group -> {
+                    cacheableParameters.add(group.getParameters());
+                });
+                jsonCacheableParameters.add(method.getName(), cacheableParameters);
             });
-            System.out.println();
-        });
+            try {
+                fileWriter.write(jsonCacheableParameters.toString());
+            } catch (IOException ex) {
+                LOGGER.log(Level.SEVERE, "could not write to <outputPath>");
+            }
+        } catch (IOException ex) {
+            LOGGER.log(Level.SEVERE, "invalid <outputPath>");
+        }
     }
 }
diff --git a/src/main/java/br/ufrgs/inf/prosoft/approachescomparison/adapter/TraceReader.java b/src/main/java/br/ufrgs/inf/prosoft/approachescomparison/adapter/TraceReader.java
index 3a69f23..3104de3 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/approachescomparison/adapter/TraceReader.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/approachescomparison/adapter/TraceReader.java
@@ -25,7 +25,7 @@ import java.util.stream.Collectors;
  */
 public class TraceReader extends br.ufrgs.inf.prosoft.trace.reader.TraceReader {
 
-    private static final Logger logger = Logger.getLogger(TraceReader.class.getName());
+    private static final Logger LOGGER = Logger.getLogger(TraceReader.class.getName());
 
     public static List<Method> groupByMethods(List<Trace> traces) {
         Map<String, Method> methodNameHasOccurrences = new HashMap<>();
@@ -56,7 +56,7 @@ public class TraceReader extends br.ufrgs.inf.prosoft.trace.reader.TraceReader {
                     methodNameHasOccurrences.put(trace.getName(), method);
                 }
             } catch (Exception e) {
-                logger.log(Level.INFO, "Trace discarted: {0}", trace);
+                LOGGER.log(Level.INFO, "Trace discarted: {0}", trace);
             }
         }
         return methodNameHasOccurrences.values().stream().collect(Collectors.toList());