PageRenderTime 27ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/opup/src/main/scala/com/atlassian/labs/opup/platform/GetPlatformArtifacts.scala

https://bitbucket.org/jwalton/opup
Scala | 155 lines | 121 code | 34 blank | 0 comment | 12 complexity | 2c9246baf709e80570618c3128c9b8d6 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. package com.atlassian.labs.opup.platform;
  2. import java.io.File;
  3. import java.io.FileReader;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.Reader;
  7. import java.util.HashMap;
  8. import java.util.HashSet;
  9. import java.util.Map;
  10. import java.util.Set;
  11. import javax.xml.parsers.DocumentBuilder;
  12. import javax.xml.parsers.DocumentBuilderFactory;
  13. import javax.xml.parsers.ParserConfigurationException;
  14. import javax.xml.transform.Transformer;
  15. import javax.xml.transform.TransformerException;
  16. import javax.xml.transform.TransformerFactory;
  17. import javax.xml.transform.TransformerFactoryConfigurationError;
  18. import javax.xml.transform.dom.DOMSource;
  19. import javax.xml.transform.stream.StreamResult;
  20. import com.atlassian.labs.opup.HttpCache;
  21. import org.apache.commons.io.IOUtils;
  22. import org.apache.maven.artifact.versioning.ArtifactVersion;
  23. import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
  24. import org.w3c.dom.Element;
  25. import scala.collection.JavaConverters._
  26. object GetPlatformArtifacts
  27. {
  28. val MAVEN_NS = "http://maven.apache.org/POM/4.0.0"
  29. def getPlatformDepsFrom(cache: HttpCache, version: String): Set[String] =
  30. {
  31. val pomInput = getPomForPlatformVersion(cache, version);
  32. return(getPlatformDepsFrom(getPlatformDepsAsTextFile(pomInput)))
  33. }
  34. def getPlatformDepsFrom(in: InputStream): Set[String] = getPlatformDepsFrom(getPlatformDepsAsTextFile(in))
  35. def getPlatformDepsFrom(f: File): Set[String] =
  36. {
  37. val r = new FileReader(f);
  38. try
  39. {
  40. return parseDeps(r);
  41. }
  42. finally
  43. {
  44. r.close();
  45. }
  46. }
  47. def getPomForPlatformVersion(cache: HttpCache, version: String): InputStream =
  48. {
  49. val pomUrl = "https://packages.atlassian.com/maven/public/com/atlassian/platform/platform-poms/" + version + "/platform-poms-" + version + ".pom"
  50. return cache.get(pomUrl)
  51. }
  52. def getPlatformDepsAsTextFile(in: InputStream): File =
  53. {
  54. val dbf = DocumentBuilderFactory.newInstance();
  55. dbf.setNamespaceAware(true);
  56. val db = dbf.newDocumentBuilder();
  57. val doc = db.parse(in);
  58. val elems = doc.getElementsByTagNameNS(MAVEN_NS, "dependencyManagement");
  59. if (elems.getLength() != 1)
  60. {
  61. throw new RuntimeException("Unexpected platform pom structure. dependencyManagement: " + elems.getLength());
  62. }
  63. val depElems = elems.item(0).asInstanceOf[Element].getElementsByTagNameNS(MAVEN_NS, "dependencies");
  64. if (depElems.getLength() != 1)
  65. {
  66. throw new RuntimeException("Unexpected platform pom structure. dependencies: " + depElems.getLength());
  67. }
  68. doc.getDocumentElement().appendChild(depElems.item(0));
  69. val t = TransformerFactory.newInstance().newTransformer();
  70. val f = File.createTempFile("temp-pom", ".xml");
  71. f.deleteOnExit();
  72. t.transform(new DOMSource(doc), new StreamResult(f));
  73. val f2 = File.createTempFile("dependency-output", ".txt");
  74. f2.deleteOnExit();
  75. val cmd = Array(
  76. "mvn", "-f", f.getPath(), "dependency:resolve", "-DoutputFile=" + f2.getPath(), "-q"
  77. )
  78. val p = Runtime.getRuntime().exec(cmd);
  79. if (p.waitFor() == 0)
  80. {
  81. return f2;
  82. }
  83. else
  84. {
  85. throw new RuntimeException("Maven invocation failed.");
  86. }
  87. }
  88. def parseDeps(in: Reader): Set[String] =
  89. {
  90. val result = new HashSet[String]();
  91. for (s <- IOUtils.readLines(in).asScala)
  92. {
  93. if (s.startsWith(" "))
  94. {
  95. val i = s.lastIndexOf(':');
  96. if (i >= 0)
  97. {
  98. result.add(s.substring(0, i).trim());
  99. }
  100. }
  101. }
  102. return result;
  103. }
  104. def getUpgradeTargetFrom(cache: HttpCache, version: String): Map[String, ArtifactVersion] =
  105. upgradeTargetFrom(getPlatformDepsFrom(cache, version))
  106. def upgradeTargetFrom(deps: java.lang.Iterable[String]): Map[String, ArtifactVersion] =
  107. {
  108. val m = new HashMap[String, ArtifactVersion]();
  109. for (s <- deps.asScala)
  110. {
  111. val i = s.lastIndexOf(':');
  112. val j = s.lastIndexOf(':', i - 1);
  113. if (i < 0 || j < 0)
  114. {
  115. throw new IllegalArgumentException("Bad platform dependency: " + s);
  116. }
  117. m.put(s.substring(0, j), new DefaultArtifactVersion(s.substring(i + 1)));
  118. }
  119. return m;
  120. }
  121. }