org.eclipse.zest.dot.internal.ZestBuilder.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.zest.dot.internal.ZestBuilder.java

Source

/*******************************************************************************
 * Copyright (c) 2009 Fabian Steeg. 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
 * <p/>
 * Contributors: Fabian Steeg - initial API and implementation; see bug 277380
 *******************************************************************************/
package org.eclipse.zest.dot.internal;

import java.util.List;
import java.util.Map;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
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.IResourceVisitor;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.zest.dot.DotImport;

/**
 * Zest project builder. Imports the DOT files in a dedicated folder
 * ('templates') to Zest graph in a source folder. These can be run to view the
 * Graph. Effectively this implements a basic Zest authoring environment using
 * DOT as a DSL, as upon saving the DOT file, the same Zest application can be
 * relaunched, showing the Zest graph created from the changed DOT file.
 * @author Fabian Steeg (fsteeg)
 */
public final class ZestBuilder extends IncrementalProjectBuilder {

    static final String BUILDER_ID = "org.eclipse.zest.dot.ui.builder";
    private static final String MARKER_TYPE = "org.eclipse.zest.dot.ui.problem";

    private class SampleDeltaVisitor implements IResourceDeltaVisitor {
        /**
         * {@inheritDoc}
         * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
         */
        public boolean visit(final IResourceDelta delta) {
            IResource resource = delta.getResource();
            switch (delta.getKind()) {
            case IResourceDelta.ADDED:
                checkDotFile(resource);
                break;
            case IResourceDelta.REMOVED:
                break;
            case IResourceDelta.CHANGED:
                checkDotFile(resource);
                break;
            default:
                break;
            }
            // return true to continue visiting children.
            return true;
        }
    }

    private class SampleResourceVisitor implements IResourceVisitor {
        public boolean visit(final IResource resource) {
            checkDotFile(resource);
            // return true to continue visiting children.
            return true;
        }
    }

    /**
     * {@inheritDoc}
     * @see org.eclipse.core.resources.IncrementalProjectBuilder#build(int,
     *      java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
     */
    @SuppressWarnings("unchecked")
    // raw type required by API
    protected IProject[] build(final int kind, final Map args, final 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 checkDotFile(final IResource resource) {
        if (resource instanceof IFile && resource.getFileExtension().equals("dot")) {
            IFile dotFile = (IFile) resource;
            deleteMarkers(dotFile);
            List<String> errors = new DotImport(dotFile).getErrors();
            /*
             * If parsing the current DOT file causes errors, we add warning
             * markers:
             */
            if (errors.size() > 0) {
                addMarker(dotFile, errors.get(0), 1, IMarker.SEVERITY_WARNING);
            } else {
                /*
                 * If the DOT can be parsed, we import it into the package in
                 * the src-gen folder:
                 */
                importToGeneratedSourceFolder(dotFile);
            }
        }
    }

    private void importToGeneratedSourceFolder(final IFile dotFile) {
        try {
            IJavaProject javaProject = JavaCore.create(dotFile.getProject());
            String sourceGenPath = "/" + javaProject.getElementName() + "/" + ZestProjectWizard.SRC_GEN;
            IPackageFragmentRoot packageRoot = javaProject.findPackageFragmentRoot(new Path(sourceGenPath));
            IPackageFragment targetPackage = packageRoot.getPackageFragment(ZestProjectWizard.PACKAGE);
            IResource targetFolder = targetPackage.getCorrespondingResource();
            new DotImport(dotFile).newGraphSubclass((IContainer) targetFolder);
            targetFolder.refreshLocal(1, null);
        } catch (CoreException e) {
            e.printStackTrace();
        }
    }

    private void addMarker(final IFile file, final String message, final int lineNumber, final int severity) {
        try {
            IMarker marker = file.createMarker(MARKER_TYPE);
            marker.setAttribute(IMarker.MESSAGE, message);
            marker.setAttribute(IMarker.SEVERITY, severity);
            marker.setAttribute(IMarker.LINE_NUMBER, lineNumber == -1 ? 1 : lineNumber);
        } catch (CoreException e) {
            e.printStackTrace();
        }
    }

    private void deleteMarkers(final IFile file) {
        try {
            file.deleteMarkers(MARKER_TYPE, false, IResource.DEPTH_ZERO);
        } catch (CoreException e) {
            e.printStackTrace();
        }
    }

    private void fullBuild(final IProgressMonitor monitor) throws CoreException {
        try {
            getProject().accept(new SampleResourceVisitor());
        } catch (CoreException e) {
            e.printStackTrace();
        }
    }

    private void incrementalBuild(final IResourceDelta delta, final IProgressMonitor monitor) throws CoreException {
        delta.accept(new SampleDeltaVisitor());
    }
}