aQute.bnd.ant.ProjectBuildOrderTask Maven / Gradle / Ivy
The newest version!
package aQute.bnd.ant;
import java.io.File;
import java.util.Collection;
import org.apache.tools.ant.BuildException;
import aQute.bnd.build.Project;
import aQute.bnd.build.Workspace;
/**
* ProjectBuildOrderTask calculates the correct build order for all of the bnd
* projects in a workspace. The bndFile property can be set to calculate the
* build order for a specific project instead of the whole workspace.
*/
public class ProjectBuildOrderTask extends BaseTask {
private static final String PROP_BUILD_ORDER = "buildorder";
private String propertyName = PROP_BUILD_ORDER;
private String separator = ",";
private File workspaceLocation;
private boolean fullpath = false;
private File projectLocation = null;
private String bndFile = Project.BNDFILE;
private boolean delayRunDependencies = true;
@Override
public void execute() throws BuildException {
try {
if (workspaceLocation == null) {
throw new BuildException("The given workspace dir is not set");
}
if (!workspaceLocation.isDirectory()) {
throw new BuildException("The given workspace dir not exist " + workspaceLocation);
}
if (projectLocation != null && bndFile == null) {
throw new BuildException("Attributes projectLocation and bndFile must be used together.");
}
Collection projects;
workspaceLocation = workspaceLocation.getCanonicalFile();
Workspace workspace = Workspace.getWorkspace(workspaceLocation);
if (projectLocation == null) {
// all projects in workspace
try {
for (Project project : workspace.getAllProjects()) {
project.setDelayRunDependencies(this.delayRunDependencies);
}
projects = workspace.getBuildOrder();
} catch (Exception e) {
throw new BuildException(e);
}
} else {
try (Project p = new Project(workspace, projectLocation, new File(projectLocation, bndFile))) {
p.setDelayRunDependencies(this.delayRunDependencies);
projects = p.getDependson();
}
}
StringBuilder sb = new StringBuilder();
String sep = "";
for (Project project : projects) {
sb.append(sep);
if (fullpath) {
sb.append(project.getBase()
.getAbsolutePath());
} else {
sb.append(project.getName());
}
sep = separator;
}
getProject().setProperty(propertyName, sb.toString());
} catch (Exception e) {
throw new BuildException(e);
}
}
/**
* Sets character (or string) separator between projects in resultant ant
* property.
*
* @param separator character (or string) separator
*/
public void setSeparator(String separator) {
this.separator = separator;
}
/**
* Sets Bnd workspace location.
*
* @param workspaceLocation Bnd workspace location.
*/
public void setWorkspaceLocation(File workspaceLocation) {
this.workspaceLocation = workspaceLocation;
}
/**
* Sets whether to use project names or full absolute paths to projects in
* the resultant ant property. Default is project names.
*
* @param fullpath true for full absolete paths to project, false for
* project names.
*/
public void setFullPath(boolean fullpath) {
this.fullpath = fullpath;
}
/**
* Sets the project directory which contains the bndFile. Must be used with
* the bndFile parameter. Default is unset (null), which instructions
* ProjectBuildOrderTask to acquire the build order for the entire workspace
*
* @param projectLocation Bnd project directory
*/
public void setProjectDir(File projectLocation) {
if (projectLocation != null && projectLocation.isDirectory()) {
this.projectLocation = projectLocation;
} else {
throw new BuildException("Invalid projectDir!");
}
}
/**
* Sets a single bnd file for ProjectBuildOrderTask to acquire the build
* order from. Default is bnd.bnd. Default is unset (null), which
* instructions ProjectBuildOrderTask to acquire the build order for the
* entire workspace
*
* @param bndFileParam bnd file
*/
public void setBndFile(String bndFileParam) {
if (bndFileParam != null && bndFileParam.length() > 0) {
this.bndFile = bndFileParam;
} else {
throw new BuildException("Invalid bndFile parameter!");
}
}
/**
* Sets the ant property that will contain the list of projects in build
* order. If not provided, the default ant property name is buildorder.
*
* @param newProperty ant property name
*/
public void setProperty(String newProperty) {
if (newProperty != null && newProperty.length() > 0) {
propertyName = newProperty;
} else {
throw new BuildException("Invalid property property!");
}
}
/**
* Set true to ignore runbundles dependencies. Set false to include
* runbundles dependencies in buildorder.
*
* @param b true/false
*/
public void setDelayRunDependencies(boolean b) {
this.delayRunDependencies = b;
}
}