compile 'com.google.protobuf:protobuf-java' | compile 'com.google.protobuf:protobuf-java' | ||||
compile 'com.squareup.okhttp3:okhttp' | compile 'com.squareup.okhttp3:okhttp' | ||||
compile 'commons-io:commons-io' | |||||
compileOnly 'com.google.code.findbugs:jsr305' | compileOnly 'com.google.code.findbugs:jsr305' | ||||
compileOnly project(path: ':sonar-plugin-api', configuration: 'shadow') | compileOnly project(path: ':sonar-plugin-api', configuration: 'shadow') |
/* | |||||
* 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); | |||||
} | |||||
} |
import java.util.HashMap; | import java.util.HashMap; | ||||
import java.util.Locale; | import java.util.Locale; | ||||
import java.util.Map; | import java.util.Map; | ||||
import org.apache.commons.io.FilenameUtils; | |||||
import static org.sonarqube.ws.WsUtils.isNullOrEmpty; | import static org.sonarqube.ws.WsUtils.isNullOrEmpty; | ||||
public static String nullToEmpty(@Nullable String string) { | public static String nullToEmpty(@Nullable String string) { | ||||
return string == null ? "" : string; | return string == null ? "" : string; | ||||
} | } | ||||
} | } |
import java.util.Collection; | import java.util.Collection; | ||||
import javax.annotation.CheckForNull; | import javax.annotation.CheckForNull; | ||||
import javax.annotation.Nullable; | import javax.annotation.Nullable; | ||||
import org.apache.commons.io.IOUtils; | |||||
import org.sonarqube.ws.MediaTypes; | import org.sonarqube.ws.MediaTypes; | ||||
import static org.sonarqube.ws.WsUtils.checkArgument; | import static org.sonarqube.ws.WsUtils.checkArgument; | ||||
public static <T extends Message> T convert(WsResponse response, Parser<T> parser) { | public static <T extends Message> T convert(WsResponse response, Parser<T> parser) { | ||||
try (InputStream byteStream = response.contentStream()) { | try (InputStream byteStream = response.contentStream()) { | ||||
byte[] bytes = IOUtils.toByteArray(byteStream); | |||||
// HTTP header "Content-Type" is not verified. It may be different than protobuf. | // HTTP header "Content-Type" is not verified. It may be different than protobuf. | ||||
return parser.parseFrom(bytes); | |||||
return parser.parseFrom(byteStream); | |||||
} catch (Exception e) { | } catch (Exception e) { | ||||
throw new IllegalStateException("Fail to parse protobuf response of " + response.requestUrl(), e); | throw new IllegalStateException("Fail to parse protobuf response of " + response.requestUrl(), e); | ||||
} | } |
package org.sonarqube.ws.client; | package org.sonarqube.ws.client; | ||||
import java.io.ByteArrayInputStream; | import java.io.ByteArrayInputStream; | ||||
import java.io.IOException; | |||||
import java.io.InputStream; | import java.io.InputStream; | ||||
import java.io.Reader; | import java.io.Reader; | ||||
import java.io.StringReader; | import java.io.StringReader; | ||||
import java.util.HashMap; | import java.util.HashMap; | ||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.Optional; | import java.util.Optional; | ||||
import org.apache.commons.io.IOUtils; | |||||
import org.sonarqube.ws.MediaTypes; | import org.sonarqube.ws.MediaTypes; | ||||
import static java.util.Objects.requireNonNull; | import static java.util.Objects.requireNonNull; | ||||
private int code = HttpURLConnection.HTTP_OK; | private int code = HttpURLConnection.HTTP_OK; | ||||
private String requestUrl; | private String requestUrl; | ||||
private byte[] content; | private byte[] content; | ||||
private final Map<String,String> headers = new HashMap<>(); | |||||
private final Map<String, String> headers = new HashMap<>(); | |||||
@Override | @Override | ||||
public int code() { | public int code() { | ||||
return this; | 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) { | public MockWsResponse setContent(byte[] b) { | ||||
this.content = b; | this.content = b; | ||||
return this; | return this; |