blob: 168e85e7209aa99ee6c96034f44fc9fdcf6b4979 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2019 CEA LIST.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
* - Initial API and Implementation
*******************************************************************************/
package org.eclipse.efm.execution.launchconfiguration.job.sew;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import org.eclipse.core.runtime.IPath;
import org.eclipse.efm.execution.core.IWorkflowSpiderConfigurationUtils;
public class ProfileSymbexWorkflow extends SymbexWorkflowProvider {
protected IPath fReportFilePath;
protected PrintWriter fLoggerWriter;
protected static String CSV_SEPARATOR = " ; ";
protected int fExecutionCount;
protected long fTotalExecutionTime_COV;
protected long fTotalExecutionTime_NOT;
protected boolean fFullyCoverageFlag;
protected int fFullyCoverageCount;
public ProfileSymbexWorkflow(
final SymbexWorkflowProvider symbexWorkflow, final int executionCount) {
super(symbexWorkflow);
this.fReportFilePath = symbexWorkflow.getSymbexWorkflowPath()
.removeFileExtension().addFileExtension("profile.csv");
this.fLoggerWriter = null;
this.fExecutionCount = executionCount;
this.fTotalExecutionTime_COV = 0;
this.fTotalExecutionTime_NOT = 0;
this.fFullyCoverageFlag = false;
this.fFullyCoverageCount = 0;
}
public ProfileSymbexWorkflow(final SymbexWorkflowProvider symbexWorkflow) {
this(symbexWorkflow, 1000);
}
/*
* ANALYSIS PROFILE
*/
@Override
public String getSymbexlAnalysisProfileName() {
return "PROFILE EXECUTION: " + super.fIndex + " / " + this.fExecutionCount;
}
/*
* JOB / TASK / PROCESS
* NAME
*/
@Override
public String getTaskName() {
return super.fIndex + " / " + this.fExecutionCount + " : " + getJobName();
}
/*
* WORKFLOW
*/
@Override
public boolean isConsistent() {
return this.fWellFormednessFlag && super.isConsistent();
}
@Override
public boolean isIterable() {
return true;
}
@Override
public int count() {
return this.fExecutionCount;
}
@Override
public boolean hasNext() {
return (super.fIndex <= this.fExecutionCount) ;
}
@Override
public void next() {
super.fIndex = super.fIndex + 1;
}
/*
* INITIALIZE / FINALIZE
*/
@Override
public boolean initialize() {
if( super.initialize() )
{
super.fIndex = 1;
try {
final FileWriter buffer_ALL = new FileWriter( fReportFilePath.toOSString() );
fLoggerWriter = new PrintWriter(buffer_ALL);
}
catch (final IOException e) {
e.printStackTrace();
return false;
}
logHeader(fLoggerWriter);
return true;
}
return false;
}
public void logHeader(final PrintWriter logger) {
logger.print( "Index" );
logger.print( CSV_SEPARATOR );
logger.print( "Coverage" );
logger.print( CSV_SEPARATOR );
logger.print( "Step" );
logger.print( CSV_SEPARATOR );
logger.print( "Execution Time" );
logger.println();
logger.flush();
logger.flush();
}
@Override
public void finalize() {
fLoggerWriter.println();
fLoggerWriter.print( "Total : " );
fLoggerWriter.println( this.fExecutionCount );
fLoggerWriter.print( "100 % : " );
fLoggerWriter.println( this.fFullyCoverageCount );
fLoggerWriter.print( "Average Fully Coverage Time: " );
fLoggerWriter.println( (double)fTotalExecutionTime_COV / this.fFullyCoverageCount );
fLoggerWriter.print( "Average Non Coverage Time : " );
fLoggerWriter.println( (double)fTotalExecutionTime_NOT /
(this.fExecutionCount - this.fFullyCoverageCount) );
fLoggerWriter.close();
}
/*
* LOGGING
*/
@Override
public void beginLoggingSymbex() {
resetExecutionStats();
System.out.println( getTaskName() );
}
@Override
public void log(final String message) {
System.out.print(message);
fLoggerWriter.print(message);
}
@Override
public void endLoggingSymbex() {
this.fFullyCoverageFlag = IWorkflowSpiderConfigurationUtils.
SYMBEX_GOAL_ACHIEVED.equals(super.fExecutionVerdict);
if( this.fFullyCoverageFlag ) {
++this.fFullyCoverageCount;
this.fTotalExecutionTime_COV += super.fExecutionTime;
// Force l'arrĂȘt avec hasNext() --> return (super.fIndex < this.fExecutionCount) ;
// super.fIndex = this.fExecutionCount;
}
else {
fTotalExecutionTime_NOT += super.fExecutionTime;
}
logSymbex( fLoggerWriter );
}
public void logSymbex(final PrintWriter logger) {
logger.format( "%5d" , super.fIndex );
logger.print( CSV_SEPARATOR );
logger.format( "%8s" , (this.fFullyCoverageFlag ? "YES" : "NO") );
logger.print( CSV_SEPARATOR );
logger.format( "%4d" , super.fExecutionStepCount - 1 );
logger.print( CSV_SEPARATOR );
logger.format( "%11d" , super.fExecutionTime );
logger.print( " ms" );
logger.println();
logger.flush();
}
}