diff --git a/build.gradle b/build.gradle
index 5e4db62f4..923ea3704 100644
--- a/build.gradle
+++ b/build.gradle
@@ -14,6 +14,7 @@ plugins {
id 'maven-publish'
id 'signing'
id 'jacoco'
+ id 'com.github.spotbugs' version '4.6.0'
}
java {
@@ -32,6 +33,28 @@ jacoco {
toolVersion = "0.8.7-SNAPSHOT" //https://github.com/gradle/gradle/issues/15038
}
+spotbugsMain {
+ excludeFilter = file("spotBugsExcludeFilter.xml")
+ reports {
+ html {
+ enabled = true
+ destination = file("$buildDir/reports/spotbugs/main/spotbugs.html")
+ stylesheet = 'fancy-hist.xsl'
+ }
+ }
+}
+
+spotbugsTest {
+ excludeFilter = file("spotBugsExcludeFilter.xml")
+ reports {
+ html {
+ enabled = true
+ destination = file("$buildDir/reports/spotbugs/test/spotbugs.html")
+ stylesheet = 'fancy-hist.xsl'
+ }
+ }
+}
+
jacocoTestReport {
reports {
xml.enabled true
diff --git a/spotBugsExcludeFilter.xml b/spotBugsExcludeFilter.xml
new file mode 100644
index 000000000..31e4a5f86
--- /dev/null
+++ b/spotBugsExcludeFilter.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/microsoft/graph/concurrency/ChunkedUploadProvider.java b/src/main/java/com/microsoft/graph/concurrency/ChunkedUploadProvider.java
index 8e9ce8f33..ce0c61989 100644
--- a/src/main/java/com/microsoft/graph/concurrency/ChunkedUploadProvider.java
+++ b/src/main/java/com/microsoft/graph/concurrency/ChunkedUploadProvider.java
@@ -30,6 +30,7 @@
import java.io.InputStream;
import java.security.InvalidParameterException;
import java.util.List;
+import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
@@ -103,25 +104,15 @@ public ChunkedUploadProvider(@Nonnull final IUploadSession uploadSession,
@Nonnull final InputStream inputStream,
final long streamSize,
@Nonnull final Class uploadTypeClass) {
- if (uploadSession == null) {
- throw new InvalidParameterException("Upload session is null.");
- }
-
- if (client == null) {
- throw new InvalidParameterException("OneDrive client is null.");
- }
-
- if (inputStream == null) {
- throw new InvalidParameterException("Input stream is null.");
- }
+ Objects.requireNonNull(uploadSession, "Upload session is null.");
if (streamSize <= 0) {
throw new InvalidParameterException("Stream size should larger than 0.");
}
- this.client = client;
+ this.client = Objects.requireNonNull(client, "Graph client is null.");
this.readSoFar = 0;
- this.inputStream = inputStream;
+ this.inputStream = Objects.requireNonNull(inputStream, "Input stream is null.");
this.streamSize = streamSize;
this.uploadUrl = uploadSession.getUploadUrl();
this.responseHandler = new ChunkedUploadResponseHandler(uploadTypeClass, uploadSession.getClass());
diff --git a/src/main/java/com/microsoft/graph/concurrency/ChunkedUploadRequest.java b/src/main/java/com/microsoft/graph/concurrency/ChunkedUploadRequest.java
index badb00375..1ac59126c 100644
--- a/src/main/java/com/microsoft/graph/concurrency/ChunkedUploadRequest.java
+++ b/src/main/java/com/microsoft/graph/concurrency/ChunkedUploadRequest.java
@@ -6,6 +6,7 @@
import java.util.List;
import java.util.Locale;
+import java.util.Objects;
import javax.annotation.Nullable;
import javax.annotation.Nonnull;
@@ -61,9 +62,12 @@ protected ChunkedUploadRequest(@Nonnull final String requestUrl,
final int chunkSize,
final long beginIndex,
final long totalLength) {
+ Objects.requireNonNull(requestUrl, "parameter requestUrl cannot be null");
+ Objects.requireNonNull(client, "parameter client cannot be null");
+ Objects.requireNonNull(chunk, "parameter chunk cannot be null");
this.data = new byte[chunkSize];
System.arraycopy(chunk, 0, this.data, 0, chunkSize);
- this.baseRequest = new BaseRequest>(requestUrl, client, options, (Class extends ChunkedUploadResult>)(new ChunkedUploadResult((UploadType)null)).getClass()) {
+ this.baseRequest = new BaseRequest>(requestUrl, client, options, (Class extends ChunkedUploadResult>)(new ChunkedUploadResult<>((UploadType)null)).getClass()) {
};
this.baseRequest.setHttpMethod(HttpMethod.PUT);
this.baseRequest.addHeader(CONTENT_RANGE_HEADER_NAME,
@@ -84,6 +88,7 @@ protected ChunkedUploadRequest(@Nonnull final String requestUrl,
@Nonnull
public ChunkedUploadResult upload(
@Nonnull final ChunkedUploadResponseHandler responseHandler) {
+ Objects.requireNonNull(responseHandler, "parameter responseHandler cannot be null");
ChunkedUploadResult result = null;
try {
diff --git a/src/main/java/com/microsoft/graph/concurrency/ChunkedUploadResponseHandler.java b/src/main/java/com/microsoft/graph/concurrency/ChunkedUploadResponseHandler.java
index ba7efc8ab..c571407a0 100644
--- a/src/main/java/com/microsoft/graph/concurrency/ChunkedUploadResponseHandler.java
+++ b/src/main/java/com/microsoft/graph/concurrency/ChunkedUploadResponseHandler.java
@@ -35,10 +35,12 @@
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.util.Objects;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
+import okhttp3.MediaType;
import okhttp3.Response;
import okhttp3.ResponseBody;
@@ -64,8 +66,8 @@ public class ChunkedUploadResponseHandler
* @param uploadSessionType the type of the upload session
*/
protected ChunkedUploadResponseHandler(@Nonnull final Class uploadType, @Nonnull final Class extends IUploadSession> uploadSessionType) {
- this.deserializeTypeClass = uploadType;
- this.uploadSessionClass = uploadSessionType;
+ this.deserializeTypeClass = Objects.requireNonNull(uploadType, "parameter uploadType cannot be null");
+ this.uploadSessionClass = Objects.requireNonNull(uploadSessionType, "parameter uploadSessionType cannot be null");
}
/**
@@ -95,6 +97,10 @@ public ChunkedUploadResult generateResult(
@Nonnull final Response response,
@Nonnull final ISerializer serializer,
@Nonnull final ILogger logger) throws Exception {
+ Objects.requireNonNull(request, "parameter request cannot be null");
+ Objects.requireNonNull(response, "parameter response cannot be null");
+ Objects.requireNonNull(serializer, "parameter serializer cannot be null");
+ Objects.requireNonNull(logger, "parameter logger cannot be null");
if (response.code() >= HttpResponseCode.HTTP_CLIENT_ERROR) {
logger.logDebug("Receiving error during upload, see detail on result error");
@@ -105,7 +111,9 @@ public ChunkedUploadResult generateResult(
&& response.code() < HttpResponseCode.HTTP_MULTIPLE_CHOICES) {
try(final ResponseBody body = response.body()) {
final String location = response.headers().get("Location");
- if (body.contentType() != null && body.contentType().subtype().contains("json")) {
+ final MediaType contentType = body.contentType();
+ final String subType = contentType == null ? null : contentType.subtype();
+ if (subType != null && subType.contains("json")) {
return parseJsonUploadResult(body, serializer, logger);
} else if (location != null) {
logger.logDebug("Upload session is completed (Outlook), uploaded item returned.");
diff --git a/src/main/java/com/microsoft/graph/concurrency/ChunkedUploadResult.java b/src/main/java/com/microsoft/graph/concurrency/ChunkedUploadResult.java
index 81a5e1c72..7894bb55c 100644
--- a/src/main/java/com/microsoft/graph/concurrency/ChunkedUploadResult.java
+++ b/src/main/java/com/microsoft/graph/concurrency/ChunkedUploadResult.java
@@ -8,6 +8,9 @@
import com.microsoft.graph.http.GraphServiceException;
import javax.annotation.Nullable;
+
+import java.util.Objects;
+
import javax.annotation.Nonnull;
/**
@@ -68,7 +71,10 @@ protected ChunkedUploadResult(@Nullable final ClientException error) {
* @param exception The exception received from server.
*/
protected ChunkedUploadResult(@Nonnull final GraphServiceException exception) {
- this(new ClientException(exception.getMessage(/* verbose */ true), exception));
+ this(new ClientException(Objects
+ .requireNonNull(exception, "parameter exception cannot be null")
+ .getMessage(/* verbose */ true),
+ exception));
}
/**
diff --git a/src/main/java/com/microsoft/graph/content/BatchRequest.java b/src/main/java/com/microsoft/graph/content/BatchRequest.java
index ce65cdb42..ae7b732c4 100644
--- a/src/main/java/com/microsoft/graph/content/BatchRequest.java
+++ b/src/main/java/com/microsoft/graph/content/BatchRequest.java
@@ -43,7 +43,7 @@ public class BatchRequest extends BaseRequest {
* @param client the client to use to execute the request
* @param options the options to apply to the request
*/
- public BatchRequest(@Nonnull final String requestUrl, @Nonnull final IBaseClient client, @Nonnull final List extends Option> options) {
+ public BatchRequest(@Nonnull final String requestUrl, @Nonnull final IBaseClient> client, @Nonnull final List extends Option> options) {
super(requestUrl, client, options, BatchResponseContent.class);
}
@@ -55,7 +55,7 @@ public BatchRequest(@Nonnull final String requestUrl, @Nonnull final IBaseClient
* @throws ClientException an exception occurs if there was an error while the request was sent
*/
@Nullable
- public BatchResponseContent post(@Nonnull final BatchRequestContent content) throws ClientException {
+ public BatchResponseContent post(@Nullable final BatchRequestContent content) throws ClientException {
this.setHttpMethod(HttpMethod.POST);
final BatchResponseContent response = this.getClient().getHttpProvider().send(this, BatchResponseContent.class, content);
setSerializerOnSteps(response);
@@ -69,7 +69,7 @@ public BatchResponseContent post(@Nonnull final BatchRequestContent content) thr
* @throws ClientException an exception occurs if there was an error while the request was sent
*/
@Nullable
- public java.util.concurrent.CompletableFuture postAsync(@Nonnull final BatchRequestContent content) throws ClientException {
+ public java.util.concurrent.CompletableFuture postAsync(@Nullable final BatchRequestContent content) throws ClientException {
this.setHttpMethod(HttpMethod.POST);
return this.getClient().getHttpProvider().sendAsync(this, BatchResponseContent.class, content).thenApply(response -> {
setSerializerOnSteps(response);
diff --git a/src/main/java/com/microsoft/graph/content/BatchRequestBuilder.java b/src/main/java/com/microsoft/graph/content/BatchRequestBuilder.java
index 731dfd9aa..c6ceda75d 100644
--- a/src/main/java/com/microsoft/graph/content/BatchRequestBuilder.java
+++ b/src/main/java/com/microsoft/graph/content/BatchRequestBuilder.java
@@ -39,7 +39,7 @@ public class BatchRequestBuilder extends BaseRequestBuilder options) {
+ public BatchRequestBuilder(@Nonnull final String requestUrl, @Nonnull final IBaseClient> client, @Nonnull final List extends Option> options) {
super(requestUrl, client, options);
}
/**
diff --git a/src/main/java/com/microsoft/graph/content/BatchRequestContent.java b/src/main/java/com/microsoft/graph/content/BatchRequestContent.java
index 8a6f7d163..935f24c1c 100644
--- a/src/main/java/com/microsoft/graph/content/BatchRequestContent.java
+++ b/src/main/java/com/microsoft/graph/content/BatchRequestContent.java
@@ -138,10 +138,10 @@ public void removeBatchRequestStepWithId(@Nonnull final String ...stepIds) {
for(final String stepId : stepIds) {
Objects.requireNonNull(stepId, "parameter stepIds cannot contain null values");
- requests.removeIf(x -> x.id == stepId);
+ requests.removeIf(x -> stepId.equals(x.id));
for(final BatchRequestStep> step : requests) {
if(step.dependsOn != null) {
- step.dependsOn.removeIf(x -> x == stepId);
+ step.dependsOn.removeIf(x -> stepId.equals(x));
if(step.dependsOn.isEmpty())
step.dependsOn = null; // so we don't send dependsOn: [] over the wire
}
diff --git a/src/main/java/com/microsoft/graph/core/BaseClient.java b/src/main/java/com/microsoft/graph/core/BaseClient.java
index a97f6c030..cc0a2e333 100644
--- a/src/main/java/com/microsoft/graph/core/BaseClient.java
+++ b/src/main/java/com/microsoft/graph/core/BaseClient.java
@@ -35,6 +35,7 @@
import javax.annotation.Nullable;
+import java.util.Collections;
import java.util.Objects;
import javax.annotation.Nonnull;
@@ -74,7 +75,7 @@ public String getServiceRoot() {
@Override
public void setServiceRoot(@Nonnull final String value) {
- endpoint = value;
+ endpoint = Objects.requireNonNull(value, "value parameter cannot be null");
}
/**
@@ -88,7 +89,9 @@ public void setServiceRoot(@Nonnull final String value) {
*/
@Nonnull
public CustomRequestBuilder customRequest(@Nonnull final String url, @Nonnull final Class responseType) {
- return new CustomRequestBuilder<>(getServiceRoot() + url, this, null, responseType);
+ Objects.requireNonNull(url, "url parameter cannot be null");
+ Objects.requireNonNull(responseType, "responseType parameter cannot be null");
+ return new CustomRequestBuilder<>(getServiceRoot() + url, this, null, responseType);
}
/**
@@ -100,8 +103,7 @@ public CustomRequestBuilder customRequest(@Nonnull final String url, @Non
*/
@Nonnull
public CustomRequestBuilder customRequest(@Nonnull final String url) {
- return new CustomRequestBuilder<>(getServiceRoot() + url, this, null,
- JsonElement.class);
+ return this.customRequest(url, JsonElement.class);
}
/**
@@ -110,7 +112,7 @@ public CustomRequestBuilder customRequest(@Nonnull final String url
*/
@Nonnull
public BatchRequestBuilder batch() {
- return new BatchRequestBuilder(getServiceRoot() + "/$batch", this, null);
+ return new BatchRequestBuilder(getServiceRoot() + "/$batch", this, Collections.emptyList());
}
/**
@@ -196,7 +198,7 @@ private IHttpProvider getHttpProvider() {
*/
@Nonnull
public Builder serializer(@Nonnull final ISerializer serializer) {
- checkNotNull(serializer, "serializer");
+ Objects.requireNonNull(serializer, "parameter serializer cannot be null");
this.serializer = serializer;
return this;
}
@@ -210,7 +212,7 @@ public Builder serializer(@Nonnull final ISer
*/
@Nonnull
public Builder httpProvider(@Nonnull final IHttpProvider httpProvider) {
- checkNotNull(httpProvider, "httpProvider");
+ Objects.requireNonNull(httpProvider, "parameter httpProvider cannot be null");
this.httpProvider = httpProvider;
return this;
}
@@ -224,7 +226,7 @@ public Builder httpProvider(@Nonnull final IH
*/
@Nonnull
public Builder logger(@Nonnull final ILogger logger) {
- checkNotNull(logger, "logger");
+ Objects.requireNonNull(logger, "parameter logger cannot be null");
this.logger = logger;
return this;
}
@@ -238,7 +240,7 @@ public Builder logger(@Nonnull final ILogger
*/
@Nonnull
public Builder httpClient(@Nonnull final httpClientType client) {
- checkNotNull(client, "client");
+ Objects.requireNonNull(client, "parameter client cannot be null");
this.httpClient = client;
return this;
}
@@ -251,7 +253,7 @@ public Builder httpClient(@Nonnull final http
*/
@Nonnull
public Builder authenticationProvider(@Nonnull final IAuthenticationProvider auth) {
- checkNotNull(auth, "auth");
+ Objects.requireNonNull(auth, "parameter auth cannot be null");
this.auth = auth;
return this;
}
@@ -287,18 +289,6 @@ public IBaseClient buildClient() throws ClientException {
}
}
- /**
- * Checks whether the provided object is null or not and throws an exception if it is
- *
- * @param o object to check
- * @param name name to use in the exception message
- */
- protected static void checkNotNull(@Nullable final Object o, @Nonnull final String name) {
- if (o==null) {
- throw new NullPointerException(name + " cannot be null");
- }
- }
-
/**
* The HTTP provider instance
*/
@@ -352,7 +342,7 @@ public ISerializer getSerializer() {
* @param logger The logger
*/
protected void setLogger(@Nonnull final ILogger logger) {
- checkNotNull(logger, "logger");
+ Objects.requireNonNull(logger, "parameter logger cannot be null");
this.logger = logger;
}
@@ -362,7 +352,7 @@ protected void setLogger(@Nonnull final ILogger logger) {
* @param httpProvider The HTTP provider
*/
protected void setHttpProvider(@Nonnull final IHttpProvider httpProvider) {
- checkNotNull(httpProvider, "httpProvider");
+ Objects.requireNonNull(httpProvider, "parameter httpProvider cannot be null");
this.httpProvider = httpProvider;
}
@@ -372,7 +362,7 @@ protected void setHttpProvider(@Nonnull final IHttpProvider h
* @param serializer The serializer
*/
public void setSerializer(@Nonnull final ISerializer serializer) {
- checkNotNull(serializer, "serializer");
+ Objects.requireNonNull(serializer, "parameter serializer cannot be null");
this.serializer = serializer;
}
diff --git a/src/main/java/com/microsoft/graph/core/CustomRequestBuilder.java b/src/main/java/com/microsoft/graph/core/CustomRequestBuilder.java
index 6354965b6..5915eb32b 100644
--- a/src/main/java/com/microsoft/graph/core/CustomRequestBuilder.java
+++ b/src/main/java/com/microsoft/graph/core/CustomRequestBuilder.java
@@ -1,6 +1,7 @@
package com.microsoft.graph.core;
import java.util.List;
+import java.util.Objects;
import javax.annotation.Nullable;
import javax.annotation.Nonnull;
@@ -28,7 +29,7 @@ public class CustomRequestBuilder extends BaseRequestBuilder {
*/
public CustomRequestBuilder(@Nonnull final String requestUrl, @Nonnull final IBaseClient> client, @Nullable final List extends Option> requestOptions, @Nonnull final Class responseType) {
super(requestUrl, client, requestOptions);
- this.responseType = responseType;
+ this.responseType = Objects.requireNonNull(responseType, "parameter responseType cannot be null");
}
/**
diff --git a/src/main/java/com/microsoft/graph/core/DateOnly.java b/src/main/java/com/microsoft/graph/core/DateOnly.java
index 76ee7b722..e5a805092 100644
--- a/src/main/java/com/microsoft/graph/core/DateOnly.java
+++ b/src/main/java/com/microsoft/graph/core/DateOnly.java
@@ -3,6 +3,7 @@
import java.text.ParseException;
import java.util.Locale;
+import java.util.Objects;
import javax.annotation.Nullable;
import javax.annotation.Nonnull;
@@ -36,6 +37,7 @@ public class DateOnly {
*/
@Nullable
public static DateOnly parse(@Nonnull final String dateStr) throws ParseException {
+ Objects.requireNonNull(dateStr, "parameter dateStr cannot be null");
// break the date up into its constituent parts
final String[] dateInfo = dateStr.split("-");
diff --git a/src/main/java/com/microsoft/graph/core/Multipart.java b/src/main/java/com/microsoft/graph/core/Multipart.java
index 9b83ce480..0600cac80 100644
--- a/src/main/java/com/microsoft/graph/core/Multipart.java
+++ b/src/main/java/com/microsoft/graph/core/Multipart.java
@@ -7,6 +7,7 @@
import java.math.BigInteger;
import java.security.SecureRandom;
import java.util.Map;
+import java.util.Objects;
import javax.annotation.Nullable;
import javax.annotation.Nonnull;
@@ -16,8 +17,8 @@
/**
* Helper for submitting multipart data
- *
- * This follows the Network Working Group's RFC
+ *
+ * This follows the Network Working Group's RFC
* on multipart/form-data posting format:
* https://www.ietf.org/rfc/rfc2388.txt
*/
@@ -28,7 +29,7 @@ public class Multipart {
/** Default encoding for multi-part requests */
public static final String MULTIPART_ENCODING = "US-ASCII";
private String contentType = "multipart/form-data";
-
+
/**
* Create a new multipart object
*/
@@ -36,7 +37,7 @@ public Multipart() {
out = new ByteArrayOutputStream();
boundary = "part_" + new BigInteger(130, new SecureRandom()).toString();
}
-
+
/**
* Get the multipart boundary for use in the request header
* @return the multipart boundary
@@ -45,15 +46,15 @@ public Multipart() {
public String getBoundary() {
return boundary;
}
-
+
/**
* Set the multipart boundary for use in the request header
* @param boundary The multipart boundary
*/
public void setBoundary(@Nonnull final String boundary) {
- this.boundary = boundary;
+ this.boundary = Objects.requireNonNull(boundary, "parameter boundary cannot be null");
}
-
+
/**
* Get the contentType for use in the request header
* @return the multipart Content-Type
@@ -62,15 +63,15 @@ public void setBoundary(@Nonnull final String boundary) {
public String getContentType() {
return contentType;
}
-
+
/**
* Set the contentType for use in the request header
* @param contentType The multipart Content-Type
*/
public void setContentType(@Nonnull final String contentType) {
- this.contentType = contentType;
+ this.contentType = Objects.requireNonNull(contentType, "parameter contentType cannot be null");
}
-
+
/**
* Get the Content-Type header to send the multipart request
* @return the multipart header option
@@ -79,72 +80,71 @@ public void setContentType(@Nonnull final String contentType) {
public HeaderOption header() {
return new HeaderOption("Content-Type", contentType + "; boundary=\"" + boundary + "\"");
}
-
+
private void writePartData(String partContent, byte[] byteArray) throws IOException{
out.write(partContent.getBytes(MULTIPART_ENCODING));
out.write(byteArray);
String returnContent = RETURN + RETURN;
out.write(returnContent.getBytes(MULTIPART_ENCODING));
}
-
+
/**
* Create content headers value and parameter
* @param name The content header name
* @param contentType The content header Content-Type
- * @param filename The content header filename
- * @return content header value and parameter string
+ * @param filename The content header filename
+ * @return content header value and parameter string
*/
@VisibleForTesting
String createPartHeader(String name, String contentType, String filename) {
StringBuilder partContent = new StringBuilder(addBoundary());
partContent.append("Content-Disposition: form-data");
if(filename != null) {
- if(name != null)
+ if(name != null)
partContent.append("; name=\"").append(name).append("\"; filename=\"").append(filename).append("\"");
- else
+ else
partContent.append("; filename=\"").append(filename).append("\"");
}
- else if(name != null)
+ else if(name != null)
partContent.append("; name=\"").append(name).append("\"");
if(contentType != null)
partContent.append(RETURN).append("Content-Type: ").append(contentType);
partContent.append(RETURN).append(RETURN);
return partContent.toString();
}
-
+
/**
* Create content headers value and parameter
* @param contentValue The content header value
- * @param contentDispParameter Map containing content paramter's key and value pair
- * @return content header value and parameter string
+ * @param contentDispParameter Map containing content paramter's key and value pair
+ * @return content header value and parameter string
*/
@Nonnull
public static String createContentHeaderValue(@Nonnull final String contentValue, @Nullable final Map contentDispParameter) {
- String contentHeaderValue = contentValue;
+ final StringBuilder builder = new StringBuilder(contentValue);
if(contentDispParameter != null) {
for(Map.Entry entry : contentDispParameter.entrySet())
- contentHeaderValue += ";" + entry.getKey() + "=\"" + entry.getValue() + "\"";
+ builder.append(";" + entry.getKey() + "=\"" + entry.getValue() + "\"");
}
- return contentHeaderValue;
+ return builder.toString();
}
-
+
/**
* Create content headers header-name, value and parameter string
* @param headers Map containing Header-name and header-value pair
*/
private String createPartHeader(Map headers) {
- String partContent = addBoundary();
- String defaultPartContent = "Content-Disposition: form-data;" + RETURN + "Content-Type: " + contentType + RETURN + RETURN;
-
- if(headers != null) {
- for(Map.Entry entry : headers.entrySet())
- partContent += entry.getKey() +": "+entry.getValue() + RETURN;
- partContent += RETURN;
- }
- else
- partContent += defaultPartContent;
- return partContent;
+ final StringBuilder builder = new StringBuilder(addBoundary());
+ final String defaultPartContent = "Content-Disposition: form-data;" + RETURN + "Content-Type: " + contentType + RETURN + RETURN;
+
+ if(headers != null) {
+ for(Map.Entry entry : headers.entrySet())
+ builder.append(entry.getKey() +": "+entry.getValue() + RETURN);
+ builder.append(RETURN);
+ } else
+ builder.append(defaultPartContent);
+ return builder.toString();
}
/**
@@ -170,7 +170,7 @@ private void addData(String name, String contentType, String filename, byte[] by
public void addFormData(@Nonnull final String name, @Nonnull final String contentType, @Nonnull final byte[] byteArray) throws IOException {
addData(name, contentType, null, byteArray);
}
-
+
/**
* Add a part to the multipart body
* @param contentType The MIME type (text/html, video/mp4, etc.)
@@ -180,7 +180,7 @@ public void addFormData(@Nonnull final String name, @Nonnull final String conten
public void addPart(@Nonnull final String contentType, @Nonnull final byte[] byteArray) throws IOException {
addData(null, contentType, null, byteArray);
}
-
+
/**
* Add a part to the multipart body
* @param headers Map containing Header's header-name(eg: Content-Disposition, Content-Type, etc..) and header's value-parameter string
@@ -191,7 +191,7 @@ public void addPart(@Nonnull final Map headers, @Nonnull final b
final String partContent = createPartHeader(headers);
writePartData(partContent, content);
}
-
+
/**
* Add an HTML part to the multipart body
* @param name The name of the part
@@ -201,7 +201,7 @@ public void addPart(@Nonnull final Map headers, @Nonnull final b
public void addHtmlPart(@Nonnull final String name, @Nonnull final byte[] content) throws IOException {
addFormData(name, "text/html", content);
}
-
+
/**
* Add a file part to the multipart body
* @param name The name of the part
@@ -210,11 +210,12 @@ public void addHtmlPart(@Nonnull final String name, @Nonnull final byte[] conten
* @throws IOException Throws an exception if the output stream cannot be written to
*/
public void addFilePart(@Nonnull final String name, @Nonnull final String contentType, @Nonnull final java.io.File file) throws IOException {
- final InputStream fileStream = new FileInputStream(file);
- final byte[] fileBytes = getByteArray(fileStream);
- addData(name, contentType, file.getName(), fileBytes);
+ try(final InputStream fileStream = new FileInputStream(file)) {
+ final byte[] fileBytes = getByteArray(fileStream);
+ addData(name, contentType, file.getName(), fileBytes);
+ }
}
-
+
/**
* Adds a boundary at the beginning of a new part
* @return The boundary
@@ -222,7 +223,7 @@ public void addFilePart(@Nonnull final String name, @Nonnull final String conten
private String addBoundary() {
return "--" + boundary + RETURN;
}
-
+
/**
* Adds a boundary at the end of the multipart body
* @return The boundary
@@ -230,7 +231,7 @@ private String addBoundary() {
private String addEnding() {
return "--" + boundary + "--";
}
-
+
/**
* Returns a full multipart body byte array
* @return The byte[] representation of the multipart object
@@ -242,7 +243,7 @@ public byte[] content() throws IOException {
finalStream.write(addEnding().getBytes(MULTIPART_ENCODING));
return finalStream.toByteArray();
}
-
+
/**
* Helper method to convert an InputStream to a byte[]
* @param in The input stream to convert
diff --git a/src/main/java/com/microsoft/graph/core/TimeOfDay.java b/src/main/java/com/microsoft/graph/core/TimeOfDay.java
index a49cb71d5..bc87efe02 100644
--- a/src/main/java/com/microsoft/graph/core/TimeOfDay.java
+++ b/src/main/java/com/microsoft/graph/core/TimeOfDay.java
@@ -7,6 +7,7 @@
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.Locale;
+import java.util.Objects;
/**
* The time of day
@@ -37,6 +38,7 @@ public class TimeOfDay {
*/
@Nullable
public static TimeOfDay parse(@Nonnull final String timeStr) throws ParseException {
+ Objects.requireNonNull(timeStr, "parameter timeStr cannot be null");
// break the date up into its constituent parts
final String[] timeInfo = timeStr.split(":");
diff --git a/src/main/java/com/microsoft/graph/http/BaseCollectionPage.java b/src/main/java/com/microsoft/graph/http/BaseCollectionPage.java
index 0411eab2d..fce85908a 100644
--- a/src/main/java/com/microsoft/graph/http/BaseCollectionPage.java
+++ b/src/main/java/com/microsoft/graph/http/BaseCollectionPage.java
@@ -83,7 +83,7 @@ public BaseCollectionPage(@Nonnull final List pageContents, @Nullable final T
* @param nextRequestBuilder the request builder for the next page
* @param responseAdditionalData the additional data returned by the response
*/
- public BaseCollectionPage(@Nonnull final List pageContents, @Nonnull final T2 nextRequestBuilder, @Nonnull final AdditionalDataManager responseAdditionalData) {
+ public BaseCollectionPage(@Nonnull final List pageContents, @Nullable final T2 nextRequestBuilder, @Nonnull final AdditionalDataManager responseAdditionalData) {
this(pageContents, nextRequestBuilder);
this.additionalDataManager().putAll(responseAdditionalData);
}
diff --git a/src/main/java/com/microsoft/graph/http/BaseCollectionRequest.java b/src/main/java/com/microsoft/graph/http/BaseCollectionRequest.java
index 944b3c436..c148ef198 100644
--- a/src/main/java/com/microsoft/graph/http/BaseCollectionRequest.java
+++ b/src/main/java/com/microsoft/graph/http/BaseCollectionRequest.java
@@ -26,6 +26,8 @@
import java.lang.reflect.InvocationTargetException;
import java.util.Collections;
import java.util.List;
+import java.util.Objects;
+
import javax.annotation.Nullable;
import javax.annotation.Nonnull;
@@ -82,9 +84,9 @@ public BaseCollectionRequest(@Nonnull final String requestUrl,
@Nonnull final Class responseCollectionClass,
@Nonnull final Class collectionPageClass,
@Nonnull final Class extends BaseCollectionRequestBuilder, T2, T3, ? extends BaseCollectionRequest>> collectionRequestBuilderClass) {
- this.responseCollectionClass = responseCollectionClass;
- this.collectionPageClass = collectionPageClass;
- this.collRequestBuilderClass = collectionRequestBuilderClass;
+ this.responseCollectionClass = Objects.requireNonNull(responseCollectionClass, "parameter responseCollectionClass cannot be null");
+ this.collectionPageClass = Objects.requireNonNull(collectionPageClass, "parameter collectionPageClass cannot be null");
+ this.collRequestBuilderClass = Objects.requireNonNull(collectionRequestBuilderClass, "parameter collectionRequestBuilderClass cannot be null");
baseRequest = new BaseRequest(requestUrl, client, options, responseCollectionClass) {};
}
@@ -119,6 +121,7 @@ protected java.util.concurrent.CompletableFuture sendAsync() throws ClientEx
*/
@Nullable
public T3 buildFromResponse(@Nonnull final T2 response) {
+ Objects.requireNonNull(response, "parameter response cannot be null");
try {
final Object builder = response.nextLink() == null ? null : this.collRequestBuilderClass
.getConstructor(String.class, IBaseClient.class, java.util.List.class)
@@ -170,7 +173,8 @@ public List getHeaders() {
* @param value the value of the header
*/
@Override
- public void addHeader(@Nonnull final String header, @Nonnull final String value) {
+ public void addHeader(@Nonnull final String header, @Nullable final String value) {
+ Objects.requireNonNull(header, "parameter header cannot be null");
baseRequest.addHeader(header, value);
}
@@ -210,6 +214,7 @@ public List