/******************************************************************************* * Copyright (c) 2011, 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.executor; import java.util.HashMap; import java.util.Map; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.ocl.pivot.CollectionType; import org.eclipse.ocl.pivot.CompleteInheritance; import org.eclipse.ocl.pivot.CompletePackage; import org.eclipse.ocl.pivot.Operation; import org.eclipse.ocl.pivot.PivotFactory; import org.eclipse.ocl.pivot.PivotTables; import org.eclipse.ocl.pivot.Type; import org.eclipse.ocl.pivot.internal.ecore.es2as.Ecore2AS; import org.eclipse.ocl.pivot.internal.library.ecore.EcoreExecutorPackage; import org.eclipse.ocl.pivot.internal.library.executor.ExecutableStandardLibrary; import org.eclipse.ocl.pivot.internal.library.executor.ExecutorType; import org.eclipse.ocl.pivot.internal.manager.PivotMetamodelManager; import org.eclipse.ocl.pivot.internal.resource.ASResourceFactoryRegistry; import org.eclipse.ocl.pivot.internal.utilities.EnvironmentFactoryInternal; import org.eclipse.ocl.pivot.library.LibraryConstants; import org.eclipse.ocl.pivot.oclstdlib.OCLstdlibTables; import org.eclipse.ocl.pivot.resource.BasicProjectManager; import org.eclipse.ocl.pivot.utilities.ClassUtil; public class PivotExecutorStandardLibrary extends ExecutableStandardLibrary { protected final @NonNull EnvironmentFactoryInternal environmentFactory; private Map<Type, org.eclipse.ocl.pivot.Class> typeMap = null; private Map<org.eclipse.ocl.pivot.Package, org.eclipse.ocl.pivot.Package> packageMap = null; public PivotExecutorStandardLibrary(EcoreExecutorPackage... execPackages) { OCLstdlibTables.PACKAGE.getClass(); this.environmentFactory = ASResourceFactoryRegistry.INSTANCE.createEnvironmentFactory(BasicProjectManager.createDefaultProjectManager(), null); environmentFactory.getStandardLibrary().setDefaultStandardLibraryURI(LibraryConstants.STDLIB_URI); PivotTables.PACKAGE.getClass(); } protected org.eclipse.ocl.pivot.@NonNull Package createPackage(org.eclipse.ocl.pivot.@NonNull Package domainPackage) { org.eclipse.ocl.pivot.Package pivotPackage = PivotFactory.eINSTANCE.createPackage(); pivotPackage.setName(domainPackage.getName()); pivotPackage.setURI(domainPackage.getURI()); for (org.eclipse.ocl.pivot.Class domainType : domainPackage.getOwnedClasses()) { if (domainType != null) { org.eclipse.ocl.pivot.Class pivotType = createType(domainType); pivotPackage.getOwnedClasses().add(pivotType); } } return pivotPackage; } protected org.eclipse.ocl.pivot.@NonNull Class createType(org.eclipse.ocl.pivot.@NonNull Class domainType) { org.eclipse.ocl.pivot.Class pivotType = PivotFactory.eINSTANCE.createClass(); pivotType.setName(domainType.getName()); return pivotType; } @Override public org.eclipse.ocl.pivot.@NonNull Class getClassType() { return environmentFactory.getStandardLibrary().getClassType(); } @Override public org.eclipse.ocl.pivot.@NonNull Class getEnumerationType() { return environmentFactory.getStandardLibrary().getEnumerationType(); } @Override public @NonNull CompleteInheritance getInheritance(org.eclipse.ocl.pivot.@NonNull Class type) { return environmentFactory.getMetamodelManager().getInheritance(type); } public @NonNull PivotMetamodelManager getMetamodelManager() { return environmentFactory.getMetamodelManager(); } @Override public org.eclipse.ocl.pivot.@Nullable Package getNsURIPackage(@NonNull String nsURI) { throw new UnsupportedOperationException(); } @Override public @NonNull Operation getOclInvalidOperation() { throw new UnsupportedOperationException(); } @Override public Type getOclType(@NonNull String typeName) { ExecutorType type = PivotTables.PACKAGE.getOwnedClass(typeName); return type != null ? type.getPivotClass() : null; } @SuppressWarnings("null") protected org.eclipse.ocl.pivot.Class getType(Type typeType) { if (typeType instanceof CollectionType) { CollectionType domainCollectionType = (CollectionType)typeType; return environmentFactory.getCompleteEnvironment().getCollectionType(domainCollectionType.getContainerType(), domainCollectionType.getElementType(), domainCollectionType.isIsNullFree(), null, null); } if (typeMap == null) { typeMap = new HashMap<Type, org.eclipse.ocl.pivot.Class>(); } else { org.eclipse.ocl.pivot.Class type = typeMap.get(typeType); if (type != null) { return type; } } if (packageMap == null) { packageMap = new HashMap<org.eclipse.ocl.pivot.Package, org.eclipse.ocl.pivot.Package>(); } org.eclipse.ocl.pivot.Package domainPackage = ((org.eclipse.ocl.pivot.Class)typeType).getOwningPackage(); org.eclipse.ocl.pivot.Package pivotPackage = packageMap.get(domainPackage); PivotMetamodelManager metamodelManager = environmentFactory.getMetamodelManager(); if (pivotPackage == null) { String nsURI = domainPackage.getURI(); if (nsURI != null) { pivotPackage = metamodelManager.getPrimaryPackage(nsURI); } if (pivotPackage == null) { pivotPackage = createPackage(domainPackage); } } @NonNull CompletePackage completePackage = metamodelManager.getCompletePackage(pivotPackage); return completePackage.getMemberType(typeType.getName()); } public @NonNull Type getType(@NonNull EClassifier eClassifier) { Ecore2AS ecore2as = Ecore2AS.getAdapter(ClassUtil.nonNullEMF(eClassifier.eResource()), environmentFactory); Type pivotType = ecore2as.getCreated(Type.class, eClassifier); return ClassUtil.nonNullState(pivotType); } }