BuildCommand.java

package org.docascode.api;

import org.apache.tools.ant.*;
import org.docascode.api.core.DocAsCodeRepository;

import java.util.*;
import java.util.stream.Collectors;

public class BuildCommand extends DocAsCodeCommand<Project> {
    private List<String> targets = new ArrayList<>();

    public BuildCommand setTargets(List<String> targets) {
        this.targets = targets;
        return this;
    }

    private Map<String,String> properties = new HashMap<>();

    public BuildCommand setProperties(Map<String,String> properties) {
        if( properties !=null){
            this.properties = properties;
        }
        return this;
    }

    BuildCommand(DocAsCodeRepository repo) {
        super(repo);
    }

    private Project project = new Project();
    private ProjectHelper projectHelper = ProjectHelper.getProjectHelper();

    private void initProject() {
        project.setUserProperty("ant.file", getRepository().getDeliveryXML().getAbsolutePath());
        for (Map.Entry<String,String> entry : properties.entrySet()){
            project.setUserProperty(entry.getKey(),entry.getValue());
        }
        project.init();
        project.addReference("ant.projectHelper", projectHelper);
        project.setBaseDir(getRepository().getWorkTree());
        projectHelper.parse(project, getRepository().getDeliveryXML());
    }

    private List<BuildListener> loggers = new ArrayList<>();

    public BuildCommand addLogger(BuildListener logger){
        loggers.add(logger);
        return this;
    }

    @Override
    public Project call(){
        initProject();
        for (BuildListener logger : this.loggers) {
            project.addBuildListener(logger);
        }
        if (targets.isEmpty()){
            targets.add(project.getDefaultTarget());
        }
        BuildException be = null;
        try {
            project.fireBuildStarted();
            project.executeTargets(new Vector<>(targets));
        } catch (BuildException ex) {
            be = ex;
            throw be;
        } finally {
            project.fireBuildFinished(be);
        }
        return project;
    }

    public Map<String, Target> listTargets() {
        initProject();
        return removeDuplicateTargets(project.getTargets());
    }

    private static Map<String, Target> removeDuplicateTargets(final Map<String, Target> targets) {
        final Map<Location, Target> locationMap = new HashMap<>();
        targets.forEach((name, target) -> {
            final Target otherTarget = locationMap.get(target.getLocation());
            // Place this entry in the location map if
            //  a) location is not in the map
            //  b) location is in map, but its name is longer
            //     (an imported target will have a name. prefix)
            if (!name.isEmpty() && (otherTarget == null || otherTarget.getName().length() > name.length())) {
                locationMap.put(target.getLocation(), target); // Smallest name wins
            }
        });
        return locationMap.values().stream()
                .collect(Collectors.toMap(Target::getName, target -> target, (a, b) -> b));
    }
}