/** * Copyright (c) 2011 Cloudsmith Inc. and other contributors, as listed below. * 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: * Cloudsmith * */ package org.cloudsmith.geppetto.pp.dsl.ui.builder; import java.util.List; import org.apache.log4j.Logger; import org.cloudsmith.geppetto.pp.dsl.ui.PPUiConstants; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.xtext.ui.editor.preferences.AbstractPreferencePage; import com.google.common.collect.Lists; /** * The PPBuildJob is used when there is a need to rebuild projects (such as after preference changes). * */ public class PPBuildJob extends Job { final private IProject[] projects; final private boolean cleanOnly; private static final Logger log = Logger.getLogger(AbstractPreferencePage.class); public PPBuildJob(IProject... projects) { super("Building Puppet Projects"); this.projects = projects; setPriority(Job.BUILD); this.cleanOnly = false; } public PPBuildJob(IWorkspace workspace) { this(workspace, false); } public PPBuildJob(IWorkspace workspace, boolean cleanOnly) { super("Building Puppet Projects"); this.cleanOnly = cleanOnly; List<IProject> puppetProjects = Lists.newArrayList(); for(IProject p : workspace.getRoot().getProjects()) try { if(!p.isAccessible()) continue; if(p.getNature(PPUiConstants.PUPPET_NATURE_ID) != null) puppetProjects.add(p); } catch(CoreException e) { log.error("Failed to get puppet nature information from project", e); } this.projects = puppetProjects.toArray(new IProject[puppetProjects.size()]); setPriority(Job.BUILD); } @Override protected IStatus run(IProgressMonitor monitor) { final SubMonitor ticker = SubMonitor.convert(monitor, projects.length * 100 * 2); // Clean projects individually (if there are other kinds of projects than puppet, they do not need to be // cleaned. for(IProject p : projects) { try { ticker.setTaskName("Cleaning project " + p.getName()); p.build(IncrementalProjectBuilder.CLEAN_BUILD, ticker.newChild(100)); } catch(CoreException e) { return e.getStatus(); } } if(!cleanOnly) // do a full build try { ticker.setTaskName("Building projects"); ResourcesPlugin.getWorkspace().build( IncrementalProjectBuilder.FULL_BUILD, ticker.newChild(projects.length * 100)); } catch(CoreException e) { return e.getStatus(); } return Status.OK_STATUS; } }