/*******************************************************************************
* Copyright (c) 2009, 2010 SAP AG and others.
* 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:
* SAP AG - initial API and implementation
******************************************************************************/
package org.eclipse.ocl.examples.impactanalyzer.benchmark.preparation.tasks;
import java.util.Collection;
import java.util.HashMap;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.ocl.ecore.opposites.OppositeEndFinder;
import org.eclipse.ocl.examples.impactanalyzer.benchmark.preparation.model.ModelCloner;
import org.eclipse.ocl.examples.impactanalyzer.benchmark.preparation.ocl.OCLExpressionWithContext;
import org.eclipse.ocl.examples.impactanalyzer.configuration.ActivationOption;
import org.eclipse.ocl.examples.impactanalyzer.configuration.OptimizationActivation;
public class ModelSizeVariationBenchmarkTaskContainer extends BenchmarkTaskContainer{
private static final long serialVersionUID = 1L;
private final Resource modelToClone;
private final String containerId;
private final ActivationOption option;
private final HashMap<OCLExpressionWithContext, AllInstanceEvaluationMeasurement> allInstanceMeasureCache = new HashMap<OCLExpressionWithContext, AllInstanceEvaluationMeasurement>();
public ModelSizeVariationBenchmarkTaskContainer(Resource modelToClone, ActivationOption option, String containerId){
this.modelToClone = modelToClone;
this.option = option;
this.containerId = containerId;
}
@Override
public void beforeBenchmark() {
cloneModelAndAttachToBenchmarkTasks();
OptimizationActivation.setOption(option);
measureAllInstancesAndAttachToBenchmarkTasks();
}
private void cloneModelAndAttachToBenchmarkTasks() {
Resource clonedModel = ModelCloner.cloneResource(modelToClone, "x" + containerId);
Resource clonedModelBeforeChange = ModelCloner.cloneResource(modelToClone, "y" + containerId);
//Resource clonedModel = modelToClone;
for(BenchmarkTask task : this){
((ModelSizeVariationBenchmarkTask)task).setModel(clonedModel);
((ModelSizeVariationBenchmarkTask)task).setModelForIaAccuracyDetermination(clonedModelBeforeChange);
}
}
private void measureAllInstancesAndAttachToBenchmarkTasks(){
BenchmarkTask firstTask = element();
// Model and OppositeEndFinder is the same for all benchmark tasks in one container
Resource model = ((ModelSizeVariationBenchmarkTask)firstTask).getModel();
OppositeEndFinder oppositeEndFinder = ((ModelSizeVariationBenchmarkTask)firstTask).getOppositeEndFinder();
for(BenchmarkTask task : this){
OCLExpressionWithContext expression = ((ModelSizeVariationBenchmarkTask)task).getExpression();
if(allInstanceMeasureCache.containsKey(expression)){
((ModelSizeVariationBenchmarkTask)task).setAllInstanceEvaluationMeasurement(allInstanceMeasureCache.get(expression));
}else{
AllInstanceEvaluationMeasurement measurement = new AllInstanceEvaluationMeasurement(oppositeEndFinder, model, expression);
measurement.measureAllInstances();
allInstanceMeasureCache.put(expression, measurement);
((ModelSizeVariationBenchmarkTask)task).setAllInstanceEvaluationMeasurement(measurement);
}
}
}
@Override
public void afterBenchmark() {
}
@SuppressWarnings("unused")
private int getNumberOfEqualResults(Collection<Object> result1, Collection<Object> result2){
int equalCounter = 0;
for(Object elementInResult1 : result1){
for(Object elementInResult2 : result2){
if(elementInResult1 instanceof EList<?> && elementInResult2 instanceof EList<?>){
System.out.println("List result");
}else if(elementInResult1 instanceof EObject && elementInResult2 instanceof EObject){
if(EcoreUtil.equals((EObject)elementInResult1, (EObject)elementInResult2)){
equalCounter++;
break;
}
}else{
if(elementInResult1.equals(elementInResult2)){
equalCounter++;
break;
}
}
}
}
return equalCounter;
}
}