aplcache
Changes
src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/FlowchartWorkFlow.java 63(+24 -39)
src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/MethodInfo.java 124(+29 -95)
src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/MethodInfoConcrete.java 24(+24 -0)
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;
}
-
}