/** * Copyright (c) 2002-2010 IBM Corporation 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: * IBM - Initial API and implementation */ package org.eclipse.emf.ecore.impl; import java.util.HashMap; import org.eclipse.emf.ecore.EFactory; import org.eclipse.emf.ecore.EPackage; /** * An implementation of a package registry that can delegate failed lookup to another registry. */ public class EPackageRegistryImpl extends HashMap<String, Object> implements EPackage.Registry { private static final long serialVersionUID = 1L; /** * Creates the {@link EPackage.Registry#INSTANCE instance} of the global registry. * If a {@link System#getSecurityManager() security manager} is active, * and <code>"classLoader"</code> {@link RuntimePermission permission} is not granted, * a secure delegator instance is created, * i.e., a private registry implementation that securely accesses class loaders * and keeps them private, will be used. */ public static EPackage.Registry createGlobalRegistry() { return new EPackageRegistryImpl(); } /** * The delegate registry. */ protected EPackage.Registry delegateRegistry; /** * Creates a non-delegating instance. */ public EPackageRegistryImpl() { super(); } /** * Creates a delegating instance. */ public EPackageRegistryImpl(EPackage.Registry delegateRegistry) { this.delegateRegistry = delegateRegistry; } /* * Javadoc copied from interface. */ public EPackage getEPackage(String nsURI) { Object ePackage = get(nsURI); if (ePackage instanceof EPackage) { EPackage result = (EPackage)ePackage; if (result.getNsURI() == null) { initialize(result); } return result; } else if (ePackage instanceof EPackage.Descriptor) { EPackage.Descriptor ePackageDescriptor = (EPackage.Descriptor)ePackage; EPackage result = ePackageDescriptor.getEPackage(); if (result != null) { if (result.getNsURI() == null) { initialize(result); } else { put(nsURI, result); } } return result; } else { return delegatedGetEPackage(nsURI); } } /* * Javadoc copied from interface. */ public EFactory getEFactory(String nsURI) { Object ePackage = get(nsURI); if (ePackage instanceof EPackage) { EPackage result = (EPackage)ePackage; if (result.getNsURI() == null) { initialize(result); } return result.getEFactoryInstance(); } else if (ePackage instanceof EPackage.Descriptor) { EPackage.Descriptor ePackageDescriptor = (EPackage.Descriptor)ePackage; EFactory result = ePackageDescriptor.getEFactory(); return result; } else { return delegatedGetEFactory(nsURI); } } /** * Creates a delegating instance. */ protected void initialize(EPackage ePackage) { // Do nothing. } /** * Returns the package from the delegate registry, if there is one. * @return the package from the delegate registry. */ protected EPackage delegatedGetEPackage(String nsURI) { if (delegateRegistry != null) { return delegateRegistry.getEPackage(nsURI); } return null; } /** * Returns the factory from the delegate registry, if there is one. * @return the factory from the delegate registry. */ protected EFactory delegatedGetEFactory(String nsURI) { if (delegateRegistry != null) { return delegateRegistry.getEFactory(nsURI); } return null; } /** * Returns whether this map or the delegate map contains this key. Note that * if there is a delegate map, the result of this method may * <em><b>not</b></em> be the same as <code>keySet().contains(key)</code>. * @param key the key whose presence in this map is to be tested. * @return whether this map or the delegate map contains this key. */ @Override public boolean containsKey(Object key) { return super.containsKey(key) || delegateRegistry != null && delegateRegistry.containsKey(key); } }