BuildCommand.java

  1. package org.docascode.api;

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

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

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

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

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

  13.     public BuildCommand setProperties(Map<String,String> properties) {
  14.         if( properties !=null){
  15.             this.properties = properties;
  16.         }
  17.         return this;
  18.     }

  19.     BuildCommand(DocAsCodeRepository repo) {
  20.         super(repo);
  21.     }

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

  24.     private void initProject() {
  25.         project.setUserProperty("ant.file", getRepository().getDeliveryXML().getAbsolutePath());
  26.         for (Map.Entry<String,String> entry : properties.entrySet()){
  27.             project.setUserProperty(entry.getKey(),entry.getValue());
  28.         }
  29.         project.init();
  30.         project.addReference("ant.projectHelper", projectHelper);
  31.         project.setBaseDir(getRepository().getWorkTree());
  32.         projectHelper.parse(project, getRepository().getDeliveryXML());
  33.     }

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

  35.     public BuildCommand addLogger(BuildListener logger){
  36.         loggers.add(logger);
  37.         return this;
  38.     }

  39.     @Override
  40.     public Project call(){
  41.         initProject();
  42.         for (BuildListener logger : this.loggers) {
  43.             project.addBuildListener(logger);
  44.         }
  45.         if (targets.isEmpty()){
  46.             targets.add(project.getDefaultTarget());
  47.         }
  48.         BuildException be = null;
  49.         try {
  50.             project.fireBuildStarted();
  51.             project.executeTargets(new Vector<>(targets));
  52.         } catch (BuildException ex) {
  53.             be = ex;
  54.             throw be;
  55.         } finally {
  56.             project.fireBuildFinished(be);
  57.         }
  58.         return project;
  59.     }

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

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