<?xml version="1.0" encoding="UTF-8"?> | |||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||||
<modelVersion>4.0.0</modelVersion> | |||||
<parent> | |||||
<groupId>org.codehaus.sonar</groupId> | |||||
<artifactId>sonar</artifactId> | |||||
<version>5.2-SNAPSHOT</version> | |||||
<relativePath>../..</relativePath> | |||||
</parent> | |||||
<groupId>org.codehaus.sonar.plugins</groupId> | |||||
<artifactId>sonar-batch-maven-plugin</artifactId> | |||||
<name>SonarQube :: Batch Maven Plugin</name> | |||||
<packaging>sonar-plugin</packaging> | |||||
<description>Inject MavenProject in each module.</description> | |||||
<dependencies> | |||||
<dependency> | |||||
<groupId>com.google.code.findbugs</groupId> | |||||
<artifactId>jsr305</artifactId> | |||||
<scope>provided</scope> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.codehaus.sonar</groupId> | |||||
<artifactId>sonar-plugin-api</artifactId> | |||||
<scope>provided</scope> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.maven</groupId> | |||||
<artifactId>maven-core</artifactId> | |||||
<version>3.0</version> | |||||
<scope>provided</scope> | |||||
</dependency> | |||||
</dependencies> | |||||
<build> | |||||
<plugins> | |||||
<plugin> | |||||
<groupId>org.codehaus.sonar</groupId> | |||||
<artifactId>sonar-packaging-maven-plugin</artifactId> | |||||
<configuration> | |||||
<pluginKey>mavenbatch</pluginKey> | |||||
<pluginName>Maven Batch</pluginName> | |||||
<pluginClass>org.sonar.plugins.batch.maven.MavenBatchPlugin</pluginClass> | |||||
<pluginDescription> | |||||
<![CDATA[Inject MavenProject in each module.]]></pluginDescription> | |||||
</configuration> | |||||
</plugin> | |||||
</plugins> | |||||
</build> | |||||
</project> |
* along with this program; if not, write to the Free Software Foundation, | * along with this program; if not, write to the Free Software Foundation, | ||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||||
*/ | */ | ||||
package org.sonar.plugins.batch.maven; | |||||
/** | |||||
* This package is a part of bootstrap process, so we should take care about backward compatibility. | |||||
*/ | |||||
@ParametersAreNonnullByDefault | |||||
package org.sonar.batch.maven; | |||||
import org.sonar.api.SonarPlugin; | |||||
import java.util.Arrays; | |||||
import java.util.List; | |||||
public class MavenBatchPlugin extends SonarPlugin { | |||||
import javax.annotation.ParametersAreNonnullByDefault; | |||||
@Override | |||||
public List getExtensions() { | |||||
return Arrays.asList(MavenProjectBuilder.class); | |||||
} | |||||
} |
* along with this program; if not, write to the Free Software Foundation, | * along with this program; if not, write to the Free Software Foundation, | ||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||||
*/ | */ | ||||
package org.sonar.batch.maven; | |||||
package org.sonar.plugins.batch.maven; | |||||
import org.apache.maven.execution.MavenSession; | import org.apache.maven.execution.MavenSession; | ||||
import org.apache.maven.project.MavenProject; | import org.apache.maven.project.MavenProject; | ||||
private void setMavenProjectIfApplicable(ProjectDefinition definition) { | private void setMavenProjectIfApplicable(ProjectDefinition definition) { | ||||
if (mavenSession != null) { | if (mavenSession != null) { | ||||
String moduleKey = definition.getKey(); | String moduleKey = definition.getKey(); | ||||
for (MavenProject mavenModule : (List<MavenProject>) mavenSession.getSortedProjects()) { | |||||
for (MavenProject mavenModule : (List<MavenProject>) mavenSession.getProjects()) { | |||||
// FIXME assumption that moduleKey was not modified by user and follow convention <groupId>:<artifactId> | |||||
String mavenModuleKey = mavenModule.getGroupId() + ":" + mavenModule.getArtifactId(); | String mavenModuleKey = mavenModule.getGroupId() + ":" + mavenModule.getArtifactId(); | ||||
if (mavenModuleKey.equals(moduleKey) && !definition.getContainerExtensions().contains(mavenModule)) { | if (mavenModuleKey.equals(moduleKey) && !definition.getContainerExtensions().contains(mavenModule)) { | ||||
definition.addContainerExtension(mavenModule); | definition.addContainerExtension(mavenModule); |
<module>sonar-plugin-api-deps</module> | <module>sonar-plugin-api-deps</module> | ||||
<module>sonar-application</module> | <module>sonar-application</module> | ||||
<module>sonar-batch</module> | <module>sonar-batch</module> | ||||
<module>sonar-batch-maven-compat</module> | |||||
<module>sonar-batch-protocol</module> | <module>sonar-batch-protocol</module> | ||||
<module>sonar-batch-shaded</module> | |||||
<module>sonar-check-api</module> | <module>sonar-check-api</module> | ||||
<module>sonar-colorizer</module> | <module>sonar-colorizer</module> | ||||
<module>sonar-core</module> | <module>sonar-core</module> | ||||
<module>sonar-testing-harness</module> | <module>sonar-testing-harness</module> | ||||
<module>plugins/sonar-email-notifications-plugin</module> | <module>plugins/sonar-email-notifications-plugin</module> | ||||
<module>plugins/sonar-xoo-plugin</module> | <module>plugins/sonar-xoo-plugin</module> | ||||
<module>plugins/sonar-batch-maven-plugin</module> | |||||
</modules> | </modules> | ||||
<organization> | <organization> | ||||
<plugin> | <plugin> | ||||
<groupId>org.apache.maven.plugins</groupId> | <groupId>org.apache.maven.plugins</groupId> | ||||
<artifactId>maven-dependency-plugin</artifactId> | <artifactId>maven-dependency-plugin</artifactId> | ||||
<version>2.9</version> | |||||
<version>2.10</version> | |||||
</plugin> | </plugin> | ||||
<plugin> | <plugin> | ||||
<groupId>org.apache.maven.plugins</groupId> | <groupId>org.apache.maven.plugins</groupId> | ||||
</excludes> | </excludes> | ||||
<searchTransitive>true</searchTransitive> | <searchTransitive>true</searchTransitive> | ||||
</bannedDependencies> | </bannedDependencies> | ||||
<bannedDependencies> | |||||
<!-- See SONAR-2455 --> | |||||
<message>org.codehaus.plexus:plexus-classworlds should be used instead</message> | |||||
<excludes> | |||||
<exclude>classworlds:classworlds</exclude> | |||||
</excludes> | |||||
<searchTransitive>true</searchTransitive> | |||||
</bannedDependencies> | |||||
<requireNoRepositories> | <requireNoRepositories> | ||||
<message>Definition of new repositories is not allowed in order to deploy to central repository. | <message>Definition of new repositories is not allowed in order to deploy to central repository. | ||||
</message> | </message> | ||||
</exclusion> | </exclusion> | ||||
</exclusions> | </exclusions> | ||||
</dependency> | </dependency> | ||||
<dependency> | |||||
<groupId>org.apache.maven</groupId> | |||||
<artifactId>maven-artifact</artifactId> | |||||
<version>2.0.7</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.maven</groupId> | |||||
<artifactId>maven-core</artifactId> | |||||
<version>2.0.7</version> | |||||
</dependency> | |||||
<dependency> | <dependency> | ||||
<groupId>com.ibm.icu</groupId> | <groupId>com.ibm.icu</groupId> | ||||
<artifactId>icu4j</artifactId> | <artifactId>icu4j</artifactId> | ||||
<artifactId>xpp3</artifactId> | <artifactId>xpp3</artifactId> | ||||
<version>1.1.3.3</version> | <version>1.1.3.3</version> | ||||
</dependency> | </dependency> | ||||
<dependency> | |||||
<groupId>org.apache.maven</groupId> | |||||
<artifactId>maven-core</artifactId> | |||||
<version>${maven.api.version}</version> | |||||
<exclusions> | |||||
<exclusion> | |||||
<!-- See SONAR-2455 --> | |||||
<groupId>classworlds</groupId> | |||||
<artifactId>classworlds</artifactId> | |||||
</exclusion> | |||||
</exclusions> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.maven</groupId> | |||||
<artifactId>maven-plugin-api</artifactId> | |||||
<version>${maven.api.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.maven</groupId> | |||||
<artifactId>maven-compat</artifactId> | |||||
<version>${maven.api.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.maven</groupId> | |||||
<artifactId>maven-artifact</artifactId> | |||||
<version>${maven.api.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.maven.shared</groupId> | |||||
<artifactId>maven-dependency-tree</artifactId> | |||||
<version>2.1</version> | |||||
<exclusions> | |||||
<exclusion> | |||||
<!-- See SONAR-2455 --> | |||||
<groupId>classworlds</groupId> | |||||
<artifactId>classworlds</artifactId> | |||||
</exclusion> | |||||
</exclusions> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.maven.shared</groupId> | |||||
<artifactId>maven-common-artifact-filters</artifactId> | |||||
<version>1.4</version> | |||||
</dependency> | |||||
<dependency> | <dependency> | ||||
<groupId>org.jruby</groupId> | <groupId>org.jruby</groupId> | ||||
<artifactId>jruby-complete</artifactId> | <artifactId>jruby-complete</artifactId> |
sonar-batch-maven-compat-4.4.jar|2d7cbec208114970ea419ce963775f68 | |||||
sonar-batch-4.4.jar|2d7cbec208114970ea419ce963775f68 | |||||
sonar-batch-library-2.3.jar|86f577369ec914ae079411803cebc7d2 | sonar-batch-library-2.3.jar|86f577369ec914ae079411803cebc7d2 |
<outputDirectory>lib/common</outputDirectory> | <outputDirectory>lib/common</outputDirectory> | ||||
<useTransitiveFiltering>true</useTransitiveFiltering> | <useTransitiveFiltering>true</useTransitiveFiltering> | ||||
<useProjectArtifact>false</useProjectArtifact> | <useProjectArtifact>false</useProjectArtifact> | ||||
<excludes> | |||||
<exclude>mysql:mysql-connector-java</exclude> | |||||
<exclude>org.postgresql:postgresql</exclude> | |||||
<exclude>net.sourceforge.jtds:jtds</exclude> | |||||
<exclude>tanukisoft:wrapper</exclude> | |||||
<exclude>org.codehaus.sonar:sonar-server</exclude> | |||||
<exclude>org.codehaus.sonar:sonar-web</exclude> | |||||
<exclude>org.codehaus.sonar:sonar-search</exclude> | |||||
<exclude>org.codehaus.sonar.plugins:*</exclude> | |||||
<exclude>org.codehaus.sonar-plugins.java:*</exclude> | |||||
<exclude>org.sonatype.jsw-binaries:jsw-binaries</exclude> | |||||
</excludes> | |||||
<scope>runtime</scope> | <scope>runtime</scope> | ||||
</dependencySet> | </dependencySet> | ||||
<outputDirectory>lib/batch</outputDirectory> | <outputDirectory>lib/batch</outputDirectory> | ||||
<useTransitiveDependencies>false</useTransitiveDependencies> | <useTransitiveDependencies>false</useTransitiveDependencies> | ||||
<includes> | <includes> | ||||
<include>org.codehaus.sonar:sonar-batch-maven-compat</include> | |||||
<include>org.codehaus.sonar:sonar-batch-shaded</include> | |||||
</includes> | </includes> | ||||
<scope>provided</scope> | <scope>provided</scope> | ||||
</dependencySet> | </dependencySet> |
</dependency> | </dependency> | ||||
<dependency> | <dependency> | ||||
<groupId>org.codehaus.sonar</groupId> | <groupId>org.codehaus.sonar</groupId> | ||||
<artifactId>sonar-batch-maven-compat</artifactId> | |||||
<artifactId>sonar-batch-shaded</artifactId> | |||||
<version>${project.version}</version> | <version>${project.version}</version> | ||||
<scope>provided</scope> | <scope>provided</scope> | ||||
</dependency> | </dependency> |
<version>5.2-SNAPSHOT</version> | <version>5.2-SNAPSHOT</version> | ||||
</parent> | </parent> | ||||
<artifactId>sonar-batch-maven-compat</artifactId> | |||||
<name>SonarQube :: Batch Maven Compat</name> | |||||
<description>Compatibility layer, which provides MavenProject for non-Maven environments.</description> | |||||
<artifactId>sonar-batch-shaded</artifactId> | |||||
<name>SonarQube :: Batch Shaded</name> | |||||
<description>All batch dependencies in a single jar</description> | |||||
<dependencies> | <dependencies> | ||||
<dependency> | <dependency> | ||||
<artifactId>sonar-batch</artifactId> | <artifactId>sonar-batch</artifactId> | ||||
<version>${project.version}</version> | <version>${project.version}</version> | ||||
</dependency> | </dependency> | ||||
<dependency> | |||||
<groupId>org.apache.maven</groupId> | |||||
<artifactId>maven-core</artifactId> | |||||
<exclusions> | |||||
<exclusion> | |||||
<groupId>org.codehaus.plexus</groupId> | |||||
<artifactId>plexus-container-default</artifactId> | |||||
</exclusion> | |||||
</exclusions> | |||||
</dependency> | |||||
</dependencies> | </dependencies> | ||||
<build> | <build> |
<groupId>org.slf4j</groupId> | <groupId>org.slf4j</groupId> | ||||
<artifactId>jul-to-slf4j</artifactId> | <artifactId>jul-to-slf4j</artifactId> | ||||
</dependency> | </dependency> | ||||
<dependency> | |||||
<groupId>org.apache.maven</groupId> | |||||
<artifactId>maven-plugin-api</artifactId> | |||||
<scope>provided</scope> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.maven</groupId> | |||||
<artifactId>maven-core</artifactId> | |||||
<scope>provided</scope> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.maven</groupId> | |||||
<artifactId>maven-compat</artifactId> | |||||
<scope>provided</scope> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.maven.shared</groupId> | |||||
<artifactId>maven-dependency-tree</artifactId> | |||||
<scope>provided</scope> | |||||
</dependency> | |||||
<dependency> | <dependency> | ||||
<groupId>commons-lang</groupId> | <groupId>commons-lang</groupId> | ||||
<artifactId>commons-lang</artifactId> | <artifactId>commons-lang</artifactId> |
package org.sonar.batch; | package org.sonar.batch; | ||||
import org.apache.commons.lang.StringUtils; | import org.apache.commons.lang.StringUtils; | ||||
import org.apache.maven.project.MavenProject; | |||||
import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||
import org.sonar.api.batch.BatchSide; | import org.sonar.api.batch.BatchSide; | ||||
public Project create(ProjectDefinition definition) { | public Project create(ProjectDefinition definition) { | ||||
Project project = new Project(definition.getKey(), loadProjectBranch(), definition.getName()); | Project project = new Project(definition.getKey(), loadProjectBranch(), definition.getName()); | ||||
// For backward compatibility we must set POM and actual packaging | |||||
project.setDescription(StringUtils.defaultString(definition.getDescription())); | project.setDescription(StringUtils.defaultString(definition.getDescription())); | ||||
project.setPackaging("jar"); | |||||
for (Object component : definition.getContainerExtensions()) { | |||||
if (component instanceof MavenProject) { | |||||
MavenProject pom = (MavenProject) component; | |||||
project.setPom(pom); | |||||
project.setPackaging(pom.getPackaging()); | |||||
} | |||||
} | |||||
return project; | return project; | ||||
} | } | ||||
import org.sonar.batch.issue.tracking.IssueTracking; | import org.sonar.batch.issue.tracking.IssueTracking; | ||||
import org.sonar.batch.issue.tracking.IssueTrackingDecorator; | import org.sonar.batch.issue.tracking.IssueTrackingDecorator; | ||||
import org.sonar.batch.language.LanguageDistributionDecorator; | import org.sonar.batch.language.LanguageDistributionDecorator; | ||||
import org.sonar.batch.maven.MavenProjectBootstrapper; | |||||
import org.sonar.batch.maven.MavenProjectBuilder; | |||||
import org.sonar.batch.maven.MavenProjectConverter; | |||||
import org.sonar.batch.qualitygate.GenerateQualityGateEvents; | import org.sonar.batch.qualitygate.GenerateQualityGateEvents; | ||||
import org.sonar.batch.qualitygate.QualityGateVerifier; | import org.sonar.batch.qualitygate.QualityGateVerifier; | ||||
import org.sonar.batch.rule.QProfileEventsDecorator; | import org.sonar.batch.rule.QProfileEventsDecorator; | ||||
public static Collection all(DefaultAnalysisMode analysisMode) { | public static Collection all(DefaultAnalysisMode analysisMode) { | ||||
List components = Lists.newArrayList( | List components = Lists.newArrayList( | ||||
DefaultResourceTypes.get(), | DefaultResourceTypes.get(), | ||||
// Maven | |||||
MavenProjectBootstrapper.class, MavenProjectConverter.class, MavenProjectBuilder.class, | |||||
// SCM | // SCM | ||||
ScmConfiguration.class, | ScmConfiguration.class, | ||||
ScmSensor.class, | ScmSensor.class, |
/* | |||||
* SonarQube, open source software quality management tool. | |||||
* Copyright (C) 2008-2014 SonarSource | |||||
* mailto:contact AT sonarsource DOT com | |||||
* | |||||
* SonarQube is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* SonarQube is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.batch.deprecated.components; | |||||
import com.google.common.collect.Lists; | |||||
import org.apache.maven.project.MavenProject; | |||||
import org.sonar.api.batch.ProjectClasspath; | |||||
import org.sonar.api.batch.bootstrap.ProjectDefinition; | |||||
import org.sonar.api.resources.ProjectFileSystem; | |||||
import javax.annotation.Nullable; | |||||
import java.io.File; | |||||
import java.util.List; | |||||
public class DefaultProjectClasspath extends ProjectClasspath { | |||||
private ProjectDefinition def; | |||||
private ProjectFileSystem projectFileSystem; | |||||
public DefaultProjectClasspath(ProjectDefinition def, ProjectFileSystem projectFileSystem) { | |||||
this(def, projectFileSystem, null); | |||||
} | |||||
public DefaultProjectClasspath(ProjectDefinition def, ProjectFileSystem projectFileSystem, @Nullable MavenProject pom) { | |||||
super(pom); | |||||
this.def = def; | |||||
this.projectFileSystem = projectFileSystem; | |||||
} | |||||
@Override | |||||
protected List<File> createElements() { | |||||
if (pom != null) { | |||||
return super.createElements(); | |||||
} else { | |||||
List<File> elements = Lists.newArrayList(); | |||||
for (String path : def.getBinaries()) { | |||||
elements.add(projectFileSystem.resolvePath(path)); | |||||
} | |||||
for (String path : def.getLibraries()) { | |||||
elements.add(projectFileSystem.resolvePath(path)); | |||||
} | |||||
return elements; | |||||
} | |||||
} | |||||
} |
/* | |||||
* SonarQube, open source software quality management tool. | |||||
* Copyright (C) 2008-2014 SonarSource | |||||
* mailto:contact AT sonarsource DOT com | |||||
* | |||||
* SonarQube is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* SonarQube is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.batch.maven; | |||||
import org.apache.maven.execution.MavenSession; | |||||
import org.apache.maven.project.MavenProject; | |||||
import org.sonar.api.batch.SupportedEnvironment; | |||||
import org.sonar.api.batch.bootstrap.ProjectBootstrapper; | |||||
import org.sonar.api.batch.bootstrap.ProjectReactor; | |||||
import java.util.List; | |||||
/** | |||||
* @deprecated since 4.3 kept only to support old version of SonarQube Mojo | |||||
*/ | |||||
@Deprecated | |||||
@SupportedEnvironment("maven") | |||||
public class MavenProjectBootstrapper implements ProjectBootstrapper { | |||||
private MavenSession session; | |||||
private MavenProjectConverter mavenProjectConverter; | |||||
public MavenProjectBootstrapper(MavenSession session, MavenProjectConverter mavenProjectConverter) { | |||||
this.session = session; | |||||
this.mavenProjectConverter = mavenProjectConverter; | |||||
} | |||||
@Override | |||||
public ProjectReactor bootstrap() { | |||||
// Don't use session.getTopLevelProject or session.getProjects to keep compatibility with Maven 2 | |||||
List<MavenProject> sortedProjects = session.getSortedProjects(); | |||||
MavenProject topLevelProject = null; | |||||
for (MavenProject project : sortedProjects) { | |||||
if (project.isExecutionRoot()) { | |||||
topLevelProject = project; | |||||
break; | |||||
} | |||||
} | |||||
if (topLevelProject == null) { | |||||
throw new IllegalStateException("Maven session does not declare a top level project"); | |||||
} | |||||
return new ProjectReactor(mavenProjectConverter.configure(sortedProjects, topLevelProject)); | |||||
} | |||||
} |
/* | |||||
* SonarQube, open source software quality management tool. | |||||
* Copyright (C) 2008-2014 SonarSource | |||||
* mailto:contact AT sonarsource DOT com | |||||
* | |||||
* SonarQube is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* SonarQube is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.batch.maven; | |||||
import com.google.common.annotations.VisibleForTesting; | |||||
import com.google.common.base.Function; | |||||
import com.google.common.base.Predicate; | |||||
import com.google.common.collect.Collections2; | |||||
import com.google.common.collect.Lists; | |||||
import com.google.common.collect.Maps; | |||||
import org.apache.commons.lang.StringUtils; | |||||
import org.apache.maven.model.CiManagement; | |||||
import org.apache.maven.model.IssueManagement; | |||||
import org.apache.maven.model.Scm; | |||||
import org.apache.maven.project.MavenProject; | |||||
import org.sonar.api.CoreProperties; | |||||
import org.sonar.api.batch.SupportedEnvironment; | |||||
import org.sonar.api.batch.bootstrap.ProjectDefinition; | |||||
import org.sonar.api.batch.maven.MavenUtils; | |||||
import org.sonar.api.task.TaskExtension; | |||||
import org.sonar.api.utils.MessageException; | |||||
import org.sonar.java.api.JavaUtils; | |||||
import javax.annotation.Nonnull; | |||||
import javax.annotation.Nullable; | |||||
import java.io.File; | |||||
import java.io.IOException; | |||||
import java.util.Arrays; | |||||
import java.util.Collection; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
/** | |||||
* @deprecated since 4.3 kept only to support old version of SonarQube Mojo | |||||
*/ | |||||
@Deprecated | |||||
@SupportedEnvironment("maven") | |||||
public class MavenProjectConverter implements TaskExtension { | |||||
private static final String UNABLE_TO_DETERMINE_PROJECT_STRUCTURE_EXCEPTION_MESSAGE = "Unable to determine structure of project." + | |||||
" Probably you use Maven Advanced Reactor Options, which is not supported by SonarQube and should not be used."; | |||||
public ProjectDefinition configure(List<MavenProject> poms, MavenProject root) { | |||||
// projects by canonical path to pom.xml | |||||
Map<String, MavenProject> paths = Maps.newHashMap(); | |||||
Map<MavenProject, ProjectDefinition> defs = Maps.newHashMap(); | |||||
try { | |||||
configureModules(poms, paths, defs); | |||||
rebuildModuleHierarchy(paths, defs); | |||||
} catch (IOException e) { | |||||
throw new IllegalStateException("Cannot configure project", e); | |||||
} | |||||
ProjectDefinition rootProject = defs.get(root); | |||||
if (rootProject == null) { | |||||
throw new IllegalStateException(UNABLE_TO_DETERMINE_PROJECT_STRUCTURE_EXCEPTION_MESSAGE); | |||||
} | |||||
return rootProject; | |||||
} | |||||
private void rebuildModuleHierarchy(Map<String, MavenProject> paths, Map<MavenProject, ProjectDefinition> defs) throws IOException { | |||||
for (Map.Entry<String, MavenProject> entry : paths.entrySet()) { | |||||
MavenProject pom = entry.getValue(); | |||||
for (Object m : pom.getModules()) { | |||||
String moduleId = (String) m; | |||||
File modulePath = new File(pom.getBasedir(), moduleId); | |||||
MavenProject module = findMavenProject(modulePath, paths); | |||||
ProjectDefinition parentProject = defs.get(pom); | |||||
if (parentProject == null) { | |||||
throw new IllegalStateException(UNABLE_TO_DETERMINE_PROJECT_STRUCTURE_EXCEPTION_MESSAGE); | |||||
} | |||||
ProjectDefinition subProject = defs.get(module); | |||||
if (subProject == null) { | |||||
throw new IllegalStateException(UNABLE_TO_DETERMINE_PROJECT_STRUCTURE_EXCEPTION_MESSAGE); | |||||
} | |||||
parentProject.addSubProject(subProject); | |||||
} | |||||
} | |||||
} | |||||
private void configureModules(List<MavenProject> poms, Map<String, MavenProject> paths, Map<MavenProject, ProjectDefinition> defs) throws IOException { | |||||
for (MavenProject pom : poms) { | |||||
paths.put(pom.getFile().getCanonicalPath(), pom); | |||||
ProjectDefinition def = ProjectDefinition.create(); | |||||
merge(pom, def); | |||||
defs.put(pom, def); | |||||
} | |||||
} | |||||
private static MavenProject findMavenProject(final File modulePath, Map<String, MavenProject> paths) throws IOException { | |||||
if (modulePath.exists() && modulePath.isDirectory()) { | |||||
for (Map.Entry<String, MavenProject> entry : paths.entrySet()) { | |||||
String pomFileParentDir = new File(entry.getKey()).getParent(); | |||||
if (pomFileParentDir.equals(modulePath.getCanonicalPath())) { | |||||
return entry.getValue(); | |||||
} | |||||
} | |||||
return null; | |||||
} | |||||
return paths.get(modulePath.getCanonicalPath()); | |||||
} | |||||
@VisibleForTesting | |||||
void merge(MavenProject pom, ProjectDefinition definition) { | |||||
String key = getSonarKey(pom); | |||||
// IMPORTANT NOTE : reference on properties from POM model must not be saved, | |||||
// instead they should be copied explicitly - see SONAR-2896 | |||||
definition | |||||
.setProperties(pom.getModel().getProperties()) | |||||
.setKey(key) | |||||
.setVersion(pom.getVersion()) | |||||
.setName(pom.getName()) | |||||
.setDescription(pom.getDescription()) | |||||
.addContainerExtension(pom); | |||||
guessJavaVersion(pom, definition); | |||||
guessEncoding(pom, definition); | |||||
convertMavenLinksToProperties(definition, pom); | |||||
synchronizeFileSystem(pom, definition); | |||||
} | |||||
private static String getSonarKey(MavenProject pom) { | |||||
return new StringBuilder().append(pom.getGroupId()).append(":").append(pom.getArtifactId()).toString(); | |||||
} | |||||
private static void guessEncoding(MavenProject pom, ProjectDefinition definition) { | |||||
// See http://jira.sonarsource.com/browse/SONAR-2151 | |||||
String encoding = MavenUtils.getSourceEncoding(pom); | |||||
if (encoding != null) { | |||||
definition.setProperty(CoreProperties.ENCODING_PROPERTY, encoding); | |||||
} | |||||
} | |||||
private static void guessJavaVersion(MavenProject pom, ProjectDefinition definition) { | |||||
// See http://jira.sonarsource.com/browse/SONAR-2148 | |||||
// Get Java source and target versions from maven-compiler-plugin. | |||||
String version = MavenUtils.getJavaSourceVersion(pom); | |||||
if (version != null) { | |||||
definition.setProperty(JavaUtils.JAVA_SOURCE_PROPERTY, version); | |||||
} | |||||
version = MavenUtils.getJavaVersion(pom); | |||||
if (version != null) { | |||||
definition.setProperty(JavaUtils.JAVA_TARGET_PROPERTY, version); | |||||
} | |||||
} | |||||
/** | |||||
* For SONAR-3676 | |||||
*/ | |||||
private static void convertMavenLinksToProperties(ProjectDefinition definition, MavenProject pom) { | |||||
setPropertyIfNotAlreadyExists(definition, CoreProperties.LINKS_HOME_PAGE, pom.getUrl()); | |||||
Scm scm = pom.getScm(); | |||||
if (scm == null) { | |||||
scm = new Scm(); | |||||
} | |||||
setPropertyIfNotAlreadyExists(definition, CoreProperties.LINKS_SOURCES, scm.getUrl()); | |||||
setPropertyIfNotAlreadyExists(definition, CoreProperties.LINKS_SOURCES_DEV, scm.getDeveloperConnection()); | |||||
CiManagement ci = pom.getCiManagement(); | |||||
if (ci == null) { | |||||
ci = new CiManagement(); | |||||
} | |||||
setPropertyIfNotAlreadyExists(definition, CoreProperties.LINKS_CI, ci.getUrl()); | |||||
IssueManagement issues = pom.getIssueManagement(); | |||||
if (issues == null) { | |||||
issues = new IssueManagement(); | |||||
} | |||||
setPropertyIfNotAlreadyExists(definition, CoreProperties.LINKS_ISSUE_TRACKER, issues.getUrl()); | |||||
} | |||||
private static void setPropertyIfNotAlreadyExists(ProjectDefinition definition, String propertyKey, String propertyValue) { | |||||
if (StringUtils.isBlank(definition.properties().get(propertyKey))) { | |||||
definition.setProperty(propertyKey, StringUtils.defaultString(propertyValue)); | |||||
} | |||||
} | |||||
public void synchronizeFileSystem(MavenProject pom, ProjectDefinition into) { | |||||
into.setBaseDir(pom.getBasedir()); | |||||
File buildDir = getBuildDir(pom); | |||||
if (buildDir != null) { | |||||
into.setBuildDir(buildDir); | |||||
into.setWorkDir(getSonarWorkDir(pom)); | |||||
} | |||||
into.setSourceDirs(toPaths(mainDirs(pom))); | |||||
into.setTestDirs(toPaths(testDirs(pom))); | |||||
File binaryDir = resolvePath(pom.getBuild().getOutputDirectory(), pom.getBasedir()); | |||||
if (binaryDir != null) { | |||||
into.addBinaryDir(binaryDir); | |||||
} | |||||
} | |||||
public static File getSonarWorkDir(MavenProject pom) { | |||||
return new File(getBuildDir(pom), "sonar"); | |||||
} | |||||
private static File getBuildDir(MavenProject pom) { | |||||
return resolvePath(pom.getBuild().getDirectory(), pom.getBasedir()); | |||||
} | |||||
static File resolvePath(@Nullable String path, File basedir) { | |||||
if (path != null) { | |||||
File file = new File(StringUtils.trim(path)); | |||||
if (!file.isAbsolute()) { | |||||
try { | |||||
file = new File(basedir, path).getCanonicalFile(); | |||||
} catch (IOException e) { | |||||
throw new IllegalStateException("Unable to resolve path '" + path + "'", e); | |||||
} | |||||
} | |||||
return file; | |||||
} | |||||
return null; | |||||
} | |||||
static List<File> resolvePaths(List<String> paths, File basedir) { | |||||
List<File> result = Lists.newArrayList(); | |||||
for (String path : paths) { | |||||
File dir = resolvePath(path, basedir); | |||||
if (dir != null) { | |||||
result.add(dir); | |||||
} | |||||
} | |||||
return result; | |||||
} | |||||
private List<File> mainDirs(MavenProject pom) { | |||||
return sourceDirs(pom, ProjectDefinition.SOURCE_DIRS_PROPERTY, pom.getCompileSourceRoots()); | |||||
} | |||||
private List<File> testDirs(MavenProject pom) { | |||||
return sourceDirs(pom, ProjectDefinition.TEST_DIRS_PROPERTY, pom.getTestCompileSourceRoots()); | |||||
} | |||||
private List<File> sourceDirs(MavenProject pom, String propertyKey, List mavenDirs) { | |||||
List<String> paths; | |||||
String prop = pom.getProperties().getProperty(propertyKey); | |||||
if (prop != null) { | |||||
paths = Arrays.asList(StringUtils.split(prop, ",")); | |||||
// do not remove dirs that do not exist. They must be kept in order to | |||||
// notify users that value of sonar.sources has a typo. | |||||
return existingDirsOrFail(resolvePaths(paths, pom.getBasedir()), pom, propertyKey); | |||||
} | |||||
List<File> dirs = resolvePaths(mavenDirs, pom.getBasedir()); | |||||
// Maven provides some directories that do not exist. They | |||||
// should be removed | |||||
return keepExistingDirs(dirs); | |||||
} | |||||
private List<File> existingDirsOrFail(List<File> dirs, MavenProject pom, String propertyKey) { | |||||
for (File dir : dirs) { | |||||
if (!dir.isDirectory() || !dir.exists()) { | |||||
throw MessageException.of(String.format( | |||||
"The directory '%s' does not exist for Maven module %s. Please check the property %s", | |||||
dir.getAbsolutePath(), pom.getId(), propertyKey)); | |||||
} | |||||
} | |||||
return dirs; | |||||
} | |||||
private static List<File> keepExistingDirs(List<File> files) { | |||||
return Lists.newArrayList(Collections2.filter(files, new Predicate<File>() { | |||||
@Override | |||||
public boolean apply(File dir) { | |||||
return dir != null && dir.exists() && dir.isDirectory(); | |||||
} | |||||
})); | |||||
} | |||||
private static String[] toPaths(Collection<File> dirs) { | |||||
Collection<String> paths = Collections2.transform(dirs, new Function<File, String>() { | |||||
@Override | |||||
public String apply(@Nonnull File dir) { | |||||
return dir.getAbsolutePath(); | |||||
} | |||||
}); | |||||
return paths.toArray(new String[paths.size()]); | |||||
} | |||||
} |
import org.sonar.batch.bootstrap.ExtensionUtils; | import org.sonar.batch.bootstrap.ExtensionUtils; | ||||
import org.sonar.batch.deprecated.DeprecatedSensorContext; | import org.sonar.batch.deprecated.DeprecatedSensorContext; | ||||
import org.sonar.batch.deprecated.ResourceFilters; | import org.sonar.batch.deprecated.ResourceFilters; | ||||
import org.sonar.batch.deprecated.components.DefaultProjectClasspath; | |||||
import org.sonar.batch.deprecated.components.DefaultTimeMachine; | import org.sonar.batch.deprecated.components.DefaultTimeMachine; | ||||
import org.sonar.batch.deprecated.perspectives.BatchPerspectives; | import org.sonar.batch.deprecated.perspectives.BatchPerspectives; | ||||
import org.sonar.batch.events.EventBus; | import org.sonar.batch.events.EventBus; | ||||
ComponentIndexer.class, | ComponentIndexer.class, | ||||
LanguageVerifier.class, | LanguageVerifier.class, | ||||
FileSystemLogger.class, | FileSystemLogger.class, | ||||
DefaultProjectClasspath.class, | |||||
DefaultModuleFileSystem.class, | DefaultModuleFileSystem.class, | ||||
ModuleFileSystemInitializer.class, | ModuleFileSystemInitializer.class, | ||||
ProjectFileSystemAdapter.class, | ProjectFileSystemAdapter.class, | ||||
installer.install(this, new ExtensionMatcher() { | installer.install(this, new ExtensionMatcher() { | ||||
@Override | @Override | ||||
public boolean accept(Object extension) { | public boolean accept(Object extension) { | ||||
if (ExtensionUtils.isBatchSide(extension) && ExtensionUtils.isInstantiationStrategy(extension, InstantiationStrategy.PER_PROJECT)) { | |||||
// Special use-case: the extension point ProjectBuilder is used in a Maven environment to define some | |||||
// new sub-projects without pom. | |||||
// Example : C# plugin adds sub-projects at runtime, even if they are not defined in root pom. | |||||
return !ExtensionUtils.isMavenExtensionOnly(extension) || module.getPom() != null; | |||||
} | |||||
return false; | |||||
return ExtensionUtils.isBatchSide(extension) && ExtensionUtils.isInstantiationStrategy(extension, InstantiationStrategy.PER_PROJECT); | |||||
} | } | ||||
}); | }); | ||||
} | } |
import com.google.common.collect.Lists; | import com.google.common.collect.Lists; | ||||
import org.apache.commons.io.FileUtils; | import org.apache.commons.io.FileUtils; | ||||
import org.apache.commons.lang.CharEncoding; | import org.apache.commons.lang.CharEncoding; | ||||
import org.apache.maven.project.MavenProject; | |||||
import org.sonar.api.batch.fs.FilePredicate; | import org.sonar.api.batch.fs.FilePredicate; | ||||
import org.sonar.api.resources.InputFile; | |||||
import org.sonar.api.resources.Java; | |||||
import org.sonar.api.resources.Language; | |||||
import org.sonar.api.resources.Project; | |||||
import org.sonar.api.resources.ProjectFileSystem; | |||||
import org.sonar.api.resources.Resource; | |||||
import org.sonar.api.resources.*; | |||||
import org.sonar.api.scan.filesystem.PathResolver; | import org.sonar.api.scan.filesystem.PathResolver; | ||||
import org.sonar.api.utils.SonarException; | import org.sonar.api.utils.SonarException; | ||||
import javax.annotation.Nullable; | |||||
import java.io.File; | import java.io.File; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.nio.charset.Charset; | import java.nio.charset.Charset; | ||||
private final DefaultModuleFileSystem target; | private final DefaultModuleFileSystem target; | ||||
private final PathResolver pathResolver = new PathResolver(); | private final PathResolver pathResolver = new PathResolver(); | ||||
private final MavenProject pom; | |||||
public ProjectFileSystemAdapter(DefaultModuleFileSystem target, Project project, @Nullable MavenProject pom) { | |||||
public ProjectFileSystemAdapter(DefaultModuleFileSystem target, Project project) { | |||||
this.target = target; | this.target = target; | ||||
this.pom = pom; | |||||
// previously MavenProjectBuilder was responsible for creation of ProjectFileSystem | // previously MavenProjectBuilder was responsible for creation of ProjectFileSystem | ||||
project.setFileSystem(this); | project.setFileSystem(this); | ||||
} | } | ||||
public ProjectFileSystemAdapter(DefaultModuleFileSystem target, Project project) { | |||||
this(target, project, null); | |||||
} | |||||
public void start() { | public void start() { | ||||
// used to avoid NPE in Project#getFileSystem() | // used to avoid NPE in Project#getFileSystem() | ||||
} | } | ||||
@Override | @Override | ||||
public File getReportOutputDir() { | public File getReportOutputDir() { | ||||
if (pom != null) { | |||||
return resolvePath(pom.getReporting().getOutputDirectory()); | |||||
} | |||||
// emulate Maven report output dir | // emulate Maven report output dir | ||||
return new File(getBuildDir(), "site"); | return new File(getBuildDir(), "site"); | ||||
} | } | ||||
return Lists.newArrayList((Iterable) target.inputFiles(target.predicates().and( | return Lists.newArrayList((Iterable) target.inputFiles(target.predicates().and( | ||||
target.predicates().hasType(org.sonar.api.batch.fs.InputFile.Type.MAIN), | target.predicates().hasType(org.sonar.api.batch.fs.InputFile.Type.MAIN), | ||||
target.predicates().hasLanguages(Arrays.asList(langs)) | target.predicates().hasLanguages(Arrays.asList(langs)) | ||||
))); | |||||
))); | |||||
} | } | ||||
return Lists.newArrayList((Iterable) target.inputFiles(target.predicates().and( | return Lists.newArrayList((Iterable) target.inputFiles(target.predicates().and( | ||||
target.predicates().hasType(org.sonar.api.batch.fs.InputFile.Type.TEST), | target.predicates().hasType(org.sonar.api.batch.fs.InputFile.Type.TEST), | ||||
target.predicates().hasLanguages(Arrays.asList(langs)) | target.predicates().hasLanguages(Arrays.asList(langs)) | ||||
))); | |||||
))); | |||||
} | } | ||||
private FilePredicate newHasLanguagesPredicate(Language... languages) { | private FilePredicate newHasLanguagesPredicate(Language... languages) { |
/* | |||||
* SonarQube, open source software quality management tool. | |||||
* Copyright (C) 2008-2014 SonarSource | |||||
* mailto:contact AT sonarsource DOT com | |||||
* | |||||
* SonarQube is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* SonarQube is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.batch.maven; | |||||
import org.apache.maven.execution.MavenSession; | |||||
import org.apache.maven.project.MavenProject; | |||||
import org.junit.Rule; | |||||
import org.junit.Test; | |||||
import org.junit.rules.ExpectedException; | |||||
import org.sonar.api.batch.bootstrap.ProjectDefinition; | |||||
import org.sonar.api.batch.bootstrap.ProjectReactor; | |||||
import java.util.Arrays; | |||||
import java.util.List; | |||||
import static org.assertj.core.api.Assertions.assertThat; | |||||
import static org.mockito.Mockito.mock; | |||||
import static org.mockito.Mockito.verify; | |||||
import static org.mockito.Mockito.when; | |||||
public class MavenProjectBootstrapperTest { | |||||
@Rule | |||||
public ExpectedException thrown = ExpectedException.none(); | |||||
@Test | |||||
public void bootstrap() { | |||||
ProjectDefinition def = mock(ProjectDefinition.class); | |||||
MavenSession session = mock(MavenSession.class); | |||||
MavenProject rootProject = new MavenProject(); | |||||
rootProject.setExecutionRoot(true); | |||||
List<MavenProject> projects = Arrays.asList(rootProject); | |||||
when(session.getSortedProjects()).thenReturn(projects); | |||||
MavenProjectConverter pomConverter = mock(MavenProjectConverter.class); | |||||
when(pomConverter.configure(projects, rootProject)).thenReturn(def); | |||||
MavenProjectBootstrapper bootstrapper = new MavenProjectBootstrapper(session, pomConverter); | |||||
ProjectReactor reactor = bootstrapper.bootstrap(); | |||||
assertThat(reactor).isNotNull(); | |||||
verify(pomConverter).configure(projects, rootProject); | |||||
} | |||||
@Test | |||||
public void should_fail_if_no_top_level_project() { | |||||
thrown.expect(IllegalStateException.class); | |||||
thrown.expectMessage("Maven session does not declare a top level project"); | |||||
MavenSession session = mock(MavenSession.class); | |||||
MavenProjectConverter pomConverter = new MavenProjectConverter(); | |||||
MavenProjectBootstrapper bootstrapper = new MavenProjectBootstrapper(session, pomConverter); | |||||
bootstrapper.bootstrap(); | |||||
} | |||||
} |
/* | |||||
* SonarQube, open source software quality management tool. | |||||
* Copyright (C) 2008-2014 SonarSource | |||||
* mailto:contact AT sonarsource DOT com | |||||
* | |||||
* SonarQube is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* SonarQube is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.batch.maven; | |||||
import com.google.common.io.Resources; | |||||
import org.apache.commons.io.FileUtils; | |||||
import org.apache.maven.model.Model; | |||||
import org.apache.maven.model.io.xpp3.MavenXpp3Reader; | |||||
import org.apache.maven.project.MavenProject; | |||||
import org.codehaus.plexus.util.xml.pull.XmlPullParserException; | |||||
import org.hamcrest.core.Is; | |||||
import org.junit.Rule; | |||||
import org.junit.Test; | |||||
import org.junit.rules.TemporaryFolder; | |||||
import org.sonar.api.CoreProperties; | |||||
import org.sonar.api.batch.bootstrap.ProjectDefinition; | |||||
import java.io.File; | |||||
import java.io.IOException; | |||||
import java.io.StringReader; | |||||
import java.net.URISyntaxException; | |||||
import java.util.Arrays; | |||||
import java.util.Properties; | |||||
import static org.assertj.core.api.Assertions.assertThat; | |||||
import static org.hamcrest.Matchers.containsString; | |||||
import static org.hamcrest.Matchers.is; | |||||
import static org.junit.Assert.assertNull; | |||||
import static org.junit.Assert.assertThat; | |||||
import static org.junit.Assert.fail; | |||||
public class MavenProjectConverterTest { | |||||
@Rule | |||||
public TemporaryFolder temp = new TemporaryFolder(); | |||||
MavenProjectConverter converter = new MavenProjectConverter(); | |||||
/** | |||||
* See SONAR-2681 | |||||
*/ | |||||
@Test | |||||
public void shouldThrowExceptionWhenUnableToDetermineProjectStructure() { | |||||
MavenProject root = new MavenProject(); | |||||
root.setFile(new File("/foo/pom.xml")); | |||||
root.getBuild().setDirectory("target"); | |||||
root.getModules().add("module/pom.xml"); | |||||
try { | |||||
converter.configure(Arrays.asList(root), root); | |||||
fail(); | |||||
} catch (IllegalStateException e) { | |||||
assertThat(e.getMessage(), containsString("Advanced Reactor Options")); | |||||
} | |||||
} | |||||
@Test | |||||
public void shouldConvertModules() throws IOException { | |||||
File basedir = temp.newFolder(); | |||||
MavenProject root = newMavenProject("com.foo", "parent", "1.0-SNAPSHOT"); | |||||
root.setFile(new File(basedir, "pom.xml")); | |||||
root.getBuild().setDirectory("target"); | |||||
root.getBuild().setOutputDirectory("target/classes"); | |||||
root.getModules().add("module/pom.xml"); | |||||
MavenProject module = newMavenProject("com.foo", "moduleA", "1.0-SNAPSHOT"); | |||||
module.setFile(new File(basedir, "module/pom.xml")); | |||||
module.getBuild().setDirectory("target"); | |||||
module.getBuild().setOutputDirectory("target/classes"); | |||||
ProjectDefinition project = converter.configure(Arrays.asList(root, module), root); | |||||
assertThat(project.getSubProjects().size(), is(1)); | |||||
} | |||||
private MavenProject newMavenProject(String groupId, String artifactId, String version) { | |||||
Model model = new Model(); | |||||
model.setGroupId(groupId); | |||||
model.setArtifactId(artifactId); | |||||
model.setVersion(version); | |||||
return new MavenProject(model); | |||||
} | |||||
@Test | |||||
public void shouldConvertProperties() { | |||||
MavenProject pom = new MavenProject(); | |||||
pom.setGroupId("foo"); | |||||
pom.setArtifactId("bar"); | |||||
pom.setVersion("1.0.1"); | |||||
pom.setName("Test"); | |||||
pom.setDescription("just test"); | |||||
pom.setFile(new File("/foo/pom.xml")); | |||||
pom.getBuild().setDirectory("target"); | |||||
ProjectDefinition project = ProjectDefinition.create(); | |||||
converter.merge(pom, project); | |||||
Properties properties = project.getProperties(); | |||||
assertThat(properties.getProperty(CoreProperties.PROJECT_KEY_PROPERTY), is("foo:bar")); | |||||
assertThat(properties.getProperty(CoreProperties.PROJECT_VERSION_PROPERTY), is("1.0.1")); | |||||
assertThat(properties.getProperty(CoreProperties.PROJECT_NAME_PROPERTY), is("Test")); | |||||
assertThat(properties.getProperty(CoreProperties.PROJECT_DESCRIPTION_PROPERTY), is("just test")); | |||||
} | |||||
@Test | |||||
public void moduleNameShouldEqualArtifactId() throws Exception { | |||||
File rootDir = new File(Resources.getResource("org/sonar/batch/maven/MavenProjectConverterTest/moduleNameShouldEqualArtifactId/").toURI()); | |||||
MavenProject parent = loadPom("/org/sonar/batch/maven/MavenProjectConverterTest/moduleNameShouldEqualArtifactId/pom.xml", true); | |||||
MavenProject module1 = loadPom("/org/sonar/batch/maven/MavenProjectConverterTest/moduleNameShouldEqualArtifactId/module1/pom.xml", false); | |||||
MavenProject module2 = loadPom("/org/sonar/batch/maven/MavenProjectConverterTest/moduleNameShouldEqualArtifactId/module2/pom.xml", false); | |||||
ProjectDefinition rootDef = converter.configure(Arrays.asList(parent, module1, module2), parent); | |||||
assertThat(rootDef.getSubProjects().size(), Is.is(2)); | |||||
assertThat(rootDef.getKey(), Is.is("org.test:parent")); | |||||
assertNull(rootDef.getParent()); | |||||
assertThat(rootDef.getBaseDir(), is(rootDir)); | |||||
ProjectDefinition module1Def = rootDef.getSubProjects().get(0); | |||||
assertThat(module1Def.getKey(), Is.is("org.test:module1")); | |||||
assertThat(module1Def.getParent(), Is.is(rootDef)); | |||||
assertThat(module1Def.getBaseDir(), Is.is(new File(rootDir, "module1"))); | |||||
assertThat(module1Def.getSubProjects().size(), Is.is(0)); | |||||
} | |||||
@Test | |||||
public void moduleNameDifferentThanArtifactId() throws Exception { | |||||
File rootDir = new File(Resources.getResource("org/sonar/batch/maven/MavenProjectConverterTest/moduleNameDifferentThanArtifactId/").toURI()); | |||||
MavenProject parent = loadPom("/org/sonar/batch/maven/MavenProjectConverterTest/moduleNameDifferentThanArtifactId/pom.xml", true); | |||||
MavenProject module1 = loadPom("/org/sonar/batch/maven/MavenProjectConverterTest/moduleNameDifferentThanArtifactId/path1/pom.xml", false); | |||||
MavenProject module2 = loadPom("/org/sonar/batch/maven/MavenProjectConverterTest/moduleNameDifferentThanArtifactId/path2/pom.xml", false); | |||||
ProjectDefinition rootDef = converter.configure(Arrays.asList(parent, module1, module2), parent); | |||||
assertThat(rootDef.getSubProjects().size(), is(2)); | |||||
assertThat(rootDef.getKey(), is("org.test:parent")); | |||||
assertNull(rootDef.getParent()); | |||||
assertThat(rootDef.getBaseDir(), is(rootDir)); | |||||
ProjectDefinition module1Def = rootDef.getSubProjects().get(0); | |||||
assertThat(module1Def.getKey(), Is.is("org.test:module1")); | |||||
assertThat(module1Def.getParent(), Is.is(rootDef)); | |||||
assertThat(module1Def.getBaseDir(), Is.is(new File(rootDir, "path1"))); | |||||
assertThat(module1Def.getSubProjects().size(), Is.is(0)); | |||||
} | |||||
@Test | |||||
public void should_find_module_with_maven_project_file_naming_different_from_pom_xml() throws Exception { | |||||
File rootDir = new File(Resources.getResource("org/sonar/batch/maven/MavenProjectConverterTest/mavenProjectFileNameNotEqualsToPomXml/").toURI()); | |||||
MavenProject parent = loadPom("/org/sonar/batch/maven/MavenProjectConverterTest/mavenProjectFileNameNotEqualsToPomXml/pom.xml", true); | |||||
MavenProject module = loadPom("/org/sonar/batch/maven/MavenProjectConverterTest/mavenProjectFileNameNotEqualsToPomXml/module/pom_having_different_name.xml", false); | |||||
ProjectDefinition rootDef = converter.configure(Arrays.asList(parent, module), parent); | |||||
assertThat(rootDef.getSubProjects().size(), Is.is(1)); | |||||
assertThat(rootDef.getKey(), Is.is("org.test:parent")); | |||||
assertNull(rootDef.getParent()); | |||||
assertThat(rootDef.getBaseDir(), is(rootDir)); | |||||
ProjectDefinition module1Def = rootDef.getSubProjects().get(0); | |||||
assertThat(module1Def.getKey(), Is.is("org.test:module")); | |||||
assertThat(module1Def.getParent(), Is.is(rootDef)); | |||||
assertThat(module1Def.getBaseDir(), Is.is(new File(rootDir, "module"))); | |||||
assertThat(module1Def.getSubProjects().size(), Is.is(0)); | |||||
} | |||||
@Test | |||||
public void testSingleProjectWithoutModules() throws Exception { | |||||
File rootDir = new File(Resources.getResource("org/sonar/batch/maven/MavenProjectConverterTest/singleProjectWithoutModules/").toURI()); | |||||
MavenProject pom = loadPom("/org/sonar/batch/maven/MavenProjectConverterTest/singleProjectWithoutModules/pom.xml", true); | |||||
ProjectDefinition rootDef = converter.configure(Arrays.asList(pom), pom); | |||||
assertThat(rootDef.getKey(), is("org.test:parent")); | |||||
assertThat(rootDef.getSubProjects().size(), is(0)); | |||||
assertNull(rootDef.getParent()); | |||||
assertThat(rootDef.getBaseDir(), is(rootDir)); | |||||
} | |||||
@Test | |||||
public void shouldConvertLinksToProperties() throws Exception { | |||||
MavenProject pom = loadPom("/org/sonar/batch/maven/MavenProjectConverterTest/projectWithLinks/pom.xml", true); | |||||
ProjectDefinition rootDef = converter.configure(Arrays.asList(pom), pom); | |||||
Properties props = rootDef.getProperties(); | |||||
assertThat(props.getProperty(CoreProperties.LINKS_HOME_PAGE)).isEqualTo("http://home.com"); | |||||
assertThat(props.getProperty(CoreProperties.LINKS_CI)).isEqualTo("http://ci.com"); | |||||
assertThat(props.getProperty(CoreProperties.LINKS_ISSUE_TRACKER)).isEqualTo("http://issues.com"); | |||||
assertThat(props.getProperty(CoreProperties.LINKS_SOURCES)).isEqualTo("http://sources.com"); | |||||
assertThat(props.getProperty(CoreProperties.LINKS_SOURCES_DEV)).isEqualTo("http://sources-dev.com"); | |||||
} | |||||
@Test | |||||
public void shouldNotConvertLinksToPropertiesIfPropertyAlreadyDefined() throws Exception { | |||||
MavenProject pom = loadPom("/org/sonar/batch/maven/MavenProjectConverterTest/projectWithLinksAndProperties/pom.xml", true); | |||||
ProjectDefinition rootDef = converter.configure(Arrays.asList(pom), pom); | |||||
Properties props = rootDef.getProperties(); | |||||
// Those properties have been fed by the POM elements <ciManagement>, <issueManagement>, ... | |||||
assertThat(props.getProperty(CoreProperties.LINKS_CI)).isEqualTo("http://ci.com"); | |||||
assertThat(props.getProperty(CoreProperties.LINKS_ISSUE_TRACKER)).isEqualTo("http://issues.com"); | |||||
assertThat(props.getProperty(CoreProperties.LINKS_SOURCES_DEV)).isEqualTo("http://sources-dev.com"); | |||||
// ... but those ones have been overridden by <properties> in the POM | |||||
assertThat(props.getProperty(CoreProperties.LINKS_SOURCES)).isEqualTo("http://sources.com-OVERRIDEN-BY-PROPS"); | |||||
assertThat(props.getProperty(CoreProperties.LINKS_HOME_PAGE)).isEqualTo("http://home.com-OVERRIDEN-BY-PROPS"); | |||||
} | |||||
@Test | |||||
public void shouldLoadSourceEncoding() throws Exception { | |||||
MavenProject pom = loadPom("/org/sonar/batch/maven/MavenProjectConverterTest/sourceEncoding/pom.xml", true); | |||||
ProjectDefinition rootDef = converter.configure(Arrays.asList(pom), pom); | |||||
assertThat(rootDef.getProperties().getProperty(CoreProperties.ENCODING_PROPERTY)).isEqualTo("Shift_JIS"); | |||||
} | |||||
private MavenProject loadPom(String pomPath, boolean isRoot) throws URISyntaxException, IOException, XmlPullParserException { | |||||
File pomFile = new File(getClass().getResource(pomPath).toURI()); | |||||
Model model = new MavenXpp3Reader().read(new StringReader(FileUtils.readFileToString(pomFile))); | |||||
MavenProject pom = new MavenProject(model); | |||||
pom.setFile(pomFile); | |||||
pom.getBuild().setDirectory("target"); | |||||
pom.setExecutionRoot(isRoot); | |||||
return pom; | |||||
} | |||||
} |
/* | |||||
* SonarQube, open source software quality management tool. | |||||
* Copyright (C) 2008-2014 SonarSource | |||||
* mailto:contact AT sonarsource DOT com | |||||
* | |||||
* SonarQube is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* SonarQube is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.batch.maven; | |||||
import org.apache.maven.execution.MavenSession; | |||||
import org.apache.maven.project.MavenProject; | |||||
import org.junit.Test; | |||||
import org.mockito.ArgumentCaptor; | |||||
import org.sonar.api.batch.bootstrap.ProjectDefinition; | |||||
import java.util.Arrays; | |||||
import java.util.List; | |||||
import static org.assertj.core.api.Assertions.assertThat; | |||||
import static org.mockito.Matchers.any; | |||||
import static org.mockito.Matchers.eq; | |||||
import static org.mockito.Mockito.mock; | |||||
import static org.mockito.Mockito.verify; | |||||
import static org.mockito.Mockito.when; | |||||
public class SonarMavenProjectBuilderTest { | |||||
@Test | |||||
public void testSimpleProject() { | |||||
MavenSession session = mock(MavenSession.class); | |||||
MavenProject rootProject = mock(MavenProject.class); | |||||
when(rootProject.isExecutionRoot()).thenReturn(true); | |||||
when(session.getSortedProjects()).thenReturn(Arrays.asList(rootProject)); | |||||
MavenProjectConverter mavenProjectConverter = mock(MavenProjectConverter.class); | |||||
ProjectDefinition projectDefinition = ProjectDefinition.create(); | |||||
when(mavenProjectConverter.configure(any(List.class), any(MavenProject.class))).thenReturn(projectDefinition); | |||||
MavenProjectBootstrapper builder = new MavenProjectBootstrapper(session, mavenProjectConverter); | |||||
assertThat(builder.bootstrap().getRoot()).isEqualTo(projectDefinition); | |||||
ArgumentCaptor<List> argument = ArgumentCaptor.forClass(List.class); | |||||
verify(mavenProjectConverter).configure(argument.capture(), eq(rootProject)); | |||||
assertThat(argument.getValue()).contains(rootProject); | |||||
} | |||||
@Test | |||||
public void testMultimoduleProject() { | |||||
MavenSession session = mock(MavenSession.class); | |||||
MavenProject rootProject = mock(MavenProject.class); | |||||
MavenProject module1 = mock(MavenProject.class); | |||||
MavenProject module2 = mock(MavenProject.class); | |||||
when(rootProject.isExecutionRoot()).thenReturn(true); | |||||
when(module1.isExecutionRoot()).thenReturn(false); | |||||
when(module2.isExecutionRoot()).thenReturn(false); | |||||
when(session.getSortedProjects()).thenReturn(Arrays.asList(module1, module2, rootProject)); | |||||
MavenProjectConverter mavenProjectConverter = mock(MavenProjectConverter.class); | |||||
ProjectDefinition projectDefinition = ProjectDefinition.create(); | |||||
when(mavenProjectConverter.configure(any(List.class), any(MavenProject.class))).thenReturn(projectDefinition); | |||||
MavenProjectBootstrapper builder = new MavenProjectBootstrapper(session, mavenProjectConverter); | |||||
assertThat(builder.bootstrap().getRoot()).isEqualTo(projectDefinition); | |||||
ArgumentCaptor<List> argument = ArgumentCaptor.forClass(List.class); | |||||
verify(mavenProjectConverter).configure(argument.capture(), eq(rootProject)); | |||||
assertThat(argument.getValue()).contains(module1, module2, rootProject); | |||||
} | |||||
} |
import org.sonar.api.resources.File; | import org.sonar.api.resources.File; | ||||
import org.sonar.api.resources.Project; | import org.sonar.api.resources.Project; | ||||
import org.sonar.api.resources.Resource; | import org.sonar.api.resources.Resource; | ||||
import org.sonar.api.test.ProjectTestBuilder; | |||||
import org.sonar.batch.protocol.Constants.EventCategory; | import org.sonar.batch.protocol.Constants.EventCategory; | ||||
import org.sonar.batch.report.EventCache; | import org.sonar.batch.report.EventCache; | ||||
notificationManager = mock(NotificationManager.class); | notificationManager = mock(NotificationManager.class); | ||||
eventCache = mock(EventCache.class); | eventCache = mock(EventCache.class); | ||||
decorator = new GenerateQualityGateEvents(qualityGate, timeMachine, notificationManager, eventCache); | decorator = new GenerateQualityGateEvents(qualityGate, timeMachine, notificationManager, eventCache); | ||||
project = new ProjectTestBuilder().build(); | |||||
project = new Project("mygroup:myartifact"); | |||||
when(context.getResource()).thenReturn(project); | when(context.getResource()).thenReturn(project); | ||||
} | } | ||||
<groupId>commons-lang</groupId> | <groupId>commons-lang</groupId> | ||||
<artifactId>commons-lang</artifactId> | <artifactId>commons-lang</artifactId> | ||||
</dependency> | </dependency> | ||||
<!-- Needed by old versions of Java plugin (JavaClasspath) --> | |||||
<dependency> | |||||
<groupId>org.apache.maven</groupId> | |||||
<artifactId>maven-core</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.maven</groupId> | |||||
<artifactId>maven-artifact</artifactId> | |||||
</dependency> | |||||
</dependencies> | </dependencies> | ||||
<build> | <build> |
</dependency> | </dependency> | ||||
<!-- TODO remove dependencies on Maven | |||||
but for now they should be defined with scope provided | |||||
--> | |||||
<dependency> | |||||
<groupId>org.apache.maven</groupId> | |||||
<artifactId>maven-plugin-api</artifactId> | |||||
<scope>provided</scope> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.maven</groupId> | |||||
<artifactId>maven-core</artifactId> | |||||
<scope>provided</scope> | |||||
</dependency> | |||||
<dependency> | <dependency> | ||||
<groupId>commons-codec</groupId> | <groupId>commons-codec</groupId> | ||||
<artifactId>commons-codec</artifactId> | <artifactId>commons-codec</artifactId> |
/* | |||||
* SonarQube, open source software quality management tool. | |||||
* Copyright (C) 2008-2014 SonarSource | |||||
* mailto:contact AT sonarsource DOT com | |||||
* | |||||
* SonarQube is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* SonarQube is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.api.batch; | |||||
import org.apache.maven.artifact.DependencyResolutionRequiredException; | |||||
import org.apache.maven.project.MavenProject; | |||||
import org.sonar.api.utils.SonarException; | |||||
import java.io.File; | |||||
import java.net.MalformedURLException; | |||||
import java.net.URL; | |||||
import java.net.URLClassLoader; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
/** | |||||
* @since 2.2 | |||||
* @deprecated since 4.5 this is some Java specific stuff that should by handled by SQ Java plugin | |||||
*/ | |||||
@Deprecated | |||||
@BatchSide | |||||
public class ProjectClasspath { | |||||
protected MavenProject pom; | |||||
private List<File> elements; | |||||
private URLClassLoader classloader; | |||||
public ProjectClasspath(MavenProject pom) { | |||||
this.pom = pom; | |||||
} | |||||
public URLClassLoader getClassloader() { | |||||
if (classloader == null) { | |||||
classloader = createClassLoader(); | |||||
} | |||||
return classloader; | |||||
} | |||||
/** | |||||
* bytecode directory + JARs (dependencies) | |||||
*/ | |||||
public List<File> getElements() { | |||||
if (elements == null) { | |||||
elements = createElements(); | |||||
} | |||||
return elements; | |||||
} | |||||
protected URLClassLoader createClassLoader() { | |||||
try { | |||||
List<URL> urls = new ArrayList<>(); | |||||
for (File file : getElements()) { | |||||
urls.add(file.toURI().toURL()); | |||||
} | |||||
return new URLClassLoader(urls.toArray(new URL[urls.size()]), null); | |||||
} catch (MalformedURLException e) { | |||||
throw new SonarException("Fail to create the project classloader. Classpath element is unvalid.", e); | |||||
} | |||||
} | |||||
protected List<File> createElements() { | |||||
try { | |||||
List<File> files = new ArrayList<>(); | |||||
if (pom.getCompileClasspathElements() != null) { | |||||
for (String classPathString : pom.getCompileClasspathElements()) { | |||||
files.add(new File(classPathString)); | |||||
} | |||||
} | |||||
if (pom.getBuild().getOutputDirectory() != null) { | |||||
File outputDirectoryFile = new File(pom.getBuild().getOutputDirectory()); | |||||
if (outputDirectoryFile.exists()) { | |||||
files.add(outputDirectoryFile); | |||||
} | |||||
} | |||||
return files; | |||||
} catch (DependencyResolutionRequiredException e) { | |||||
throw new SonarException("Fail to create the project classloader", e); | |||||
} | |||||
} | |||||
} |
/* | |||||
* SonarQube, open source software quality management tool. | |||||
* Copyright (C) 2008-2014 SonarSource | |||||
* mailto:contact AT sonarsource DOT com | |||||
* | |||||
* SonarQube is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* SonarQube is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.api.batch.maven; | |||||
import org.apache.commons.lang.StringUtils; | |||||
import org.apache.commons.lang.builder.ToStringBuilder; | |||||
import org.apache.maven.model.Plugin; | |||||
import org.apache.maven.model.ReportPlugin; | |||||
import org.apache.maven.project.MavenProject; | |||||
import org.codehaus.plexus.util.xml.Xpp3Dom; | |||||
import java.util.Collection; | |||||
import java.util.Iterator; | |||||
import java.util.List; | |||||
/** | |||||
* A class to handle maven plugins | |||||
* | |||||
* @since 1.10 | |||||
* @deprecated since 4.5 we don't want any dependency on Maven anymore | |||||
*/ | |||||
@Deprecated | |||||
public class MavenPlugin { | |||||
private static final String CONFIGURATION_ELEMENT = "configuration"; | |||||
private Plugin plugin; | |||||
private Xpp3Dom configuration; | |||||
/** | |||||
* Creates a MavenPlugin based on a Plugin | |||||
* | |||||
* @param plugin the plugin | |||||
*/ | |||||
public MavenPlugin(Plugin plugin) { | |||||
this.plugin = plugin; | |||||
this.configuration = (Xpp3Dom) plugin.getConfiguration(); | |||||
if (this.configuration == null) { | |||||
configuration = new Xpp3Dom(CONFIGURATION_ELEMENT); | |||||
plugin.setConfiguration(this.configuration); | |||||
} | |||||
} | |||||
/** | |||||
* Creates a Maven plugin based on artifact + group + version | |||||
* | |||||
* @param groupId the group id | |||||
* @param artifactId the artifact id | |||||
* @param version the version | |||||
*/ | |||||
public MavenPlugin(String groupId, String artifactId, String version) { | |||||
this.plugin = new Plugin(); | |||||
plugin.setGroupId(groupId); | |||||
plugin.setArtifactId(artifactId); | |||||
plugin.setVersion(version); | |||||
configuration = new Xpp3Dom(CONFIGURATION_ELEMENT); | |||||
plugin.setConfiguration(this.configuration); | |||||
} | |||||
/** | |||||
* @since 3.5 - see SONAR-4070 | |||||
* @return the XML node <configuration> of pom | |||||
*/ | |||||
public Xpp3Dom getConfigurationXmlNode() { | |||||
return configuration; | |||||
} | |||||
/** | |||||
* Sets the maven plugin version | |||||
* | |||||
* @param version the version | |||||
* @return this | |||||
*/ | |||||
public MavenPlugin setVersion(String version) { | |||||
this.plugin.setVersion(version); | |||||
return this; | |||||
} | |||||
/** | |||||
* @return the underlying plugin | |||||
*/ | |||||
public Plugin getPlugin() { | |||||
return plugin; | |||||
} | |||||
/** | |||||
* Gets a parameter of the plugin based on its key | |||||
* | |||||
* @param key the param key | |||||
* @return the parameter if exist, null otherwise | |||||
*/ | |||||
public String getParameter(String key) { | |||||
Xpp3Dom node = findNodeWith(key); | |||||
return node == null ? null : node.getValue(); | |||||
} | |||||
/** | |||||
* Gets a list of parameters of the plugin from a param key | |||||
* | |||||
* @param key param key with option-index snippet: e.g. item[0], item[1]. If no index snippet is passed, then | |||||
* 0 is default (index <=> index[0]) | |||||
* @return an array of parameters if any, an empty array otherwise | |||||
*/ | |||||
public String[] getParameters(String key) { | |||||
String[] keyParts = StringUtils.split(key, "/"); | |||||
Xpp3Dom node = configuration; | |||||
for (int i = 0; i < keyParts.length - 1; i++) { | |||||
node = getOrCreateChild(node, keyParts[i]); | |||||
} | |||||
Xpp3Dom[] children = node.getChildren(keyParts[keyParts.length - 1]); | |||||
String[] result = new String[children.length]; | |||||
for (int i = 0; i < children.length; i++) { | |||||
result[i] = children[i].getValue(); | |||||
} | |||||
return result; | |||||
} | |||||
/** | |||||
* Sets a parameter for the maven plugin. This will overrides an existing parameter. | |||||
* | |||||
* @param key the param key | |||||
* @param value the param value | |||||
* @return this | |||||
*/ | |||||
public MavenPlugin setParameter(String key, String value) { | |||||
checkKeyArgument(key); | |||||
String[] keyParts = StringUtils.split(key, "/"); | |||||
Xpp3Dom node = configuration; | |||||
for (String keyPart : keyParts) { | |||||
node = getOrCreateChild(node, keyPart); | |||||
} | |||||
node.setValue(value); | |||||
return this; | |||||
} | |||||
/** | |||||
* Sets a parameter to the maven plugin. Overrides existing parameter only id specified. | |||||
* | |||||
* @param key the param key | |||||
* @param value the param value | |||||
* @param override whether to override existing parameter | |||||
*/ | |||||
public void setParameter(String key, String value, boolean override) { | |||||
if (getParameter(key) == null || override) { | |||||
setParameter(key, value); | |||||
} | |||||
} | |||||
/** | |||||
* Removes all parameters from the maven plugin | |||||
*/ | |||||
public void removeParameters() { | |||||
configuration = new Xpp3Dom(CONFIGURATION_ELEMENT); | |||||
plugin.setConfiguration(this.configuration); | |||||
} | |||||
/** | |||||
* Adds a parameter to the maven plugin | |||||
* | |||||
* @param key the param key with option-index snippet: e.g. item[0], item[1]. If no index snippet is passed, then | |||||
* 0 is default (index <=> index[0]) | |||||
* @param value the param value | |||||
* @return this | |||||
*/ | |||||
public MavenPlugin addParameter(String key, String value) { | |||||
String[] keyParts = StringUtils.split(key, "/"); | |||||
Xpp3Dom node = configuration; | |||||
for (int i = 0; i < keyParts.length - 1; i++) { | |||||
node = getOrCreateChild(node, keyParts[i]); | |||||
} | |||||
Xpp3Dom leaf = new Xpp3Dom(keyParts[keyParts.length - 1]); | |||||
leaf.setValue(value); | |||||
node.addChild(leaf); | |||||
return this; | |||||
} | |||||
private static Xpp3Dom getOrCreateChild(Xpp3Dom node, String key) { | |||||
int childIndex = getIndex(key); | |||||
if (node.getChildren(removeIndexSnippet(key)).length <= childIndex) { | |||||
Xpp3Dom child = new Xpp3Dom(removeIndexSnippet(key)); | |||||
node.addChild(child); | |||||
return child; | |||||
} | |||||
return node.getChildren(removeIndexSnippet(key))[childIndex]; | |||||
} | |||||
private static int getIndex(String key) { | |||||
// parsing index-syntax (e.g. item[1]) | |||||
if (key.matches(".*?\\[\\d+\\]")) { | |||||
return Integer.parseInt(StringUtils.substringBetween(key, "[", "]")); | |||||
} | |||||
// for down-compatibility of api we fallback to default 0 | |||||
return 0; | |||||
} | |||||
private static String removeIndexSnippet(String key) { | |||||
return StringUtils.substringBefore(key, "["); | |||||
} | |||||
/** | |||||
* Remove a parameter from the maven plugin based on its key | |||||
* | |||||
* @param key param key with option-index snippet: e.g. item[0], item[1]. If no index snippet is passed, then | |||||
* 0 is default (index <=> index[0]) | |||||
*/ | |||||
public void removeParameter(String key) { | |||||
Xpp3Dom node = findNodeWith(key); | |||||
if (node != null) { | |||||
remove(node); | |||||
} | |||||
} | |||||
private Xpp3Dom findNodeWith(String key) { | |||||
checkKeyArgument(key); | |||||
String[] keyParts = key.split("/"); | |||||
Xpp3Dom node = configuration; | |||||
for (String keyPart : keyParts) { | |||||
if (node.getChildren(removeIndexSnippet(keyPart)).length <= getIndex(keyPart)) { | |||||
return null; | |||||
} | |||||
node = node.getChildren(removeIndexSnippet(keyPart))[getIndex(keyPart)]; | |||||
if (node == null) { | |||||
return null; | |||||
} | |||||
} | |||||
return node; | |||||
} | |||||
private static void remove(Xpp3Dom node) { | |||||
Xpp3Dom parent = node.getParent(); | |||||
for (int i = 0; i < parent.getChildCount(); i++) { | |||||
Xpp3Dom child = parent.getChild(i); | |||||
if (child.equals(node)) { | |||||
parent.removeChild(i); | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* @return whether the maven plugin has got configuration | |||||
*/ | |||||
public boolean hasConfiguration() { | |||||
return configuration.getChildCount() > 0; | |||||
} | |||||
private static void checkKeyArgument(String key) { | |||||
if (key == null) { | |||||
throw new IllegalArgumentException("Parameter 'key' should not be null."); | |||||
} | |||||
} | |||||
/** | |||||
* Registers a plugin in a project pom | |||||
* <p/> | |||||
* <p>Adds the plugin if it does not exist or amend its version if it does exist and specified</p> | |||||
* | |||||
* @param pom the project pom | |||||
* @param groupId the plugin group id | |||||
* @param artifactId the plugin artifact id | |||||
* @param version the plugin version | |||||
* @param overrideVersion whether to override the version if the plugin is already registered | |||||
* @return the registered plugin | |||||
*/ | |||||
public static MavenPlugin registerPlugin(MavenProject pom, String groupId, String artifactId, String version, boolean overrideVersion) { | |||||
MavenPlugin plugin = getPlugin(pom, groupId, artifactId); | |||||
if (plugin == null) { | |||||
plugin = new MavenPlugin(groupId, artifactId, version); | |||||
} else if (overrideVersion) { | |||||
plugin.setVersion(version); | |||||
} | |||||
// remove from pom | |||||
unregisterPlugin(pom, groupId, artifactId); | |||||
// register | |||||
pom.getBuild().addPlugin(plugin.getPlugin()); | |||||
return plugin; | |||||
} | |||||
/** | |||||
* Returns a plugin from a pom based on its group id and artifact id | |||||
* <p/> | |||||
* <p>It searches in the build section, then the reporting section and finally the pluginManagement section</p> | |||||
* | |||||
* @param pom the project pom | |||||
* @param groupId the plugin group id | |||||
* @param artifactId the plugin artifact id | |||||
* @return the plugin if it exists, null otherwise | |||||
*/ | |||||
public static MavenPlugin getPlugin(MavenProject pom, String groupId, String artifactId) { | |||||
if (pom == null) { | |||||
return null; | |||||
} | |||||
// look for plugin in <build> section | |||||
Plugin plugin = null; | |||||
if (pom.getBuildPlugins() != null) { | |||||
plugin = getPlugin(pom.getBuildPlugins(), groupId, artifactId); | |||||
} | |||||
// look for plugin in <report> section | |||||
if (plugin == null && pom.getReportPlugins() != null) { | |||||
plugin = getReportPlugin(pom.getReportPlugins(), groupId, artifactId); | |||||
} | |||||
// look for plugin in <pluginManagement> section | |||||
if (pom.getPluginManagement() != null) { | |||||
Plugin pluginManagement = getPlugin(pom.getPluginManagement().getPlugins(), groupId, artifactId); | |||||
if (plugin == null) { | |||||
plugin = pluginManagement; | |||||
} else if (pluginManagement != null) { | |||||
if (pluginManagement.getConfiguration() != null) { | |||||
if (plugin.getConfiguration() == null) { | |||||
plugin.setConfiguration(pluginManagement.getConfiguration()); | |||||
} else { | |||||
Xpp3Dom.mergeXpp3Dom((Xpp3Dom) plugin.getConfiguration(), (Xpp3Dom) pluginManagement.getConfiguration()); | |||||
} | |||||
} | |||||
if (plugin.getDependencies() == null && pluginManagement.getDependencies() != null) { | |||||
plugin.setDependencies(pluginManagement.getDependencies()); | |||||
} | |||||
if (plugin.getVersion() == null) { | |||||
plugin.setVersion(pluginManagement.getVersion()); | |||||
} | |||||
} | |||||
} | |||||
if (plugin != null) { | |||||
return new MavenPlugin(plugin); | |||||
} | |||||
return null; | |||||
} | |||||
private static Plugin getPlugin(Collection<Plugin> plugins, String groupId, String artifactId) { | |||||
if (plugins == null) { | |||||
return null; | |||||
} | |||||
for (Plugin plugin : plugins) { | |||||
if (MavenUtils.equals(plugin, groupId, artifactId)) { | |||||
return plugin; | |||||
} | |||||
} | |||||
return null; | |||||
} | |||||
private static Plugin getReportPlugin(Collection<ReportPlugin> plugins, String groupId, String artifactId) { | |||||
if (plugins == null) { | |||||
return null; | |||||
} | |||||
for (ReportPlugin plugin : plugins) { | |||||
if (MavenUtils.equals(plugin, groupId, artifactId)) { | |||||
return cloneReportPluginToPlugin(plugin); | |||||
} | |||||
} | |||||
return null; | |||||
} | |||||
private static Plugin cloneReportPluginToPlugin(ReportPlugin reportPlugin) { | |||||
Plugin plugin = new Plugin(); | |||||
plugin.setGroupId(reportPlugin.getGroupId()); | |||||
plugin.setArtifactId(reportPlugin.getArtifactId()); | |||||
plugin.setVersion(reportPlugin.getVersion()); | |||||
plugin.setConfiguration(reportPlugin.getConfiguration()); | |||||
return plugin; | |||||
} | |||||
private static void unregisterPlugin(MavenProject pom, String groupId, String artifactId) { | |||||
if (pom.getPluginManagement() != null && pom.getPluginManagement().getPlugins() != null) { | |||||
unregisterPlugin(pom.getPluginManagement().getPlugins(), groupId, artifactId); | |||||
} | |||||
List plugins = pom.getBuildPlugins(); | |||||
if (plugins != null) { | |||||
unregisterPlugin(plugins, groupId, artifactId); | |||||
} | |||||
plugins = pom.getReportPlugins(); | |||||
if (plugins != null) { | |||||
unregisterReportPlugin(plugins, groupId, artifactId); | |||||
} | |||||
} | |||||
private static void unregisterPlugin(List<Plugin> plugins, String groupId, String artifactId) { | |||||
for (Iterator<Plugin> iterator = plugins.iterator(); iterator.hasNext();) { | |||||
Plugin p = iterator.next(); | |||||
if (MavenUtils.equals(p, groupId, artifactId)) { | |||||
iterator.remove(); | |||||
} | |||||
} | |||||
} | |||||
private static void unregisterReportPlugin(List<ReportPlugin> plugins, String groupId, String artifactId) { | |||||
for (Iterator<ReportPlugin> iterator = plugins.iterator(); iterator.hasNext();) { | |||||
ReportPlugin p = iterator.next(); | |||||
if (MavenUtils.equals(p, groupId, artifactId)) { | |||||
iterator.remove(); | |||||
} | |||||
} | |||||
} | |||||
@Override | |||||
public String toString() { | |||||
return new ToStringBuilder(this) | |||||
.append("groupId", plugin.getGroupId()) | |||||
.append("artifactId", plugin.getArtifactId()) | |||||
.append("version", plugin.getVersion()) | |||||
.toString(); | |||||
} | |||||
} |
/* | |||||
* SonarQube, open source software quality management tool. | |||||
* Copyright (C) 2008-2014 SonarSource | |||||
* mailto:contact AT sonarsource DOT com | |||||
* | |||||
* SonarQube is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* SonarQube is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.api.batch.maven; | |||||
import org.sonar.api.resources.Project; | |||||
/** | |||||
* @since 1.10 | |||||
* @deprecated since 4.5 we don't want any dependency on Maven anymore | |||||
*/ | |||||
@Deprecated | |||||
public final class MavenSurefireUtils { | |||||
public static final String GROUP_ID = MavenUtils.GROUP_ID_APACHE_MAVEN; | |||||
public static final String ARTIFACT_ID = "maven-surefire-plugin"; | |||||
public static final String VERSION = "2.4.3"; | |||||
private MavenSurefireUtils() { | |||||
} | |||||
/** | |||||
* Configures the project POM with base required surefire settings | |||||
* | |||||
* @param project the project currently analyzed | |||||
* @return the configured surefire MavenPlugin object instance, cannot be null | |||||
*/ | |||||
public static MavenPlugin configure(Project project) { | |||||
MavenPlugin surefire = MavenPlugin.registerPlugin(project.getPom(), GROUP_ID, ARTIFACT_ID, VERSION, false); | |||||
surefire.setParameter("disableXmlReport", "false"); | |||||
surefire.setParameter("testFailureIgnore", "true"); | |||||
return surefire; | |||||
} | |||||
} |
/* | |||||
* SonarQube, open source software quality management tool. | |||||
* Copyright (C) 2008-2014 SonarSource | |||||
* mailto:contact AT sonarsource DOT com | |||||
* | |||||
* SonarQube is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* SonarQube is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.api.batch.maven; | |||||
import org.apache.commons.lang.StringUtils; | |||||
import org.apache.maven.model.Plugin; | |||||
import org.apache.maven.model.ReportPlugin; | |||||
import org.apache.maven.project.MavenProject; | |||||
import org.sonar.api.utils.log.Loggers; | |||||
import java.nio.charset.Charset; | |||||
import java.util.Collection; | |||||
/** | |||||
* An utility class to manipulate Maven concepts | |||||
* | |||||
* @since 1.10 | |||||
* @deprecated since 4.5 we don't want any dependency on Maven anymore | |||||
*/ | |||||
@Deprecated | |||||
public final class MavenUtils { | |||||
private static final String MAVEN_COMPILER_PLUGIN = "maven-compiler-plugin"; | |||||
public static final String GROUP_ID_APACHE_MAVEN = "org.apache.maven.plugins"; | |||||
public static final String GROUP_ID_CODEHAUS_MOJO = "org.codehaus.mojo"; | |||||
private MavenUtils() { | |||||
// utility class with only static methods | |||||
} | |||||
/** | |||||
* Returns the version of Java used by the maven compiler plugin | |||||
* | |||||
* @param pom the project pom | |||||
* @return the java version | |||||
*/ | |||||
public static String getJavaVersion(MavenProject pom) { | |||||
MavenPlugin compilerPlugin = MavenPlugin.getPlugin(pom, GROUP_ID_APACHE_MAVEN, MAVEN_COMPILER_PLUGIN); | |||||
if (compilerPlugin != null) { | |||||
return compilerPlugin.getParameter("target"); | |||||
} | |||||
return null; | |||||
} | |||||
public static String getJavaSourceVersion(MavenProject pom) { | |||||
MavenPlugin compilerPlugin = MavenPlugin.getPlugin(pom, GROUP_ID_APACHE_MAVEN, MAVEN_COMPILER_PLUGIN); | |||||
if (compilerPlugin != null) { | |||||
return compilerPlugin.getParameter("source"); | |||||
} | |||||
return null; | |||||
} | |||||
/** | |||||
* Queries a collection of plugins based on a group id and an artifact id and returns the plugin if it exists | |||||
* | |||||
* @param plugins the plugins collection | |||||
* @param groupId the group id | |||||
* @param artifactId the artifact id | |||||
* @return the corresponding plugin if it exists, null otherwise | |||||
*/ | |||||
public static Plugin getPlugin(Collection<Plugin> plugins, String groupId, String artifactId) { | |||||
if (plugins != null) { | |||||
for (Plugin plugin : plugins) { | |||||
if (equals(plugin, groupId, artifactId)) { | |||||
return plugin; | |||||
} | |||||
} | |||||
} | |||||
return null; | |||||
} | |||||
/** | |||||
* Tests whether a plugin has got a given artifact id and group id | |||||
* | |||||
* @param plugin the plugin to test | |||||
* @param groupId the group id | |||||
* @param artifactId the artifact id | |||||
* @return whether the plugin has got group + artifact ids | |||||
*/ | |||||
public static boolean equals(Plugin plugin, String groupId, String artifactId) { | |||||
if (plugin != null && plugin.getArtifactId().equals(artifactId)) { | |||||
if (plugin.getGroupId() == null) { | |||||
return groupId == null || groupId.equals(MavenUtils.GROUP_ID_APACHE_MAVEN) || groupId.equals(MavenUtils.GROUP_ID_CODEHAUS_MOJO); | |||||
} | |||||
return plugin.getGroupId().equals(groupId); | |||||
} | |||||
return false; | |||||
} | |||||
/** | |||||
* Tests whether a ReportPlugin has got a given artifact id and group id | |||||
* | |||||
* @param plugin the ReportPlugin to test | |||||
* @param groupId the group id | |||||
* @param artifactId the artifact id | |||||
* @return whether the ReportPlugin has got group + artifact ids | |||||
*/ | |||||
public static boolean equals(ReportPlugin plugin, String groupId, String artifactId) { | |||||
if (plugin != null && plugin.getArtifactId().equals(artifactId)) { | |||||
if (plugin.getGroupId() == null) { | |||||
return groupId == null || groupId.equals(MavenUtils.GROUP_ID_APACHE_MAVEN) || groupId.equals(MavenUtils.GROUP_ID_CODEHAUS_MOJO); | |||||
} | |||||
return plugin.getGroupId().equals(groupId); | |||||
} | |||||
return false; | |||||
} | |||||
/** | |||||
* @return source encoding | |||||
*/ | |||||
public static String getSourceEncoding(MavenProject pom) { | |||||
return pom.getProperties().getProperty("project.build.sourceEncoding"); | |||||
} | |||||
/** | |||||
* Returns the charset of a pom | |||||
* | |||||
* @param pom the project pom | |||||
* @return the charset | |||||
*/ | |||||
public static Charset getSourceCharset(MavenProject pom) { | |||||
String encoding = getSourceEncoding(pom); | |||||
if (StringUtils.isNotEmpty(encoding)) { | |||||
try { | |||||
return Charset.forName(encoding); | |||||
} catch (Exception e) { | |||||
Loggers.get(MavenUtils.class).warn("Can not get project charset", e); | |||||
} | |||||
} | |||||
return Charset.defaultCharset(); | |||||
} | |||||
} |
*/ | */ | ||||
package org.sonar.api.resources; | package org.sonar.api.resources; | ||||
import java.util.ArrayList; | |||||
import java.util.Date; | |||||
import java.util.List; | |||||
import javax.annotation.CheckForNull; | |||||
import javax.annotation.Nullable; | |||||
import org.apache.commons.lang.StringUtils; | import org.apache.commons.lang.StringUtils; | ||||
import org.apache.commons.lang.builder.ToStringBuilder; | import org.apache.commons.lang.builder.ToStringBuilder; | ||||
import org.apache.maven.project.MavenProject; | |||||
import org.sonar.api.CoreProperties; | import org.sonar.api.CoreProperties; | ||||
import org.sonar.api.batch.fs.FileSystem; | import org.sonar.api.batch.fs.FileSystem; | ||||
import org.sonar.api.component.Component; | import org.sonar.api.component.Component; | ||||
import org.sonar.api.config.Settings; | import org.sonar.api.config.Settings; | ||||
import javax.annotation.CheckForNull; | |||||
import javax.annotation.Nullable; | |||||
import java.util.ArrayList; | |||||
import java.util.Date; | |||||
import java.util.List; | |||||
/** | /** | ||||
* A class that manipulates Projects in the Sonar way. | * A class that manipulates Projects in the Sonar way. | ||||
* | * | ||||
} | } | ||||
} | } | ||||
private MavenProject pom; | |||||
private String branch; | private String branch; | ||||
private ProjectFileSystem fileSystem; | private ProjectFileSystem fileSystem; | ||||
private String name; | private String name; | ||||
private String description; | private String description; | ||||
private String packaging; | |||||
private Language language; | private Language language; | ||||
private Date analysisDate; | private Date analysisDate; | ||||
private AnalysisType analysisType; | private AnalysisType analysisType; | ||||
return this; | return this; | ||||
} | } | ||||
/** | |||||
* For internal use only. | |||||
*/ | |||||
public final Project setPom(MavenProject pom) { | |||||
this.pom = pom; | |||||
return this; | |||||
} | |||||
/** | |||||
* @return the project's packaging | |||||
* @deprecated in 2.8. See http://jira.sonarsource.com/browse/SONAR-2341 | |||||
*/ | |||||
@Deprecated | |||||
public String getPackaging() { | |||||
return packaging; | |||||
} | |||||
@Override | @Override | ||||
public String getName() { | public String getName() { | ||||
return name; | return name; | ||||
return this; | return this; | ||||
} | } | ||||
/** | |||||
* For internal use only. | |||||
* | |||||
* @deprecated in 2.8. See http://jira.sonarsource.com/browse/SONAR-2341 | |||||
*/ | |||||
@Deprecated | |||||
public Project setPackaging(String packaging) { | |||||
this.packaging = packaging; | |||||
return this; | |||||
} | |||||
/** | /** | ||||
* @return whether the current project is root project | * @return whether the current project is root project | ||||
*/ | */ | ||||
return this; | return this; | ||||
} | } | ||||
/** | |||||
* @deprecated since 2.5. See http://jira.sonarsource.com/browse/SONAR-2011 | |||||
*/ | |||||
@Deprecated | |||||
public String getGroupId() { | |||||
return pom.getGroupId(); | |||||
} | |||||
/** | |||||
* @deprecated since 2.5. See http://jira.sonarsource.com/browse/SONAR-2011 | |||||
*/ | |||||
@Deprecated | |||||
public String getArtifactId() { | |||||
return pom.getArtifactId(); | |||||
} | |||||
/** | |||||
* @return the underlying Maven project | |||||
* @deprecated since 2.5. See http://jira.sonarsource.com/browse/SONAR-2011 , | |||||
* MavenProject can be retrieved as an IoC dependency | |||||
*/ | |||||
@Deprecated | |||||
public MavenProject getPom() { | |||||
return pom; | |||||
} | |||||
public static Project createFromMavenIds(String groupId, String artifactId) { | public static Project createFromMavenIds(String groupId, String artifactId) { | ||||
return createFromMavenIds(groupId, artifactId, null); | return createFromMavenIds(groupId, artifactId, null); | ||||
} | } |
/* | |||||
* SonarQube, open source software quality management tool. | |||||
* Copyright (C) 2008-2014 SonarSource | |||||
* mailto:contact AT sonarsource DOT com | |||||
* | |||||
* SonarQube is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* SonarQube is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.api.batch.maven; | |||||
import org.apache.maven.model.Plugin; | |||||
import org.apache.maven.project.MavenProject; | |||||
import org.junit.Before; | |||||
import org.junit.Test; | |||||
import org.sonar.api.test.MavenTestUtils; | |||||
import static org.assertj.core.api.Assertions.assertThat; | |||||
public class MavenPluginTest { | |||||
private MavenPlugin fakePlugin; | |||||
@Before | |||||
public void initPlugin() { | |||||
fakePlugin = new MavenPlugin("foo", "bar", "1.0"); | |||||
} | |||||
@Test | |||||
public void getConfigurationXmlNode() { | |||||
assertThat(fakePlugin.getConfigurationXmlNode()).isNotNull(); | |||||
assertThat(fakePlugin.getConfigurationXmlNode().getName()).isEqualTo("configuration"); | |||||
} | |||||
@Test | |||||
public void removeParameters() { | |||||
fakePlugin | |||||
.setParameter("foo", "bar") | |||||
.setParameter("hello", "world") | |||||
.removeParameters(); | |||||
assertThat(fakePlugin.getParameter("foo")).isNull(); | |||||
assertThat(fakePlugin.getParameter("hello")).isNull(); | |||||
assertThat(fakePlugin.hasConfiguration()).isFalse(); | |||||
} | |||||
@Test | |||||
public void shouldWriteAndReadSimpleConfiguration() { | |||||
fakePlugin.setParameter("abc", "test"); | |||||
assertThat(fakePlugin.getParameter("abc")).isEqualTo("test"); | |||||
} | |||||
@Test | |||||
public void shouldWriteAndReadComplexConfiguration() { | |||||
fakePlugin.setParameter("abc/def/ghi", "test"); | |||||
assertThat(fakePlugin.getParameter("abc/def/ghi")).isEqualTo("test"); | |||||
} | |||||
@Test | |||||
public void shouldReturnNullWhenChildNotFound() { | |||||
assertThat(fakePlugin.getParameter("abc/def/ghi")).isNull(); | |||||
} | |||||
@Test(expected = IllegalArgumentException.class) | |||||
public void getChildValueShouldThrowExceptionWhenKeyIsNull() { | |||||
fakePlugin.getParameter(null); | |||||
} | |||||
@Test(expected = IllegalArgumentException.class) | |||||
public void setChildValueShouldThrowExceptionWhenKeyIsNull() { | |||||
fakePlugin.setParameter(null, null); | |||||
} | |||||
@Test | |||||
public void shouldRemoveParameter() { | |||||
fakePlugin.setParameter("abc", "1"); | |||||
assertThat(fakePlugin.getParameter("abc")).isNotNull(); | |||||
fakePlugin.removeParameter("abc"); | |||||
assertThat(fakePlugin.getParameter("abc")).isNull(); | |||||
} | |||||
@Test | |||||
public void shouldRemoveNestedParameter() { | |||||
fakePlugin.setParameter("abc/def", "1"); | |||||
assertThat(fakePlugin.getParameter("abc/def")).isNotNull(); | |||||
fakePlugin.removeParameter("abc/def"); | |||||
assertThat(fakePlugin.getParameter("abc/def")).isNull(); | |||||
} | |||||
@Test | |||||
public void shouldRemoveNestedParameterButLeaveTheParent() { | |||||
fakePlugin.setParameter("abc/x", "1"); | |||||
fakePlugin.setParameter("abc/y", "2"); | |||||
fakePlugin.removeParameter("abc/x"); | |||||
assertThat(fakePlugin.getParameter("abc/y")).isNotNull(); | |||||
} | |||||
@Test | |||||
public void shouldRemoveUnfoundChildWithoutError() { | |||||
fakePlugin.removeParameter("abc/def"); | |||||
} | |||||
@Test | |||||
public void shouldSetParameter() { | |||||
fakePlugin.addParameter("exclude", "abc"); | |||||
assertThat(fakePlugin.getParameter("exclude")).isEqualTo("abc"); | |||||
assertThat(fakePlugin.getParameters("exclude")).containsOnly("abc"); | |||||
} | |||||
@Test | |||||
public void shouldOverrideNestedParameter() { | |||||
fakePlugin.setParameter("excludes/exclude", "abc"); | |||||
fakePlugin.setParameter("excludes/exclude", "overridden"); | |||||
assertThat(fakePlugin.getParameter("excludes/exclude")).isEqualTo("overridden"); | |||||
assertThat(fakePlugin.getParameters("excludes/exclude")).containsOnly("overridden"); | |||||
} | |||||
@Test | |||||
public void shouldOverriddeParameter() { | |||||
fakePlugin.setParameter("exclude", "abc"); | |||||
fakePlugin.setParameter("exclude", "overridden"); | |||||
assertThat(fakePlugin.getParameter("exclude")).isEqualTo("overridden"); | |||||
assertThat(fakePlugin.getParameters("exclude")).containsOnly("overridden"); | |||||
} | |||||
@Test | |||||
public void shouldAddNestedParameter() { | |||||
fakePlugin.addParameter("excludes/exclude", "abc"); | |||||
assertThat(fakePlugin.getParameter("excludes/exclude")).isEqualTo("abc"); | |||||
assertThat(fakePlugin.getParameters("excludes/exclude")).containsOnly("abc"); | |||||
} | |||||
@Test | |||||
public void shouldAddManyValuesToTheSameParameter() { | |||||
fakePlugin.addParameter("excludes/exclude", "abc"); | |||||
fakePlugin.addParameter("excludes/exclude", "def"); | |||||
assertThat(fakePlugin.getParameters("excludes/exclude")).containsOnly("abc", "def"); | |||||
} | |||||
@Test | |||||
public void defaultParameterIndexIsZero() { | |||||
fakePlugin.addParameter("items/item/entry", "value1"); | |||||
fakePlugin.addParameter("items/item/entry", "value2"); | |||||
assertThat(fakePlugin.getParameters("items/item/entry")).containsOnly("value1", "value2"); | |||||
assertThat(fakePlugin.getParameters("items/item[0]/entry")).containsOnly("value1", "value2"); | |||||
} | |||||
@Test | |||||
public void addIndexedParameters() { | |||||
fakePlugin.addParameter("items/item[0]/entry", "value1"); | |||||
fakePlugin.addParameter("items/item[1]/entry", "value2"); | |||||
assertThat(fakePlugin.getParameter("items/item[0]/entry")).isEqualTo("value1"); | |||||
assertThat(fakePlugin.getParameters("items/item[0]/entry")).containsOnly("value1"); | |||||
assertThat(fakePlugin.getParameter("items/item[1]/entry")).isEqualTo("value2"); | |||||
assertThat(fakePlugin.getParameters("items/item[1]/entry")).containsOnly("value2"); | |||||
//ensure that indexes aren't serialized to real configuration | |||||
assertThat(fakePlugin.getPlugin().getConfiguration().toString()).doesNotContain("item[0]"); | |||||
assertThat(fakePlugin.getPlugin().getConfiguration().toString()).doesNotContain("item[1]"); | |||||
} | |||||
@Test | |||||
public void removeIndexedParameter() { | |||||
fakePlugin.addParameter("items/item[0]/entry", "value1"); | |||||
fakePlugin.addParameter("items/item[1]/entry", "value2"); | |||||
fakePlugin.removeParameter("items/item[1]"); | |||||
fakePlugin.removeParameter("items/notExists"); | |||||
assertThat(fakePlugin.getParameter("items/item[0]/entry")).isNotNull(); | |||||
assertThat(fakePlugin.getParameter("items/item[1]/entry")).isNull(); | |||||
assertThat(fakePlugin.getParameter("items/notExists")).isNull(); | |||||
} | |||||
@Test | |||||
public void registerNewPlugin() { | |||||
MavenProject pom = MavenTestUtils.loadPom(getClass(), "registerNewPlugin.xml"); | |||||
MavenPlugin mavenPlugin = MavenPlugin.registerPlugin(pom, "mygroup", "my.artifact", "1.0", true); | |||||
assertThat(mavenPlugin).isNotNull(); | |||||
Plugin plugin = MavenUtils.getPlugin(pom.getBuildPlugins(), "mygroup", "my.artifact"); | |||||
assertThat(plugin).isNotNull(); | |||||
assertThat(plugin.getVersion()).isEqualTo("1.0"); | |||||
} | |||||
@Test | |||||
public void overridePluginManagementSection() { | |||||
MavenProject pom = MavenTestUtils.loadPom(getClass(), "overridePluginManagementSection.xml"); | |||||
MavenPlugin mavenPlugin = MavenPlugin.registerPlugin(pom, "mygroup", "my.artifact", "1.0", true); | |||||
assertThat(mavenPlugin).isNotNull(); | |||||
Plugin plugin = MavenUtils.getPlugin(pom.getBuildPlugins(), "mygroup", "my.artifact"); | |||||
assertThat(plugin).isNotNull(); | |||||
assertThat(plugin.getVersion()).isEqualTo("1.0"); | |||||
Plugin pluginManagement = MavenUtils.getPlugin(pom.getPluginManagement().getPlugins(), "mygroup", "my.artifact"); | |||||
assertThat(pluginManagement).isNull(); | |||||
} | |||||
@Test | |||||
public void doNotOverrideVersionFromPluginManagementSection() { | |||||
MavenProject pom = MavenTestUtils.loadPom(getClass(), "overridePluginManagementSection.xml"); | |||||
MavenPlugin mavenPlugin = MavenPlugin.registerPlugin(pom, "mygroup", "my.artifact", "1.0", false); | |||||
assertThat(mavenPlugin).isNotNull(); | |||||
Plugin plugin = MavenUtils.getPlugin(pom.getBuildPlugins(), "mygroup", "my.artifact"); | |||||
assertThat(plugin).isNotNull(); | |||||
assertThat(plugin.getVersion()).isEqualTo("0.9"); | |||||
Plugin pluginManagement = MavenUtils.getPlugin(pom.getPluginManagement().getPlugins(), "mygroup", "my.artifact"); | |||||
assertThat(pluginManagement).isNull(); | |||||
} | |||||
@Test | |||||
public void keepPluginManagementDependencies() { | |||||
MavenProject pom = MavenTestUtils.loadPom(getClass(), "keepPluginManagementDependencies.xml"); | |||||
MavenPlugin mavenPlugin = MavenPlugin.registerPlugin(pom, "mygroup", "my.artifact", "1.0", false); | |||||
assertThat(mavenPlugin).isNotNull(); | |||||
Plugin plugin = MavenUtils.getPlugin(pom.getBuildPlugins(), "mygroup", "my.artifact"); | |||||
assertThat(plugin).isNotNull(); | |||||
assertThat(plugin.getVersion()).isEqualTo("0.9"); | |||||
assertThat(plugin.getDependencies().size()).isEqualTo(1); | |||||
} | |||||
@Test | |||||
public void keepPluginDependencies() { | |||||
MavenProject pom = MavenTestUtils.loadPom(getClass(), "keepPluginDependencies.xml"); | |||||
MavenPlugin mavenPlugin = MavenPlugin.registerPlugin(pom, "mygroup", "my.artifact", "1.0", false); | |||||
assertThat(mavenPlugin).isNotNull(); | |||||
Plugin plugin = MavenUtils.getPlugin(pom.getBuildPlugins(), "mygroup", "my.artifact"); | |||||
assertThat(plugin).isNotNull(); | |||||
assertThat(plugin.getVersion()).isEqualTo("0.9"); | |||||
assertThat(plugin.getDependencies().size()).isEqualTo(1); | |||||
} | |||||
@Test | |||||
public void mergeSettings() { | |||||
MavenProject pom = MavenTestUtils.loadPom(getClass(), "mergeSettings.xml"); | |||||
MavenPlugin.registerPlugin(pom, "mygroup", "my.artifact", "1.0", false); | |||||
MavenPlugin plugin = MavenPlugin.getPlugin(pom, "mygroup", "my.artifact"); | |||||
assertThat(plugin).isNotNull(); | |||||
assertThat(plugin.getPlugin().getVersion()).isEqualTo("0.9"); | |||||
assertThat(plugin.getParameter("foo")).isEqualTo("bar"); | |||||
} | |||||
@Test | |||||
public void overrideVersionFromPluginManagement() { | |||||
MavenProject pom = MavenTestUtils.loadPom(getClass(), "overrideVersionFromPluginManagement.xml"); | |||||
MavenPlugin.registerPlugin(pom, "mygroup", "my.artifact", "1.0", true); | |||||
MavenPlugin plugin = MavenPlugin.getPlugin(pom, "mygroup", "my.artifact"); | |||||
assertThat(plugin).isNotNull(); | |||||
assertThat(plugin.getPlugin().getVersion()).isEqualTo("1.0"); | |||||
assertThat(plugin.getParameter("foo")).isEqualTo("bar"); | |||||
} | |||||
@Test | |||||
public void overrideVersion() { | |||||
MavenProject pom = MavenTestUtils.loadPom(getClass(), "overrideVersion.xml"); | |||||
MavenPlugin.registerPlugin(pom, "mygroup", "my.artifact", "1.0", true); | |||||
MavenPlugin plugin = MavenPlugin.getPlugin(pom, "mygroup", "my.artifact"); | |||||
assertThat(plugin).isNotNull(); | |||||
assertThat(plugin.getPlugin().getVersion()).isEqualTo("1.0"); | |||||
assertThat(plugin.getParameter("foo")).isEqualTo("bar"); | |||||
} | |||||
@Test | |||||
public void getConfigurationFromReport() { | |||||
MavenProject pom = MavenTestUtils.loadPom(getClass(), "getConfigurationFromReport.xml"); | |||||
MavenPlugin.registerPlugin(pom, "mygroup", "my.artifact", "1.0", true); | |||||
assertThat(pom.getBuildPlugins().size()).isEqualTo(1); | |||||
assertThat(pom.getReportPlugins().size()).isEqualTo(0); | |||||
MavenPlugin plugin = MavenPlugin.getPlugin(pom, "mygroup", "my.artifact"); | |||||
assertThat(plugin).isNotNull(); | |||||
assertThat(plugin.getPlugin().getVersion()).isEqualTo("1.0"); | |||||
assertThat(plugin.getParameter("foo")).isEqualTo("bar"); | |||||
} | |||||
} |
/* | |||||
* SonarQube, open source software quality management tool. | |||||
* Copyright (C) 2008-2014 SonarSource | |||||
* mailto:contact AT sonarsource DOT com | |||||
* | |||||
* SonarQube is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* SonarQube is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.api.batch.maven; | |||||
import static org.junit.Assert.assertEquals; | |||||
import org.junit.Test; | |||||
import static org.mockito.Mockito.mock; | |||||
import static org.mockito.Mockito.when; | |||||
import org.sonar.api.resources.Project; | |||||
import org.sonar.api.test.MavenTestUtils; | |||||
public class MavenSurefireUtilsTest { | |||||
@Test | |||||
public void shouldConfigureProject() { | |||||
Project prj = mock(Project.class); | |||||
when(prj.getPom()).thenReturn(MavenTestUtils.loadPom("/org/sonar/api/batch/maven/MavenSurefireUtilsTest/MavenPom.xml")); | |||||
MavenPlugin configuredPlugin = MavenSurefireUtils.configure(prj); | |||||
assertEquals("true", configuredPlugin.getParameter("testFailureIgnore")); | |||||
assertEquals("false", configuredPlugin.getParameter("disableXmlReport")); | |||||
assertEquals(MavenSurefireUtils.VERSION, configuredPlugin.getPlugin().getVersion()); | |||||
} | |||||
} |
/* | |||||
* SonarQube, open source software quality management tool. | |||||
* Copyright (C) 2008-2014 SonarSource | |||||
* mailto:contact AT sonarsource DOT com | |||||
* | |||||
* SonarQube is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* SonarQube is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.api.batch.maven; | |||||
import org.apache.maven.project.MavenProject; | |||||
import org.junit.Before; | |||||
import org.junit.Test; | |||||
import org.sonar.api.test.MavenTestUtils; | |||||
import java.nio.charset.Charset; | |||||
import java.nio.charset.StandardCharsets; | |||||
import static org.hamcrest.Matchers.is; | |||||
import static org.junit.Assert.assertEquals; | |||||
import static org.junit.Assert.assertThat; | |||||
public class MavenUtilsTest { | |||||
private MavenProject pom; | |||||
@Before | |||||
public void setUp() { | |||||
pom = MavenTestUtils.loadPom("/org/sonar/api/batch/maven/MavenPom.xml"); | |||||
} | |||||
@Test | |||||
public void getJavaVersion() { | |||||
MavenProject pom = MavenTestUtils.loadPom(getClass(), "getJavaVersion.xml"); | |||||
assertThat(MavenUtils.getJavaVersion(pom), is("1.4")); | |||||
} | |||||
@Test | |||||
public void getJavaVersionFromPluginManagement() { | |||||
MavenProject pom = MavenTestUtils.loadPom(getClass(), "getJavaVersionFromPluginManagement.xml"); | |||||
assertThat(MavenUtils.getJavaVersion(pom), is("1.4")); | |||||
} | |||||
@Test | |||||
public void testDefaultSourceEncoding() { | |||||
assertEquals(MavenUtils.getSourceCharset(pom), Charset.defaultCharset()); | |||||
} | |||||
@Test | |||||
public void testSourceEncoding() { | |||||
MavenProject pom = MavenTestUtils.loadPom("/org/sonar/api/batch/maven/MavenPomWithSourceEncoding.xml"); | |||||
assertEquals(MavenUtils.getSourceCharset(pom), StandardCharsets.UTF_16); | |||||
} | |||||
} |
package org.sonar.api.resources; | package org.sonar.api.resources; | ||||
import org.junit.Test; | import org.junit.Test; | ||||
import org.sonar.api.test.MavenTestUtils; | |||||
import static org.assertj.core.api.Assertions.assertThat; | import static org.assertj.core.api.Assertions.assertThat; | ||||
public class ProjectTest { | public class ProjectTest { | ||||
@Test | |||||
public void equalsProject() { | |||||
Project project1 = MavenTestUtils.loadProjectFromPom(getClass(), "equalsProject/pom.xml"); | |||||
Project project2 = MavenTestUtils.loadProjectFromPom(getClass(), "equalsProject/pom.xml"); | |||||
assertThat(project1).isEqualTo(project2); | |||||
assertThat(project1).isNotEqualTo("foo:bar"); | |||||
assertThat(project1.hashCode()).isEqualTo(project2.hashCode()); | |||||
} | |||||
@Test | @Test | ||||
public void effectiveKeyShouldEqualKey() { | public void effectiveKeyShouldEqualKey() { | ||||
assertThat(new Project("my:project").getEffectiveKey()).isEqualTo("my:project"); | assertThat(new Project("my:project").getEffectiveKey()).isEqualTo("my:project"); |
/* | |||||
* SonarQube, open source software quality management tool. | |||||
* Copyright (C) 2008-2014 SonarSource | |||||
* mailto:contact AT sonarsource DOT com | |||||
* | |||||
* SonarQube is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* SonarQube is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.api.test; | |||||
import org.apache.commons.io.FileUtils; | |||||
import org.apache.commons.io.IOUtils; | |||||
import org.apache.maven.model.Model; | |||||
import org.apache.maven.model.io.xpp3.MavenXpp3Reader; | |||||
import org.apache.maven.project.MavenProject; | |||||
import org.sonar.api.batch.maven.MavenUtils; | |||||
import org.sonar.api.resources.InputFile; | |||||
import org.sonar.api.resources.Language; | |||||
import org.sonar.api.resources.Project; | |||||
import org.sonar.api.resources.ProjectFileSystem; | |||||
import org.sonar.api.resources.Resource; | |||||
import org.sonar.api.scan.filesystem.PathResolver; | |||||
import org.sonar.api.utils.SonarException; | |||||
import java.io.File; | |||||
import java.io.FileReader; | |||||
import java.io.IOException; | |||||
import java.nio.charset.Charset; | |||||
import java.util.ArrayList; | |||||
import java.util.Arrays; | |||||
import java.util.List; | |||||
import static org.mockito.Mockito.mock; | |||||
import static org.mockito.Mockito.when; | |||||
public final class MavenTestUtils { | |||||
public static MavenProject loadPom(Class clazz, String path) { | |||||
String fullpath = "/" + clazz.getName().replaceAll("\\.", "/") + "/" + path; | |||||
return loadPom(fullpath); | |||||
} | |||||
public static MavenProject loadPom(String pomUrlInClasspath) { | |||||
FileReader fileReader = null; | |||||
try { | |||||
File pomFile = new File(MavenTestUtils.class.getResource(pomUrlInClasspath).toURI()); | |||||
MavenXpp3Reader pomReader = new MavenXpp3Reader(); | |||||
fileReader = new FileReader(pomFile); | |||||
Model model = pomReader.read(fileReader); | |||||
MavenProject project = new MavenProject(model); | |||||
project.setFile(pomFile); | |||||
project.getBuild().setDirectory(pomFile.getParentFile().getPath()); | |||||
project.addCompileSourceRoot(pomFile.getParentFile().getPath() + "/src/main/java"); | |||||
project.addTestCompileSourceRoot(pomFile.getParentFile().getPath() + "/src/test/java"); | |||||
return project; | |||||
} catch (Exception e) { | |||||
throw new SonarException("Failed to read Maven project file : " + pomUrlInClasspath, e); | |||||
} finally { | |||||
IOUtils.closeQuietly(fileReader); | |||||
} | |||||
} | |||||
public static Project loadProjectFromPom(Class clazz, String path) { | |||||
MavenProject pom = loadPom(clazz, path); | |||||
Project project = new Project(pom.getGroupId() + ":" + pom.getArtifactId()) | |||||
.setPom(pom); | |||||
// configuration.setProperty("sonar.java.source", MavenUtils.getJavaSourceVersion(pom)); | |||||
// configuration.setProperty("sonar.java.target", MavenUtils.getJavaVersion(pom)); | |||||
// configuration.setProperty(CoreProperties.ENCODING_PROPERTY, MavenUtils.getSourceEncoding(pom)); | |||||
project.setFileSystem(new MavenModuleFileSystem(pom)); | |||||
return project; | |||||
} | |||||
public static MavenProject mockPom(String packaging) { | |||||
MavenProject mavenProject = mock(MavenProject.class); | |||||
when(mavenProject.getPackaging()).thenReturn(packaging); | |||||
return mavenProject; | |||||
} | |||||
static class MavenModuleFileSystem implements ProjectFileSystem { | |||||
private MavenProject pom; | |||||
MavenModuleFileSystem(MavenProject pom) { | |||||
this.pom = pom; | |||||
} | |||||
public Charset getSourceCharset() { | |||||
return Charset.forName(MavenUtils.getSourceEncoding(pom)); | |||||
} | |||||
public File getBasedir() { | |||||
return pom.getBasedir(); | |||||
} | |||||
public File getBuildDir() { | |||||
return new File(pom.getBuild().getDirectory()); | |||||
} | |||||
public File getBuildOutputDir() { | |||||
return new File(pom.getBuild().getOutputDirectory()); | |||||
} | |||||
public List<File> getSourceDirs() { | |||||
return Arrays.asList(new File(pom.getBuild().getSourceDirectory())); | |||||
} | |||||
public ProjectFileSystem addSourceDir(File dir) { | |||||
throw new UnsupportedOperationException(); | |||||
} | |||||
public List<File> getTestDirs() { | |||||
return null; | |||||
} | |||||
public ProjectFileSystem addTestDir(File dir) { | |||||
throw new UnsupportedOperationException(); | |||||
} | |||||
public File getReportOutputDir() { | |||||
return null; | |||||
} | |||||
public File getSonarWorkingDirectory() { | |||||
File dir = new File(getBuildDir(), "sonar"); | |||||
try { | |||||
FileUtils.forceMkdir(dir); | |||||
} catch (IOException e) { | |||||
throw new IllegalStateException(e); | |||||
} | |||||
return dir; | |||||
} | |||||
public File resolvePath(String path) { | |||||
return new PathResolver().relativeFile(getBasedir(), path); | |||||
} | |||||
public List<File> getSourceFiles(Language... langs) { | |||||
return new ArrayList(FileUtils.listFiles(getSourceDirs().get(0), new String[] {"java"}, true)); | |||||
} | |||||
public List<File> getJavaSourceFiles() { | |||||
return getSourceFiles(); | |||||
} | |||||
public boolean hasJavaSourceFiles() { | |||||
return !getJavaSourceFiles().isEmpty(); | |||||
} | |||||
public List<File> getTestFiles(Language... langs) { | |||||
return new ArrayList(FileUtils.listFiles(getTestDirs().get(0), new String[] {"java"}, true)); | |||||
} | |||||
public boolean hasTestFiles(Language lang) { | |||||
return !getTestFiles(lang).isEmpty(); | |||||
} | |||||
public File writeToWorkingDirectory(String content, String fileName) throws IOException { | |||||
throw new UnsupportedOperationException(); | |||||
} | |||||
public File getFileFromBuildDirectory(String filename) { | |||||
throw new UnsupportedOperationException(); | |||||
} | |||||
public Resource toResource(File file) { | |||||
throw new UnsupportedOperationException(); | |||||
} | |||||
public List<InputFile> mainFiles(String... langs) { | |||||
throw new UnsupportedOperationException(); | |||||
} | |||||
public List<InputFile> testFiles(String... langs) { | |||||
throw new UnsupportedOperationException(); | |||||
} | |||||
} | |||||
} |
/* | |||||
* SonarQube, open source software quality management tool. | |||||
* Copyright (C) 2008-2014 SonarSource | |||||
* mailto:contact AT sonarsource DOT com | |||||
* | |||||
* SonarQube is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* SonarQube is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.api.test; | |||||
import org.apache.maven.project.MavenProject; | |||||
import org.sonar.api.resources.Project; | |||||
import static org.mockito.Mockito.when; | |||||
public class ProjectTestBuilder { | |||||
private MavenProject pom = MavenTestUtils.mockPom("jar"); | |||||
public Project build() { | |||||
when(pom.getGroupId()).thenReturn("mygroup"); | |||||
when(pom.getArtifactId()).thenReturn("myartifact"); | |||||
when(pom.isExecutionRoot()).thenReturn(true); | |||||
return new Project("mygroup:myartifact").setPom(pom); | |||||
} | |||||
} |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||||
<modelVersion>4.0.0</modelVersion> | |||||
<groupId>foo</groupId> | |||||
<artifactId>foo</artifactId> | |||||
</project> |
this is an hidden file |
file in hidden dir |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||||
<modelVersion>4.0.0</modelVersion> | |||||
<groupId>foo</groupId> | |||||
<artifactId>foo</artifactId> | |||||
<packaging>jar</packaging> | |||||
<build> | |||||
<plugins> | |||||
<plugin> | |||||
<groupId>org.apache.maven.plugins</groupId> | |||||
<artifactId>maven-compiler-plugin</artifactId> | |||||
<configuration> | |||||
<source>1.5</source> | |||||
<target>1.5</target> | |||||
<encoding>Shift_JIS</encoding> | |||||
</configuration> | |||||
</plugin> | |||||
</plugins> | |||||
</build> | |||||
<properties> | |||||
<project.build.sourceEncoding>Shift_JIS</project.build.sourceEncoding> | |||||
</properties> | |||||
</project> |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||||
<modelVersion>4.0.0</modelVersion> | |||||
<groupId>foo</groupId> | |||||
<artifactId>foo</artifactId> | |||||
<packaging>jar</packaging> | |||||
</project> |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||||
<modelVersion>4.0.0</modelVersion> | |||||
<groupId>foo</groupId> | |||||
<artifactId>foo</artifactId> | |||||
<packaging>jar</packaging> | |||||
</project> |
// some C code |
select * from foo; |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||||
<modelVersion>4.0.0</modelVersion> | |||||
<groupId>foo</groupId> | |||||
<artifactId>foo</artifactId> | |||||
<packaging>jar</packaging> | |||||
</project> |
package foo; | |||||
public class Bar { | |||||
} |
package foo; | |||||
public class Whizz { | |||||
} |
package foo; | |||||
import org.junit.Ignore; | |||||
public abstract class BarTest { | |||||
} |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||||
<modelVersion>4.0.0</modelVersion> | |||||
<groupId>foo</groupId> | |||||
<artifactId>bar</artifactId> | |||||
<packaging>jar</packaging> | |||||
</project> |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||||
<modelVersion>4.0.0</modelVersion> | |||||
<groupId>foo</groupId> | |||||
<artifactId>bar</artifactId> | |||||
<packaging>jar</packaging> | |||||
<properties> | |||||
<sonar.branch>BRANCH-1.X</sonar.branch> | |||||
</properties> | |||||
</project> |