001 /*
002 * Sonar, open source software quality management tool.
003 * Copyright (C) 2008-2011 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * Sonar is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * Sonar is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public
017 * License along with Sonar; if not, write to the Free Software
018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
019 */
020 package org.sonar.maven;
021
022 import org.apache.maven.artifact.factory.ArtifactFactory;
023 import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
024 import org.apache.maven.artifact.repository.ArtifactRepository;
025 import org.apache.maven.artifact.resolver.ArtifactCollector;
026 import org.apache.maven.execution.MavenSession;
027 import org.apache.maven.execution.RuntimeInformation;
028 import org.apache.maven.lifecycle.LifecycleExecutor;
029 import org.apache.maven.plugin.AbstractMojo;
030 import org.apache.maven.plugin.MojoExecutionException;
031 import org.apache.maven.plugin.MojoFailureException;
032 import org.apache.maven.plugin.PluginManager;
033 import org.apache.maven.project.MavenProject;
034 import org.apache.maven.project.MavenProjectBuilder;
035 import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
036 import org.sonar.api.batch.bootstrap.ProjectDefinition;
037 import org.sonar.api.batch.bootstrap.ProjectReactor;
038 import org.sonar.batch.Batch;
039 import org.sonar.batch.MavenProjectConverter;
040 import org.sonar.batch.bootstrapper.EnvironmentInformation;
041 import org.sonar.core.config.Logback;
042
043 /**
044 * @goal sonar
045 * @aggregator
046 * @requiresDependencyResolution test
047 */
048 public final class SonarMojo extends AbstractMojo {
049
050 /**
051 * @parameter expression="${session}"
052 * @required
053 * @readonly
054 */
055 private MavenSession session;
056
057 /**
058 * @parameter expression="${project}"
059 * @required
060 * @readonly
061 */
062 private MavenProject project;
063
064 /**
065 * @component
066 * @required
067 */
068 private LifecycleExecutor lifecycleExecutor;
069
070 /**
071 * @component
072 * @required
073 */
074 private PluginManager pluginManager;
075
076 /**
077 * The artifact factory to use.
078 *
079 * @component
080 * @required
081 * @readonly
082 */
083 private ArtifactFactory artifactFactory;
084
085 /**
086 * The artifact repository to use.
087 *
088 * @parameter expression="${localRepository}"
089 * @required
090 * @readonly
091 */
092 private ArtifactRepository localRepository;
093
094 /**
095 * The artifact metadata source to use.
096 *
097 * @component
098 * @required
099 * @readonly
100 */
101 private ArtifactMetadataSource artifactMetadataSource;
102
103 /**
104 * The artifact collector to use.
105 *
106 * @component
107 * @required
108 * @readonly
109 */
110 private ArtifactCollector artifactCollector;
111
112 /**
113 * The dependency tree builder to use.
114 *
115 * @component
116 * @required
117 * @readonly
118 */
119 private DependencyTreeBuilder dependencyTreeBuilder;
120
121 /**
122 * @component
123 * @required
124 * @readonly
125 */
126 private MavenProjectBuilder projectBuilder;
127
128 /**
129 * @component
130 * @required
131 * @readonly
132 */
133 private RuntimeInformation runtimeInformation;
134
135 /**
136 * @parameter expression="${sonar.verbose}" default-value="false"
137 */
138 private boolean verbose;
139
140 public void execute() throws MojoExecutionException, MojoFailureException {
141 configureLogback();
142 executeBatch();
143 }
144
145 private void executeBatch() throws MojoExecutionException {
146 ProjectDefinition def = MavenProjectConverter.convert(session.getSortedProjects(), project);
147 ProjectReactor reactor = new ProjectReactor(def);
148
149 Batch batch = new Batch(reactor, session, getLog(), lifecycleExecutor, pluginManager, artifactFactory,
150 localRepository, artifactMetadataSource, artifactCollector, dependencyTreeBuilder,
151 projectBuilder, getEnvironmentInformation(), Maven2PluginExecutor.class);
152 batch.execute();
153 }
154
155 private EnvironmentInformation getEnvironmentInformation() {
156 String mavenVersion = runtimeInformation.getApplicationVersion().toString();
157 return new EnvironmentInformation("Maven", mavenVersion);
158 }
159
160 private void configureLogback() {
161 boolean debugMode = (verbose || getLog().isDebugEnabled());
162
163 // this system property is required by the logback configuration
164 System.setProperty("ROOT_LOGGER_LEVEL", debugMode ? "DEBUG" : "INFO");
165 Logback.configure("/org/sonar/maven/logback.xml");
166 }
167 }