All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.google.sitebricks.cloud.Mixin Maven / Gradle / Ivy

The newest version!
package com.google.sitebricks.cloud;

import com.google.common.io.CharStreams;
import com.google.sitebricks.cloud.mix.MavenDependency;
import com.google.sitebricks.cloud.mix.Mixes;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Node;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author [email protected] (Dhanji R. Prasanna)
 */
public class Mixin implements Command {
  private static final Logger log = LoggerFactory.getLogger("mixer");

  @Override
  @SuppressWarnings("unchecked")
  public void run(List commands, Config config) throws Exception {
    if (commands.size() < 2) {
      Cloud.quit("Usage: sitebricks mix @mix1 @mix2 ...");
    }

    File pomXml = new File("pom.xml");
    if (!pomXml.exists()) {
      Cloud.quit("Missing pom.xml. cannot proceed.");
    }

    Document document = DocumentHelper.parseText(CharStreams.toString(new FileReader(pomXml)));

    Map properties = new HashMap();
    properties.put("javaVersion", "1.6");
    properties.put("useMavenPaths", false);

    List list = document.selectNodes("/project/groupId");
    properties.put("projectGroup", list.get(0).getText());

    list = document.selectNodes("/project/artifactId");
    properties.put("projectName", list.get(0).getText());

    list = document.selectNodes("/project/version");
    properties.put("projectVersion", list.get(0).getText());

    list = document.selectNodes("/project/packaging");
    properties.put("packaging", list.get(0).getText());

    list = document.selectNodes("/project/build/plugins/plugin");
    if (!list.isEmpty()) {
      for (Node node : list) {
        List plugin = node.selectNodes("artifactId");
        if ("maven-compiler-plugin".equals(plugin.get(0).getText())) {
          plugin = node.selectNodes("configuration/source");
          if (!plugin.isEmpty())
            properties.put("javaVersion", plugin.get(0).getText());
        }
      }
      properties.put("packaging", list.get(0).getText());
    }

    list = document.selectNodes("/project/build/sourceDirectory");
    if (list.isEmpty() || "src/main/java".equals(list.get(0).getText())) {
      properties.put("useMavenPaths", true);
    }

    Set deps = run(commands, properties);

    // Write deps back into the POM if necessary.
    list = document.selectNodes("/project/dependencies/dependency");
    for (Node node : list) {
      MavenDependency existing = new MavenDependency(
          ((Node) node.selectNodes("groupId").get(0)).getText(),
          ((Node) node.selectNodes("artifactId").get(0)).getText(),
          ((Node) node.selectNodes("version").get(0)).getText());
      deps.remove(existing);
    }

    // Then we have new deps to write!
    if (!deps.isEmpty()) {
      for (MavenDependency dep : deps) {
        list.add(DocumentHelper.parseText(dep.toDepString()));
      }

      log.info("updating pom.xml with new deps");
      FileWriter fileWriter = new FileWriter(pomXml);
      fileWriter.write(document.asXML());
      fileWriter.flush();
      fileWriter.close();
    }
  }

  public Set run(List commands, Map properties) throws Exception {
    // Run mixes first.
    Collection mixes = new ArrayList();
    for (String command : commands) {
      if (command.startsWith("@"))
        mixes.add(command);
    }

    if (mixes.isEmpty())
      mixes = Mixes.DEFAULT_MIXES;

    Set deps = new LinkedHashSet();
    for (String mix : mixes) {
      log.info("adding in " + mix);
      Mixes.get(mix).mix(properties, deps);
    }

    return deps;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy