package org.eclipselabs.spray.xtext.ui.internal;
import java.io.IOException;
import java.util.Collections;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
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.IResourceVisitor;
import org.eclipse.core.resources.IWorkspaceRoot;
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.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.xtext.EcoreUtil2;
import com.google.inject.Inject;
class RegisterPlatformGenmodelListener implements IResourceChangeListener {
private static final Log LOG = LogFactory.getLog(RegisterPlatformGenmodelListener.class);
@Inject
MweGenModelHelperExt genModelHelper;
private IResourceDeltaVisitor deltaVisitor = new IResourceDeltaVisitor() {
@Override
public boolean visit(IResourceDelta delta) throws CoreException {
if (delta.getResource() != null && delta.getResource().isAccessible()) {
IResource resource = delta.getResource();
handleResource(resource, delta.getKind());
return true;
} else {
return false;
}
}
};
@Override
public void resourceChanged(IResourceChangeEvent event) {
try {
if (event.getType() == IResourceChangeEvent.POST_CHANGE) {
if (event.getDelta() != null) {
if (event.getDelta().getResource() instanceof IWorkspaceRoot) {
for (IResourceDelta delta : event.getDelta().getAffectedChildren()) {
delta.accept(deltaVisitor);
}
} else {
event.getDelta().accept(deltaVisitor);
}
} else if (event.getResource() != null) {
}
} else if (event.getType() == IResourceChangeEvent.PRE_CLOSE || event.getType() == IResourceChangeEvent.PRE_DELETE) {
event.getResource().accept(new IResourceVisitor() {
@Override
public boolean visit(IResource resource) throws CoreException {
handleResource(resource, IResourceDelta.REMOVED);
return true;
}
});
}
} catch (CoreException e) {
e.printStackTrace();
}
}
public void initWorkspace() throws CoreException {
ResourcesPlugin.getWorkspace().getRoot().accept(new IResourceVisitor() {
@Override
public boolean visit(IResource resource) throws CoreException {
handleResource(resource, IResourceDelta.ADDED);
return true;
}
});
}
protected void handleResource(IResource resource, int deltaKind) {
IFile file = (IFile) resource.getAdapter(IFile.class);
if (file != null && file.getFileExtension().equals("genmodel") && !file.getProjectRelativePath().toPortableString().contains("target")) {
if (deltaKind == IResourceDelta.ADDED) {
registerGenmodel(file);
} else if (deltaKind == IResourceDelta.REMOVED) {
unregisterGenmodel(file);
}
}
if (file != null && file.getFileExtension().equals("ecore") && !file.getProjectRelativePath().toPortableString().contains("target")) {
if (deltaKind == IResourceDelta.ADDED) {
registerEPackage(file);
} else if (deltaKind == IResourceDelta.REMOVED) {
unregisterEPackage(file);
}
}
}
protected void registerGenmodel(IFile file) {
ResourceSet rs = new ResourceSetImpl();
Resource emfResource = rs.createResource(URI.createPlatformResourceURI((file.getFullPath().toPortableString()), true));
try {
emfResource.load(Collections.EMPTY_MAP);
genModelHelper.registerGenModel(emfResource.getResourceSet(), emfResource.getURI());
emfResource.unload();
} catch (IOException e) {
e.printStackTrace();
}
}
protected void unregisterGenmodel(IFile file) {
ResourceSet rs = new ResourceSetImpl();
Resource emfResource = rs.createResource(URI.createPlatformResourceURI((file.getFullPath().toPortableString()), true));
try {
emfResource.load(Collections.EMPTY_MAP);
genModelHelper.unregisterGenModel(emfResource.getResourceSet(), emfResource.getURI());
emfResource.unload();
} catch (IOException e) {
e.printStackTrace();
}
}
private void unregisterEPackage(IFile file) {
ResourceSet rs = new ResourceSetImpl();
Resource emfResource = rs.createResource(URI.createPlatformResourceURI((file.getFullPath().toPortableString()), true));
try {
emfResource.load(Collections.EMPTY_MAP);
EPackage.Registry registry = EPackage.Registry.INSTANCE;
for (EPackage pck : EcoreUtil2.eAllOfType(emfResource.getContents().get(0), EPackage.class)) {
if (registry.remove(pck.getNsURI()) != null) {
LOG.info("Deregistered EPackage " + pck.getNsURI());
}
}
emfResource.unload();
} catch (IOException e) {
e.printStackTrace();
}
}
private void registerEPackage(IFile file) {
ResourceSet rs = new ResourceSetImpl();
Resource emfResource = rs.createResource(URI.createPlatformResourceURI((file.getFullPath().toPortableString()), true));
try {
emfResource.load(Collections.EMPTY_MAP);
EPackage.Registry registry = EPackage.Registry.INSTANCE;
for (EPackage pck : EcoreUtil2.eAllOfType(emfResource.getContents().get(0), EPackage.class)) {
if (!registry.containsKey(pck.getNsURI())) {
registry.put(pck.getNsURI(), pck);
LOG.info("Registered EPackage " + pck.getNsURI());
}
}
emfResource.unload();
} catch (IOException e) {
e.printStackTrace();
}
}
}