/* * #%~ * org.overture.ide.core * %% * Copyright (C) 2008 - 2014 Overture * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #~% */ package org.overture.ide.core.builder; import java.util.Map; 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.overture.ide.core.VdmCore; import org.overture.ide.core.resources.IVdmProject; public abstract class VdmCoreBuilder extends IncrementalProjectBuilder { private class DeltaFileVisitor implements IResourceDeltaVisitor { private boolean sourceFound = false; public boolean isSourceFound() { return sourceFound; } public boolean visit(IResourceDelta delta) throws CoreException { IResource resource = delta.getResource(); if (resource instanceof IFile && resource.exists() && resource.isSynchronized(IResource.DEPTH_ZERO) && ((IFile) resource).getContentDescription()!=null) { if (getVdmProject().isModelFile((IFile) resource)) { sourceFound = true; return false;// do not visit children } } return true; } } @Override protected final IProject[] build(int kind, @SuppressWarnings("rawtypes") Map args, IProgressMonitor monitor) throws CoreException { if (!validateProject()) { // Project who invoked the builder is not supported return new IProject[0]; } getProject().refreshLocal(IResource.DEPTH_INFINITE, monitor); if (kind == IncrementalProjectBuilder.FULL_BUILD) { initialize(); clean(monitor); build(monitor); } else { IResourceDelta delta = getDelta(getProject()); // if (delta == null) DeltaFileVisitor visitor = new DeltaFileVisitor(); delta.accept(visitor, IResourceDelta.ADDED | IResourceDelta.CHANGED); // { if (visitor.isSourceFound()) { initialize(); build(monitor); } // } else // { // incrementalBuild(delta, monitor); // } } endBuild(monitor); return new IProject[]{getProject()}; } public abstract void initialize(); // private void incrementalBuild(IResourceDelta delta, IProgressMonitor monitor) // { // System.out.println("incremental build on " + delta); // try // { // delta.accept(new IResourceDeltaVisitor() { // public boolean visit(IResourceDelta delta) // { // System.out.println("changed: " // + delta.getResource().getRawLocation()); // return true; // visit children too // } // }); // } catch (CoreException e) // { // e.printStackTrace(); // } // } public abstract void build(IProgressMonitor monitor) throws CoreException; public abstract void endBuild(IProgressMonitor monitor); /*** * This method sync the project resources. It is called before an instance of the AbstractBuilder is created */ public void syncProjectResources() { if (!getProject().isSynchronized(IResource.DEPTH_INFINITE)) try { getProject().refreshLocal(IResource.DEPTH_INFINITE, null); } catch (CoreException e) { VdmCore.log("VdmCoreBuilder:syncProjectResources", e); } } /*** * Validated that the project who invoked the builder is a supported VDM project */ protected boolean validateProject() { return getProject().getAdapter(IVdmProject.class) != null; } /*** * This method should be used instead of the getProject */ public final IVdmProject getVdmProject() { return (IVdmProject) getProject().getAdapter(IVdmProject.class); } }