/******************************************************************************* * Copyright (c) 2014, 2015 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.ocl.pivot.internal.manager; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.ocl.pivot.Type; import org.eclipse.ocl.pivot.evaluation.ModelManager; import org.eclipse.ocl.pivot.ids.IdResolver; import org.eclipse.ocl.pivot.internal.library.executor.ExecutorManager; import org.eclipse.ocl.pivot.internal.library.executor.LazyModelManager; import org.eclipse.ocl.pivot.messages.StatusCodes; import org.eclipse.ocl.pivot.utilities.ClassUtil; import org.eclipse.ocl.pivot.utilities.EnvironmentFactory; /** * A PivotExecutorManager instance provides the bridge between a conventional EMF execution context * and the richer OCL Pivot concepts. Since the OCL concepts are not needed for simple expressions * that make no use of types, the default construction is lightweight deferring construction costs * until actually needed. */ public class PivotExecutorManager extends ExecutorManager { protected final @NonNull EnvironmentFactory environmentFactory; protected final @NonNull IdResolver idResolver; protected final @NonNull EObject contextObject; private @Nullable ModelManager modelManager = null; public PivotExecutorManager(@NonNull EnvironmentFactory environmentFactory, @NonNull EObject contextObject) { super(environmentFactory.getCompleteEnvironment()); this.environmentFactory = environmentFactory; this.idResolver = environmentFactory.getIdResolver(); this.contextObject = contextObject; idResolver.addRoot(ClassUtil.nonNullEMF(EcoreUtil.getRootContainer(contextObject))); } protected @NonNull IdResolver createIdResolver() { return environmentFactory.getIdResolver(); } @Override public @NonNull Type getDynamicTypeOf(@Nullable Object value) { return idResolver.getDynamicTypeOf(value); } @Override public @NonNull ModelManager getModelManager() { ModelManager modelManager2 = modelManager; if (modelManager2 == null) { synchronized (this) { modelManager2 = modelManager; if (modelManager2 == null) { modelManager2 = new LazyModelManager(contextObject) { @Override protected boolean isInstance(@NonNull Type type, @NonNull EObject element) { EClass eClass = ClassUtil.nonNullEMF(element.eClass()); Type elementType = idResolver.getInheritance(eClass).getPivotClass(); return elementType.conformsTo(standardLibrary, type); } }; modelManager = modelManager2; } } } return modelManager2; } @Override public @NonNull IdResolver getIdResolver() { return idResolver; } @Override public int getSeverity(@Nullable Object validationKey) { StatusCodes.Severity severity = environmentFactory.getSeverity(validationKey); return severity != null ? severity.getStatusCode() : StatusCodes.WARNING; } @Override public org.eclipse.ocl.pivot.@NonNull Class getStaticTypeOf(@Nullable Object value) { return idResolver.getStaticTypeOf(value); } @Override public org.eclipse.ocl.pivot.@NonNull Class getStaticTypeOf(@Nullable Object value, @NonNull Object... values) { return idResolver.getStaticTypeOf(value, values); } @Override public org.eclipse.ocl.pivot.@NonNull Class getStaticTypeOf(@Nullable Object value, @NonNull Iterable<?> values) { return idResolver.getStaticTypeOf(value, values); } }