blob: 66ebcec2dae3578fd9cdf768de60f12336c61fb2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 Willink Transformations 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:
* E.D.Willink - initial API and implementation
*******************************************************************************/
package org.eclipse.qvtd.pivot.qvtbase.utilities;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.pivot.utilities.ClassUtil;
import org.eclipse.ocl.pivot.utilities.EnvironmentFactory;
import org.eclipse.ocl.pivot.utilities.EnvironmentFactory.EnvironmentFactoryExtension2;
import org.eclipse.qvtd.runtime.evaluation.AbstractTransformer;
import org.eclipse.qvtd.runtime.qvttrace.QVTtracePackage;
import org.eclipse.ocl.pivot.utilities.NameUtil;
import org.eclipse.ocl.pivot.utilities.PivotUtil;
/**
* TraceHelper provides helper routines to assist in use of the QVTtrace Metamodel.
*/
public class TraceHelper
{
protected final @NonNull EnvironmentFactoryExtension2 environmentFactory;
private org.eclipse.ocl.pivot.@Nullable Package tracePackage = null;
private org.eclipse.ocl.pivot.@Nullable Class dispatchClass = null;
private org.eclipse.ocl.pivot.@Nullable Class executionClass = null;
private org.eclipse.ocl.pivot.@Nullable Class traceElementClass = null;
public TraceHelper(@NonNull EnvironmentFactory environmentFactory) {
this.environmentFactory = (EnvironmentFactoryExtension2) environmentFactory;
}
public org.eclipse.ocl.pivot.@NonNull Class getDispatchClass() {
org.eclipse.ocl.pivot.Class dispatchClass2 = dispatchClass;
if (dispatchClass2 == null) {
String className = QVTtracePackage.Literals.DISPATCH.getName();
Iterable<org.eclipse.ocl.pivot.@NonNull Class> ownedClasses = PivotUtil.getOwnedClasses(getTracePackage());
dispatchClass = dispatchClass2 = ClassUtil.nonNullState(NameUtil.getNameable(ownedClasses, className));
}
return dispatchClass2;
}
public org.eclipse.ocl.pivot.@NonNull Class getExecutionClass() {
org.eclipse.ocl.pivot.Class executionClass2 = executionClass;
if (executionClass2 == null) {
String className = QVTtracePackage.Literals.EXECUTION.getName();
Iterable<org.eclipse.ocl.pivot.@NonNull Class> ownedClasses = PivotUtil.getOwnedClasses(getTracePackage());
executionClass = executionClass2 = ClassUtil.nonNullState(NameUtil.getNameable(ownedClasses, className));
}
return executionClass2;
}
public org.eclipse.ocl.pivot.@NonNull Class getTraceElementClass() {
org.eclipse.ocl.pivot.Class traceElementClass2 = traceElementClass;
if (traceElementClass2 == null) {
String className = QVTtracePackage.Literals.TRACE_ELEMENT.getName();
Iterable<org.eclipse.ocl.pivot.@NonNull Class> ownedClasses = PivotUtil.getOwnedClasses(getTracePackage());
traceElementClass = traceElementClass2 = ClassUtil.nonNullState(NameUtil.getNameable(ownedClasses, className));
}
return traceElementClass2;
}
public org.eclipse.ocl.pivot.@NonNull Package getTracePackage() {
org.eclipse.ocl.pivot.@Nullable Package tracePackage2 = tracePackage;
if (tracePackage2 == null) {
//
// NB See Bug 532561, we must not load a generated version of QVTtrace.ecore to avoid
// dynamic-extends-generated hazards for interpreted execution. For compiled execution
// the QVTtrace.ecore references resolve to generated eventually anyway.
//
Resource traceResource = environmentFactory.getResourceSet().getResource(AbstractTransformer.TRACE_MODEL_URI, true);
if ((traceResource == null) || !(traceResource.getErrors().isEmpty()) || (traceResource.getContents().size() != 1)) {
throw new IllegalTraceException("Failed to load '" + AbstractTransformer.TRACE_MODEL_URI + "'");
}
EPackage traceEPackage = (EPackage) traceResource.getContents().get(0);
try {
tracePackage = tracePackage2 = environmentFactory.getASOf(org.eclipse.ocl.pivot.Package.class, traceEPackage);
} catch (Throwable e) {
throw new IllegalTraceException("Failed to create Pivot version of '" + AbstractTransformer.TRACE_MODEL_URI + "'", e);
}
if (tracePackage2 == null) {
throw new IllegalTraceException("Failed to create Pivot version of '" + AbstractTransformer.TRACE_MODEL_URI + "'");
}
}
return tracePackage2;
}
}