/annotations-maven-plugin/src/main/java/com/atlassian/annotations/AbstractAnnotationsMojo.java

https://bitbucket.org/atlassian/atlassian-annotations · Java · 202 lines · 133 code · 30 blank · 39 comment · 13 complexity · b3bc8b3742128ae882b53b82abdbc9f9 MD5 · raw file

  1. package com.atlassian.annotations;
  2. import com.google.common.base.Function;
  3. import com.google.common.base.Predicate;
  4. import com.google.common.collect.Collections2;
  5. import com.google.common.collect.Sets;
  6. import org.apache.maven.artifact.Artifact;
  7. import org.apache.maven.artifact.factory.ArtifactFactory;
  8. import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
  9. import org.apache.maven.artifact.repository.ArtifactRepository;
  10. import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
  11. import org.apache.maven.artifact.resolver.ArtifactResolutionException;
  12. import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
  13. import org.apache.maven.artifact.resolver.ArtifactResolver;
  14. import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
  15. import org.apache.maven.plugin.AbstractMojo;
  16. import org.apache.maven.plugin.MojoExecutionException;
  17. import org.apache.maven.project.InvalidProjectModelException;
  18. import org.apache.maven.project.MavenProject;
  19. import org.apache.maven.project.MavenProjectBuilder;
  20. import org.apache.maven.project.ProjectBuildingException;
  21. import java.io.IOException;
  22. import java.net.MalformedURLException;
  23. import java.net.URL;
  24. import java.util.Collection;
  25. import java.util.HashSet;
  26. import java.util.List;
  27. import java.util.Set;
  28. public abstract class AbstractAnnotationsMojo extends AbstractMojo {
  29. private static final Function<Artifact, URL> ARTIFACT_TO_URL_FUNCTION = new Function<Artifact, URL>() {
  30. public URL apply(final Artifact artifact) {
  31. try {
  32. return artifact.getFile().toURI().toURL();
  33. } catch (MalformedURLException e) {
  34. throw new RuntimeException(e);
  35. }
  36. }
  37. };
  38. private static final Predicate<Artifact> ARTIFACT_MUST_EXIST_PREDICATE = new Predicate<Artifact>() {
  39. public boolean apply(final Artifact input) {
  40. return input.getFile() != null && input.getFile().exists();
  41. }
  42. };
  43. private static final Function<MavenProject, Artifact> PROJECT_TO_ARTIFACT_FUNCTION = new Function<MavenProject, Artifact>() {
  44. public Artifact apply(final MavenProject input) {
  45. return input.getArtifact();
  46. }
  47. };
  48. /**
  49. * @parameter expression="${project}"
  50. * @required
  51. */
  52. protected MavenProject project;
  53. /**
  54. * @component
  55. */
  56. protected ArtifactFactory artifactFactory;
  57. /**
  58. * All projects listed in the reactor
  59. *
  60. * @parameter expression="${reactorProjects}"
  61. * @required
  62. */
  63. protected List<MavenProject> reactorProjects;
  64. /**
  65. * @component
  66. */
  67. protected MavenProjectBuilder projectBuilder;
  68. /**
  69. * @component
  70. */
  71. protected ArtifactResolver resolver;
  72. /**
  73. * @parameter default-value="${localRepository}"
  74. * @required
  75. * @readonly
  76. */
  77. protected ArtifactRepository localRepository;
  78. /**
  79. * @parameter default-value="${project.remoteArtifactRepositories}"
  80. * @required
  81. * @readonly
  82. */
  83. protected List remoteRepositories;
  84. /**
  85. * @component
  86. */
  87. protected ArtifactMetadataSource metadataSource;
  88. protected PublicApiAnalyser getPublicApiAnalyser() throws MojoExecutionException {
  89. final Set<URL> urlsToReactorProjects = getArtifactsFromReactorAsURLs();
  90. final Set<URL> classPathUrls = getAllDependenciesAsURLs();
  91. PublicApiAnalyser publicApiAnalyser;
  92. try {
  93. publicApiAnalyser = new PublicApiAnalyser(urlsToReactorProjects, classPathUrls);
  94. } catch (IOException e) {
  95. throw new MojoExecutionException(e.getMessage(), e);
  96. }
  97. return publicApiAnalyser;
  98. }
  99. private Set<URL> getAllDependenciesAsURLs() throws MojoExecutionException {
  100. return Sets.newHashSet(Collections2.transform(getAllDependencies(), ARTIFACT_TO_URL_FUNCTION));
  101. }
  102. private Set<URL> getArtifactsFromReactorAsURLs() {
  103. return Sets.newHashSet(Collections2.transform(getArtifactsFromReactor(), ARTIFACT_TO_URL_FUNCTION));
  104. }
  105. private Set<Artifact> getAllDependencies() throws MojoExecutionException {
  106. final Set<Artifact> projects = getReactorProjectDependencies();
  107. if (projects == null) {
  108. throw new MojoExecutionException("Could not resolve dependent projects");
  109. }
  110. if (reactorProjects == null || reactorProjects.size() < 1) {
  111. throw new MojoExecutionException("There are no dependent projects left to process.");
  112. }
  113. return projects;
  114. }
  115. protected Set<Artifact> getArtifactsFromReactor() {
  116. return Sets.newHashSet(Collections2.filter(Collections2.transform(reactorProjects, PROJECT_TO_ARTIFACT_FUNCTION), ARTIFACT_MUST_EXIST_PREDICATE));
  117. }
  118. private Collection<Artifact> filterByFileExisting(Set<Artifact> artifacts) {
  119. return Collections2.filter(artifacts, new Predicate<Artifact>() {
  120. public boolean apply(final Artifact input) {
  121. return input.getFile() != null && input.getFile().exists();
  122. }
  123. });
  124. }
  125. private Set<Artifact> getReactorProjectDependencies() throws MojoExecutionException {
  126. Set<Artifact> dependencies = new HashSet();
  127. for (MavenProject mavenProject : reactorProjects) {
  128. Collection<Artifact> projectDependencies = Collections2.filter(mavenProject.getDependencyArtifacts(), new Predicate<Artifact>() {
  129. public boolean apply(final Artifact input) {
  130. return input.getScope().equals("compile");
  131. }
  132. });
  133. if (projectDependencies != null && !projectDependencies.isEmpty()) {
  134. dependencies.addAll(projectDependencies);
  135. }
  136. }
  137. return Sets.newHashSet(Collections2.filter(resolveTransitiveArtifacts(dependencies), ARTIFACT_MUST_EXIST_PREDICATE));
  138. }
  139. /*
  140. * Resolves transitive dependencies for a set of given artifacts
  141. * Returns a Set of all artifacts resolved
  142. */
  143. private Set<Artifact> resolveTransitiveArtifacts(Set<Artifact> artifacts, ArtifactFilter filter)
  144. throws MojoExecutionException {
  145. try {
  146. ArtifactResolutionResult result = resolver.resolveTransitively(artifacts, project.getArtifact(),
  147. localRepository, remoteRepositories, metadataSource, filter);
  148. return result.getArtifacts();
  149. } catch (ArtifactResolutionException e) {
  150. throw new MojoExecutionException(e.getMessage(), e);
  151. } catch (ArtifactNotFoundException e) {
  152. throw new MojoExecutionException(e.getMessage(), e);
  153. }
  154. }
  155. private Set<Artifact> resolveTransitiveArtifacts(Set<Artifact> artifacts) throws MojoExecutionException {
  156. return resolveTransitiveArtifacts(artifacts, null);
  157. }
  158. /*
  159. * Returns the MavenProject for a given Artifact
  160. */
  161. private MavenProject getProjectForArtifact(Artifact artifact)
  162. throws MojoExecutionException {
  163. try {
  164. return projectBuilder.buildFromRepository(artifact, remoteRepositories, localRepository);
  165. } catch (InvalidProjectModelException e) {
  166. getLog().error("Validation Errors: " + e.getValidationResult().getMessages());
  167. throw new MojoExecutionException(e.getMessage(), e);
  168. } catch (ProjectBuildingException e) {
  169. throw new MojoExecutionException(e.getMessage(), e);
  170. }
  171. }
  172. }