package org.archstudio.myxgen.builder; import java.util.Map; import org.archstudio.myxgen.jet.codegen.MyxCodeGenerator; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDeltaVisitor; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; public class MyxStubBuilder extends IncrementalProjectBuilder { public static final String BUILDER_ID = "org.archstudio.myxgen.myxStubBuilder"; private class MyxStubResourceDeltaVisitor implements IResourceDeltaVisitor { public boolean projectNeedsRebuild = false; protected final IFile pluginFile; public MyxStubResourceDeltaVisitor(IProject project) { pluginFile = getProject().getFile("plugin.xml"); } @Override public boolean visit(IResourceDelta delta) { if (pluginFile == null) { return false; } IResource res = delta.getResource(); if (pluginFile.equals(res)) { projectNeedsRebuild = true; return false; } return true; } } public MyxStubBuilder() { } @Override protected IProject[] build(int kind, @SuppressWarnings("rawtypes") Map args, IProgressMonitor monitor) throws CoreException { if (kind == FULL_BUILD) { fullBuild(monitor); } else { IResourceDelta delta = getDelta(getProject()); if (delta == null) { fullBuild(monitor); } else { incrementalBuild(delta, monitor); } } return null; } private void incrementalBuild(IResourceDelta delta, IProgressMonitor monitor) throws CoreException { MyxStubResourceDeltaVisitor visitor = new MyxStubResourceDeltaVisitor(getProject()); delta.accept(visitor); if (visitor.projectNeedsRebuild) { fullBuild(monitor); } } private void fullBuild(IProgressMonitor monitor) { IJavaProject javaProject = JavaCore.create(getProject()); if (javaProject != null) { new MyxCodeGenerator(javaProject).generateCode(); needRebuild(); } } }