blob: f8db038041058af5d00541bfe7d61dfc10f0bf61 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2019 Mia-Software 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:
* Gregoire DUPE (Mia-Software)
* Nicolas Bros (Mia-Software)
*******************************************************************************/
package org.eclipse.modisco.infra.common.core.internal.builder;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EPackage.Registry;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl;
import org.eclipse.modisco.infra.common.core.internal.CommonModiscoActivator;
import org.eclipse.modisco.infra.common.core.internal.Messages;
import org.eclipse.modisco.infra.common.core.internal.resource.MoDiscoResourceSet;
/**
* @author Gregoire DUPE
*/
public class EcoreCatalog extends AbstractMoDiscoCatalog {
private static final String DEBUG_ID = "org.eclipse.modisco.infra.common.core/debug/EcoreCatalog/debug"; //$NON-NLS-1$
static final boolean DEBUG = CommonModiscoActivator.getDefault().isDebugging()
&& Boolean.parseBoolean(Platform.getDebugOption(EcoreCatalog.DEBUG_ID));
public static final String NS_URI_CONFLICT_MARKER = CommonModiscoActivator.getDefault()
.getBundle().getSymbolicName()
+ ".nsuriconflict"; //$NON-NLS-1$
private static EcoreCatalog singleton;
private static Map<EPackage, IFile> ePackageToFileMap = new HashMap<EPackage, IFile>();
private Map<URI, IFile> nsuriToFile;
private static Map<String, Object> originalRegistry = null;
static {
EcoreCatalog.originalRegistry = new HashMap<String, Object>();
Set<Entry<String, Object>> entrySet = EPackage.Registry.INSTANCE.entrySet();
for (Entry<String, Object> entry : entrySet) {
EcoreCatalog.originalRegistry.put(entry.getKey(), entry.getValue());
}
}
public static synchronized EcoreCatalog getSingleton() {
if (EcoreCatalog.singleton == null) {
EcoreCatalog.singleton = new EcoreCatalog();
}
return EcoreCatalog.singleton;
}
protected EcoreCatalog() {
super();
}
/**
* {@inheritDoc}
*/
@Override
protected String getMoDiscoSubProtocol() {
return null;
}
/**
* {@inheritDoc}
*/
@Override
protected String getRegistryExtensionPoint() {
return null;
}
/**
* {@inheritDoc}
*/
@Override
protected Class<?> getRootClass() {
return EPackage.class;
}
/**
* {@inheritDoc}
*/
@Override
protected String getRootObjectName(final EObject rootObject) {
return ((EPackage) rootObject).getName();
}
/**
* {@inheritDoc}
*/
@Override
protected String getRootObjectNsUri(final EObject rootObject) {
return ((EPackage) rootObject).getNsURI();
}
@Override
protected synchronized void postOpenResource(final URI uri, final IFile file, final EObject root)
throws Exception {
EPackage ePackage = (EPackage) root;
// remove old URI corresponding to this file (nsURI can have changed)
for (URI oldURI : getNsUriToFile().keySet()) {
IFile oldFile = getNsUriToFile().get(oldURI);
if (oldFile != null && oldFile.equals(file)) {
getEPackageRegistry().remove(oldURI.toString());
restoreRegistryEntry(oldURI.toString());
}
}
// EPackage generatedEPackage = null;
// try {
// generatedEPackage = searchPluginXml(ePackage.getNsURI(),
// (IFile) file);
// } catch (Exception e) {
// IStatus status = new Status(IStatus.ERROR,
// CommonModiscoActivator.PLUGIN_ID, e.getMessage(), e);
// CommonModiscoActivator.getDefault().getLog().log(status);
// }
// if (generatedEPackage != null) {
// ePackage = generatedEPackage;
// } else {
EcoreCatalog.ePackageToFileMap.put(ePackage, file);
URI nsUri = URI.createURI(getRootObjectNsUri(ePackage));
IFile oldFile = getNsUriToFile().get(nsUri);
if (oldFile != null && file != null && !oldFile.getFullPath().equals(file.getFullPath())) {
IMarker marker = file.createMarker(EcoreCatalog.NS_URI_CONFLICT_MARKER);
marker.setAttribute(IMarker.MESSAGE,
Messages.EcoreCatalog_uriConflict + oldFile.getFullPath());
marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR);
throw new OpenResourceException();
}
Resource mmResource = null;
try {
synchronized (MoDiscoResourceSet.getResourceSetSingleton()) {
mmResource = MoDiscoResourceSet.getResourceSetSingleton().getResource(nsUri, false);
}
} catch (Exception e) {
IStatus status = new Status(IStatus.WARNING, CommonModiscoActivator.PLUGIN_ID,
e.getMessage(), e);
CommonModiscoActivator.getDefault().getLog().log(status);
}
if (mmResource == null) {
synchronized (MoDiscoResourceSet.getResourceSetSingleton()) {
mmResource = MoDiscoResourceSet.getResourceSetSingleton().createResource(nsUri);
}
}
synchronized (mmResource) {
mmResource.getContents().clear();
mmResource.getContents().add(ePackage);
}
String rootObjectNsUri = getRootObjectNsUri(ePackage);
getEPackageRegistry().put(rootObjectNsUri, ePackage);
if (EcoreCatalog.DEBUG) {
System.out.println(this.getClass().getSimpleName() + ".postOpenResource(): " + nsUri); //$NON-NLS-1$
}
getNsUriToFile().put(nsUri, file);
// }
}
private synchronized Map<URI, IFile> getNsUriToFile() {
if (this.nsuriToFile == null) {
this.nsuriToFile = new HashMap<URI, IFile>();
}
return this.nsuriToFile;
}
@Override
protected synchronized void preRemove(final IFile declarationFile, final String pathName,
final EObject oldRootObject) {
if (oldRootObject != null) {
EPackage ePackage = (EPackage) oldRootObject;
if (EcoreCatalog.DEBUG) {
System.out.println(this.getClass().getSimpleName()
+ ".preRemove(): " + ePackage.getNsURI()); //$NON-NLS-1$
}
URI uri = URI.createURI(ePackage.getNsURI());
getNsUriToFile().remove(uri);
EcoreCatalog.ePackageToFileMap.remove(ePackage);
// remove old URI corresponding to this file
getEPackageRegistry().remove(uri.toString());
restoreRegistryEntry(uri.toString());
} else {
if (EcoreCatalog.DEBUG) {
System.out.println(this.getClass().getSimpleName()
+ ".preRemove(): oldRootObject is null."); //$NON-NLS-1$
}
}
}
/**
* This method returns the original location of an EPackage
*/
public String getOriginalLocation(final EPackage ePackage) {
IFile file = EcoreCatalog.ePackageToFileMap.get(ePackage);
if (file == null) {
return ""; //$NON-NLS-1$
}
return file.getFullPath().toString();
}
/**
* {@inheritDoc}
*/
@Override
protected Plugin getActivator() {
return CommonModiscoActivator.getDefault();
}
@Override
public String getFileExtension() {
return EcoreBuilder.FILE_EXTENSION;
}
private Registry getEPackageRegistry() {
return EPackage.Registry.INSTANCE;
}
private void restoreRegistryEntry(final String nsURI) {
if (EcoreCatalog.originalRegistry != null) {
Object value = EcoreCatalog.originalRegistry.get(nsURI);
if (value != null) {
if (value instanceof EPackage) {
EPackage ePackage = (EPackage) value;
Resource resource = new EcoreResourceFactoryImpl().createResource(URI
.createURI(nsURI));
synchronized (resource) {
resource.getContents().add(ePackage);
}
EPackage.Registry.INSTANCE.put(nsURI, ePackage);
} else {
EPackage.Registry.INSTANCE.put(nsURI, value);
}
}
}
}
}