/******************************************************************************* * Copyright (c) 2009, 2010 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 de.hpi.sam.bp2009.solution.oclToAst.impl; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.eclipse.emf.ecore.EFactory; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EPackage.Registry; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.impl.EPackageRegistryImpl; /** * This is an special EPackage registry which is used by the {@link EAnnotationOCLParserImpl} * to combine the standard registered package with all packages in scope * @author Philipp * */ public class OclAstRegistry implements EPackage.Registry { private Registry base; private Map<String,EPackage> nsToPkg = new HashMap<String, EPackage>(); /** * Create a new Registry with a base registry and a set of salt packages * Note: by {@link Map#keySet()}, {@link Map#values()} and {@link Map#entrySet()} a new set will be delivered * so changes at this Set will have no effect to this registry * @param baseRegistry this registry is used as fallback for requests * @param saltPackages this packages get sorted by {@link EPackage#getNsURI()} and are delivered first */ public OclAstRegistry(EPackage.Registry baseRegistry, Collection<EPackage> saltPackages) { this.base = new EPackageRegistryImpl(); this.base.put(EcorePackage.eNS_URI, EcorePackage.eINSTANCE); if(saltPackages!=null){ for(EPackage p: saltPackages){ nsToPkg.put(p.getNsURI(), p); if(p.getESuperPackage()==null && p.eResource()!=null){ nsToPkg.put(p.eResource().getURI().toString(), p); } } } } /** * * @see java.util.Map#clear() */ public void clear() { base.clear(); } /** * @param arg0 * @return * @see java.util.Map#containsKey(java.lang.Object) */ public boolean containsKey(Object arg0) { if(nsToPkg.containsKey(arg0)){ return true; } return base.containsKey(arg0); } /** * @param arg0 * @return * @see java.util.Map#containsValue(java.lang.Object) */ public boolean containsValue(Object arg0) { if(nsToPkg.containsValue(arg0)){ return true; } return base.containsValue(arg0); } /** * @return * @see java.util.Map#entrySet() */ @SuppressWarnings("unchecked") public Set<java.util.Map.Entry<String, Object>> entrySet() { Set<Entry<String, Object>> result = new HashSet<Map.Entry<String,Object>>(); result.addAll(base.entrySet()); result.addAll((Collection<? extends java.util.Map.Entry<String, Object>>) nsToPkg.entrySet()); return result ; } /** * @param arg0 * @return * @see java.util.Map#get(java.lang.Object) */ public Object get(Object arg0) { if(nsToPkg.containsKey(arg0)){ return nsToPkg.get(arg0); } return base.get(arg0); } /** * @param nsURI * @return * @see org.eclipse.emf.ecore.EPackage.Registry#getEPackage(java.lang.String) */ public EPackage getEPackage(String nsURI) { if(nsToPkg.containsKey(nsURI)){ return nsToPkg.get(nsURI); } return base.getEPackage(nsURI); } /** * @param nsURI * @return * @see org.eclipse.emf.ecore.EPackage.Registry#getEFactory(java.lang.String) */ public EFactory getEFactory(String nsURI) { return base.getEFactory(nsURI); } /** * @return * @see java.util.Map#isEmpty() */ public boolean isEmpty() { return base.isEmpty() && nsToPkg.isEmpty(); } /** * @return * @see java.util.Map#keySet() */ public Set<String> keySet() { Set<String> result = new HashSet<String>(); result.addAll(base.keySet()); result.addAll(nsToPkg.keySet()); return result ; } /** * @param arg0 * @param arg1 * @return * @see java.util.Map#put(java.lang.Object, java.lang.Object) */ public Object put(String arg0, Object arg1) { return base.put(arg0, arg1); } /** * @param arg0 * @see java.util.Map#putAll(java.util.Map) */ public void putAll(Map<? extends String, ? extends Object> arg0) { base.putAll(arg0); } /** * @param arg0 * @return * @see java.util.Map#remove(java.lang.Object) */ public Object remove(Object arg0) { return base.remove(arg0); } /** * @return * @see java.util.Map#size() */ public int size() { return base.size(); } /** * @return * @see java.util.Map#values() */ public Collection<Object> values() { Set<Object> result = new HashSet<Object>(); result.addAll(nsToPkg.values()); result.addAll(base.values()); return result ; } }