package org.eclipselabs.spray.xtext.ui.internal;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
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.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
/**
* When a .properties file changes that is in the same folder with the same name as a .spray file,
* trigger the XtextBuilder.
*/
class SprayResourceChangeBuildInvoker implements IResourceChangeListener {
/**
*
*/
private final SprayActivator sprayActivator;
/**
* @param sprayActivator
*/
SprayResourceChangeBuildInvoker(SprayActivator sprayActivator) {
this.sprayActivator = sprayActivator;
}
@Override
public void resourceChanged(IResourceChangeEvent event) {
if (event.getType() == IResourceChangeEvent.POST_BUILD)
return;
if (event.getDelta() == null)
return;
try {
event.getDelta().accept(new IResourceDeltaVisitor() {
boolean traverse = true;
@Override
public boolean visit(IResourceDelta delta) throws CoreException {
if (!traverse)
return false;
IFile file = delta.getResource() instanceof IFile ? (IFile) delta.getResource() : null;
if (file != null && file.exists() && file.getFileExtension().equals("properties")) {
IPath sprayPath = file.getFullPath().removeFileExtension().addFileExtension("spray");
IFile sprayFile = ResourcesPlugin.getWorkspace().getRoot().getFile(sprayPath);
if (sprayFile.exists()) {
traverse = false; // found it, do not traverse further
triggerBuild(sprayFile);
}
return false;
}
return true;
}
});
} catch (CoreException e) {
this.sprayActivator.getLog().log(new Status(IStatus.ERROR, this.sprayActivator.getBundle().getSymbolicName(), e.getMessage(), e));
}
}
private void triggerBuild(final IFile sprayFile) {
new Job("Generating Spray Code") {
@Override
protected IStatus run(IProgressMonitor monitor) {
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(sprayFile.getFullPath().segment(0));
try {
// TODO: Use constant for nature ID
if (project.hasNature("org.eclipse.xtext.ui.shared.xtextNature")) {
sprayFile.touch(new NullProgressMonitor()); // this triggers the Xtext Builder
}
return Status.OK_STATUS;
} catch (CoreException e) {
return new Status(IStatus.ERROR, SprayResourceChangeBuildInvoker.this.sprayActivator.getBundle().getSymbolicName(), e.getMessage(), e);
}
}
}.schedule();
}
}