/** * Copyright (c) 2011-2012 Eclipse contributors 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 */ package org.eclipse.emf.ecore.xcore.scoping; import java.util.List; import java.util.Map; import org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.xtext.common.types.TypesPackage; import org.eclipse.xtext.naming.IQualifiedNameConverter; import org.eclipse.xtext.naming.QualifiedName; import org.eclipse.xtext.util.Pair; import org.eclipse.xtext.util.Strings; import org.eclipse.xtext.util.Tuples; import com.google.inject.Inject; import static com.google.common.collect.Maps.*; public class LazyCreationProxyURIConverter { @Inject private IQualifiedNameConverter nameConverter; private Map<String, EClass> types = newHashMap(); { EClass genClass = GenModelPackage.Literals.GEN_CLASS; EClass genDatatype = GenModelPackage.Literals.GEN_DATA_TYPE; EClass genEnum = GenModelPackage.Literals.GEN_ENUM; EClass jvmGenericType = TypesPackage.Literals.JVM_GENERIC_TYPE; EClass jvmEnumerationType = TypesPackage.Literals.JVM_ENUMERATION_TYPE; EClass jvmType = TypesPackage.Literals.JVM_TYPE; types.put(genClass.getName(), genClass); types.put(genDatatype.getName(), genDatatype); types.put(genEnum.getName(), genEnum); types.put(jvmGenericType.getName(), jvmGenericType); types.put(jvmEnumerationType.getName(), jvmEnumerationType); types.put(jvmType.getName(), jvmType); } public void installProxyURI(URI resourceURI, EObject eobject, QualifiedName name) { URI proxyURI = getProxyURI(resourceURI, eobject, name); ((InternalEObject)eobject).eSetProxyURI(proxyURI); } public URI getProxyURI(URI resourceURI, EObject eObject, QualifiedName name) { if (!isSupported(eObject)) { throw new IllegalArgumentException("eObjects of type " + eObject.eClass().getName() + " are not supported."); } return resourceURI.appendFragment(encodeFragment(eObject.eClass(), name)); } protected boolean isSupported(EObject eObject) { return types.containsValue(eObject.eClass()); } public Pair<EClass, QualifiedName> decodeProxy(EObject eObject) { URI proxyURI = ((InternalEObject)eObject).eProxyURI(); if (proxyURI != null) { return decodeProxyURI(proxyURI); } else { throw new IllegalArgumentException("Not a proxy: " + eObject); } } public Pair<EClass, QualifiedName> decodeProxyURI(URI proxyURI) { final String fragment = proxyURI.fragment(); if (fragment != null) { Pair<EClass, QualifiedName> fragmentInfo = decodeFragment(fragment); if (fragmentInfo != null) { return fragmentInfo; } } throw new IllegalArgumentException("No fragment: " + proxyURI); } protected static final String DELIM = "-=-"; public String encodeFragment(EClass eClass, QualifiedName name) { return (eClass.getEPackage() == TypesPackage.eINSTANCE ? "JvmType" : eClass.getName()) + DELIM + name.toString(); } public Pair<EClass, QualifiedName> decodeFragment(String fragment) { List<String> segments = Strings.split(fragment, DELIM); if (segments.size() == 2) { String eClassName = segments.get(0); QualifiedName name = nameConverter.toQualifiedName(segments.get(1)); if (types.containsKey(eClassName)) { EClass eClass = types.get(eClassName); return Tuples.create(eClass, name); } } return null; } }