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 3849488..c796197 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
@@ -20,13 +20,15 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Set;
+import java.util.logging.Level;
 import java.util.stream.Collectors;
 
 public class FlowchartWorkFlow {
 
+    Logger logger = LoggerFactory.getLogger(FlowchartWorkFlow.class);
+
     private final long population;
     protected HashMap<MethodInfo, MethodStats> methodsInfoMap;
-    Logger logger = LoggerFactory.getLogger(FlowchartWorkFlow.class);
 
     private CacheDecider decider;
 
@@ -48,14 +50,6 @@ public class FlowchartWorkFlow {
 
         logger.debug(methodsInfoMap.size() + " unique method calls identified from " + logList.size() + " original traces");
 
-        //sorting to get threshold, also excluding duplicates
-//        Collections.sort(executionTimes);
-//        hitRatios = hitRatios.stream().distinct().collect(Collectors.toList());
-//        Collections.sort(hitRatios);
-//        missRatios = missRatios.stream().distinct().collect(Collectors.toList());
-//        Collections.sort(missRatios);
-//        shareabilities = shareabilities.stream().distinct().collect(Collectors.toList());
-//        Collections.sort(shareabilities);
         logger.debug("Average ExecutionTime: " + getAverageExecutionTime());
         logger.debug("Average HitRatio: " + getAverageHitRatio());
         logger.debug("Average MissRatio: " + getAverageMissRatio());
@@ -86,29 +80,23 @@ public class FlowchartWorkFlow {
         logger.info(cacheableMethods.size() + " cacheable methods detected. Printing files...");
 
         //TODO remove: print all unique methods and metrics to csv file
-        try {
-            final PrintWriter pw = new PrintWriter(new File("allmethods.csv"));
+        try (PrintWriter pw = new PrintWriter(new File("allmethods.csv"))) {
             pw.write("isStaticData,changeMoreThanUsed,usedByManyRequests,isUserSpecific,isCacheSizeLarge,isDataSizeLarge,isExpensive,signature,numberOfSameOccurrences,numberOfDifferentReturnOccurrences,totalOccurrences,sameOccurrencesAverageExecutionTime,sameOccurrencesTotalExecutionTime,hitRatio,missRatio\n");
             getMethodsInfoMap().keySet().stream().forEach(mi -> pw.write(CacheabilityMetrics.allMetricsToString(mi, getMethodsInfoMap().get(mi), this, getMethodsInfoMap().size()) + "," + new MethodEntry(mi, getMethodsInfoMap().get(mi), System.currentTimeMillis() + expiryTime).getMethodInfo().getSignature() + "," + new MethodEntry(mi, getMethodsInfoMap().get(mi), System.currentTimeMillis() + expiryTime).getMethodStats().toCSV() + '\n'));
-            pw.close();
-        } catch (FileNotFoundException e) {
-            e.printStackTrace();
+        } catch (FileNotFoundException ex) {
         }
 
         //TODO remove: print cacheable methods to csv file
-        try {
-            final PrintWriter pw = new PrintWriter(new File("cacheablemethods.csv"));
+        try (PrintWriter pw = new PrintWriter(new File("cacheablemethods.csv"))) {
             pw.write("isStaticData,changeMoreThanUsed,usedByManyRequests,isUserSpecific,isCacheSizeLarge,isDataSizeLarge,isExpensive,signature,numberOfSameOccurrences,numberOfDifferentReturnOccurrences,totalOccurrences,sameOccurrencesAverageExecutionTime,sameOccurrencesTotalExecutionTime,hitRatio,missRatio\n");
             cacheableMethods.stream().forEach(ma -> pw.write(CacheabilityMetrics.allMetricsToString(ma.getMethodInfo(), ma.getMethodStats(), this, getMethodsInfoMap().size()) + "," + ma.getMethodInfo().getSignature() + "," + ma.getMethodStats().toCSV() + '\n'));
-            pw.close();
-        } catch (FileNotFoundException e) {
-            e.printStackTrace();
+        } catch (FileNotFoundException ex) {
         }
         return cacheableMethods;
     }
 
     public HashMap<MethodInfo, MethodStats> countOccurrences(List<LogTrace> logs) {
-
+        logger.info("Counting {0} occurrences", logs.size());
         sumExecutionTime = 0;
         sumHitRatio = 0;
         sumMissRatio = 0;
@@ -119,7 +107,11 @@ public class FlowchartWorkFlow {
 
         for (int i = 0; i < logs.size(); i++) {
             LogTrace logTrace = logs.get(i);
-
+            System.out.print(".");
+            System.out.flush();
+            if (i != 0 && i % 100 == 0) {
+                System.out.println();
+            }
             if (methodInfoMap.containsKey(logTrace.getMethodInfo())) {
                 continue;
             }
@@ -134,13 +126,9 @@ public class FlowchartWorkFlow {
                 }
 
                 //if similar methods: same signature and params, different return
-//                if(logTrace.getMethodInfo().getHashedArguments())
-                if (traceCompare.getMethodInfo().equalsWithoutReturnedValue(logTrace.getMethodInfo()) //                      || traceCompare.getMethodInfo().equalsHashedWithoutReturnedValue(logTrace.getMethodInfo())
-                        ) {
-
+                if (traceCompare.getMethodInfo().equalsWithoutReturnedValue(logTrace.getMethodInfo())) {
                     //if identical methods
-                    if (EqualsBuilder.reflectionEquals(traceCompare.getMethodInfo().getReturnedValue(), logTrace.getMethodInfo().getReturnedValue()) //                            || Objects.equals(traceCompare.getMethodInfo().getHashedReturnedValue(), logTrace.getMethodInfo().getHashedReturnedValue())
-                            ) {
+                    if (EqualsBuilder.reflectionEquals(traceCompare.getMethodInfo().getReturnedValue(), logTrace.getMethodInfo().getReturnedValue())) {
                         methodStats.addSameOccurrence(traceCompare);
                     } else {
                         methodStats.addDifferentReturnOccurrence();
@@ -251,10 +239,9 @@ public class FlowchartWorkFlow {
         }
 
         double mean = getAverageExecutionTime();
-        double temp = 0;
-        for (Long a : executionTimes) {
-            temp += (a - mean) * (a - mean);
-        }
+        double temp = executionTimes.stream()
+                .map(executionTime -> (executionTime - mean) * (executionTime - mean))
+                .reduce(Double::sum).get();
         StdDevExecutionTimeRatio = Math.sqrt(temp / population);
         return StdDevExecutionTimeRatio;
     }
@@ -270,10 +257,9 @@ public class FlowchartWorkFlow {
         }
 
         double mean = getAverageFrequency();
-        double temp = 0;
-        for (Long a : frequencies) {
-            temp += (a - mean) * (a - mean);
-        }
+        double temp = frequencies.stream()
+                .map(frequency -> (frequency - mean) * (frequency - mean))
+                .reduce(Double::sum).get();
         StdDevFrequency = Math.sqrt(temp / population);
         return StdDevFrequency;
     }
@@ -289,10 +275,9 @@ public class FlowchartWorkFlow {
         }
 
         double mean = getAverageShareability();
-        double temp = 0;
-        for (Double a : shareabilities) {
-            temp += (a - mean) * (a - mean);
-        }
+        double temp = shareabilities.stream()
+                .map((shareability) -> (shareability - mean) * (shareability - mean))
+                .reduce(Double::sum).get();
         StdDevShareability = Math.sqrt(temp / population);
         return StdDevShareability;
     }
diff --git a/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/MethodInfo.java b/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/MethodInfo.java
index 11a4384..e7cd7ca 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/MethodInfo.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/MethodInfo.java
@@ -1,150 +1,84 @@
 package br.ufrgs.inf.prosoft.adaptivecaching.monitoring.application.metadata;
 
+import java.util.Arrays;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 
 import java.util.Objects;
 import org.ehcache.sizeof.SizeOf;
 
-public class MethodInfo {
+public abstract class MethodInfo {
 
-    private String signature;
+    private final String signature;
 
-    private transient Object[] arguments;
-
-    private transient Object returnedValue;
-
-    
-    private long sizeOfReturnedValue;
-
-//    private Integer hashedReturnedValue;
-//    private Integer hashedArguments;
-
-    public MethodInfo(String signature, Object[] arguments) {
+    public MethodInfo(String signature) {
         this.signature = signature;
-        this.arguments = arguments;
-
-//        try {
-//            //TODO hash or not???
-//            this.hashedArguments = HashCodeBuilder.reflectionHashCode(arguments);
-//        } catch (Exception e) {
-//        }
     }
 
-    public MethodInfo(String signature, Object[] arguments, Object returnedValue) {
-        this(signature, arguments);
-        this.returnedValue = returnedValue;
-        SizeOf sizeOf = SizeOf.newInstance();
-        this.sizeOfReturnedValue = sizeOf.sizeOf(this.returnedValue);
-
-//        try {
-//            //TODO hash or not???
-//            this.hashedArguments = HashCodeBuilder.reflectionHashCode(arguments);
-//            this.hashedReturnedValue = HashCodeBuilder.reflectionHashCode(returnedValue);
-//        } catch (Exception e) {
-//        }
-    }
-    
     public String getSignature() {
         return this.signature;
     }
 
-    public Object[] getArguments() {
-        return this.arguments;
-    }
+    public abstract Object[] getArguments();
 
-    public Object getReturnedValue() {
-        return this.returnedValue;
+    public abstract Object getReturnedValue();
+
+    public long getSizeOfReturnedValue() {
+        SizeOf sizeOf = SizeOf.newInstance();
+        return sizeOf.sizeOf(getReturnedValue());
     }
-    public boolean equalsWithoutReturnedValue(MethodInfo o) {
 
+    public boolean equalsWithoutReturnedValue(MethodInfo o) {
         if (this == o) {
             return true;
         }
         if (o == null || getClass() != o.getClass()) {
             return false;
         }
-
         if (!signature.equals(o.signature)) {
             return false;
         }
-        if (!(Objects.deepEquals(arguments, o.arguments) || EqualsBuilder.reflectionEquals(arguments, o.arguments))) {
-            return false;
-        }
-
-        return true;
-        //return EqualsBuilder.reflectionEquals(this, o, "returnedValue", "key");
+        Object[] thisArguments = getArguments();
+        Object[] otherArguments = o.getArguments();
+        return Objects.deepEquals(thisArguments, otherArguments)
+                || EqualsBuilder.reflectionEquals(thisArguments, otherArguments);
     }
 
     @Override
     public boolean equals(Object o) {
-//        return EqualsBuilder.reflectionEquals(this, o, "key");
-
         if (this == o) {
             return true;
         }
         if (o == null || getClass() != o.getClass()) {
             return false;
         }
-
         MethodInfo that = (MethodInfo) o;
-
         if (!signature.equals(that.signature)) {
             return false;
         }
-        if (!EqualsBuilder.reflectionEquals(arguments, that.arguments)) {
+        Object[] thisArguments = getArguments();
+        Object[] thatArguments = that.getArguments();
+        if (!EqualsBuilder.reflectionEquals(thisArguments, thatArguments)) {
             return false;
         }
-        return EqualsBuilder.reflectionEquals(returnedValue, that.returnedValue) || Objects.deepEquals(returnedValue, that.returnedValue);
+        thisArguments = null;
+        thatArguments = null;
+        Object thisReturnedValue = getReturnedValue();
+        Object thatReturnedValue = that.getReturnedValue();
+        return EqualsBuilder.reflectionEquals(thisReturnedValue, thatReturnedValue)
+                || Objects.deepEquals(thisReturnedValue, thatReturnedValue);
     }
 
-//    public boolean equalsHashed(Object o) {
-//        if (this == o) return true;
-//        if (o == null || getClass() != o.getClass()) return false;
-//
-//        MethodInfo that = (MethodInfo) o;
-//
-//        if (!signature.equals(that.signature)) return false;
-//        if (!Objects.deepEquals(hashedArguments, that.hashedArguments)) return false;
-//        return hashedReturnedValue != null ? Objects.deepEquals(hashedReturnedValue, that.hashedReturnedValue) : that.hashedReturnedValue == null;
-//    }
-//
-//    public boolean equalsHashedWithoutReturnedValue(Object o) {
-//        if (this == o) return true;
-//        if (o == null || getClass() != o.getClass()) return false;
-//
-//        MethodInfo that = (MethodInfo) o;
-//
-//        if (!signature.equals(that.signature)) return false;
-//        if (!Objects.deepEquals(hashedArguments, that.hashedArguments)) return false;
-//        return true;
-//    }
-//    public Integer getHashedReturnedValue() {
-//        return hashedReturnedValue;
-//    }
-//
-//    public Integer getHashedArguments() {
-//        return hashedArguments;
-//    }
-//
-//    public void setArguments(Object[] arguments) {
-//        this.arguments = arguments;
-//    }
-//
-//    public void setReturnedValue(Object returnedValue) {
-//        this.returnedValue = returnedValue;
-//    }
     @Override
     public int hashCode() {
-        //TODO equals is enough to distinghish, not able to get a unique hashcode
         return 1;
-        //return HashCodeBuilder.reflectionHashCode(this, "key");
     }
 
+    @Override
     public String toString() {
-        return "br.ufrgs.inf.prosoft.adaptivecaching.monitoring.application.metadata.MethodInfo(signature=" + this.signature + ", arguments=" + this.arguments + ", returnedValue=" + this.returnedValue + ")";
+        return "br.ufrgs.inf.prosoft.adaptivecaching.monitoring.application.metadata.MethodInfo(signature="
+                + this.signature
+                + ", arguments=" + Arrays.toString(getArguments())
+                + ", returnedValue=" + getReturnedValue() + ")";
     }
 
-    public long getSizeOfReturnedValue() {
-        return this.sizeOfReturnedValue;
-    }
 }
diff --git a/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/MethodInfoConcrete.java b/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/MethodInfoConcrete.java
new file mode 100644
index 0000000..036c2db
--- /dev/null
+++ b/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/MethodInfoConcrete.java
@@ -0,0 +1,24 @@
+package br.ufrgs.inf.prosoft.adaptivecaching.monitoring.application.metadata;
+
+public class MethodInfoConcrete extends MethodInfo {
+
+    private final Object[] arguments;
+    private final Object returnedValue;
+
+    public MethodInfoConcrete(String signature, Object[] arguments, Object returnedValue) {
+        super(signature);
+        this.arguments = arguments;
+        this.returnedValue = returnedValue;
+    }
+
+    @Override
+    public Object[] getArguments() {
+        return this.arguments;
+    }
+
+    @Override
+    public Object getReturnedValue() {
+        return this.returnedValue;
+    }
+
+}
diff --git a/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/MethodInfoReference.java b/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/MethodInfoReference.java
new file mode 100644
index 0000000..78ad9bc
--- /dev/null
+++ b/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/MethodInfoReference.java
@@ -0,0 +1,31 @@
+package br.ufrgs.inf.prosoft.adaptivecaching.monitoring.application.metadata;
+
+import br.ufrgs.inf.prosoft.trace.TraceConcrete;
+import br.ufrgs.inf.prosoft.trace.Traces;
+import java.util.stream.Collectors;
+
+public class MethodInfoReference extends MethodInfo {
+
+    private final int index;
+
+    public MethodInfoReference(String signature, int index) {
+        super(signature);
+        this.index = index;
+    }
+
+    @Override
+    public Object[] getArguments() {
+        TraceConcrete traceConcrete = Traces.getTraceConcrete(index);
+        return traceConcrete.getParameters().stream()
+                .map(trace->trace.getData())
+                .collect(Collectors.toList())
+                .toArray();
+    }
+
+    @Override
+    public Object getReturnedValue() {
+        TraceConcrete traceConcrete = Traces.getTraceConcrete(index);
+        return traceConcrete.getReturn().getData();
+    }
+
+}
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 c285686..6ad3e04 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
@@ -6,7 +6,8 @@
 package br.ufrgs.inf.prosoft.approachescomparison.adapter;
 
 import br.ufrgs.inf.prosoft.adaptivecaching.monitoring.application.metadata.LogTrace;
-import br.ufrgs.inf.prosoft.adaptivecaching.monitoring.application.metadata.MethodInfo;
+import br.ufrgs.inf.prosoft.adaptivecaching.monitoring.application.metadata.MethodInfoConcrete;
+import br.ufrgs.inf.prosoft.adaptivecaching.monitoring.application.metadata.MethodInfoReference;
 import br.ufrgs.inf.prosoft.trace.Parameter;
 import br.ufrgs.inf.prosoft.trace.Trace;
 import br.ufrgs.inf.prosoft.trace.TraceReference;
@@ -25,22 +26,28 @@ public class TraceReader extends br.ufrgs.inf.prosoft.trace.TraceReader {
     private static final Logger logger = Logger.getLogger(TraceReader.class.getName());
 
     public static List<LogTrace> getLogTraces(List<Trace> traces) {
+        logger.log(Level.INFO, "Converting {0} traces", traces.size());
         List<LogTrace> logTraces = new ArrayList<>();
+        int index = 1;
         while (!traces.isEmpty()) {
             Trace trace = traces.remove(0);
             try {
-                LogTrace logTrace;
+                System.out.print(".");
+                System.out.flush();
+                if (index++ % 100 == 0) {
+                    System.out.println();
+                }
+                LogTrace logTrace = new LogTrace().setStartTime(trace.getStartTime())
+                        .setEndTime(trace.getEndTime())
+                        .setUserId(trace.getUserSession());
                 if (trace instanceof TraceReference) {
                     TraceReference traceReference = (TraceReference) trace;
-                    logTrace = new LogTrace().setStartTime(traceReference.getStartTime())
-                            .setEndTime(traceReference.getEndTime());
+                    logTrace.setMethodInfo(new MethodInfoReference(traceReference.getName(), traceReference.getIndex()));
                 } else {
-                    logTrace = new LogTrace().setStartTime(trace.getStartTime())
-                            .setEndTime(trace.getEndTime())
-                            .setMethodInfo(new MethodInfo(trace.getName(),
-                                    trace.getParameters().stream().map(Parameter::getData)
-                                            .collect(Collectors.toList()).toArray(),
-                                    trace.getReturn().getData()));
+                    logTrace.setMethodInfo(new MethodInfoConcrete(trace.getName(),
+                            trace.getParameters().stream().map(Parameter::getData)
+                                    .collect(Collectors.toList()).toArray(),
+                            trace.getReturn().getData()));
                 }
                 logTraces.add(logTrace);
             } catch (Exception e) {
@@ -49,5 +56,4 @@ public class TraceReader extends br.ufrgs.inf.prosoft.trace.TraceReader {
         }
         return logTraces;
     }
-
 }