blob: ef65b3ce245e04e8e6b4f827d1b8818fc79cc672 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 The University of York.
* 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:
* Dimitrios Kolovos - initial API and implementation
******************************************************************************/
package org.eclipse.epsilon.emf.dt;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.StringTokenizer;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.epsilon.common.dt.util.LogUtil;
import org.eclipse.epsilon.emc.emf.EmfUtil;
public class EmfRegistryManager {
protected static EmfRegistryManager instance = null;
protected HashMap<String, List<EPackage>> managedMetamodels = new HashMap<String, List<EPackage>>();
public static EmfRegistryManager getInstance() {
if (instance == null) {
instance = new EmfRegistryManager();
}
return instance;
}
private EmfRegistryManager() {
for (String metamodel : getMetamodels()) {
try {
registerMetamodel(metamodel);
} catch (Exception ex) {
LogUtil.log(ex);
}
}
initChangeListener();
}
protected void initChangeListener() {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IResourceChangeListener listener = new IResourceChangeListener() {
public void resourceChanged(IResourceChangeEvent event) {
// we are only interested in POST_CHANGE events
if (event.getType() != IResourceChangeEvent.POST_CHANGE)
return;
IResourceDelta rootDelta = event.getDelta();
// get the delta, if any, for the documentation directory
// IResourceDelta docDelta = rootDelta.findMember(DOC_PATH);
// if (docDelta == null)
// return;
final ArrayList<IResourceDelta> changed = new ArrayList<IResourceDelta>();
IResourceDeltaVisitor visitor = new IResourceDeltaVisitor() {
public boolean visit(IResourceDelta delta) {
// only interested in changed resources (not added or
// removed)
/*
* if (delta.getKind() != IResourceDelta.CHANGED) return true; //only interested
* in content changes if ((delta.getFlags() & IResourceDelta.CONTENT) == 0)
* return true; IResource resource = delta.getResource(); //only interested in
* files with the "txt" extension if (resource.getType() == IResource.FILE &&
* "txt".equalsIgnoreCase(resource.getFileExtension())) { changed.add(resource);
* }
*/
changed.add(delta);
return true;
}
};
try {
rootDelta.accept(visitor);
} catch (CoreException e) {
e.printStackTrace();
}
if (changed.size() == 0)
return;
for (IResourceDelta delta : changed) {
String metamodel = delta.getResource().getFullPath().toOSString();
List<String> metamodels = getMetamodels();
if (metamodels.contains(metamodel)) {
if (delta.getKind() == IResourceDelta.REMOVED) {
removeMetamodel(metamodel);
if (delta.getMovedToPath() != null) {
try {
addMetamodel(delta.getMovedToPath().toOSString());
} catch (Exception e) {
LogUtil.log(e);
}
}
} else {
try {
registerMetamodel(metamodel);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
}
};
workspace.addResourceChangeListener(listener);
}
public void addMetamodel(String fileName) throws Exception {
registerMetamodel(fileName);
List<String> metamodels = getMetamodels();
if (!metamodels.contains(fileName)) {
metamodels.add(fileName);
setMetamodels(metamodels);
}
}
private void registerMetamodel(String fileName) throws Exception {
List<EPackage> ePackages;
if (fileName.endsWith(".ecore")) {
ePackages = EmfUtil.register(URI.createPlatformResourceURI(fileName, true), EPackage.Registry.INSTANCE);
} else { // Must be xcore
ePackages = EmfUtil.registerXcore(URI.createPlatformResourceURI(fileName, true), EPackage.Registry.INSTANCE, false);
}
managedMetamodels.put(fileName, ePackages);
}
public void removeMetamodel(String fileName) {
List<EPackage> ePackages = managedMetamodels.get(fileName);
if (ePackages == null)
return;
for (EPackage ePackage : ePackages) {
EPackage.Registry.INSTANCE.remove(ePackage.getNsURI());
}
managedMetamodels.remove(fileName);
List<String> metamodels = getMetamodels();
metamodels.remove(fileName);
setMetamodels(metamodels);
}
public List<String> getMetamodels() {
List<String> metamodels = new ArrayList<String>();
String concat = EmfUtilPlugin.getDefault().getPreferenceStore().getString("metamodels");
StringTokenizer st = new StringTokenizer(concat, ";");
while (st.hasMoreTokens()) {
metamodels.add(st.nextToken());
}
return metamodels;
}
private void setMetamodels(List<String> metamodels) {
StringBuffer sb = new StringBuffer();
ListIterator<String> li = metamodels.listIterator();
while (li.hasNext()) {
sb.append(li.next());
if (li.hasNext()) {
sb.append(";");
}
}
EmfUtilPlugin.getDefault().getPreferenceStore().setValue("metamodels", sb.toString());
}
}