blob: b9372d44bcb4e9d50e20713a4cacfa46e3695316 [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2014,2015 ASML Netherlands B.V. 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:
* ASML Netherlands B.V. - Initial API and implementation
*
*****************************************************************************/
package org.eclipse.m2m.internal.qvt.oml.tools.coverage;
import org.eclipse.emf.common.util.URI;
import org.eclipse.m2m.internal.qvt.oml.ast.binding.ASTBindingHelper;
import org.eclipse.m2m.internal.qvt.oml.ast.binding.IModuleSourceInfo;
import org.eclipse.m2m.internal.qvt.oml.ast.env.InternalEvaluationEnv;
import org.eclipse.m2m.internal.qvt.oml.ast.env.QvtOperationalEvaluationEnv;
import org.eclipse.m2m.internal.qvt.oml.evaluator.InternalEvaluator;
import org.eclipse.m2m.internal.qvt.oml.evaluator.QvtGenericVisitorDecorator;
import org.eclipse.m2m.internal.qvt.oml.evaluator.QvtRuntimeException;
import org.eclipse.m2m.internal.qvt.oml.expressions.Module;
import org.eclipse.m2m.internal.qvt.oml.expressions.OperationalTransformation;
import org.eclipse.m2m.internal.qvt.oml.tools.coverage.common.CoverageData;
import org.eclipse.m2m.internal.qvt.oml.tools.coverage.common.CoverageDataPersistor;
import org.eclipse.m2m.internal.qvt.oml.tools.coverage.common.TransformationCoverageData;
import org.eclipse.m2m.qvt.oml.util.ISessionData;
import org.eclipse.ocl.utilities.ASTNode;
@SuppressWarnings("restriction")
public class QVTOCoverageDecorator extends QvtGenericVisitorDecorator {
public static final ISessionData.SimpleEntry<CoverageData> COVERAGE_DATA = new ISessionData.SimpleEntry<CoverageData>(new CoverageData());
private final CoverageData data;
public QVTOCoverageDecorator(InternalEvaluator qvtExtVisitor) {
super(qvtExtVisitor);
data = getCoverageResource();
}
private CoverageData getCoverageResource() {
return getContext().getSessionData().getValue(COVERAGE_DATA);
}
@Override
protected Object genericPreVisitAST(ASTNode element) {
TransformationCoverageData data = getTransformationCoverageData();
if (data != null) {
data.touch(element);
}
return super.genericPreVisitAST(element);
}
// Note: strangely enough this method is only invoked in case of running the transformation using the
// TransformationExecutor. In case the transformation is launched using the launch configuration, this method is
// somehow not invoked.
@Override
public Object execute(OperationalTransformation transformation) throws QvtRuntimeException {
try {
return super.execute(transformation);
}
finally {
// Save only for JUnit execution
if (getCoverageResource() == COVERAGE_DATA.defaultValue()) {
CoverageDataPersistor.save(data);
}
}
}
private TransformationCoverageData getTransformationCoverageData() {
QvtOperationalEvaluationEnv evalEnv = (QvtOperationalEvaluationEnv) getEvaluationEnvironment();
InternalEvaluationEnv internEnv = evalEnv.getAdapter(InternalEvaluationEnv.class);
TransformationCoverageData transformationData = null;
if (internEnv.getCurrentModule() != null) {
Module module = internEnv.getCurrentModule().getModule();
IModuleSourceInfo moduleSource = ASTBindingHelper.getModuleSourceBinding(module);
URI uri = moduleSource.getSourceURI().appendFragment(module.getName());
// See if we already have a data for that module.
for (TransformationCoverageData transData : data.getData()) {
if (transData.getURI().equals(uri)) {
transformationData = transData;
}
}
// Otherwise create a new one
if (transformationData == null) {
transformationData = new TransformationCoverageData(uri);
// And store it in CoverageData, since that's what gets saved later.
data.add(transformationData);
}
}
return transformationData;
}
}