package org.fi;
import java.io.*;
import java.lang.*;
// public class FMStackTrace implements Writable {
public class FMStackTrace {
private int totalHashCode = 0;
private FMStackTraceElement [] s = null;
//********************************************
// writable interface
// this is serialization (see DatanodeID.java for example)
// need to decide how to serialize the RPC
//********************************************
public void write(DataOutput out) throws IOException {
out.writeInt(totalHashCode);
out.writeInt(s.length);
for (int i = 0; i < s.length; i++)
s[i].write(out);
}
public void readFields(DataInput in) throws IOException {
totalHashCode = in.readInt();
int sLength = in.readInt();
s = new FMStackTraceElement[sLength];
for (int i = 0; i < s.length; i++) {
s[i] = new FMStackTraceElement();
s[i].readFields(in);
}
}
//********************************************
// rest
//********************************************
public FMStackTrace() {
}
public FMStackTrace(StackTraceElement[] ste) {
// int hc;
// int total = 0;
int validCount = 0;
// for calculating hash code
String tmpHash = "";
// need two passes
for (int i = 0; i < ste.length ; i++) {
if (isValid(ste[i]))
validCount++;
}
if (validCount == 0) {
return;
}
// create
s = new FMStackTraceElement[validCount];
int j = 0;
// 2nd pass
for (int i = 0; i < ste.length ; i++) {
if (!isValid(ste[i]))
continue;
s[j] = new FMStackTraceElement(ste[i]);
tmpHash = tmpHash + ste[i].toString();
// compute the hash code
// hc = Math.abs(ste[i].hashCode()) & 1000000;
// total += hc;
j++;
}
totalHashCode = tmpHash.hashCode();
// totalHashCode = total;
}
// *******************************
// the filtering is done here
public boolean isValid(StackTraceElement e) {
if (e.getFileName() != null)
if (e.getFileName().contains(".aj")) return false;
if (e.getClassName() != null) {
if (e.getClassName().indexOf("org.apache.tools") == 0) return false;
if (e.getClassName().indexOf("sun.") == 0) return false;
if (e.getClassName().indexOf("java.") == 0) return false;
if (e.getClassName().indexOf("javax.") == 0) return false;
if (e.getClassName().indexOf("org.fi") == 0) return false;
// if (e.getClassName().contains("$")) return false;
}
if (e.getMethodName() != null) {
if (e.getMethodName().contains("aroundBody")) return false;
}
return true;
}
// ******************************************
public boolean contains(String className, String funcName) {
for (int i = 0; i < s.length; i++) {
if (s[i].getClassName().contains(className) &&
s[i].getMethodName().equals(funcName)) {
return true;
}
}
return false;
}
public FMStackTraceElement [] getStackTraces() {
return s;
}
public int getTotalHashCode() {
return totalHashCode;
}
public String toString() {
String tmp = "";
if (s == null)
return "\n";
for (int i = 0; i < s.length; i++) {
String tmp1 = s[i].getClassName();
// trimming is done here ..
tmp1 = tmp1.replaceFirst("org.apache.hadoop.", "");
tmp1 = tmp1.replaceFirst("hdfs.server.", "");
tmp += (" [" + i + "] ");
// tmp += (s[i].getFileName() + " / ");
// tmp += (s[i].getClassName() + " (");
tmp += (tmp1 + " (");
tmp += (s[i].getMethodName() + ":");
tmp += (s[i].getLineNumber() + ")");
// tmp += "[" + totalHashCode + "]";
tmp += "\n";
}
// tmp += (" [T] TOTAL HASH CODE: [" + totalHashCode + "] \n");
return tmp;
}
}