org.eclipse.buildship.core.configuration.GradleProjectBuilder.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.buildship.core.configuration.GradleProjectBuilder.java

Source

/*
 * Copyright (c) 2015 the original author or authors.
 * 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
 *
 * Contributors:
 *     Etienne Studer & Dont Csiks (Gradle Inc.) - initial API and implementation and initial documentation
 */

package org.eclipse.buildship.core.configuration;

import java.util.Arrays;
import java.util.List;

import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList;

import org.eclipse.core.resources.ICommand;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;

import org.eclipse.buildship.core.CorePlugin;

/**
 * Project builder for Gradle projects.
 */
public final class GradleProjectBuilder {

    // the builder ID has to be in the following format: ${PLUGIN_ID}.${BUILDER_ID}
    public static final String ID = CorePlugin.PLUGIN_ID + ".gradleprojectbuilder";

    /**
     * Configures the builder on the target project if it was not added previously.
     * <p/>
     * This method requires the {@link org.eclipse.core.resources.IWorkspaceRoot} scheduling rule.
     *
     * @param project the target project
     */
    public static void configureOnProject(IProject project) {
        try {
            Preconditions.checkState(project.isOpen());

            // check if the builder is already registered with the project
            IProjectDescription description = project.getDescription();
            List<ICommand> buildSpecs = Arrays.asList(description.getBuildSpec());
            boolean exists = FluentIterable.from(buildSpecs).anyMatch(new Predicate<ICommand>() {

                @Override
                public boolean apply(ICommand command) {
                    return command.getBuilderName().equals(ID);
                }
            });

            // register the builder with the project if it is not already registered
            if (!exists) {
                ICommand buildSpec = description.newCommand();
                buildSpec.setBuilderName(ID);
                ImmutableList<ICommand> newBuildSpecs = ImmutableList.<ICommand>builder().addAll(buildSpecs)
                        .add(buildSpec).build();
                description.setBuildSpec(newBuildSpecs.toArray(new ICommand[newBuildSpecs.size()]));
                project.setDescription(description, new NullProgressMonitor());
            }
        } catch (CoreException e) {
            CorePlugin.logger()
                    .error(String.format("Failed to add Gradle Project Builder to project %s.", project.getName()));
        }
    }

    /**
     * Removes the builder from the target project if it was there before.
     * <p/>
     * This method requires the {@link org.eclipse.core.resources.IWorkspaceRoot} scheduling rule.
     *
     * @param project the target project
     */
    public static void deconfigureOnProject(IProject project) {
        try {
            Preconditions.checkState(project.isOpen());

            // remove the builder if it is registered with the project
            IProjectDescription description = project.getDescription();
            List<ICommand> buildSpecs = Arrays.asList(description.getBuildSpec());
            ICommand[] filteredBuildSpecs = FluentIterable.from(buildSpecs).filter(new Predicate<ICommand>() {

                @Override
                public boolean apply(ICommand command) {
                    return !command.getBuilderName().equals(ID);
                }
            }).toArray(ICommand.class);

            // if the builder was previously registered, unregister the builder form the project
            if (filteredBuildSpecs.length < buildSpecs.size()) {
                description.setBuildSpec(filteredBuildSpecs);
                project.setDescription(description, new NullProgressMonitor());
            }
        } catch (CoreException e) {
            CorePlugin.logger().error(
                    String.format("Failed to remove Gradle Project Builder from project %s.", project.getName()));
        }
    }

    private GradleProjectBuilder() {
    }

}