package hu.bme.mit.incquery.cep.performance.md.test;
import static com.google.common.base.Preconditions.checkArgument;
import hu.bme.mit.incquery.cep.api.ICepAdapter;
import hu.bme.mit.incquery.cep.api.ICepRule;
import hu.bme.mit.incquery.cep.api.ViatraCepManager;
import hu.bme.mit.incquery.cep.casestudy.base.adapters.TransactionEventAdapter;
import hu.bme.mit.incquery.cep.metamodels.internalsm.EventProcessingContext;
import hu.bme.mit.incquery.cep.performance.mapping.IncQuery2ViatraCep;
import hu.bme.mit.incquery.cep.performance.md.metamodels.performancetransaction.Component;
import hu.bme.mit.incquery.cep.performance.md.metamodels.performancetransaction.TransactionComponentA;
import hu.bme.mit.incquery.cep.performance.md.metamodels.performancetransaction.TransactionComponentB;
import hu.bme.mit.incquery.cep.performance.md.metamodels.performancetransaction.TransactionComponentC;
import hu.bme.mit.incquery.cep.performance.md.metamodels.performancetransaction.TransactionComponentD;
import hu.bme.mit.incquery.cep.performance.md.metamodels.performancetransaction.TransactionComponentE;
import hu.bme.mit.incquery.cep.performance.md.metamodels.performancetransaction.TransactionComponentF;
import hu.bme.mit.incquery.cep.performance.md.metamodels.performancetransaction.TransactionComponentG;
import hu.bme.mit.incquery.cep.performance.md.metamodels.performancetransaction.TransactionComponentH;
import hu.bme.mit.incquery.cep.performance.md.metamodels.performancetransaction.TransactionComponentI;
import hu.bme.mit.incquery.cep.performance.md.metamodels.performancetransaction.TransactionComponentJ;
import hu.bme.mit.incquery.cep.performance.md.metamodels.performancetransaction.TransactionFactory;
import hu.bme.mit.incquery.cep.performance.md.metamodels.performancetransaction.TransactionModel;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import com.google.common.collect.Lists;
public class MDPerformanceTester {
private ICepAdapter adapter = new TransactionEventAdapter();
private File log;
private int observedComplexPatterns = 0;
private BufferedWriter bw;
private TransactionModel model;
private ResourceSet resourceSet;
private static MDPerformanceTester instance;
private MDPerformanceTester() {
model = TransactionFactory.eINSTANCE.createTransactionModel();
Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
Map<String, Object> m = reg.getExtensionToFactoryMap();
m.put("transaction", new XMIResourceFactoryImpl());
resourceSet = new ResourceSetImpl();
Resource resource = resourceSet.createResource(URI.createURI("transaction/model.tr"));
resource.getContents().add(model);
}
public static MDPerformanceTester getInstance() {
if (instance == null) {
instance = new MDPerformanceTester();
}
return instance;
}
public void setup(ICepRule rule) throws IOException {
checkArgument(rule != null);
new IncQuery2ViatraCep(resourceSet, adapter).registerRules();
log = new File("log.txt");
log.createNewFile();
FileWriter fw = new FileWriter(log.getAbsoluteFile());
bw = new BufferedWriter(fw);
bw.write("Compilation started: " + new Date().getTime() + "\n");
ViatraCepManager.withContext(EventProcessingContext.CHRONICLE).addRule(rule);
bw.write("Compilation ended: " + new Date().getTime() + "\n\n");
}
public void simulate() throws IOException {
int inputEvents = 0;
bw.write("Simulation started: " + new Date().getTime() + "\n");
List<EventType> testSeries = Lists.newArrayList(EventType.A, EventType.B, EventType.C, EventType.D,
EventType.E, EventType.F, EventType.G);
for (int i = 0; i < 100; i++) {
System.out.println("+++Turnaround: " + i);
for (EventType eventType : testSeries) {
Component event = generateEvent(eventType);
System.out.println("Refreshing model with " + event);
inputEvents++;
model.setLatestComponentEvent(event);
}
}
bw.write("Simulation ended: " + new Date().getTime() + "\n\n");
bw.write("Input events: " + inputEvents + "\n");
bw.write("Observed complex patterns: " + observedComplexPatterns + "\n");
bw.close();
}
private enum EventType {
A, B, C, D, E, F, G, H, I, J, K, L, M, N
}
private Component generateEvent(EventType type) {
switch (type) {
case A:
TransactionComponentA componentA = TransactionFactory.eINSTANCE.createTransactionComponentA();
return componentA;
case B:
TransactionComponentB componentB = TransactionFactory.eINSTANCE.createTransactionComponentB();
return componentB;
case C:
TransactionComponentC componentC = TransactionFactory.eINSTANCE.createTransactionComponentC();
return componentC;
case D:
TransactionComponentD componentD = TransactionFactory.eINSTANCE.createTransactionComponentD();
return componentD;
case E:
TransactionComponentE componentE = TransactionFactory.eINSTANCE.createTransactionComponentE();
return componentE;
case F:
TransactionComponentF componentF = TransactionFactory.eINSTANCE.createTransactionComponentF();
return componentF;
case G:
TransactionComponentG componentG = TransactionFactory.eINSTANCE.createTransactionComponentG();
return componentG;
case H:
TransactionComponentH componentH = TransactionFactory.eINSTANCE.createTransactionComponentH();
return componentH;
case I:
TransactionComponentI componentI = TransactionFactory.eINSTANCE.createTransactionComponentI();
return componentI;
case J:
TransactionComponentJ componentJ = TransactionFactory.eINSTANCE.createTransactionComponentJ();
return componentJ;
default:
return null;
}
}
public void dispose() {
instance = null;
}
public File getLog() {
return log;
}
public int getObservedComplexPatterns() {
return observedComplexPatterns;
}
public void increaseObservedPatternCount() {
observedComplexPatterns++;
}
}