diff options
author | Duarte Meneses <duarte.meneses@sonarsource.com> | 2019-06-19 13:56:51 -0500 |
---|---|---|
committer | SonarTech <sonartech@sonarsource.com> | 2019-07-12 20:21:14 +0200 |
commit | 93dc9770902dc7e168869d88b5ad731bfc0bedd9 (patch) | |
tree | 97ba885661d5cd9a2115fe212df31bacec9f9947 /sonar-scanner-engine | |
parent | 7c7d9b6b90244d2c974207862071caccdb2c9bb5 (diff) | |
download | sonarqube-93dc9770902dc7e168869d88b5ad731bfc0bedd9.tar.gz sonarqube-93dc9770902dc7e168869d88b5ad731bfc0bedd9.zip |
Extract implementation from plugin API and create new module sonar-plugin-api-impl
Diffstat (limited to 'sonar-scanner-engine')
263 files changed, 518 insertions, 11098 deletions
diff --git a/sonar-scanner-engine/build.gradle b/sonar-scanner-engine/build.gradle index 68880e4ae0a..65821d1555a 100644 --- a/sonar-scanner-engine/build.gradle +++ b/sonar-scanner-engine/build.gradle @@ -30,6 +30,7 @@ dependencies { compile project(':sonar-scanner-protocol') compile project(':sonar-ws') compile project(':sonar-duplications') + compile project(':sonar-plugin-api-impl') runtime project(path: ':sonar-plugin-api', configuration: 'shadow') compileOnly project(path: ':sonar-plugin-api') @@ -44,7 +45,6 @@ dependencies { testCompile 'org.mockito:mockito-core' testCompile project(':plugins:sonar-xoo-plugin') testCompile project(':sonar-plugin-api').sourceSets.test.output - testCompile project(':server:sonar-server') } diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/DefaultFileLinesContext.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/DefaultFileLinesContext.java index be5b715891f..e0481cfb52d 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/DefaultFileLinesContext.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/DefaultFileLinesContext.java @@ -28,7 +28,7 @@ import java.util.Map.Entry; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.measure.MetricFinder; import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.scanner.sensor.DefaultMeasure; +import org.sonar.api.impl.sensor.DefaultMeasure; import org.sonar.api.measures.CoreMetrics; import org.sonar.api.measures.FileLinesContext; import org.sonar.api.utils.KeyValueFormat; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/analysis/AnalysisTempFolderProvider.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/analysis/AnalysisTempFolderProvider.java index dee0cc79aa7..8848449b2f3 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/analysis/AnalysisTempFolderProvider.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/analysis/AnalysisTempFolderProvider.java @@ -25,9 +25,9 @@ import java.nio.file.Path; import org.picocontainer.ComponentLifecycle; import org.picocontainer.PicoContainer; import org.picocontainer.injectors.ProviderAdapter; +import org.sonar.api.impl.fs.DefaultInputProject; +import org.sonar.api.impl.utils.DefaultTempFolder; import org.sonar.api.utils.TempFolder; -import org.sonar.api.utils.internal.DefaultTempFolder; -import org.sonar.scanner.fs.DefaultInputProject; public class AnalysisTempFolderProvider extends ProviderAdapter implements ComponentLifecycle<TempFolder> { static final String TMP_NAME = ".sonartmp"; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/DefaultScannerWsClient.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/DefaultScannerWsClient.java new file mode 100644 index 00000000000..2cf094ee807 --- /dev/null +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/DefaultScannerWsClient.java @@ -0,0 +1,151 @@ +/* + * SonarQube + * Copyright (C) 2009-2019 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program 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. + * + * This program 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.scanner.bootstrap; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.CheckForNull; +import org.apache.commons.lang.StringUtils; +import org.sonar.api.CoreProperties; +import org.sonar.api.utils.MessageException; +import org.sonar.api.utils.log.Logger; +import org.sonar.api.utils.log.Loggers; +import org.sonar.api.utils.log.Profiler; +import org.sonarqube.ws.client.HttpException; +import org.sonarqube.ws.client.WsClient; +import org.sonarqube.ws.client.WsConnector; +import org.sonarqube.ws.client.WsRequest; +import org.sonarqube.ws.client.WsResponse; + +import static java.lang.String.format; +import static java.net.HttpURLConnection.HTTP_BAD_REQUEST; +import static java.net.HttpURLConnection.HTTP_FORBIDDEN; +import static java.net.HttpURLConnection.HTTP_UNAUTHORIZED; +import static org.sonar.api.utils.Preconditions.checkState; + +public class DefaultScannerWsClient implements ScannerWsClient { + private static final int MAX_ERROR_MSG_LEN = 128; + private static final Logger LOG = Loggers.get(DefaultScannerWsClient.class); + + private final WsClient target; + private final boolean hasCredentials; + private final GlobalAnalysisMode globalMode; + + public DefaultScannerWsClient(WsClient target, boolean hasCredentials, GlobalAnalysisMode globalMode) { + this.target = target; + this.hasCredentials = hasCredentials; + this.globalMode = globalMode; + } + + /** + * If an exception is not thrown, the response needs to be closed by either calling close() directly, or closing the + * body content's stream/reader. + * + * @throws IllegalStateException if the request could not be executed due to a connectivity problem or timeout. Because networks can + * fail during an exchange, it is possible that the remote server accepted the request before the failure + * @throws MessageException if there was a problem with authentication or if a error message was parsed from the response. + * @throws HttpException if the response code is not in range [200..300). Consider using {@link #createErrorMessage(HttpException)} to create more relevant messages for the users. + */ + public WsResponse call(WsRequest request) { + checkState(!globalMode.isMediumTest(), "No WS call should be made in medium test mode"); + Profiler profiler = Profiler.createIfDebug(LOG).start(); + WsResponse response = target.wsConnector().call(request); + profiler.stopDebug(format("%s %d %s", request.getMethod(), response.code(), response.requestUrl())); + failIfUnauthorized(response); + return response; + } + + public String baseUrl() { + return target.wsConnector().baseUrl(); + } + + WsConnector wsConnector() { + return target.wsConnector(); + } + + private void failIfUnauthorized(WsResponse response) { + int code = response.code(); + if (code == HTTP_UNAUTHORIZED) { + response.close(); + if (hasCredentials) { + // credentials are not valid + throw MessageException.of(format("Not authorized. Please check the properties %s and %s.", + CoreProperties.LOGIN, CoreProperties.PASSWORD)); + } + // not authenticated - see https://jira.sonarsource.com/browse/SONAR-4048 + throw MessageException.of(format("Not authorized. Analyzing this project requires to be authenticated. " + + "Please provide the values of the properties %s and %s.", CoreProperties.LOGIN, CoreProperties.PASSWORD)); + + } + if (code == HTTP_FORBIDDEN) { + throw MessageException.of("You're not authorized to run analysis. Please contact the project administrator."); + } + if (code == HTTP_BAD_REQUEST) { + String jsonMsg = tryParseAsJsonError(response.content()); + if (jsonMsg != null) { + throw MessageException.of(jsonMsg); + } + } + + // if failed, throws an HttpException + response.failIfNotSuccessful(); + } + + /** + * Tries to form a short and relevant error message from the exception, to be displayed in the console. + */ + public static String createErrorMessage(HttpException exception) { + String json = tryParseAsJsonError(exception.content()); + if (json != null) { + return json; + } + + String msg = "HTTP code " + exception.code(); + if (isHtml(exception.content())) { + return msg; + } + + return msg + ": " + StringUtils.left(exception.content(), MAX_ERROR_MSG_LEN); + } + + @CheckForNull + private static String tryParseAsJsonError(String responseContent) { + try { + JsonParser parser = new JsonParser(); + JsonObject obj = parser.parse(responseContent).getAsJsonObject(); + JsonArray errors = obj.getAsJsonArray("errors"); + List<String> errorMessages = new ArrayList<>(); + for (JsonElement e : errors) { + errorMessages.add(e.getAsJsonObject().get("msg").getAsString()); + } + return String.join(", ", errorMessages); + } catch (Exception e) { + return null; + } + } + + private static boolean isHtml(String responseContent) { + return StringUtils.stripToEmpty(responseContent).startsWith("<!DOCTYPE html>"); + } +} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/ExtensionInstaller.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/ExtensionInstaller.java index cf39ff12cdf..7c93cfa4ce4 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/ExtensionInstaller.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/ExtensionInstaller.java @@ -25,7 +25,7 @@ import org.sonar.api.ExtensionProvider; import org.sonar.api.Plugin; import org.sonar.api.SonarRuntime; import org.sonar.api.config.Configuration; -import org.sonar.api.internal.PluginContextImpl; +import org.sonar.api.impl.context.PluginContextImpl; import org.sonar.core.platform.ComponentContainer; import org.sonar.core.platform.PluginInfo; import org.sonar.core.platform.PluginRepository; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalContainer.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalContainer.java index 87f69aad2a8..5903adcbf67 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalContainer.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalContainer.java @@ -29,8 +29,8 @@ import org.sonar.api.SonarEdition; import org.sonar.api.SonarQubeSide; import org.sonar.api.SonarQubeVersion; import org.sonar.api.SonarRuntime; -import org.sonar.api.internal.MetadataLoader; -import org.sonar.api.internal.SonarRuntimeImpl; +import org.sonar.api.impl.context.MetadataLoader; +import org.sonar.api.impl.context.SonarRuntimeImpl; import org.sonar.api.utils.MessageException; import org.sonar.api.utils.System2; import org.sonar.api.utils.UriReader; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalTempFolderProvider.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalTempFolderProvider.java index ad49d737425..33ff6234a22 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalTempFolderProvider.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/GlobalTempFolderProvider.java @@ -31,9 +31,9 @@ import org.picocontainer.ComponentLifecycle; import org.picocontainer.PicoContainer; import org.picocontainer.injectors.ProviderAdapter; import org.sonar.api.CoreProperties; +import org.sonar.api.impl.utils.DefaultTempFolder; import org.sonar.api.utils.System2; import org.sonar.api.utils.TempFolder; -import org.sonar.api.utils.internal.DefaultTempFolder; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/PluginFiles.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/PluginFiles.java index e6b12f2cf85..406e82b0671 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/PluginFiles.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/PluginFiles.java @@ -52,11 +52,11 @@ public class PluginFiles { private static final String PACK200 = "pack200"; private static final String UNCOMPRESSED_MD5_HEADER = "Sonar-UncompressedMD5"; - private final ScannerWsClient wsClient; + private final DefaultScannerWsClient wsClient; private final File cacheDir; private final File tempDir; - public PluginFiles(ScannerWsClient wsClient, Configuration configuration) { + public PluginFiles(DefaultScannerWsClient wsClient, Configuration configuration) { this.wsClient = wsClient; File home = locateHomeDir(configuration); this.cacheDir = mkdir(new File(home, "cache"), "user cache"); diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/ScannerPluginInstaller.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/ScannerPluginInstaller.java index db02b02d440..d80a52a26e9 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/ScannerPluginInstaller.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/ScannerPluginInstaller.java @@ -45,9 +45,9 @@ public class ScannerPluginInstaller implements PluginInstaller { private static final String PLUGINS_WS_URL = "api/plugins/installed"; private final PluginFiles pluginFiles; - private final ScannerWsClient wsClient; + private final DefaultScannerWsClient wsClient; - public ScannerPluginInstaller(PluginFiles pluginFiles, ScannerWsClient wsClient) { + public ScannerPluginInstaller(PluginFiles pluginFiles, DefaultScannerWsClient wsClient) { this.pluginFiles = pluginFiles; this.wsClient = wsClient; } diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/ScannerWsClient.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/ScannerWsClient.java index e04de9c05d9..3d13b6e3139 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/ScannerWsClient.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/ScannerWsClient.java @@ -19,136 +19,13 @@ */ package org.sonar.scanner.bootstrap; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Joiner; -import com.google.common.base.Preconditions; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import java.util.ArrayList; -import java.util.List; -import javax.annotation.CheckForNull; -import org.apache.commons.lang.StringUtils; -import org.sonar.api.CoreProperties; -import org.sonar.api.utils.MessageException; -import org.sonar.api.utils.log.Logger; -import org.sonar.api.utils.log.Loggers; -import org.sonar.api.utils.log.Profiler; -import org.sonarqube.ws.client.HttpException; -import org.sonarqube.ws.client.WsClient; -import org.sonarqube.ws.client.WsConnector; import org.sonarqube.ws.client.WsRequest; import org.sonarqube.ws.client.WsResponse; -import static java.lang.String.format; -import static java.net.HttpURLConnection.HTTP_BAD_REQUEST; -import static java.net.HttpURLConnection.HTTP_FORBIDDEN; -import static java.net.HttpURLConnection.HTTP_UNAUTHORIZED; +public interface ScannerWsClient { + WsResponse call(WsRequest request); -public class ScannerWsClient { - private static final int MAX_ERROR_MSG_LEN = 128; - private static final Logger LOG = Loggers.get(ScannerWsClient.class); + String baseUrl(); - private final WsClient target; - private final boolean hasCredentials; - private final GlobalAnalysisMode globalMode; - public ScannerWsClient(WsClient target, boolean hasCredentials, GlobalAnalysisMode globalMode) { - this.target = target; - this.hasCredentials = hasCredentials; - this.globalMode = globalMode; - } - - /** - * If an exception is not thrown, the response needs to be closed by either calling close() directly, or closing the - * body content's stream/reader. - * - * @throws IllegalStateException if the request could not be executed due to a connectivity problem or timeout. Because networks can - * fail during an exchange, it is possible that the remote server accepted the request before the failure - * @throws MessageException if there was a problem with authentication or if a error message was parsed from the response. - * @throws HttpException if the response code is not in range [200..300). Consider using {@link #createErrorMessage(HttpException)} to create more relevant messages for the users. - */ - public WsResponse call(WsRequest request) { - Preconditions.checkState(!globalMode.isMediumTest(), "No WS call should be made in medium test mode"); - Profiler profiler = Profiler.createIfDebug(LOG).start(); - WsResponse response = target.wsConnector().call(request); - profiler.stopDebug(format("%s %d %s", request.getMethod(), response.code(), response.requestUrl())); - failIfUnauthorized(response); - return response; - } - - public String baseUrl() { - return target.wsConnector().baseUrl(); - } - - @VisibleForTesting - WsConnector wsConnector() { - return target.wsConnector(); - } - - private void failIfUnauthorized(WsResponse response) { - int code = response.code(); - if (code == HTTP_UNAUTHORIZED) { - response.close(); - if (hasCredentials) { - // credentials are not valid - throw MessageException.of(format("Not authorized. Please check the properties %s and %s.", - CoreProperties.LOGIN, CoreProperties.PASSWORD)); - } - // not authenticated - see https://jira.sonarsource.com/browse/SONAR-4048 - throw MessageException.of(format("Not authorized. Analyzing this project requires to be authenticated. " + - "Please provide the values of the properties %s and %s.", CoreProperties.LOGIN, CoreProperties.PASSWORD)); - - } - if (code == HTTP_FORBIDDEN) { - throw MessageException.of("You're not authorized to run analysis. Please contact the project administrator."); - } - if (code == HTTP_BAD_REQUEST) { - String jsonMsg = tryParseAsJsonError(response.content()); - if (jsonMsg != null) { - throw MessageException.of(jsonMsg); - } - } - - // if failed, throws an HttpException - response.failIfNotSuccessful(); - } - - /** - * Tries to form a short and relevant error message from the exception, to be displayed in the console. - */ - public static String createErrorMessage(HttpException exception) { - String json = tryParseAsJsonError(exception.content()); - if (json != null) { - return json; - } - - String msg = "HTTP code " + exception.code(); - if (isHtml(exception.content())) { - return msg; - } - - return msg + ": " + StringUtils.left(exception.content(), MAX_ERROR_MSG_LEN); - } - - @CheckForNull - private static String tryParseAsJsonError(String responseContent) { - try { - JsonParser parser = new JsonParser(); - JsonObject obj = parser.parse(responseContent).getAsJsonObject(); - JsonArray errors = obj.getAsJsonArray("errors"); - List<String> errorMessages = new ArrayList<>(); - for (JsonElement e : errors) { - errorMessages.add(e.getAsJsonObject().get("msg").getAsString()); - } - return Joiner.on(", ").join(errorMessages); - } catch (Exception e) { - return null; - } - } - - private static boolean isHtml(String responseContent) { - return StringUtils.stripToEmpty(responseContent).startsWith("<!DOCTYPE html>"); - } } diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/ScannerWsClientProvider.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/ScannerWsClientProvider.java index 7f619482ab1..2161973c494 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/ScannerWsClientProvider.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/ScannerWsClientProvider.java @@ -36,9 +36,9 @@ public class ScannerWsClientProvider extends ProviderAdapter { static final String READ_TIMEOUT_SEC_PROPERTY = "sonar.ws.timeout"; static final int DEFAULT_READ_TIMEOUT_SEC = 60; - private ScannerWsClient wsClient; + private DefaultScannerWsClient wsClient; - public synchronized ScannerWsClient provide(final RawScannerProperties scannerProps, + public synchronized DefaultScannerWsClient provide(final RawScannerProperties scannerProps, final EnvironmentInformation env, GlobalAnalysisMode globalMode, System2 system) { if (wsClient == null) { String url = defaultIfBlank(scannerProps.property("sonar.host.url"), CoreProperties.SERVER_BASE_URL_DEFAULT_VALUE); @@ -60,7 +60,7 @@ public class ScannerWsClientProvider extends ProviderAdapter { connectorBuilder.proxyCredentials(proxyUser, System.getProperty("http.proxyPassword")); } - wsClient = new ScannerWsClient(WsClientFactories.getDefault().newClient(connectorBuilder.build()), login != null, globalMode); + wsClient = new DefaultScannerWsClient(WsClientFactories.getDefault().newClient(connectorBuilder.build()), login != null, globalMode); } return wsClient; } diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/config/DefaultConfiguration.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/config/DefaultConfiguration.java index d57b46c7994..8c392cfed46 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/config/DefaultConfiguration.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/config/DefaultConfiguration.java @@ -34,7 +34,7 @@ import org.sonar.api.utils.log.Loggers; import static java.util.Objects.requireNonNull; import static org.apache.commons.lang.StringUtils.trim; -import static org.sonar.api.config.internal.MultivalueProperty.parseAsCsv; +import static org.sonar.api.impl.config.MultivalueProperty.parseAsCsv; @Immutable public abstract class DefaultConfiguration implements Configuration { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/cpd/CpdExecutor.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/cpd/CpdExecutor.java index c5c1112317d..74684a0019b 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/cpd/CpdExecutor.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/cpd/CpdExecutor.java @@ -42,8 +42,8 @@ import org.sonar.duplications.index.CloneGroup; import org.sonar.duplications.index.ClonePart; import org.sonar.duplications.index.PackedMemoryCloneIndex.ResourceBlocks; import org.sonar.scanner.cpd.index.SonarCpdBlockIndex; -import org.sonar.scanner.fs.DefaultInputComponent; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputComponent; +import org.sonar.api.impl.fs.DefaultInputFile; import org.sonar.scanner.protocol.output.ScannerReport; import org.sonar.scanner.protocol.output.ScannerReport.Duplicate; import org.sonar.scanner.protocol.output.ScannerReport.Duplication; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/cpd/CpdSettings.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/cpd/CpdSettings.java index f40e5d107bd..82ee99a37ee 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/cpd/CpdSettings.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/cpd/CpdSettings.java @@ -23,7 +23,7 @@ import org.apache.commons.lang.StringUtils; import org.sonar.api.CoreProperties; import org.sonar.api.config.Configuration; import org.sonar.duplications.block.BlockChunker; -import org.sonar.scanner.fs.DefaultInputProject; +import org.sonar.api.impl.fs.DefaultInputProject; public class CpdSettings { private final Configuration settings; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/cpd/JavaCpdBlockIndexerSensor.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/cpd/JavaCpdBlockIndexerSensor.java index a66df96bbed..69645b6c05d 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/cpd/JavaCpdBlockIndexerSensor.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/cpd/JavaCpdBlockIndexerSensor.java @@ -43,7 +43,7 @@ import org.sonar.duplications.statement.Statement; import org.sonar.duplications.statement.StatementChunker; import org.sonar.duplications.token.TokenChunker; import org.sonar.scanner.cpd.index.SonarCpdBlockIndex; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputFile; /** * Special case for Java that use a dedicated block indexer. diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/cpd/index/SonarCpdBlockIndex.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/cpd/index/SonarCpdBlockIndex.java index 645d9fab4b1..44b419f26ff 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/cpd/index/SonarCpdBlockIndex.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/cpd/index/SonarCpdBlockIndex.java @@ -34,7 +34,7 @@ import org.sonar.duplications.index.CloneIndex; import org.sonar.duplications.index.PackedMemoryCloneIndex; import org.sonar.duplications.index.PackedMemoryCloneIndex.ResourceBlocks; import org.sonar.scanner.cpd.CpdSettings; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputFile; import org.sonar.scanner.protocol.output.FileStructure; import org.sonar.scanner.protocol.output.ScannerReport; import org.sonar.scanner.report.ReportPublisher; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/deprecated/test/DefaultCoverageBlock.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/deprecated/test/DefaultCoverageBlock.java index 364544377ed..be9e3686cdf 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/deprecated/test/DefaultCoverageBlock.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/deprecated/test/DefaultCoverageBlock.java @@ -23,7 +23,7 @@ import java.util.List; import org.sonar.api.test.CoverageBlock; import org.sonar.api.test.TestCase; import org.sonar.api.test.Testable; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputFile; public class DefaultCoverageBlock implements CoverageBlock { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/deprecated/test/DefaultTestCase.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/deprecated/test/DefaultTestCase.java index 960a6cf03b5..74113b9ed68 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/deprecated/test/DefaultTestCase.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/deprecated/test/DefaultTestCase.java @@ -32,7 +32,7 @@ import org.sonar.api.test.TestPlan; import org.sonar.api.test.Testable; import org.sonar.api.test.exception.CoverageAlreadyExistsException; import org.sonar.api.test.exception.IllegalDurationException; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputFile; public class DefaultTestCase implements MutableTestCase { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/deprecated/test/DefaultTestable.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/deprecated/test/DefaultTestable.java index 20a0abfec50..5219368da91 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/deprecated/test/DefaultTestable.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/deprecated/test/DefaultTestable.java @@ -25,7 +25,7 @@ import java.util.SortedSet; import org.sonar.api.test.CoverageBlock; import org.sonar.api.test.MutableTestable; import org.sonar.api.test.TestCase; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputFile; public class DefaultTestable implements MutableTestable { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/deprecated/test/TestPlanBuilder.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/deprecated/test/TestPlanBuilder.java index 615ebd2f5cf..c4c52865907 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/deprecated/test/TestPlanBuilder.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/deprecated/test/TestPlanBuilder.java @@ -27,7 +27,7 @@ import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.InputFile.Type; import org.sonar.api.test.MutableTestPlan; import org.sonar.scanner.deprecated.perspectives.PerspectiveBuilder; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputFile; public class TestPlanBuilder extends PerspectiveBuilder<MutableTestPlan> { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/deprecated/test/TestableBuilder.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/deprecated/test/TestableBuilder.java index 84f74e12ff5..4498f0b4d93 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/deprecated/test/TestableBuilder.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/deprecated/test/TestableBuilder.java @@ -25,7 +25,7 @@ import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.InputFile.Type; import org.sonar.api.test.MutableTestable; import org.sonar.scanner.deprecated.perspectives.PerspectiveBuilder; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputFile; public class TestableBuilder extends PerspectiveBuilder<MutableTestable> { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/AbstractProjectOrModule.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/AbstractProjectOrModule.java deleted file mode 100644 index 9fc2d130f4a..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/AbstractProjectOrModule.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.Charset; -import java.nio.file.Files; -import java.nio.file.LinkOption; -import java.nio.file.Path; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import javax.annotation.CheckForNull; -import javax.annotation.concurrent.Immutable; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.SystemUtils; -import org.sonar.api.CoreProperties; -import org.sonar.api.batch.bootstrap.ProjectDefinition; -import org.sonar.api.utils.log.Logger; -import org.sonar.api.utils.log.Loggers; - -@Immutable -public abstract class AbstractProjectOrModule extends DefaultInputComponent { - private static final Logger LOGGER = Loggers.get(AbstractProjectOrModule.class); - private final Path baseDir; - private final Path workDir; - private final String name; - private final String originalName; - private final String description; - private final String keyWithBranch; - private final String branch; - private final Map<String, String> properties; - - private final String key; - private final ProjectDefinition definition; - private final Charset encoding; - - public AbstractProjectOrModule(ProjectDefinition definition, int scannerComponentId) { - super(scannerComponentId); - this.baseDir = initBaseDir(definition); - this.workDir = initWorkingDir(definition); - this.name = definition.getName(); - this.originalName = definition.getOriginalName(); - this.description = definition.getDescription(); - this.keyWithBranch = definition.getKeyWithBranch(); - this.branch = definition.getBranch(); - this.properties = Collections.unmodifiableMap(new HashMap<>(definition.properties())); - - this.definition = definition; - this.key = definition.getKey(); - this.encoding = initEncoding(definition); - } - - private static Charset initEncoding(ProjectDefinition module) { - String encodingStr = module.properties().get(CoreProperties.ENCODING_PROPERTY); - Charset result; - if (StringUtils.isNotEmpty(encodingStr)) { - result = Charset.forName(StringUtils.trim(encodingStr)); - } else { - result = Charset.defaultCharset(); - } - return result; - } - - private static Path initBaseDir(ProjectDefinition module) { - Path result; - try { - result = module.getBaseDir().toPath().toRealPath(LinkOption.NOFOLLOW_LINKS); - } catch (IOException e) { - throw new IllegalStateException("Unable to resolve module baseDir", e); - } - return result; - } - - private static Path initWorkingDir(ProjectDefinition module) { - File workingDirAsFile = module.getWorkDir(); - Path workingDir = workingDirAsFile.getAbsoluteFile().toPath().normalize(); - if (SystemUtils.IS_OS_WINDOWS) { - try { - Files.createDirectories(workingDir); - Files.setAttribute(workingDir, "dos:hidden", true, LinkOption.NOFOLLOW_LINKS); - } catch (IOException e) { - LOGGER.warn("Failed to set working directory hidden: {}", e.getMessage()); - } - } - return workingDir; - } - - /** - * Module key without branch - */ - @Override - public String key() { - return key; - } - - @Override - public boolean isFile() { - return false; - } - - public ProjectDefinition definition() { - return definition; - } - - public Path getBaseDir() { - return baseDir; - } - - public Path getWorkDir() { - return workDir; - } - - public String getKeyWithBranch() { - return keyWithBranch; - } - - @CheckForNull - public String getBranch() { - return branch; - } - - public Map<String, String> properties() { - return properties; - } - - @CheckForNull - public String getOriginalName() { - return originalName; - } - - public String getName() { - return name; - } - - public String getDescription() { - return description; - } - - public Charset getEncoding() { - return encoding; - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultFileSystem.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultFileSystem.java deleted file mode 100644 index 1c1729634e1..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultFileSystem.java +++ /dev/null @@ -1,246 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.Charset; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; -import java.util.stream.StreamSupport; -import org.sonar.api.batch.fs.FilePredicate; -import org.sonar.api.batch.fs.FilePredicates; -import org.sonar.api.batch.fs.FileSystem; -import org.sonar.api.batch.fs.InputDir; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.scan.filesystem.PathResolver; -import org.sonar.api.utils.PathUtils; -import org.sonar.scanner.fs.predicates.DefaultFilePredicates; -import org.sonar.scanner.fs.predicates.FileExtensionPredicate; -import org.sonar.scanner.fs.predicates.OptimizedFilePredicateAdapter; - -/** - * @since 4.2 - */ -public class DefaultFileSystem implements FileSystem { - - private final Cache cache; - private final Path baseDir; - private Path workDir; - private Charset encoding; - protected final FilePredicates predicates; - - /** - * Only for testing - */ - public DefaultFileSystem(Path baseDir) { - this(baseDir, new MapCache()); - } - - /** - * Only for testing - */ - public DefaultFileSystem(File baseDir) { - this(baseDir.toPath(), new MapCache()); - } - - protected DefaultFileSystem(Path baseDir, Cache cache) { - this.baseDir = baseDir; - this.cache = cache; - this.predicates = new DefaultFilePredicates(this.baseDir); - } - - public Path baseDirPath() { - return baseDir; - } - - @Override - public File baseDir() { - return baseDir.toFile(); - } - - public DefaultFileSystem setEncoding(Charset e) { - this.encoding = e; - return this; - } - - @Override - public Charset encoding() { - return encoding; - } - - public DefaultFileSystem setWorkDir(Path d) { - this.workDir = d; - return this; - } - - @Override - public File workDir() { - return workDir.toFile(); - } - - @Override - public InputFile inputFile(FilePredicate predicate) { - Iterable<InputFile> files = inputFiles(predicate); - Iterator<InputFile> iterator = files.iterator(); - if (!iterator.hasNext()) { - return null; - } - InputFile first = iterator.next(); - if (!iterator.hasNext()) { - return first; - } - - StringBuilder sb = new StringBuilder(); - sb.append("expected one element but was: <" + first); - for (int i = 0; i < 4 && iterator.hasNext(); i++) { - sb.append(", " + iterator.next()); - } - if (iterator.hasNext()) { - sb.append(", ..."); - } - sb.append('>'); - - throw new IllegalArgumentException(sb.toString()); - - } - - public Iterable<InputFile> inputFiles() { - return inputFiles(predicates.all()); - } - - @Override - public Iterable<InputFile> inputFiles(FilePredicate predicate) { - return OptimizedFilePredicateAdapter.create(predicate).get(cache); - } - - @Override - public boolean hasFiles(FilePredicate predicate) { - return inputFiles(predicate).iterator().hasNext(); - } - - @Override - public Iterable<File> files(FilePredicate predicate) { - return () -> StreamSupport.stream(inputFiles(predicate).spliterator(), false) - .map(InputFile::file) - .iterator(); - } - - @Override - public InputDir inputDir(File dir) { - String relativePath = PathUtils.sanitize(new PathResolver().relativePath(baseDir.toFile(), dir)); - if (relativePath == null) { - return null; - } - // Issues on InputDir are moved to the project, so we just return a fake InputDir for backward compatibility - return new DefaultInputDir("unused", relativePath).setModuleBaseDir(baseDir); - } - - public DefaultFileSystem add(InputFile inputFile) { - cache.add(inputFile); - return this; - } - - @Override - public SortedSet<String> languages() { - return cache.languages(); - } - - @Override - public FilePredicates predicates() { - return predicates; - } - - public abstract static class Cache implements Index { - - protected abstract void doAdd(InputFile inputFile); - - final void add(InputFile inputFile) { - doAdd(inputFile); - } - - protected abstract SortedSet<String> languages(); - } - - /** - * Used only for testing - */ - private static class MapCache extends Cache { - private final Map<String, InputFile> fileMap = new HashMap<>(); - private final Map<String, Set<InputFile>> filesByNameCache = new HashMap<>(); - private final Map<String, Set<InputFile>> filesByExtensionCache = new HashMap<>(); - private SortedSet<String> languages = new TreeSet<>(); - - @Override - public Iterable<InputFile> inputFiles() { - return new ArrayList<>(fileMap.values()); - } - - @Override - public InputFile inputFile(String relativePath) { - return fileMap.get(relativePath); - } - - @Override - public Iterable<InputFile> getFilesByName(String filename) { - return filesByNameCache.get(filename); - } - - @Override - public Iterable<InputFile> getFilesByExtension(String extension) { - return filesByExtensionCache.get(extension); - } - - @Override - protected void doAdd(InputFile inputFile) { - if (inputFile.language() != null) { - languages.add(inputFile.language()); - } - fileMap.put(inputFile.relativePath(), inputFile); - filesByNameCache.computeIfAbsent(inputFile.filename(), x -> new HashSet<>()).add(inputFile); - filesByExtensionCache.computeIfAbsent(FileExtensionPredicate.getExtension(inputFile), x -> new HashSet<>()).add(inputFile); - } - - @Override - protected SortedSet<String> languages() { - return languages; - } - } - - @Override - public File resolvePath(String path) { - File file = new File(path); - if (!file.isAbsolute()) { - try { - file = new File(baseDir(), path).getCanonicalFile(); - } catch (IOException e) { - throw new IllegalArgumentException("Unable to resolve path '" + path + "'", e); - } - } - return file; - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultIndexedFile.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultIndexedFile.java deleted file mode 100644 index e52e0b46e1f..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultIndexedFile.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.concurrent.atomic.AtomicInteger; -import javax.annotation.CheckForNull; -import javax.annotation.Nullable; -import javax.annotation.concurrent.Immutable; -import org.sonar.api.batch.fs.IndexedFile; -import org.sonar.api.batch.fs.InputFile.Type; -import org.sonar.api.batch.fs.internal.SensorStrategy; -import org.sonar.api.utils.PathUtils; - -/** - * @since 6.3 - */ -@Immutable -public class DefaultIndexedFile extends DefaultInputComponent implements IndexedFile { - private static AtomicInteger intGenerator = new AtomicInteger(0); - - private final String projectRelativePath; - private final String moduleRelativePath; - private final String projectKey; - private final String language; - private final Type type; - private final Path absolutePath; - private final SensorStrategy sensorStrategy; - - /** - * Testing purposes only! - */ - public DefaultIndexedFile(String projectKey, Path baseDir, String relativePath, @Nullable String language) { - this(baseDir.resolve(relativePath), projectKey, relativePath, relativePath, Type.MAIN, language, intGenerator.getAndIncrement(), - new SensorStrategy()); - } - - public DefaultIndexedFile(Path absolutePath, String projectKey, String projectRelativePath, String moduleRelativePath, Type type, @Nullable String language, int batchId, - SensorStrategy sensorStrategy) { - super(batchId); - this.projectKey = projectKey; - this.projectRelativePath = PathUtils.sanitize(projectRelativePath); - this.moduleRelativePath = PathUtils.sanitize(moduleRelativePath); - this.type = type; - this.language = language; - this.sensorStrategy = sensorStrategy; - this.absolutePath = absolutePath; - } - - @Override - public String relativePath() { - return sensorStrategy.isGlobal() ? projectRelativePath : moduleRelativePath; - } - - public String getModuleRelativePath() { - return moduleRelativePath; - } - - public String getProjectRelativePath() { - return projectRelativePath; - } - - @Override - public String absolutePath() { - return PathUtils.sanitize(path().toString()); - } - - @Override - public File file() { - return path().toFile(); - } - - @Override - public Path path() { - return absolutePath; - } - - @Override - public InputStream inputStream() throws IOException { - return Files.newInputStream(path()); - } - - @CheckForNull - @Override - public String language() { - return language; - } - - @Override - public Type type() { - return type; - } - - /** - * Component key (without branch). - */ - @Override - public String key() { - return new StringBuilder().append(projectKey).append(":").append(projectRelativePath).toString(); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - - if (!(o instanceof DefaultIndexedFile)) { - return false; - } - - DefaultIndexedFile that = (DefaultIndexedFile) o; - return projectRelativePath.equals(that.projectRelativePath); - } - - @Override - public int hashCode() { - return projectRelativePath.hashCode(); - } - - @Override - public String toString() { - return projectRelativePath; - } - - @Override - public boolean isFile() { - return true; - } - - @Override - public String filename() { - return path().getFileName().toString(); - } - - @Override - public URI uri() { - return path().toUri(); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultInputComponent.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultInputComponent.java deleted file mode 100644 index 11601e0265f..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultInputComponent.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs; - -import java.util.HashSet; -import java.util.Set; -import org.sonar.api.batch.fs.InputComponent; -import org.sonar.api.batch.measure.Metric; - -/** - * @since 5.2 - */ -public abstract class DefaultInputComponent implements InputComponent { - private int id; - private Set<String> storedMetricKeys = new HashSet<>(); - - public DefaultInputComponent(int scannerId) { - this.id = scannerId; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || this.getClass() != o.getClass()) { - return false; - } - - DefaultInputComponent that = (DefaultInputComponent) o; - return key().equals(that.key()); - } - - public int scannerId() { - return id; - } - - @Override - public int hashCode() { - return key().hashCode(); - } - - @Override - public String toString() { - return "[key=" + key() + "]"; - } - - public void setHasMeasureFor(Metric metric) { - storedMetricKeys.add(metric.key()); - } - - public boolean hasMeasureFor(Metric metric) { - return storedMetricKeys.contains(metric.key()); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultInputDir.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultInputDir.java deleted file mode 100644 index 13eb77be1c4..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultInputDir.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs; - -import java.io.File; -import java.net.URI; -import java.nio.file.Path; -import org.apache.commons.lang.StringUtils; -import org.sonar.api.batch.fs.InputDir; -import org.sonar.api.utils.PathUtils; - -/** - * @since 4.5 - */ -public class DefaultInputDir extends DefaultInputComponent implements InputDir { - - private final String relativePath; - private final String moduleKey; - private Path moduleBaseDir; - - public DefaultInputDir(String moduleKey, String relativePath) { - super(-1); - this.moduleKey = moduleKey; - this.relativePath = PathUtils.sanitize(relativePath); - } - - @Override - public String relativePath() { - return relativePath; - } - - @Override - public String absolutePath() { - return PathUtils.sanitize(path().toString()); - } - - @Override - public File file() { - return path().toFile(); - } - - @Override - public Path path() { - if (moduleBaseDir == null) { - throw new IllegalStateException("Can not return the java.nio.file.Path because module baseDir is not set (see method setModuleBaseDir(java.io.File))"); - } - return moduleBaseDir.resolve(relativePath); - } - - public String moduleKey() { - return moduleKey; - } - - @Override - public String key() { - StringBuilder sb = new StringBuilder().append(moduleKey).append(":"); - if (StringUtils.isEmpty(relativePath)) { - sb.append("/"); - } else { - sb.append(relativePath); - } - return sb.toString(); - } - - /** - * For testing purpose. Will be automatically set when dir is added to {@link DefaultFileSystem} - */ - public DefaultInputDir setModuleBaseDir(Path moduleBaseDir) { - this.moduleBaseDir = moduleBaseDir.normalize(); - return this; - } - - @Override - public boolean isFile() { - return false; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || this.getClass() != o.getClass()) { - return false; - } - - DefaultInputDir that = (DefaultInputDir) o; - return moduleKey.equals(that.moduleKey) && relativePath.equals(that.relativePath); - } - - @Override - public int hashCode() { - return moduleKey.hashCode() + relativePath.hashCode() * 13; - } - - @Override - public String toString() { - return "[moduleKey=" + moduleKey + ", relative=" + relativePath + ", basedir=" + moduleBaseDir + "]"; - } - - @Override - public URI uri() { - return path().toUri(); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultInputFile.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultInputFile.java deleted file mode 100644 index c74f1c41296..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultInputFile.java +++ /dev/null @@ -1,440 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.nio.charset.Charset; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.BitSet; -import java.util.Collection; -import java.util.Optional; -import java.util.Set; -import java.util.function.Consumer; -import java.util.stream.Collectors; -import javax.annotation.CheckForNull; -import javax.annotation.Nullable; -import org.apache.commons.io.ByteOrderMark; -import org.apache.commons.io.input.BOMInputStream; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.TextPointer; -import org.sonar.api.batch.fs.TextRange; -import org.sonar.api.batch.fs.internal.Metadata; - -import static org.sonar.api.utils.Preconditions.checkArgument; -import static org.sonar.api.utils.Preconditions.checkState; - -/** - * @since 4.2 - * To create {@link InputFile} in tests, use TestInputFileBuilder. - */ -public class DefaultInputFile extends DefaultInputComponent implements InputFile { - - private static final int DEFAULT_BUFFER_SIZE = 1024 * 4; - - private final DefaultIndexedFile indexedFile; - private final String contents; - private final Consumer<DefaultInputFile> metadataGenerator; - - private boolean published; - private boolean excludedForCoverage; - private boolean excludedForDuplication; - private boolean ignoreAllIssues; - // Lazy init to save memory - private BitSet noSonarLines; - private Status status; - private Charset charset; - private Metadata metadata; - private Collection<int[]> ignoreIssuesOnlineRanges; - private BitSet executableLines; - - public DefaultInputFile(DefaultIndexedFile indexedFile, Consumer<DefaultInputFile> metadataGenerator) { - this(indexedFile, metadataGenerator, null); - } - - // For testing - public DefaultInputFile(DefaultIndexedFile indexedFile, Consumer<DefaultInputFile> metadataGenerator, @Nullable String contents) { - super(indexedFile.scannerId()); - this.indexedFile = indexedFile; - this.metadataGenerator = metadataGenerator; - this.metadata = null; - this.published = false; - this.excludedForCoverage = false; - this.contents = contents; - } - - public void checkMetadata() { - if (metadata == null) { - metadataGenerator.accept(this); - } - } - - @Override - public InputStream inputStream() throws IOException { - return contents != null ? new ByteArrayInputStream(contents.getBytes(charset())) - : new BOMInputStream(Files.newInputStream(path()), - ByteOrderMark.UTF_8, ByteOrderMark.UTF_16LE, ByteOrderMark.UTF_16BE, ByteOrderMark.UTF_32LE, ByteOrderMark.UTF_32BE); - } - - @Override - public String contents() throws IOException { - if (contents != null) { - return contents; - } else { - ByteArrayOutputStream result = new ByteArrayOutputStream(); - try (InputStream inputStream = inputStream()) { - byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; - int length; - while ((length = inputStream.read(buffer)) != -1) { - result.write(buffer, 0, length); - } - } - return result.toString(charset().name()); - } - } - - public DefaultInputFile setPublished(boolean published) { - this.published = published; - return this; - } - - public boolean isPublished() { - return published; - } - - public DefaultInputFile setExcludedForCoverage(boolean excludedForCoverage) { - this.excludedForCoverage = excludedForCoverage; - return this; - } - - public boolean isExcludedForCoverage() { - return excludedForCoverage; - } - - public DefaultInputFile setExcludedForDuplication(boolean excludedForDuplication) { - this.excludedForDuplication = excludedForDuplication; - return this; - } - - public boolean isExcludedForDuplication() { - return excludedForDuplication; - } - - /** - * @deprecated since 6.6 - */ - @Deprecated - @Override - public String relativePath() { - return indexedFile.relativePath(); - } - - public String getModuleRelativePath() { - return indexedFile.getModuleRelativePath(); - } - - public String getProjectRelativePath() { - return indexedFile.getProjectRelativePath(); - } - - @Override - public String absolutePath() { - return indexedFile.absolutePath(); - } - - @Override - public File file() { - return indexedFile.file(); - } - - @Override - public Path path() { - return indexedFile.path(); - } - - @CheckForNull - @Override - public String language() { - return indexedFile.language(); - } - - @Override - public Type type() { - return indexedFile.type(); - } - - /** - * Component key (without branch). - */ - @Override - public String key() { - return indexedFile.key(); - } - - @Override - public int hashCode() { - return indexedFile.hashCode(); - } - - @Override - public String toString() { - return indexedFile.toString(); - } - - /** - * {@link #setStatus(Status)} - */ - @Override - public Status status() { - checkMetadata(); - return status; - } - - @Override - public int lines() { - checkMetadata(); - return metadata.lines(); - } - - @Override - public boolean isEmpty() { - checkMetadata(); - return metadata.isEmpty(); - } - - @Override - public Charset charset() { - checkMetadata(); - return charset; - } - - public int lastValidOffset() { - checkMetadata(); - return metadata.lastValidOffset(); - } - - /** - * Digest hash of the file. - */ - public String hash() { - checkMetadata(); - return metadata.hash(); - } - - public int nonBlankLines() { - checkMetadata(); - return metadata.nonBlankLines(); - } - - public int[] originalLineStartOffsets() { - checkMetadata(); - checkState(metadata.originalLineStartOffsets() != null, "InputFile is not properly initialized."); - checkState(metadata.originalLineStartOffsets().length == metadata.lines(), - "InputFile is not properly initialized. 'originalLineStartOffsets' property length should be equal to 'lines'"); - return metadata.originalLineStartOffsets(); - } - - public int[] originalLineEndOffsets() { - checkMetadata(); - checkState(metadata.originalLineEndOffsets() != null, "InputFile is not properly initialized."); - checkState(metadata.originalLineEndOffsets().length == metadata.lines(), - "InputFile is not properly initialized. 'originalLineEndOffsets' property length should be equal to 'lines'"); - return metadata.originalLineEndOffsets(); - } - - @Override - public TextPointer newPointer(int line, int lineOffset) { - checkMetadata(); - DefaultTextPointer textPointer = new DefaultTextPointer(line, lineOffset); - checkValid(textPointer, "pointer"); - return textPointer; - } - - @Override - public TextRange newRange(TextPointer start, TextPointer end) { - checkMetadata(); - checkValid(start, "start pointer"); - checkValid(end, "end pointer"); - return newRangeValidPointers(start, end, false); - } - - @Override - public TextRange newRange(int startLine, int startLineOffset, int endLine, int endLineOffset) { - checkMetadata(); - TextPointer start = newPointer(startLine, startLineOffset); - TextPointer end = newPointer(endLine, endLineOffset); - return newRangeValidPointers(start, end, false); - } - - @Override - public TextRange selectLine(int line) { - checkMetadata(); - TextPointer startPointer = newPointer(line, 0); - TextPointer endPointer = newPointer(line, lineLength(line)); - return newRangeValidPointers(startPointer, endPointer, true); - } - - public void validate(TextRange range) { - checkMetadata(); - checkValid(range.start(), "start pointer"); - checkValid(range.end(), "end pointer"); - } - - /** - * Create Range from global offsets. Used for backward compatibility with older API. - */ - public TextRange newRange(int startOffset, int endOffset) { - checkMetadata(); - return newRangeValidPointers(newPointer(startOffset), newPointer(endOffset), false); - } - - public TextPointer newPointer(int globalOffset) { - checkMetadata(); - checkArgument(globalOffset >= 0, "%s is not a valid offset for a file", globalOffset); - checkArgument(globalOffset <= lastValidOffset(), "%s is not a valid offset for file %s. Max offset is %s", globalOffset, this, lastValidOffset()); - int line = findLine(globalOffset); - int startLineOffset = originalLineStartOffsets()[line - 1]; - // In case the global offset is between \r and \n, move the pointer to a valid location - return new DefaultTextPointer(line, Math.min(globalOffset, originalLineEndOffsets()[line - 1]) - startLineOffset); - } - - public DefaultInputFile setStatus(Status status) { - this.status = status; - return this; - } - - public DefaultInputFile setCharset(Charset charset) { - this.charset = charset; - return this; - } - - private void checkValid(TextPointer pointer, String owner) { - checkArgument(pointer.line() >= 1, "%s is not a valid line for a file", pointer.line()); - checkArgument(pointer.line() <= this.metadata.lines(), "%s is not a valid line for %s. File %s has %s line(s)", pointer.line(), owner, this, metadata.lines()); - checkArgument(pointer.lineOffset() >= 0, "%s is not a valid line offset for a file", pointer.lineOffset()); - int lineLength = lineLength(pointer.line()); - checkArgument(pointer.lineOffset() <= lineLength, - "%s is not a valid line offset for %s. File %s has %s character(s) at line %s", pointer.lineOffset(), owner, this, lineLength, pointer.line()); - } - - private int lineLength(int line) { - return originalLineEndOffsets()[line - 1] - originalLineStartOffsets()[line - 1]; - } - - private static TextRange newRangeValidPointers(TextPointer start, TextPointer end, boolean acceptEmptyRange) { - checkArgument(acceptEmptyRange ? (start.compareTo(end) <= 0) : (start.compareTo(end) < 0), - "Start pointer %s should be before end pointer %s", start, end); - return new DefaultTextRange(start, end); - } - - private int findLine(int globalOffset) { - return Math.abs(Arrays.binarySearch(originalLineStartOffsets(), globalOffset) + 1); - } - - public DefaultInputFile setMetadata(Metadata metadata) { - this.metadata = metadata; - return this; - } - - @Override - public boolean equals(Object obj) { - if (obj == null) { - return false; - } - - if (this.getClass() != obj.getClass()) { - return false; - } - - DefaultInputFile that = (DefaultInputFile) obj; - return this.getProjectRelativePath().equals(that.getProjectRelativePath()); - } - - @Override - public boolean isFile() { - return true; - } - - @Override - public String filename() { - return indexedFile.filename(); - } - - @Override - public URI uri() { - return indexedFile.uri(); - } - - public void noSonarAt(Set<Integer> noSonarLines) { - if (this.noSonarLines == null) { - this.noSonarLines = new BitSet(lines()); - } - noSonarLines.forEach(l -> this.noSonarLines.set(l - 1)); - } - - public boolean hasNoSonarAt(int line) { - if (this.noSonarLines == null) { - return false; - } - return this.noSonarLines.get(line - 1); - } - - public boolean isIgnoreAllIssues() { - return ignoreAllIssues; - } - - public void setIgnoreAllIssues(boolean ignoreAllIssues) { - this.ignoreAllIssues = ignoreAllIssues; - } - - public void addIgnoreIssuesOnLineRanges(Collection<int[]> lineRanges) { - if (this.ignoreIssuesOnlineRanges == null) { - this.ignoreIssuesOnlineRanges = new ArrayList<>(); - } - this.ignoreIssuesOnlineRanges.addAll(lineRanges); - } - - public boolean isIgnoreAllIssuesOnLine(@Nullable Integer line) { - if (line == null || ignoreIssuesOnlineRanges == null) { - return false; - } - return ignoreIssuesOnlineRanges.stream().anyMatch(r -> r[0] <= line && line <= r[1]); - } - - public void setExecutableLines(Set<Integer> executableLines) { - checkState(this.executableLines == null, "Executable lines have already been saved for file: {}", this.toString()); - this.executableLines = new BitSet(lines()); - executableLines.forEach(l -> this.executableLines.set(l - 1)); - } - - public Optional<Set<Integer>> getExecutableLines() { - if (this.executableLines == null) { - return Optional.empty(); - } - return Optional.of(this.executableLines.stream().map(i -> i + 1).boxed().collect(Collectors.toSet())); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultInputModule.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultInputModule.java deleted file mode 100644 index a729bff7856..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultInputModule.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs; - -import java.io.File; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import javax.annotation.CheckForNull; -import javax.annotation.concurrent.Immutable; -import org.sonar.api.batch.bootstrap.ProjectDefinition; -import org.sonar.api.batch.fs.InputModule; -import org.sonar.api.scan.filesystem.PathResolver; - -import static org.sonar.api.config.internal.MultivalueProperty.parseAsCsv; - -@Immutable -public class DefaultInputModule extends AbstractProjectOrModule implements InputModule { - - private final List<Path> sourceDirsOrFiles; - private final List<Path> testDirsOrFiles; - - /** - * For testing only! - */ - public DefaultInputModule(ProjectDefinition definition) { - this(definition, 0); - } - - public DefaultInputModule(ProjectDefinition definition, int scannerComponentId) { - super(definition, scannerComponentId); - - this.sourceDirsOrFiles = initSources(definition, ProjectDefinition.SOURCES_PROPERTY); - this.testDirsOrFiles = initSources(definition, ProjectDefinition.TESTS_PROPERTY); - } - - @CheckForNull - private List<Path> initSources(ProjectDefinition module, String propertyKey) { - if (!module.properties().containsKey(propertyKey)) { - return null; - } - List<Path> result = new ArrayList<>(); - PathResolver pathResolver = new PathResolver(); - String srcPropValue = module.properties().get(propertyKey); - if (srcPropValue != null) { - for (String sourcePath : parseAsCsv(propertyKey, srcPropValue)) { - File dirOrFile = pathResolver.relativeFile(getBaseDir().toFile(), sourcePath); - if (dirOrFile.exists()) { - result.add(dirOrFile.toPath()); - } - } - } - return result; - } - - public Optional<List<Path>> getSourceDirsOrFiles() { - return Optional.ofNullable(sourceDirsOrFiles); - } - - public Optional<List<Path>> getTestDirsOrFiles() { - return Optional.ofNullable(testDirsOrFiles); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultInputProject.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultInputProject.java deleted file mode 100644 index 9dcd0254b00..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultInputProject.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs; - -import javax.annotation.concurrent.Immutable; -import org.sonar.api.batch.bootstrap.ProjectDefinition; -import org.sonar.api.scanner.fs.InputProject; - -@Immutable -public class DefaultInputProject extends AbstractProjectOrModule implements InputProject { - - /** - * For testing only! - */ - public DefaultInputProject(ProjectDefinition definition) { - super(definition, 0); - } - - public DefaultInputProject(ProjectDefinition definition, int scannerComponentId) { - super(definition, scannerComponentId); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultTextPointer.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultTextPointer.java deleted file mode 100644 index 5cfc84fc712..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultTextPointer.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs; - -import org.sonar.api.batch.fs.TextPointer; - -/** - * @since 5.2 - */ -public class DefaultTextPointer implements TextPointer { - - private final int line; - private final int lineOffset; - - public DefaultTextPointer(int line, int lineOffset) { - this.line = line; - this.lineOffset = lineOffset; - } - - @Override - public int line() { - return line; - } - - @Override - public int lineOffset() { - return lineOffset; - } - - @Override - public String toString() { - return "[line=" + line + ", lineOffset=" + lineOffset + "]"; - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof DefaultTextPointer)) { - return false; - } - DefaultTextPointer other = (DefaultTextPointer) obj; - return other.line == this.line && other.lineOffset == this.lineOffset; - } - - @Override - public int hashCode() { - return 37 * this.line + lineOffset; - } - - @Override - public int compareTo(TextPointer o) { - if (this.line == o.line()) { - return Integer.compare(this.lineOffset, o.lineOffset()); - } - return Integer.compare(this.line, o.line()); - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultTextRange.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultTextRange.java deleted file mode 100644 index f83c330e7ea..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/DefaultTextRange.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs; - -import org.sonar.api.batch.fs.TextPointer; -import org.sonar.api.batch.fs.TextRange; - -/** - * @since 5.2 - */ -public class DefaultTextRange implements TextRange { - - private final TextPointer start; - private final TextPointer end; - - public DefaultTextRange(TextPointer start, TextPointer end) { - this.start = start; - this.end = end; - } - - @Override - public TextPointer start() { - return start; - } - - @Override - public TextPointer end() { - return end; - } - - @Override - public boolean overlap(TextRange another) { - // [A,B] and [C,D] - // B > C && D > A - return this.end.compareTo(another.start()) > 0 && another.end().compareTo(this.start) > 0; - } - - @Override - public String toString() { - return "Range[from " + start + " to " + end + "]"; - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof DefaultTextRange)) { - return false; - } - DefaultTextRange other = (DefaultTextRange) obj; - return start.equals(other.start) && end.equals(other.end); - } - - @Override - public int hashCode() { - return start.hashCode() * 17 + end.hashCode(); - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/FileMetadata.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/FileMetadata.java deleted file mode 100644 index 1b984168d51..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/FileMetadata.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import javax.annotation.Nullable; -import javax.annotation.concurrent.Immutable; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.internal.Metadata; -import org.sonar.scanner.fs.charhandler.CharHandler; -import org.sonar.scanner.fs.charhandler.FileHashComputer; -import org.sonar.scanner.fs.charhandler.LineCounter; -import org.sonar.scanner.fs.charhandler.LineHashComputer; -import org.sonar.scanner.fs.charhandler.LineOffsetCounter; - -/** - * Computes hash of files. Ends of Lines are ignored, so files with - * same content but different EOL encoding have the same hash. - */ -@Immutable -public class FileMetadata { - private static final char LINE_FEED = '\n'; - private static final char CARRIAGE_RETURN = '\r'; - - /** - * Compute hash of a file ignoring line ends differences. - * Maximum performance is needed. - */ - public Metadata readMetadata(InputStream stream, Charset encoding, String filePath, @Nullable CharHandler otherHandler) { - LineCounter lineCounter = new LineCounter(filePath, encoding); - FileHashComputer fileHashComputer = new FileHashComputer(filePath); - LineOffsetCounter lineOffsetCounter = new LineOffsetCounter(); - - if (otherHandler != null) { - CharHandler[] handlers = {lineCounter, fileHashComputer, lineOffsetCounter, otherHandler}; - readFile(stream, encoding, filePath, handlers); - } else { - CharHandler[] handlers = {lineCounter, fileHashComputer, lineOffsetCounter}; - readFile(stream, encoding, filePath, handlers); - } - return new Metadata(lineCounter.lines(), lineCounter.nonBlankLines(), fileHashComputer.getHash(), lineOffsetCounter.getOriginalLineStartOffsets(), - lineOffsetCounter.getOriginalLineEndOffsets(), - lineOffsetCounter.getLastValidOffset()); - } - - public Metadata readMetadata(InputStream stream, Charset encoding, String filePath) { - return readMetadata(stream, encoding, filePath, null); - } - - /** - * For testing purpose - */ - public Metadata readMetadata(Reader reader) { - LineCounter lineCounter = new LineCounter("fromString", StandardCharsets.UTF_16); - FileHashComputer fileHashComputer = new FileHashComputer("fromString"); - LineOffsetCounter lineOffsetCounter = new LineOffsetCounter(); - CharHandler[] handlers = {lineCounter, fileHashComputer, lineOffsetCounter}; - - try { - read(reader, handlers); - } catch (IOException e) { - throw new IllegalStateException("Should never occur", e); - } - return new Metadata(lineCounter.lines(), lineCounter.nonBlankLines(), fileHashComputer.getHash(), lineOffsetCounter.getOriginalLineStartOffsets(), - lineOffsetCounter.getOriginalLineEndOffsets(), - lineOffsetCounter.getLastValidOffset()); - } - - public static void readFile(InputStream stream, Charset encoding, String filePath, CharHandler[] handlers) { - try (Reader reader = new BufferedReader(new InputStreamReader(stream, encoding))) { - read(reader, handlers); - } catch (IOException e) { - throw new IllegalStateException(String.format("Fail to read file '%s' with encoding '%s'", filePath, encoding), e); - } - } - - private static void read(Reader reader, CharHandler[] handlers) throws IOException { - char c; - int i = reader.read(); - boolean afterCR = false; - while (i != -1) { - c = (char) i; - if (afterCR) { - for (CharHandler handler : handlers) { - if (c == CARRIAGE_RETURN) { - handler.newLine(); - handler.handleAll(c); - } else if (c == LINE_FEED) { - handler.handleAll(c); - handler.newLine(); - } else { - handler.newLine(); - handler.handleIgnoreEoL(c); - handler.handleAll(c); - } - } - afterCR = c == CARRIAGE_RETURN; - } else if (c == LINE_FEED) { - for (CharHandler handler : handlers) { - handler.handleAll(c); - handler.newLine(); - } - } else if (c == CARRIAGE_RETURN) { - afterCR = true; - for (CharHandler handler : handlers) { - handler.handleAll(c); - } - } else { - for (CharHandler handler : handlers) { - handler.handleIgnoreEoL(c); - handler.handleAll(c); - } - } - i = reader.read(); - } - for (CharHandler handler : handlers) { - if (afterCR) { - handler.newLine(); - } - handler.eof(); - } - } - - @FunctionalInterface - public interface LineHashConsumer { - void consume(int lineIdx, @Nullable byte[] hash); - } - - /** - * Compute a MD5 hash of each line of the file after removing of all blank chars - */ - public static void computeLineHashesForIssueTracking(InputFile f, LineHashConsumer consumer) { - try { - readFile(f.inputStream(), f.charset(), f.absolutePath(), new CharHandler[] {new LineHashComputer(consumer, f.file())}); - } catch (IOException e) { - throw new IllegalStateException("Failed to compute line hashes for " + f.absolutePath(), e); - } - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/InputModuleHierarchy.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/InputModuleHierarchy.java index 9048824f032..ef1124cbcc9 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/InputModuleHierarchy.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/InputModuleHierarchy.java @@ -22,6 +22,7 @@ package org.sonar.scanner.fs; import java.util.Collection; import javax.annotation.CheckForNull; import javax.annotation.concurrent.Immutable; +import org.sonar.api.impl.fs.DefaultInputModule; @Immutable public interface InputModuleHierarchy { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/TestInputFileBuilder.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/TestInputFileBuilder.java deleted file mode 100644 index 6764b6180d5..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/TestInputFileBuilder.java +++ /dev/null @@ -1,280 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs; - -import java.io.File; -import java.io.IOException; -import java.io.StringReader; -import java.nio.charset.Charset; -import java.nio.file.Files; -import java.nio.file.LinkOption; -import java.nio.file.Path; -import java.nio.file.Paths; -import javax.annotation.CheckForNull; -import javax.annotation.Nullable; -import org.sonar.api.batch.bootstrap.ProjectDefinition; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.internal.Metadata; -import org.sonar.api.batch.fs.internal.SensorStrategy; -import org.sonar.api.utils.PathUtils; - -/** - * Intended to be used in unit tests that need to create {@link InputFile}s. - * An InputFile is unambiguously identified by a <b>module key</b> and a <b>relative path</b>, so these parameters are mandatory. - * <p> - * A module base directory is only needed to construct absolute paths. - * <p> - * Examples of usage of the constructors: - * - * <pre> - * InputFile file1 = TestInputFileBuilder.create("module1", "myfile.java").build(); - * InputFile file2 = TestInputFileBuilder.create("", fs.baseDir(), myfile).build(); - * </pre> - * <p> - * file1 will have the "module1" as both module key and module base directory. - * file2 has an empty string as module key, and a relative path which is the path from the filesystem base directory to myfile. - * - * @since 6.3 - */ -public class TestInputFileBuilder { - private static int batchId = 1; - - private final int id; - private final String relativePath; - private final String projectKey; - @CheckForNull - private Path projectBaseDir; - private Path moduleBaseDir; - private String language; - private InputFile.Type type = InputFile.Type.MAIN; - private InputFile.Status status; - private int lines = -1; - private Charset charset; - private String hash; - private int nonBlankLines; - private int[] originalLineStartOffsets = new int[0]; - private int[] originalLineEndOffsets = new int[0]; - private int lastValidOffset = -1; - private boolean publish = true; - private String contents; - - /** - * Create a InputFile identified by the given project key and relative path. - */ - public TestInputFileBuilder(String projectKey, String relativePath) { - this(projectKey, relativePath, batchId++); - } - - /** - * Create a InputFile with a given module key and module base directory. - * The relative path is generated comparing the file path to the module base directory. - * filePath must point to a file that is within the module base directory. - */ - public TestInputFileBuilder(String projectKey, File moduleBaseDir, File filePath) { - String relativePath = moduleBaseDir.toPath().relativize(filePath.toPath()).toString(); - this.projectKey = projectKey; - setModuleBaseDir(moduleBaseDir.toPath()); - this.relativePath = PathUtils.sanitize(relativePath); - this.id = batchId++; - } - - public TestInputFileBuilder(String projectKey, String relativePath, int id) { - this.projectKey = projectKey; - setModuleBaseDir(Paths.get(projectKey)); - this.relativePath = PathUtils.sanitize(relativePath); - this.id = id; - } - - public static TestInputFileBuilder create(String moduleKey, File moduleBaseDir, File filePath) { - return new TestInputFileBuilder(moduleKey, moduleBaseDir, filePath); - } - - public static TestInputFileBuilder create(String moduleKey, String relativePath) { - return new TestInputFileBuilder(moduleKey, relativePath); - } - - public static int nextBatchId() { - return batchId++; - } - - public TestInputFileBuilder setProjectBaseDir(Path projectBaseDir) { - this.projectBaseDir = normalize(projectBaseDir); - return this; - } - - public TestInputFileBuilder setModuleBaseDir(Path moduleBaseDir) { - this.moduleBaseDir = normalize(moduleBaseDir); - return this; - } - - private static Path normalize(Path path) { - try { - return path.normalize().toRealPath(LinkOption.NOFOLLOW_LINKS); - } catch (IOException e) { - return path.normalize(); - } - } - - public TestInputFileBuilder setLanguage(@Nullable String language) { - this.language = language; - return this; - } - - public TestInputFileBuilder setType(InputFile.Type type) { - this.type = type; - return this; - } - - public TestInputFileBuilder setStatus(InputFile.Status status) { - this.status = status; - return this; - } - - public TestInputFileBuilder setLines(int lines) { - this.lines = lines; - return this; - } - - public TestInputFileBuilder setCharset(Charset charset) { - this.charset = charset; - return this; - } - - public TestInputFileBuilder setHash(String hash) { - this.hash = hash; - return this; - } - - /** - * Set contents of the file and calculates metadata from it. - * The contents will be returned by {@link InputFile#contents()} and {@link InputFile#inputStream()} and can be - * inconsistent with the actual physical file pointed by {@link InputFile#path()}, {@link InputFile#absolutePath()}, etc. - */ - public TestInputFileBuilder setContents(String content) { - this.contents = content; - initMetadata(content); - return this; - } - - public TestInputFileBuilder setNonBlankLines(int nonBlankLines) { - this.nonBlankLines = nonBlankLines; - return this; - } - - public TestInputFileBuilder setLastValidOffset(int lastValidOffset) { - this.lastValidOffset = lastValidOffset; - return this; - } - - public TestInputFileBuilder setOriginalLineStartOffsets(int[] originalLineStartOffsets) { - this.originalLineStartOffsets = originalLineStartOffsets; - return this; - } - - public TestInputFileBuilder setOriginalLineEndOffsets(int[] originalLineEndOffsets) { - this.originalLineEndOffsets = originalLineEndOffsets; - return this; - } - - public TestInputFileBuilder setPublish(boolean publish) { - this.publish = publish; - return this; - } - - public TestInputFileBuilder setMetadata(Metadata metadata) { - this.setLines(metadata.lines()); - this.setLastValidOffset(metadata.lastValidOffset()); - this.setNonBlankLines(metadata.nonBlankLines()); - this.setHash(metadata.hash()); - this.setOriginalLineStartOffsets(metadata.originalLineStartOffsets()); - this.setOriginalLineEndOffsets(metadata.originalLineEndOffsets()); - return this; - } - - public TestInputFileBuilder initMetadata(String content) { - return setMetadata(new FileMetadata().readMetadata(new StringReader(content))); - } - - public DefaultInputFile build() { - Path absolutePath = moduleBaseDir.resolve(relativePath); - if (projectBaseDir == null) { - projectBaseDir = moduleBaseDir; - } - String projectRelativePath = projectBaseDir.relativize(absolutePath).toString(); - DefaultIndexedFile indexedFile = new DefaultIndexedFile(absolutePath, projectKey, projectRelativePath, relativePath, type, language, id, new SensorStrategy()); - DefaultInputFile inputFile = new DefaultInputFile(indexedFile, - f -> f.setMetadata(new Metadata(lines, nonBlankLines, hash, originalLineStartOffsets, originalLineEndOffsets, lastValidOffset)), - contents); - inputFile.setStatus(status); - inputFile.setCharset(charset); - inputFile.setPublished(publish); - return inputFile; - } - - public static DefaultInputModule newDefaultInputModule(String moduleKey, File baseDir) { - ProjectDefinition definition = ProjectDefinition.create() - .setKey(moduleKey) - .setBaseDir(baseDir) - .setWorkDir(new File(baseDir, ".sonar")); - return newDefaultInputModule(definition); - } - - public static DefaultInputModule newDefaultInputModule(ProjectDefinition projectDefinition) { - return new DefaultInputModule(projectDefinition, TestInputFileBuilder.nextBatchId()); - } - - public static DefaultInputModule newDefaultInputModule(AbstractProjectOrModule parent, String key) throws IOException { - Path basedir = parent.getBaseDir().resolve(key); - Files.createDirectory(basedir); - return newDefaultInputModule(key, basedir.toFile()); - } - - public static DefaultInputProject newDefaultInputProject(String projectKey, File baseDir) { - ProjectDefinition definition = ProjectDefinition.create() - .setKey(projectKey) - .setBaseDir(baseDir) - .setWorkDir(new File(baseDir, ".sonar")); - return newDefaultInputProject(definition); - } - - public static DefaultInputProject newDefaultInputProject(ProjectDefinition projectDefinition) { - return new DefaultInputProject(projectDefinition, TestInputFileBuilder.nextBatchId()); - } - - public static DefaultInputProject newDefaultInputProject(String key, Path baseDir) throws IOException { - Files.createDirectory(baseDir); - return newDefaultInputProject(key, baseDir.toFile()); - } - - public static DefaultInputDir newDefaultInputDir(AbstractProjectOrModule module, String relativePath) throws IOException { - Path basedir = module.getBaseDir().resolve(relativePath); - Files.createDirectory(basedir); - return new DefaultInputDir(module.key(), relativePath) - .setModuleBaseDir(module.getBaseDir()); - } - - public static DefaultInputFile newDefaultInputFile(Path projectBaseDir, AbstractProjectOrModule module, String relativePath) { - return new TestInputFileBuilder(module.key(), relativePath) - .setStatus(InputFile.Status.SAME) - .setProjectBaseDir(projectBaseDir) - .setModuleBaseDir(module.getBaseDir()) - .build(); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/charhandler/CharHandler.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/charhandler/CharHandler.java deleted file mode 100644 index 737f6c29071..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/charhandler/CharHandler.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.charhandler; - -public abstract class CharHandler { - - public void handleAll(char c) { - } - - public void handleIgnoreEoL(char c) { - } - - public void newLine() { - } - - public void eof() { - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/charhandler/FileHashComputer.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/charhandler/FileHashComputer.java deleted file mode 100644 index 46229a5c70b..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/charhandler/FileHashComputer.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.charhandler; - -import java.nio.ByteBuffer; -import java.nio.CharBuffer; -import java.nio.charset.CharacterCodingException; -import java.nio.charset.CharsetEncoder; -import java.nio.charset.CodingErrorAction; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import org.apache.commons.codec.binary.Hex; -import org.apache.commons.codec.digest.DigestUtils; - -public class FileHashComputer extends CharHandler { - private static final char LINE_FEED = '\n'; - - - private MessageDigest globalMd5Digest = DigestUtils.getMd5Digest(); - private StringBuilder sb = new StringBuilder(); - private final CharsetEncoder encoder; - private final String filePath; - - public FileHashComputer(String filePath) { - encoder = StandardCharsets.UTF_8.newEncoder() - .onMalformedInput(CodingErrorAction.REPLACE) - .onUnmappableCharacter(CodingErrorAction.REPLACE); - this.filePath = filePath; - } - - @Override - public void handleIgnoreEoL(char c) { - sb.append(c); - } - - @Override - public void newLine() { - sb.append(LINE_FEED); - processBuffer(); - sb.setLength(0); - } - - @Override - public void eof() { - if (sb.length() > 0) { - processBuffer(); - } - } - - private void processBuffer() { - try { - if (sb.length() > 0) { - ByteBuffer encoded = encoder.encode(CharBuffer.wrap(sb)); - globalMd5Digest.update(encoded.array(), 0, encoded.limit()); - } - } catch (CharacterCodingException e) { - throw new IllegalStateException("Error encoding line hash in file: " + filePath, e); - } - } - - public String getHash() { - return Hex.encodeHexString(globalMd5Digest.digest()); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/charhandler/IntArrayList.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/charhandler/IntArrayList.java deleted file mode 100644 index 12674145399..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/charhandler/IntArrayList.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.charhandler; - -import java.util.Arrays; -import java.util.Collection; - -/** - * Specialization of {@link java.util.ArrayList} to create a list of int (only append elements) and then produce an int[]. - */ -class IntArrayList { - - /** - * Default initial capacity. - */ - private static final int DEFAULT_CAPACITY = 10; - - /** - * Shared empty array instance used for default sized empty instances. We - * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when - * first element is added. - */ - private static final int[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; - - /** - * The array buffer into which the elements of the ArrayList are stored. - * The capacity of the IntArrayList is the length of this array buffer. Any - * empty IntArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA - * will be expanded to DEFAULT_CAPACITY when the first element is added. - */ - private int[] elementData; - - /** - * The size of the IntArrayList (the number of elements it contains). - */ - private int size; - - /** - * Constructs an empty list with an initial capacity of ten. - */ - public IntArrayList() { - this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; - } - - /** - * Trims the capacity of this <tt>IntArrayList</tt> instance to be the - * list's current size and return the internal array. An application can use this operation to minimize - * the storage of an <tt>IntArrayList</tt> instance. - */ - public int[] trimAndGet() { - if (size < elementData.length) { - elementData = Arrays.copyOf(elementData, size); - } - return elementData; - } - - private void ensureCapacityInternal(int minCapacity) { - int capacity = minCapacity; - if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { - capacity = Math.max(DEFAULT_CAPACITY, minCapacity); - } - - ensureExplicitCapacity(capacity); - } - - private void ensureExplicitCapacity(int minCapacity) { - if (minCapacity - elementData.length > 0) { - grow(minCapacity); - } - } - - /** - * Increases the capacity to ensure that it can hold at least the - * number of elements specified by the minimum capacity argument. - * - * @param minCapacity the desired minimum capacity - */ - private void grow(int minCapacity) { - int oldCapacity = elementData.length; - int newCapacity = oldCapacity + (oldCapacity >> 1); - if (newCapacity - minCapacity < 0) { - newCapacity = minCapacity; - } - elementData = Arrays.copyOf(elementData, newCapacity); - } - - /** - * Appends the specified element to the end of this list. - * - * @param e element to be appended to this list - * @return <tt>true</tt> (as specified by {@link Collection#add}) - */ - public boolean add(int e) { - ensureCapacityInternal(size + 1); - elementData[size] = e; - size++; - return true; - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/charhandler/LineCounter.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/charhandler/LineCounter.java deleted file mode 100644 index 7cac0f2b0a0..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/charhandler/LineCounter.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.charhandler; - -import java.nio.charset.Charset; -import org.sonar.api.CoreProperties; -import org.sonar.api.utils.log.Logger; -import org.sonar.api.utils.log.Loggers; - -public class LineCounter extends CharHandler { - private static final Logger LOG = Loggers.get(LineCounter.class); - - private int lines = 1; - private int nonBlankLines = 0; - private boolean blankLine = true; - boolean alreadyLoggedInvalidCharacter = false; - private final String filePath; - private final Charset encoding; - - public LineCounter(String filePath, Charset encoding) { - this.filePath = filePath; - this.encoding = encoding; - } - - @Override - public void handleAll(char c) { - if (!alreadyLoggedInvalidCharacter && c == '\ufffd') { - LOG.warn("Invalid character encountered in file {} at line {} for encoding {}. Please fix file content or configure the encoding to be used using property '{}'.", filePath, - lines, encoding, CoreProperties.ENCODING_PROPERTY); - alreadyLoggedInvalidCharacter = true; - } - } - - @Override - public void newLine() { - lines++; - if (!blankLine) { - nonBlankLines++; - } - blankLine = true; - } - - @Override - public void handleIgnoreEoL(char c) { - if (!Character.isWhitespace(c)) { - blankLine = false; - } - } - - @Override - public void eof() { - if (!blankLine) { - nonBlankLines++; - } - } - - public int lines() { - return lines; - } - - public int nonBlankLines() { - return nonBlankLines; - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/charhandler/LineHashComputer.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/charhandler/LineHashComputer.java deleted file mode 100644 index 5435499e505..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/charhandler/LineHashComputer.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.charhandler; - -import java.io.File; -import java.nio.ByteBuffer; -import java.nio.CharBuffer; -import java.nio.charset.CharacterCodingException; -import java.nio.charset.CharsetEncoder; -import java.nio.charset.CodingErrorAction; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import org.apache.commons.codec.digest.DigestUtils; -import org.sonar.scanner.fs.FileMetadata; - -public class LineHashComputer extends CharHandler { - private final MessageDigest lineMd5Digest = DigestUtils.getMd5Digest(); - private final CharsetEncoder encoder; - private final StringBuilder sb = new StringBuilder(); - private final FileMetadata.LineHashConsumer consumer; - private final File file; - private int line = 1; - - public LineHashComputer(FileMetadata.LineHashConsumer consumer, File f) { - this.consumer = consumer; - this.file = f; - this.encoder = StandardCharsets.UTF_8.newEncoder() - .onMalformedInput(CodingErrorAction.REPLACE) - .onUnmappableCharacter(CodingErrorAction.REPLACE); - } - - @Override - public void handleIgnoreEoL(char c) { - if (!Character.isWhitespace(c)) { - sb.append(c); - } - } - - @Override - public void newLine() { - processBuffer(); - sb.setLength(0); - line++; - } - - @Override - public void eof() { - if (this.line > 0) { - processBuffer(); - } - } - - private void processBuffer() { - try { - if (sb.length() > 0) { - ByteBuffer encoded = encoder.encode(CharBuffer.wrap(sb)); - lineMd5Digest.update(encoded.array(), 0, encoded.limit()); - consumer.consume(line, lineMd5Digest.digest()); - } - } catch (CharacterCodingException e) { - throw new IllegalStateException("Error encoding line hash in file: " + file.getAbsolutePath(), e); - } - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/charhandler/LineOffsetCounter.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/charhandler/LineOffsetCounter.java deleted file mode 100644 index 74b7f4867ba..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/charhandler/LineOffsetCounter.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.charhandler; - -public class LineOffsetCounter extends CharHandler { - private long currentOriginalLineStartOffset = 0; - private long currentOriginalLineEndOffset = 0; - private final IntArrayList originalLineStartOffsets = new IntArrayList(); - private final IntArrayList originalLineEndOffsets = new IntArrayList(); - private long lastValidOffset = 0; - - public LineOffsetCounter() { - originalLineStartOffsets.add(0); - } - - @Override - public void handleAll(char c) { - currentOriginalLineStartOffset++; - } - - @Override - public void handleIgnoreEoL(char c) { - currentOriginalLineEndOffset++; - } - - @Override - public void newLine() { - if (currentOriginalLineStartOffset > Integer.MAX_VALUE) { - throw new IllegalStateException("File is too big: " + currentOriginalLineStartOffset); - } - originalLineStartOffsets.add((int) currentOriginalLineStartOffset); - originalLineEndOffsets.add((int) currentOriginalLineEndOffset); - currentOriginalLineEndOffset = currentOriginalLineStartOffset; - } - - @Override - public void eof() { - originalLineEndOffsets.add((int) currentOriginalLineEndOffset); - lastValidOffset = currentOriginalLineStartOffset; - } - - public int[] getOriginalLineStartOffsets() { - return originalLineStartOffsets.trimAndGet(); - } - - public int[] getOriginalLineEndOffsets() { - return originalLineEndOffsets.trimAndGet(); - } - - public int getLastValidOffset() { - if (lastValidOffset > Integer.MAX_VALUE) { - throw new IllegalStateException("File is too big: " + lastValidOffset); - } - return (int) lastValidOffset; - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/charhandler/package-info.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/charhandler/package-info.java deleted file mode 100644 index 4e5375fc17f..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/charhandler/package-info.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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. - */ -@ParametersAreNonnullByDefault -package org.sonar.scanner.fs.charhandler; - -import javax.annotation.ParametersAreNonnullByDefault; - diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/AbsolutePathPredicate.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/AbsolutePathPredicate.java deleted file mode 100644 index c55099a8884..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/AbsolutePathPredicate.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import java.io.File; -import java.nio.file.Path; -import java.util.Arrays; -import java.util.Collections; -import org.sonar.api.batch.fs.FileSystem.Index; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.scan.filesystem.PathResolver; -import org.sonar.api.utils.PathUtils; - -/** - * @since 4.2 - */ -class AbsolutePathPredicate extends AbstractFilePredicate { - - private final String path; - private final Path baseDir; - - AbsolutePathPredicate(String path, Path baseDir) { - this.baseDir = baseDir; - this.path = PathUtils.sanitize(path); - } - - @Override - public boolean apply(InputFile f) { - return path.equals(f.absolutePath()); - } - - @Override - public Iterable<InputFile> get(Index index) { - String relative = PathUtils.sanitize(new PathResolver().relativePath(baseDir.toFile(), new File(path))); - if (relative == null) { - return Collections.emptyList(); - } - InputFile f = index.inputFile(relative); - return f != null ? Arrays.asList(f) : Collections.<InputFile>emptyList(); - } - - @Override - public int priority() { - return USE_INDEX; - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/AbstractFilePredicate.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/AbstractFilePredicate.java deleted file mode 100644 index 4f6952611d7..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/AbstractFilePredicate.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import java.util.stream.StreamSupport; -import org.sonar.api.batch.fs.FileSystem.Index; -import org.sonar.api.batch.fs.InputFile; - -/** - * Partial implementation of {@link OptimizedFilePredicate}. - * @since 5.1 - */ -public abstract class AbstractFilePredicate implements OptimizedFilePredicate { - - protected static final int DEFAULT_PRIORITY = 10; - protected static final int USE_INDEX = 20; - - @Override - public Iterable<InputFile> filter(Iterable<InputFile> target) { - return () -> StreamSupport.stream(target.spliterator(), false) - .filter(this::apply) - .iterator(); - } - - @Override - public Iterable<InputFile> get(Index index) { - return filter(index.inputFiles()); - } - - @Override - public int priority() { - return DEFAULT_PRIORITY; - } - - @Override - public final int compareTo(OptimizedFilePredicate o) { - return o.priority() - priority(); - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/AndPredicate.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/AndPredicate.java deleted file mode 100644 index 024964256ba..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/AndPredicate.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import org.sonar.api.batch.fs.FilePredicate; -import org.sonar.api.batch.fs.FileSystem.Index; -import org.sonar.api.batch.fs.InputFile; - -import static java.util.stream.Collectors.toList; - -/** - * @since 4.2 - */ -class AndPredicate extends AbstractFilePredicate implements OperatorPredicate { - - private final List<OptimizedFilePredicate> predicates = new ArrayList<>(); - - private AndPredicate() { - } - - public static FilePredicate create(Collection<FilePredicate> predicates) { - if (predicates.isEmpty()) { - return TruePredicate.TRUE; - } - AndPredicate result = new AndPredicate(); - for (FilePredicate filePredicate : predicates) { - if (filePredicate == TruePredicate.TRUE) { - continue; - } else if (filePredicate == FalsePredicate.FALSE) { - return FalsePredicate.FALSE; - } else if (filePredicate instanceof AndPredicate) { - result.predicates.addAll(((AndPredicate) filePredicate).predicates); - } else { - result.predicates.add(OptimizedFilePredicateAdapter.create(filePredicate)); - } - } - Collections.sort(result.predicates); - return result; - } - - @Override - public boolean apply(InputFile f) { - for (OptimizedFilePredicate predicate : predicates) { - if (!predicate.apply(f)) { - return false; - } - } - return true; - } - - @Override - public Iterable<InputFile> filter(Iterable<InputFile> target) { - Iterable<InputFile> result = target; - for (OptimizedFilePredicate predicate : predicates) { - result = predicate.filter(result); - } - return result; - } - - @Override - public Iterable<InputFile> get(Index index) { - if (predicates.isEmpty()) { - return index.inputFiles(); - } - // Optimization, use get on first predicate then filter with next predicates - Iterable<InputFile> result = predicates.get(0).get(index); - for (int i = 1; i < predicates.size(); i++) { - result = predicates.get(i).filter(result); - } - return result; - } - - Collection<OptimizedFilePredicate> predicates() { - return predicates; - } - - @Override - public List<FilePredicate> operands() { - return predicates.stream().map(p -> (FilePredicate) p).collect(toList()); - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/DefaultFilePredicates.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/DefaultFilePredicates.java deleted file mode 100644 index bcda1ac7351..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/DefaultFilePredicates.java +++ /dev/null @@ -1,214 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import java.io.File; -import java.net.URI; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import org.sonar.api.batch.fs.FilePredicate; -import org.sonar.api.batch.fs.FilePredicates; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.InputFile.Status; -import org.sonar.api.batch.fs.internal.PathPattern; - -/** - * Factory of {@link FilePredicate} - * - * @since 4.2 - */ -public class DefaultFilePredicates implements FilePredicates { - - private final Path baseDir; - - /** - * Client code should use {@link org.sonar.api.batch.fs.FileSystem#predicates()} to get an instance - */ - public DefaultFilePredicates(Path baseDir) { - this.baseDir = baseDir; - } - - /** - * Returns a predicate that always evaluates to true - */ - @Override - public FilePredicate all() { - return TruePredicate.TRUE; - } - - /** - * Returns a predicate that always evaluates to false - */ - @Override - public FilePredicate none() { - return FalsePredicate.FALSE; - } - - @Override - public FilePredicate hasAbsolutePath(String s) { - return new AbsolutePathPredicate(s, baseDir); - } - - /** - * non-normalized path and Windows-style path are supported - */ - @Override - public FilePredicate hasRelativePath(String s) { - return new RelativePathPredicate(s); - } - - @Override - public FilePredicate hasFilename(String s) { - return new FilenamePredicate(s); - } - - @Override - public FilePredicate hasExtension(String s) { - return new FileExtensionPredicate(s); - } - - @Override - public FilePredicate hasURI(URI uri) { - return new URIPredicate(uri, baseDir); - } - - @Override - public FilePredicate matchesPathPattern(String inclusionPattern) { - return new PathPatternPredicate(PathPattern.create(inclusionPattern)); - } - - @Override - public FilePredicate matchesPathPatterns(String[] inclusionPatterns) { - if (inclusionPatterns.length == 0) { - return TruePredicate.TRUE; - } - FilePredicate[] predicates = new FilePredicate[inclusionPatterns.length]; - for (int i = 0; i < inclusionPatterns.length; i++) { - predicates[i] = new PathPatternPredicate(PathPattern.create(inclusionPatterns[i])); - } - return or(predicates); - } - - @Override - public FilePredicate doesNotMatchPathPattern(String exclusionPattern) { - return not(matchesPathPattern(exclusionPattern)); - } - - @Override - public FilePredicate doesNotMatchPathPatterns(String[] exclusionPatterns) { - if (exclusionPatterns.length == 0) { - return TruePredicate.TRUE; - } - return not(matchesPathPatterns(exclusionPatterns)); - } - - @Override - public FilePredicate hasPath(String s) { - File file = new File(s); - if (file.isAbsolute()) { - return hasAbsolutePath(s); - } - return hasRelativePath(s); - } - - @Override - public FilePredicate is(File ioFile) { - if (ioFile.isAbsolute()) { - return hasAbsolutePath(ioFile.getAbsolutePath()); - } - return hasRelativePath(ioFile.getPath()); - } - - @Override - public FilePredicate hasLanguage(String language) { - return new LanguagePredicate(language); - } - - @Override - public FilePredicate hasLanguages(Collection<String> languages) { - List<FilePredicate> list = new ArrayList<>(); - for (String language : languages) { - list.add(hasLanguage(language)); - } - return or(list); - } - - @Override - public FilePredicate hasLanguages(String... languages) { - List<FilePredicate> list = new ArrayList<>(); - for (String language : languages) { - list.add(hasLanguage(language)); - } - return or(list); - } - - @Override - public FilePredicate hasType(InputFile.Type type) { - return new TypePredicate(type); - } - - @Override - public FilePredicate not(FilePredicate p) { - return new NotPredicate(p); - } - - @Override - public FilePredicate or(Collection<FilePredicate> or) { - return OrPredicate.create(or); - } - - @Override - public FilePredicate or(FilePredicate... or) { - return OrPredicate.create(Arrays.asList(or)); - } - - @Override - public FilePredicate or(FilePredicate first, FilePredicate second) { - return OrPredicate.create(Arrays.asList(first, second)); - } - - @Override - public FilePredicate and(Collection<FilePredicate> and) { - return AndPredicate.create(and); - } - - @Override - public FilePredicate and(FilePredicate... and) { - return AndPredicate.create(Arrays.asList(and)); - } - - @Override - public FilePredicate and(FilePredicate first, FilePredicate second) { - return AndPredicate.create(Arrays.asList(first, second)); - } - - @Override - public FilePredicate hasStatus(Status status) { - return new StatusPredicate(status); - } - - @Override - public FilePredicate hasAnyStatus() { - return new StatusPredicate(null); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/FalsePredicate.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/FalsePredicate.java deleted file mode 100644 index e76bb84e6ae..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/FalsePredicate.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import java.util.Collections; -import org.sonar.api.batch.fs.FilePredicate; -import org.sonar.api.batch.fs.FileSystem.Index; -import org.sonar.api.batch.fs.InputFile; - -class FalsePredicate extends AbstractFilePredicate { - - static final FilePredicate FALSE = new FalsePredicate(); - - @Override - public boolean apply(InputFile inputFile) { - return false; - } - - @Override - public Iterable<InputFile> filter(Iterable<InputFile> target) { - return Collections.emptyList(); - } - - @Override - public Iterable<InputFile> get(Index index) { - return Collections.emptyList(); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/FileExtensionPredicate.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/FileExtensionPredicate.java deleted file mode 100644 index 46f257f25a4..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/FileExtensionPredicate.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import java.util.Locale; -import org.sonar.api.batch.fs.FileSystem; -import org.sonar.api.batch.fs.InputFile; - -/** - * @since 6.3 - */ -public class FileExtensionPredicate extends AbstractFilePredicate { - - private final String extension; - - public FileExtensionPredicate(String extension) { - this.extension = lowercase(extension); - } - - @Override - public boolean apply(InputFile inputFile) { - return extension.equals(getExtension(inputFile)); - } - - @Override - public Iterable<InputFile> get(FileSystem.Index index) { - return index.getFilesByExtension(extension); - } - - public static String getExtension(InputFile inputFile) { - return getExtension(inputFile.filename()); - } - - static String getExtension(String name) { - int index = name.lastIndexOf('.'); - if (index < 0) { - return ""; - } - return lowercase(name.substring(index + 1)); - } - - private static String lowercase(String extension) { - return extension.toLowerCase(Locale.ENGLISH); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/FilenamePredicate.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/FilenamePredicate.java deleted file mode 100644 index a99d9314c77..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/FilenamePredicate.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import org.sonar.api.batch.fs.FileSystem; -import org.sonar.api.batch.fs.InputFile; - -/** - * @since 6.3 - */ -public class FilenamePredicate extends AbstractFilePredicate { - private final String filename; - - public FilenamePredicate(String filename) { - this.filename = filename; - } - - @Override - public boolean apply(InputFile inputFile) { - return filename.equals(inputFile.filename()); - } - - @Override - public Iterable<InputFile> get(FileSystem.Index index) { - return index.getFilesByName(filename); - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/LanguagePredicate.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/LanguagePredicate.java deleted file mode 100644 index 5492e224558..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/LanguagePredicate.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import org.sonar.api.batch.fs.InputFile; - -/** - * @since 4.2 - */ -class LanguagePredicate extends AbstractFilePredicate { - private final String language; - - LanguagePredicate(String language) { - this.language = language; - } - - @Override - public boolean apply(InputFile f) { - return language.equals(f.language()); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/NotPredicate.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/NotPredicate.java deleted file mode 100644 index 5bc68adfbe7..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/NotPredicate.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import java.util.Arrays; -import java.util.List; -import org.sonar.api.batch.fs.FilePredicate; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.scanner.fs.predicates.AbstractFilePredicate; -import org.sonar.scanner.fs.predicates.OperatorPredicate; - -/** - * @since 4.2 - */ -class NotPredicate extends AbstractFilePredicate implements OperatorPredicate { - - private final FilePredicate predicate; - - NotPredicate(FilePredicate predicate) { - this.predicate = predicate; - } - - @Override - public boolean apply(InputFile f) { - return !predicate.apply(f); - } - - @Override - public List<FilePredicate> operands() { - return Arrays.asList(predicate); - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/OperatorPredicate.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/OperatorPredicate.java deleted file mode 100644 index c4493091865..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/OperatorPredicate.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import java.util.List; -import org.sonar.api.batch.fs.FilePredicate; - -/** - * A predicate that associate other predicates - */ -public interface OperatorPredicate extends FilePredicate { - - List<FilePredicate> operands(); - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/OptimizedFilePredicate.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/OptimizedFilePredicate.java deleted file mode 100644 index 9b5216d5549..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/OptimizedFilePredicate.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import org.sonar.api.batch.fs.FilePredicate; -import org.sonar.api.batch.fs.FileSystem; -import org.sonar.api.batch.fs.InputFile; - -/** - * Optimized version of FilePredicate allowing to speed up query by looking at InputFile by index. - */ -public interface OptimizedFilePredicate extends FilePredicate, Comparable<OptimizedFilePredicate> { - - /** - * Filter provided files to keep only the ones that are valid for this predicate - */ - Iterable<InputFile> filter(Iterable<InputFile> inputFiles); - - /** - * Get all files that are valid for this predicate. - */ - Iterable<InputFile> get(FileSystem.Index index); - - /** - * For optimization. FilePredicates will be applied in priority order. For example when doing - * p.and(p1, p2, p3) then p1, p2 and p3 will be applied according to their priority value. Higher priority value - * are applied first. - * Assign a high priority when the predicate will likely highly reduce the set of InputFiles to filter. Also - * {@link RelativePathPredicate} and AbsolutePathPredicate have a high priority since they are using cache index. - */ - int priority(); -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/OptimizedFilePredicateAdapter.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/OptimizedFilePredicateAdapter.java deleted file mode 100644 index ba46aff6847..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/OptimizedFilePredicateAdapter.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import org.sonar.api.batch.fs.FilePredicate; -import org.sonar.api.batch.fs.InputFile; - -public class OptimizedFilePredicateAdapter extends AbstractFilePredicate { - - private FilePredicate unoptimizedPredicate; - - private OptimizedFilePredicateAdapter(FilePredicate unoptimizedPredicate) { - this.unoptimizedPredicate = unoptimizedPredicate; - } - - @Override - public boolean apply(InputFile inputFile) { - return unoptimizedPredicate.apply(inputFile); - } - - public static OptimizedFilePredicate create(FilePredicate predicate) { - if (predicate instanceof OptimizedFilePredicate) { - return (OptimizedFilePredicate) predicate; - } else { - return new OptimizedFilePredicateAdapter(predicate); - } - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/OrPredicate.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/OrPredicate.java deleted file mode 100644 index 2690a1261d9..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/OrPredicate.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import org.sonar.api.batch.fs.FilePredicate; -import org.sonar.api.batch.fs.InputFile; - -/** - * @since 4.2 - */ -class OrPredicate extends AbstractFilePredicate implements OperatorPredicate { - - private final List<FilePredicate> predicates = new ArrayList<>(); - - private OrPredicate() { - } - - public static FilePredicate create(Collection<FilePredicate> predicates) { - if (predicates.isEmpty()) { - return TruePredicate.TRUE; - } - OrPredicate result = new OrPredicate(); - for (FilePredicate filePredicate : predicates) { - if (filePredicate == TruePredicate.TRUE) { - return TruePredicate.TRUE; - } else if (filePredicate == FalsePredicate.FALSE) { - continue; - } else if (filePredicate instanceof OrPredicate) { - result.predicates.addAll(((OrPredicate) filePredicate).predicates); - } else { - result.predicates.add(filePredicate); - } - } - return result; - } - - @Override - public boolean apply(InputFile f) { - for (FilePredicate predicate : predicates) { - if (predicate.apply(f)) { - return true; - } - } - return false; - } - - Collection<FilePredicate> predicates() { - return predicates; - } - - @Override - public List<FilePredicate> operands() { - return predicates; - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/PathPatternPredicate.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/PathPatternPredicate.java deleted file mode 100644 index 032d820919b..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/PathPatternPredicate.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import java.nio.file.Paths; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.internal.PathPattern; - -/** - * @since 4.2 - */ -class PathPatternPredicate extends AbstractFilePredicate { - - private final PathPattern pattern; - - PathPatternPredicate(PathPattern pattern) { - this.pattern = pattern; - } - - @Override - public boolean apply(InputFile f) { - return pattern.match(f.path(), Paths.get(f.relativePath())); - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/RelativePathPredicate.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/RelativePathPredicate.java deleted file mode 100644 index d79221ea7f3..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/RelativePathPredicate.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import java.util.Collections; -import javax.annotation.Nullable; -import org.sonar.api.batch.fs.FileSystem.Index; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.utils.PathUtils; - -/** - * @since 4.2 - */ -public class RelativePathPredicate extends AbstractFilePredicate { - - @Nullable - private final String path; - - RelativePathPredicate(String path) { - this.path = PathUtils.sanitize(path); - } - - public String path() { - return path; - } - - @Override - public boolean apply(InputFile f) { - if (path == null) { - return false; - } - - return path.equals(f.relativePath()); - } - - @Override - public Iterable<InputFile> get(Index index) { - if (path != null) { - InputFile f = index.inputFile(this.path); - if (f != null) { - return Collections.singletonList(f); - } - } - return Collections.emptyList(); - } - - @Override - public int priority() { - return USE_INDEX; - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/StatusPredicate.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/StatusPredicate.java deleted file mode 100644 index fb88b965a07..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/StatusPredicate.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import javax.annotation.Nullable; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.scanner.fs.predicates.AbstractFilePredicate; - -/** - * @deprecated since 7.8 - */ -@Deprecated -public class StatusPredicate extends AbstractFilePredicate { - - private final InputFile.Status status; - - StatusPredicate(@Nullable InputFile.Status status) { - this.status = status; - } - - @Override - public boolean apply(InputFile f) { - return status == null || status == f.status(); - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/TruePredicate.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/TruePredicate.java deleted file mode 100644 index 562515ce06e..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/TruePredicate.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import org.sonar.api.batch.fs.FilePredicate; -import org.sonar.api.batch.fs.FileSystem.Index; -import org.sonar.api.batch.fs.InputFile; - -class TruePredicate extends AbstractFilePredicate { - - static final FilePredicate TRUE = new TruePredicate(); - - @Override - public boolean apply(InputFile inputFile) { - return true; - } - - @Override - public Iterable<InputFile> get(Index index) { - return index.inputFiles(); - } - - @Override - public Iterable<InputFile> filter(Iterable<InputFile> target) { - return target; - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/TypePredicate.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/TypePredicate.java deleted file mode 100644 index 3cddc59ad17..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/TypePredicate.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import org.sonar.api.batch.fs.InputFile; - -/** - * @since 4.2 - */ -class TypePredicate extends AbstractFilePredicate { - - private final InputFile.Type type; - - TypePredicate(InputFile.Type type) { - this.type = type; - } - - @Override - public boolean apply(InputFile f) { - return type == f.type(); - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/URIPredicate.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/URIPredicate.java deleted file mode 100644 index 9e25267de05..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/fs/predicates/URIPredicate.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import java.net.URI; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.Collections; -import java.util.Optional; -import org.sonar.api.batch.fs.FileSystem.Index; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.scan.filesystem.PathResolver; - -/** - * @since 6.6 - */ -class URIPredicate extends AbstractFilePredicate { - - private final URI uri; - private final Path baseDir; - - URIPredicate(URI uri, Path baseDir) { - this.baseDir = baseDir; - this.uri = uri; - } - - @Override - public boolean apply(InputFile f) { - return uri.equals(f.uri()); - } - - @Override - public Iterable<InputFile> get(Index index) { - Path path = Paths.get(uri); - Optional<String> relative = PathResolver.relativize(baseDir, path); - if (!relative.isPresent()) { - return Collections.emptyList(); - } - InputFile f = index.inputFile(relative.get()); - return f != null ? Arrays.asList(f) : Collections.<InputFile>emptyList(); - } - - @Override - public int priority() { - return USE_INDEX; - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/AbstractDefaultIssue.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/AbstractDefaultIssue.java deleted file mode 100644 index 4b13e2016d1..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/AbstractDefaultIssue.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.issue; - -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import javax.annotation.Nullable; -import org.sonar.api.batch.fs.InputComponent; -import org.sonar.scanner.sensor.DefaultStorable; -import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.api.batch.sensor.issue.Issue.Flow; -import org.sonar.api.batch.sensor.issue.IssueLocation; -import org.sonar.api.batch.sensor.issue.NewIssueLocation; -import org.sonar.api.utils.PathUtils; -import org.sonar.scanner.fs.DefaultInputDir; -import org.sonar.scanner.fs.DefaultInputModule; -import org.sonar.scanner.fs.DefaultInputProject; - -import static java.util.Collections.unmodifiableList; -import static java.util.stream.Collectors.toList; -import static org.sonar.api.utils.Preconditions.checkArgument; -import static org.sonar.api.utils.Preconditions.checkState; - -public abstract class AbstractDefaultIssue<T extends AbstractDefaultIssue> extends DefaultStorable { - protected IssueLocation primaryLocation; - protected List<List<IssueLocation>> flows = new ArrayList<>(); - protected DefaultInputProject project; - - protected AbstractDefaultIssue(DefaultInputProject project) { - this(project, null); - } - - public AbstractDefaultIssue(DefaultInputProject project, @Nullable SensorStorage storage) { - super(storage); - this.project = project; - } - - public IssueLocation primaryLocation() { - return primaryLocation; - } - - public List<Flow> flows() { - return this.flows.stream() - .<Flow>map(l -> () -> unmodifiableList(new ArrayList<>(l))) - .collect(toList()); - } - - public NewIssueLocation newLocation() { - return new DefaultIssueLocation(); - } - - public T at(NewIssueLocation primaryLocation) { - checkArgument(primaryLocation != null, "Cannot use a location that is null"); - checkState(this.primaryLocation == null, "at() already called"); - this.primaryLocation = rewriteLocation((DefaultIssueLocation) primaryLocation); - checkArgument(this.primaryLocation.inputComponent() != null, "Cannot use a location with no input component"); - return (T) this; - } - - public T addLocation(NewIssueLocation secondaryLocation) { - flows.add(Collections.singletonList(rewriteLocation((DefaultIssueLocation) secondaryLocation))); - return (T) this; - } - - public T addFlow(Iterable<NewIssueLocation> locations) { - List<IssueLocation> flowAsList = new ArrayList<>(); - for (NewIssueLocation issueLocation : locations) { - flowAsList.add(rewriteLocation((DefaultIssueLocation) issueLocation)); - } - flows.add(flowAsList); - return (T) this; - } - - private DefaultIssueLocation rewriteLocation(DefaultIssueLocation location) { - InputComponent component = location.inputComponent(); - Optional<Path> dirOrModulePath = Optional.empty(); - - if (component instanceof DefaultInputDir) { - DefaultInputDir dirComponent = (DefaultInputDir) component; - dirOrModulePath = Optional.of(project.getBaseDir().relativize(dirComponent.path())); - } else if (component instanceof DefaultInputModule && !Objects.equals(project.key(), component.key())) { - DefaultInputModule moduleComponent = (DefaultInputModule) component; - dirOrModulePath = Optional.of(project.getBaseDir().relativize(moduleComponent.getBaseDir())); - } - - if (dirOrModulePath.isPresent()) { - String path = PathUtils.sanitize(dirOrModulePath.get().toString()); - DefaultIssueLocation fixedLocation = new DefaultIssueLocation(); - fixedLocation.on(project); - StringBuilder fullMessage = new StringBuilder(); - if (path != null && !path.isEmpty()) { - fullMessage.append("[").append(path).append("] "); - } - fullMessage.append(location.message()); - fixedLocation.message(fullMessage.toString()); - return fixedLocation; - } else { - return location; - } - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/DefaultFilterableIssue.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/DefaultFilterableIssue.java index 5485c348c87..5d107da2d76 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/DefaultFilterableIssue.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/DefaultFilterableIssue.java @@ -28,9 +28,9 @@ import org.sonar.api.batch.fs.TextRange; import org.sonar.api.rule.RuleKey; import org.sonar.api.scan.issue.filter.FilterableIssue; import org.sonar.scanner.ProjectInfo; -import org.sonar.scanner.fs.DefaultInputProject; -import org.sonar.scanner.fs.DefaultTextPointer; -import org.sonar.scanner.fs.DefaultTextRange; +import org.sonar.api.impl.fs.DefaultInputProject; +import org.sonar.api.impl.fs.DefaultTextPointer; +import org.sonar.api.impl.fs.DefaultTextRange; import org.sonar.scanner.protocol.output.ScannerReport.Issue; @ThreadSafe diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/DefaultIssue.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/DefaultIssue.java deleted file mode 100644 index 154dfc91c81..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/DefaultIssue.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.issue; - -import javax.annotation.Nullable; -import org.sonar.api.batch.rule.Severity; -import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.api.batch.sensor.issue.Issue; -import org.sonar.api.batch.sensor.issue.IssueLocation; -import org.sonar.api.batch.sensor.issue.NewIssue; -import org.sonar.api.rule.RuleKey; -import org.sonar.scanner.fs.DefaultInputProject; - -import static java.lang.String.format; -import static java.util.Objects.requireNonNull; -import static org.sonar.api.utils.Preconditions.checkArgument; -import static org.sonar.api.utils.Preconditions.checkState; - -public class DefaultIssue extends AbstractDefaultIssue<DefaultIssue> implements Issue, NewIssue { - private RuleKey ruleKey; - private Double gap; - private Severity overriddenSeverity; - - public DefaultIssue(DefaultInputProject project) { - this(project, null); - } - - public DefaultIssue(DefaultInputProject project, @Nullable SensorStorage storage) { - super(project, storage); - } - - public DefaultIssue forRule(RuleKey ruleKey) { - this.ruleKey = ruleKey; - return this; - } - - public RuleKey ruleKey() { - return this.ruleKey; - } - - @Override - public DefaultIssue gap(@Nullable Double gap) { - checkArgument(gap == null || gap >= 0, format("Gap must be greater than or equal 0 (got %s)", gap)); - this.gap = gap; - return this; - } - - @Override - public DefaultIssue overrideSeverity(@Nullable Severity severity) { - this.overriddenSeverity = severity; - return this; - } - - @Override - public Severity overriddenSeverity() { - return this.overriddenSeverity; - } - - @Override - public Double gap() { - return this.gap; - } - - @Override - public IssueLocation primaryLocation() { - return primaryLocation; - } - - @Override - public void doSave() { - requireNonNull(this.ruleKey, "ruleKey is mandatory on issue"); - checkState(primaryLocation != null, "Primary location is mandatory on every issue"); - storage.store(this); - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/DefaultIssueLocation.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/DefaultIssueLocation.java deleted file mode 100644 index 33018bbcc8f..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/DefaultIssueLocation.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.issue; - -import javax.annotation.Nullable; -import org.sonar.api.batch.fs.InputComponent; -import org.sonar.api.batch.fs.TextRange; -import org.sonar.api.batch.sensor.issue.IssueLocation; -import org.sonar.api.batch.sensor.issue.NewIssueLocation; -import org.sonar.scanner.fs.DefaultInputFile; - -import static java.util.Objects.requireNonNull; -import static org.apache.commons.lang.StringUtils.abbreviate; -import static org.apache.commons.lang.StringUtils.trim; -import static org.sonar.api.utils.Preconditions.checkArgument; -import static org.sonar.api.utils.Preconditions.checkState; - -public class DefaultIssueLocation implements NewIssueLocation, IssueLocation { - - private InputComponent component; - private TextRange textRange; - private String message; - - @Override - public DefaultIssueLocation on(InputComponent component) { - checkArgument(component != null, "Component can't be null"); - checkState(this.component == null, "on() already called"); - this.component = component; - return this; - } - - @Override - public DefaultIssueLocation at(TextRange location) { - checkState(this.component != null, "at() should be called after on()"); - checkState(this.component.isFile(), "at() should be called only for an InputFile."); - DefaultInputFile file = (DefaultInputFile) this.component; - file.validate(location); - this.textRange = location; - return this; - } - - @Override - public DefaultIssueLocation message(String message) { - requireNonNull(message, "Message can't be null"); - if (message.contains("\u0000")) { - throw new IllegalArgumentException(unsupportedCharacterError(message, component)); - } - this.message = abbreviate(trim(message), MESSAGE_MAX_SIZE); - return this; - } - - private static String unsupportedCharacterError(String message, @Nullable InputComponent component) { - String error = "Character \\u0000 is not supported in issue message '" + message + "'"; - if (component != null) { - error += ", on component: " + component.toString(); - } - return error; - } - - @Override - public InputComponent inputComponent() { - return this.component; - } - - @Override - public TextRange textRange() { - return textRange; - } - - @Override - public String message() { - return this.message; - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/DefaultNoSonarFilter.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/DefaultNoSonarFilter.java deleted file mode 100644 index 00d3ba518f1..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/DefaultNoSonarFilter.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.issue; - -import java.util.Set; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.issue.NoSonarFilter; -import org.sonar.scanner.fs.DefaultInputFile; - -public class DefaultNoSonarFilter extends NoSonarFilter { - public NoSonarFilter noSonarInFile(InputFile inputFile, Set<Integer> noSonarLines) { - ((DefaultInputFile) inputFile).noSonarAt(noSonarLines); - return this; - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/IssueFilters.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/IssueFilters.java index 87a4846a81a..3b887b024ef 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/IssueFilters.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/IssueFilters.java @@ -24,7 +24,7 @@ import org.sonar.api.scan.issue.filter.FilterableIssue; import org.sonar.api.scan.issue.filter.IssueFilter; import org.sonar.api.scan.issue.filter.IssueFilterChain; import org.sonar.scanner.ProjectInfo; -import org.sonar.scanner.fs.DefaultInputProject; +import org.sonar.api.impl.fs.DefaultInputProject; import org.sonar.scanner.protocol.output.ScannerReport; /** diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/IssuePublisher.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/IssuePublisher.java index ac02497f474..1bbf26f6bd1 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/IssuePublisher.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/IssuePublisher.java @@ -29,8 +29,8 @@ import org.sonar.api.batch.rule.ActiveRules; import org.sonar.api.batch.sensor.issue.ExternalIssue; import org.sonar.api.batch.sensor.issue.Issue; import org.sonar.api.batch.sensor.issue.Issue.Flow; -import org.sonar.scanner.fs.DefaultInputComponent; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputComponent; +import org.sonar.api.impl.fs.DefaultInputFile; import org.sonar.scanner.protocol.Constants.Severity; import org.sonar.scanner.protocol.output.ScannerReport; import org.sonar.scanner.protocol.output.ScannerReport.IssueLocation; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/ignore/EnforceIssuesFilter.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/ignore/EnforceIssuesFilter.java index e518408f13b..3faefb38407 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/ignore/EnforceIssuesFilter.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/ignore/EnforceIssuesFilter.java @@ -30,7 +30,7 @@ import org.sonar.api.scan.issue.filter.IssueFilter; import org.sonar.api.scan.issue.filter.IssueFilterChain; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputFile; import org.sonar.scanner.issue.DefaultFilterableIssue; import org.sonar.scanner.issue.ignore.pattern.IssueInclusionPatternInitializer; import org.sonar.scanner.issue.ignore.pattern.IssuePattern; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/ignore/IgnoreIssuesFilter.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/ignore/IgnoreIssuesFilter.java index 8d825944b84..2a961ee65ad 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/ignore/IgnoreIssuesFilter.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/ignore/IgnoreIssuesFilter.java @@ -28,7 +28,7 @@ import org.sonar.api.scan.issue.filter.IssueFilterChain; import org.sonar.api.utils.WildcardPattern; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputFile; import org.sonar.scanner.issue.DefaultFilterableIssue; public class IgnoreIssuesFilter implements IssueFilter { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/ignore/scanner/IssueExclusionsLoader.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/ignore/scanner/IssueExclusionsLoader.java index 4c3117835ca..ad9b431b5d3 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/ignore/scanner/IssueExclusionsLoader.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/ignore/scanner/IssueExclusionsLoader.java @@ -26,8 +26,8 @@ import org.apache.commons.lang.StringUtils; import org.sonar.api.notifications.AnalysisWarnings; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.charhandler.CharHandler; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.charhandler.CharHandler; import org.sonar.scanner.issue.ignore.IgnoreIssuesFilter; import org.sonar.scanner.issue.ignore.pattern.BlockIssuePattern; import org.sonar.scanner.issue.ignore.pattern.IssueExclusionPatternInitializer; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/ignore/scanner/IssueExclusionsRegexpScanner.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/ignore/scanner/IssueExclusionsRegexpScanner.java index 2ab767f7f3b..345db834790 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/ignore/scanner/IssueExclusionsRegexpScanner.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/issue/ignore/scanner/IssueExclusionsRegexpScanner.java @@ -27,8 +27,8 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.charhandler.CharHandler; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.charhandler.CharHandler; import org.sonar.scanner.issue.ignore.pattern.LineRange; import org.sonar.scanner.issue.ignore.scanner.IssueExclusionsLoader.DoubleRegexpMatcher; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/mediumtest/AnalysisResult.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/mediumtest/AnalysisResult.java index c75da29f0ed..0e851054801 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/mediumtest/AnalysisResult.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/mediumtest/AnalysisResult.java @@ -37,8 +37,8 @@ import org.sonar.api.batch.fs.TextRange; import org.sonar.api.batch.sensor.highlighting.TypeOfText; import org.sonar.api.scanner.fs.InputProject; import org.sonar.core.util.CloseableIterator; -import org.sonar.scanner.fs.DefaultInputComponent; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputComponent; +import org.sonar.api.impl.fs.DefaultInputFile; import org.sonar.scanner.protocol.output.ScannerReport; import org.sonar.scanner.protocol.output.ScannerReport.Component; import org.sonar.scanner.protocol.output.ScannerReport.Symbol; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/platform/DefaultServer.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/platform/DefaultServer.java index dfe4993d31b..72837700b07 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/platform/DefaultServer.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/platform/DefaultServer.java @@ -27,17 +27,17 @@ import org.sonar.api.SonarRuntime; import org.sonar.api.config.Configuration; import org.sonar.api.platform.Server; import org.sonar.api.utils.DateUtils; -import org.sonar.scanner.bootstrap.ScannerWsClient; +import org.sonar.scanner.bootstrap.DefaultScannerWsClient; import static org.apache.commons.lang.StringUtils.trimToEmpty; public class DefaultServer extends Server { private final Configuration settings; - private final ScannerWsClient client; + private final DefaultScannerWsClient client; private final SonarRuntime runtime; - public DefaultServer(Configuration settings, ScannerWsClient client, SonarRuntime runtime) { + public DefaultServer(Configuration settings, DefaultScannerWsClient client, SonarRuntime runtime) { this.settings = settings; this.client = client; this.runtime = runtime; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/postjob/DefaultPostJobDescriptor.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/postjob/DefaultPostJobDescriptor.java deleted file mode 100644 index 1292e10612f..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/postjob/DefaultPostJobDescriptor.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.postjob; - -import java.util.Arrays; -import java.util.Collection; -import org.sonar.api.batch.postjob.PostJobDescriptor; - -public class DefaultPostJobDescriptor implements PostJobDescriptor { - - private String name; - private String[] properties = new String[0]; - - public String name() { - return name; - } - - public Collection<String> properties() { - return Arrays.asList(properties); - } - - @Override - public DefaultPostJobDescriptor name(String name) { - this.name = name; - return this; - } - - @Override - public DefaultPostJobDescriptor requireProperty(String... propertyKey) { - return requireProperties(propertyKey); - } - - @Override - public DefaultPostJobDescriptor requireProperties(String... propertyKeys) { - this.properties = propertyKeys; - return this; - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/postjob/PostJobOptimizer.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/postjob/PostJobOptimizer.java index cd68e1694fe..ea9acd22d34 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/postjob/PostJobOptimizer.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/postjob/PostJobOptimizer.java @@ -22,6 +22,7 @@ package org.sonar.scanner.postjob; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonar.api.config.Configuration; +import org.sonar.api.impl.sensor.DefaultPostJobDescriptor; public class PostJobOptimizer { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/postjob/PostJobWrapper.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/postjob/PostJobWrapper.java index 60ea2882163..9df6f4cd892 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/postjob/PostJobWrapper.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/postjob/PostJobWrapper.java @@ -21,6 +21,7 @@ package org.sonar.scanner.postjob; import org.sonar.api.batch.postjob.PostJob; import org.sonar.api.batch.postjob.PostJobContext; +import org.sonar.api.impl.sensor.DefaultPostJobDescriptor; public class PostJobWrapper { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ActiveRulesPublisher.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ActiveRulesPublisher.java index f0f8991c073..174659fe796 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ActiveRulesPublisher.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ActiveRulesPublisher.java @@ -20,7 +20,7 @@ package org.sonar.scanner.report; import org.sonar.api.batch.rule.ActiveRules; -import org.sonar.scanner.rule.DefaultActiveRule; +import org.sonar.api.batch.rule.DefaultActiveRule; import org.sonar.scanner.protocol.Constants; import org.sonar.scanner.protocol.output.ScannerReport; import org.sonar.scanner.protocol.output.ScannerReportWriter; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/AnalysisContextReportPublisher.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/AnalysisContextReportPublisher.java index 25780591679..5c6daad40b8 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/AnalysisContextReportPublisher.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/AnalysisContextReportPublisher.java @@ -30,13 +30,13 @@ import java.util.Map; import java.util.TreeSet; import org.apache.commons.lang.StringUtils; import org.sonar.api.CoreProperties; -import org.sonar.api.batch.fs.internal.AbstractProjectOrModule; -import org.sonar.api.batch.fs.internal.DefaultInputModule; -import org.sonar.api.batch.fs.internal.InputModuleHierarchy; +import org.sonar.api.impl.fs.AbstractProjectOrModule; +import org.sonar.api.impl.fs.DefaultInputModule; import org.sonar.api.utils.System2; import org.sonar.core.platform.PluginInfo; import org.sonar.scanner.bootstrap.GlobalServerSettings; import org.sonar.scanner.bootstrap.ScannerPluginRepository; +import org.sonar.scanner.fs.InputModuleHierarchy; import org.sonar.scanner.protocol.output.ScannerReportWriter; import org.sonar.scanner.scan.ProjectServerSettings; import org.sonar.scanner.scan.filesystem.InputComponentStore; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ChangedLinesPublisher.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ChangedLinesPublisher.java index 00d8bed5abf..db7d22baf08 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ChangedLinesPublisher.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ChangedLinesPublisher.java @@ -29,14 +29,14 @@ import org.sonar.api.batch.scm.ScmProvider; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; import org.sonar.api.utils.log.Profiler; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.DefaultInputProject; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputProject; import org.sonar.scanner.protocol.output.ScannerReport; import org.sonar.scanner.protocol.output.ScannerReportWriter; import org.sonar.scanner.scan.branch.BranchConfiguration; import org.sonar.scanner.scan.filesystem.InputComponentStore; import org.sonar.scanner.scm.ScmConfiguration; -import org.sonar.scanner.util.ScannerUtils; +import org.sonar.api.impl.utils.ScannerUtils; public class ChangedLinesPublisher implements ReportPublisherStep { private static final Logger LOG = Loggers.get(ChangedLinesPublisher.class); diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ComponentsPublisher.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ComponentsPublisher.java index 597785f7632..b66fc8e8a93 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ComponentsPublisher.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ComponentsPublisher.java @@ -25,9 +25,9 @@ import org.apache.commons.lang.StringUtils; import org.sonar.api.CoreProperties; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.InputFile.Status; -import org.sonar.scanner.fs.AbstractProjectOrModule; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.DefaultInputProject; +import org.sonar.api.impl.fs.AbstractProjectOrModule; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputProject; import org.sonar.scanner.protocol.output.ScannerReport; import org.sonar.scanner.protocol.output.ScannerReport.Component.ComponentType; import org.sonar.scanner.protocol.output.ScannerReport.Component.FileStatus; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/MetadataPublisher.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/MetadataPublisher.java index be1e838b810..f238735d3cb 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/MetadataPublisher.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/MetadataPublisher.java @@ -32,8 +32,8 @@ import org.sonar.scanner.ProjectInfo; import org.sonar.scanner.bootstrap.ScannerPlugin; import org.sonar.scanner.bootstrap.ScannerPluginRepository; import org.sonar.scanner.cpd.CpdSettings; -import org.sonar.scanner.fs.AbstractProjectOrModule; -import org.sonar.scanner.fs.DefaultInputModule; +import org.sonar.api.impl.fs.AbstractProjectOrModule; +import org.sonar.api.impl.fs.DefaultInputModule; import org.sonar.scanner.fs.InputModuleHierarchy; import org.sonar.scanner.protocol.output.ScannerReport; import org.sonar.scanner.protocol.output.ScannerReport.Metadata.BranchType; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ReportPublisher.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ReportPublisher.java index c2afdc1baf2..46078b34f84 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ReportPublisher.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/ReportPublisher.java @@ -43,7 +43,7 @@ import org.sonar.api.utils.ZipUtils; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; import org.sonar.scanner.bootstrap.GlobalAnalysisMode; -import org.sonar.scanner.bootstrap.ScannerWsClient; +import org.sonar.scanner.bootstrap.DefaultScannerWsClient; import org.sonar.scanner.fs.InputModuleHierarchy; import org.sonar.scanner.protocol.output.ScannerReportReader; import org.sonar.scanner.protocol.output.ScannerReportWriter; @@ -72,7 +72,7 @@ public class ReportPublisher implements Startable { private static final String ID = "id"; private static final String RESOLVED = "resolved"; - private final ScannerWsClient wsClient; + private final DefaultScannerWsClient wsClient; private final AnalysisContextReportPublisher contextPublisher; private final InputModuleHierarchy moduleHierarchy; private final GlobalAnalysisMode analysisMode; @@ -86,7 +86,7 @@ public class ReportPublisher implements Startable { private ScannerReportWriter writer; private ScannerReportReader reader; - public ReportPublisher(ScanProperties properties, ScannerWsClient wsClient, Server server, AnalysisContextReportPublisher contextPublisher, + public ReportPublisher(ScanProperties properties, DefaultScannerWsClient wsClient, Server server, AnalysisContextReportPublisher contextPublisher, InputModuleHierarchy moduleHierarchy, GlobalAnalysisMode analysisMode, TempFolder temp, ReportPublisherStep[] publishers, BranchConfiguration branchConfiguration) { this.wsClient = wsClient; this.server = server; @@ -195,7 +195,7 @@ public class ReportPublisher implements Startable { try { response = wsClient.call(post).failIfNotSuccessful(); } catch (HttpException e) { - throw MessageException.of(String.format("Failed to upload report - %s", ScannerWsClient.createErrorMessage(e))); + throw MessageException.of(String.format("Failed to upload report - %s", DefaultScannerWsClient.createErrorMessage(e))); } try (InputStream protobuf = response.contentStream()) { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/SourcePublisher.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/SourcePublisher.java index 765ac95da04..f18549f81df 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/SourcePublisher.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/SourcePublisher.java @@ -29,7 +29,7 @@ import java.io.InputStreamReader; import java.io.OutputStream; import java.nio.charset.StandardCharsets; import org.apache.commons.io.IOUtils; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputFile; import org.sonar.scanner.protocol.output.ScannerReportWriter; import org.sonar.scanner.scan.filesystem.InputComponentStore; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/TestExecutionPublisher.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/TestExecutionPublisher.java index f04f204bf2b..2aa1802f814 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/TestExecutionPublisher.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/report/TestExecutionPublisher.java @@ -24,16 +24,16 @@ import java.util.Objects; import java.util.stream.StreamSupport; import org.sonar.api.batch.fs.InputComponent; import org.sonar.api.batch.fs.InputFile; +import org.sonar.api.impl.fs.DefaultInputComponent; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.sensor.DefaultMeasure; import org.sonar.api.test.MutableTestPlan; import org.sonar.api.test.TestCase; import org.sonar.api.test.TestCase.Status; import org.sonar.scanner.deprecated.test.TestPlanBuilder; -import org.sonar.scanner.fs.DefaultInputComponent; -import org.sonar.scanner.fs.DefaultInputFile; import org.sonar.scanner.protocol.output.ScannerReport; import org.sonar.scanner.protocol.output.ScannerReportWriter; import org.sonar.scanner.scan.filesystem.InputComponentStore; -import org.sonar.scanner.sensor.DefaultMeasure; import static org.sonar.api.measures.CoreMetrics.SKIPPED_TESTS; import static org.sonar.api.measures.CoreMetrics.TESTS; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/DefaultMetricsRepositoryLoader.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/DefaultMetricsRepositoryLoader.java index 64482589fec..7afc0c68587 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/DefaultMetricsRepositoryLoader.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/DefaultMetricsRepositoryLoader.java @@ -25,16 +25,16 @@ import java.util.ArrayList; import java.util.List; import org.sonar.api.measures.Metric; import org.sonar.api.measures.Metric.ValueType; -import org.sonar.scanner.bootstrap.ScannerWsClient; +import org.sonar.scanner.bootstrap.DefaultScannerWsClient; import org.sonar.scanner.protocol.GsonHelper; import org.sonarqube.ws.client.GetRequest; public class DefaultMetricsRepositoryLoader implements MetricsRepositoryLoader { private static final String METRICS_SEARCH_URL = "/api/metrics/search?f=name,description,direction,qualitative,custom&ps=500&p="; - private ScannerWsClient wsClient; + private DefaultScannerWsClient wsClient; - public DefaultMetricsRepositoryLoader(ScannerWsClient wsClient) { + public DefaultMetricsRepositoryLoader(DefaultScannerWsClient wsClient) { this.wsClient = wsClient; } diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/DefaultProjectRepositoriesLoader.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/DefaultProjectRepositoriesLoader.java index f5136784e43..3c7e7ad5484 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/DefaultProjectRepositoriesLoader.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/DefaultProjectRepositoriesLoader.java @@ -28,8 +28,8 @@ import java.util.Map; import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.sonar.scanner.bootstrap.ScannerWsClient; -import org.sonar.scanner.util.ScannerUtils; +import org.sonar.scanner.bootstrap.DefaultScannerWsClient; +import org.sonar.api.impl.utils.ScannerUtils; import org.sonarqube.ws.Batch.WsProjectResponse; import org.sonarqube.ws.client.GetRequest; import org.sonarqube.ws.client.HttpException; @@ -38,9 +38,9 @@ import org.sonarqube.ws.client.WsResponse; public class DefaultProjectRepositoriesLoader implements ProjectRepositoriesLoader { private static final Logger LOG = LoggerFactory.getLogger(DefaultProjectRepositoriesLoader.class); private static final String BATCH_PROJECT_URL = "/batch/project.protobuf"; - private final ScannerWsClient wsClient; + private final DefaultScannerWsClient wsClient; - public DefaultProjectRepositoriesLoader(ScannerWsClient wsClient) { + public DefaultProjectRepositoriesLoader(DefaultScannerWsClient wsClient) { this.wsClient = wsClient; } diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/DefaultQualityProfileLoader.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/DefaultQualityProfileLoader.java index 361eeab3e6d..7bf41b77a93 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/DefaultQualityProfileLoader.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/DefaultQualityProfileLoader.java @@ -28,7 +28,7 @@ import java.util.Map; import java.util.function.BinaryOperator; import java.util.function.Supplier; import org.sonar.api.utils.MessageException; -import org.sonar.scanner.bootstrap.ScannerWsClient; +import org.sonar.scanner.bootstrap.DefaultScannerWsClient; import org.sonar.scanner.scan.ScanProperties; import org.sonarqube.ws.Qualityprofiles.SearchWsResponse; import org.sonarqube.ws.Qualityprofiles.SearchWsResponse.QualityProfile; @@ -37,15 +37,15 @@ import org.sonarqube.ws.client.HttpException; import static java.util.function.Function.identity; import static java.util.stream.Collectors.toMap; -import static org.sonar.scanner.util.ScannerUtils.encodeForUrl; +import static org.sonar.api.impl.utils.ScannerUtils.encodeForUrl; public class DefaultQualityProfileLoader implements QualityProfileLoader { private static final String WS_URL = "/api/qualityprofiles/search.protobuf"; - private final ScannerWsClient wsClient; + private final DefaultScannerWsClient wsClient; private final ScanProperties properties; - public DefaultQualityProfileLoader(ScanProperties properties, ScannerWsClient wsClient) { + public DefaultQualityProfileLoader(ScanProperties properties, DefaultScannerWsClient wsClient) { this.properties = properties; this.wsClient = wsClient; } @@ -69,10 +69,10 @@ public class DefaultQualityProfileLoader implements QualityProfileLoader { if (tryLoadDefault) { return loadDefault(); } else { - throw MessageException.of(errorMsg.get() + ": " + ScannerWsClient.createErrorMessage(e)); + throw MessageException.of(errorMsg.get() + ": " + DefaultScannerWsClient.createErrorMessage(e)); } } - throw new IllegalStateException(errorMsg.get() + ": " + ScannerWsClient.createErrorMessage(e)); + throw new IllegalStateException(errorMsg.get() + ": " + DefaultScannerWsClient.createErrorMessage(e)); } catch (MessageException e) { throw e; } catch (Exception e) { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/ProjectRepositories.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/ProjectRepositories.java index d1a7a30080c..ad817fd2a47 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/ProjectRepositories.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/ProjectRepositories.java @@ -21,7 +21,7 @@ package org.sonar.scanner.repository; import javax.annotation.CheckForNull; import javax.annotation.concurrent.Immutable; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputFile; @Immutable public abstract class ProjectRepositories { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/AbstractSettingsLoader.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/AbstractSettingsLoader.java index 797acbfcdb9..795a217b5a1 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/AbstractSettingsLoader.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/AbstractSettingsLoader.java @@ -34,8 +34,8 @@ import org.apache.commons.lang.StringEscapeUtils; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; import org.sonar.api.utils.log.Profiler; -import org.sonar.scanner.bootstrap.ScannerWsClient; -import org.sonar.scanner.util.ScannerUtils; +import org.sonar.scanner.bootstrap.DefaultScannerWsClient; +import org.sonar.api.impl.utils.ScannerUtils; import org.sonarqube.ws.Settings; import org.sonarqube.ws.client.GetRequest; import org.sonarqube.ws.client.HttpException; @@ -43,9 +43,9 @@ import org.sonarqube.ws.client.HttpException; public abstract class AbstractSettingsLoader { private static final Logger LOG = Loggers.get(AbstractSettingsLoader.class); - private final ScannerWsClient wsClient; + private final DefaultScannerWsClient wsClient; - public AbstractSettingsLoader(final ScannerWsClient wsClient) { + public AbstractSettingsLoader(final DefaultScannerWsClient wsClient) { this.wsClient = wsClient; } diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/DefaultGlobalSettingsLoader.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/DefaultGlobalSettingsLoader.java index cd616563730..8e3e34cf90a 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/DefaultGlobalSettingsLoader.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/DefaultGlobalSettingsLoader.java @@ -20,11 +20,11 @@ package org.sonar.scanner.repository.settings; import java.util.Map; -import org.sonar.scanner.bootstrap.ScannerWsClient; +import org.sonar.scanner.bootstrap.DefaultScannerWsClient; public class DefaultGlobalSettingsLoader extends AbstractSettingsLoader implements GlobalSettingsLoader { - public DefaultGlobalSettingsLoader(final ScannerWsClient wsClient) { + public DefaultGlobalSettingsLoader(final DefaultScannerWsClient wsClient) { super(wsClient); } diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/DefaultProjectSettingsLoader.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/DefaultProjectSettingsLoader.java index 4274772cc8c..32d41243f93 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/DefaultProjectSettingsLoader.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/repository/settings/DefaultProjectSettingsLoader.java @@ -21,12 +21,12 @@ package org.sonar.scanner.repository.settings; import java.util.Map; import org.sonar.scanner.bootstrap.ProcessedScannerProperties; -import org.sonar.scanner.bootstrap.ScannerWsClient; +import org.sonar.scanner.bootstrap.DefaultScannerWsClient; public class DefaultProjectSettingsLoader extends AbstractSettingsLoader implements ProjectSettingsLoader { private final ProcessedScannerProperties scannerProperties; - public DefaultProjectSettingsLoader(final ScannerWsClient wsClient, final ProcessedScannerProperties scannerProperties) { + public DefaultProjectSettingsLoader(final DefaultScannerWsClient wsClient, final ProcessedScannerProperties scannerProperties) { super(wsClient); this.scannerProperties = scannerProperties; } diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/ActiveRulesBuilder.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/ActiveRulesBuilder.java deleted file mode 100644 index ce5885836a2..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/ActiveRulesBuilder.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.rule; - -import org.sonar.api.batch.rule.ActiveRules; -import org.sonar.api.rule.RuleKey; - -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * Builds instances of {@link org.sonar.api.batch.rule.ActiveRules}. - * <b>For unit testing and internal use only</b>. - * - * @since 4.2 - */ -public class ActiveRulesBuilder { - - private final Map<RuleKey, NewActiveRule> map = new LinkedHashMap<>(); - - public ActiveRulesBuilder addRule(NewActiveRule newActiveRule) { - if (map.containsKey(newActiveRule.ruleKey)) { - throw new IllegalStateException(String.format("Rule '%s' is already activated", newActiveRule.ruleKey)); - } - map.put(newActiveRule.ruleKey, newActiveRule); - return this; - } - - public ActiveRules build() { - return new DefaultActiveRules(map.values()); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/ActiveRulesLoader.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/ActiveRulesLoader.java index e9bd8897dc8..0cf793876f4 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/ActiveRulesLoader.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/ActiveRulesLoader.java @@ -20,6 +20,7 @@ package org.sonar.scanner.rule; import java.util.List; +import org.sonar.api.batch.rule.LoadedActiveRule; public interface ActiveRulesLoader { List<LoadedActiveRule> load(String qualityProfileKey); diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/ActiveRulesProvider.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/ActiveRulesProvider.java index f918a847f2b..dbf8ec440a2 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/ActiveRulesProvider.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/ActiveRulesProvider.java @@ -27,6 +27,9 @@ import java.util.Map; import java.util.Set; import org.picocontainer.injectors.ProviderAdapter; import org.sonar.api.batch.rule.ActiveRules; +import org.sonar.api.impl.rule.ActiveRulesBuilder; +import org.sonar.api.batch.rule.LoadedActiveRule; +import org.sonar.api.batch.rule.NewActiveRule; import org.sonar.api.rule.RuleKey; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultActiveRule.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultActiveRule.java deleted file mode 100644 index 68bdf1ed3af..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultActiveRule.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.rule; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import javax.annotation.concurrent.Immutable; -import org.sonar.api.batch.rule.ActiveRule; -import org.sonar.api.rule.RuleKey; - -@Immutable -public class DefaultActiveRule implements ActiveRule { - private final RuleKey ruleKey; - private final String severity; - private final String internalKey; - private final String language; - private final String templateRuleKey; - private final Map<String, String> params; - private final long createdAt; - private final long updatedAt; - private final String qProfileKey; - - DefaultActiveRule(NewActiveRule newActiveRule) { - this.severity = newActiveRule.severity; - this.internalKey = newActiveRule.internalKey; - this.templateRuleKey = newActiveRule.templateRuleKey; - this.ruleKey = newActiveRule.ruleKey; - this.params = Collections.unmodifiableMap(new HashMap<>(newActiveRule.params)); - this.language = newActiveRule.language; - this.createdAt = newActiveRule.createdAt; - this.updatedAt = newActiveRule.updatedAt; - this.qProfileKey = newActiveRule.qProfileKey; - } - - @Override - public RuleKey ruleKey() { - return ruleKey; - } - - @Override - public String severity() { - return severity; - } - - @Override - public String language() { - return language; - } - - @Override - public String param(String key) { - return params.get(key); - } - - @Override - public Map<String, String> params() { - // already immutable - return params; - } - - @Override - public String internalKey() { - return internalKey; - } - - @Override - public String templateRuleKey() { - return templateRuleKey; - } - - public long createdAt() { - return createdAt; - } - - public long updatedAt() { - return updatedAt; - } - - @Override - public String qpKey() { - return qProfileKey; - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultActiveRules.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultActiveRules.java deleted file mode 100644 index 77a278772cc..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultActiveRules.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.rule; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import javax.annotation.concurrent.Immutable; -import org.sonar.api.batch.rule.ActiveRule; -import org.sonar.api.batch.rule.ActiveRules; -import org.sonar.api.rule.RuleKey; - -@Immutable -public class DefaultActiveRules implements ActiveRules { - private final Map<String, List<ActiveRule>> activeRulesByRepository = new HashMap<>(); - private final Map<String, Map<String, ActiveRule>> activeRulesByRepositoryAndKey = new HashMap<>(); - private final Map<String, Map<String, ActiveRule>> activeRulesByRepositoryAndInternalKey = new HashMap<>(); - private final Map<String, List<ActiveRule>> activeRulesByLanguage = new HashMap<>(); - - public DefaultActiveRules(Collection<NewActiveRule> newActiveRules) { - for (NewActiveRule newAR : newActiveRules) { - DefaultActiveRule ar = new DefaultActiveRule(newAR); - String repo = ar.ruleKey().repository(); - activeRulesByRepository.computeIfAbsent(repo, x -> new ArrayList<>()).add(ar); - if (ar.language() != null) { - activeRulesByLanguage.computeIfAbsent(ar.language(), x -> new ArrayList<>()).add(ar); - } - - activeRulesByRepositoryAndKey.computeIfAbsent(repo, r -> new HashMap<>()).put(ar.ruleKey().rule(), ar); - String internalKey = ar.internalKey(); - if (internalKey != null) { - activeRulesByRepositoryAndInternalKey.computeIfAbsent(repo, r -> new HashMap<>()).put(internalKey, ar); - } - } - } - - @Override - public ActiveRule find(RuleKey ruleKey) { - return activeRulesByRepositoryAndKey.getOrDefault(ruleKey.repository(), Collections.emptyMap()) - .get(ruleKey.rule()); - } - - @Override - public Collection<ActiveRule> findAll() { - return activeRulesByRepository.entrySet().stream().flatMap(x -> x.getValue().stream()).collect(Collectors.toList()); - } - - @Override - public Collection<ActiveRule> findByRepository(String repository) { - return activeRulesByRepository.getOrDefault(repository, Collections.emptyList()); - } - - @Override - public Collection<ActiveRule> findByLanguage(String language) { - return activeRulesByLanguage.getOrDefault(language, Collections.emptyList()); - } - - @Override - public ActiveRule findByInternalKey(String repository, String internalKey) { - return activeRulesByRepositoryAndInternalKey.containsKey(repository) ? activeRulesByRepositoryAndInternalKey.get(repository).get(internalKey) : null; - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultActiveRulesLoader.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultActiveRulesLoader.java index 3f6cb897aaf..e7d2cb63f86 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultActiveRulesLoader.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultActiveRulesLoader.java @@ -26,9 +26,11 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import org.apache.commons.io.IOUtils; -import org.sonar.api.rule.RuleKey; import org.sonar.scanner.bootstrap.ScannerWsClient; -import org.sonar.scanner.util.ScannerUtils; +import org.sonar.api.impl.utils.ScannerUtils; +import org.sonar.api.batch.rule.LoadedActiveRule; +import org.sonar.api.rule.RuleKey; +import org.sonar.api.utils.DateUtils; import org.sonarqube.ws.Rules; import org.sonarqube.ws.Rules.Active; import org.sonarqube.ws.Rules.Active.Param; @@ -37,9 +39,6 @@ import org.sonarqube.ws.Rules.Rule; import org.sonarqube.ws.Rules.SearchResponse; import org.sonarqube.ws.client.GetRequest; -import static org.sonar.api.utils.DateUtils.dateToLong; -import static org.sonar.api.utils.DateUtils.parseDateTime; - public class DefaultActiveRulesLoader implements ActiveRulesLoader { private static final String RULES_SEARCH_URL = "/api/rules/search.protobuf?f=repo,name,severity,lang,internalKey,templateKey,params,actives,createdAt,updatedAt&activation=true"; @@ -106,8 +105,8 @@ public class DefaultActiveRulesLoader implements ActiveRulesLoader { loadedRule.setRuleKey(RuleKey.parse(r.getKey())); loadedRule.setName(r.getName()); loadedRule.setSeverity(active.getSeverity()); - loadedRule.setCreatedAt(dateToLong(parseDateTime(active.getCreatedAt()))); - loadedRule.setUpdatedAt(dateToLong(parseDateTime(active.getUpdatedAt()))); + loadedRule.setCreatedAt(DateUtils.dateToLong(DateUtils.parseDateTime(active.getCreatedAt()))); + loadedRule.setUpdatedAt(DateUtils.dateToLong(DateUtils.parseDateTime(active.getUpdatedAt()))); loadedRule.setLanguage(r.getLang()); loadedRule.setInternalKey(r.getInternalKey()); if (r.hasTemplateKey()) { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultRule.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultRule.java deleted file mode 100644 index d53859ad348..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultRule.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.rule; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import javax.annotation.CheckForNull; -import javax.annotation.concurrent.Immutable; -import org.sonar.api.batch.rule.Rule; -import org.sonar.api.batch.rule.RuleParam; -import org.sonar.api.rule.RuleKey; -import org.sonar.api.rule.RuleStatus; - -@Immutable -public class DefaultRule implements Rule { - - private final RuleKey key; - private final Integer id; - private final String name; - private final String severity; - private final String type; - private final String description; - private final String internalKey; - private final RuleStatus status; - private final Map<String, RuleParam> params; - - DefaultRule(NewRule newRule) { - this.key = newRule.key; - this.id = newRule.id; - this.name = newRule.name; - this.severity = newRule.severity; - this.type = newRule.type; - this.description = newRule.description; - this.internalKey = newRule.internalKey; - this.status = newRule.status; - - Map<String, RuleParam> builder = new HashMap<>(); - for (NewRuleParam newRuleParam : newRule.params.values()) { - builder.put(newRuleParam.key, new DefaultRuleParam(newRuleParam)); - } - params = Collections.unmodifiableMap(builder); - } - - @Override - public RuleKey key() { - return key; - } - - @CheckForNull - public Integer id() { - return id; - } - - @Override - public String name() { - return name; - } - - @Override - public String severity() { - return severity; - } - - @CheckForNull - public String type() { - return type; - } - - @Override - public String description() { - return description; - } - - @Override - public String internalKey() { - return internalKey; - } - - @Override - public RuleStatus status() { - return status; - } - - @Override - public RuleParam param(String paramKey) { - return params.get(paramKey); - } - - @Override - public Collection<RuleParam> params() { - return params.values(); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultRuleParam.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultRuleParam.java deleted file mode 100644 index 31fed46d547..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultRuleParam.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.rule; - -import org.sonar.api.batch.rule.RuleParam; - -import javax.annotation.Nullable; -import javax.annotation.concurrent.Immutable; - -@Immutable -class DefaultRuleParam implements RuleParam { - - private final String key; - private final String description; - - DefaultRuleParam(NewRuleParam p) { - this.key = p.key; - this.description = p.description; - } - - @Override - public String key() { - return key; - } - - @Override - @Nullable - public String description() { - return description; - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultRules.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultRules.java deleted file mode 100644 index efcc7104b6e..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultRules.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.rule; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import javax.annotation.concurrent.Immutable; -import org.sonar.api.batch.rule.Rule; -import org.sonar.api.batch.rule.Rules; -import org.sonar.api.rule.RuleKey; - -@Immutable -class DefaultRules implements Rules { - private final Map<String, List<Rule>> rulesByRepository; - private final Map<String, Map<String, List<Rule>>> rulesByRepositoryAndInternalKey; - private final Map<RuleKey, Rule> rulesByRuleKey; - - DefaultRules(Collection<NewRule> newRules) { - Map<String, List<Rule>> rulesByRepositoryBuilder = new HashMap<>(); - Map<String, Map<String, List<Rule>>> rulesByRepositoryAndInternalKeyBuilder = new HashMap<>(); - Map<RuleKey, Rule> rulesByRuleKeyBuilder = new HashMap<>(); - - for (NewRule newRule : newRules) { - DefaultRule r = new DefaultRule(newRule); - rulesByRuleKeyBuilder.put(r.key(), r); - rulesByRepositoryBuilder.computeIfAbsent(r.key().repository(), x -> new ArrayList<>()).add(r); - addToTable(rulesByRepositoryAndInternalKeyBuilder, r); - } - - rulesByRuleKey = Collections.unmodifiableMap(rulesByRuleKeyBuilder); - rulesByRepository = Collections.unmodifiableMap(rulesByRepositoryBuilder); - rulesByRepositoryAndInternalKey = Collections.unmodifiableMap(rulesByRepositoryAndInternalKeyBuilder); - } - - private static void addToTable(Map<String, Map<String, List<Rule>>> rulesByRepositoryAndInternalKeyBuilder, DefaultRule r) { - if (r.internalKey() == null) { - return; - } - - rulesByRepositoryAndInternalKeyBuilder - .computeIfAbsent(r.key().repository(), x -> new HashMap<>()) - .computeIfAbsent(r.internalKey(), x -> new ArrayList<>()) - .add(r); - } - - @Override - public Rule find(RuleKey ruleKey) { - return rulesByRuleKey.get(ruleKey); - } - - @Override - public Collection<Rule> findAll() { - return rulesByRepository.values().stream().flatMap(List::stream).collect(Collectors.toList()); - } - - @Override - public Collection<Rule> findByRepository(String repository) { - return rulesByRepository.getOrDefault(repository, Collections.emptyList()); - } - - @Override - public Collection<Rule> findByInternalKey(String repository, String internalKey) { - return rulesByRepositoryAndInternalKey - .getOrDefault(repository, Collections.emptyMap()) - .getOrDefault(internalKey, Collections.emptyList()); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultRulesLoader.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultRulesLoader.java index 61a97e00921..cc745877ae9 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultRulesLoader.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/DefaultRulesLoader.java @@ -23,7 +23,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.List; import org.apache.commons.io.IOUtils; -import org.sonar.scanner.bootstrap.ScannerWsClient; +import org.sonar.scanner.bootstrap.DefaultScannerWsClient; import org.sonarqube.ws.Rules.ListResponse; import org.sonarqube.ws.Rules.ListResponse.Rule; import org.sonarqube.ws.client.GetRequest; @@ -31,9 +31,9 @@ import org.sonarqube.ws.client.GetRequest; public class DefaultRulesLoader implements RulesLoader { private static final String RULES_SEARCH_URL = "/api/rules/list.protobuf"; - private final ScannerWsClient wsClient; + private final DefaultScannerWsClient wsClient; - public DefaultRulesLoader(ScannerWsClient wsClient) { + public DefaultRulesLoader(DefaultScannerWsClient wsClient) { this.wsClient = wsClient; } diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/LoadedActiveRule.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/LoadedActiveRule.java deleted file mode 100644 index cb50dade254..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/LoadedActiveRule.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.rule; - -import java.util.Map; -import javax.annotation.CheckForNull; -import javax.annotation.Nullable; -import org.sonar.api.rule.RuleKey; - -public class LoadedActiveRule { - private RuleKey ruleKey; - private String severity; - private String name; - private String language; - private Map<String, String> params; - private long createdAt; - private long updatedAt; - private String templateRuleKey; - private String internalKey; - - public RuleKey getRuleKey() { - return ruleKey; - } - - public void setRuleKey(RuleKey ruleKey) { - this.ruleKey = ruleKey; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getSeverity() { - return severity; - } - - public void setSeverity(String severity) { - this.severity = severity; - } - - public String getLanguage() { - return language; - } - - public void setLanguage(String language) { - this.language = language; - } - - public Map<String, String> getParams() { - return params; - } - - public void setParams(Map<String, String> params) { - this.params = params; - } - - public long getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(long createdAt) { - this.createdAt = createdAt; - } - - public long getUpdatedAt() { - return updatedAt; - } - - public void setUpdatedAt(long updatedAt) { - this.updatedAt = updatedAt; - } - - @CheckForNull - public String getTemplateRuleKey() { - return templateRuleKey; - } - - public void setTemplateRuleKey(@Nullable String templateRuleKey) { - this.templateRuleKey = templateRuleKey; - } - - public String getInternalKey() { - return internalKey; - } - - public void setInternalKey(String internalKey) { - this.internalKey = internalKey; - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/NewActiveRule.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/NewActiveRule.java deleted file mode 100644 index 10867a5b29d..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/NewActiveRule.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.rule; - -import java.util.HashMap; -import java.util.Map; -import javax.annotation.Nullable; -import javax.annotation.concurrent.Immutable; -import org.apache.commons.lang.StringUtils; -import org.sonar.api.rule.RuleKey; -import org.sonar.api.rule.Severity; - -/** - * @since 4.2 - */ -@Immutable -public class NewActiveRule { - final RuleKey ruleKey; - final String name; - final String severity; - final Map<String, String> params; - final long createdAt; - final long updatedAt; - final String internalKey; - final String language; - final String templateRuleKey; - final String qProfileKey; - - NewActiveRule(Builder builder) { - this.ruleKey = builder.ruleKey; - this.name = builder.name; - this.severity = builder.severity; - this.params = builder.params; - this.createdAt = builder.createdAt; - this.updatedAt = builder.updatedAt; - this.internalKey = builder.internalKey; - this.language = builder.language; - this.templateRuleKey = builder.templateRuleKey; - this.qProfileKey = builder.qProfileKey; - } - - public static class Builder { - private RuleKey ruleKey; - private String name; - private String severity = Severity.defaultSeverity(); - private Map<String, String> params = new HashMap<>(); - private long createdAt; - private long updatedAt; - private String internalKey; - private String language; - private String templateRuleKey; - private String qProfileKey; - - public Builder setRuleKey(RuleKey ruleKey) { - this.ruleKey = ruleKey; - return this; - } - - public Builder setName(String name) { - this.name = name; - return this; - } - - public Builder setSeverity(@Nullable String severity) { - this.severity = StringUtils.defaultIfBlank(severity, Severity.defaultSeverity()); - return this; - } - - public Builder setParam(String key, @Nullable String value) { - // possible improvement : check that the param key exists in rule definition - if (value == null) { - params.remove(key); - } else { - params.put(key, value); - } - return this; - } - - public Builder setCreatedAt(long createdAt) { - this.createdAt = createdAt; - return this; - } - - public Builder setUpdatedAt(long updatedAt) { - this.updatedAt = updatedAt; - return this; - } - - public Builder setInternalKey(@Nullable String internalKey) { - this.internalKey = internalKey; - return this; - } - - public Builder setLanguage(@Nullable String language) { - this.language = language; - return this; - } - - public Builder setTemplateRuleKey(@Nullable String templateRuleKey) { - this.templateRuleKey = templateRuleKey; - return this; - } - - public Builder setQProfileKey(String qProfileKey) { - this.qProfileKey = qProfileKey; - return this; - } - - public NewActiveRule build() { - return new NewActiveRule(this); - } - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/NewRule.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/NewRule.java deleted file mode 100644 index 179768d1c7b..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/NewRule.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.rule; - -import java.util.HashMap; -import java.util.Map; -import javax.annotation.Nullable; -import org.apache.commons.lang.ObjectUtils; -import org.apache.commons.lang.StringUtils; -import org.sonar.api.rule.RuleKey; -import org.sonar.api.rule.RuleStatus; -import org.sonar.api.rule.Severity; - -public class NewRule { - - private static final String DEFAULT_SEVERITY = Severity.defaultSeverity(); - - final RuleKey key; - Integer id; - String name; - String description; - String severity = DEFAULT_SEVERITY; - String type; - String internalKey; - RuleStatus status = RuleStatus.defaultStatus(); - Map<String, NewRuleParam> params = new HashMap<>(); - - public NewRule(RuleKey key) { - this.key = key; - } - - public NewRule setId(@Nullable Integer id) { - this.id = id; - return this; - } - - public NewRule setDescription(@Nullable String description) { - this.description = description; - return this; - } - - public NewRule setName(@Nullable String s) { - this.name = s; - return this; - } - - public NewRule setSeverity(@Nullable String severity) { - this.severity = StringUtils.defaultIfBlank(severity, DEFAULT_SEVERITY); - return this; - } - - public NewRule setType(@Nullable String type) { - this.type = type; - return this; - } - - public NewRule setStatus(@Nullable RuleStatus s) { - this.status = (RuleStatus) ObjectUtils.defaultIfNull(s, RuleStatus.defaultStatus()); - return this; - } - - public NewRule setInternalKey(@Nullable String s) { - this.internalKey = s; - return this; - } - - public NewRuleParam addParam(String paramKey) { - if (params.containsKey(paramKey)) { - throw new IllegalStateException(String.format("Parameter '%s' already exists on rule '%s'", paramKey, key)); - } - NewRuleParam param = new NewRuleParam(paramKey); - params.put(paramKey, param); - return param; - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/NewRuleParam.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/NewRuleParam.java deleted file mode 100644 index 9fa482553c5..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/NewRuleParam.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.rule; - -import javax.annotation.Nullable; - -public class NewRuleParam { - final String key; - String description; - - NewRuleParam(String key) { - this.key = key; - } - - public NewRuleParam setDescription(@Nullable String s) { - description = s; - return this; - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/RulesBuilder.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/RulesBuilder.java deleted file mode 100644 index 3d1ccb33db5..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/RulesBuilder.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.rule; - -import org.sonar.api.batch.rule.Rules; -import org.sonar.api.rule.RuleKey; - -import java.util.HashMap; -import java.util.Map; - -/** - * For unit testing and internal use only. - * - * @since 4.2 - */ - -public class RulesBuilder { - - private final Map<RuleKey, NewRule> map = new HashMap<>(); - - public NewRule add(RuleKey key) { - if (map.containsKey(key)) { - throw new IllegalStateException(String.format("Rule '%s' already exists", key)); - } - NewRule newRule = new NewRule(key); - map.put(key, newRule); - return newRule; - } - - public Rules build() { - return new DefaultRules(map.values()); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/RulesProvider.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/RulesProvider.java index a0c89c2d6f0..3b365ac3c71 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/RulesProvider.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/rule/RulesProvider.java @@ -21,7 +21,9 @@ package org.sonar.scanner.rule; import java.util.List; import org.picocontainer.injectors.ProviderAdapter; +import org.sonar.api.batch.rule.NewRule; import org.sonar.api.batch.rule.Rules; +import org.sonar.api.impl.rule.RulesBuilder; import org.sonar.api.rule.RuleKey; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/DefaultInputModuleHierarchy.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/DefaultInputModuleHierarchy.java index aa6cbeb0db1..108a6dc7285 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/DefaultInputModuleHierarchy.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/DefaultInputModuleHierarchy.java @@ -28,8 +28,8 @@ import java.util.Map; import javax.annotation.CheckForNull; import javax.annotation.concurrent.Immutable; import org.sonar.api.scan.filesystem.PathResolver; -import org.sonar.scanner.fs.AbstractProjectOrModule; -import org.sonar.scanner.fs.DefaultInputModule; +import org.sonar.api.impl.fs.AbstractProjectOrModule; +import org.sonar.api.impl.fs.DefaultInputModule; import org.sonar.scanner.fs.InputModuleHierarchy; @Immutable diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/InputModuleHierarchyProvider.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/InputModuleHierarchyProvider.java index da0b8781dde..ef806c5b2ab 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/InputModuleHierarchyProvider.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/InputModuleHierarchyProvider.java @@ -26,8 +26,8 @@ import org.picocontainer.injectors.ProviderAdapter; import org.sonar.api.batch.bootstrap.ProjectDefinition; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; -import org.sonar.scanner.fs.DefaultInputModule; -import org.sonar.scanner.fs.DefaultInputProject; +import org.sonar.api.impl.fs.DefaultInputModule; +import org.sonar.api.impl.fs.DefaultInputProject; import org.sonar.scanner.scan.filesystem.ScannerComponentIdGenerator; public class InputModuleHierarchyProvider extends ProviderAdapter { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/InputProjectProvider.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/InputProjectProvider.java index 1219f2871dd..9500e47d8f7 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/InputProjectProvider.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/InputProjectProvider.java @@ -24,7 +24,7 @@ import org.picocontainer.injectors.ProviderAdapter; import org.sonar.api.batch.bootstrap.ProjectReactor; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; -import org.sonar.scanner.fs.DefaultInputProject; +import org.sonar.api.impl.fs.DefaultInputProject; import org.sonar.scanner.scan.filesystem.ScannerComponentIdGenerator; public class InputProjectProvider extends ProviderAdapter { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ModuleConfigurationProvider.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ModuleConfigurationProvider.java index 21d241c23f4..dab9cc531fd 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ModuleConfigurationProvider.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ModuleConfigurationProvider.java @@ -27,7 +27,7 @@ import org.picocontainer.injectors.ProviderAdapter; import org.sonar.api.batch.bootstrap.ProjectDefinition; import org.sonar.scanner.bootstrap.GlobalConfiguration; import org.sonar.scanner.bootstrap.GlobalServerSettings; -import org.sonar.scanner.fs.DefaultInputModule; +import org.sonar.api.impl.fs.DefaultInputModule; public class ModuleConfigurationProvider extends ProviderAdapter { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ModuleIndexer.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ModuleIndexer.java index 1bc1611097f..c307a20aafc 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ModuleIndexer.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ModuleIndexer.java @@ -20,7 +20,7 @@ package org.sonar.scanner.scan; import org.picocontainer.Startable; -import org.sonar.scanner.fs.DefaultInputModule; +import org.sonar.api.impl.fs.DefaultInputModule; import org.sonar.scanner.fs.InputModuleHierarchy; import org.sonar.scanner.scan.filesystem.InputComponentStore; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ModuleScanContainer.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ModuleScanContainer.java index 1a7a78f93cf..f573dd47e4d 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ModuleScanContainer.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ModuleScanContainer.java @@ -23,7 +23,7 @@ import org.sonar.api.scan.filesystem.FileExclusions; import org.sonar.core.platform.ComponentContainer; import org.sonar.scanner.bootstrap.ExtensionInstaller; import org.sonar.scanner.deprecated.perspectives.ScannerPerspectives; -import org.sonar.scanner.fs.DefaultInputModule; +import org.sonar.api.impl.fs.DefaultInputModule; import org.sonar.scanner.scan.filesystem.DefaultModuleFileSystem; import org.sonar.scanner.scan.filesystem.ModuleInputComponentStore; import org.sonar.scanner.sensor.ModuleSensorContext; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectConfigurationProvider.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectConfigurationProvider.java index 0d17b4a8114..1903ad736eb 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectConfigurationProvider.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectConfigurationProvider.java @@ -24,7 +24,7 @@ import java.util.Map; import org.picocontainer.injectors.ProviderAdapter; import org.sonar.scanner.bootstrap.GlobalConfiguration; import org.sonar.scanner.bootstrap.GlobalServerSettings; -import org.sonar.scanner.fs.DefaultInputProject; +import org.sonar.api.impl.fs.DefaultInputProject; public class ProjectConfigurationProvider extends ProviderAdapter { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectLock.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectLock.java index 9bf6bf73115..d024d47f7cb 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectLock.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectLock.java @@ -24,7 +24,7 @@ import java.nio.channels.OverlappingFileLockException; import java.nio.file.Files; import java.nio.file.Path; import org.picocontainer.Startable; -import org.sonar.scanner.fs.AbstractProjectOrModule; +import org.sonar.api.impl.fs.AbstractProjectOrModule; public class ProjectLock implements Startable { private final DirectoryLock lock; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectReactorBuilder.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectReactorBuilder.java index 01f181d55f0..e15525df2d2 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectReactorBuilder.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectReactorBuilder.java @@ -49,11 +49,11 @@ import org.sonar.core.config.IssueExclusionProperties; import org.sonar.scanner.bootstrap.ProcessedScannerProperties; import org.sonar.scanner.issue.ignore.pattern.IssueExclusionPatternInitializer; import org.sonar.scanner.issue.ignore.pattern.IssueInclusionPatternInitializer; -import org.sonar.scanner.util.ScannerUtils; +import org.sonar.api.impl.utils.ScannerUtils; import static java.util.Arrays.asList; import static java.util.stream.Collectors.toList; -import static org.sonar.api.config.internal.MultivalueProperty.parseAsCsv; +import static org.sonar.api.impl.config.MultivalueProperty.parseAsCsv; /** * Class that creates a project definition based on a set of properties. diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectScanContainer.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectScanContainer.java index 8cd93d031c4..3fd76637dd5 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectScanContainer.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ProjectScanContainer.java @@ -23,8 +23,11 @@ import com.google.common.annotations.VisibleForTesting; import javax.annotation.Nullable; import org.sonar.api.SonarEdition; import org.sonar.api.SonarRuntime; -import org.sonar.api.batch.fs.internal.SensorStrategy; import org.sonar.api.batch.rule.CheckFactory; +import org.sonar.api.impl.fs.DefaultInputModule; +import org.sonar.api.impl.fs.FileMetadata; +import org.sonar.api.impl.fs.SensorStrategy; +import org.sonar.api.impl.issue.DefaultNoSonarFilter; import org.sonar.api.resources.Languages; import org.sonar.api.resources.ResourceTypes; import org.sonar.api.scan.filesystem.PathResolver; @@ -63,10 +66,7 @@ import org.sonar.scanner.cpd.CpdSettings; import org.sonar.scanner.cpd.index.SonarCpdBlockIndex; import org.sonar.scanner.deprecated.test.TestPlanBuilder; import org.sonar.scanner.deprecated.test.TestableBuilder; -import org.sonar.scanner.fs.DefaultInputModule; -import org.sonar.scanner.fs.FileMetadata; import org.sonar.scanner.fs.InputModuleHierarchy; -import org.sonar.scanner.issue.DefaultNoSonarFilter; import org.sonar.scanner.issue.IssueFilters; import org.sonar.scanner.issue.IssuePublisher; import org.sonar.scanner.issue.ignore.EnforceIssuesFilter; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ScanProperties.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ScanProperties.java index 2fa3bbeaf02..6beb97470af 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ScanProperties.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/ScanProperties.java @@ -24,7 +24,7 @@ import java.nio.file.Paths; import java.util.Optional; import org.sonar.api.config.Configuration; import org.sonar.api.utils.MessageException; -import org.sonar.scanner.fs.DefaultInputProject; +import org.sonar.api.impl.fs.DefaultInputProject; import static org.sonar.core.config.ScannerProperties.BRANCH_NAME; import static org.sonar.core.config.ScannerProperties.ORGANIZATION; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/WorkDirectoriesInitializer.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/WorkDirectoriesInitializer.java index 8c5b01e4b2b..03b39315cc0 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/WorkDirectoriesInitializer.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/WorkDirectoriesInitializer.java @@ -25,7 +25,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.Iterator; import org.sonar.core.util.FileUtils; -import org.sonar.scanner.fs.DefaultInputModule; +import org.sonar.api.impl.fs.DefaultInputModule; import org.sonar.scanner.fs.InputModuleHierarchy; /** diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/AbstractCoverageAndDuplicationExclusions.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/AbstractCoverageAndDuplicationExclusions.java index 1bcbad7f75a..495b65448d4 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/AbstractCoverageAndDuplicationExclusions.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/AbstractCoverageAndDuplicationExclusions.java @@ -28,7 +28,7 @@ import org.sonar.api.CoreProperties; import org.sonar.api.utils.WildcardPattern; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputFile; import static java.util.stream.Collectors.toList; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/AbstractExclusionFilters.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/AbstractExclusionFilters.java index 9a348fee7f5..65aca8bd046 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/AbstractExclusionFilters.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/AbstractExclusionFilters.java @@ -28,7 +28,7 @@ import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.sonar.api.CoreProperties; import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.internal.PathPattern; +import org.sonar.api.impl.fs.PathPattern; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/AdditionalFilePredicates.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/AdditionalFilePredicates.java index 6c1bb65332a..299cb5a268c 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/AdditionalFilePredicates.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/AdditionalFilePredicates.java @@ -20,7 +20,7 @@ package org.sonar.scanner.scan.filesystem; import org.sonar.api.batch.fs.InputFile; -import org.sonar.scanner.fs.predicates.AbstractFilePredicate; +import org.sonar.api.impl.fs.predicates.AbstractFilePredicate; /** * Additional {@link org.sonar.api.batch.fs.FilePredicate}s that are diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/DefaultModuleFileSystem.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/DefaultModuleFileSystem.java index d25948764dd..3792a52e8a2 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/DefaultModuleFileSystem.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/DefaultModuleFileSystem.java @@ -20,13 +20,14 @@ package org.sonar.scanner.scan.filesystem; import com.google.common.annotations.VisibleForTesting; -import org.sonar.scanner.fs.DefaultFileSystem; -import org.sonar.scanner.fs.DefaultInputModule; +import org.sonar.api.impl.fs.DefaultFileSystem; +import org.sonar.api.impl.fs.DefaultInputModule; +import org.sonar.api.impl.fs.predicates.DefaultFilePredicates; public class DefaultModuleFileSystem extends DefaultFileSystem { public DefaultModuleFileSystem(ModuleInputComponentStore moduleInputFileCache, DefaultInputModule module) { - super(module.getBaseDir(), moduleInputFileCache); + super(module.getBaseDir(), moduleInputFileCache, new DefaultFilePredicates(module.getBaseDir())); initFields(module); } diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/DefaultProjectFileSystem.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/DefaultProjectFileSystem.java index 294b0b946d1..d7892ce887b 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/DefaultProjectFileSystem.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/DefaultProjectFileSystem.java @@ -20,13 +20,14 @@ package org.sonar.scanner.scan.filesystem; import com.google.common.annotations.VisibleForTesting; -import org.sonar.scanner.fs.DefaultFileSystem; -import org.sonar.scanner.fs.DefaultInputProject; +import org.sonar.api.impl.fs.DefaultFileSystem; +import org.sonar.api.impl.fs.DefaultInputProject; +import org.sonar.api.impl.fs.predicates.DefaultFilePredicates; public class DefaultProjectFileSystem extends DefaultFileSystem { public DefaultProjectFileSystem(InputComponentStore inputComponentStore, DefaultInputProject project) { - super(project.getBaseDir(), inputComponentStore); + super(project.getBaseDir(), inputComponentStore, new DefaultFilePredicates(project.getBaseDir())); setFields(project); } diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/FileIndexer.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/FileIndexer.java index 56c21333962..c01df402b00 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/FileIndexer.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/FileIndexer.java @@ -30,16 +30,16 @@ import org.sonar.api.CoreProperties; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.InputFile.Type; import org.sonar.api.batch.fs.InputFileFilter; -import org.sonar.api.batch.fs.internal.SensorStrategy; +import org.sonar.api.impl.fs.SensorStrategy; import org.sonar.api.batch.scm.IgnoreCommand; import org.sonar.api.notifications.AnalysisWarnings; import org.sonar.api.utils.MessageException; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; -import org.sonar.scanner.fs.DefaultIndexedFile; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.DefaultInputModule; -import org.sonar.scanner.fs.DefaultInputProject; +import org.sonar.api.impl.fs.DefaultIndexedFile; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputModule; +import org.sonar.api.impl.fs.DefaultInputProject; import org.sonar.scanner.issue.ignore.scanner.IssueExclusionsLoader; import org.sonar.scanner.scan.ScanProperties; import org.sonar.scanner.util.ProgressReport; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/InputComponentStore.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/InputComponentStore.java index 4eab927136d..eb33beb7e53 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/InputComponentStore.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/InputComponentStore.java @@ -35,10 +35,10 @@ import java.util.stream.Stream; import javax.annotation.CheckForNull; import org.sonar.api.batch.fs.InputComponent; import org.sonar.api.batch.fs.InputFile; -import org.sonar.scanner.fs.DefaultFileSystem; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.DefaultInputModule; -import org.sonar.scanner.fs.predicates.FileExtensionPredicate; +import org.sonar.api.impl.fs.DefaultFileSystem; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputModule; +import org.sonar.api.impl.fs.predicates.FileExtensionPredicate; import org.sonar.scanner.scan.branch.BranchConfiguration; /** diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/LanguageDetection.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/LanguageDetection.java index 57fbb86e23d..7b699f2befd 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/LanguageDetection.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/LanguageDetection.java @@ -32,7 +32,7 @@ import javax.annotation.concurrent.ThreadSafe; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.sonar.api.batch.fs.internal.PathPattern; +import org.sonar.api.impl.fs.PathPattern; import org.sonar.api.config.Configuration; import org.sonar.api.utils.MessageException; import org.sonar.scanner.repository.language.Language; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/MetadataGenerator.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/MetadataGenerator.java index 2da2f6db0c4..c15c9cdb5c6 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/MetadataGenerator.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/MetadataGenerator.java @@ -23,11 +23,11 @@ import com.google.common.annotations.VisibleForTesting; import java.io.InputStream; import java.nio.charset.Charset; import org.sonar.api.batch.fs.InputFile.Type; -import org.sonar.api.batch.fs.internal.Metadata; +import org.sonar.api.impl.fs.Metadata; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.FileMetadata; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.FileMetadata; import org.sonar.scanner.issue.ignore.scanner.IssueExclusionsLoader; public class MetadataGenerator { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/ModuleCoverageAndDuplicationExclusions.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/ModuleCoverageAndDuplicationExclusions.java index 3ef961f83e2..2eb7d6805f4 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/ModuleCoverageAndDuplicationExclusions.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/ModuleCoverageAndDuplicationExclusions.java @@ -20,7 +20,7 @@ package org.sonar.scanner.scan.filesystem; import javax.annotation.concurrent.Immutable; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputFile; import org.sonar.scanner.scan.ModuleConfiguration; @Immutable diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/ModuleInputComponentStore.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/ModuleInputComponentStore.java index e6d52849c63..23d7e257731 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/ModuleInputComponentStore.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/ModuleInputComponentStore.java @@ -23,8 +23,8 @@ import java.util.SortedSet; import org.sonar.api.batch.ScannerSide; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.InputModule; -import org.sonar.api.batch.fs.internal.SensorStrategy; -import org.sonar.scanner.fs.DefaultFileSystem; +import org.sonar.api.impl.fs.SensorStrategy; +import org.sonar.api.impl.fs.DefaultFileSystem; @ScannerSide public class ModuleInputComponentStore extends DefaultFileSystem.Cache { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/ProjectCoverageAndDuplicationExclusions.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/ProjectCoverageAndDuplicationExclusions.java index 4ab146afb27..e52ab6cc1bb 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/ProjectCoverageAndDuplicationExclusions.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/ProjectCoverageAndDuplicationExclusions.java @@ -20,7 +20,7 @@ package org.sonar.scanner.scan.filesystem; import javax.annotation.concurrent.Immutable; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputFile; import org.sonar.scanner.scan.ProjectConfiguration; @Immutable diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/ProjectFileIndexer.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/ProjectFileIndexer.java index 118b3eb5567..b5633d772eb 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/ProjectFileIndexer.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/ProjectFileIndexer.java @@ -45,7 +45,7 @@ import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; import org.sonar.scanner.bootstrap.GlobalConfiguration; import org.sonar.scanner.bootstrap.GlobalServerSettings; -import org.sonar.scanner.fs.DefaultInputModule; +import org.sonar.api.impl.fs.DefaultInputModule; import org.sonar.scanner.fs.InputModuleHierarchy; import org.sonar.scanner.scan.ModuleConfiguration; import org.sonar.scanner.scan.ModuleConfigurationProvider; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/StatusDetection.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/StatusDetection.java index 2cd3f8d5240..9de8b028234 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/StatusDetection.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scan/filesystem/StatusDetection.java @@ -22,7 +22,7 @@ package org.sonar.scanner.scan.filesystem; import javax.annotation.concurrent.Immutable; import org.apache.commons.lang.StringUtils; import org.sonar.api.batch.fs.InputFile; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputFile; import org.sonar.scanner.repository.FileData; import org.sonar.scanner.repository.ProjectRepositoriesSupplier; import org.sonar.scanner.scm.ScmChangedFiles; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scm/DefaultBlameOutput.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scm/DefaultBlameOutput.java index e2742ea4d3a..885de1be663 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scm/DefaultBlameOutput.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scm/DefaultBlameOutput.java @@ -34,7 +34,7 @@ import org.sonar.api.batch.scm.BlameCommand.BlameOutput; import org.sonar.api.batch.scm.BlameLine; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputFile; import org.sonar.scanner.protocol.output.ScannerReport; import org.sonar.scanner.protocol.output.ScannerReport.Changesets.Builder; import org.sonar.scanner.protocol.output.ScannerReportWriter; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scm/ScmChangedFilesProvider.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scm/ScmChangedFilesProvider.java index 6e93b9d4ad6..4c65b2843e8 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scm/ScmChangedFilesProvider.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scm/ScmChangedFilesProvider.java @@ -27,9 +27,9 @@ import org.sonar.api.batch.scm.ScmProvider; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; import org.sonar.api.utils.log.Profiler; -import org.sonar.scanner.fs.DefaultInputProject; +import org.sonar.api.impl.fs.DefaultInputProject; import org.sonar.scanner.scan.branch.BranchConfiguration; -import org.sonar.scanner.util.ScannerUtils; +import org.sonar.api.impl.utils.ScannerUtils; public class ScmChangedFilesProvider extends ProviderAdapter { private static final Logger LOG = Loggers.get(ScmChangedFilesProvider.class); diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scm/ScmPublisher.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scm/ScmPublisher.java index 7b048096dab..834d224ec82 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/scm/ScmPublisher.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/scm/ScmPublisher.java @@ -29,7 +29,7 @@ import org.sonar.api.batch.fs.InputFile.Status; import org.sonar.api.batch.scm.ScmProvider; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputFile; import org.sonar.scanner.protocol.output.ScannerReport; import org.sonar.scanner.protocol.output.ScannerReport.Changesets.Builder; import org.sonar.scanner.protocol.output.ScannerReportWriter; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/AbstractSensorOptimizer.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/AbstractSensorOptimizer.java index 95b473e05ce..cc089182c6b 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/AbstractSensorOptimizer.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/AbstractSensorOptimizer.java @@ -25,6 +25,7 @@ import org.sonar.api.batch.fs.FilePredicate; import org.sonar.api.batch.fs.FileSystem; import org.sonar.api.batch.rule.ActiveRules; import org.sonar.api.config.Configuration; +import org.sonar.api.impl.sensor.DefaultSensorDescriptor; public abstract class AbstractSensorOptimizer { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/AbstractSensorWrapper.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/AbstractSensorWrapper.java index caba9bc9101..d5109c87943 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/AbstractSensorWrapper.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/AbstractSensorWrapper.java @@ -20,6 +20,7 @@ package org.sonar.scanner.sensor; import org.sonar.api.batch.sensor.SensorContext; +import org.sonar.api.impl.sensor.DefaultSensorDescriptor; import org.sonar.api.scanner.sensor.ProjectSensor; public abstract class AbstractSensorWrapper<G extends ProjectSensor> { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultAdHocRule.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultAdHocRule.java deleted file mode 100644 index 1dde73e2c5c..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultAdHocRule.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import javax.annotation.CheckForNull; -import javax.annotation.Nullable; -import org.sonar.api.batch.rule.Severity; -import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.api.batch.sensor.rule.AdHocRule; -import org.sonar.api.batch.sensor.rule.NewAdHocRule; -import org.sonar.api.rules.RuleType; - -import static org.apache.commons.lang.StringUtils.isNotBlank; -import static org.sonar.api.utils.Preconditions.checkState; - -public class DefaultAdHocRule extends DefaultStorable implements AdHocRule, NewAdHocRule { - private Severity severity; - private RuleType type; - private String name; - private String description; - private String engineId; - private String ruleId; - - public DefaultAdHocRule() { - super(null); - } - - public DefaultAdHocRule(@Nullable SensorStorage storage) { - super(storage); - } - - @Override - public DefaultAdHocRule severity(Severity severity) { - this.severity = severity; - return this; - } - - @Override - public String engineId() { - return engineId; - } - - @Override - public String ruleId() { - return ruleId; - } - - @Override - public String name() { - return name; - } - - @CheckForNull - @Override - public String description() { - return description; - } - - @Override - public Severity severity() { - return this.severity; - } - - @Override - public void doSave() { - checkState(isNotBlank(engineId), "Engine id is mandatory on ad hoc rule"); - checkState(isNotBlank(ruleId), "Rule id is mandatory on ad hoc rule"); - checkState(isNotBlank(name), "Name is mandatory on every ad hoc rule"); - checkState(severity != null, "Severity is mandatory on every ad hoc rule"); - checkState(type != null, "Type is mandatory on every ad hoc rule"); - storage.store(this); - } - - @Override - public RuleType type() { - return type; - } - - @Override - public DefaultAdHocRule engineId(String engineId) { - this.engineId = engineId; - return this; - } - - @Override - public DefaultAdHocRule ruleId(String ruleId) { - this.ruleId = ruleId; - return this; - } - - @Override - public DefaultAdHocRule name(String name) { - this.name = name; - return this; - } - - @Override - public DefaultAdHocRule description(@Nullable String description) { - this.description = description; - return this; - } - - @Override - public DefaultAdHocRule type(RuleType type) { - this.type = type; - return this; - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultAnalysisError.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultAnalysisError.java deleted file mode 100644 index 3da46d831d7..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultAnalysisError.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.TextPointer; -import org.sonar.api.batch.sensor.error.AnalysisError; -import org.sonar.api.batch.sensor.error.NewAnalysisError; -import org.sonar.api.batch.sensor.internal.SensorStorage; - -import static java.util.Objects.requireNonNull; -import static org.sonar.api.utils.Preconditions.checkArgument; -import static org.sonar.api.utils.Preconditions.checkState; - -public class DefaultAnalysisError extends DefaultStorable implements NewAnalysisError, AnalysisError { - private InputFile inputFile; - private String message; - private TextPointer location; - - public DefaultAnalysisError() { - super(null); - } - - public DefaultAnalysisError(SensorStorage storage) { - super(storage); - } - - @Override - public InputFile inputFile() { - return inputFile; - } - - @Override - public String message() { - return message; - } - - @Override - public TextPointer location() { - return location; - } - - @Override - public NewAnalysisError onFile(InputFile inputFile) { - checkArgument(inputFile != null, "Cannot use a inputFile that is null"); - checkState(this.inputFile == null, "onFile() already called"); - this.inputFile = inputFile; - return this; - } - - @Override - public NewAnalysisError message(String message) { - this.message = message; - return this; - } - - @Override - public NewAnalysisError at(TextPointer location) { - checkState(this.location == null, "at() already called"); - this.location = location; - return this; - } - - @Override - protected void doSave() { - requireNonNull(this.inputFile, "inputFile is mandatory on AnalysisError"); - storage.store(this); - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultCoverage.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultCoverage.java deleted file mode 100644 index 5a2f04811b0..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultCoverage.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import java.util.Collections; -import java.util.SortedMap; -import java.util.TreeMap; -import javax.annotation.Nullable; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.sensor.coverage.CoverageType; -import org.sonar.api.batch.sensor.coverage.NewCoverage; -import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.scanner.fs.DefaultInputFile; - -import static java.util.Objects.requireNonNull; -import static org.sonar.api.utils.Preconditions.checkState; - -public class DefaultCoverage extends DefaultStorable implements NewCoverage { - - private InputFile inputFile; - private CoverageType type; - private int totalCoveredLines = 0; - private int totalConditions = 0; - private int totalCoveredConditions = 0; - private SortedMap<Integer, Integer> hitsByLine = new TreeMap<>(); - private SortedMap<Integer, Integer> conditionsByLine = new TreeMap<>(); - private SortedMap<Integer, Integer> coveredConditionsByLine = new TreeMap<>(); - - public DefaultCoverage() { - super(); - } - - public DefaultCoverage(@Nullable SensorStorage storage) { - super(storage); - } - - @Override - public DefaultCoverage onFile(InputFile inputFile) { - this.inputFile = inputFile; - return this; - } - - public InputFile inputFile() { - return inputFile; - } - - @Override - public NewCoverage ofType(CoverageType type) { - this.type = requireNonNull(type, "type can't be null"); - return this; - } - - public CoverageType type() { - return type; - } - - @Override - public NewCoverage lineHits(int line, int hits) { - validateFile(); - if (isExcluded()) { - return this; - } - validateLine(line); - - if (!hitsByLine.containsKey(line)) { - hitsByLine.put(line, hits); - if (hits > 0) { - totalCoveredLines += 1; - } - } - return this; - } - - private void validateLine(int line) { - checkState(line <= inputFile.lines(), "Line %s is out of range in the file %s (lines: %s)", line, inputFile, inputFile.lines()); - checkState(line > 0, "Line number must be strictly positive: %s", line); - } - - private void validateFile() { - requireNonNull(inputFile, "Call onFile() first"); - } - - @Override - public NewCoverage conditions(int line, int conditions, int coveredConditions) { - validateFile(); - if (isExcluded()) { - return this; - } - validateLine(line); - - if (conditions > 0 && !conditionsByLine.containsKey(line)) { - totalConditions += conditions; - totalCoveredConditions += coveredConditions; - conditionsByLine.put(line, conditions); - coveredConditionsByLine.put(line, coveredConditions); - } - return this; - } - - public int coveredLines() { - return totalCoveredLines; - } - - public int linesToCover() { - return hitsByLine.size(); - } - - public int conditions() { - return totalConditions; - } - - public int coveredConditions() { - return totalCoveredConditions; - } - - public SortedMap<Integer, Integer> hitsByLine() { - return Collections.unmodifiableSortedMap(hitsByLine); - } - - public SortedMap<Integer, Integer> conditionsByLine() { - return Collections.unmodifiableSortedMap(conditionsByLine); - } - - public SortedMap<Integer, Integer> coveredConditionsByLine() { - return Collections.unmodifiableSortedMap(coveredConditionsByLine); - } - - @Override - public void doSave() { - validateFile(); - if (!isExcluded()) { - storage.store(this); - } - } - - private boolean isExcluded() { - return ((DefaultInputFile) inputFile).isExcludedForCoverage(); - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultCpdTokens.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultCpdTokens.java deleted file mode 100644 index d470ab7c6c1..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultCpdTokens.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import java.util.ArrayList; -import java.util.List; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.TextRange; -import org.sonar.api.batch.sensor.cpd.NewCpdTokens; -import org.sonar.api.batch.sensor.cpd.internal.TokensLine; -import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.api.utils.log.Logger; -import org.sonar.api.utils.log.Loggers; -import org.sonar.scanner.fs.DefaultInputFile; - -import static java.util.Collections.unmodifiableList; -import static java.util.Objects.requireNonNull; -import static org.sonar.api.utils.Preconditions.checkState; - -public class DefaultCpdTokens extends DefaultStorable implements NewCpdTokens { - private static final Logger LOG = Loggers.get(DefaultCpdTokens.class); - private final List<TokensLine> result = new ArrayList<>(); - private DefaultInputFile inputFile; - private int startLine = Integer.MIN_VALUE; - private int startIndex = 0; - private int currentIndex = 0; - private StringBuilder sb = new StringBuilder(); - private TextRange lastRange; - private boolean loggedTestCpdWarning = false; - - public DefaultCpdTokens(SensorStorage storage) { - super(storage); - } - - @Override - public DefaultCpdTokens onFile(InputFile inputFile) { - this.inputFile = (DefaultInputFile) requireNonNull(inputFile, "file can't be null"); - return this; - } - - public InputFile inputFile() { - return inputFile; - } - - @Override - public NewCpdTokens addToken(int startLine, int startLineOffset, int endLine, int endLineOffset, String image) { - checkInputFileNotNull(); - TextRange newRange; - try { - newRange = inputFile.newRange(startLine, startLineOffset, endLine, endLineOffset); - } catch (Exception e) { - throw new IllegalArgumentException("Unable to register token in file " + inputFile, e); - } - return addToken(newRange, image); - } - - @Override - public DefaultCpdTokens addToken(TextRange range, String image) { - requireNonNull(range, "Range should not be null"); - requireNonNull(image, "Image should not be null"); - checkInputFileNotNull(); - if (isExcludedForDuplication()) { - return this; - } - checkState(lastRange == null || lastRange.end().compareTo(range.start()) <= 0, - "Tokens of file %s should be provided in order.\nPrevious token: %s\nLast token: %s", inputFile, lastRange, range); - - int line = range.start().line(); - if (line != startLine) { - addNewTokensLine(result, startIndex, currentIndex, startLine, sb); - startIndex = currentIndex + 1; - startLine = line; - } - currentIndex++; - sb.append(image); - lastRange = range; - - return this; - } - - private boolean isExcludedForDuplication() { - if (inputFile.isExcludedForDuplication()) { - return true; - } - if (inputFile.type() == InputFile.Type.TEST) { - if (!loggedTestCpdWarning) { - LOG.warn("Duplication reported for '{}' will be ignored because it's a test file.", inputFile); - loggedTestCpdWarning = true; - } - return true; - } - return false; - } - - public List<TokensLine> getTokenLines() { - return unmodifiableList(new ArrayList<>(result)); - } - - private static void addNewTokensLine(List<TokensLine> result, int startUnit, int endUnit, int startLine, StringBuilder sb) { - if (sb.length() != 0) { - result.add(new TokensLine(startUnit, endUnit, startLine, sb.toString())); - sb.setLength(0); - } - } - - @Override - protected void doSave() { - checkState(inputFile != null, "Call onFile() first"); - if (isExcludedForDuplication()) { - return; - } - addNewTokensLine(result, startIndex, currentIndex, startLine, sb); - storage.store(this); - } - - private void checkInputFileNotNull() { - checkState(inputFile != null, "Call onFile() first"); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultExternalIssue.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultExternalIssue.java deleted file mode 100644 index 7141a3ec39d..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultExternalIssue.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import javax.annotation.Nullable; -import org.sonar.api.batch.rule.Severity; -import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.api.batch.sensor.issue.ExternalIssue; -import org.sonar.api.batch.sensor.issue.NewExternalIssue; -import org.sonar.api.rule.RuleKey; -import org.sonar.api.rules.RuleType; -import org.sonar.scanner.fs.DefaultInputProject; -import org.sonar.scanner.issue.AbstractDefaultIssue; - -import static java.lang.String.format; -import static java.util.Objects.requireNonNull; -import static org.sonar.api.utils.Preconditions.checkArgument; -import static org.sonar.api.utils.Preconditions.checkState; - -public class DefaultExternalIssue extends AbstractDefaultIssue<DefaultExternalIssue> implements ExternalIssue, NewExternalIssue { - private Long effort; - private Severity severity; - private RuleType type; - private String engineId; - private String ruleId; - - public DefaultExternalIssue(DefaultInputProject project) { - this(project, null); - } - - public DefaultExternalIssue(DefaultInputProject project, @Nullable SensorStorage storage) { - super(project, storage); - } - - @Override - public DefaultExternalIssue remediationEffortMinutes(@Nullable Long effort) { - checkArgument(effort == null || effort >= 0, format("effort must be greater than or equal 0 (got %s)", effort)); - this.effort = effort; - return this; - } - - @Override - public DefaultExternalIssue severity(Severity severity) { - this.severity = severity; - return this; - } - - @Override - public String engineId() { - return engineId; - } - - @Override - public String ruleId() { - return ruleId; - } - - @Override - public Severity severity() { - return this.severity; - } - - @Override - public Long remediationEffort() { - return this.effort; - } - - @Override - public void doSave() { - requireNonNull(this.engineId, "Engine id is mandatory on external issue"); - requireNonNull(this.ruleId, "Rule id is mandatory on external issue"); - checkState(primaryLocation != null, "Primary location is mandatory on every external issue"); - checkState(primaryLocation.inputComponent().isFile(), "External issues must be located in files"); - checkState(primaryLocation.message() != null, "External issues must have a message"); - checkState(severity != null, "Severity is mandatory on every external issue"); - checkState(type != null, "Type is mandatory on every external issue"); - storage.store(this); - } - - @Override - public RuleType type() { - return type; - } - - @Override - public NewExternalIssue engineId(String engineId) { - this.engineId = engineId; - return this; - } - - @Override - public NewExternalIssue ruleId(String ruleId) { - this.ruleId = ruleId; - return this; - } - - @Override - public DefaultExternalIssue forRule(RuleKey ruleKey) { - this.engineId = ruleKey.repository(); - this.ruleId = ruleKey.rule(); - return this; - } - - @Override - public RuleKey ruleKey() { - if (engineId != null && ruleId != null) { - return RuleKey.of(RuleKey.EXTERNAL_RULE_REPO_PREFIX + engineId, ruleId); - } - return null; - } - - @Override - public DefaultExternalIssue type(RuleType type) { - this.type = type; - return this; - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultHighlighting.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultHighlighting.java deleted file mode 100644 index 0f972804991..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultHighlighting.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.TextRange; -import org.sonar.api.batch.sensor.highlighting.NewHighlighting; -import org.sonar.api.batch.sensor.highlighting.TypeOfText; -import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.scanner.fs.DefaultInputFile; - -import static java.util.Objects.requireNonNull; -import static org.sonar.api.utils.Preconditions.checkState; - -public class DefaultHighlighting extends DefaultStorable implements NewHighlighting { - - private final List<SyntaxHighlightingRule> syntaxHighlightingRules; - private DefaultInputFile inputFile; - - public DefaultHighlighting(SensorStorage storage) { - super(storage); - syntaxHighlightingRules = new ArrayList<>(); - } - - public List<SyntaxHighlightingRule> getSyntaxHighlightingRuleSet() { - return syntaxHighlightingRules; - } - - private void checkOverlappingBoundaries() { - if (syntaxHighlightingRules.size() > 1) { - Iterator<SyntaxHighlightingRule> it = syntaxHighlightingRules.iterator(); - SyntaxHighlightingRule previous = it.next(); - while (it.hasNext()) { - SyntaxHighlightingRule current = it.next(); - if (previous.range().end().compareTo(current.range().start()) > 0 && (previous.range().end().compareTo(current.range().end()) < 0)) { - String errorMsg = String.format("Cannot register highlighting rule for characters at %s as it " + - "overlaps at least one existing rule", current.range()); - throw new IllegalStateException(errorMsg); - } - previous = current; - } - } - } - - @Override - public DefaultHighlighting onFile(InputFile inputFile) { - requireNonNull(inputFile, "file can't be null"); - this.inputFile = (DefaultInputFile) inputFile; - return this; - } - - public InputFile inputFile() { - return inputFile; - } - - @Override - public DefaultHighlighting highlight(int startOffset, int endOffset, TypeOfText typeOfText) { - checkInputFileNotNull(); - TextRange newRange; - try { - newRange = inputFile.newRange(startOffset, endOffset); - } catch (Exception e) { - throw new IllegalArgumentException("Unable to highlight file " + inputFile, e); - } - return highlight(newRange, typeOfText); - } - - @Override - public DefaultHighlighting highlight(int startLine, int startLineOffset, int endLine, int endLineOffset, TypeOfText typeOfText) { - checkInputFileNotNull(); - TextRange newRange; - try { - newRange = inputFile.newRange(startLine, startLineOffset, endLine, endLineOffset); - } catch (Exception e) { - throw new IllegalArgumentException("Unable to highlight file " + inputFile, e); - } - return highlight(newRange, typeOfText); - } - - @Override - public DefaultHighlighting highlight(TextRange range, TypeOfText typeOfText) { - SyntaxHighlightingRule syntaxHighlightingRule = SyntaxHighlightingRule.create(range, typeOfText); - this.syntaxHighlightingRules.add(syntaxHighlightingRule); - return this; - } - - @Override - protected void doSave() { - checkInputFileNotNull(); - // Sort rules to avoid variation during consecutive runs - Collections.sort(syntaxHighlightingRules, (left, right) -> { - int result = left.range().start().compareTo(right.range().start()); - if (result == 0) { - result = right.range().end().compareTo(left.range().end()); - } - return result; - }); - checkOverlappingBoundaries(); - storage.store(this); - } - - private void checkInputFileNotNull() { - checkState(inputFile != null, "Call onFile() first"); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultMeasure.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultMeasure.java deleted file mode 100644 index 1ad7b83ce99..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultMeasure.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import java.io.Serializable; -import javax.annotation.Nullable; -import org.apache.commons.lang.builder.EqualsBuilder; -import org.apache.commons.lang.builder.HashCodeBuilder; -import org.sonar.api.batch.fs.InputComponent; -import org.sonar.api.batch.measure.Metric; -import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.api.batch.sensor.measure.Measure; -import org.sonar.api.batch.sensor.measure.NewMeasure; - -import static java.util.Objects.requireNonNull; -import static org.sonar.api.utils.Preconditions.checkArgument; -import static org.sonar.api.utils.Preconditions.checkState; - -public class DefaultMeasure<G extends Serializable> extends DefaultStorable implements Measure<G>, NewMeasure<G> { - - private InputComponent component; - private Metric<G> metric; - private G value; - private boolean fromCore = false; - - public DefaultMeasure() { - super(); - } - - public DefaultMeasure(@Nullable SensorStorage storage) { - super(storage); - } - - @Override - public DefaultMeasure<G> on(InputComponent component) { - checkArgument(component != null, "Component can't be null"); - checkState(this.component == null, "on() already called"); - this.component = component; - return this; - } - - @Override - public DefaultMeasure<G> forMetric(Metric<G> metric) { - checkState(this.metric == null, "Metric already defined"); - requireNonNull(metric, "metric should be non null"); - this.metric = metric; - return this; - } - - @Override - public DefaultMeasure<G> withValue(G value) { - checkState(this.value == null, "Measure value already defined"); - requireNonNull(value, "Measure value can't be null"); - this.value = value; - return this; - } - - /** - * For internal use. - */ - public boolean isFromCore() { - return fromCore; - } - - /** - * For internal use. Used by core components to bypass check that prevent a plugin to store core measures. - */ - public DefaultMeasure<G> setFromCore() { - this.fromCore = true; - return this; - } - - @Override - public void doSave() { - requireNonNull(this.value, "Measure value can't be null"); - requireNonNull(this.metric, "Measure metric can't be null"); - checkState(this.metric.valueType().equals(this.value.getClass()), "Measure value should be of type %s", this.metric.valueType()); - storage.store(this); - } - - @Override - public Metric<G> metric() { - return metric; - } - - @Override - public InputComponent inputComponent() { - return component; - } - - @Override - public G value() { - return value; - } - - // For testing purpose - - @Override - public boolean equals(Object obj) { - if (obj == null) { - return false; - } - if (obj == this) { - return true; - } - if (obj.getClass() != getClass()) { - return false; - } - DefaultMeasure<?> rhs = (DefaultMeasure<?>) obj; - return new EqualsBuilder() - .append(component, rhs.component) - .append(metric, rhs.metric) - .append(value, rhs.value) - .isEquals(); - } - - @Override - public int hashCode() { - return new HashCodeBuilder(27, 45).append(component).append(metric).append(value).toHashCode(); - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultSensorDescriptor.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultSensorDescriptor.java deleted file mode 100644 index 1bb74666aaf..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultSensorDescriptor.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import java.util.Arrays; -import java.util.Collection; -import java.util.function.Predicate; -import javax.annotation.Nullable; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.sensor.SensorDescriptor; -import org.sonar.api.config.Configuration; - -import static java.util.Arrays.asList; - -public class DefaultSensorDescriptor implements SensorDescriptor { - - private String name; - private String[] languages = new String[0]; - private InputFile.Type type = null; - private String[] ruleRepositories = new String[0]; - private boolean global = false; - private Predicate<Configuration> configurationPredicate; - - public String name() { - return name; - } - - public Collection<String> languages() { - return Arrays.asList(languages); - } - - @Nullable - public InputFile.Type type() { - return type; - } - - public Collection<String> ruleRepositories() { - return Arrays.asList(ruleRepositories); - } - - public Predicate<Configuration> configurationPredicate() { - return configurationPredicate; - } - - public boolean isGlobal() { - return global; - } - - @Override - public DefaultSensorDescriptor name(String name) { - this.name = name; - return this; - } - - @Override - public DefaultSensorDescriptor onlyOnLanguage(String languageKey) { - return onlyOnLanguages(languageKey); - } - - @Override - public DefaultSensorDescriptor onlyOnLanguages(String... languageKeys) { - this.languages = languageKeys; - return this; - } - - @Override - public DefaultSensorDescriptor onlyOnFileType(InputFile.Type type) { - this.type = type; - return this; - } - - @Override - public DefaultSensorDescriptor createIssuesForRuleRepository(String... repositoryKey) { - return createIssuesForRuleRepositories(repositoryKey); - } - - @Override - public DefaultSensorDescriptor createIssuesForRuleRepositories(String... repositoryKeys) { - this.ruleRepositories = repositoryKeys; - return this; - } - - @Override - public DefaultSensorDescriptor requireProperty(String... propertyKey) { - return requireProperties(propertyKey); - } - - @Override - public DefaultSensorDescriptor requireProperties(String... propertyKeys) { - this.configurationPredicate = config -> asList(propertyKeys).stream().allMatch(config::hasKey); - return this; - } - - @Override - public SensorDescriptor global() { - this.global = true; - return this; - } - - @Override - public SensorDescriptor onlyWhenConfiguration(Predicate<Configuration> configurationPredicate) { - this.configurationPredicate = configurationPredicate; - return this; - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultSensorStorage.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultSensorStorage.java index 13b72b07f7b..8cece1eba14 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultSensorStorage.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultSensorStorage.java @@ -46,6 +46,15 @@ import org.sonar.api.batch.sensor.measure.Measure; import org.sonar.api.batch.sensor.rule.AdHocRule; import org.sonar.api.batch.sensor.symbol.NewSymbolTable; import org.sonar.api.config.Configuration; +import org.sonar.api.impl.fs.DefaultInputComponent; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputModule; +import org.sonar.api.impl.sensor.DefaultCoverage; +import org.sonar.api.impl.sensor.DefaultCpdTokens; +import org.sonar.api.impl.sensor.DefaultHighlighting; +import org.sonar.api.impl.sensor.DefaultMeasure; +import org.sonar.api.impl.sensor.DefaultSignificantCode; +import org.sonar.api.impl.sensor.DefaultSymbolTable; import org.sonar.api.measures.CoreMetrics; import org.sonar.api.utils.KeyValueFormat; import org.sonar.api.utils.log.Logger; @@ -55,9 +64,6 @@ import org.sonar.core.util.CloseableIterator; import org.sonar.duplications.block.Block; import org.sonar.duplications.internal.pmd.PmdBlockChunker; import org.sonar.scanner.cpd.index.SonarCpdBlockIndex; -import org.sonar.scanner.fs.DefaultInputComponent; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.DefaultInputModule; import org.sonar.scanner.issue.IssuePublisher; import org.sonar.scanner.protocol.Constants; import org.sonar.scanner.protocol.output.FileStructure; diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultSignificantCode.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultSignificantCode.java deleted file mode 100644 index 04ff5f16e0b..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultSignificantCode.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import java.util.SortedMap; -import java.util.TreeMap; -import javax.annotation.Nullable; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.TextRange; -import org.sonar.api.batch.sensor.code.NewSignificantCode; -import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.api.utils.Preconditions; - -public class DefaultSignificantCode extends DefaultStorable implements NewSignificantCode { - private SortedMap<Integer, TextRange> significantCodePerLine = new TreeMap<>(); - private InputFile inputFile; - - public DefaultSignificantCode() { - super(); - } - - public DefaultSignificantCode(@Nullable SensorStorage storage) { - super(storage); - } - - @Override - public DefaultSignificantCode onFile(InputFile inputFile) { - this.inputFile = inputFile; - return this; - } - - @Override - public DefaultSignificantCode addRange(TextRange range) { - Preconditions.checkState(this.inputFile != null, "addRange() should be called after on()"); - - int line = range.start().line(); - - Preconditions.checkArgument(line == range.end().line(), "Ranges of significant code must be located in a single line"); - Preconditions.checkState(!significantCodePerLine.containsKey(line), "Significant code was already reported for line '%s'. Can only report once per line.", line); - - significantCodePerLine.put(line, range); - return this; - } - - @Override - protected void doSave() { - Preconditions.checkState(inputFile != null, "Call onFile() first"); - storage.store(this); - } - - public InputFile inputFile() { - return inputFile; - } - - public SortedMap<Integer, TextRange> significantCodePerLine() { - return significantCodePerLine; - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultStorable.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultStorable.java deleted file mode 100644 index 23b989ca09d..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultStorable.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import javax.annotation.Nullable; -import org.apache.commons.lang.builder.ToStringBuilder; -import org.apache.commons.lang.builder.ToStringStyle; -import org.sonar.api.batch.sensor.internal.SensorStorage; - -import static java.util.Objects.requireNonNull; -import static org.sonar.api.utils.Preconditions.checkState; - -public abstract class DefaultStorable { - - protected final transient SensorStorage storage; - private transient boolean saved = false; - - public DefaultStorable() { - this.storage = null; - } - - public DefaultStorable(@Nullable SensorStorage storage) { - this.storage = storage; - } - - public final void save() { - requireNonNull(this.storage, "No persister on this object"); - checkState(!saved, "This object was already saved"); - doSave(); - this.saved = true; - } - - protected abstract void doSave(); - - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); - } - -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultSymbolTable.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultSymbolTable.java deleted file mode 100644 index ca8b162f6a4..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/DefaultSymbolTable.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.TextRange; -import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.api.batch.sensor.symbol.NewSymbol; -import org.sonar.api.batch.sensor.symbol.NewSymbolTable; -import org.sonar.scanner.fs.DefaultInputFile; - -import static java.util.Objects.requireNonNull; -import static org.sonar.api.utils.Preconditions.checkArgument; -import static org.sonar.api.utils.Preconditions.checkState; - -public class DefaultSymbolTable extends DefaultStorable implements NewSymbolTable { - - private final Map<TextRange, Set<TextRange>> referencesBySymbol; - private DefaultInputFile inputFile; - - public DefaultSymbolTable(SensorStorage storage) { - super(storage); - referencesBySymbol = new LinkedHashMap<>(); - } - - public Map<TextRange, Set<TextRange>> getReferencesBySymbol() { - return referencesBySymbol; - } - - @Override - public DefaultSymbolTable onFile(InputFile inputFile) { - requireNonNull(inputFile, "file can't be null"); - this.inputFile = (DefaultInputFile) inputFile; - return this; - } - - public InputFile inputFile() { - return inputFile; - } - - @Override - public NewSymbol newSymbol(int startLine, int startLineOffset, int endLine, int endLineOffset) { - checkInputFileNotNull(); - TextRange declarationRange; - try { - declarationRange = inputFile.newRange(startLine, startLineOffset, endLine, endLineOffset); - } catch (Exception e) { - throw new IllegalArgumentException("Unable to create symbol on file " + inputFile, e); - } - return newSymbol(declarationRange); - } - - @Override - public NewSymbol newSymbol(int startOffset, int endOffset) { - checkInputFileNotNull(); - TextRange declarationRange; - try { - declarationRange = inputFile.newRange(startOffset, endOffset); - } catch (Exception e) { - throw new IllegalArgumentException("Unable to create symbol on file " + inputFile, e); - } - return newSymbol(declarationRange); - } - - @Override - public NewSymbol newSymbol(TextRange range) { - checkInputFileNotNull(); - TreeSet<TextRange> references = new TreeSet<>((o1, o2) -> o1.start().compareTo(o2.start())); - referencesBySymbol.put(range, references); - return new DefaultSymbol(inputFile, range, references); - } - - private static class DefaultSymbol implements NewSymbol { - - private final Collection<TextRange> references; - private final DefaultInputFile inputFile; - private final TextRange declaration; - - public DefaultSymbol(DefaultInputFile inputFile, TextRange declaration, Collection<TextRange> references) { - this.inputFile = inputFile; - this.declaration = declaration; - this.references = references; - } - - @Override - public NewSymbol newReference(int startOffset, int endOffset) { - TextRange referenceRange; - try { - referenceRange = inputFile.newRange(startOffset, endOffset); - } catch (Exception e) { - throw new IllegalArgumentException("Unable to create symbol reference on file " + inputFile, e); - } - return newReference(referenceRange); - } - - @Override - public NewSymbol newReference(int startLine, int startLineOffset, int endLine, int endLineOffset) { - TextRange referenceRange; - try { - referenceRange = inputFile.newRange(startLine, startLineOffset, endLine, endLineOffset); - } catch (Exception e) { - throw new IllegalArgumentException("Unable to create symbol reference on file " + inputFile, e); - } - return newReference(referenceRange); - } - - @Override - public NewSymbol newReference(TextRange range) { - requireNonNull(range, "Provided range is null"); - checkArgument(!declaration.overlap(range), "Overlapping symbol declaration and reference for symbol at %s", declaration); - references.add(range); - return this; - } - - } - - @Override - protected void doSave() { - checkInputFileNotNull(); - storage.store(this); - } - - private void checkInputFileNotNull() { - checkState(inputFile != null, "Call onFile() first"); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/InMemorySensorStorage.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/InMemorySensorStorage.java deleted file mode 100644 index 472537df959..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/InMemorySensorStorage.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import org.sonar.api.batch.sensor.code.NewSignificantCode; -import org.sonar.api.batch.sensor.coverage.NewCoverage; -import org.sonar.api.batch.sensor.cpd.NewCpdTokens; -import org.sonar.api.batch.sensor.error.AnalysisError; -import org.sonar.api.batch.sensor.highlighting.NewHighlighting; -import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.api.batch.sensor.issue.ExternalIssue; -import org.sonar.api.batch.sensor.issue.Issue; -import org.sonar.api.batch.sensor.measure.Measure; -import org.sonar.api.batch.sensor.rule.AdHocRule; -import org.sonar.api.batch.sensor.symbol.NewSymbolTable; - -import static org.sonar.api.utils.Preconditions.checkArgument; - -class InMemorySensorStorage implements SensorStorage { - - Map<String, Map<String, Measure>> measuresByComponentAndMetric = new HashMap<>(); - - Collection<Issue> allIssues = new ArrayList<>(); - Collection<ExternalIssue> allExternalIssues = new ArrayList<>(); - Collection<AdHocRule> allAdHocRules = new ArrayList<>(); - Collection<AnalysisError> allAnalysisErrors = new ArrayList<>(); - - Map<String, NewHighlighting> highlightingByComponent = new HashMap<>(); - Map<String, DefaultCpdTokens> cpdTokensByComponent = new HashMap<>(); - Map<String, List<DefaultCoverage>> coverageByComponent = new HashMap<>(); - Map<String, DefaultSymbolTable> symbolsPerComponent = new HashMap<>(); - Map<String, String> contextProperties = new HashMap<>(); - Map<String, DefaultSignificantCode> significantCodePerComponent = new HashMap<>(); - - @Override - public void store(Measure measure) { - // Emulate duplicate measure check - String componentKey = measure.inputComponent().key(); - String metricKey = measure.metric().key(); - if (measuresByComponentAndMetric.getOrDefault(componentKey, Collections.emptyMap()).containsKey(metricKey)) { - throw new IllegalStateException("Can not add the same measure twice"); - } - measuresByComponentAndMetric.computeIfAbsent(componentKey, x -> new HashMap<>()).put(metricKey, measure); - } - - @Override - public void store(Issue issue) { - allIssues.add(issue); - } - - @Override - public void store(AdHocRule adHocRule) { - allAdHocRules.add(adHocRule); - } - - @Override - public void store(NewHighlighting newHighlighting) { - DefaultHighlighting highlighting = (DefaultHighlighting) newHighlighting; - String fileKey = highlighting.inputFile().key(); - // Emulate duplicate storage check - if (highlightingByComponent.containsKey(fileKey)) { - throw new UnsupportedOperationException("Trying to save highlighting twice for the same file is not supported: " + highlighting.inputFile()); - } - highlightingByComponent.put(fileKey, highlighting); - } - - @Override - public void store(NewCoverage coverage) { - DefaultCoverage defaultCoverage = (DefaultCoverage) coverage; - String fileKey = defaultCoverage.inputFile().key(); - coverageByComponent.computeIfAbsent(fileKey, x -> new ArrayList<>()).add(defaultCoverage); - } - - @Override - public void store(NewCpdTokens cpdTokens) { - DefaultCpdTokens defaultCpdTokens = (DefaultCpdTokens) cpdTokens; - String fileKey = defaultCpdTokens.inputFile().key(); - // Emulate duplicate storage check - if (cpdTokensByComponent.containsKey(fileKey)) { - throw new UnsupportedOperationException("Trying to save CPD tokens twice for the same file is not supported: " + defaultCpdTokens.inputFile()); - } - cpdTokensByComponent.put(fileKey, defaultCpdTokens); - } - - @Override - public void store(NewSymbolTable newSymbolTable) { - DefaultSymbolTable symbolTable = (DefaultSymbolTable) newSymbolTable; - String fileKey = symbolTable.inputFile().key(); - // Emulate duplicate storage check - if (symbolsPerComponent.containsKey(fileKey)) { - throw new UnsupportedOperationException("Trying to save symbol table twice for the same file is not supported: " + symbolTable.inputFile()); - } - symbolsPerComponent.put(fileKey, symbolTable); - } - - @Override - public void store(AnalysisError analysisError) { - allAnalysisErrors.add(analysisError); - } - - @Override - public void storeProperty(String key, String value) { - checkArgument(key != null, "Key of context property must not be null"); - checkArgument(value != null, "Value of context property must not be null"); - contextProperties.put(key, value); - } - - @Override - public void store(ExternalIssue issue) { - allExternalIssues.add(issue); - } - - @Override - public void store(NewSignificantCode newSignificantCode) { - DefaultSignificantCode significantCode = (DefaultSignificantCode) newSignificantCode; - String fileKey = significantCode.inputFile().key(); - // Emulate duplicate storage check - if (significantCodePerComponent.containsKey(fileKey)) { - throw new UnsupportedOperationException("Trying to save significant code information twice for the same file is not supported: " + significantCode.inputFile()); - } - significantCodePerComponent.put(fileKey, significantCode); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/ModuleSensorContext.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/ModuleSensorContext.java index 1e8f6009f8d..783c4b2720f 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/ModuleSensorContext.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/ModuleSensorContext.java @@ -27,7 +27,7 @@ import org.sonar.api.batch.rule.ActiveRules; import org.sonar.api.batch.sensor.internal.SensorStorage; import org.sonar.api.config.Configuration; import org.sonar.api.config.Settings; -import org.sonar.scanner.fs.DefaultInputProject; +import org.sonar.api.impl.fs.DefaultInputProject; @ThreadSafe public class ModuleSensorContext extends ProjectSensorContext { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/ModuleSensorsExecutor.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/ModuleSensorsExecutor.java index ec3d21f6613..7c627f3d502 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/ModuleSensorsExecutor.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/ModuleSensorsExecutor.java @@ -23,12 +23,12 @@ import java.util.ArrayList; import java.util.Collection; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.sonar.api.batch.fs.internal.SensorStrategy; +import org.sonar.api.impl.fs.SensorStrategy; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; import org.sonar.core.util.logs.Profiler; import org.sonar.scanner.bootstrap.ScannerPluginRepository; -import org.sonar.scanner.fs.DefaultInputModule; +import org.sonar.api.impl.fs.DefaultInputModule; import org.sonar.scanner.fs.InputModuleHierarchy; public class ModuleSensorsExecutor { diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/ProjectSensorContext.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/ProjectSensorContext.java index 8a244510328..eae821692a0 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/ProjectSensorContext.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/ProjectSensorContext.java @@ -40,11 +40,19 @@ import org.sonar.api.batch.sensor.rule.NewAdHocRule; import org.sonar.api.batch.sensor.symbol.NewSymbolTable; import org.sonar.api.config.Configuration; import org.sonar.api.config.Settings; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputProject; +import org.sonar.api.impl.issue.DefaultIssue; +import org.sonar.api.impl.sensor.DefaultAdHocRule; +import org.sonar.api.impl.sensor.DefaultCoverage; +import org.sonar.api.impl.sensor.DefaultCpdTokens; +import org.sonar.api.impl.sensor.DefaultExternalIssue; +import org.sonar.api.impl.sensor.DefaultHighlighting; +import org.sonar.api.impl.sensor.DefaultMeasure; +import org.sonar.api.impl.sensor.DefaultSignificantCode; +import org.sonar.api.impl.sensor.DefaultSymbolTable; import org.sonar.api.scanner.fs.InputProject; import org.sonar.api.utils.Version; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.DefaultInputProject; -import org.sonar.scanner.issue.DefaultIssue; import org.sonar.scanner.sensor.noop.NoOpNewAnalysisError; @ThreadSafe diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/SensorContextTester.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/SensorContextTester.java deleted file mode 100644 index e3ffc324ede..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/SensorContextTester.java +++ /dev/null @@ -1,399 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import java.io.File; -import java.io.Serializable; -import java.nio.charset.Charset; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Stream; -import javax.annotation.CheckForNull; -import javax.annotation.Nullable; -import org.sonar.api.SonarQubeSide; -import org.sonar.api.SonarRuntime; -import org.sonar.api.batch.bootstrap.ProjectDefinition; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.InputModule; -import org.sonar.api.batch.fs.TextRange; -import org.sonar.api.batch.rule.ActiveRules; -import org.sonar.api.batch.sensor.Sensor; -import org.sonar.api.batch.sensor.SensorContext; -import org.sonar.api.batch.sensor.code.NewSignificantCode; -import org.sonar.api.batch.sensor.coverage.NewCoverage; -import org.sonar.api.batch.sensor.cpd.NewCpdTokens; -import org.sonar.api.batch.sensor.cpd.internal.TokensLine; -import org.sonar.api.batch.sensor.error.AnalysisError; -import org.sonar.api.batch.sensor.error.NewAnalysisError; -import org.sonar.api.batch.sensor.highlighting.NewHighlighting; -import org.sonar.api.batch.sensor.highlighting.TypeOfText; -import org.sonar.api.batch.sensor.issue.ExternalIssue; -import org.sonar.api.batch.sensor.issue.Issue; -import org.sonar.api.batch.sensor.issue.NewExternalIssue; -import org.sonar.api.batch.sensor.issue.NewIssue; -import org.sonar.api.batch.sensor.measure.Measure; -import org.sonar.api.batch.sensor.measure.NewMeasure; -import org.sonar.api.batch.sensor.rule.AdHocRule; -import org.sonar.api.batch.sensor.rule.NewAdHocRule; -import org.sonar.api.batch.sensor.symbol.NewSymbolTable; -import org.sonar.api.config.Configuration; -import org.sonar.api.config.Settings; -import org.sonar.api.config.internal.ConfigurationBridge; -import org.sonar.api.config.internal.MapSettings; -import org.sonar.api.internal.MetadataLoader; -import org.sonar.api.internal.SonarRuntimeImpl; -import org.sonar.api.measures.Metric; -import org.sonar.api.scanner.fs.InputProject; -import org.sonar.api.utils.System2; -import org.sonar.api.utils.Version; -import org.sonar.scanner.fs.DefaultFileSystem; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.DefaultInputModule; -import org.sonar.scanner.fs.DefaultInputProject; -import org.sonar.scanner.fs.DefaultTextPointer; -import org.sonar.scanner.issue.DefaultIssue; -import org.sonar.scanner.rule.ActiveRulesBuilder; - -import static java.util.Collections.unmodifiableMap; - -/** - * Utility class to help testing {@link Sensor}. This is not an API and method signature may evolve. - * <p> - * Usage: call {@link #create(File)} to create an "in memory" implementation of {@link SensorContext} with a filesystem initialized with provided baseDir. - * <p> - * You have to manually register inputFiles using: - * <pre> - * sensorContextTester.fileSystem().add(new DefaultInputFile("myProjectKey", "src/Foo.java") - * .setLanguage("java") - * .initMetadata("public class Foo {\n}")); - * </pre> - * <p> - * Then pass it to your {@link Sensor}. You can then query elements provided by your sensor using methods {@link #allIssues()}, ... - */ -public class SensorContextTester implements SensorContext { - - private Settings settings; - private DefaultFileSystem fs; - private ActiveRules activeRules; - private InMemorySensorStorage sensorStorage; - private DefaultInputProject project; - private DefaultInputModule module; - private SonarRuntime runtime; - private boolean cancelled; - - private SensorContextTester(Path moduleBaseDir) { - this.settings = new MapSettings(); - this.fs = new DefaultFileSystem(moduleBaseDir).setEncoding(Charset.defaultCharset()); - this.activeRules = new ActiveRulesBuilder().build(); - this.sensorStorage = new InMemorySensorStorage(); - this.project = new DefaultInputProject(ProjectDefinition.create().setKey("projectKey").setBaseDir(moduleBaseDir.toFile()).setWorkDir(moduleBaseDir.resolve(".sonar").toFile())); - this.module = new DefaultInputModule(ProjectDefinition.create().setKey("projectKey").setBaseDir(moduleBaseDir.toFile()).setWorkDir(moduleBaseDir.resolve(".sonar").toFile())); - this.runtime = SonarRuntimeImpl.forSonarQube(MetadataLoader.loadVersion(System2.INSTANCE), SonarQubeSide.SCANNER, MetadataLoader.loadEdition(System2.INSTANCE)); - } - - public static SensorContextTester create(File moduleBaseDir) { - return new SensorContextTester(moduleBaseDir.toPath()); - } - - public static SensorContextTester create(Path moduleBaseDir) { - return new SensorContextTester(moduleBaseDir); - } - - @Override - public Settings settings() { - return settings; - } - - @Override - public Configuration config() { - return new ConfigurationBridge(settings); - } - - public SensorContextTester setSettings(Settings settings) { - this.settings = settings; - return this; - } - - @Override - public DefaultFileSystem fileSystem() { - return fs; - } - - public SensorContextTester setFileSystem(DefaultFileSystem fs) { - this.fs = fs; - return this; - } - - @Override - public ActiveRules activeRules() { - return activeRules; - } - - public SensorContextTester setActiveRules(ActiveRules activeRules) { - this.activeRules = activeRules; - return this; - } - - /** - * Default value is the version of this API at compilation time. You can override it - * using {@link #setRuntime(SonarRuntime)} to test your Sensor behaviour. - */ - @Override - public Version getSonarQubeVersion() { - return runtime().getApiVersion(); - } - - /** - * @see #setRuntime(SonarRuntime) to override defaults (SonarQube scanner with version - * of this API as used at compilation time). - */ - @Override - public SonarRuntime runtime() { - return runtime; - } - - public SensorContextTester setRuntime(SonarRuntime runtime) { - this.runtime = runtime; - return this; - } - - @Override - public boolean isCancelled() { - return cancelled; - } - - public void setCancelled(boolean cancelled) { - this.cancelled = cancelled; - } - - @Override - public InputModule module() { - return module; - } - - @Override - public InputProject project() { - return project; - } - - @Override - public <G extends Serializable> NewMeasure<G> newMeasure() { - return new DefaultMeasure<>(sensorStorage); - } - - public Collection<Measure> measures(String componentKey) { - return sensorStorage.measuresByComponentAndMetric.getOrDefault(componentKey, Collections.emptyMap()).values(); - } - - public <G extends Serializable> Measure<G> measure(String componentKey, Metric<G> metric) { - return measure(componentKey, metric.key()); - } - - public <G extends Serializable> Measure<G> measure(String componentKey, String metricKey) { - return sensorStorage.measuresByComponentAndMetric.getOrDefault(componentKey, Collections.emptyMap()).get(metricKey); - } - - @Override - public NewIssue newIssue() { - return new DefaultIssue(project, sensorStorage); - } - - public Collection<Issue> allIssues() { - return sensorStorage.allIssues; - } - - @Override - public NewExternalIssue newExternalIssue() { - return new DefaultExternalIssue(project, sensorStorage); - } - - @Override - public NewAdHocRule newAdHocRule() { - return new DefaultAdHocRule(sensorStorage); - } - - public Collection<ExternalIssue> allExternalIssues() { - return sensorStorage.allExternalIssues; - } - - public Collection<AdHocRule> allAdHocRules() { - return sensorStorage.allAdHocRules; - } - - public Collection<AnalysisError> allAnalysisErrors() { - return sensorStorage.allAnalysisErrors; - } - - @CheckForNull - public Integer lineHits(String fileKey, int line) { - return sensorStorage.coverageByComponent.getOrDefault(fileKey, Collections.emptyList()).stream() - .map(c -> c.hitsByLine().get(line)) - .flatMap(Stream::of) - .filter(Objects::nonNull) - .reduce(null, SensorContextTester::sumOrNull); - } - - @CheckForNull - public static Integer sumOrNull(@Nullable Integer o1, @Nullable Integer o2) { - return o1 == null ? o2 : (o1 + o2); - } - - @CheckForNull - public Integer conditions(String fileKey, int line) { - return sensorStorage.coverageByComponent.getOrDefault(fileKey, Collections.emptyList()).stream() - .map(c -> c.conditionsByLine().get(line)) - .flatMap(Stream::of) - .filter(Objects::nonNull) - .reduce(null, SensorContextTester::maxOrNull); - } - - @CheckForNull - public Integer coveredConditions(String fileKey, int line) { - return sensorStorage.coverageByComponent.getOrDefault(fileKey, Collections.emptyList()).stream() - .map(c -> c.coveredConditionsByLine().get(line)) - .flatMap(Stream::of) - .filter(Objects::nonNull) - .reduce(null, SensorContextTester::maxOrNull); - } - - @CheckForNull - public TextRange significantCodeTextRange(String fileKey, int line) { - if (sensorStorage.significantCodePerComponent.containsKey(fileKey)) { - return sensorStorage.significantCodePerComponent.get(fileKey) - .significantCodePerLine() - .get(line); - } - return null; - - } - - @CheckForNull - public static Integer maxOrNull(@Nullable Integer o1, @Nullable Integer o2) { - return o1 == null ? o2 : Math.max(o1, o2); - } - - @CheckForNull - public List<TokensLine> cpdTokens(String componentKey) { - DefaultCpdTokens defaultCpdTokens = sensorStorage.cpdTokensByComponent.get(componentKey); - return defaultCpdTokens != null ? defaultCpdTokens.getTokenLines() : null; - } - - @Override - public NewHighlighting newHighlighting() { - return new DefaultHighlighting(sensorStorage); - } - - @Override - public NewCoverage newCoverage() { - return new DefaultCoverage(sensorStorage); - } - - @Override - public NewCpdTokens newCpdTokens() { - return new DefaultCpdTokens(sensorStorage); - } - - @Override - public NewSymbolTable newSymbolTable() { - return new DefaultSymbolTable(sensorStorage); - } - - @Override - public NewAnalysisError newAnalysisError() { - return new DefaultAnalysisError(sensorStorage); - } - - /** - * Return list of syntax highlighting applied for a given position in a file. The result is a list because in theory you - * can apply several styles to the same range. - * - * @param componentKey Key of the file like 'myProjectKey:src/foo.php' - * @param line Line you want to query - * @param lineOffset Offset you want to query. - * @return List of styles applied to this position or empty list if there is no highlighting at this position. - */ - public List<TypeOfText> highlightingTypeAt(String componentKey, int line, int lineOffset) { - DefaultHighlighting syntaxHighlightingData = (DefaultHighlighting) sensorStorage.highlightingByComponent.get(componentKey); - if (syntaxHighlightingData == null) { - return Collections.emptyList(); - } - List<TypeOfText> result = new ArrayList<>(); - DefaultTextPointer location = new DefaultTextPointer(line, lineOffset); - for (SyntaxHighlightingRule sortedRule : syntaxHighlightingData.getSyntaxHighlightingRuleSet()) { - if (sortedRule.range().start().compareTo(location) <= 0 && sortedRule.range().end().compareTo(location) > 0) { - result.add(sortedRule.getTextType()); - } - } - return result; - } - - /** - * Return list of symbol references ranges for the symbol at a given position in a file. - * - * @param componentKey Key of the file like 'myProjectKey:src/foo.php' - * @param line Line you want to query - * @param lineOffset Offset you want to query. - * @return List of references for the symbol (potentially empty) or null if there is no symbol at this position. - */ - @CheckForNull - public Collection<TextRange> referencesForSymbolAt(String componentKey, int line, int lineOffset) { - DefaultSymbolTable symbolTable = sensorStorage.symbolsPerComponent.get(componentKey); - if (symbolTable == null) { - return null; - } - DefaultTextPointer location = new DefaultTextPointer(line, lineOffset); - for (Map.Entry<TextRange, Set<TextRange>> symbol : symbolTable.getReferencesBySymbol().entrySet()) { - if (symbol.getKey().start().compareTo(location) <= 0 && symbol.getKey().end().compareTo(location) > 0) { - return symbol.getValue(); - } - } - return null; - } - - @Override - public void addContextProperty(String key, String value) { - sensorStorage.storeProperty(key, value); - } - - /** - * @return an immutable map of the context properties defined with {@link SensorContext#addContextProperty(String, String)}. - * @since 6.1 - */ - public Map<String, String> getContextProperties() { - return unmodifiableMap(sensorStorage.contextProperties); - } - - @Override - public void markForPublishing(InputFile inputFile) { - DefaultInputFile file = (DefaultInputFile) inputFile; - file.setPublished(true); - } - - @Override - public NewSignificantCode newSignificantCode() { - return new DefaultSignificantCode(sensorStorage); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/SyntaxHighlightingRule.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/SyntaxHighlightingRule.java deleted file mode 100644 index cded69e4bf5..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/sensor/SyntaxHighlightingRule.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import org.apache.commons.lang.builder.ReflectionToStringBuilder; -import org.apache.commons.lang.builder.ToStringStyle; -import org.sonar.api.batch.fs.TextRange; -import org.sonar.api.batch.sensor.highlighting.TypeOfText; - -public class SyntaxHighlightingRule { - - private final TextRange range; - private final TypeOfText textType; - - private SyntaxHighlightingRule(TextRange range, TypeOfText textType) { - this.range = range; - this.textType = textType; - } - - public static SyntaxHighlightingRule create(TextRange range, TypeOfText textType) { - return new SyntaxHighlightingRule(range, textType); - } - - public TextRange range() { - return range; - } - - public TypeOfText getTextType() { - return textType; - } - - @Override - public String toString() { - return ReflectionToStringBuilder.toString(this, ToStringStyle.SIMPLE_STYLE); - } -} diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/source/ZeroCoverageSensor.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/source/ZeroCoverageSensor.java index 54bf590d758..20b3d3e5869 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/source/ZeroCoverageSensor.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/source/ZeroCoverageSensor.java @@ -28,7 +28,7 @@ import org.sonar.api.batch.sensor.SensorContext; import org.sonar.api.batch.sensor.SensorDescriptor; import org.sonar.api.batch.sensor.coverage.NewCoverage; import org.sonar.api.scanner.sensor.ProjectSensor; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputFile; import org.sonar.scanner.report.ReportPublisher; @Phase(name = Phase.Name.POST) diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/util/ScannerUtils.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/util/ScannerUtils.java deleted file mode 100644 index d22f0ea19eb..00000000000 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/util/ScannerUtils.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.util; - -import com.google.common.base.Strings; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import javax.annotation.Nullable; -import org.apache.commons.lang.StringUtils; - -public class ScannerUtils { - - private ScannerUtils() { - } - - /** - * Clean provided string to remove chars that are not valid as file name. - * @param projectKey e.g. my:file - */ - public static String cleanKeyForFilename(String projectKey) { - String cleanKey = StringUtils.deleteWhitespace(projectKey); - return StringUtils.replace(cleanKey, ":", "_"); - } - - public static String encodeForUrl(@Nullable String url) { - try { - return URLEncoder.encode(Strings.nullToEmpty(url), "UTF-8"); - - } catch (UnsupportedEncodingException e) { - throw new IllegalStateException("Encoding not supported", e); - } - } - - public static String describe(Object o) { - try { - if (o.getClass().getMethod("toString").getDeclaringClass() != Object.class) { - String str = o.toString(); - if (str != null) { - return str; - } - } - } catch (Exception e) { - // fallback - } - - return o.getClass().getName(); - } - - public static String pluralize(String str, int i) { - if (i == 1) { - return str; - } - return str + "s"; - } - -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/DefaultFileLinesContextTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/DefaultFileLinesContextTest.java index f6e59a75f9a..5f789670c6a 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/DefaultFileLinesContextTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/DefaultFileLinesContextTest.java @@ -27,10 +27,10 @@ import org.junit.rules.ExpectedException; import org.mockito.ArgumentCaptor; import org.sonar.api.batch.measure.MetricFinder; import org.sonar.api.batch.sensor.internal.SensorStorage; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.TestInputFileBuilder; +import org.sonar.api.impl.sensor.DefaultMeasure; import org.sonar.api.measures.CoreMetrics; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.TestInputFileBuilder; -import org.sonar.scanner.sensor.DefaultMeasure; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/ProjectInfoTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/ProjectInfoTest.java index a882ca0afcf..b43f101cdd1 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/ProjectInfoTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/ProjectInfoTest.java @@ -35,7 +35,7 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.sonar.api.CoreProperties; -import org.sonar.api.config.internal.MapSettings; +import org.sonar.api.impl.config.MapSettings; import org.sonar.api.utils.MessageException; import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/WsTestUtil.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/WsTestUtil.java index 29f806c9b0f..091d4899e8e 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/WsTestUtil.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/WsTestUtil.java @@ -24,7 +24,7 @@ import java.io.Reader; import javax.annotation.Nullable; import org.apache.commons.lang.StringUtils; import org.mockito.ArgumentMatcher; -import org.sonar.scanner.bootstrap.ScannerWsClient; +import org.sonar.scanner.bootstrap.DefaultScannerWsClient; import org.sonarqube.ws.client.WsRequest; import org.sonarqube.ws.client.WsResponse; @@ -35,25 +35,25 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class WsTestUtil { - public static void mockStream(ScannerWsClient mock, String path, InputStream is) { + public static void mockStream(DefaultScannerWsClient mock, String path, InputStream is) { WsResponse response = mock(WsResponse.class); when(response.contentStream()).thenReturn(is); when(mock.call(argThat(new RequestMatcher(path)))).thenReturn(response); } - public static void mockStream(ScannerWsClient mock, InputStream is) { + public static void mockStream(DefaultScannerWsClient mock, InputStream is) { WsResponse response = mock(WsResponse.class); when(response.contentStream()).thenReturn(is); when(mock.call(any(WsRequest.class))).thenReturn(response); } - public static void mockReader(ScannerWsClient mock, Reader reader) { + public static void mockReader(DefaultScannerWsClient mock, Reader reader) { WsResponse response = mock(WsResponse.class); when(response.contentReader()).thenReturn(reader); when(mock.call(any(WsRequest.class))).thenReturn(response); } - public static void mockReader(ScannerWsClient mock, String path, Reader reader, Reader... others) { + public static void mockReader(DefaultScannerWsClient mock, String path, Reader reader, Reader... others) { WsResponse response = mock(WsResponse.class); when(response.contentReader()).thenReturn(reader); WsResponse[] otherResponses = new WsResponse[others.length]; @@ -66,15 +66,15 @@ public class WsTestUtil { when(mock.call(argThat(new RequestMatcher(path)))).thenReturn(response, otherResponses); } - public static void mockException(ScannerWsClient mock, Exception e) { + public static void mockException(DefaultScannerWsClient mock, Exception e) { when(mock.call(any(WsRequest.class))).thenThrow(e); } - public static void mockException(ScannerWsClient mock, String path, Exception e) { + public static void mockException(DefaultScannerWsClient mock, String path, Exception e) { when(mock.call(argThat(new RequestMatcher(path)))).thenThrow(e); } - public static void verifyCall(ScannerWsClient mock, String path) { + public static void verifyCall(DefaultScannerWsClient mock, String path) { verify(mock).call(argThat(new RequestMatcher(path))); } diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/analysis/AnalysisTempFolderProviderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/analysis/AnalysisTempFolderProviderTest.java index d625da5f8df..620e3f703c1 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/analysis/AnalysisTempFolderProviderTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/analysis/AnalysisTempFolderProviderTest.java @@ -25,7 +25,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.sonar.api.utils.TempFolder; -import org.sonar.scanner.fs.DefaultInputProject; +import org.sonar.api.impl.fs.DefaultInputProject; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ScannerWsClientTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/DefaultScannerWsClientTest.java index abe99ed2c15..bbc55bb0758 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ScannerWsClientTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/DefaultScannerWsClientTest.java @@ -40,7 +40,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public class ScannerWsClientTest { +public class DefaultScannerWsClientTest { @Rule public LogTester logTester = new LogTester(); @@ -57,7 +57,7 @@ public class ScannerWsClientTest { when(wsClient.wsConnector().call(request)).thenReturn(response); logTester.setLevel(LoggerLevel.DEBUG); - ScannerWsClient underTest = new ScannerWsClient(wsClient, false, new GlobalAnalysisMode( + DefaultScannerWsClient underTest = new DefaultScannerWsClient(wsClient, false, new GlobalAnalysisMode( new RawScannerProperties(Collections.emptyMap()))); WsResponse result = underTest.call(request); @@ -74,19 +74,19 @@ public class ScannerWsClientTest { @Test public void create_error_msg_from_json() { String content = "{\"errors\":[{\"msg\":\"missing scan permission\"}, {\"msg\":\"missing another permission\"}]}"; - assertThat(ScannerWsClient.createErrorMessage(new HttpException("url", 400, content))).isEqualTo("missing scan permission, missing another permission"); + assertThat(DefaultScannerWsClient.createErrorMessage(new HttpException("url", 400, content))).isEqualTo("missing scan permission, missing another permission"); } @Test public void create_error_msg_from_html() { String content = "<!DOCTYPE html><html>something</html>"; - assertThat(ScannerWsClient.createErrorMessage(new HttpException("url", 400, content))).isEqualTo("HTTP code 400"); + assertThat(DefaultScannerWsClient.createErrorMessage(new HttpException("url", 400, content))).isEqualTo("HTTP code 400"); } @Test public void create_error_msg_from_long_content() { String content = StringUtils.repeat("mystring", 1000); - assertThat(ScannerWsClient.createErrorMessage(new HttpException("url", 400, content))).hasSize(15 + 128); + assertThat(DefaultScannerWsClient.createErrorMessage(new HttpException("url", 400, content))).hasSize(15 + 128); } @Test @@ -99,7 +99,7 @@ public class ScannerWsClientTest { WsResponse response = newResponse().setCode(401); when(wsClient.wsConnector().call(request)).thenReturn(response); - new ScannerWsClient(wsClient, false, new GlobalAnalysisMode(new RawScannerProperties(Collections.emptyMap()))).call(request); + new DefaultScannerWsClient(wsClient, false, new GlobalAnalysisMode(new RawScannerProperties(Collections.emptyMap()))).call(request); } @Test @@ -111,7 +111,7 @@ public class ScannerWsClientTest { WsResponse response = newResponse().setCode(401); when(wsClient.wsConnector().call(request)).thenReturn(response); - new ScannerWsClient(wsClient, /* credentials are configured */true, new GlobalAnalysisMode(new RawScannerProperties(Collections.emptyMap()))).call(request); + new DefaultScannerWsClient(wsClient, /* credentials are configured */true, new GlobalAnalysisMode(new RawScannerProperties(Collections.emptyMap()))).call(request); } @Test @@ -124,7 +124,7 @@ public class ScannerWsClientTest { .setCode(403); when(wsClient.wsConnector().call(request)).thenReturn(response); - new ScannerWsClient(wsClient, true, new GlobalAnalysisMode(new RawScannerProperties(Collections.emptyMap()))).call(request); + new DefaultScannerWsClient(wsClient, true, new GlobalAnalysisMode(new RawScannerProperties(Collections.emptyMap()))).call(request); } @Test @@ -138,7 +138,7 @@ public class ScannerWsClientTest { .setContent("{\"errors\":[{\"msg\":\"Boo! bad request! bad!\"}]}"); when(wsClient.wsConnector().call(request)).thenReturn(response); - new ScannerWsClient(wsClient, true, new GlobalAnalysisMode(new RawScannerProperties(Collections.emptyMap()))).call(request); + new DefaultScannerWsClient(wsClient, true, new GlobalAnalysisMode(new RawScannerProperties(Collections.emptyMap()))).call(request); } private MockWsResponse newResponse() { diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ExtensionInstallerTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ExtensionInstallerTest.java index d060367750d..17e4b72f4b0 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ExtensionInstallerTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ExtensionInstallerTest.java @@ -26,7 +26,7 @@ import org.sonar.api.ExtensionProvider; import org.sonar.api.Plugin; import org.sonar.api.SonarRuntime; import org.sonar.api.batch.ScannerSide; -import org.sonar.api.config.internal.MapSettings; +import org.sonar.api.impl.config.MapSettings; import org.sonar.core.platform.ComponentContainer; import org.sonar.core.platform.PluginInfo; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ModuleSensorExtensionDictionnaryTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ModuleSensorExtensionDictionnaryTest.java index 2c4ed265b27..68070e636b5 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ModuleSensorExtensionDictionnaryTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ModuleSensorExtensionDictionnaryTest.java @@ -33,8 +33,8 @@ import org.sonar.api.batch.ScannerSide; import org.sonar.api.batch.sensor.Sensor; import org.sonar.api.batch.sensor.SensorContext; import org.sonar.api.batch.sensor.SensorDescriptor; +import org.sonar.api.impl.sensor.DefaultSensorDescriptor; import org.sonar.core.platform.ComponentContainer; -import org.sonar.scanner.sensor.DefaultSensorDescriptor; import org.sonar.scanner.sensor.ModuleSensorContext; import org.sonar.scanner.sensor.ModuleSensorExtensionDictionnary; import org.sonar.scanner.sensor.ModuleSensorOptimizer; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/PluginFilesTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/PluginFilesTest.java index 9a7ebb0e127..004528a98eb 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/PluginFilesTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/PluginFilesTest.java @@ -50,7 +50,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; -import org.sonar.api.config.internal.MapSettings; +import org.sonar.api.impl.config.MapSettings; import org.sonar.scanner.bootstrap.ScannerPluginInstaller.InstalledPlugin; import org.sonarqube.ws.client.HttpConnector; import org.sonarqube.ws.client.WsClientFactories; @@ -74,7 +74,7 @@ public class PluginFilesTest { public void setUp() throws Exception { HttpConnector connector = HttpConnector.newBuilder().url(server.url("/").toString()).build(); GlobalAnalysisMode analysisMode = new GlobalAnalysisMode(new RawScannerProperties(Collections.emptyMap())); - ScannerWsClient wsClient = new ScannerWsClient(WsClientFactories.getDefault().newClient(connector), false, analysisMode); + DefaultScannerWsClient wsClient = new DefaultScannerWsClient(WsClientFactories.getDefault().newClient(connector), false, analysisMode); userHome = temp.newFolder(); MapSettings settings = new MapSettings(); diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/PostJobExtensionDictionnaryTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/PostJobExtensionDictionnaryTest.java index ed35ee1943d..c81893378b8 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/PostJobExtensionDictionnaryTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/PostJobExtensionDictionnaryTest.java @@ -25,7 +25,7 @@ import org.sonar.api.batch.Phase; import org.sonar.api.batch.postjob.PostJob; import org.sonar.api.batch.postjob.PostJobContext; import org.sonar.api.batch.postjob.PostJobDescriptor; -import org.sonar.scanner.postjob.DefaultPostJobDescriptor; +import org.sonar.api.impl.sensor.DefaultPostJobDescriptor; import org.sonar.api.batch.sensor.Sensor; import org.sonar.api.batch.sensor.SensorContext; import org.sonar.api.batch.sensor.SensorDescriptor; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ScannerPluginInstallerTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ScannerPluginInstallerTest.java index fe6720aca89..edceff19a1b 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ScannerPluginInstallerTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ScannerPluginInstallerTest.java @@ -48,7 +48,7 @@ public class ScannerPluginInstallerTest { public ExpectedException expectedException = ExpectedException.none(); private PluginFiles pluginFiles = mock(PluginFiles.class); - private ScannerWsClient wsClient = mock(ScannerWsClient.class); + private DefaultScannerWsClient wsClient = mock(DefaultScannerWsClient.class); private ScannerPluginInstaller underTest = new ScannerPluginInstaller(pluginFiles, wsClient); @Test diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ScannerWsClientProviderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ScannerWsClientProviderTest.java index 5122d6f23e1..6f462beeaa7 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ScannerWsClientProviderTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ScannerWsClientProviderTest.java @@ -39,7 +39,7 @@ public class ScannerWsClientProviderTest { public void provide_client_with_default_settings() { RawScannerProperties settings = new RawScannerProperties(new HashMap<>()); - ScannerWsClient client = underTest.provide(settings, env, new GlobalAnalysisMode(new RawScannerProperties(Collections.emptyMap())), mock(System2.class)); + DefaultScannerWsClient client = underTest.provide(settings, env, new GlobalAnalysisMode(new RawScannerProperties(Collections.emptyMap())), mock(System2.class)); assertThat(client).isNotNull(); assertThat(client.baseUrl()).isEqualTo("http://localhost:9000/"); @@ -59,7 +59,7 @@ public class ScannerWsClientProviderTest { props.put("sonar.ws.timeout", "42"); RawScannerProperties settings = new RawScannerProperties(props); - ScannerWsClient client = underTest.provide(settings, env, new GlobalAnalysisMode(new RawScannerProperties(Collections.emptyMap())), mock(System2.class)); + DefaultScannerWsClient client = underTest.provide(settings, env, new GlobalAnalysisMode(new RawScannerProperties(Collections.emptyMap())), mock(System2.class)); assertThat(client).isNotNull(); HttpConnector httpConnector = (HttpConnector) client.wsConnector(); @@ -72,8 +72,8 @@ public class ScannerWsClientProviderTest { System2 system = mock(System2.class); RawScannerProperties settings = new RawScannerProperties(new HashMap<>()); - ScannerWsClient first = underTest.provide(settings, env, new GlobalAnalysisMode(new RawScannerProperties(Collections.emptyMap())), system); - ScannerWsClient second = underTest.provide(settings, env, new GlobalAnalysisMode(new RawScannerProperties(Collections.emptyMap())), system); + DefaultScannerWsClient first = underTest.provide(settings, env, new GlobalAnalysisMode(new RawScannerProperties(Collections.emptyMap())), system); + DefaultScannerWsClient second = underTest.provide(settings, env, new GlobalAnalysisMode(new RawScannerProperties(Collections.emptyMap())), system); assertThat(first).isSameAs(second); } } diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/ci/CiConfigurationProviderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/ci/CiConfigurationProviderTest.java index 57e1aa0efd4..b372dd2bc97 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/ci/CiConfigurationProviderTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/ci/CiConfigurationProviderTest.java @@ -20,7 +20,7 @@ package org.sonar.scanner.ci; import org.junit.Test; -import org.sonar.api.config.internal.MapSettings; +import org.sonar.api.impl.config.MapSettings; import org.sonar.api.utils.MessageException; import static org.assertj.core.api.Assertions.assertThat; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/cpd/CpdExecutorTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/cpd/CpdExecutorTest.java index a649c5e9f24..9767f60dedf 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/cpd/CpdExecutorTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/cpd/CpdExecutorTest.java @@ -44,9 +44,9 @@ import org.sonar.duplications.block.ByteArray; import org.sonar.duplications.index.CloneGroup; import org.sonar.duplications.index.ClonePart; import org.sonar.scanner.cpd.index.SonarCpdBlockIndex; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.DefaultInputProject; -import org.sonar.scanner.fs.TestInputFileBuilder; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputProject; +import org.sonar.api.impl.fs.TestInputFileBuilder; import org.sonar.scanner.protocol.output.ScannerReport.Duplicate; import org.sonar.scanner.protocol.output.ScannerReport.Duplication; import org.sonar.scanner.protocol.output.ScannerReportReader; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/cpd/CpdSettingsTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/cpd/CpdSettingsTest.java index 2e3e6d2898d..80a8e4b61f9 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/cpd/CpdSettingsTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/cpd/CpdSettingsTest.java @@ -23,7 +23,7 @@ import java.util.Optional; import org.junit.Before; import org.junit.Test; import org.sonar.api.config.Configuration; -import org.sonar.scanner.fs.DefaultInputProject; +import org.sonar.api.impl.fs.DefaultInputProject; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.anyString; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/cpd/JavaCpdBlockIndexerSensorTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/cpd/JavaCpdBlockIndexerSensorTest.java index f62bb729def..3b567a3846b 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/cpd/JavaCpdBlockIndexerSensorTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/cpd/JavaCpdBlockIndexerSensorTest.java @@ -34,9 +34,9 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.sonar.duplications.block.Block; import org.sonar.scanner.cpd.index.SonarCpdBlockIndex; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.TestInputFileBuilder; -import org.sonar.scanner.sensor.SensorContextTester; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.TestInputFileBuilder; +import org.sonar.api.impl.sensor.SensorContextTester; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.eq; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/externalissue/ExternalIssueImporterTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/externalissue/ExternalIssueImporterTest.java index 3eaeb9997ad..3659faec62f 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/externalissue/ExternalIssueImporterTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/externalissue/ExternalIssueImporterTest.java @@ -31,9 +31,9 @@ import org.sonar.api.batch.rule.Severity; import org.sonar.api.batch.sensor.issue.ExternalIssue; import org.sonar.api.utils.log.LogTester; import org.sonar.api.utils.log.LoggerLevel; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.TestInputFileBuilder; -import org.sonar.scanner.sensor.SensorContextTester; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.TestInputFileBuilder; +import org.sonar.api.impl.sensor.SensorContextTester; import static java.nio.charset.StandardCharsets.UTF_8; import static org.apache.commons.lang.ObjectUtils.defaultIfNull; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/DefaultFileSystemTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/DefaultFileSystemTest.java deleted file mode 100644 index 74a43db65f1..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/DefaultFileSystemTest.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs; - -import java.io.File; -import java.nio.charset.Charset; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.rules.TemporaryFolder; - -import static org.assertj.core.api.Assertions.assertThat; - -public class DefaultFileSystemTest { - - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - - @Rule - public ExpectedException thrown = ExpectedException.none(); - - private DefaultFileSystem fs; - - private File basedir; - - @Before - public void prepare() throws Exception { - basedir = temp.newFolder(); - fs = new DefaultFileSystem(basedir.toPath()); - } - - @Test - public void test_directories() throws Exception { - assertThat(fs.baseDir()).isAbsolute().isDirectory().exists(); - assertThat(fs.baseDir().getCanonicalPath()).isEqualTo(basedir.getCanonicalPath()); - - File workdir = temp.newFolder(); - fs.setWorkDir(workdir.toPath()); - assertThat(fs.workDir()).isAbsolute().isDirectory().exists(); - assertThat(fs.workDir().getCanonicalPath()).isEqualTo(workdir.getCanonicalPath()); - } - - @Test - public void test_encoding() throws Exception { - fs.setEncoding(Charset.forName("ISO-8859-1")); - assertThat(fs.encoding()).isEqualTo(Charset.forName("ISO-8859-1")); - } - - @Test - public void add_languages() { - assertThat(fs.languages()).isEmpty(); - - fs.add(new TestInputFileBuilder("foo", "src/Foo.php").setLanguage("php").build()); - fs.add(new TestInputFileBuilder("foo", "src/Bar.java").setLanguage("java").build()); - - assertThat(fs.languages()).containsOnly("java", "php"); - } - - @Test - public void files() { - assertThat(fs.inputFiles(fs.predicates().all())).isEmpty(); - - fs.add(new TestInputFileBuilder("foo", "src/Foo.php").setLanguage("php").build()); - fs.add(new TestInputFileBuilder("foo", "src/Bar.java").setLanguage("java").build()); - fs.add(new TestInputFileBuilder("foo", "src/Baz.java").setLanguage("java").build()); - - // no language - fs.add(new TestInputFileBuilder("foo", "src/readme.txt").build()); - - assertThat(fs.inputFile(fs.predicates().hasRelativePath("src/Bar.java"))).isNotNull(); - assertThat(fs.inputFile(fs.predicates().hasRelativePath("does/not/exist"))).isNull(); - - assertThat(fs.inputFile(fs.predicates().hasAbsolutePath(new File(basedir, "src/Bar.java").getAbsolutePath()))).isNotNull(); - assertThat(fs.inputFile(fs.predicates().hasAbsolutePath(new File(basedir, "does/not/exist").getAbsolutePath()))).isNull(); - assertThat(fs.inputFile(fs.predicates().hasAbsolutePath(new File(basedir, "../src/Bar.java").getAbsolutePath()))).isNull(); - - assertThat(fs.inputFile(fs.predicates().hasURI(new File(basedir, "src/Bar.java").toURI()))).isNotNull(); - assertThat(fs.inputFile(fs.predicates().hasURI(new File(basedir, "does/not/exist").toURI()))).isNull(); - assertThat(fs.inputFile(fs.predicates().hasURI(new File(basedir, "../src/Bar.java").toURI()))).isNull(); - - assertThat(fs.files(fs.predicates().all())).hasSize(4); - assertThat(fs.files(fs.predicates().hasLanguage("java"))).hasSize(2); - assertThat(fs.files(fs.predicates().hasLanguage("cobol"))).isEmpty(); - - assertThat(fs.hasFiles(fs.predicates().all())).isTrue(); - assertThat(fs.hasFiles(fs.predicates().hasLanguage("java"))).isTrue(); - assertThat(fs.hasFiles(fs.predicates().hasLanguage("cobol"))).isFalse(); - - assertThat(fs.inputFiles(fs.predicates().all())).hasSize(4); - assertThat(fs.inputFiles(fs.predicates().hasLanguage("php"))).hasSize(1); - assertThat(fs.inputFiles(fs.predicates().hasLanguage("java"))).hasSize(2); - assertThat(fs.inputFiles(fs.predicates().hasLanguage("cobol"))).isEmpty(); - - assertThat(fs.languages()).containsOnly("java", "php"); - } - - @Test - public void input_file_returns_null_if_file_not_found() { - assertThat(fs.inputFile(fs.predicates().hasRelativePath("src/Bar.java"))).isNull(); - assertThat(fs.inputFile(fs.predicates().hasLanguage("cobol"))).isNull(); - } - - @Test - public void input_file_fails_if_too_many_results() { - thrown.expect(IllegalArgumentException.class); - thrown.expectMessage("expected one element"); - - fs.add(new TestInputFileBuilder("foo", "src/Bar.java").setLanguage("java").build()); - fs.add(new TestInputFileBuilder("foo", "src/Baz.java").setLanguage("java").build()); - - fs.inputFile(fs.predicates().all()); - } - - @Test - public void input_file_supports_non_indexed_predicates() { - fs.add(new TestInputFileBuilder("foo", "src/Bar.java").setLanguage("java").build()); - - // it would fail if more than one java file - assertThat(fs.inputFile(fs.predicates().hasLanguage("java"))).isNotNull(); - } -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/DefaultInputDirTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/DefaultInputDirTest.java deleted file mode 100644 index 1679a8df405..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/DefaultInputDirTest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs; - -import java.io.File; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; - -import static org.assertj.core.api.Assertions.assertThat; - -public class DefaultInputDirTest { - - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - - @Test - public void test() throws Exception { - File baseDir = temp.newFolder(); - DefaultInputDir inputDir = new DefaultInputDir("ABCDE", "src") - .setModuleBaseDir(baseDir.toPath()); - - assertThat(inputDir.key()).isEqualTo("ABCDE:src"); - assertThat(inputDir.file().getAbsolutePath()).isEqualTo(new File(baseDir, "src").getAbsolutePath()); - assertThat(inputDir.relativePath()).isEqualTo("src"); - assertThat(new File(inputDir.relativePath())).isRelative(); - assertThat(inputDir.absolutePath()).endsWith("src"); - assertThat(new File(inputDir.absolutePath())).isAbsolute(); - } - - @Test - public void testEqualsAndHashCode() throws Exception { - DefaultInputDir inputDir1 = new DefaultInputDir("ABCDE", "src"); - - DefaultInputDir inputDir2 = new DefaultInputDir("ABCDE", "src"); - - assertThat(inputDir1.equals(inputDir1)).isTrue(); - assertThat(inputDir1.equals(inputDir2)).isTrue(); - assertThat(inputDir1.equals("foo")).isFalse(); - - assertThat(inputDir1.hashCode()).isEqualTo(63545559); - - assertThat(inputDir1.toString()).contains("[moduleKey=ABCDE, relative=src, basedir=null"); - - } - -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/DefaultInputFileTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/DefaultInputFileTest.java deleted file mode 100644 index 6673977bfe4..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/DefaultInputFileTest.java +++ /dev/null @@ -1,315 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.io.StringReader; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardOpenOption; -import java.util.stream.Collectors; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.TextRange; -import org.sonar.api.batch.fs.internal.Metadata; -import org.sonar.api.batch.fs.internal.SensorStrategy; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.mock; - -public class DefaultInputFileTest { - - private static final String PROJECT_RELATIVE_PATH = "module1/src/Foo.php"; - private static final String MODULE_RELATIVE_PATH = "src/Foo.php"; - - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - - private DefaultIndexedFile indexedFile; - - private Path baseDir; - private SensorStrategy sensorStrategy; - - @Before - public void prepare() throws IOException { - baseDir = temp.newFolder().toPath(); - sensorStrategy = new SensorStrategy(); - indexedFile = new DefaultIndexedFile(baseDir.resolve(PROJECT_RELATIVE_PATH), "ABCDE", PROJECT_RELATIVE_PATH, MODULE_RELATIVE_PATH, InputFile.Type.TEST, "php", 0, - sensorStrategy); - } - - @Test - public void test() throws Exception { - - Metadata metadata = new Metadata(42, 42, "", new int[0], new int[0], 10); - DefaultInputFile inputFile = new DefaultInputFile(indexedFile, (f) -> f.setMetadata(metadata)) - .setStatus(InputFile.Status.ADDED) - .setCharset(StandardCharsets.ISO_8859_1); - - assertThat(inputFile.absolutePath()).endsWith("Foo.php"); - assertThat(inputFile.filename()).isEqualTo("Foo.php"); - assertThat(inputFile.uri()).hasPath(baseDir.resolve(PROJECT_RELATIVE_PATH).toUri().getPath()); - assertThat(new File(inputFile.absolutePath())).isAbsolute(); - assertThat(inputFile.language()).isEqualTo("php"); - assertThat(inputFile.status()).isEqualTo(InputFile.Status.ADDED); - assertThat(inputFile.type()).isEqualTo(InputFile.Type.TEST); - assertThat(inputFile.lines()).isEqualTo(42); - assertThat(inputFile.charset()).isEqualTo(StandardCharsets.ISO_8859_1); - - assertThat(inputFile.getModuleRelativePath()).isEqualTo(MODULE_RELATIVE_PATH); - assertThat(inputFile.getProjectRelativePath()).isEqualTo(PROJECT_RELATIVE_PATH); - - sensorStrategy.setGlobal(false); - assertThat(inputFile.relativePath()).isEqualTo(MODULE_RELATIVE_PATH); - assertThat(new File(inputFile.relativePath())).isRelative(); - sensorStrategy.setGlobal(true); - assertThat(inputFile.relativePath()).isEqualTo(PROJECT_RELATIVE_PATH); - assertThat(new File(inputFile.relativePath())).isRelative(); - } - - @Test - public void test_content() throws IOException { - Path testFile = baseDir.resolve(PROJECT_RELATIVE_PATH); - Files.createDirectories(testFile.getParent()); - String content = "test é string"; - Files.write(testFile, content.getBytes(StandardCharsets.ISO_8859_1)); - - assertThat(Files.readAllLines(testFile, StandardCharsets.ISO_8859_1).get(0)).hasSize(content.length()); - - Metadata metadata = new Metadata(42, 30, "", new int[0], new int[0], 10); - - DefaultInputFile inputFile = new DefaultInputFile(indexedFile, f -> f.setMetadata(metadata)) - .setStatus(InputFile.Status.ADDED) - .setCharset(StandardCharsets.ISO_8859_1); - - assertThat(inputFile.contents()).isEqualTo(content); - try (InputStream inputStream = inputFile.inputStream()) { - String result = new BufferedReader(new InputStreamReader(inputStream, inputFile.charset())).lines().collect(Collectors.joining()); - assertThat(result).isEqualTo(content); - } - - } - - @Test - public void test_content_exclude_bom() throws IOException { - Path testFile = baseDir.resolve(PROJECT_RELATIVE_PATH); - Files.createDirectories(testFile.getParent()); - try (BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(testFile.toFile()), StandardCharsets.UTF_8))) { - out.write('\ufeff'); - } - String content = "test é string €"; - Files.write(testFile, content.getBytes(StandardCharsets.UTF_8), StandardOpenOption.APPEND); - - assertThat(Files.readAllLines(testFile, StandardCharsets.UTF_8).get(0)).hasSize(content.length() + 1); - - Metadata metadata = new Metadata(42, 30, "", new int[0], new int[0], 10); - - DefaultInputFile inputFile = new DefaultInputFile(indexedFile, f -> f.setMetadata(metadata)) - .setStatus(InputFile.Status.ADDED) - .setCharset(StandardCharsets.UTF_8); - - assertThat(inputFile.contents()).isEqualTo(content); - try (InputStream inputStream = inputFile.inputStream()) { - String result = new BufferedReader(new InputStreamReader(inputStream, inputFile.charset())).lines().collect(Collectors.joining()); - assertThat(result).isEqualTo(content); - } - - } - - @Test - public void test_equals_and_hashcode() throws Exception { - DefaultInputFile f1 = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), MODULE_RELATIVE_PATH, null), (f) -> mock(Metadata.class)); - DefaultInputFile f1a = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), MODULE_RELATIVE_PATH, null), (f) -> mock(Metadata.class)); - DefaultInputFile f2 = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), "src/Bar.php", null), (f) -> mock(Metadata.class)); - - assertThat(f1).isEqualTo(f1); - assertThat(f1).isEqualTo(f1a); - assertThat(f1).isNotEqualTo(f2); - assertThat(f1.equals("foo")).isFalse(); - assertThat(f1.equals(null)).isFalse(); - - assertThat(f1.hashCode()).isEqualTo(f1.hashCode()); - assertThat(f1.hashCode()).isEqualTo(f1a.hashCode()); - } - - @Test - public void test_toString() throws Exception { - DefaultInputFile file = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), MODULE_RELATIVE_PATH, null), (f) -> mock(Metadata.class)); - assertThat(file.toString()).isEqualTo(MODULE_RELATIVE_PATH); - } - - @Test - public void checkValidPointer() { - Metadata metadata = new Metadata(2, 2, "", new int[] {0, 10}, new int[] {9, 15}, 16); - DefaultInputFile file = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), MODULE_RELATIVE_PATH, null), f -> f.setMetadata(metadata)); - assertThat(file.newPointer(1, 0).line()).isEqualTo(1); - assertThat(file.newPointer(1, 0).lineOffset()).isEqualTo(0); - // Don't fail - file.newPointer(1, 9); - file.newPointer(2, 0); - file.newPointer(2, 5); - - try { - file.newPointer(0, 1); - fail(); - } catch (Exception e) { - assertThat(e).hasMessage("0 is not a valid line for a file"); - } - try { - file.newPointer(3, 1); - fail(); - } catch (Exception e) { - assertThat(e).hasMessage("3 is not a valid line for pointer. File src/Foo.php has 2 line(s)"); - } - try { - file.newPointer(1, -1); - fail(); - } catch (Exception e) { - assertThat(e).hasMessage("-1 is not a valid line offset for a file"); - } - try { - file.newPointer(1, 10); - fail(); - } catch (Exception e) { - assertThat(e).hasMessage("10 is not a valid line offset for pointer. File src/Foo.php has 9 character(s) at line 1"); - } - } - - @Test - public void checkValidPointerUsingGlobalOffset() { - Metadata metadata = new Metadata(2, 2, "", new int[] {0, 10}, new int[] {8, 15}, 16); - DefaultInputFile file = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), MODULE_RELATIVE_PATH, null), f -> f.setMetadata(metadata)); - assertThat(file.newPointer(0).line()).isEqualTo(1); - assertThat(file.newPointer(0).lineOffset()).isEqualTo(0); - - assertThat(file.newPointer(9).line()).isEqualTo(1); - // Ignore eol characters - assertThat(file.newPointer(9).lineOffset()).isEqualTo(8); - - assertThat(file.newPointer(10).line()).isEqualTo(2); - assertThat(file.newPointer(10).lineOffset()).isEqualTo(0); - - assertThat(file.newPointer(15).line()).isEqualTo(2); - assertThat(file.newPointer(15).lineOffset()).isEqualTo(5); - - assertThat(file.newPointer(16).line()).isEqualTo(2); - // Ignore eol characters - assertThat(file.newPointer(16).lineOffset()).isEqualTo(5); - - try { - file.newPointer(-1); - fail(); - } catch (Exception e) { - assertThat(e).hasMessage("-1 is not a valid offset for a file"); - } - - try { - file.newPointer(17); - fail(); - } catch (Exception e) { - assertThat(e).hasMessage("17 is not a valid offset for file src/Foo.php. Max offset is 16"); - } - } - - @Test - public void checkValidRange() { - Metadata metadata = new FileMetadata().readMetadata(new StringReader("bla bla a\nabcde")); - DefaultInputFile file = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), MODULE_RELATIVE_PATH, null), f -> f.setMetadata(metadata)); - - assertThat(file.newRange(file.newPointer(1, 0), file.newPointer(2, 1)).start().line()).isEqualTo(1); - // Don't fail - file.newRange(file.newPointer(1, 0), file.newPointer(1, 1)); - file.newRange(file.newPointer(1, 0), file.newPointer(1, 9)); - file.newRange(file.newPointer(1, 0), file.newPointer(2, 0)); - assertThat(file.newRange(file.newPointer(1, 0), file.newPointer(2, 5))).isEqualTo(file.newRange(0, 15)); - - try { - file.newRange(file.newPointer(1, 0), file.newPointer(1, 0)); - fail(); - } catch (Exception e) { - assertThat(e).hasMessage("Start pointer [line=1, lineOffset=0] should be before end pointer [line=1, lineOffset=0]"); - } - try { - file.newRange(file.newPointer(1, 0), file.newPointer(1, 10)); - fail(); - } catch (Exception e) { - assertThat(e).hasMessage("10 is not a valid line offset for pointer. File src/Foo.php has 9 character(s) at line 1"); - } - } - - @Test - public void selectLine() { - Metadata metadata = new FileMetadata().readMetadata(new StringReader("bla bla a\nabcde\n\nabc")); - DefaultInputFile file = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), MODULE_RELATIVE_PATH, null), f -> f.setMetadata(metadata)); - - assertThat(file.selectLine(1).start().line()).isEqualTo(1); - assertThat(file.selectLine(1).start().lineOffset()).isEqualTo(0); - assertThat(file.selectLine(1).end().line()).isEqualTo(1); - assertThat(file.selectLine(1).end().lineOffset()).isEqualTo(9); - - // Don't fail when selecting empty line - assertThat(file.selectLine(3).start().line()).isEqualTo(3); - assertThat(file.selectLine(3).start().lineOffset()).isEqualTo(0); - assertThat(file.selectLine(3).end().line()).isEqualTo(3); - assertThat(file.selectLine(3).end().lineOffset()).isEqualTo(0); - - try { - file.selectLine(5); - fail(); - } catch (Exception e) { - assertThat(e).hasMessage("5 is not a valid line for pointer. File src/Foo.php has 4 line(s)"); - } - } - - @Test - public void checkValidRangeUsingGlobalOffset() { - Metadata metadata = new Metadata(2, 2, "", new int[] {0, 10}, new int[] {9, 15}, 16); - DefaultInputFile file = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), MODULE_RELATIVE_PATH, null), f -> f.setMetadata(metadata)); - TextRange newRange = file.newRange(10, 13); - assertThat(newRange.start().line()).isEqualTo(2); - assertThat(newRange.start().lineOffset()).isEqualTo(0); - assertThat(newRange.end().line()).isEqualTo(2); - assertThat(newRange.end().lineOffset()).isEqualTo(3); - } - - @Test - public void testRangeOverlap() { - Metadata metadata = new Metadata(2, 2, "", new int[] {0, 10}, new int[] {9, 15}, 16); - DefaultInputFile file = new DefaultInputFile(new DefaultIndexedFile("ABCDE", Paths.get("module"), MODULE_RELATIVE_PATH, null), f -> f.setMetadata(metadata)); - // Don't fail - assertThat(file.newRange(file.newPointer(1, 0), file.newPointer(1, 1)).overlap(file.newRange(file.newPointer(1, 0), file.newPointer(1, 1)))).isTrue(); - assertThat(file.newRange(file.newPointer(1, 0), file.newPointer(1, 1)).overlap(file.newRange(file.newPointer(1, 0), file.newPointer(1, 2)))).isTrue(); - assertThat(file.newRange(file.newPointer(1, 0), file.newPointer(1, 1)).overlap(file.newRange(file.newPointer(1, 1), file.newPointer(1, 2)))).isFalse(); - assertThat(file.newRange(file.newPointer(1, 2), file.newPointer(1, 3)).overlap(file.newRange(file.newPointer(1, 0), file.newPointer(1, 2)))).isFalse(); - } -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/DefaultInputModuleTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/DefaultInputModuleTest.java deleted file mode 100644 index 02570d36735..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/DefaultInputModuleTest.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.Charset; -import java.nio.file.Files; -import java.nio.file.Path; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import org.sonar.api.batch.bootstrap.ProjectDefinition; - -import static org.assertj.core.api.Assertions.assertThat; - -public class DefaultInputModuleTest { - - private static final String FILE_1 = "file1"; - private static final String TEST_1 = "test1"; - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - - @Test - public void check_getters() throws IOException { - ProjectDefinition def = ProjectDefinition.create(); - def.setKey("moduleKey"); - File baseDir = temp.newFolder(); - Path src = baseDir.toPath().resolve(FILE_1); - Files.createFile(src); - Path test = baseDir.toPath().resolve(TEST_1); - Files.createFile(test); - def.setBaseDir(baseDir); - File workDir = temp.newFolder(); - def.setWorkDir(workDir); - def.setSources(FILE_1); - def.setTests(TEST_1); - DefaultInputModule module = new DefaultInputModule(def); - - assertThat(module.key()).isEqualTo("moduleKey"); - assertThat(module.definition()).isEqualTo(def); - assertThat(module.getBranch()).isNull(); - assertThat(module.getBaseDir()).isEqualTo(baseDir.toPath()); - assertThat(module.getKeyWithBranch()).isEqualTo("moduleKey"); - assertThat(module.getWorkDir()).isEqualTo(workDir.toPath()); - assertThat(module.getEncoding()).isEqualTo(Charset.defaultCharset()); - assertThat(module.getSourceDirsOrFiles().get()).containsExactlyInAnyOrder(src); - assertThat(module.getTestDirsOrFiles().get()).containsExactlyInAnyOrder(test); - assertThat(module.getEncoding()).isEqualTo(Charset.defaultCharset()); - - assertThat(module.isFile()).isFalse(); - } - - @Test - public void no_sources() throws IOException { - ProjectDefinition def = ProjectDefinition.create(); - def.setKey("moduleKey"); - File baseDir = temp.newFolder(); - Path src = baseDir.toPath().resolve(FILE_1); - Files.createFile(src); - Path test = baseDir.toPath().resolve(TEST_1); - Files.createFile(test); - def.setBaseDir(baseDir); - File workDir = temp.newFolder(); - def.setWorkDir(workDir); - DefaultInputModule module = new DefaultInputModule(def); - - assertThat(module.key()).isEqualTo("moduleKey"); - assertThat(module.definition()).isEqualTo(def); - assertThat(module.getBranch()).isNull(); - assertThat(module.getBaseDir()).isEqualTo(baseDir.toPath()); - assertThat(module.getKeyWithBranch()).isEqualTo("moduleKey"); - assertThat(module.getWorkDir()).isEqualTo(workDir.toPath()); - assertThat(module.getEncoding()).isEqualTo(Charset.defaultCharset()); - assertThat(module.getSourceDirsOrFiles()).isNotPresent(); - assertThat(module.getTestDirsOrFiles()).isNotPresent(); - assertThat(module.getEncoding()).isEqualTo(Charset.defaultCharset()); - - assertThat(module.isFile()).isFalse(); - } - - @Test - public void working_directory_should_be_hidden() throws IOException { - ProjectDefinition def = ProjectDefinition.create(); - File workDir = temp.newFolder(".sonar"); - def.setWorkDir(workDir); - File baseDir = temp.newFolder(); - def.setBaseDir(baseDir); - DefaultInputModule module = new DefaultInputModule(def); - assertThat(workDir.isHidden()).isTrue(); - } - -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/DefaultInputProjectTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/DefaultInputProjectTest.java deleted file mode 100644 index 03248472335..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/DefaultInputProjectTest.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import org.sonar.api.batch.bootstrap.ProjectDefinition; - -import static org.assertj.core.api.Assertions.assertThat; - -public class DefaultInputProjectTest { - - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - - @Test - public void testGetters() throws IOException { - ProjectDefinition def = ProjectDefinition.create(); - def.setKey("projectKey"); - def.setName("projectName"); - File baseDir = temp.newFolder(); - def.setBaseDir(baseDir); - def.setDescription("desc"); - File workDir = temp.newFolder(); - def.setWorkDir(workDir); - def.setSources("file1"); - def.setTests("test1"); - AbstractProjectOrModule project = new DefaultInputProject(def); - - assertThat(project.key()).isEqualTo("projectKey"); - assertThat(project.getName()).isEqualTo("projectName"); - assertThat(project.getOriginalName()).isEqualTo("projectName"); - assertThat(project.definition()).isEqualTo(def); - assertThat(project.getBranch()).isNull(); - assertThat(project.getBaseDir()).isEqualTo(baseDir.toPath()); - assertThat(project.getKeyWithBranch()).isEqualTo("projectKey"); - assertThat(project.getDescription()).isEqualTo("desc"); - assertThat(project.getWorkDir()).isEqualTo(workDir.toPath()); - assertThat(project.getEncoding()).isEqualTo(Charset.defaultCharset()); - - assertThat(project.properties()).hasSize(5); - - assertThat(project.isFile()).isFalse(); - } - - @Test - public void testEncoding() throws IOException { - ProjectDefinition def = ProjectDefinition.create(); - def.setKey("projectKey"); - def.setName("projectName"); - File baseDir = temp.newFolder(); - def.setBaseDir(baseDir); - def.setProjectVersion("version"); - def.setDescription("desc"); - File workDir = temp.newFolder(); - def.setWorkDir(workDir); - def.setSources("file1"); - def.setProperty("sonar.sourceEncoding", "UTF-16"); - AbstractProjectOrModule project = new DefaultInputProject(def); - - assertThat(project.getEncoding()).isEqualTo(StandardCharsets.UTF_16); - } - -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/FileMetadataTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/FileMetadataTest.java deleted file mode 100644 index c2665324ebc..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/FileMetadataTest.java +++ /dev/null @@ -1,308 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs; - -import java.io.File; -import java.io.FileInputStream; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import javax.annotation.Nullable; -import org.apache.commons.codec.binary.Hex; -import org.apache.commons.io.FileUtils; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.rules.TemporaryFolder; -import org.sonar.api.batch.fs.internal.Metadata; -import org.sonar.api.utils.log.LogTester; -import org.sonar.api.utils.log.LoggerLevel; - -import static org.apache.commons.codec.digest.DigestUtils.md5Hex; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.fail; - -public class FileMetadataTest { - - @Rule - public ExpectedException thrown = ExpectedException.none(); - - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - - @Rule - public LogTester logTester = new LogTester(); - - @Test - public void empty_file() throws Exception { - File tempFile = temp.newFile(); - FileUtils.touch(tempFile); - - Metadata metadata = new FileMetadata().readMetadata(new FileInputStream(tempFile), StandardCharsets.UTF_8, tempFile.getName()); - assertThat(metadata.lines()).isEqualTo(1); - assertThat(metadata.nonBlankLines()).isEqualTo(0); - assertThat(metadata.hash()).isNotEmpty(); - assertThat(metadata.originalLineStartOffsets()).containsOnly(0); - assertThat(metadata.originalLineEndOffsets()).containsOnly(0); - assertThat(metadata.isEmpty()).isTrue(); - } - - @Test - public void windows_without_latest_eol() throws Exception { - File tempFile = temp.newFile(); - FileUtils.write(tempFile, "foo\r\nbar\r\nbaz", StandardCharsets.UTF_8, true); - - Metadata metadata = new FileMetadata().readMetadata(new FileInputStream(tempFile), StandardCharsets.UTF_8, tempFile.getName()); - assertThat(metadata.lines()).isEqualTo(3); - assertThat(metadata.nonBlankLines()).isEqualTo(3); - assertThat(metadata.hash()).isEqualTo(md5Hex("foo\nbar\nbaz")); - assertThat(metadata.originalLineStartOffsets()).containsOnly(0, 5, 10); - assertThat(metadata.originalLineEndOffsets()).containsOnly(3, 8, 13); - assertThat(metadata.isEmpty()).isFalse(); - } - - @Test - public void read_with_wrong_encoding() throws Exception { - File tempFile = temp.newFile(); - FileUtils.write(tempFile, "marker´s\n", Charset.forName("cp1252")); - - Metadata metadata = new FileMetadata().readMetadata(new FileInputStream(tempFile), StandardCharsets.UTF_8, tempFile.getName()); - assertThat(metadata.lines()).isEqualTo(2); - assertThat(metadata.hash()).isEqualTo(md5Hex("marker\ufffds\n")); - assertThat(metadata.originalLineStartOffsets()).containsOnly(0, 9); - } - - @Test - public void non_ascii_utf_8() throws Exception { - File tempFile = temp.newFile(); - FileUtils.write(tempFile, "föo\r\nbà r\r\n\u1D11Ebaßz\r\n", StandardCharsets.UTF_8, true); - - Metadata metadata = new FileMetadata().readMetadata(new FileInputStream(tempFile), StandardCharsets.UTF_8, tempFile.getName()); - assertThat(metadata.lines()).isEqualTo(4); - assertThat(metadata.nonBlankLines()).isEqualTo(3); - assertThat(metadata.hash()).isEqualTo(md5Hex("föo\nbà r\n\u1D11Ebaßz\n")); - assertThat(metadata.originalLineStartOffsets()).containsOnly(0, 5, 10, 18); - } - - @Test - public void non_ascii_utf_16() throws Exception { - File tempFile = temp.newFile(); - FileUtils.write(tempFile, "föo\r\nbà r\r\n\u1D11Ebaßz\r\n", StandardCharsets.UTF_16, true); - Metadata metadata = new FileMetadata().readMetadata(new FileInputStream(tempFile), StandardCharsets.UTF_16, tempFile.getName()); - assertThat(metadata.lines()).isEqualTo(4); - assertThat(metadata.nonBlankLines()).isEqualTo(3); - assertThat(metadata.hash()).isEqualTo(md5Hex("föo\nbà r\n\u1D11Ebaßz\n".getBytes(StandardCharsets.UTF_8))); - assertThat(metadata.originalLineStartOffsets()).containsOnly(0, 5, 10, 18); - } - - @Test - public void unix_without_latest_eol() throws Exception { - File tempFile = temp.newFile(); - FileUtils.write(tempFile, "foo\nbar\nbaz", StandardCharsets.UTF_8, true); - - Metadata metadata = new FileMetadata().readMetadata(new FileInputStream(tempFile), StandardCharsets.UTF_8, tempFile.getName()); - assertThat(metadata.lines()).isEqualTo(3); - assertThat(metadata.nonBlankLines()).isEqualTo(3); - assertThat(metadata.hash()).isEqualTo(md5Hex("foo\nbar\nbaz")); - assertThat(metadata.originalLineStartOffsets()).containsOnly(0, 4, 8); - assertThat(metadata.originalLineEndOffsets()).containsOnly(3, 7, 11); - assertThat(metadata.isEmpty()).isFalse(); - } - - @Test - public void unix_with_latest_eol() throws Exception { - File tempFile = temp.newFile(); - FileUtils.write(tempFile, "foo\nbar\nbaz\n", StandardCharsets.UTF_8, true); - - Metadata metadata = new FileMetadata().readMetadata(new FileInputStream(tempFile), StandardCharsets.UTF_8, tempFile.getName()); - assertThat(metadata.lines()).isEqualTo(4); - assertThat(metadata.nonBlankLines()).isEqualTo(3); - assertThat(metadata.hash()).isEqualTo(md5Hex("foo\nbar\nbaz\n")); - assertThat(metadata.originalLineStartOffsets()).containsOnly(0, 4, 8, 12); - assertThat(metadata.originalLineEndOffsets()).containsOnly(3, 7, 11, 12); - } - - @Test - public void mac_without_latest_eol() throws Exception { - File tempFile = temp.newFile(); - FileUtils.write(tempFile, "foo\rbar\rbaz", StandardCharsets.UTF_8, true); - - Metadata metadata = new FileMetadata().readMetadata(new FileInputStream(tempFile), StandardCharsets.UTF_8, tempFile.getName()); - assertThat(metadata.lines()).isEqualTo(3); - assertThat(metadata.nonBlankLines()).isEqualTo(3); - assertThat(metadata.hash()).isEqualTo(md5Hex("foo\nbar\nbaz")); - assertThat(metadata.originalLineStartOffsets()).containsOnly(0, 4, 8); - assertThat(metadata.originalLineEndOffsets()).containsOnly(3, 7, 11); - } - - @Test - public void mac_with_latest_eol() throws Exception { - File tempFile = temp.newFile(); - FileUtils.write(tempFile, "foo\rbar\rbaz\r", StandardCharsets.UTF_8, true); - - Metadata metadata = new FileMetadata().readMetadata(new FileInputStream(tempFile), StandardCharsets.UTF_8, tempFile.getName()); - assertThat(metadata.lines()).isEqualTo(4); - assertThat(metadata.nonBlankLines()).isEqualTo(3); - assertThat(metadata.hash()).isEqualTo(md5Hex("foo\nbar\nbaz\n")); - assertThat(metadata.originalLineStartOffsets()).containsOnly(0, 4, 8, 12); - assertThat(metadata.originalLineEndOffsets()).containsOnly(3, 7, 11, 12); - } - - @Test - public void mix_of_newlines_with_latest_eol() throws Exception { - File tempFile = temp.newFile(); - FileUtils.write(tempFile, "foo\nbar\r\nbaz\n", StandardCharsets.UTF_8, true); - - Metadata metadata = new FileMetadata().readMetadata(new FileInputStream(tempFile), StandardCharsets.UTF_8, tempFile.getName()); - assertThat(metadata.lines()).isEqualTo(4); - assertThat(metadata.nonBlankLines()).isEqualTo(3); - assertThat(metadata.hash()).isEqualTo(md5Hex("foo\nbar\nbaz\n")); - assertThat(metadata.originalLineStartOffsets()).containsOnly(0, 4, 9, 13); - assertThat(metadata.originalLineEndOffsets()).containsOnly(3, 7, 12, 13); - } - - @Test - public void several_new_lines() throws Exception { - File tempFile = temp.newFile(); - FileUtils.write(tempFile, "foo\n\n\nbar", StandardCharsets.UTF_8, true); - - Metadata metadata = new FileMetadata().readMetadata(new FileInputStream(tempFile), StandardCharsets.UTF_8, tempFile.getName()); - assertThat(metadata.lines()).isEqualTo(4); - assertThat(metadata.nonBlankLines()).isEqualTo(2); - assertThat(metadata.hash()).isEqualTo(md5Hex("foo\n\n\nbar")); - assertThat(metadata.originalLineStartOffsets()).containsOnly(0, 4, 5, 6); - assertThat(metadata.originalLineEndOffsets()).containsOnly(3, 4, 5, 9); - } - - @Test - public void mix_of_newlines_without_latest_eol() throws Exception { - File tempFile = temp.newFile(); - FileUtils.write(tempFile, "foo\nbar\r\nbaz", StandardCharsets.UTF_8, true); - - Metadata metadata = new FileMetadata().readMetadata(new FileInputStream(tempFile), StandardCharsets.UTF_8, tempFile.getName()); - assertThat(metadata.lines()).isEqualTo(3); - assertThat(metadata.nonBlankLines()).isEqualTo(3); - assertThat(metadata.hash()).isEqualTo(md5Hex("foo\nbar\nbaz")); - assertThat(metadata.originalLineStartOffsets()).containsOnly(0, 4, 9); - assertThat(metadata.originalLineEndOffsets()).containsOnly(3, 7, 12); - } - - @Test - public void start_with_newline() throws Exception { - File tempFile = temp.newFile(); - FileUtils.write(tempFile, "\nfoo\nbar\r\nbaz", StandardCharsets.UTF_8, true); - - Metadata metadata = new FileMetadata().readMetadata(new FileInputStream(tempFile), StandardCharsets.UTF_8, tempFile.getName()); - assertThat(metadata.lines()).isEqualTo(4); - assertThat(metadata.nonBlankLines()).isEqualTo(3); - assertThat(metadata.hash()).isEqualTo(md5Hex("\nfoo\nbar\nbaz")); - assertThat(metadata.originalLineStartOffsets()).containsOnly(0, 1, 5, 10); - assertThat(metadata.originalLineEndOffsets()).containsOnly(0, 4, 8, 13); - } - - @Test - public void ignore_whitespace_when_computing_line_hashes() throws Exception { - File tempFile = temp.newFile(); - FileUtils.write(tempFile, " foo\nb ar\r\nbaz \t", StandardCharsets.UTF_8, true); - - DefaultInputFile f = new TestInputFileBuilder("foo", tempFile.getName()) - .setModuleBaseDir(tempFile.getParentFile().toPath()) - .setCharset(StandardCharsets.UTF_8) - .build(); - FileMetadata.computeLineHashesForIssueTracking(f, new FileMetadata.LineHashConsumer() { - - @Override - public void consume(int lineIdx, @Nullable byte[] hash) { - switch (lineIdx) { - case 1: - assertThat(Hex.encodeHexString(hash)).isEqualTo(md5Hex("foo")); - break; - case 2: - assertThat(Hex.encodeHexString(hash)).isEqualTo(md5Hex("bar")); - break; - case 3: - assertThat(Hex.encodeHexString(hash)).isEqualTo(md5Hex("baz")); - break; - default: - fail("Invalid line"); - } - } - }); - } - - @Test - public void dont_fail_on_empty_file() throws Exception { - File tempFile = temp.newFile(); - FileUtils.write(tempFile, "", StandardCharsets.UTF_8, true); - - DefaultInputFile f = new TestInputFileBuilder("foo", tempFile.getName()) - .setModuleBaseDir(tempFile.getParentFile().toPath()) - .setCharset(StandardCharsets.UTF_8) - .build(); - FileMetadata.computeLineHashesForIssueTracking(f, new FileMetadata.LineHashConsumer() { - - @Override - public void consume(int lineIdx, @Nullable byte[] hash) { - switch (lineIdx) { - case 1: - assertThat(hash).isNull(); - break; - default: - fail("Invalid line"); - } - } - }); - } - - @Test - public void line_feed_is_included_into_hash() throws Exception { - File file1 = temp.newFile(); - FileUtils.write(file1, "foo\nbar\n", StandardCharsets.UTF_8, true); - - // same as file1, except an additional return carriage - File file1a = temp.newFile(); - FileUtils.write(file1a, "foo\r\nbar\n", StandardCharsets.UTF_8, true); - - File file2 = temp.newFile(); - FileUtils.write(file2, "foo\nbar", StandardCharsets.UTF_8, true); - - String hash1 = new FileMetadata().readMetadata(new FileInputStream(file1), StandardCharsets.UTF_8, file1.getName()).hash(); - String hash1a = new FileMetadata().readMetadata(new FileInputStream(file1a), StandardCharsets.UTF_8, file1a.getName()).hash(); - String hash2 = new FileMetadata().readMetadata(new FileInputStream(file2), StandardCharsets.UTF_8, file2.getName()).hash(); - - assertThat(hash1).isEqualTo(hash1a); - assertThat(hash1).isNotEqualTo(hash2); - } - - @Test - public void binary_file_with_unmappable_character() throws Exception { - File woff = new File(this.getClass().getResource("glyphicons-halflings-regular.woff").toURI()); - - Metadata metadata = new FileMetadata().readMetadata(new FileInputStream(woff), StandardCharsets.UTF_8, woff.getAbsolutePath()); - - assertThat(metadata.lines()).isEqualTo(135); - assertThat(metadata.nonBlankLines()).isEqualTo(133); - assertThat(metadata.hash()).isNotEmpty(); - - assertThat(logTester.logs(LoggerLevel.WARN).get(0)).contains("Invalid character encountered in file"); - assertThat(logTester.logs(LoggerLevel.WARN).get(0)).contains( - "glyphicons-halflings-regular.woff at line 1 for encoding UTF-8. Please fix file content or configure the encoding to be used using property 'sonar.sourceEncoding'."); - } - -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/TestInputFileBuilderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/TestInputFileBuilderTest.java deleted file mode 100644 index 2d83007ff13..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/TestInputFileBuilderTest.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import org.apache.commons.io.IOUtils; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import org.sonar.api.batch.fs.InputFile.Status; -import org.sonar.api.batch.fs.InputFile.Type; - -import static org.assertj.core.api.Assertions.assertThat; - -public class TestInputFileBuilderTest { - - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - - @Test - public void setContent() throws IOException { - DefaultInputFile file = TestInputFileBuilder.create("module", "invalidPath") - .setContents("my content") - .setCharset(StandardCharsets.UTF_8) - .build(); - assertThat(file.contents()).isEqualTo("my content"); - assertThat(IOUtils.toString(file.inputStream())).isEqualTo("my content"); - } - - @Test - public void testGetters() { - DefaultInputFile file = TestInputFileBuilder.create("module", new File("baseDir"), new File("baseDir", "path")) - .setStatus(Status.SAME) - .setType(Type.MAIN) - .build(); - - assertThat(file.type()).isEqualTo(Type.MAIN); - assertThat(file.status()).isEqualTo(Status.SAME); - assertThat(file.isPublished()).isTrue(); - assertThat(file.type()).isEqualTo(Type.MAIN); - assertThat(file.relativePath()).isEqualTo("path"); - assertThat(file.absolutePath()).isEqualTo("baseDir/path"); - - } - - @Test - public void testCreateInputModule() throws IOException { - File baseDir = temp.newFolder(); - AbstractProjectOrModule module = TestInputFileBuilder.newDefaultInputModule("key", baseDir); - assertThat(module.key()).isEqualTo("key"); - assertThat(module.getBaseDir()).isEqualTo(baseDir.toPath()); - } -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/charhandler/IntArrayListTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/charhandler/IntArrayListTest.java deleted file mode 100644 index 048a0309e5f..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/charhandler/IntArrayListTest.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.charhandler; - -import org.junit.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class IntArrayListTest { - - @Test - public void addElements() { - IntArrayList list = new IntArrayList(); - assertThat(list.trimAndGet()).isEmpty(); - list.add(1); - list.add(2); - assertThat(list.trimAndGet()).containsExactly(1, 2); - } - - @Test - public void trimIfNeeded() { - IntArrayList list = new IntArrayList(); - list.add(1); - list.add(2); - assertThat(list.trimAndGet()).isSameAs(list.trimAndGet()); - } - - @Test - public void grow() { - // Default capacity is 10 - IntArrayList list = new IntArrayList(); - for (int i = 1; i <= 11; i++) { - list.add(i); - } - assertThat(list.trimAndGet()).hasSize(11); - } - -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/predicates/AndPredicateTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/predicates/AndPredicateTest.java deleted file mode 100644 index d3ec2aa7b81..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/predicates/AndPredicateTest.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import org.junit.Test; -import org.sonar.api.batch.fs.FilePredicate; - -import java.util.Arrays; -import org.sonar.api.batch.fs.internal.PathPattern; - -import static org.assertj.core.api.Assertions.assertThat; - -public class AndPredicateTest { - - @Test - public void flattenNestedAnd() { - PathPatternPredicate pathPatternPredicate1 = new PathPatternPredicate(PathPattern.create("foo1/**")); - PathPatternPredicate pathPatternPredicate2 = new PathPatternPredicate(PathPattern.create("foo2/**")); - PathPatternPredicate pathPatternPredicate3 = new PathPatternPredicate(PathPattern.create("foo3/**")); - FilePredicate andPredicate = AndPredicate.create(Arrays.<FilePredicate>asList(pathPatternPredicate1, - AndPredicate.create(Arrays.<FilePredicate>asList(pathPatternPredicate2, pathPatternPredicate3)))); - assertThat(((AndPredicate) andPredicate).predicates()).containsExactly(pathPatternPredicate1, pathPatternPredicate2, pathPatternPredicate3); - } - - @Test - public void sortPredicatesByPriority() { - PathPatternPredicate pathPatternPredicate1 = new PathPatternPredicate(PathPattern.create("foo1/**")); - PathPatternPredicate pathPatternPredicate2 = new PathPatternPredicate(PathPattern.create("foo2/**")); - RelativePathPredicate relativePathPredicate = new RelativePathPredicate("foo"); - FilePredicate andPredicate = AndPredicate.create(Arrays.<FilePredicate>asList(pathPatternPredicate1, - relativePathPredicate, pathPatternPredicate2)); - assertThat(((AndPredicate) andPredicate).predicates()).containsExactly(relativePathPredicate, pathPatternPredicate1, pathPatternPredicate2); - } - - @Test - public void simplifyAndExpressionsWhenEmpty() { - FilePredicate andPredicate = AndPredicate.create(Arrays.<FilePredicate>asList()); - assertThat(andPredicate).isEqualTo(TruePredicate.TRUE); - } - - @Test - public void simplifyAndExpressionsWhenTrue() { - PathPatternPredicate pathPatternPredicate1 = new PathPatternPredicate(PathPattern.create("foo1/**")); - PathPatternPredicate pathPatternPredicate2 = new PathPatternPredicate(PathPattern.create("foo2/**")); - FilePredicate andPredicate = AndPredicate.create(Arrays.<FilePredicate>asList(pathPatternPredicate1, - TruePredicate.TRUE, pathPatternPredicate2)); - assertThat(((AndPredicate) andPredicate).predicates()).containsExactly(pathPatternPredicate1, pathPatternPredicate2); - } - - @Test - public void simplifyAndExpressionsWhenFalse() { - PathPatternPredicate pathPatternPredicate1 = new PathPatternPredicate(PathPattern.create("foo1/**")); - PathPatternPredicate pathPatternPredicate2 = new PathPatternPredicate(PathPattern.create("foo2/**")); - FilePredicate andPredicate = AndPredicate.create(Arrays.<FilePredicate>asList(pathPatternPredicate1, - FalsePredicate.FALSE, pathPatternPredicate2)); - assertThat(andPredicate).isEqualTo(FalsePredicate.FALSE); - } - -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/predicates/DefaultFilePredicatesTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/predicates/DefaultFilePredicatesTest.java deleted file mode 100644 index d0869f0d9a2..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/predicates/DefaultFilePredicatesTest.java +++ /dev/null @@ -1,245 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import java.io.File; -import java.io.IOException; -import java.net.URI; -import java.nio.file.Path; -import java.util.Arrays; -import java.util.Collections; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import org.sonar.api.batch.fs.FilePredicate; -import org.sonar.api.batch.fs.FilePredicates; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.InputFile.Status; -import org.sonar.scanner.fs.TestInputFileBuilder; - -import static org.assertj.core.api.Assertions.assertThat; - -public class DefaultFilePredicatesTest { - - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - - private Path moduleBasePath; - - @Before - public void setUp() throws IOException { - moduleBasePath = temp.newFolder().toPath(); - } - - InputFile javaFile; - FilePredicates predicates; - - @Before - public void before() throws IOException { - predicates = new DefaultFilePredicates(temp.newFolder().toPath()); - javaFile = new TestInputFileBuilder("foo", "src/main/java/struts/Action.java") - .setModuleBaseDir(moduleBasePath) - .setLanguage("java") - .setStatus(Status.SAME) - .build(); - - } - - @Test - public void all() { - assertThat(predicates.all().apply(javaFile)).isTrue(); - } - - @Test - public void none() { - assertThat(predicates.none().apply(javaFile)).isFalse(); - } - - @Test - public void matches_inclusion_pattern() { - assertThat(predicates.matchesPathPattern("src/main/**/Action.java").apply(javaFile)).isTrue(); - assertThat(predicates.matchesPathPattern("Action.java").apply(javaFile)).isFalse(); - assertThat(predicates.matchesPathPattern("src/**/*.php").apply(javaFile)).isFalse(); - } - - @Test - public void matches_inclusion_patterns() { - assertThat(predicates.matchesPathPatterns(new String[] {"src/other/**.java", "src/main/**/Action.java"}).apply(javaFile)).isTrue(); - assertThat(predicates.matchesPathPatterns(new String[] {}).apply(javaFile)).isTrue(); - assertThat(predicates.matchesPathPatterns(new String[] {"src/other/**.java", "src/**/*.php"}).apply(javaFile)).isFalse(); - } - - @Test - public void does_not_match_exclusion_pattern() { - assertThat(predicates.doesNotMatchPathPattern("src/main/**/Action.java").apply(javaFile)).isFalse(); - assertThat(predicates.doesNotMatchPathPattern("Action.java").apply(javaFile)).isTrue(); - assertThat(predicates.doesNotMatchPathPattern("src/**/*.php").apply(javaFile)).isTrue(); - } - - @Test - public void does_not_match_exclusion_patterns() { - assertThat(predicates.doesNotMatchPathPatterns(new String[] {}).apply(javaFile)).isTrue(); - assertThat(predicates.doesNotMatchPathPatterns(new String[] {"src/other/**.java", "src/**/*.php"}).apply(javaFile)).isTrue(); - assertThat(predicates.doesNotMatchPathPatterns(new String[] {"src/other/**.java", "src/main/**/Action.java"}).apply(javaFile)).isFalse(); - } - - @Test - public void has_relative_path() { - assertThat(predicates.hasRelativePath("src/main/java/struts/Action.java").apply(javaFile)).isTrue(); - assertThat(predicates.hasRelativePath("src/main/java/struts/Other.java").apply(javaFile)).isFalse(); - - // path is normalized - assertThat(predicates.hasRelativePath("src/main/java/../java/struts/Action.java").apply(javaFile)).isTrue(); - - assertThat(predicates.hasRelativePath("src\\main\\java\\struts\\Action.java").apply(javaFile)).isTrue(); - assertThat(predicates.hasRelativePath("src\\main\\java\\struts\\Other.java").apply(javaFile)).isFalse(); - assertThat(predicates.hasRelativePath("src\\main\\java\\struts\\..\\struts\\Action.java").apply(javaFile)).isTrue(); - } - - @Test - public void has_absolute_path() throws Exception { - String path = javaFile.file().getAbsolutePath(); - assertThat(predicates.hasAbsolutePath(path).apply(javaFile)).isTrue(); - assertThat(predicates.hasAbsolutePath(path.replaceAll("/", "\\\\")).apply(javaFile)).isTrue(); - - assertThat(predicates.hasAbsolutePath(temp.newFile().getAbsolutePath()).apply(javaFile)).isFalse(); - assertThat(predicates.hasAbsolutePath("src/main/java/struts/Action.java").apply(javaFile)).isFalse(); - } - - @Test - public void has_uri() throws Exception { - URI uri = javaFile.uri(); - assertThat(predicates.hasURI(uri).apply(javaFile)).isTrue(); - - assertThat(predicates.hasURI(temp.newFile().toURI()).apply(javaFile)).isFalse(); - } - - @Test - public void has_path() throws Exception { - // is relative path - assertThat(predicates.hasPath("src/main/java/struts/Action.java").apply(javaFile)).isTrue(); - assertThat(predicates.hasPath("src/main/java/struts/Other.java").apply(javaFile)).isFalse(); - - // is absolute path - String path = javaFile.file().getAbsolutePath(); - assertThat(predicates.hasAbsolutePath(path).apply(javaFile)).isTrue(); - assertThat(predicates.hasPath(temp.newFile().getAbsolutePath()).apply(javaFile)).isFalse(); - } - - @Test - public void is_file() throws Exception { - // relative file - assertThat(predicates.is(new File(javaFile.relativePath())).apply(javaFile)).isTrue(); - - // absolute file - assertThat(predicates.is(javaFile.file()).apply(javaFile)).isTrue(); - assertThat(predicates.is(javaFile.file().getAbsoluteFile()).apply(javaFile)).isTrue(); - assertThat(predicates.is(new File(javaFile.file().toURI())).apply(javaFile)).isTrue(); - assertThat(predicates.is(temp.newFile()).apply(javaFile)).isFalse(); - } - - @Test - public void has_language() { - assertThat(predicates.hasLanguage("java").apply(javaFile)).isTrue(); - assertThat(predicates.hasLanguage("php").apply(javaFile)).isFalse(); - } - - @Test - public void has_languages() { - assertThat(predicates.hasLanguages(Arrays.asList("java", "php")).apply(javaFile)).isTrue(); - assertThat(predicates.hasLanguages(Arrays.asList("cobol", "php")).apply(javaFile)).isFalse(); - assertThat(predicates.hasLanguages(Collections.<String>emptyList()).apply(javaFile)).isTrue(); - } - - @Test - public void has_type() { - assertThat(predicates.hasType(InputFile.Type.MAIN).apply(javaFile)).isTrue(); - assertThat(predicates.hasType(InputFile.Type.TEST).apply(javaFile)).isFalse(); - } - - @Test - public void has_status() { - assertThat(predicates.hasAnyStatus().apply(javaFile)).isTrue(); - assertThat(predicates.hasStatus(InputFile.Status.SAME).apply(javaFile)).isTrue(); - assertThat(predicates.hasStatus(InputFile.Status.ADDED).apply(javaFile)).isFalse(); - } - - @Test - public void not() { - assertThat(predicates.not(predicates.hasType(InputFile.Type.MAIN)).apply(javaFile)).isFalse(); - assertThat(predicates.not(predicates.hasType(InputFile.Type.TEST)).apply(javaFile)).isTrue(); - } - - @Test - public void and() { - // empty - assertThat(predicates.and().apply(javaFile)).isTrue(); - assertThat(predicates.and(new FilePredicate[0]).apply(javaFile)).isTrue(); - assertThat(predicates.and(Collections.<FilePredicate>emptyList()).apply(javaFile)).isTrue(); - - // two arguments - assertThat(predicates.and(predicates.all(), predicates.all()).apply(javaFile)).isTrue(); - assertThat(predicates.and(predicates.all(), predicates.none()).apply(javaFile)).isFalse(); - assertThat(predicates.and(predicates.none(), predicates.all()).apply(javaFile)).isFalse(); - - // collection - assertThat(predicates.and(Arrays.asList(predicates.all(), predicates.all())).apply(javaFile)).isTrue(); - assertThat(predicates.and(Arrays.asList(predicates.all(), predicates.none())).apply(javaFile)).isFalse(); - - // array - assertThat(predicates.and(new FilePredicate[] {predicates.all(), predicates.all()}).apply(javaFile)).isTrue(); - assertThat(predicates.and(new FilePredicate[] {predicates.all(), predicates.none()}).apply(javaFile)).isFalse(); - } - - @Test - public void or() { - // empty - assertThat(predicates.or().apply(javaFile)).isTrue(); - assertThat(predicates.or(new FilePredicate[0]).apply(javaFile)).isTrue(); - assertThat(predicates.or(Collections.<FilePredicate>emptyList()).apply(javaFile)).isTrue(); - - // two arguments - assertThat(predicates.or(predicates.all(), predicates.all()).apply(javaFile)).isTrue(); - assertThat(predicates.or(predicates.all(), predicates.none()).apply(javaFile)).isTrue(); - assertThat(predicates.or(predicates.none(), predicates.all()).apply(javaFile)).isTrue(); - assertThat(predicates.or(predicates.none(), predicates.none()).apply(javaFile)).isFalse(); - - // collection - assertThat(predicates.or(Arrays.asList(predicates.all(), predicates.all())).apply(javaFile)).isTrue(); - assertThat(predicates.or(Arrays.asList(predicates.all(), predicates.none())).apply(javaFile)).isTrue(); - assertThat(predicates.or(Arrays.asList(predicates.none(), predicates.none())).apply(javaFile)).isFalse(); - - // array - assertThat(predicates.or(new FilePredicate[] {predicates.all(), predicates.all()}).apply(javaFile)).isTrue(); - assertThat(predicates.or(new FilePredicate[] {predicates.all(), predicates.none()}).apply(javaFile)).isTrue(); - assertThat(predicates.or(new FilePredicate[] {predicates.none(), predicates.none()}).apply(javaFile)).isFalse(); - } - - @Test - public void hasFilename() { - assertThat(predicates.hasFilename("Action.java").apply(javaFile)).isTrue(); - } - - @Test - public void hasExtension() { - assertThat(predicates.hasExtension("java").apply(javaFile)).isTrue(); - } -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/predicates/FileExtensionPredicateTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/predicates/FileExtensionPredicateTest.java deleted file mode 100644 index 8cae2f45ff0..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/predicates/FileExtensionPredicateTest.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import java.io.IOException; -import org.junit.Test; -import org.sonar.api.batch.fs.InputFile; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; -import static org.sonar.scanner.fs.predicates.FileExtensionPredicate.getExtension; - -public class FileExtensionPredicateTest { - - @Test - public void should_match_correct_extension() throws IOException { - FileExtensionPredicate predicate = new FileExtensionPredicate("bat"); - assertThat(predicate.apply(mockWithName("prog.bat"))).isTrue(); - assertThat(predicate.apply(mockWithName("prog.bat.bat"))).isTrue(); - } - - @Test - public void should_not_match_incorrect_extension() throws IOException { - FileExtensionPredicate predicate = new FileExtensionPredicate("bat"); - assertThat(predicate.apply(mockWithName("prog.batt"))).isFalse(); - assertThat(predicate.apply(mockWithName("prog.abat"))).isFalse(); - assertThat(predicate.apply(mockWithName("prog."))).isFalse(); - assertThat(predicate.apply(mockWithName("prog.bat."))).isFalse(); - assertThat(predicate.apply(mockWithName("prog.bat.batt"))).isFalse(); - assertThat(predicate.apply(mockWithName("prog"))).isFalse(); - } - - @Test - public void should_match_correct_extension_case_insensitively() throws IOException { - FileExtensionPredicate predicate = new FileExtensionPredicate("jAVa"); - assertThat(predicate.apply(mockWithName("Program.java"))).isTrue(); - assertThat(predicate.apply(mockWithName("Program.JAVA"))).isTrue(); - assertThat(predicate.apply(mockWithName("Program.Java"))).isTrue(); - assertThat(predicate.apply(mockWithName("Program.JaVa"))).isTrue(); - } - - @Test - public void test_empty_extension() { - assertThat(getExtension("prog")).isEmpty(); - assertThat(getExtension("prog.")).isEmpty(); - assertThat(getExtension(".")).isEmpty(); - } - - private InputFile mockWithName(String filename) throws IOException { - InputFile inputFile = mock(InputFile.class); - when(inputFile.filename()).thenReturn(filename); - return inputFile; - } -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/predicates/FilenamePredicateTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/predicates/FilenamePredicateTest.java deleted file mode 100644 index 71c7d1f47de..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/predicates/FilenamePredicateTest.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import java.io.IOException; -import java.util.Collections; -import org.junit.Test; -import org.sonar.api.batch.fs.FileSystem; -import org.sonar.api.batch.fs.InputFile; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class FilenamePredicateTest { - @Test - public void should_match_file_by_filename() throws IOException { - String filename = "some name"; - InputFile inputFile = mock(InputFile.class); - when(inputFile.filename()).thenReturn(filename); - - assertThat(new FilenamePredicate(filename).apply(inputFile)).isTrue(); - } - - @Test - public void should_not_match_file_by_different_filename() throws IOException { - String filename = "some name"; - InputFile inputFile = mock(InputFile.class); - when(inputFile.filename()).thenReturn(filename + "x"); - - assertThat(new FilenamePredicate(filename).apply(inputFile)).isFalse(); - } - - @Test - public void should_find_matching_file_in_index() throws IOException { - String filename = "some name"; - InputFile inputFile = mock(InputFile.class); - when(inputFile.filename()).thenReturn(filename); - - FileSystem.Index index = mock(FileSystem.Index.class); - when(index.getFilesByName(filename)).thenReturn(Collections.singleton(inputFile)); - - assertThat(new FilenamePredicate(filename).get(index)).containsOnly(inputFile); - } - -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/predicates/OrPredicateTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/predicates/OrPredicateTest.java deleted file mode 100644 index 0804d1f3f7e..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/predicates/OrPredicateTest.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import org.junit.Test; -import org.sonar.api.batch.fs.FilePredicate; - -import java.util.Arrays; -import org.sonar.api.batch.fs.internal.PathPattern; - -import static org.assertj.core.api.Assertions.assertThat; - -public class OrPredicateTest { - - @Test - public void flattenNestedOr() { - PathPatternPredicate pathPatternPredicate1 = new PathPatternPredicate(PathPattern.create("foo1/**")); - PathPatternPredicate pathPatternPredicate2 = new PathPatternPredicate(PathPattern.create("foo2/**")); - PathPatternPredicate pathPatternPredicate3 = new PathPatternPredicate(PathPattern.create("foo3/**")); - FilePredicate orPredicate = OrPredicate.create(Arrays.asList(pathPatternPredicate1, - OrPredicate.create(Arrays.asList(pathPatternPredicate2, pathPatternPredicate3)))); - assertThat(((OrPredicate) orPredicate).predicates()).containsExactly(pathPatternPredicate1, pathPatternPredicate2, pathPatternPredicate3); - } - - @Test - public void simplifyOrExpressionsWhenEmpty() { - FilePredicate orPredicate = OrPredicate.create(Arrays.asList()); - assertThat(orPredicate).isEqualTo(TruePredicate.TRUE); - } - - @Test - public void simplifyOrExpressionsWhenFalse() { - PathPatternPredicate pathPatternPredicate1 = new PathPatternPredicate(PathPattern.create("foo1/**")); - PathPatternPredicate pathPatternPredicate2 = new PathPatternPredicate(PathPattern.create("foo2/**")); - FilePredicate andPredicate = OrPredicate.create(Arrays.asList(pathPatternPredicate1, - FalsePredicate.FALSE, pathPatternPredicate2)); - assertThat(((OrPredicate) andPredicate).predicates()).containsExactly(pathPatternPredicate1, pathPatternPredicate2); - } - - @Test - public void simplifyAndExpressionsWhenTrue() { - PathPatternPredicate pathPatternPredicate1 = new PathPatternPredicate(PathPattern.create("foo1/**")); - PathPatternPredicate pathPatternPredicate2 = new PathPatternPredicate(PathPattern.create("foo2/**")); - FilePredicate andPredicate = OrPredicate.create(Arrays.asList(pathPatternPredicate1, - TruePredicate.TRUE, pathPatternPredicate2)); - assertThat(andPredicate).isEqualTo(TruePredicate.TRUE); - } - -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/predicates/RelativePathPredicateTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/predicates/RelativePathPredicateTest.java deleted file mode 100644 index b3c9c2dc9ff..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/fs/predicates/RelativePathPredicateTest.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.fs.predicates; - -import org.junit.Test; -import org.sonar.api.batch.fs.InputFile; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class RelativePathPredicateTest { - @Test - public void returns_false_when_path_is_invalid() { - RelativePathPredicate predicate = new RelativePathPredicate(".."); - InputFile inputFile = mock(InputFile.class); - when(inputFile.relativePath()).thenReturn("path"); - assertThat(predicate.apply(inputFile)).isFalse(); - } - - @Test - public void returns_true_if_matches() { - RelativePathPredicate predicate = new RelativePathPredicate("path"); - InputFile inputFile = mock(InputFile.class); - when(inputFile.relativePath()).thenReturn("path"); - assertThat(predicate.apply(inputFile)).isTrue(); - } - - @Test - public void returns_false_if_doesnt_match() { - RelativePathPredicate predicate = new RelativePathPredicate("path1"); - InputFile inputFile = mock(InputFile.class); - when(inputFile.relativePath()).thenReturn("path2"); - assertThat(predicate.apply(inputFile)).isFalse(); - } -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/genericcoverage/GenericCoverageReportParserTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/genericcoverage/GenericCoverageReportParserTest.java index ccd628b0a17..777c85a924b 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/genericcoverage/GenericCoverageReportParserTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/genericcoverage/GenericCoverageReportParserTest.java @@ -28,9 +28,9 @@ import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.utils.MessageException; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.TestInputFileBuilder; -import org.sonar.scanner.sensor.SensorContextTester; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.TestInputFileBuilder; +import org.sonar.api.impl.sensor.SensorContextTester; import static org.assertj.core.api.Assertions.assertThat; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/genericcoverage/GenericTestExecutionReportParserTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/genericcoverage/GenericTestExecutionReportParserTest.java index 40ac5200719..a13c2a7e88a 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/genericcoverage/GenericTestExecutionReportParserTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/genericcoverage/GenericTestExecutionReportParserTest.java @@ -31,9 +31,9 @@ import org.sonar.api.test.MutableTestCase; import org.sonar.api.test.MutableTestPlan; import org.sonar.api.utils.MessageException; import org.sonar.scanner.deprecated.test.TestPlanBuilder; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.TestInputFileBuilder; -import org.sonar.scanner.sensor.SensorContextTester; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.TestInputFileBuilder; +import org.sonar.api.impl.sensor.SensorContextTester; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/genericcoverage/GenericTestExecutionSensorTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/genericcoverage/GenericTestExecutionSensorTest.java index 980ee96bbe8..fcd36806b4f 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/genericcoverage/GenericTestExecutionSensorTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/genericcoverage/GenericTestExecutionSensorTest.java @@ -35,7 +35,7 @@ import org.sonar.api.utils.log.LoggerLevel; import org.sonar.scanner.config.DefaultConfiguration; import org.sonar.scanner.deprecated.test.TestPlanBuilder; import org.sonar.scanner.scan.ProjectConfiguration; -import org.sonar.scanner.sensor.SensorContextTester; +import org.sonar.api.impl.sensor.SensorContextTester; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/DefaultFilterableIssueTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/DefaultFilterableIssueTest.java index 5250e1aa5d1..cf1b13c9fd8 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/DefaultFilterableIssueTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/DefaultFilterableIssueTest.java @@ -24,7 +24,7 @@ import org.junit.Before; import org.junit.Test; import org.sonar.api.batch.fs.InputComponent; import org.sonar.scanner.ProjectInfo; -import org.sonar.scanner.fs.DefaultInputProject; +import org.sonar.api.impl.fs.DefaultInputProject; import org.sonar.scanner.protocol.Constants.Severity; import org.sonar.scanner.protocol.output.ScannerReport.Issue; import org.sonar.scanner.protocol.output.ScannerReport.TextRange; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/IssuePublisherTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/IssuePublisherTest.java index 881a3629a04..3bd71931f2d 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/IssuePublisherTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/IssuePublisherTest.java @@ -32,18 +32,20 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.sonar.api.batch.bootstrap.ProjectDefinition; import org.sonar.api.batch.fs.InputComponent; +import org.sonar.api.batch.rule.NewActiveRule; +import org.sonar.api.impl.rule.RulesBuilder; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputProject; +import org.sonar.api.impl.fs.TestInputFileBuilder; +import org.sonar.api.impl.issue.DefaultIssue; +import org.sonar.api.impl.issue.DefaultIssueLocation; +import org.sonar.api.impl.sensor.DefaultExternalIssue; import org.sonar.api.rule.RuleKey; import org.sonar.api.rule.Severity; import org.sonar.api.rules.RuleType; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.DefaultInputProject; -import org.sonar.scanner.fs.TestInputFileBuilder; import org.sonar.scanner.protocol.output.ScannerReport; import org.sonar.scanner.report.ReportPublisher; -import org.sonar.scanner.rule.ActiveRulesBuilder; -import org.sonar.scanner.rule.NewActiveRule; -import org.sonar.scanner.rule.RulesBuilder; -import org.sonar.scanner.sensor.DefaultExternalIssue; +import org.sonar.api.impl.rule.ActiveRulesBuilder; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/EnforceIssuesFilterTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/EnforceIssuesFilterTest.java index a656a767f71..770bfc94806 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/EnforceIssuesFilterTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/EnforceIssuesFilterTest.java @@ -26,7 +26,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.sonar.api.batch.fs.InputComponent; -import org.sonar.scanner.fs.TestInputFileBuilder; +import org.sonar.api.impl.fs.TestInputFileBuilder; import org.sonar.api.notifications.AnalysisWarnings; import org.sonar.api.rule.RuleKey; import org.sonar.api.scan.issue.filter.IssueFilterChain; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/IgnoreIssuesFilterTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/IgnoreIssuesFilterTest.java index d5a99ff296f..4f514205e43 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/IgnoreIssuesFilterTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/IgnoreIssuesFilterTest.java @@ -24,7 +24,7 @@ import org.junit.Test; import org.sonar.api.rule.RuleKey; import org.sonar.api.scan.issue.filter.IssueFilterChain; import org.sonar.api.utils.WildcardPattern; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputFile; import org.sonar.scanner.issue.DefaultFilterableIssue; import static org.assertj.core.api.Assertions.assertThat; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/pattern/IssueExclusionPatternInitializerTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/pattern/IssueExclusionPatternInitializerTest.java index 50096cc117f..70a6a486db7 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/pattern/IssueExclusionPatternInitializerTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/pattern/IssueExclusionPatternInitializerTest.java @@ -22,7 +22,7 @@ package org.sonar.scanner.issue.ignore.pattern; import org.junit.Before; import org.junit.Test; import org.sonar.api.config.PropertyDefinitions; -import org.sonar.api.config.internal.MapSettings; +import org.sonar.api.impl.config.MapSettings; import org.sonar.api.utils.MessageException; import org.sonar.core.config.IssueExclusionProperties; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/pattern/IssueInclusionPatternInitializerTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/pattern/IssueInclusionPatternInitializerTest.java index c6cc5777bda..7932972af78 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/pattern/IssueInclusionPatternInitializerTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/pattern/IssueInclusionPatternInitializerTest.java @@ -22,7 +22,7 @@ package org.sonar.scanner.issue.ignore.pattern; import org.junit.Before; import org.junit.Test; import org.sonar.api.config.PropertyDefinitions; -import org.sonar.api.config.internal.MapSettings; +import org.sonar.api.impl.config.MapSettings; import org.sonar.core.config.IssueExclusionProperties; import static org.assertj.core.api.Assertions.assertThat; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/scanner/IssueExclusionsLoaderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/scanner/IssueExclusionsLoaderTest.java index 94cebe5f0bd..ea148567732 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/scanner/IssueExclusionsLoaderTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/scanner/IssueExclusionsLoaderTest.java @@ -28,8 +28,8 @@ import org.junit.rules.ExpectedException; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.sonar.api.notifications.AnalysisWarnings; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.TestInputFileBuilder; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.TestInputFileBuilder; import org.sonar.scanner.issue.ignore.IgnoreIssuesFilter; import org.sonar.scanner.issue.ignore.pattern.IssueExclusionPatternInitializer; import org.sonar.scanner.issue.ignore.pattern.IssuePattern; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/scanner/IssueExclusionsRegexpScannerTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/scanner/IssueExclusionsRegexpScannerTest.java index fb4165825e7..e6c757a92d3 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/scanner/IssueExclusionsRegexpScannerTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/issue/ignore/scanner/IssueExclusionsRegexpScannerTest.java @@ -34,9 +34,9 @@ import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.FileMetadata; -import org.sonar.scanner.fs.TestInputFileBuilder; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.FileMetadata; +import org.sonar.api.impl.fs.TestInputFileBuilder; import org.sonar.scanner.issue.ignore.pattern.IssueExclusionPatternInitializer; import org.sonar.scanner.issue.ignore.scanner.IssueExclusionsLoader.DoubleRegexpMatcher; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java index 244dec3cfcc..96b69e81ff1 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/ScannerMediumTester.java @@ -44,6 +44,8 @@ import org.sonar.api.SonarEdition; import org.sonar.api.SonarProduct; import org.sonar.api.SonarQubeSide; import org.sonar.api.SonarRuntime; +import org.sonar.api.batch.rule.LoadedActiveRule; +import org.sonar.api.impl.server.RuleDefinitionContext; import org.sonar.api.measures.CoreMetrics; import org.sonar.api.measures.Metric; import org.sonar.api.rule.RuleKey; @@ -65,7 +67,6 @@ import org.sonar.scanner.repository.SingleProjectRepository; import org.sonar.scanner.repository.settings.GlobalSettingsLoader; import org.sonar.scanner.repository.settings.ProjectSettingsLoader; import org.sonar.scanner.rule.ActiveRulesLoader; -import org.sonar.scanner.rule.LoadedActiveRule; import org.sonar.scanner.rule.RulesLoader; import org.sonar.scanner.scan.ScanProperties; import org.sonar.scanner.scan.branch.BranchConfiguration; @@ -73,7 +74,6 @@ import org.sonar.scanner.scan.branch.BranchConfigurationLoader; import org.sonar.scanner.scan.branch.BranchType; import org.sonar.scanner.scan.branch.ProjectBranches; import org.sonar.scanner.scan.branch.ProjectPullRequests; -import org.sonar.server.rule.RuleDefinitionContext; import org.sonarqube.ws.Qualityprofiles.SearchWsResponse.QualityProfile; import org.sonarqube.ws.Rules.ListResponse.Rule; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/branch/BranchMediumTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/branch/BranchMediumTest.java index 40695d3529e..bb77fdd9001 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/branch/BranchMediumTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/branch/BranchMediumTest.java @@ -30,8 +30,8 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.FileMetadata; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.FileMetadata; import org.sonar.scanner.mediumtest.AnalysisResult; import org.sonar.scanner.mediumtest.ScannerMediumTester; import org.sonar.scanner.protocol.output.ScannerReport; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/branch/DeprecatedBranchMediumTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/branch/DeprecatedBranchMediumTest.java index d6f141aa0f8..27b0c75eb39 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/branch/DeprecatedBranchMediumTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/branch/DeprecatedBranchMediumTest.java @@ -32,8 +32,8 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import org.sonar.api.SonarEdition; +import org.sonar.api.impl.fs.DefaultInputFile; import org.sonar.api.utils.MessageException; -import org.sonar.scanner.fs.DefaultInputFile; import org.sonar.scanner.mediumtest.AnalysisResult; import org.sonar.scanner.mediumtest.ScannerMediumTester; import org.sonar.xoo.XooPlugin; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/fs/FileSystemMediumTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/fs/FileSystemMediumTest.java index e64c47b7edb..aeab4439694 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/fs/FileSystemMediumTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/fs/FileSystemMediumTest.java @@ -41,7 +41,7 @@ import org.sonar.api.utils.PathUtils; import org.sonar.api.utils.System2; import org.sonar.api.utils.log.LogTester; import org.sonar.api.utils.log.LoggerLevel; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputFile; import org.sonar.scanner.mediumtest.AnalysisResult; import org.sonar.scanner.mediumtest.ScannerMediumTester; import org.sonar.xoo.XooPlugin; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/issues/ChecksMediumTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/issues/ChecksMediumTest.java index fdc8a2c2b68..e725100e838 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/issues/ChecksMediumTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/issues/ChecksMediumTest.java @@ -34,7 +34,7 @@ import org.sonar.api.rule.RuleKey; import org.sonar.scanner.mediumtest.ScannerMediumTester; import org.sonar.scanner.mediumtest.AnalysisResult; import org.sonar.scanner.protocol.output.ScannerReport.Issue; -import org.sonar.scanner.rule.LoadedActiveRule; +import org.sonar.api.batch.rule.LoadedActiveRule; import org.sonar.xoo.XooPlugin; import org.sonar.xoo.rule.XooRulesDefinition; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/issues/IssuesMediumTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/issues/IssuesMediumTest.java index 683773b6e94..dc306bbec9d 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/issues/IssuesMediumTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/mediumtest/issues/IssuesMediumTest.java @@ -35,7 +35,7 @@ import org.sonar.scanner.mediumtest.ScannerMediumTester; import org.sonar.scanner.mediumtest.AnalysisResult; import org.sonar.scanner.protocol.output.ScannerReport.ExternalIssue; import org.sonar.scanner.protocol.output.ScannerReport.Issue; -import org.sonar.scanner.rule.LoadedActiveRule; +import org.sonar.api.batch.rule.LoadedActiveRule; import org.sonar.xoo.XooPlugin; import org.sonar.xoo.rule.HasTagSensor; import org.sonar.xoo.rule.OneExternalIssuePerLineSensor; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/phases/ModuleCoverageAndDuplicationExclusionsTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/phases/ModuleCoverageAndDuplicationExclusionsTest.java index 6bfffc32384..eff17f8ca83 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/phases/ModuleCoverageAndDuplicationExclusionsTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/phases/ModuleCoverageAndDuplicationExclusionsTest.java @@ -25,8 +25,8 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.sonar.api.CoreProperties; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.TestInputFileBuilder; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.TestInputFileBuilder; import org.sonar.scanner.scan.ModuleConfiguration; import org.sonar.scanner.scan.filesystem.ModuleCoverageAndDuplicationExclusions; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/phases/ModuleSensorsExecutorTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/phases/ModuleSensorsExecutorTest.java index d48402ea9ed..fb7cf2ccea1 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/phases/ModuleSensorsExecutorTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/phases/ModuleSensorsExecutorTest.java @@ -26,12 +26,12 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.sonar.api.batch.bootstrap.ProjectDefinition; -import org.sonar.api.batch.fs.internal.SensorStrategy; +import org.sonar.api.impl.fs.SensorStrategy; import org.sonar.api.batch.sensor.Sensor; import org.sonar.scanner.bootstrap.ScannerPluginRepository; -import org.sonar.scanner.fs.DefaultInputModule; +import org.sonar.api.impl.fs.DefaultInputModule; import org.sonar.scanner.fs.InputModuleHierarchy; -import org.sonar.scanner.fs.TestInputFileBuilder; +import org.sonar.api.impl.fs.TestInputFileBuilder; import org.sonar.scanner.sensor.ModuleSensorExtensionDictionnary; import org.sonar.scanner.sensor.ModuleSensorWrapper; import org.sonar.scanner.sensor.ModuleSensorsExecutor; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/phases/ProjectCoverageExclusionsTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/phases/ProjectCoverageExclusionsTest.java index a225093a650..f95fa930015 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/phases/ProjectCoverageExclusionsTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/phases/ProjectCoverageExclusionsTest.java @@ -25,8 +25,8 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.sonar.api.CoreProperties; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.TestInputFileBuilder; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.TestInputFileBuilder; import org.sonar.scanner.scan.ProjectConfiguration; import org.sonar.scanner.scan.filesystem.ProjectCoverageAndDuplicationExclusions; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/platform/DefaultServerTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/platform/DefaultServerTest.java index a9283aa8590..d34cfb43c12 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/platform/DefaultServerTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/platform/DefaultServerTest.java @@ -24,10 +24,10 @@ import org.junit.Test; import org.sonar.api.CoreProperties; import org.sonar.api.SonarQubeSide; import org.sonar.api.config.Settings; -import org.sonar.api.config.internal.MapSettings; -import org.sonar.api.internal.SonarRuntimeImpl; +import org.sonar.api.impl.config.MapSettings; +import org.sonar.api.impl.context.SonarRuntimeImpl; import org.sonar.api.utils.Version; -import org.sonar.scanner.bootstrap.ScannerWsClient; +import org.sonar.scanner.bootstrap.DefaultScannerWsClient; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -40,7 +40,7 @@ public class DefaultServerTest { Settings settings = new MapSettings(); settings.setProperty(CoreProperties.SERVER_ID, "123"); settings.setProperty(CoreProperties.SERVER_STARTTIME, "2010-05-18T17:59:00+0000"); - ScannerWsClient client = mock(ScannerWsClient.class); + DefaultScannerWsClient client = mock(DefaultScannerWsClient.class); when(client.baseUrl()).thenReturn("http://foo.com"); DefaultServer metadata = new DefaultServer(((MapSettings) settings).asConfig(), client, @@ -61,7 +61,7 @@ public class DefaultServerTest { @Test public void publicRootUrl() { Settings settings = new MapSettings(); - ScannerWsClient client = mock(ScannerWsClient.class); + DefaultScannerWsClient client = mock(DefaultScannerWsClient.class); when(client.baseUrl()).thenReturn("http://foo.com/"); DefaultServer metadata = new DefaultServer(((MapSettings) settings).asConfig(), client, null); @@ -76,7 +76,7 @@ public class DefaultServerTest { public void invalid_startup_date_throws_exception() { Settings settings = new MapSettings(); settings.setProperty(CoreProperties.SERVER_STARTTIME, "invalid"); - ScannerWsClient client = mock(ScannerWsClient.class); + DefaultScannerWsClient client = mock(DefaultScannerWsClient.class); DefaultServer metadata = new DefaultServer(((MapSettings) settings).asConfig(), client, null); metadata.getStartedAt(); } diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/postjob/DefaultPostJobContextTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/postjob/DefaultPostJobContextTest.java index 6399495c410..27a4f7bbd9e 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/postjob/DefaultPostJobContextTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/postjob/DefaultPostJobContextTest.java @@ -23,7 +23,7 @@ import java.io.IOException; import org.junit.Before; import org.junit.Test; import org.sonar.api.batch.AnalysisMode; -import org.sonar.api.config.internal.MapSettings; +import org.sonar.api.impl.config.MapSettings; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/postjob/PostJobOptimizerTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/postjob/PostJobOptimizerTest.java index 1b604e11b6e..c10ffd5c237 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/postjob/PostJobOptimizerTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/postjob/PostJobOptimizerTest.java @@ -23,7 +23,8 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.sonar.api.config.internal.MapSettings; +import org.sonar.api.impl.config.MapSettings; +import org.sonar.api.impl.sensor.DefaultPostJobDescriptor; import static org.assertj.core.api.Assertions.assertThat; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ActiveRulesPublisherTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ActiveRulesPublisherTest.java index 6293696adc4..2dce5ea7730 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ActiveRulesPublisherTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ActiveRulesPublisherTest.java @@ -24,8 +24,8 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.sonar.api.batch.rule.ActiveRules; -import org.sonar.scanner.rule.DefaultActiveRules; -import org.sonar.scanner.rule.NewActiveRule; +import org.sonar.api.impl.rule.DefaultActiveRules; +import org.sonar.api.batch.rule.NewActiveRule; import org.sonar.api.rule.RuleKey; import org.sonar.core.util.CloseableIterator; import org.sonar.scanner.protocol.Constants; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/AnalysisContextReportPublisherTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/AnalysisContextReportPublisherTest.java index f795cf97408..5299672f6fd 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/AnalysisContextReportPublisherTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/AnalysisContextReportPublisherTest.java @@ -38,7 +38,7 @@ import org.sonar.api.utils.log.LoggerLevel; import org.sonar.core.platform.PluginInfo; import org.sonar.scanner.bootstrap.GlobalServerSettings; import org.sonar.scanner.bootstrap.ScannerPluginRepository; -import org.sonar.scanner.fs.DefaultInputModule; +import org.sonar.api.impl.fs.DefaultInputModule; import org.sonar.scanner.fs.InputModuleHierarchy; import org.sonar.scanner.protocol.output.ScannerReportWriter; import org.sonar.scanner.scan.ProjectServerSettings; @@ -148,66 +148,6 @@ public class AnalysisContextReportPublisherTest { } @Test - public void shouldNotDumpSQPropsInSystemProps() throws Exception { - logTester.setLevel(LoggerLevel.DEBUG); - ScannerReportWriter writer = new ScannerReportWriter(temp.newFolder()); - Properties props = new Properties(); - props.setProperty(COM_FOO, "bar"); - props.setProperty(SONAR_SKIP, "true"); - when(system2.properties()).thenReturn(props); - DefaultInputModule rootModule = new DefaultInputModule(ProjectDefinition.create() - .setBaseDir(temp.newFolder()) - .setWorkDir(temp.newFolder()) - .setProperty("sonar.projectKey", "foo") - .setProperty(COM_FOO, "bar") - .setProperty(SONAR_SKIP, "true")); - when(store.allModules()).thenReturn(singletonList(rootModule)); - when(hierarchy.root()).thenReturn(rootModule); - - publisher.init(writer); - - List<String> lines = FileUtils.readLines(writer.getFileStructure().analysisLog(), StandardCharsets.UTF_8); - assertThat(lines).containsExactly("Environment variables:", - "System properties:", - " - com.foo=bar", - "SonarQube plugins:", - "Global server settings:", - "Project server settings:", - "Project scanner properties:", - " - sonar.projectKey=foo", - " - sonar.skip=true"); - } - - @Test - public void shouldNotDumpEnvTwice() throws Exception { - logTester.setLevel(LoggerLevel.DEBUG); - ScannerReportWriter writer = new ScannerReportWriter(temp.newFolder()); - - Map<String, String> env = new HashMap<>(); - env.put(FOO, "BAR"); - env.put(BIZ, "BAZ"); - when(system2.envVariables()).thenReturn(env); - DefaultInputModule rootModule = new DefaultInputModule(ProjectDefinition.create() - .setBaseDir(temp.newFolder()) - .setWorkDir(temp.newFolder()) - .setProperty("sonar.projectKey", "foo") - .setProperty("env." + FOO, "BAR")); - when(store.allModules()).thenReturn(singletonList(rootModule)); - when(hierarchy.root()).thenReturn(rootModule); - publisher.init(writer); - - String content = FileUtils.readFileToString(writer.getFileStructure().analysisLog(), StandardCharsets.UTF_8); - assertThat(content).containsOnlyOnce(FOO); - assertThat(content).containsOnlyOnce(BIZ); - assertThat(content).containsSubsequence(BIZ, FOO); - - content = FileUtils.readFileToString(writer.getFileStructure().analysisLog(), StandardCharsets.UTF_8); - assertThat(content).containsOnlyOnce(FOO); - assertThat(content).containsOnlyOnce(BIZ); - assertThat(content).doesNotContain("env." + FOO); - } - - @Test public void shouldNotDumpSensitiveModuleProperties() throws Exception { ScannerReportWriter writer = new ScannerReportWriter(temp.newFolder()); DefaultInputModule rootModule = new DefaultInputModule(ProjectDefinition.create() diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ChangedLinesPublisherTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ChangedLinesPublisherTest.java index 18ce32fab0a..d3b7a0b4936 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ChangedLinesPublisherTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ChangedLinesPublisherTest.java @@ -31,10 +31,10 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.sonar.api.batch.scm.ScmProvider; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.DefaultInputProject; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputProject; import org.sonar.scanner.fs.InputModuleHierarchy; -import org.sonar.scanner.fs.TestInputFileBuilder; +import org.sonar.api.impl.fs.TestInputFileBuilder; import org.sonar.scanner.protocol.output.ScannerReportReader; import org.sonar.scanner.protocol.output.ScannerReportWriter; import org.sonar.scanner.scan.branch.BranchConfiguration; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ComponentsPublisherTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ComponentsPublisherTest.java index b812747c692..0561c6076e3 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ComponentsPublisherTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ComponentsPublisherTest.java @@ -33,9 +33,9 @@ import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.InputFile.Type; import org.sonar.api.utils.DateUtils; import org.sonar.scanner.ProjectInfo; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.DefaultInputProject; -import org.sonar.scanner.fs.TestInputFileBuilder; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputProject; +import org.sonar.api.impl.fs.TestInputFileBuilder; import org.sonar.scanner.protocol.output.FileStructure; import org.sonar.scanner.protocol.output.ScannerReport; import org.sonar.scanner.protocol.output.ScannerReport.Component; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/MetadataPublisherTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/MetadataPublisherTest.java index 3eb07e5e945..9bbe982e9fc 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/MetadataPublisherTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/MetadataPublisherTest.java @@ -44,9 +44,9 @@ import org.sonar.scanner.ProjectInfo; import org.sonar.scanner.bootstrap.ScannerPlugin; import org.sonar.scanner.bootstrap.ScannerPluginRepository; import org.sonar.scanner.cpd.CpdSettings; -import org.sonar.scanner.fs.DefaultInputModule; +import org.sonar.api.impl.fs.DefaultInputModule; import org.sonar.scanner.fs.InputModuleHierarchy; -import org.sonar.scanner.fs.TestInputFileBuilder; +import org.sonar.api.impl.fs.TestInputFileBuilder; import org.sonar.scanner.protocol.output.ScannerReport; import org.sonar.scanner.protocol.output.ScannerReportReader; import org.sonar.scanner.protocol.output.ScannerReportWriter; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ReportPublisherTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ReportPublisherTest.java index 3c7893722ad..e81e23e2f3b 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ReportPublisherTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/ReportPublisherTest.java @@ -40,8 +40,8 @@ import org.sonar.api.utils.TempFolder; import org.sonar.api.utils.log.LogTester; import org.sonar.api.utils.log.LoggerLevel; import org.sonar.scanner.bootstrap.GlobalAnalysisMode; -import org.sonar.scanner.bootstrap.ScannerWsClient; -import org.sonar.scanner.fs.DefaultInputModule; +import org.sonar.scanner.bootstrap.DefaultScannerWsClient; +import org.sonar.api.impl.fs.DefaultInputModule; import org.sonar.scanner.fs.InputModuleHierarchy; import org.sonar.scanner.scan.ScanProperties; import org.sonar.scanner.scan.branch.BranchConfiguration; @@ -73,7 +73,7 @@ public class ReportPublisherTest { GlobalAnalysisMode mode = mock(GlobalAnalysisMode.class); ScanProperties properties = mock(ScanProperties.class); - ScannerWsClient wsClient = mock(ScannerWsClient.class, Mockito.RETURNS_DEEP_STUBS); + DefaultScannerWsClient wsClient = mock(DefaultScannerWsClient.class, Mockito.RETURNS_DEEP_STUBS); Server server = mock(Server.class); InputModuleHierarchy moduleHierarchy = mock(InputModuleHierarchy.class); DefaultInputModule root; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/SourcePublisherTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/SourcePublisherTest.java index 835e423f9ee..e1239caab09 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/SourcePublisherTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/report/SourcePublisherTest.java @@ -27,9 +27,9 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.DefaultInputProject; -import org.sonar.scanner.fs.TestInputFileBuilder; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputProject; +import org.sonar.api.impl.fs.TestInputFileBuilder; import org.sonar.scanner.protocol.output.ScannerReportWriter; import org.sonar.scanner.scan.branch.BranchConfiguration; import org.sonar.scanner.scan.filesystem.InputComponentStore; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/DefaultMetricsRepositoryLoaderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/DefaultMetricsRepositoryLoaderTest.java index 5bf58615061..7b21c92e5a8 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/DefaultMetricsRepositoryLoaderTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/DefaultMetricsRepositoryLoaderTest.java @@ -28,7 +28,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.sonar.scanner.WsTestUtil; -import org.sonar.scanner.bootstrap.ScannerWsClient; +import org.sonar.scanner.bootstrap.DefaultScannerWsClient; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -40,7 +40,7 @@ import static org.mockito.Mockito.when; public class DefaultMetricsRepositoryLoaderTest { private static final String WS_URL = "/api/metrics/search?f=name,description,direction,qualitative,custom&ps=500&p="; - private ScannerWsClient wsClient; + private DefaultScannerWsClient wsClient; private DefaultMetricsRepositoryLoader metricsRepositoryLoader; @Rule @@ -48,7 +48,7 @@ public class DefaultMetricsRepositoryLoaderTest { @Before public void setUp() throws IOException { - wsClient = mock(ScannerWsClient.class); + wsClient = mock(DefaultScannerWsClient.class); WsTestUtil.mockReader(wsClient, WS_URL + "1", new StringReader(IOUtils.toString(this.getClass().getResourceAsStream("DefaultMetricsRepositoryLoaderTest/page1.json")))); WsTestUtil.mockReader(wsClient, WS_URL + "2", new StringReader(IOUtils.toString(this.getClass().getResourceAsStream("DefaultMetricsRepositoryLoaderTest/page2.json")))); metricsRepositoryLoader = new DefaultMetricsRepositoryLoader(wsClient); diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/DefaultProjectRepositoriesLoaderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/DefaultProjectRepositoriesLoaderTest.java index f2888be4c65..567079db585 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/DefaultProjectRepositoriesLoaderTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/DefaultProjectRepositoriesLoaderTest.java @@ -31,8 +31,8 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.sonar.api.utils.MessageException; import org.sonar.scanner.WsTestUtil; -import org.sonar.scanner.bootstrap.ScannerWsClient; -import org.sonar.scanner.fs.DefaultInputFile; +import org.sonar.scanner.bootstrap.DefaultScannerWsClient; +import org.sonar.api.impl.fs.DefaultInputFile; import org.sonarqube.ws.Batch.WsProjectResponse; import org.sonarqube.ws.client.HttpException; import org.sonarqube.ws.client.WsRequest; @@ -49,11 +49,11 @@ public class DefaultProjectRepositoriesLoaderTest { public ExpectedException thrown = ExpectedException.none(); private DefaultProjectRepositoriesLoader loader; - private ScannerWsClient wsClient; + private DefaultScannerWsClient wsClient; @Before public void prepare() throws IOException { - wsClient = mock(ScannerWsClient.class); + wsClient = mock(DefaultScannerWsClient.class); InputStream is = mockData(); WsTestUtil.mockStream(wsClient, "/batch/project.protobuf?key=foo%3F", is); loader = new DefaultProjectRepositoriesLoader(wsClient); diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/DefaultQualityProfileLoaderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/DefaultQualityProfileLoaderTest.java index 95e38e4520e..edfc14e5bd6 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/DefaultQualityProfileLoaderTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/DefaultQualityProfileLoaderTest.java @@ -29,7 +29,7 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.sonar.api.utils.MessageException; import org.sonar.scanner.WsTestUtil; -import org.sonar.scanner.bootstrap.ScannerWsClient; +import org.sonar.scanner.bootstrap.DefaultScannerWsClient; import org.sonar.scanner.scan.ScanProperties; import org.sonarqube.ws.Qualityprofiles; import org.sonarqube.ws.Qualityprofiles.SearchWsResponse.QualityProfile; @@ -43,7 +43,7 @@ public class DefaultQualityProfileLoaderTest { @Rule public ExpectedException exception = ExpectedException.none(); - private ScannerWsClient wsClient = mock(ScannerWsClient.class); + private DefaultScannerWsClient wsClient = mock(DefaultScannerWsClient.class); private ScanProperties properties = mock(ScanProperties.class); private DefaultQualityProfileLoader underTest = new DefaultQualityProfileLoader(properties, wsClient); diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/settings/DefaultGlobalSettingsLoaderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/settings/DefaultGlobalSettingsLoaderTest.java index aff5f0fcc3c..0a1f91e9429 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/settings/DefaultGlobalSettingsLoaderTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/settings/DefaultGlobalSettingsLoaderTest.java @@ -25,7 +25,7 @@ import java.io.PipedOutputStream; import java.util.Map; import org.junit.Test; import org.mockito.ArgumentCaptor; -import org.sonar.scanner.bootstrap.ScannerWsClient; +import org.sonar.scanner.bootstrap.DefaultScannerWsClient; import org.sonarqube.ws.Settings; import org.sonarqube.ws.client.GetRequest; import org.sonarqube.ws.client.WsResponse; @@ -39,7 +39,7 @@ import static org.mockito.Mockito.when; public class DefaultGlobalSettingsLoaderTest { - private ScannerWsClient wsClient = mock(ScannerWsClient.class); + private DefaultScannerWsClient wsClient = mock(DefaultScannerWsClient.class); private DefaultGlobalSettingsLoader underTest = new DefaultGlobalSettingsLoader(wsClient); @Test diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/settings/DefaultProjectSettingsLoaderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/settings/DefaultProjectSettingsLoaderTest.java index a9163f56bb3..125e7bd74ee 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/settings/DefaultProjectSettingsLoaderTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/repository/settings/DefaultProjectSettingsLoaderTest.java @@ -26,7 +26,7 @@ import java.util.Map; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.sonar.scanner.bootstrap.ProcessedScannerProperties; -import org.sonar.scanner.bootstrap.ScannerWsClient; +import org.sonar.scanner.bootstrap.DefaultScannerWsClient; import org.sonarqube.ws.Settings; import org.sonarqube.ws.client.GetRequest; import org.sonarqube.ws.client.WsResponse; @@ -40,7 +40,7 @@ import static org.mockito.Mockito.when; public class DefaultProjectSettingsLoaderTest { - private ScannerWsClient wsClient = mock(org.sonar.scanner.bootstrap.ScannerWsClient.class); + private DefaultScannerWsClient wsClient = mock(DefaultScannerWsClient.class); private ProcessedScannerProperties properties = mock(ProcessedScannerProperties.class); private DefaultProjectSettingsLoader underTest = new DefaultProjectSettingsLoader(wsClient, properties); diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/ActiveRulesBuilderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/ActiveRulesBuilderTest.java index e892510d046..c48b0dc8aeb 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/ActiveRulesBuilderTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/ActiveRulesBuilderTest.java @@ -24,6 +24,8 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.sonar.api.batch.rule.ActiveRule; import org.sonar.api.batch.rule.ActiveRules; +import org.sonar.api.impl.rule.ActiveRulesBuilder; +import org.sonar.api.batch.rule.NewActiveRule; import org.sonar.api.rule.RuleKey; import org.sonar.api.rule.Severity; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/ActiveRulesProviderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/ActiveRulesProviderTest.java index 2773208a00f..4a8851ded6c 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/ActiveRulesProviderTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/ActiveRulesProviderTest.java @@ -30,6 +30,7 @@ import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.sonar.api.batch.rule.ActiveRules; +import org.sonar.api.batch.rule.LoadedActiveRule; import org.sonar.api.rule.RuleKey; import org.sonar.api.utils.DateUtils; import org.sonarqube.ws.Qualityprofiles.SearchWsResponse.QualityProfile; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/DefaultActiveRulesLoaderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/DefaultActiveRulesLoaderTest.java index ad46a6851ed..0dd61ad9ccf 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/DefaultActiveRulesLoaderTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/DefaultActiveRulesLoaderTest.java @@ -26,10 +26,11 @@ import java.util.Collection; import java.util.stream.IntStream; import org.junit.Before; import org.junit.Test; +import org.sonar.api.batch.rule.LoadedActiveRule; import org.sonar.api.rule.RuleKey; import org.sonar.api.rule.Severity; import org.sonar.scanner.WsTestUtil; -import org.sonar.scanner.bootstrap.ScannerWsClient; +import org.sonar.scanner.bootstrap.DefaultScannerWsClient; import org.sonar.scanner.scan.branch.BranchConfiguration; import org.sonarqube.ws.Rules; import org.sonarqube.ws.Rules.Active; @@ -54,11 +55,11 @@ public class DefaultActiveRulesLoaderTest { private static final String SEVERITY_VALUE = Severity.MINOR; private DefaultActiveRulesLoader loader; - private ScannerWsClient wsClient; + private DefaultScannerWsClient wsClient; @Before public void setUp() { - wsClient = mock(ScannerWsClient.class); + wsClient = mock(DefaultScannerWsClient.class); BranchConfiguration branchConfig = mock(BranchConfiguration.class); when(branchConfig.isShortOrPullRequest()).thenReturn(false); loader = new DefaultActiveRulesLoader(wsClient); diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/DefaultRulesLoaderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/DefaultRulesLoaderTest.java index b2d06f19442..b614d456fbe 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/DefaultRulesLoaderTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/DefaultRulesLoaderTest.java @@ -27,7 +27,7 @@ import java.util.List; import org.junit.Test; import org.junit.rules.ExpectedException; import org.sonar.scanner.WsTestUtil; -import org.sonar.scanner.bootstrap.ScannerWsClient; +import org.sonar.scanner.bootstrap.DefaultScannerWsClient; import org.sonarqube.ws.Rules.ListResponse.Rule; import static org.assertj.core.api.Assertions.assertThat; @@ -39,7 +39,7 @@ public class DefaultRulesLoaderTest { @Test public void testParseServerResponse() throws IOException { - ScannerWsClient wsClient = mock(ScannerWsClient.class); + DefaultScannerWsClient wsClient = mock(DefaultScannerWsClient.class); InputStream is = Resources.asByteSource(this.getClass().getResource("DefaultRulesLoaderTest/response.protobuf")).openBufferedStream(); WsTestUtil.mockStream(wsClient, is); DefaultRulesLoader loader = new DefaultRulesLoader(wsClient); @@ -49,7 +49,7 @@ public class DefaultRulesLoaderTest { @Test public void testError() throws IOException { - ScannerWsClient wsClient = mock(ScannerWsClient.class); + DefaultScannerWsClient wsClient = mock(DefaultScannerWsClient.class); InputStream is = ByteSource.wrap(new String("trash").getBytes()).openBufferedStream(); WsTestUtil.mockStream(wsClient, is); DefaultRulesLoader loader = new DefaultRulesLoader(wsClient); diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/DefaultRulesTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/DefaultRulesTest.java deleted file mode 100644 index 3beb53fcc04..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/DefaultRulesTest.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.rule; - -import org.sonar.api.rule.RuleKey; -import org.junit.Test; - -import java.util.LinkedList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -public class DefaultRulesTest { - @Test - public void testRepeatedInternalKey() { - List<NewRule> newRules = new LinkedList<>(); - newRules.add(createRule("key1", "repo", "internal")); - newRules.add(createRule("key2", "repo", "internal")); - - DefaultRules rules = new DefaultRules(newRules); - assertThat(rules.findByInternalKey("repo", "internal")).hasSize(2); - assertThat(rules.find(RuleKey.of("repo", "key1"))).isNotNull(); - assertThat(rules.find(RuleKey.of("repo", "key2"))).isNotNull(); - assertThat(rules.findByRepository("repo")).hasSize(2); - } - - @Test - public void testNonExistingKey() { - List<NewRule> newRules = new LinkedList<>(); - newRules.add(createRule("key1", "repo", "internal")); - newRules.add(createRule("key2", "repo", "internal")); - - DefaultRules rules = new DefaultRules(newRules); - assertThat(rules.findByInternalKey("xx", "xx")).hasSize(0); - assertThat(rules.find(RuleKey.of("xxx", "xx"))).isNull(); - assertThat(rules.findByRepository("xxxx")).hasSize(0); - } - - @Test - public void testRepeatedRule() { - List<NewRule> newRules = new LinkedList<>(); - newRules.add(createRule("key", "repo", "internal")); - newRules.add(createRule("key", "repo", "internal")); - - DefaultRules rules = new DefaultRules(newRules); - assertThat(rules.find(RuleKey.of("repo", "key"))).isNotNull(); - } - - private NewRule createRule(String key, String repo, String internalKey) { - RuleKey ruleKey = RuleKey.of(repo, key); - NewRule newRule = new NewRule(ruleKey); - newRule.setInternalKey(internalKey); - - return newRule; - } -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/NewActiveRuleTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/NewActiveRuleTest.java deleted file mode 100644 index a3a4e40393d..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/NewActiveRuleTest.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.rule; - -import com.google.common.collect.ImmutableMap; -import org.junit.Before; -import org.junit.Test; -import org.sonar.api.rule.RuleKey; -import org.sonar.api.rule.Severity; - -import static org.assertj.core.api.Assertions.assertThat; - -public class NewActiveRuleTest { - - private NewActiveRule.Builder builder; - - @Before - public void setBuilder() { - builder = new NewActiveRule.Builder(); - } - - @Test - public void builder_should_set_every_param() { - NewActiveRule rule = builder - .setRuleKey(RuleKey.of("foo", "bar")) - .setName("name") - .setSeverity(Severity.CRITICAL) - .setParam("key", "value") - .setCreatedAt(1_000L) - .setUpdatedAt(1_000L) - .setInternalKey("internal_key") - .setLanguage("language") - .setTemplateRuleKey("templateRuleKey") - .setQProfileKey("qProfileKey") - .build(); - - assertThat(rule.ruleKey).isEqualTo(RuleKey.of("foo", "bar")); - assertThat(rule.name).isEqualTo("name"); - assertThat(rule.severity).isEqualTo(Severity.CRITICAL); - assertThat(rule.params).isEqualTo(ImmutableMap.of("key", "value")); - assertThat(rule.createdAt).isEqualTo(1_000L); - assertThat(rule.updatedAt).isEqualTo(1_000L); - assertThat(rule.internalKey).isEqualTo("internal_key"); - assertThat(rule.language).isEqualTo("language"); - assertThat(rule.templateRuleKey).isEqualTo("templateRuleKey"); - assertThat(rule.qProfileKey).isEqualTo("qProfileKey"); - } - - @Test - public void severity_should_have_default_value() { - NewActiveRule rule = builder.build(); - assertThat(rule.severity).isEqualTo(Severity.defaultSeverity()); - } - - @Test - public void params_should_be_empty_map_if_no_params() { - NewActiveRule rule = builder.build(); - assertThat(rule.params).isEqualTo(ImmutableMap.of()); - } - - @Test - public void set_param_remove_param_if_value_is_null() { - NewActiveRule rule = builder - .setParam("foo", "bar") - .setParam("removed", "value") - .setParam("removed", null) - .build(); - assertThat(rule.params).isEqualTo(ImmutableMap.of("foo", "bar")); - } -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/QProfileVerifierTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/QProfileVerifierTest.java index f7a64f06b63..e81930bf234 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/QProfileVerifierTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/QProfileVerifierTest.java @@ -24,7 +24,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.slf4j.Logger; -import org.sonar.scanner.fs.TestInputFileBuilder; +import org.sonar.api.impl.fs.TestInputFileBuilder; import org.sonar.scanner.scan.branch.BranchConfiguration; import org.sonar.scanner.scan.filesystem.InputComponentStore; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/RulesBuilderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/RulesBuilderTest.java deleted file mode 100644 index 1bb2375bc21..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/rule/RulesBuilderTest.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.rule; - -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.sonar.api.batch.rule.Rule; -import org.sonar.api.batch.rule.Rules; -import org.sonar.api.rule.RuleKey; -import org.sonar.api.rule.RuleStatus; -import org.sonar.api.rule.Severity; - -import static org.assertj.core.api.Assertions.assertThat; - -public class RulesBuilderTest { - @org.junit.Rule - public ExpectedException thrown = ExpectedException.none(); - - @Test - public void no_rules() { - RulesBuilder builder = new RulesBuilder(); - Rules rules = builder.build(); - assertThat(rules.findAll()).isEmpty(); - } - - @Test - public void build_rules() { - RulesBuilder builder = new RulesBuilder(); - NewRule newSquid1 = builder.add(RuleKey.of("squid", "S0001")); - newSquid1.setName("Detect bug"); - newSquid1.setDescription("Detect potential bug"); - newSquid1.setInternalKey("foo=bar"); - newSquid1.setSeverity(Severity.CRITICAL); - newSquid1.setStatus(RuleStatus.BETA); - newSquid1.addParam("min"); - newSquid1.addParam("max").setDescription("Maximum"); - // most simple rule - builder.add(RuleKey.of("squid", "S0002")); - builder.add(RuleKey.of("findbugs", "NPE")); - - Rules rules = builder.build(); - - assertThat(rules.findAll()).hasSize(3); - assertThat(rules.findByRepository("squid")).hasSize(2); - assertThat(rules.findByRepository("findbugs")).hasSize(1); - assertThat(rules.findByRepository("unknown")).isEmpty(); - - Rule squid1 = rules.find(RuleKey.of("squid", "S0001")); - assertThat(squid1.key().repository()).isEqualTo("squid"); - assertThat(squid1.key().rule()).isEqualTo("S0001"); - assertThat(squid1.name()).isEqualTo("Detect bug"); - assertThat(squid1.description()).isEqualTo("Detect potential bug"); - assertThat(squid1.internalKey()).isEqualTo("foo=bar"); - assertThat(squid1.status()).isEqualTo(RuleStatus.BETA); - assertThat(squid1.severity()).isEqualTo(Severity.CRITICAL); - assertThat(squid1.params()).hasSize(2); - assertThat(squid1.param("min").key()).isEqualTo("min"); - assertThat(squid1.param("min").description()).isNull(); - assertThat(squid1.param("max").key()).isEqualTo("max"); - assertThat(squid1.param("max").description()).isEqualTo("Maximum"); - - Rule squid2 = rules.find(RuleKey.of("squid", "S0002")); - assertThat(squid2.key().repository()).isEqualTo("squid"); - assertThat(squid2.key().rule()).isEqualTo("S0002"); - assertThat(squid2.description()).isNull(); - assertThat(squid2.internalKey()).isNull(); - assertThat(squid2.status()).isEqualTo(RuleStatus.defaultStatus()); - assertThat(squid2.severity()).isEqualTo(Severity.defaultSeverity()); - assertThat(squid2.params()).isEmpty(); - } - - @Test - public void fail_to_add_twice_the_same_rule() { - RulesBuilder builder = new RulesBuilder(); - builder.add(RuleKey.of("squid", "S0001")); - - thrown.expect(IllegalStateException.class); - thrown.expectMessage("Rule 'squid:S0001' already exists"); - - builder.add(RuleKey.of("squid", "S0001")); - } - - @Test - public void fail_to_add_twice_the_same_param() { - RulesBuilder builder = new RulesBuilder(); - NewRule newRule = builder.add(RuleKey.of("squid", "S0001")); - newRule.addParam("min"); - newRule.addParam("max"); - - thrown.expect(IllegalStateException.class); - thrown.expectMessage("Parameter 'min' already exists on rule 'squid:S0001'"); - - newRule.addParam("min"); - } -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/DefaultInputModuleHierarchyTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/DefaultInputModuleHierarchyTest.java index aadf37e6a75..1bdce821151 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/DefaultInputModuleHierarchyTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/DefaultInputModuleHierarchyTest.java @@ -28,7 +28,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.sonar.api.batch.bootstrap.ProjectDefinition; -import org.sonar.scanner.fs.DefaultInputModule; +import org.sonar.api.impl.fs.DefaultInputModule; import static org.assertj.core.api.Assertions.assertThat; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ModuleIndexerTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ModuleIndexerTest.java index 3c4cb6ffb15..18da6ddf5bf 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ModuleIndexerTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ModuleIndexerTest.java @@ -22,7 +22,7 @@ package org.sonar.scanner.scan; import java.util.Arrays; import org.junit.Test; import org.sonar.api.batch.bootstrap.ProjectDefinition; -import org.sonar.scanner.fs.DefaultInputModule; +import org.sonar.api.impl.fs.DefaultInputModule; import org.sonar.scanner.scan.branch.BranchConfiguration; import org.sonar.scanner.scan.filesystem.InputComponentStore; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectLockTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectLockTest.java index 12f20933bdb..9ebc2cea34e 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectLockTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ProjectLockTest.java @@ -29,7 +29,7 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import org.sonar.api.batch.bootstrap.ProjectDefinition; -import org.sonar.scanner.fs.DefaultInputProject; +import org.sonar.api.impl.fs.DefaultInputProject; import static org.assertj.core.api.Assertions.assertThat; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ScanPropertiesTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ScanPropertiesTest.java index a2622ae4cbd..7241ab7b03a 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ScanPropertiesTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/ScanPropertiesTest.java @@ -27,9 +27,9 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; -import org.sonar.api.config.internal.MapSettings; +import org.sonar.api.impl.config.MapSettings; import org.sonar.api.utils.MessageException; -import org.sonar.scanner.fs.DefaultInputProject; +import org.sonar.api.impl.fs.DefaultInputProject; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/WorkDirectoriesInitializerTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/WorkDirectoriesInitializerTest.java index ba5aedb451f..19797c845bd 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/WorkDirectoriesInitializerTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/WorkDirectoriesInitializerTest.java @@ -26,7 +26,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import org.sonar.scanner.fs.DefaultInputModule; +import org.sonar.api.impl.fs.DefaultInputModule; import org.sonar.scanner.fs.InputModuleHierarchy; import static org.assertj.core.api.Assertions.assertThat; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/AdditionalFilePredicatesTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/AdditionalFilePredicatesTest.java index 37775d19ae5..4974350faf7 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/AdditionalFilePredicatesTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/AdditionalFilePredicatesTest.java @@ -22,7 +22,7 @@ package org.sonar.scanner.scan.filesystem; import org.junit.Test; import org.sonar.api.batch.fs.FilePredicate; import org.sonar.api.batch.fs.InputFile; -import org.sonar.scanner.fs.TestInputFileBuilder; +import org.sonar.api.impl.fs.TestInputFileBuilder; import static org.assertj.core.api.Assertions.assertThat; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/InputComponentStoreTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/InputComponentStoreTest.java index e9365140bd2..709b5960b9f 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/InputComponentStoreTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/InputComponentStoreTest.java @@ -32,10 +32,10 @@ import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.InputFile.Status; import org.sonar.api.batch.fs.InputFile.Type; import org.sonar.api.batch.fs.InputPath; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.DefaultInputModule; -import org.sonar.scanner.fs.DefaultInputProject; -import org.sonar.scanner.fs.TestInputFileBuilder; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputModule; +import org.sonar.api.impl.fs.DefaultInputProject; +import org.sonar.api.impl.fs.TestInputFileBuilder; import org.sonar.scanner.scan.branch.BranchConfiguration; import static org.assertj.core.api.Assertions.assertThat; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/LanguageDetectionTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/LanguageDetectionTest.java index c924cb4c5e5..30a3a20d713 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/LanguageDetectionTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/LanguageDetectionTest.java @@ -27,8 +27,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; -import org.sonar.api.CoreProperties; -import org.sonar.api.config.internal.MapSettings; +import org.sonar.api.impl.config.MapSettings; import org.sonar.api.resources.Language; import org.sonar.api.resources.Languages; import org.sonar.api.utils.MessageException; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/MetadataGeneratorTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/MetadataGeneratorTest.java index 0682ccaf345..8ec05f3294e 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/MetadataGeneratorTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/MetadataGeneratorTest.java @@ -34,9 +34,9 @@ import org.mockito.MockitoAnnotations; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.notifications.AnalysisWarnings; import org.sonar.api.utils.PathUtils; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.FileMetadata; -import org.sonar.scanner.fs.TestInputFileBuilder; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.FileMetadata; +import org.sonar.api.impl.fs.TestInputFileBuilder; import org.sonar.scanner.issue.ignore.IgnoreIssuesFilter; import org.sonar.scanner.issue.ignore.pattern.IssueExclusionPatternInitializer; import org.sonar.scanner.issue.ignore.scanner.IssueExclusionsLoader; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/ModuleInputComponentStoreTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/ModuleInputComponentStoreTest.java index c624be2c6f1..57386cb65e9 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/ModuleInputComponentStoreTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/ModuleInputComponentStoreTest.java @@ -26,9 +26,9 @@ import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.InputModule; -import org.sonar.api.batch.fs.internal.SensorStrategy; -import org.sonar.scanner.fs.DefaultInputProject; -import org.sonar.scanner.fs.TestInputFileBuilder; +import org.sonar.api.impl.fs.SensorStrategy; +import org.sonar.api.impl.fs.DefaultInputProject; +import org.sonar.api.impl.fs.TestInputFileBuilder; import org.sonar.scanner.scan.branch.BranchConfiguration; import static org.assertj.core.api.Assertions.assertThat; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/ProjectExclusionFiltersTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/ProjectExclusionFiltersTest.java index 9f613f48ed7..af8c8156613 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/ProjectExclusionFiltersTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/ProjectExclusionFiltersTest.java @@ -30,8 +30,8 @@ import org.junit.rules.TemporaryFolder; import org.sonar.api.CoreProperties; import org.sonar.api.batch.fs.IndexedFile; import org.sonar.api.batch.fs.InputFile; -import org.sonar.scanner.fs.DefaultIndexedFile; -import org.sonar.api.config.internal.MapSettings; +import org.sonar.api.impl.fs.DefaultIndexedFile; +import org.sonar.api.impl.config.MapSettings; import static org.assertj.core.api.Assertions.assertThat; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/StatusDetectionTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/StatusDetectionTest.java index 167b4e33a9c..10fc2c68e1a 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/StatusDetectionTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scan/filesystem/StatusDetectionTest.java @@ -26,8 +26,8 @@ import java.util.Map; import org.junit.Before; import org.junit.Test; import org.sonar.api.batch.fs.InputFile; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.TestInputFileBuilder; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.TestInputFileBuilder; import org.sonar.scanner.repository.FileData; import org.sonar.scanner.repository.ProjectRepositoriesSupplier; import org.sonar.scanner.repository.SingleProjectRepository; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scm/DefaultBlameOutputTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scm/DefaultBlameOutputTest.java index a408dde4a41..5ea2bc5464c 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scm/DefaultBlameOutputTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scm/DefaultBlameOutputTest.java @@ -25,7 +25,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.sonar.api.batch.fs.InputFile; -import org.sonar.scanner.fs.TestInputFileBuilder; +import org.sonar.api.impl.fs.TestInputFileBuilder; import org.sonar.api.batch.scm.BlameLine; public class DefaultBlameOutputTest { diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scm/ScmChangedFilesProviderTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scm/ScmChangedFilesProviderTest.java index 681433767ff..6304dcbd82f 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/scm/ScmChangedFilesProviderTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/scm/ScmChangedFilesProviderTest.java @@ -29,7 +29,7 @@ import org.junit.rules.ExpectedException; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.sonar.api.batch.scm.ScmProvider; -import org.sonar.scanner.fs.DefaultInputProject; +import org.sonar.api.impl.fs.DefaultInputProject; import org.sonar.scanner.fs.InputModuleHierarchy; import org.sonar.scanner.scan.branch.BranchConfiguration; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultAdHocRuleTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultAdHocRuleTest.java deleted file mode 100644 index 44a53e7dbf9..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultAdHocRuleTest.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.sonar.api.batch.rule.Severity; -import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.api.batch.sensor.rule.NewAdHocRule; -import org.sonar.api.rules.RuleType; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; - -public class DefaultAdHocRuleTest { - - @Rule - public ExpectedException exception = ExpectedException.none(); - - @Test - public void store() { - SensorStorage storage = mock(SensorStorage.class); - DefaultAdHocRule rule = new DefaultAdHocRule(storage) - .engineId("engine") - .ruleId("ruleId") - .name("name") - .description("desc") - .severity(Severity.BLOCKER) - .type(RuleType.CODE_SMELL); - rule.save(); - - assertThat(rule.engineId()).isEqualTo("engine"); - assertThat(rule.ruleId()).isEqualTo("ruleId"); - assertThat(rule.name()).isEqualTo("name"); - assertThat(rule.description()).isEqualTo("desc"); - assertThat(rule.severity()).isEqualTo(Severity.BLOCKER); - assertThat(rule.type()).isEqualTo(RuleType.CODE_SMELL); - - verify(storage).store(any(DefaultAdHocRule.class)); - } - - - @Test - public void description_is_optional() { - SensorStorage storage = mock(SensorStorage.class); - new DefaultAdHocRule(storage) - .engineId("engine") - .ruleId("ruleId") - .name("name") - .severity(Severity.BLOCKER) - .type(RuleType.CODE_SMELL) - .save(); - - verify(storage).store(any(DefaultAdHocRule.class)); - } - - @Test - public void fail_to_store_if_no_engine_id() { - SensorStorage storage = mock(SensorStorage.class); - NewAdHocRule rule = new DefaultAdHocRule(storage) - .engineId(" ") - .ruleId("ruleId") - .name("name") - .description("desc") - .severity(Severity.BLOCKER) - .type(RuleType.CODE_SMELL); - - exception.expect(IllegalStateException.class); - exception.expectMessage("Engine id is mandatory"); - rule.save(); - } - - @Test - public void fail_to_store_if_no_rule_id() { - SensorStorage storage = mock(SensorStorage.class); - NewAdHocRule rule = new DefaultAdHocRule(storage) - .engineId("engine") - .ruleId(" ") - .name("name") - .description("desc") - .severity(Severity.BLOCKER) - .type(RuleType.CODE_SMELL); - - exception.expect(IllegalStateException.class); - exception.expectMessage("Rule id is mandatory"); - rule.save(); - } - - @Test - public void fail_to_store_if_no_name() { - SensorStorage storage = mock(SensorStorage.class); - NewAdHocRule rule = new DefaultAdHocRule(storage) - .engineId("engine") - .ruleId("ruleId") - .name(" ") - .description("desc") - .severity(Severity.BLOCKER) - .type(RuleType.CODE_SMELL); - - exception.expect(IllegalStateException.class); - exception.expectMessage("Name is mandatory"); - rule.save(); - } - - - @Test - public void fail_to_store_if_no_severity() { - SensorStorage storage = mock(SensorStorage.class); - NewAdHocRule rule = new DefaultAdHocRule(storage) - .engineId("engine") - .ruleId("ruleId") - .name("name") - .description("desc") - .type(RuleType.CODE_SMELL); - - exception.expect(IllegalStateException.class); - exception.expectMessage("Severity is mandatory"); - rule.save(); - } - - @Test - public void fail_to_store_if_no_type() { - SensorStorage storage = mock(SensorStorage.class); - NewAdHocRule rule = new DefaultAdHocRule(storage) - .engineId("engine") - .ruleId("ruleId") - .name("name") - .description("desc") - .severity(Severity.BLOCKER); - - exception.expect(IllegalStateException.class); - exception.expectMessage("Type is mandatory"); - rule.save(); - } - -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultAnalysisErrorTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultAnalysisErrorTest.java deleted file mode 100644 index afff924afdf..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultAnalysisErrorTest.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.TextPointer; -import org.sonar.api.batch.sensor.error.NewAnalysisError; -import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.scanner.fs.DefaultTextPointer; -import org.sonar.scanner.fs.TestInputFileBuilder; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; - -public class DefaultAnalysisErrorTest { - private InputFile inputFile; - private SensorStorage storage; - private TextPointer textPointer; - - @Rule - public ExpectedException exception = ExpectedException.none(); - - @Before - public void setUp() { - inputFile = new TestInputFileBuilder("module1", "src/File.java").build(); - textPointer = new DefaultTextPointer(5, 2); - storage = mock(SensorStorage.class); - } - - @Test - public void test_analysis_error() { - DefaultAnalysisError analysisError = new DefaultAnalysisError(storage); - analysisError.onFile(inputFile) - .at(textPointer) - .message("msg"); - - assertThat(analysisError.location()).isEqualTo(textPointer); - assertThat(analysisError.message()).isEqualTo("msg"); - assertThat(analysisError.inputFile()).isEqualTo(inputFile); - } - - @Test - public void test_save() { - DefaultAnalysisError analysisError = new DefaultAnalysisError(storage); - analysisError.onFile(inputFile).save(); - - verify(storage).store(analysisError); - verifyNoMoreInteractions(storage); - } - - @Test - public void test_no_storage() { - exception.expect(NullPointerException.class); - DefaultAnalysisError analysisError = new DefaultAnalysisError(); - analysisError.onFile(inputFile).save(); - } - - @Test - public void test_validation() { - try { - new DefaultAnalysisError(storage).onFile(null); - fail("Expected exception"); - } catch (IllegalArgumentException e) { - // expected - } - - NewAnalysisError error = new DefaultAnalysisError(storage).onFile(inputFile); - try { - error.onFile(inputFile); - fail("Expected exception"); - } catch (IllegalStateException e) { - // expected - } - - error = new DefaultAnalysisError(storage).at(textPointer); - try { - error.at(textPointer); - fail("Expected exception"); - } catch (IllegalStateException e) { - // expected - } - - try { - new DefaultAnalysisError(storage).save(); - fail("Expected exception"); - } catch (NullPointerException e) { - // expected - } - } -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultCpdTokensTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultCpdTokensTest.java deleted file mode 100644 index 7a559792723..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultCpdTokensTest.java +++ /dev/null @@ -1,170 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import org.junit.Test; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.TestInputFileBuilder; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.fail; -import static org.assertj.core.api.Assertions.tuple; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; - -public class DefaultCpdTokensTest { - private final SensorStorage sensorStorage = mock(SensorStorage.class); - - private final DefaultInputFile inputFile = new TestInputFileBuilder("foo", "src/Foo.java") - .setLines(2) - .setOriginalLineStartOffsets(new int[] {0, 50}) - .setOriginalLineEndOffsets(new int[] {49, 100}) - .setLastValidOffset(101) - .build(); - - @Test - public void save_no_tokens() { - DefaultCpdTokens tokens = new DefaultCpdTokens(sensorStorage) - .onFile(inputFile); - - tokens.save(); - - verify(sensorStorage).store(tokens); - - assertThat(tokens.inputFile()).isEqualTo(inputFile); - } - - @Test - public void save_one_token() { - DefaultCpdTokens tokens = new DefaultCpdTokens(sensorStorage) - .onFile(inputFile) - .addToken(inputFile.newRange(1, 2, 1, 5), "foo"); - - tokens.save(); - - verify(sensorStorage).store(tokens); - - assertThat(tokens.getTokenLines()).extracting("value", "startLine", "hashCode", "startUnit", "endUnit").containsExactly(tuple("foo", 1, "foo".hashCode(), 1, 1)); - } - - @Test - public void handle_exclusions() { - inputFile.setExcludedForDuplication(true); - DefaultCpdTokens tokens = new DefaultCpdTokens(sensorStorage) - .onFile(inputFile) - .addToken(inputFile.newRange(1, 2, 1, 5), "foo"); - - tokens.save(); - - verifyZeroInteractions(sensorStorage); - - assertThat(tokens.getTokenLines()).isEmpty(); - } - - @Test - public void dont_save_for_test_files() { - DefaultInputFile testInputFile = new TestInputFileBuilder("foo", "src/Foo.java") - .setLines(2) - .setOriginalLineStartOffsets(new int[] {0, 50}) - .setOriginalLineEndOffsets(new int[] {49, 100}) - .setLastValidOffset(101) - .setType(InputFile.Type.TEST) - .build(); - - DefaultCpdTokens tokens = new DefaultCpdTokens(sensorStorage) - .onFile(testInputFile) - .addToken(testInputFile.newRange(1, 2, 1, 5), "foo"); - - tokens.save(); - verifyZeroInteractions(sensorStorage); - assertThat(tokens.getTokenLines()).isEmpty(); - } - - @Test - public void save_many_tokens() { - DefaultCpdTokens tokens = new DefaultCpdTokens(sensorStorage) - .onFile(inputFile) - .addToken(inputFile.newRange(1, 2, 1, 5), "foo") - .addToken(inputFile.newRange(1, 6, 1, 10), "bar") - .addToken(inputFile.newRange(1, 20, 1, 25), "biz") - .addToken(inputFile.newRange(2, 1, 2, 10), "next"); - - tokens.save(); - - verify(sensorStorage).store(tokens); - - assertThat(tokens.getTokenLines()) - .extracting("value", "startLine", "hashCode", "startUnit", "endUnit") - .containsExactly( - tuple("foobarbiz", 1, "foobarbiz".hashCode(), 1, 3), - tuple("next", 2, "next".hashCode(), 4, 4)); - } - - @Test - public void basic_validation() { - SensorStorage sensorStorage = mock(SensorStorage.class); - DefaultCpdTokens tokens = new DefaultCpdTokens(sensorStorage); - try { - tokens.save(); - fail("Expected exception"); - } catch (Exception e) { - assertThat(e).hasMessage("Call onFile() first"); - } - try { - tokens.addToken(inputFile.newRange(1, 2, 1, 5), "foo"); - fail("Expected exception"); - } catch (Exception e) { - assertThat(e).hasMessage("Call onFile() first"); - } - try { - tokens.addToken(null, "foo"); - fail("Expected exception"); - } catch (Exception e) { - assertThat(e).hasMessage("Range should not be null"); - } - try { - tokens.addToken(inputFile.newRange(1, 2, 1, 5), null); - fail("Expected exception"); - } catch (Exception e) { - assertThat(e).hasMessage("Image should not be null"); - } - } - - @Test - public void validate_tokens_order() { - SensorStorage sensorStorage = mock(SensorStorage.class); - DefaultCpdTokens tokens = new DefaultCpdTokens(sensorStorage) - .onFile(inputFile) - .addToken(inputFile.newRange(1, 6, 1, 10), "bar"); - - try { - tokens.addToken(inputFile.newRange(1, 2, 1, 5), "foo"); - fail("Expected exception"); - } catch (Exception e) { - assertThat(e).hasMessage("Tokens of file src/Foo.java should be provided in order.\n" + - "Previous token: Range[from [line=1, lineOffset=6] to [line=1, lineOffset=10]]\n" + - "Last token: Range[from [line=1, lineOffset=2] to [line=1, lineOffset=5]]"); - } - } - -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultExternalIssueTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultExternalIssueTest.java deleted file mode 100644 index 0081480f466..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultExternalIssueTest.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import java.io.IOException; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.rules.TemporaryFolder; -import org.sonar.api.batch.bootstrap.ProjectDefinition; -import org.sonar.api.batch.fs.InputComponent; -import org.sonar.api.batch.rule.Severity; -import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.api.rule.RuleKey; -import org.sonar.api.rules.RuleType; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.DefaultInputProject; -import org.sonar.scanner.fs.TestInputFileBuilder; -import org.sonar.scanner.issue.DefaultIssueLocation; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; - -public class DefaultExternalIssueTest { - - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - - private DefaultInputProject project; - - @Before - public void setup() throws IOException { - project = new DefaultInputProject(ProjectDefinition.create() - .setKey("foo") - .setBaseDir(temp.newFolder()) - .setWorkDir(temp.newFolder())); - } - - @Rule - public ExpectedException exception = ExpectedException.none(); - - private DefaultInputFile inputFile = new TestInputFileBuilder("foo", "src/Foo.php") - .initMetadata("Foo\nBar\n") - .build(); - - @Test - public void build_file_issue() { - SensorStorage storage = mock(SensorStorage.class); - DefaultExternalIssue issue = new DefaultExternalIssue(project, storage) - .at(new DefaultIssueLocation() - .on(inputFile) - .at(inputFile.selectLine(1)) - .message("Wrong way!")) - .forRule(RuleKey.of("repo", "rule")) - .remediationEffortMinutes(10l) - .type(RuleType.BUG) - .severity(Severity.BLOCKER); - - assertThat(issue.primaryLocation().inputComponent()).isEqualTo(inputFile); - assertThat(issue.ruleKey()).isEqualTo(RuleKey.of("external_repo", "rule")); - assertThat(issue.engineId()).isEqualTo("repo"); - assertThat(issue.ruleId()).isEqualTo("rule"); - assertThat(issue.primaryLocation().textRange().start().line()).isEqualTo(1); - assertThat(issue.remediationEffort()).isEqualTo(10l); - assertThat(issue.type()).isEqualTo(RuleType.BUG); - assertThat(issue.severity()).isEqualTo(Severity.BLOCKER); - assertThat(issue.primaryLocation().message()).isEqualTo("Wrong way!"); - - issue.save(); - - verify(storage).store(issue); - } - - @Test - public void fail_to_store_if_no_type() { - SensorStorage storage = mock(SensorStorage.class); - DefaultExternalIssue issue = new DefaultExternalIssue(project, storage) - .at(new DefaultIssueLocation() - .on(inputFile) - .at(inputFile.selectLine(1)) - .message("Wrong way!")) - .forRule(RuleKey.of("repo", "rule")) - .remediationEffortMinutes(10l) - .severity(Severity.BLOCKER); - - exception.expect(IllegalStateException.class); - exception.expectMessage("Type is mandatory"); - issue.save(); - } - - @Test - public void fail_to_store_if_primary_location_is_not_a_file() { - SensorStorage storage = mock(SensorStorage.class); - DefaultExternalIssue issue = new DefaultExternalIssue(project, storage) - .at(new DefaultIssueLocation() - .on(mock(InputComponent.class)) - .message("Wrong way!")) - .forRule(RuleKey.of("repo", "rule")) - .remediationEffortMinutes(10l) - .severity(Severity.BLOCKER); - - exception.expect(IllegalStateException.class); - exception.expectMessage("External issues must be located in files"); - issue.save(); - } - - @Test - public void fail_to_store_if_primary_location_has_no_message() { - SensorStorage storage = mock(SensorStorage.class); - DefaultExternalIssue issue = new DefaultExternalIssue(project, storage) - .at(new DefaultIssueLocation() - .on(inputFile) - .at(inputFile.selectLine(1))) - .forRule(RuleKey.of("repo", "rule")) - .remediationEffortMinutes(10l) - .type(RuleType.BUG) - .severity(Severity.BLOCKER); - - exception.expect(IllegalStateException.class); - exception.expectMessage("External issues must have a message"); - issue.save(); - } - - @Test - public void fail_to_store_if_no_severity() { - SensorStorage storage = mock(SensorStorage.class); - DefaultExternalIssue issue = new DefaultExternalIssue(project, storage) - .at(new DefaultIssueLocation() - .on(inputFile) - .at(inputFile.selectLine(1)) - .message("Wrong way!")) - .forRule(RuleKey.of("repo", "rule")) - .remediationEffortMinutes(10l) - .type(RuleType.BUG); - - exception.expect(IllegalStateException.class); - exception.expectMessage("Severity is mandatory"); - issue.save(); - } - -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultHighlightingTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultHighlightingTest.java deleted file mode 100644 index f70f92dd982..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultHighlightingTest.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import java.util.Collection; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.TextRange; -import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.scanner.fs.DefaultTextPointer; -import org.sonar.scanner.fs.DefaultTextRange; -import org.sonar.scanner.fs.TestInputFileBuilder; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.sonar.api.batch.sensor.highlighting.TypeOfText.COMMENT; -import static org.sonar.api.batch.sensor.highlighting.TypeOfText.CPP_DOC; -import static org.sonar.api.batch.sensor.highlighting.TypeOfText.KEYWORD; - -public class DefaultHighlightingTest { - - private static final InputFile INPUT_FILE = new TestInputFileBuilder("foo", "src/Foo.java") - .setLines(2) - .setOriginalLineStartOffsets(new int[] {0, 50}) - .setOriginalLineEndOffsets(new int[] {49, 100}) - .setLastValidOffset(101) - .build(); - - private Collection<SyntaxHighlightingRule> highlightingRules; - - @Rule - public ExpectedException throwable = ExpectedException.none(); - - @Before - public void setUpSampleRules() { - - DefaultHighlighting highlightingDataBuilder = new DefaultHighlighting(mock(SensorStorage.class)) - .onFile(INPUT_FILE) - .highlight(0, 10, COMMENT) - .highlight(1, 10, 1, 12, KEYWORD) - .highlight(24, 38, KEYWORD) - .highlight(42, 50, KEYWORD) - .highlight(24, 65, CPP_DOC) - .highlight(12, 20, COMMENT); - - highlightingDataBuilder.save(); - - highlightingRules = highlightingDataBuilder.getSyntaxHighlightingRuleSet(); - } - - @Test - public void should_register_highlighting_rule() { - assertThat(highlightingRules).hasSize(6); - } - - private static TextRange rangeOf(int startLine, int startOffset, int endLine, int endOffset) { - return new DefaultTextRange(new DefaultTextPointer(startLine, startOffset), new DefaultTextPointer(endLine, endOffset)); - } - - @Test - public void should_order_by_start_then_end_offset() { - assertThat(highlightingRules).extracting("range", TextRange.class).containsExactly( - rangeOf(1, 0, 1, 10), - rangeOf(1, 10, 1, 12), - rangeOf(1, 12, 1, 20), - rangeOf(1, 24, 2, 15), - rangeOf(1, 24, 1, 38), - rangeOf(1, 42, 2, 0)); - assertThat(highlightingRules).extracting("textType").containsExactly(COMMENT, KEYWORD, COMMENT, CPP_DOC, KEYWORD, KEYWORD); - } - - @Test - public void should_support_overlapping() { - new DefaultHighlighting(mock(SensorStorage.class)) - .onFile(INPUT_FILE) - .highlight(0, 15, KEYWORD) - .highlight(8, 12, CPP_DOC) - .save(); - } - - @Test - public void should_prevent_start_equal_end() { - throwable.expect(IllegalArgumentException.class); - throwable - .expectMessage("Unable to highlight file"); - - new DefaultHighlighting(mock(SensorStorage.class)) - .onFile(INPUT_FILE) - .highlight(10, 10, KEYWORD) - .save(); - } - - @Test - public void should_prevent_boudaries_overlapping() { - throwable.expect(IllegalStateException.class); - throwable - .expectMessage("Cannot register highlighting rule for characters at Range[from [line=1, lineOffset=8] to [line=1, lineOffset=15]] as it overlaps at least one existing rule"); - - new DefaultHighlighting(mock(SensorStorage.class)) - .onFile(INPUT_FILE) - .highlight(0, 10, KEYWORD) - .highlight(8, 15, KEYWORD) - .save(); - } - -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultIssueLocationTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultIssueLocationTest.java deleted file mode 100644 index f869f6f17f0..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultIssueLocationTest.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import org.apache.commons.lang.StringUtils; -import org.hamcrest.Description; -import org.hamcrest.Matcher; -import org.hamcrest.TypeSafeMatcher; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.scanner.fs.TestInputFileBuilder; -import org.sonar.scanner.issue.DefaultIssueLocation; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.rules.ExpectedException.none; - -public class DefaultIssueLocationTest { - - @Rule - public ExpectedException thrown = none(); - - private InputFile inputFile = new TestInputFileBuilder("foo", "src/Foo.php") - .initMetadata("Foo\nBar\n") - .build(); - - @Test - public void should_build() { - assertThat(new DefaultIssueLocation() - .on(inputFile) - .message("pipo bimbo") - .message() - ).isEqualTo("pipo bimbo"); - } - - @Test - public void not_allowed_to_call_on_twice() { - thrown.expect(IllegalStateException.class); - thrown.expectMessage("on() already called"); - new DefaultIssueLocation() - .on(inputFile) - .on(inputFile) - .message("Wrong way!"); - } - - @Test - public void prevent_too_long_messages() { - assertThat(new DefaultIssueLocation() - .on(inputFile) - .message(StringUtils.repeat("a", 4000)).message()).hasSize(4000); - - assertThat(new DefaultIssueLocation() - .on(inputFile) - .message(StringUtils.repeat("a", 4001)).message()).hasSize(4000); - } - - @Test - public void prevent_null_character_in_message_text() { - thrown.expect(IllegalArgumentException.class); - thrown.expectMessage("Character \\u0000 is not supported in issue message"); - - new DefaultIssueLocation() - .message("pipo " + '\u0000' + " bimbo"); - } - - @Test - public void prevent_null_character_in_message_text_when_builder_has_been_initialized() { - thrown.expect(IllegalArgumentException.class); - thrown.expectMessage(customMatcher("Character \\u0000 is not supported in issue message", ", on component: src/Foo.php")); - - new DefaultIssueLocation() - .on(inputFile) - .message("pipo " + '\u0000' + " bimbo"); - } - - private Matcher<String> customMatcher(String startWith, String endWith) { - return new TypeSafeMatcher<String>() { - @Override - public void describeTo(Description description) { - description.appendText("Invalid message"); - } - - @Override - protected boolean matchesSafely(final String item) { - return item.startsWith(startWith) && item.endsWith(endWith); - } - }; - } - -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultIssueTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultIssueTest.java deleted file mode 100644 index c6659dbc8a1..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultIssueTest.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import java.io.File; -import java.io.IOException; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import org.sonar.api.batch.bootstrap.ProjectDefinition; -import org.sonar.api.batch.rule.Severity; -import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.api.rule.RuleKey; -import org.sonar.scanner.fs.DefaultInputDir; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.DefaultInputModule; -import org.sonar.scanner.fs.DefaultInputProject; -import org.sonar.scanner.fs.TestInputFileBuilder; -import org.sonar.scanner.issue.DefaultIssue; -import org.sonar.scanner.issue.DefaultIssueLocation; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; - -public class DefaultIssueTest { - - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - - private DefaultInputProject project; - - private DefaultInputFile inputFile = new TestInputFileBuilder("foo", "src/Foo.php") - .initMetadata("Foo\nBar\n") - .build(); - - @Before - public void prepare() throws IOException { - project = new DefaultInputProject(ProjectDefinition.create() - .setKey("foo") - .setBaseDir(temp.newFolder()) - .setWorkDir(temp.newFolder())); - } - - @Test - public void build_file_issue() { - SensorStorage storage = mock(SensorStorage.class); - DefaultIssue issue = new DefaultIssue(project, storage) - .at(new DefaultIssueLocation() - .on(inputFile) - .at(inputFile.selectLine(1)) - .message("Wrong way!")) - .forRule(RuleKey.of("repo", "rule")) - .gap(10.0); - - assertThat(issue.primaryLocation().inputComponent()).isEqualTo(inputFile); - assertThat(issue.ruleKey()).isEqualTo(RuleKey.of("repo", "rule")); - assertThat(issue.primaryLocation().textRange().start().line()).isEqualTo(1); - assertThat(issue.gap()).isEqualTo(10.0); - assertThat(issue.primaryLocation().message()).isEqualTo("Wrong way!"); - - issue.save(); - - verify(storage).store(issue); - } - - @Test - public void move_directory_issue_to_project_root() { - SensorStorage storage = mock(SensorStorage.class); - DefaultIssue issue = new DefaultIssue(project, storage) - .at(new DefaultIssueLocation() - .on(new DefaultInputDir("foo", "src/main").setModuleBaseDir(project.getBaseDir())) - .message("Wrong way!")) - .forRule(RuleKey.of("repo", "rule")) - .overrideSeverity(Severity.BLOCKER); - - assertThat(issue.primaryLocation().inputComponent()).isEqualTo(project); - assertThat(issue.ruleKey()).isEqualTo(RuleKey.of("repo", "rule")); - assertThat(issue.primaryLocation().textRange()).isNull(); - assertThat(issue.primaryLocation().message()).isEqualTo("[src/main] Wrong way!"); - assertThat(issue.overriddenSeverity()).isEqualTo(Severity.BLOCKER); - - issue.save(); - - verify(storage).store(issue); - } - - @Test - public void move_submodule_issue_to_project_root() { - File subModuleDirectory = new File(project.getBaseDir().toString(), "bar"); - subModuleDirectory.mkdir(); - - ProjectDefinition subModuleDefinition = ProjectDefinition.create() - .setKey("foo/bar") - .setBaseDir(subModuleDirectory) - .setWorkDir(subModuleDirectory); - project.definition().addSubProject(subModuleDefinition); - DefaultInputModule subModule = new DefaultInputModule(subModuleDefinition); - - SensorStorage storage = mock(SensorStorage.class); - DefaultIssue issue = new DefaultIssue(project, storage) - .at(new DefaultIssueLocation() - .on(subModule) - .message("Wrong way!")) - .forRule(RuleKey.of("repo", "rule")) - .overrideSeverity(Severity.BLOCKER); - - assertThat(issue.primaryLocation().inputComponent()).isEqualTo(project); - assertThat(issue.ruleKey()).isEqualTo(RuleKey.of("repo", "rule")); - assertThat(issue.primaryLocation().textRange()).isNull(); - assertThat(issue.primaryLocation().message()).isEqualTo("[bar] Wrong way!"); - assertThat(issue.overriddenSeverity()).isEqualTo(Severity.BLOCKER); - - issue.save(); - - verify(storage).store(issue); - } - - @Test - public void build_project_issue() throws IOException { - SensorStorage storage = mock(SensorStorage.class); - DefaultInputModule inputModule = new DefaultInputModule(ProjectDefinition.create().setKey("foo").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder())); - DefaultIssue issue = new DefaultIssue(project, storage) - .at(new DefaultIssueLocation() - .on(inputModule) - .message("Wrong way!")) - .forRule(RuleKey.of("repo", "rule")) - .gap(10.0); - - assertThat(issue.primaryLocation().inputComponent()).isEqualTo(inputModule); - assertThat(issue.ruleKey()).isEqualTo(RuleKey.of("repo", "rule")); - assertThat(issue.primaryLocation().textRange()).isNull(); - assertThat(issue.gap()).isEqualTo(10.0); - assertThat(issue.primaryLocation().message()).isEqualTo("Wrong way!"); - - issue.save(); - - verify(storage).store(issue); - } - -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultMeasureTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultMeasureTest.java deleted file mode 100644 index 43de69f19d0..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultMeasureTest.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import java.io.IOException; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.rules.TemporaryFolder; -import org.sonar.api.batch.bootstrap.ProjectDefinition; -import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.api.measures.CoreMetrics; -import org.sonar.scanner.fs.AbstractProjectOrModule; -import org.sonar.scanner.fs.DefaultInputProject; -import org.sonar.scanner.fs.TestInputFileBuilder; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; - -public class DefaultMeasureTest { - - @Rule - public ExpectedException thrown = ExpectedException.none(); - - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - - @Test - public void build_file_measure() { - SensorStorage storage = mock(SensorStorage.class); - DefaultMeasure<Integer> newMeasure = new DefaultMeasure<Integer>(storage) - .forMetric(CoreMetrics.LINES) - .on(new TestInputFileBuilder("foo", "src/Foo.php").build()) - .withValue(3); - - assertThat(newMeasure.inputComponent()).isEqualTo(new TestInputFileBuilder("foo", "src/Foo.php").build()); - assertThat(newMeasure.metric()).isEqualTo(CoreMetrics.LINES); - assertThat(newMeasure.value()).isEqualTo(3); - - newMeasure.save(); - - verify(storage).store(newMeasure); - } - - @Test - public void build_project_measure() throws IOException { - SensorStorage storage = mock(SensorStorage.class); - AbstractProjectOrModule module = new DefaultInputProject(ProjectDefinition.create().setKey("foo").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder())); - DefaultMeasure<Integer> newMeasure = new DefaultMeasure<Integer>(storage) - .forMetric(CoreMetrics.LINES) - .on(module) - .withValue(3); - - assertThat(newMeasure.inputComponent()).isEqualTo(module); - assertThat(newMeasure.metric()).isEqualTo(CoreMetrics.LINES); - assertThat(newMeasure.value()).isEqualTo(3); - - newMeasure.save(); - - verify(storage).store(newMeasure); - } - - @Test - public void not_allowed_to_call_on_twice() throws IOException { - thrown.expect(IllegalStateException.class); - thrown.expectMessage("on() already called"); - new DefaultMeasure<Integer>() - .on(new DefaultInputProject(ProjectDefinition.create().setKey("foo").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()))) - .on(new TestInputFileBuilder("foo", "src/Foo.php").build()) - .withValue(3) - .save(); - } - -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultSensorDescriptorTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultSensorDescriptorTest.java deleted file mode 100644 index a43272ba20d..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultSensorDescriptorTest.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import org.junit.Test; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.config.internal.MapSettings; - -import static org.assertj.core.api.Assertions.assertThat; - -public class DefaultSensorDescriptorTest { - - @Test - public void describe() { - DefaultSensorDescriptor descriptor = new DefaultSensorDescriptor(); - descriptor - .name("Foo") - .onlyOnLanguage("java") - .onlyOnFileType(InputFile.Type.MAIN) - .requireProperty("sonar.foo.reportPath", "sonar.foo.reportPath2") - .createIssuesForRuleRepository("squid-java"); - - assertThat(descriptor.name()).isEqualTo("Foo"); - assertThat(descriptor.languages()).containsOnly("java"); - assertThat(descriptor.type()).isEqualTo(InputFile.Type.MAIN); - MapSettings settings = new MapSettings(); - settings.setProperty("sonar.foo.reportPath", "foo"); - assertThat(descriptor.configurationPredicate().test(settings.asConfig())).isFalse(); - settings.setProperty("sonar.foo.reportPath2", "foo"); - assertThat(descriptor.configurationPredicate().test(settings.asConfig())).isTrue(); - assertThat(descriptor.ruleRepositories()).containsOnly("squid-java"); - } - -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultSensorStorageTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultSensorStorageTest.java index d95d44a69ed..fe82b642902 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultSensorStorageTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultSensorStorageTest.java @@ -33,17 +33,22 @@ import org.sonar.api.batch.measure.MetricFinder; import org.sonar.api.batch.sensor.highlighting.TypeOfText; import org.sonar.api.batch.sensor.issue.ExternalIssue; import org.sonar.api.batch.sensor.issue.Issue; -import org.sonar.api.config.internal.MapSettings; +import org.sonar.api.impl.config.MapSettings; import org.sonar.api.measures.CoreMetrics; import org.sonar.core.metric.ScannerMetrics; +import org.sonar.api.impl.fs.DefaultInputDir; +import org.sonar.api.impl.fs.DefaultInputFile; +import org.sonar.api.impl.fs.DefaultInputModule; +import org.sonar.api.impl.fs.DefaultInputProject; +import org.sonar.api.impl.fs.TestInputFileBuilder; +import org.sonar.api.impl.sensor.DefaultExternalIssue; +import org.sonar.api.impl.sensor.DefaultHighlighting; +import org.sonar.api.impl.sensor.DefaultMeasure; +import org.sonar.api.impl.sensor.DefaultSignificantCode; +import org.sonar.api.impl.sensor.DefaultSymbolTable; import org.sonar.scanner.cpd.index.SonarCpdBlockIndex; -import org.sonar.scanner.fs.DefaultInputDir; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.DefaultInputModule; -import org.sonar.scanner.fs.DefaultInputProject; -import org.sonar.scanner.fs.TestInputFileBuilder; -import org.sonar.scanner.issue.DefaultIssue; -import org.sonar.scanner.issue.DefaultIssueLocation; +import org.sonar.api.impl.issue.DefaultIssue; +import org.sonar.api.impl.issue.DefaultIssueLocation; import org.sonar.scanner.issue.IssuePublisher; import org.sonar.scanner.protocol.output.FileStructure; import org.sonar.scanner.protocol.output.ScannerReport; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultSignificantCodeTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultSignificantCodeTest.java deleted file mode 100644 index 73a7f1c4299..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultSignificantCodeTest.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.scanner.fs.TestInputFileBuilder; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; - -public class DefaultSignificantCodeTest { - private SensorStorage sensorStorage = mock(SensorStorage.class); - private DefaultSignificantCode underTest = new DefaultSignificantCode(sensorStorage); - private InputFile inputFile = TestInputFileBuilder.create("module", "file1.xoo") - .setContents("this is\na file\n with some code") - .build(); - - @Rule - public ExpectedException exception = ExpectedException.none(); - - @Test - public void should_save_ranges() { - underTest.onFile(inputFile) - .addRange(inputFile.selectLine(1)) - .save(); - verify(sensorStorage).store(underTest); - } - - @Test - public void fail_if_save_without_file() { - exception.expect(IllegalStateException.class); - exception.expectMessage("Call onFile() first"); - underTest.save(); - } - - @Test - public void fail_if_add_range_to_same_line_twice() { - underTest.onFile(inputFile); - underTest.addRange(inputFile.selectLine(1)); - - exception.expect(IllegalStateException.class); - exception.expectMessage("Significant code was already reported for line '1'."); - underTest.addRange(inputFile.selectLine(1)); - } - - @Test - public void fail_if_range_includes_many_lines() { - underTest.onFile(inputFile); - - exception.expect(IllegalArgumentException.class); - exception.expectMessage("Ranges of significant code must be located in a single line"); - underTest.addRange(inputFile.newRange(1, 1, 2, 1)); - } - - @Test - public void fail_if_add_range_before_setting_file() { - exception.expect(IllegalStateException.class); - exception.expectMessage("addRange() should be called after on()"); - underTest.addRange(inputFile.selectLine(1)); - } -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultSymbolTableTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultSymbolTableTest.java deleted file mode 100644 index 3339e1d2bed..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/DefaultSymbolTableTest.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import java.util.Map; -import java.util.Set; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.TextRange; -import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.scanner.fs.TestInputFileBuilder; -import org.sonar.scanner.sensor.DefaultSymbolTable; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; - -public class DefaultSymbolTableTest { - - private static final InputFile INPUT_FILE = new TestInputFileBuilder("foo", "src/Foo.java") - .setLines(2) - .setOriginalLineStartOffsets(new int[] {0, 50}) - .setOriginalLineEndOffsets(new int[] {49, 100}) - .setLastValidOffset(101) - .build(); - - private Map<TextRange, Set<TextRange>> referencesPerSymbol; - - @Rule - public ExpectedException throwable = ExpectedException.none(); - - @Before - public void setUpSampleSymbols() { - - DefaultSymbolTable symbolTableBuilder = new DefaultSymbolTable(mock(SensorStorage.class)) - .onFile(INPUT_FILE); - symbolTableBuilder - .newSymbol(0, 10) - .newReference(12, 15) - .newReference(2, 10, 2, 15); - - symbolTableBuilder.newSymbol(1, 12, 1, 15).newReference(52, 55); - - symbolTableBuilder.save(); - - referencesPerSymbol = symbolTableBuilder.getReferencesBySymbol(); - } - - @Test - public void should_register_symbols() { - assertThat(referencesPerSymbol).hasSize(2); - } - -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/InMemorySensorStorageTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/InMemorySensorStorageTest.java deleted file mode 100644 index 76e4874a41a..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/InMemorySensorStorageTest.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.data.MapEntry.entry; - -public class InMemorySensorStorageTest { - - @Rule - public ExpectedException expectedException = ExpectedException.none(); - - InMemorySensorStorage underTest = new InMemorySensorStorage(); - - @Test - public void test_storeProperty() { - assertThat(underTest.contextProperties).isEmpty(); - - underTest.storeProperty("foo", "bar"); - assertThat(underTest.contextProperties).containsOnly(entry("foo", "bar")); - } - - @Test - public void storeProperty_throws_IAE_if_key_is_null() { - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("Key of context property must not be null"); - - underTest.storeProperty(null, "bar"); - } - - @Test - public void storeProperty_throws_IAE_if_value_is_null() { - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("Value of context property must not be null"); - - underTest.storeProperty("foo", null); - } -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/ModuleSensorContextTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/ModuleSensorContextTest.java index 668a050119a..dea7f4176d5 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/ModuleSensorContextTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/ModuleSensorContextTest.java @@ -31,13 +31,13 @@ import org.sonar.api.batch.fs.InputModule; import org.sonar.api.batch.measure.MetricFinder; import org.sonar.api.batch.rule.ActiveRules; import org.sonar.api.batch.sensor.internal.SensorStorage; -import org.sonar.api.config.internal.MapSettings; -import org.sonar.api.internal.SonarRuntimeImpl; +import org.sonar.api.impl.config.MapSettings; +import org.sonar.api.impl.fs.DefaultFileSystem; +import org.sonar.api.impl.fs.DefaultInputProject; +import org.sonar.api.impl.context.SonarRuntimeImpl; import org.sonar.api.measures.CoreMetrics; import org.sonar.api.utils.Version; -import org.sonar.scanner.fs.DefaultFileSystem; -import org.sonar.scanner.fs.DefaultInputProject; -import org.sonar.scanner.rule.ActiveRulesBuilder; +import org.sonar.api.impl.rule.ActiveRulesBuilder; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/ModuleSensorOptimizerTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/ModuleSensorOptimizerTest.java index 0a78c6b2984..197749532c8 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/ModuleSensorOptimizerTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/ModuleSensorOptimizerTest.java @@ -26,12 +26,13 @@ import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.rule.ActiveRules; -import org.sonar.api.config.internal.MapSettings; +import org.sonar.api.batch.rule.NewActiveRule; +import org.sonar.api.impl.config.MapSettings; +import org.sonar.api.impl.fs.DefaultFileSystem; +import org.sonar.api.impl.fs.TestInputFileBuilder; +import org.sonar.api.impl.sensor.DefaultSensorDescriptor; import org.sonar.api.rule.RuleKey; -import org.sonar.scanner.fs.DefaultFileSystem; -import org.sonar.scanner.fs.TestInputFileBuilder; -import org.sonar.scanner.rule.ActiveRulesBuilder; -import org.sonar.scanner.rule.NewActiveRule; +import org.sonar.api.impl.rule.ActiveRulesBuilder; import static org.assertj.core.api.Assertions.assertThat; diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/SensorContextTesterTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/SensorContextTesterTest.java deleted file mode 100644 index 24e93796c31..00000000000 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/sensor/SensorContextTesterTest.java +++ /dev/null @@ -1,375 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2019 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program 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. - * - * This program 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.scanner.sensor; - -import java.io.File; -import java.io.IOException; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.rules.TemporaryFolder; -import org.sonar.api.batch.bootstrap.ProjectDefinition; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.rule.ActiveRules; -import org.sonar.api.batch.rule.Severity; -import org.sonar.api.batch.sensor.error.AnalysisError; -import org.sonar.api.batch.sensor.error.NewAnalysisError; -import org.sonar.api.batch.sensor.highlighting.TypeOfText; -import org.sonar.api.batch.sensor.issue.NewExternalIssue; -import org.sonar.api.batch.sensor.issue.NewIssue; -import org.sonar.api.batch.sensor.symbol.NewSymbolTable; -import org.sonar.api.config.Settings; -import org.sonar.api.config.internal.MapSettings; -import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.rule.RuleKey; -import org.sonar.api.rules.RuleType; -import org.sonar.scanner.fs.DefaultFileSystem; -import org.sonar.scanner.fs.DefaultInputFile; -import org.sonar.scanner.fs.DefaultInputModule; -import org.sonar.scanner.fs.DefaultTextPointer; -import org.sonar.scanner.fs.TestInputFileBuilder; -import org.sonar.scanner.rule.ActiveRulesBuilder; -import org.sonar.scanner.rule.NewActiveRule; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.tuple; -import static org.assertj.core.data.MapEntry.entry; - -public class SensorContextTesterTest { - - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - - @Rule - public ExpectedException exception = ExpectedException.none(); - - private SensorContextTester tester; - private File baseDir; - - @Before - public void prepare() throws Exception { - baseDir = temp.newFolder(); - tester = SensorContextTester.create(baseDir); - } - - @Test - public void testSettings() { - Settings settings = new MapSettings(); - settings.setProperty("foo", "bar"); - tester.setSettings(settings); - assertThat(tester.settings().getString("foo")).isEqualTo("bar"); - } - - @Test - public void testActiveRules() { - NewActiveRule activeRule = new NewActiveRule.Builder() - .setRuleKey(RuleKey.of("foo", "bar")) - .build(); - ActiveRules activeRules = new ActiveRulesBuilder().addRule(activeRule).build(); - tester.setActiveRules(activeRules); - assertThat(tester.activeRules().findAll()).hasSize(1); - } - - @Test - public void testFs() throws Exception { - DefaultFileSystem fs = new DefaultFileSystem(temp.newFolder()); - tester.setFileSystem(fs); - assertThat(tester.fileSystem().baseDir()).isNotEqualTo(baseDir); - } - - @Test - public void testIssues() { - assertThat(tester.allIssues()).isEmpty(); - NewIssue newIssue = tester.newIssue(); - newIssue - .at(newIssue.newLocation().on(new TestInputFileBuilder("foo", "src/Foo.java").build())) - .forRule(RuleKey.of("repo", "rule")) - .save(); - newIssue = tester.newIssue(); - newIssue - .at(newIssue.newLocation().on(new TestInputFileBuilder("foo", "src/Foo.java").build())) - .forRule(RuleKey.of("repo", "rule")) - .save(); - assertThat(tester.allIssues()).hasSize(2); - } - - @Test - public void testExternalIssues() { - assertThat(tester.allExternalIssues()).isEmpty(); - NewExternalIssue newExternalIssue = tester.newExternalIssue(); - newExternalIssue - .at(newExternalIssue.newLocation().message("message").on(new TestInputFileBuilder("foo", "src/Foo.java").build())) - .forRule(RuleKey.of("repo", "rule")) - .type(RuleType.BUG) - .severity(Severity.BLOCKER) - .save(); - newExternalIssue = tester.newExternalIssue(); - newExternalIssue - .at(newExternalIssue.newLocation().message("message").on(new TestInputFileBuilder("foo", "src/Foo.java").build())) - .type(RuleType.BUG) - .severity(Severity.BLOCKER) - .forRule(RuleKey.of("repo", "rule")) - .save(); - assertThat(tester.allExternalIssues()).hasSize(2); - } - - @Test - public void testAnalysisErrors() { - assertThat(tester.allAnalysisErrors()).isEmpty(); - NewAnalysisError newAnalysisError = tester.newAnalysisError(); - - InputFile file = new TestInputFileBuilder("foo", "src/Foo.java").build(); - newAnalysisError.onFile(file) - .message("error") - .at(new DefaultTextPointer(5, 2)) - .save(); - - assertThat(tester.allAnalysisErrors()).hasSize(1); - AnalysisError analysisError = tester.allAnalysisErrors().iterator().next(); - - assertThat(analysisError.inputFile()).isEqualTo(file); - assertThat(analysisError.message()).isEqualTo("error"); - assertThat(analysisError.location()).isEqualTo(new DefaultTextPointer(5, 2)); - - } - - @Test - public void testMeasures() throws IOException { - assertThat(tester.measures("foo:src/Foo.java")).isEmpty(); - assertThat(tester.measure("foo:src/Foo.java", "ncloc")).isNull(); - tester.<Integer>newMeasure() - .on(new TestInputFileBuilder("foo", "src/Foo.java").build()) - .forMetric(CoreMetrics.NCLOC) - .withValue(2) - .save(); - assertThat(tester.measures("foo:src/Foo.java")).hasSize(1); - assertThat(tester.measure("foo:src/Foo.java", "ncloc")).isNotNull(); - tester.<Integer>newMeasure() - .on(new TestInputFileBuilder("foo", "src/Foo.java").build()) - .forMetric(CoreMetrics.LINES) - .withValue(4) - .save(); - assertThat(tester.measures("foo:src/Foo.java")).hasSize(2); - assertThat(tester.measure("foo:src/Foo.java", "ncloc")).isNotNull(); - assertThat(tester.measure("foo:src/Foo.java", "lines")).isNotNull(); - tester.<Integer>newMeasure() - .on(new DefaultInputModule(ProjectDefinition.create().setKey("foo").setBaseDir(temp.newFolder()).setWorkDir(temp.newFolder()))) - .forMetric(CoreMetrics.DIRECTORIES) - .withValue(4) - .save(); - assertThat(tester.measures("foo")).hasSize(1); - assertThat(tester.measure("foo", "directories")).isNotNull(); - } - - @Test(expected = IllegalStateException.class) - public void duplicateMeasures() { - tester.<Integer>newMeasure() - .on(new TestInputFileBuilder("foo", "src/Foo.java").build()) - .forMetric(CoreMetrics.NCLOC) - .withValue(2) - .save(); - tester.<Integer>newMeasure() - .on(new TestInputFileBuilder("foo", "src/Foo.java").build()) - .forMetric(CoreMetrics.NCLOC) - .withValue(2) - .save(); - } - - @Test - public void testHighlighting() { - assertThat(tester.highlightingTypeAt("foo:src/Foo.java", 1, 3)).isEmpty(); - tester.newHighlighting() - .onFile(new TestInputFileBuilder("foo", "src/Foo.java").initMetadata("annot dsf fds foo bar").build()) - .highlight(1, 0, 1, 5, TypeOfText.ANNOTATION) - .highlight(8, 10, TypeOfText.CONSTANT) - .highlight(9, 10, TypeOfText.COMMENT) - .save(); - assertThat(tester.highlightingTypeAt("foo:src/Foo.java", 1, 3)).containsExactly(TypeOfText.ANNOTATION); - assertThat(tester.highlightingTypeAt("foo:src/Foo.java", 1, 9)).containsExactly(TypeOfText.CONSTANT, TypeOfText.COMMENT); - } - - @Test(expected = UnsupportedOperationException.class) - public void duplicateHighlighting() { - tester.newHighlighting() - .onFile(new TestInputFileBuilder("foo", "src/Foo.java").initMetadata("annot dsf fds foo bar").build()) - .highlight(1, 0, 1, 5, TypeOfText.ANNOTATION) - .save(); - tester.newHighlighting() - .onFile(new TestInputFileBuilder("foo", "src/Foo.java").initMetadata("annot dsf fds foo bar").build()) - .highlight(1, 0, 1, 5, TypeOfText.ANNOTATION) - .save(); - } - - @Test - public void testSymbolReferences() { - assertThat(tester.referencesForSymbolAt("foo:src/Foo.java", 1, 0)).isNull(); - - NewSymbolTable symbolTable = tester.newSymbolTable() - .onFile(new TestInputFileBuilder("foo", "src/Foo.java").initMetadata("annot dsf fds foo bar").build()); - symbolTable - .newSymbol(1, 8, 1, 10); - - symbolTable - .newSymbol(1, 1, 1, 5) - .newReference(6, 9) - .newReference(1, 10, 1, 13); - - symbolTable.save(); - - assertThat(tester.referencesForSymbolAt("foo:src/Foo.java", 1, 0)).isNull(); - assertThat(tester.referencesForSymbolAt("foo:src/Foo.java", 1, 8)).isEmpty(); - assertThat(tester.referencesForSymbolAt("foo:src/Foo.java", 1, 3)).extracting("start.line", "start.lineOffset", "end.line", "end.lineOffset").containsExactly(tuple(1, 6, 1, 9), - tuple(1, 10, 1, 13)); - } - - @Test(expected = UnsupportedOperationException.class) - public void duplicateSymbolReferences() { - NewSymbolTable symbolTable = tester.newSymbolTable() - .onFile(new TestInputFileBuilder("foo", "src/Foo.java").initMetadata("annot dsf fds foo bar").build()); - symbolTable - .newSymbol(1, 8, 1, 10); - - symbolTable.save(); - - symbolTable = tester.newSymbolTable() - .onFile(new TestInputFileBuilder("foo", "src/Foo.java").initMetadata("annot dsf fds foo bar").build()); - symbolTable - .newSymbol(1, 8, 1, 10); - - symbolTable.save(); - } - - @Test - public void testCoverageAtLineZero() { - assertThat(tester.lineHits("foo:src/Foo.java", 1)).isNull(); - assertThat(tester.lineHits("foo:src/Foo.java", 4)).isNull(); - - exception.expect(IllegalStateException.class); - tester.newCoverage() - .onFile(new TestInputFileBuilder("foo", "src/Foo.java").initMetadata("annot dsf fds foo bar").build()) - .lineHits(0, 3); - } - - @Test - public void testCoverageAtLineOutOfRange() { - assertThat(tester.lineHits("foo:src/Foo.java", 1)).isNull(); - assertThat(tester.lineHits("foo:src/Foo.java", 4)).isNull(); - exception.expect(IllegalStateException.class); - - tester.newCoverage() - .onFile(new TestInputFileBuilder("foo", "src/Foo.java").initMetadata("annot dsf fds foo bar").build()) - .lineHits(4, 3); - } - - @Test - public void testLineHits() { - assertThat(tester.lineHits("foo:src/Foo.java", 1)).isNull(); - assertThat(tester.lineHits("foo:src/Foo.java", 4)).isNull(); - tester.newCoverage() - .onFile(new TestInputFileBuilder("foo", "src/Foo.java").initMetadata("annot dsf fds foo bar\nasdas").build()) - .lineHits(1, 2) - .lineHits(2, 3) - .save(); - assertThat(tester.lineHits("foo:src/Foo.java", 1)).isEqualTo(2); - assertThat(tester.lineHits("foo:src/Foo.java", 2)).isEqualTo(3); - } - - public void multipleCoverage() { - tester.newCoverage() - .onFile(new TestInputFileBuilder("foo", "src/Foo.java").initMetadata("annot dsf fds foo bar\nasdas").build()) - .lineHits(1, 2) - .conditions(3, 4, 2) - .save(); - tester.newCoverage() - .onFile(new TestInputFileBuilder("foo", "src/Foo.java").initMetadata("annot dsf fds foo bar\nasdas").build()) - .lineHits(1, 2) - .conditions(3, 4, 3) - .save(); - assertThat(tester.lineHits("foo:src/Foo.java", 1)).isEqualTo(4); - assertThat(tester.conditions("foo:src/Foo.java", 3)).isEqualTo(4); - assertThat(tester.coveredConditions("foo:src/Foo.java", 3)).isEqualTo(3); - } - - @Test - public void testConditions() { - assertThat(tester.conditions("foo:src/Foo.java", 1)).isNull(); - assertThat(tester.coveredConditions("foo:src/Foo.java", 1)).isNull(); - tester.newCoverage() - .onFile(new TestInputFileBuilder("foo", "src/Foo.java") - .initMetadata("annot dsf fds foo bar\nasd\nasdas\nasdfas") - .build()) - .conditions(1, 4, 2) - .save(); - assertThat(tester.conditions("foo:src/Foo.java", 1)).isEqualTo(4); - assertThat(tester.coveredConditions("foo:src/Foo.java", 1)).isEqualTo(2); - } - - @Test - public void testCpdTokens() { - assertThat(tester.cpdTokens("foo:src/Foo.java")).isNull(); - DefaultInputFile inputFile = new TestInputFileBuilder("foo", "src/Foo.java") - .initMetadata("public class Foo {\n\n}") - .build(); - tester.newCpdTokens() - .onFile(inputFile) - .addToken(inputFile.newRange(0, 6), "public") - .addToken(inputFile.newRange(7, 12), "class") - .addToken(inputFile.newRange(13, 16), "$IDENTIFIER") - .addToken(inputFile.newRange(17, 18), "{") - .addToken(inputFile.newRange(3, 0, 3, 1), "}") - .save(); - assertThat(tester.cpdTokens("foo:src/Foo.java")).extracting("value", "startLine", "startUnit", "endUnit") - .containsExactly( - tuple("publicclass$IDENTIFIER{", 1, 1, 4), - tuple("}", 3, 5, 5)); - } - - @Test(expected = UnsupportedOperationException.class) - public void duplicateCpdTokens() { - DefaultInputFile inputFile = new TestInputFileBuilder("foo", "src/Foo.java") - .initMetadata("public class Foo {\n\n}") - .build(); - tester.newCpdTokens() - .onFile(inputFile) - .addToken(inputFile.newRange(0, 6), "public") - .save(); - - tester.newCpdTokens() - .onFile(inputFile) - .addToken(inputFile.newRange(0, 6), "public") - .save(); - } - - @Test - public void testCancellation() { - assertThat(tester.isCancelled()).isFalse(); - tester.setCancelled(true); - assertThat(tester.isCancelled()).isTrue(); - } - - @Test - public void testContextProperties() { - assertThat(tester.getContextProperties()).isEmpty(); - - tester.addContextProperty("foo", "bar"); - assertThat(tester.getContextProperties()).containsOnly(entry("foo", "bar")); - } -} diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/util/ScannerUtilsTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/util/ScannerUtilsTest.java index f5df14fd0b3..1a1ccf2843c 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/util/ScannerUtilsTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/util/ScannerUtilsTest.java @@ -20,6 +20,7 @@ package org.sonar.scanner.util; import org.junit.Test; +import org.sonar.api.impl.utils.ScannerUtils; import static org.assertj.core.api.Assertions.assertThat; diff --git a/sonar-scanner-engine/src/test/resources/org/sonar/scanner/fs/glyphicons-halflings-regular.woff b/sonar-scanner-engine/src/test/resources/org/sonar/scanner/fs/glyphicons-halflings-regular.woff Binary files differdeleted file mode 100644 index 2cc3e4852a5..00000000000 --- a/sonar-scanner-engine/src/test/resources/org/sonar/scanner/fs/glyphicons-halflings-regular.woff +++ /dev/null |