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>)(new ChunkedUploadResult((UploadType)null)).getClass()) { + this.baseRequest = new BaseRequest>(requestUrl, client, options, (Class>)(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 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 options) { + public BatchRequest(@Nonnull final String requestUrl, @Nonnull final IBaseClient client, @Nonnull final List 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 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 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, 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