From a3e06937dbb5aa96dfb786f5ad09f9c9dc6b59e3 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Thu, 28 Mar 2019 10:36:40 +0100 Subject: [PATCH] SONAR-7685 Remove commons-io dependency from sonar-ws --- sonar-ws/build.gradle | 1 - .../java/org/sonarqube/ws/FilenameUtils.java | 67 +++++++++++++++++++ .../java/org/sonarqube/ws/MediaTypes.java | 1 - .../main/java/org/sonarqube/ws/WsUtils.java | 1 + .../org/sonarqube/ws/client/BaseService.java | 4 +- .../sonarqube/ws/client/MockWsResponse.java | 12 +--- 6 files changed, 70 insertions(+), 16 deletions(-) create mode 100644 sonar-ws/src/main/java/org/sonarqube/ws/FilenameUtils.java diff --git a/sonar-ws/build.gradle b/sonar-ws/build.gradle index c5b91876379..5b99a172636 100644 --- a/sonar-ws/build.gradle +++ b/sonar-ws/build.gradle @@ -14,7 +14,6 @@ dependencies { compile 'com.google.protobuf:protobuf-java' compile 'com.squareup.okhttp3:okhttp' - compile 'commons-io:commons-io' compileOnly 'com.google.code.findbugs:jsr305' compileOnly project(path: ':sonar-plugin-api', configuration: 'shadow') diff --git a/sonar-ws/src/main/java/org/sonarqube/ws/FilenameUtils.java b/sonar-ws/src/main/java/org/sonarqube/ws/FilenameUtils.java new file mode 100644 index 00000000000..eff84f175e5 --- /dev/null +++ b/sonar-ws/src/main/java/org/sonarqube/ws/FilenameUtils.java @@ -0,0 +1,67 @@ +/* + * 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.sonarqube.ws; + +import static java.util.Objects.requireNonNull; + +/** + * Extracted from org.apache.commons.io.FilenameUtils + */ +public class FilenameUtils { + + private static final int NOT_FOUND = -1; + + private static final char EXTENSION_SEPARATOR = '.'; + /** + * The Unix separator character. + */ + private static final char UNIX_SEPARATOR = '/'; + + /** + * The Windows separator character. + */ + private static final char WINDOWS_SEPARATOR = '\\'; + + private FilenameUtils() { + // Only static methods here + } + + public static String getExtension(String filename) { + requireNonNull(filename); + final int index = indexOfExtension(filename); + if (index == NOT_FOUND) { + return ""; + } else { + return filename.substring(index + 1); + } + } + + private static int indexOfExtension(String filename) { + final int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR); + final int lastSeparator = indexOfLastSeparator(filename); + return lastSeparator > extensionPos ? NOT_FOUND : extensionPos; + } + + private static int indexOfLastSeparator(String filename) { + final int lastUnixPos = filename.lastIndexOf(UNIX_SEPARATOR); + final int lastWindowsPos = filename.lastIndexOf(WINDOWS_SEPARATOR); + return Math.max(lastUnixPos, lastWindowsPos); + } +} diff --git a/sonar-ws/src/main/java/org/sonarqube/ws/MediaTypes.java b/sonar-ws/src/main/java/org/sonarqube/ws/MediaTypes.java index 6ac901845a1..7765a5cf642 100644 --- a/sonar-ws/src/main/java/org/sonarqube/ws/MediaTypes.java +++ b/sonar-ws/src/main/java/org/sonarqube/ws/MediaTypes.java @@ -22,7 +22,6 @@ package org.sonarqube.ws; import java.util.HashMap; import java.util.Locale; import java.util.Map; -import org.apache.commons.io.FilenameUtils; import static org.sonarqube.ws.WsUtils.isNullOrEmpty; diff --git a/sonar-ws/src/main/java/org/sonarqube/ws/WsUtils.java b/sonar-ws/src/main/java/org/sonarqube/ws/WsUtils.java index 5a332795bae..87c3b19b579 100644 --- a/sonar-ws/src/main/java/org/sonarqube/ws/WsUtils.java +++ b/sonar-ws/src/main/java/org/sonarqube/ws/WsUtils.java @@ -49,4 +49,5 @@ public class WsUtils { public static String nullToEmpty(@Nullable String string) { return string == null ? "" : string; } + } diff --git a/sonar-ws/src/main/java/org/sonarqube/ws/client/BaseService.java b/sonar-ws/src/main/java/org/sonarqube/ws/client/BaseService.java index b3abea01c2c..14e586aca6e 100644 --- a/sonar-ws/src/main/java/org/sonarqube/ws/client/BaseService.java +++ b/sonar-ws/src/main/java/org/sonarqube/ws/client/BaseService.java @@ -25,7 +25,6 @@ import java.io.InputStream; import java.util.Collection; import javax.annotation.CheckForNull; import javax.annotation.Nullable; -import org.apache.commons.io.IOUtils; import org.sonarqube.ws.MediaTypes; import static org.sonarqube.ws.WsUtils.checkArgument; @@ -54,9 +53,8 @@ public abstract class BaseService { public static T convert(WsResponse response, Parser parser) { try (InputStream byteStream = response.contentStream()) { - byte[] bytes = IOUtils.toByteArray(byteStream); // HTTP header "Content-Type" is not verified. It may be different than protobuf. - return parser.parseFrom(bytes); + return parser.parseFrom(byteStream); } catch (Exception e) { throw new IllegalStateException("Fail to parse protobuf response of " + response.requestUrl(), e); } diff --git a/sonar-ws/src/main/java/org/sonarqube/ws/client/MockWsResponse.java b/sonar-ws/src/main/java/org/sonarqube/ws/client/MockWsResponse.java index 9cb8785417a..4230b849c67 100644 --- a/sonar-ws/src/main/java/org/sonarqube/ws/client/MockWsResponse.java +++ b/sonar-ws/src/main/java/org/sonarqube/ws/client/MockWsResponse.java @@ -20,7 +20,6 @@ package org.sonarqube.ws.client; import java.io.ByteArrayInputStream; -import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.io.StringReader; @@ -29,7 +28,6 @@ import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import java.util.Optional; -import org.apache.commons.io.IOUtils; import org.sonarqube.ws.MediaTypes; import static java.util.Objects.requireNonNull; @@ -41,7 +39,7 @@ public class MockWsResponse extends BaseResponse { private int code = HttpURLConnection.HTTP_OK; private String requestUrl; private byte[] content; - private final Map headers = new HashMap<>(); + private final Map headers = new HashMap<>(); @Override public int code() { @@ -73,14 +71,6 @@ public class MockWsResponse extends BaseResponse { return this; } - public MockWsResponse setContent(InputStream is) { - try { - return setContent(IOUtils.toByteArray(is)); - } catch (IOException e) { - throw new IllegalArgumentException(e); - } - } - public MockWsResponse setContent(byte[] b) { this.content = b; return this; -- 2.39.5