blob: e0100273721a54154a9fed9c34c451aaec8e3a59 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2018 Willink Transformations and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* E.D.Willink - initial API and implementation
*******************************************************************************/
package org.eclipse.ocl.pivot.internal.ids;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.impl.EPackageImpl;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.pivot.ids.IdManager;
import org.eclipse.ocl.pivot.ids.IdVisitor;
import org.eclipse.ocl.pivot.ids.NsURIPackageId;
public class NsURIPackageIdImpl extends AbstractPackageIdImpl implements NsURIPackageId
{
/**
* The Namespace URI of this package identity.
*/
protected final @NonNull String nsURI;
/**
* The optional Namespace prefix that may be preferred as an XML namepsace prefix.
*/
protected final @Nullable String nsPrefix;
/**
* Cached EPackage that has this Namespace URI, iff a not-unloadable genmodelled implementation is available.
*/
private @Nullable EPackage ePackage = null;
public NsURIPackageIdImpl(@NonNull IdManager idManager, @NonNull String nsURI, @Nullable String nsPrefix, @Nullable EPackage ePackage) {
super(nsURI.hashCode());
this.nsURI = nsURI;
this.nsPrefix = nsPrefix;
if (ePackage != null) {
setEPackage(ePackage);
}
}
@Override
public <R> R accept(@NonNull IdVisitor<R> visitor) {
return visitor.visitNsURIPackageId(this);
}
@Override
public @NonNull String getDisplayName() {
return nsURI;
}
@Override
public @Nullable EPackage getEPackage() {
if ((ePackage != null) && ePackage.eIsProxy()) {
// EcoreUtil.resolve(ePackage, ePackage); See Bug 548225 -- cannot repair the damage by re-resolving in an unknown ResourceSet
throw new IllegalStateException("'" + nsURI + "' is a proxy because it has been unloaded.");
}
return ePackage;
}
@Override
public @Nullable String getNsPrefix() {
return nsPrefix;
}
@Override
public @NonNull String getNsURI() {
return nsURI;
}
@Override
public void setEPackage(@NonNull EPackage ePackage) {
assert !ePackage.eIsProxy(); // See Bug 548225, must not cache something unloadable
if (ePackage.getClass() != EPackageImpl.class) { // Dynamic Ecore metamodels do not have derived EPackageImpl's
Resource eResource = ePackage.eResource();
if ((eResource == null) || (eResource.getResourceSet() == null)) { // No Resource/ResourceSet inhibits unloading/proxy conversion
this.ePackage = ePackage;
}
}
}
@Override
public String toString() {
return "'" + nsURI + "'";
}
}