package cute.concolic.logging;
import cute.concolic.Globals;
import cute.concolic.Information;
import cute.concolic.concurrency.IndexInfo;
import cute.concolic.concurrency.RacePair;
import java.io.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
/**
* .
* User: ksen
* Date: Oct 28, 2005
* Time: 12:03:59 PM
* To change this template use File | Settings | File Templates.
*/
public class ExecutionLog {
//private static String lastLine = null;
//private static PrintWriter out = null;
private Logger logger;
private Information information;
private LinkedList traceLog = new LinkedList();
private LinkedList inputLog = new LinkedList();
private int raceCount = 0;
private HashMap indexedTrace = new HashMap();
private HashSet races = new HashSet();
public static int countDistinctErrors(File dir){
try {
ObjectInputStream in = new ObjectInputStream(
new BufferedInputStream(new FileInputStream(new File(dir,"cuteErrorLog"))));
if(in!=null){
HashSet tmp = (HashSet)in.readObject();
in.close();
return tmp.size();
}
} catch (IOException e) {
} catch (ClassNotFoundException e) {
}
return 0;
}
public static int countFieldsWithRace(File dir){
try {
ObjectInputStream in = new ObjectInputStream(
new BufferedInputStream(new FileInputStream(new File(dir,"cuteRaceLog"))));
if(in!=null){
HashSet tmp = (HashSet)in.readObject();
in.close();
return tmp.size();
}
} catch (IOException e) {
} catch (ClassNotFoundException e) {
}
return 0;
}
public ExecutionLog(Logger logger, Information information) {
this.logger = logger;
this.information = information;
}
public void write(){
PrintWriter traceOut = null;
PrintWriter inputOut = null;
if(information.mode==Globals.RESTART_MODE){
(new File("cuteRaceLog")).delete();
(new File("cuteErrorLog")).delete();
}
if(information.mode!=Globals.REPLAY_MODE){
if(!races.isEmpty()){
HashSet tmp = new HashSet();
try {
ObjectInputStream in = new ObjectInputStream(
new BufferedInputStream(new FileInputStream("cuteRaceLog")));
if(in!=null){
tmp = (HashSet)in.readObject();
in.close();
}
} catch (IOException e) {
} catch (ClassNotFoundException e) {
}
races.addAll(tmp);
ObjectOutputStream out = null;
try {
out = new ObjectOutputStream(
new BufferedOutputStream(new FileOutputStream("cuteRaceLog")));
if(out!=null){
out.writeObject(races);
out.close();
}
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
System.exit(1);
}
}
}
if(information.printTraceAndInputs){
try {
traceOut = new PrintWriter(new BufferedWriter(new FileWriter("cuteTraceLog")));
for (Iterator iterator = traceLog.iterator(); iterator.hasNext();) {
TraceLog log = (TraceLog) iterator.next();
log.print(traceOut);
}
traceOut.close();
inputOut = new PrintWriter(new BufferedWriter(new FileWriter("cuteInputLog")));
for (Iterator iterator = inputLog.iterator(); iterator.hasNext();) {
InputLog log = (InputLog) iterator.next();
log.print(inputOut);
}
inputOut.close();
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
System.exit(1);
}
}
}
synchronized public void printRace(RacePair rp,String raceVar){
System.err.println("Race over field "+raceVar);
races.add(raceVar);
}
synchronized public void printLineNumber(int lineno, IndexInfo ii,String type, RacePair rp) {
if(information.printTraceAndInputs || (information.debugLevel & 512)!=0){
try {
throw new Exception();
} catch(Exception e){
StackTraceElement[] ste = e.getStackTrace();
boolean inside = false;
boolean flag = true;
StackTraceElement st = null;
for (int i = 1; flag && i < ste.length; i++) {
st = ste[i];
if(st.getClassName().equals("cute.concolic.Call")){
inside = true;
} else if(inside){
flag = false;
}
}
Thread curr = Thread.currentThread();
String cName = st.getClassName();
String packages[] = cName.split("\\.");
StringBuffer fName = new StringBuffer();
for(int i=0;i<packages.length-1;i++){
fName.append(packages[i]);
fName.append('/');
}
packages = st.getFileName().split("\\.");
for(int i=0;i<packages.length-1;i++){
fName.append(packages[i]);
if(i<packages.length-2)
fName.append('/');
}
fName.append(".java");
StringBuffer lineb2 = new StringBuffer();
lineb2.append(type).append('@').append(fName).append(':')
.append(lineno)
.append('@').append(curr.getName()).append('\n');
String line = lineb2.toString();
TraceLog tl2 = traceLog.isEmpty()?null:(TraceLog)traceLog.getLast();
if(ii!=null ||
(lineno>=0 && (tl2==null || !line.equals(tl2.getLine())))){
TraceLog tl = new TraceLog(line);
traceLog.addLast(tl);
if(ii!=null){
indexedTrace.put(new Integer(ii.index),tl);
}
if(rp!=null && (rp.rl1!=null || rp.rl2!=null)){
raceCount++;
tl.addEndRace(raceCount);
if(rp.rl1!=null){
((TraceLog)indexedTrace.get(new Integer(rp.rl1.begin)))
.addBeginRace(raceCount);
}
if(rp.rl2!=null){
((TraceLog)indexedTrace.get(new Integer(rp.rl2.begin)))
.addBeginRace(raceCount);
}
}
logger.info(512,line,null);
}
}
}
}
synchronized public void printInput(String str){
if(information.printTraceAndInputs || (information.debugLevel & 512)!=0){
logger.info(512,str,null);
inputLog.addLast(new InputLog(str));
}
}
synchronized public void printInputLn(String str){
if(information.printTraceAndInputs || (information.debugLevel & 512)!=0){
try {
throw new Exception();
} catch(Exception e){
StackTraceElement[] ste = e.getStackTrace();
boolean inside = false;
boolean flag = true;
StackTraceElement st = null;
for (int i = 1; flag && i < ste.length; i++) {
st = ste[i];
if(st.getClassName().startsWith("cute.")){
inside = true;
} else if(inside){
flag = false;
}
}
String cName = st.getClassName();
String packages[] = cName.split("\\.");
StringBuffer fName = new StringBuffer();
for(int i=0;i<packages.length-1;i++){
fName.append(packages[i]);
fName.append('/');
}
packages = st.getFileName().split("\\.");
for(int i=0;i<packages.length-1;i++){
fName.append(packages[i]);
if(i<packages.length-2)
fName.append('/');
}
fName.append(".java");
int lineno = st.getLineNumber();
String line = new StringBuffer().append(str)
.append('@').append(fName).append(":").append(lineno)
.append('@').append(Thread.currentThread().getName())
.append('\n').toString();
if(!(lineno<0)){
logger.info(512,line,null);
if(information.printTraceAndInputs){
inputLog.addLast(new InputLog(line));
}
}
}
}
}
synchronized public void printLineNumber(int lineno){
printLineNumber(lineno,null,"other",null);
}
public synchronized void writeError(String error) {
if(information.mode!=Globals.REPLAY_MODE){
HashSet tmp = new HashSet();
try {
ObjectInputStream in = new ObjectInputStream(
new BufferedInputStream(new FileInputStream("cuteErrorLog")));
if(in!=null){
tmp = (HashSet)in.readObject();
in.close();
}
} catch (IOException e) {
} catch (ClassNotFoundException e) {
}
tmp.add(error);
ObjectOutputStream out = null;
try {
out = new ObjectOutputStream(
new BufferedOutputStream(new FileOutputStream("cuteErrorLog")));
if(out!=null){
out.writeObject(tmp);
out.close();
}
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
System.exit(1);
}
}
}
}