blob: 72a854c1dab65445c832850953f5bb63435ca092 [file] [log] [blame]
/***************************************************************************************************
* Copyright (c) 2005 Eteration A.S. and others. 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
* https://www.eclipse.org/legal/epl-2.0/
*
* Contributors: Eteration A.S. - initial API and implementation
**************************************************************************************************/
package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet;
import org.eclipse.core.resources.ICommand;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
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.jobs.Job;
public class XDocletBuildUtility {
public static final Object FAMILY_MANUAL_BUILD = new Object();
private static final String XDOCLETBUILDER = "org.eclipse.jst.j2ee.ejb.annotations.xdoclet.xdocletbuilder";
class BuildJob extends Job {
private final IProject fProject;
ICommand xdocletBuilder;
private BuildJob(String name, IProject project) {
super(name);
fProject = project;
xdocletBuilder = getXDocletBuilder(project);
}
public boolean isCoveredBy(IProject aProject) {
return fProject != null && fProject.equals(aProject);
}
public boolean belongsTo(Object family) {
return family == XDocletBuildUtility.FAMILY_MANUAL_BUILD;
}
protected IStatus run(IProgressMonitor monitor) {
if (xdocletBuilder != null) {
try {
fProject.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, monitor);
} catch (CoreException e) {
Logger.logException(e);
return Status.CANCEL_STATUS;
}
}
return Status.OK_STATUS;
}
protected ICommand getXDocletBuilder(IProject aProject) {
IProjectDescription description;
try {
description = aProject.getDescription();
if (description == null) {
return null;
}
ICommand[] commands = description.getBuildSpec();
for (int i = 0; i < commands.length; ++i) {
if (commands[i].getBuilderName().equals(XDOCLETBUILDER)) {
return commands[i];
}
}
} catch (CoreException e) {
Logger.logException(e);
}
return null;
}
}
public static void runNecessaryBuilders(IProgressMonitor monitor, IProject project) throws CoreException {
if (project != null)
runNecessaryBuildersForProject(project, monitor);
else {
IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
for (int i = 0; i < projects.length; i++) {
runNecessaryBuildersForProject(projects[i], monitor);
}
}
}
private static void runNecessaryBuildersForProject(IProject aProject, IProgressMonitor monitor) throws CoreException {
Job[] buildJobs = Job.getJobManager().find(FAMILY_MANUAL_BUILD);
for (int i = 0; i < buildJobs.length; i++) {
Job curr = buildJobs[i];
if (curr instanceof BuildJob) {
BuildJob job = (BuildJob) curr;
if (job.isCoveredBy(aProject)) {
curr.cancel(); // cancel all other build jobs of our kind
}
}
}
XDocletBuildUtility buildUtility = new XDocletBuildUtility();
XDocletBuildUtility.BuildJob buildJob = buildUtility.new BuildJob("XDoclet Build", aProject);
buildJob.schedule(1000L);
}
protected ICommand getXDocletBuilder(IProjectDescription description) throws CoreException {
if (description == null) {
return null;
}
ICommand[] commands = description.getBuildSpec();
for (int i = 0; i < commands.length; ++i) {
if (commands[i].getBuilderName().equals(XDOCLETBUILDER)) {
return commands[i];
}
}
return null;
}
}