/******************************************************************************* * Copyright (c) 2011, 2014 SAP AG 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: * SAP AG - initial API and implementation ******************************************************************************/ package org.eclipse.ocl.ecore.opposites; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EPackage.Registry; import org.eclipse.ocl.ecore.EcoreEnvironmentFactory; /** * An environment factory which can be used to provide a non-<code>null</code> * {@link OppositeEndFinder} to the OCL environment. This enables lookup and * evaluation of so-called "hidden opposites" which are represented by * annotations with key "Property#oppositeRoleName" on the forward reference * and which allow for querying the opposite direction by simple dotted syntax * and by cleanly providing a scope for the opposite lookup.<p> * * If no {@link OppositeEndFinder} is provided to a constructor, a * {@link DefaultOppositeEndFinder} is used that is either specific to the * {@link Registry registry} provided or that is aligned with the * default {@link Registry#INSTANCE package registry}. * * @author Axel Uhl (auhl) * @since 3.1 */ public class EcoreEnvironmentFactoryWithHiddenOpposites extends EcoreEnvironmentFactory { /** * A default instance that works with the default {@link Registry#INSTANCE package registry}. */ public static final EcoreEnvironmentFactoryWithHiddenOpposites INSTANCE = new EcoreEnvironmentFactoryWithHiddenOpposites(); private final OppositeEndFinder oppositeEndFinder; /** * Initializes me. Environments that I create will use the global package registry to look up packages. * Uses the result of {@link DefaultOppositeEndFinder#getInstance()} as opposite end finder. */ public EcoreEnvironmentFactoryWithHiddenOpposites() { this(EPackage.Registry.INSTANCE); } /** * Initializes me with an <code>EPackage.Registry</code> that the environments I create will use to look up * packages. A new {@link DefaultOppositeEndFinder} object is created for the specific package registry * provided as <code>reg</code>. * * @param reg * my package registry (must not be <code>null</code>) */ public EcoreEnvironmentFactoryWithHiddenOpposites(EPackage.Registry reg) { this(reg, DefaultOppositeEndFinder.getInstance(reg)); } /** * Configures both, a specific package registry as well as a dedicated opposite end finder to be used * by the OCL environment created by this factory. */ public EcoreEnvironmentFactoryWithHiddenOpposites(EPackage.Registry reg, OppositeEndFinder oppositeEndFinder) { super(reg); this.oppositeEndFinder = oppositeEndFinder; } @Override protected OppositeEndFinder createOppositeEndFinder(Registry registry) { return oppositeEndFinder; } }