/******************************************************************************* * 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 * Adolfo Sanchez-Barbudo Herrera (University of York) - Lookup Environment/Visitor *******************************************************************************/ package org.eclipse.ocl.examples.autogen.lookup; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import org.eclipse.emf.codegen.ecore.genmodel.GenPackage; 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.Class; import org.eclipse.ocl.pivot.Model; import org.eclipse.ocl.pivot.Operation; import org.eclipse.ocl.pivot.Package; import org.eclipse.ocl.pivot.PivotPackage; import org.eclipse.ocl.pivot.internal.utilities.EnvironmentFactoryInternal; import org.eclipse.ocl.pivot.internal.utilities.PivotUtilInternal; import org.eclipse.ocl.pivot.oclstdlib.OCLstdlibPackage; import org.eclipse.ocl.pivot.utilities.ClassUtil; /** * LookupCodeGenerator supports generation of the content of a JavaClassFile for the Lookup visitor. */ public class LookupCodeGenerator { public static void generate(@NonNull GenPackage genPackage, @Nullable GenPackage superGenPackage, @Nullable GenPackage baseGenPackage, @NonNull String projectName, @NonNull String lookupFilePath, @NonNull String lookupPackageName, @Nullable String superLookupPackageName, @Nullable String baseLookupPackage) { EPackage ePackage = genPackage.getEcorePackage(); assert ePackage != null; Resource eResource = ClassUtil.nonNullState(ePackage.eResource()); EnvironmentFactoryInternal environmentFactory = PivotUtilInternal.getEnvironmentFactory(eResource); List<org.eclipse.ocl.pivot.@NonNull Package> targetPackages = LookupCGUtil.getTargetPackages(genPackage,environmentFactory, lookupFilePath, projectName); for (org.eclipse.ocl.pivot.Package oclDocPackage : targetPackages){ org.eclipse.ocl.pivot.Package asSuperPackage = null; if (superGenPackage != null) { String superProjectPrefix = superGenPackage.getPrefix(); asSuperPackage = LookupCGUtil.getPackage(genPackage, superProjectPrefix, environmentFactory); if (asSuperPackage == null) { throw new IllegalStateException("No super-GenPackage found in UsedGenPackages for " + superProjectPrefix); } } org.eclipse.ocl.pivot.Package basePackage = asSuperPackage == null ? oclDocPackage : asSuperPackage; if (baseGenPackage != null) { String baseProjectPrefix = baseGenPackage.getPrefix(); basePackage = LookupCGUtil.getPackage(genPackage, baseProjectPrefix, environmentFactory); if (basePackage == null) { throw new IllegalStateException("No super-GenPackage found in UsedGenPackages for " + baseProjectPrefix); } } for (String unqualifiedOpName : gatherEnvOpNames(oclDocPackage, LookupVisitorsClassContext.UNQUALIFIED_ENV_NAME)) { new LookupUnqualifiedCodeGenerator(environmentFactory, oclDocPackage, asSuperPackage, basePackage, genPackage,superGenPackage, baseGenPackage, unqualifiedOpName).saveSourceFile(); } for (String exportedEnvOpName : gatherEnvOpNames(oclDocPackage, LookupVisitorsClassContext.EXPORTED_ENV_NAME)) { new LookupExportedVisitorCodeGenerator(environmentFactory, oclDocPackage, asSuperPackage, basePackage, genPackage,superGenPackage, baseGenPackage, exportedEnvOpName).saveSourceFile(); } for (String qualifiedEnvOpName : gatherEnvOpNames(oclDocPackage, LookupVisitorsClassContext.QUALIFIED_ENV_NAME)) { new LookupQualifiedCodeGenerator(environmentFactory, oclDocPackage, asSuperPackage, basePackage, genPackage,superGenPackage, baseGenPackage, qualifiedEnvOpName).saveSourceFile(); } new LookupFilterGenerator(environmentFactory, oclDocPackage, asSuperPackage, basePackage, genPackage, superGenPackage, baseGenPackage, lookupPackageName, superLookupPackageName, baseLookupPackage).saveSourceFile(); } } private static Set<@NonNull String> gatherEnvOpNames(@NonNull Package oclDocPackage, @NonNull String envOpNamePrefix) { Set<@NonNull String> result = new LinkedHashSet<@NonNull String>(); Model model = (Model) oclDocPackage.eContainer(); for (Package pPackage : model.getOwnedPackages()) { String uri = pPackage.getURI(); if (uri.equals(OCLstdlibPackage.eNS_URI) || uri.equals(PivotPackage.eNS_URI)) { // FIXME for (Class pClass : pPackage.getOwnedClasses()) { for (Operation op : pClass.getOwnedOperations()) { String opName = op.getName(); if (opName != null && opName.startsWith(envOpNamePrefix)) { result.add(opName); } } } } } return result; } }