SLING-7802 Add Nullability annotations to API
diff --git a/pom.xml b/pom.xml
index b01e300..d05b2c9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -269,6 +269,11 @@
             <version>8</version>

             <scope>provided</scope>

         </dependency>

+        <dependency>

+            <groupId>org.jetbrains</groupId>

+            <artifactId>annotations</artifactId>

+            <scope>provided</scope>

+        </dependency>

     </dependencies>

 

 </project>

diff --git a/src/main/java/org/apache/sling/resourcebuilder/api/ResourceBuilder.java b/src/main/java/org/apache/sling/resourcebuilder/api/ResourceBuilder.java
index 94ff5b9..0c3f9f2 100644
--- a/src/main/java/org/apache/sling/resourcebuilder/api/ResourceBuilder.java
+++ b/src/main/java/org/apache/sling/resourcebuilder/api/ResourceBuilder.java
@@ -22,6 +22,8 @@
 import java.util.Map;
 
 import org.apache.sling.api.resource.Resource;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.osgi.annotation.versioning.ProviderType;
 
 /** Builds Sling Resources using a simple fluent API */
@@ -35,21 +37,21 @@
      *  parent Resource. 
      * @param path The path of the Resource to create.
      *    If it's a relative path this builder's current resource is used as parent.
-     *    Otherwise the resource is created ad the given absoulte path.
+     *    Otherwise the resource is created ad the given absolute path.
      * @param properties optional name-value pairs 
      * @return this builder
      */
-    ResourceBuilder resource(String path, Object... properties);
+    @NotNull ResourceBuilder resource(@NotNull String path, @NotNull Object @NotNull ... properties);
 
     /** Create a Resource, which optionally becomes the current 
      *  parent Resource. 
      * @param path The path of the Resource to create.
      *    If it's a relative path this builder's current resource is used as parent.
-     *    Otherwise the resource is created ad the given absoulte path.
+     *    Otherwise the resource is created ad the given absolute path.
      * @param properties Name-value pairs 
      * @return this builder
      */
-    ResourceBuilder resource(String path, Map<String, Object> properties);
+    @NotNull ResourceBuilder resource(@NotNull String path, @NotNull Map<String, Object> properties);
 
     /** Create a file under the current parent resource
      * @param filename The name of the created file
@@ -58,7 +60,7 @@
      * @param lastModified if &lt; 0, current time is used
      * @return this builder
      */
-    ResourceBuilder file(String filename, InputStream data, String mimeType, long lastModified);
+    @NotNull ResourceBuilder file(@NotNull String filename, @NotNull InputStream data, @Nullable String mimeType, long lastModified);
     
     /** Create a file under the current parent resource. Mime type is set using the 
      *  Sling MimeTypeService, and last modified is set to current time.
@@ -66,37 +68,37 @@
      * @param data The file data
      * @return this builder
      */
-    ResourceBuilder file(String filename, InputStream data);
+    @NotNull ResourceBuilder file(@NotNull String filename, @NotNull InputStream data);
     
     /** Commit created resources */
-    ResourceBuilder commit();
+    @NotNull ResourceBuilder commit();
     
     /** Set the primary type for intermediate resources created
      *  when the parent of resource being created does not exist.
      * @param primaryType If null the DEFAULT_PRIMARY_TYPE is used.
      * @return this builder
      */
-    ResourceBuilder withIntermediatePrimaryType(String primaryType);
+    @NotNull ResourceBuilder withIntermediatePrimaryType(@Nullable String primaryType);
     
     /** Set siblings mode (as opposed to hierarchy mode) where creating a resource 
      *  doesn't change the current parent. Used to create flat structures.
      *  This is off by default.
      * @return this builder
      */
-    ResourceBuilder siblingsMode();
+    @NotNull ResourceBuilder siblingsMode();
     
     /** Set hierarchy mode (as opposed to siblings mode) where creating a resource 
      *  sets it as the current parent. Used to create tree structures.
      *  This is on by default.
      * @return this builder
      */
-    ResourceBuilder hierarchyMode();
+    @NotNull ResourceBuilder hierarchyMode();
     
     /** Return the current parent resource */
-    Resource getCurrentParent();
+    @NotNull Resource getCurrentParent();
     
     /** Reset the current parent Resource to the original one.
      *  Also activates hierarchyMode which is the default mode. */ 
-    ResourceBuilder atParent();
+    @NotNull ResourceBuilder atParent();
 
 }
diff --git a/src/main/java/org/apache/sling/resourcebuilder/api/ResourceBuilderFactory.java b/src/main/java/org/apache/sling/resourcebuilder/api/ResourceBuilderFactory.java
index ad0ef36..cc50cbd 100644
--- a/src/main/java/org/apache/sling/resourcebuilder/api/ResourceBuilderFactory.java
+++ b/src/main/java/org/apache/sling/resourcebuilder/api/ResourceBuilderFactory.java
@@ -20,6 +20,7 @@
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
+import org.jetbrains.annotations.NotNull;
 import org.osgi.annotation.versioning.ProviderType;
 
 /**
@@ -31,12 +32,12 @@
     /** Start a ResourceBuilder using the supplied parent resource 
      *  @return the new builder
      * */
-    ResourceBuilder forParent(Resource parent);
+    @NotNull ResourceBuilder forParent(@NotNull Resource parent);
     
     /** Start a ResourceBuilder using the supplied ResourceResolver,
      *  starting with the root resource as the builder's parent resource. 
      *  @return the new builder
      * */
-    ResourceBuilder forResolver(ResourceResolver r);
+    @NotNull ResourceBuilder forResolver(@NotNull ResourceResolver r);
     
 }
diff --git a/src/main/java/org/apache/sling/resourcebuilder/impl/MapArgsConverter.java b/src/main/java/org/apache/sling/resourcebuilder/impl/MapArgsConverter.java
index 433dfb2..3966f6e 100644
--- a/src/main/java/org/apache/sling/resourcebuilder/impl/MapArgsConverter.java
+++ b/src/main/java/org/apache/sling/resourcebuilder/impl/MapArgsConverter.java
@@ -23,13 +23,16 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.jetbrains.annotations.NotNull;
+
 /** Convert arguments which are a list of Object to a Map, used
  *  to simplify our builder's syntax.
  */
 public class MapArgsConverter {
     
     /** Convert an args list to a Map */
-    public static Map<String, Object> toMap(Object ... args) {
+    @SuppressWarnings("null")
+    public static @NotNull Map<String, Object> toMap(@NotNull Object @NotNull ... args) {
         if(args.length % 2 != 0) {
             throw new IllegalArgumentException("args must be an even number of name/values:" + Arrays.asList(args));
         }
diff --git a/src/main/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderFactoryService.java b/src/main/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderFactoryService.java
index 5c4fb61..1046ddf 100644
--- a/src/main/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderFactoryService.java
+++ b/src/main/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderFactoryService.java
@@ -23,6 +23,7 @@
 import org.apache.sling.commons.mime.MimeTypeService;
 import org.apache.sling.resourcebuilder.api.ResourceBuilder;
 import org.apache.sling.resourcebuilder.api.ResourceBuilderFactory;
+import org.jetbrains.annotations.NotNull;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
 
@@ -35,13 +36,14 @@
     @Reference
     private MimeTypeService mimeTypeService;
     
+    @SuppressWarnings("null")
     @Override
-    public ResourceBuilder forParent(Resource parent) {
+    public @NotNull ResourceBuilder forParent(@NotNull Resource parent) {
         return new ResourceBuilderImpl(parent, mimeTypeService);
     }
 
     @Override
-    public ResourceBuilder forResolver(ResourceResolver r) {
+    public @NotNull ResourceBuilder forResolver(@NotNull ResourceResolver r) {
         final Resource root = r.getResource("/");
         if(root == null) {
             throw new IllegalStateException("Cannot read root resource");
diff --git a/src/main/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImpl.java b/src/main/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImpl.java
index d95d35a..17ed5fd 100644
--- a/src/main/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImpl.java
+++ b/src/main/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImpl.java
@@ -30,12 +30,15 @@
 import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.commons.mime.MimeTypeService;
 import org.apache.sling.resourcebuilder.api.ResourceBuilder;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 /** ResourceBuilder implementation */
+@SuppressWarnings("null")
 public class ResourceBuilderImpl implements ResourceBuilder {
-    private final Resource originalParent;
-    private final ResourceResolver resourceResolver;
-    private Resource currentParent;
+    private final @NotNull Resource originalParent;
+    private final @NotNull ResourceResolver resourceResolver;
+    private @NotNull Resource currentParent;
     private String intermediatePrimaryType;
     private boolean hierarchyMode;
     
@@ -51,11 +54,11 @@
             "Cannot reset the parent resource or resource resolver, please create a new "
             + "builder using the ResourceBuilder service";
     
-    private final MimeTypeService mimeTypeService;
+    private final @NotNull MimeTypeService mimeTypeService;
     
-    public ResourceBuilderImpl(Resource parent, MimeTypeService mts) {
+    public ResourceBuilderImpl(@NotNull Resource parent, @NotNull MimeTypeService mts) {
         mimeTypeService = mts;
-        if(parent == null) {
+        if (parent == null) {
             throw new IllegalArgumentException("Parent resource is null");
         }
         originalParent = parent;
@@ -65,8 +68,8 @@
         hierarchyMode = true;
     }
     
-    private ResourceBuilderImpl cloneResourceBuilder(Resource newCurrentParent,
-            String newIntermediatePrimaryType, boolean newHierarchyMode) {
+    private @NotNull ResourceBuilderImpl cloneResourceBuilder(@NotNull Resource newCurrentParent,
+            @Nullable String newIntermediatePrimaryType, boolean newHierarchyMode) {
         ResourceBuilderImpl clone = new ResourceBuilderImpl(originalParent, mimeTypeService);
         clone.currentParent = newCurrentParent;
         clone.intermediatePrimaryType = newIntermediatePrimaryType;
@@ -75,12 +78,12 @@
     }
     
     @Override
-    public Resource getCurrentParent() {
+    public @NotNull Resource getCurrentParent() {
         return currentParent;
     }
 
     @Override
-    public ResourceBuilder atParent() {
+    public @NotNull ResourceBuilder atParent() {
         return cloneResourceBuilder(originalParent, this.intermediatePrimaryType, true);
     }
     
@@ -107,7 +110,7 @@
     }
     
     @Override
-    public ResourceBuilder resource(String path, Map<String,Object> properties) {
+    public @NotNull ResourceBuilder resource(@NotNull String path, @NotNull Map<String,Object> properties) {
         Resource r = null;
         
         final String parentPath;
@@ -132,7 +135,7 @@
             } else {
                 // Resource exists, set our properties
                 final ModifiableValueMap mvm = r.adaptTo(ModifiableValueMap.class);
-                if(mvm == null) {
+                if (mvm == null) {
                     throw new IllegalStateException("Cannot modify properties of " + r.getPath());
                 }
                 for(Map.Entry <String, Object> e : properties.entrySet()) {
@@ -154,7 +157,7 @@
     
     @SuppressWarnings("unchecked")
     @Override
-    public ResourceBuilder resource(String path, Object... properties) {
+    public @NotNull ResourceBuilder resource(@NotNull String path, @NotNull Object @NotNull ... properties) {
         if (properties == null || properties.length == 0) {
             return resource(path, ValueMap.EMPTY);
         }
@@ -209,7 +212,7 @@
     }
     
     @Override
-    public ResourceBuilder file(String relativePath, InputStream data, String mimeType, long lastModified) {
+    public @NotNull ResourceBuilder file(@NotNull String relativePath, @NotNull InputStream data, @Nullable String mimeType, long lastModified) {
         checkRelativePath(relativePath);
         final String name = ResourceUtil.getName(relativePath);
         if(data == null) {
@@ -250,28 +253,28 @@
     }
 
     @Override
-    public ResourceBuilder file(String filename, InputStream data) {
+    public @NotNull ResourceBuilder file(@NotNull String filename, @NotNull InputStream data) {
         return file(filename, data, null, -1);
     }
 
     @Override
-    public ResourceBuilder withIntermediatePrimaryType(String primaryType) {
+    public @NotNull ResourceBuilder withIntermediatePrimaryType(@Nullable String primaryType) {
         String intermediatePrimaryType = primaryType == null ? DEFAULT_PRIMARY_TYPE : primaryType;
         return cloneResourceBuilder(currentParent, intermediatePrimaryType, hierarchyMode);
     }
 
     @Override
-    public ResourceBuilder siblingsMode() {
+    public @NotNull ResourceBuilder siblingsMode() {
         return cloneResourceBuilder(currentParent, intermediatePrimaryType, false);
     }
 
     @Override
-    public ResourceBuilder hierarchyMode() {
+    public @NotNull ResourceBuilder hierarchyMode() {
         return cloneResourceBuilder(currentParent, intermediatePrimaryType, true);
     }
     
     @Override
-    public ResourceBuilder commit() {
+    public @NotNull ResourceBuilder commit() {
         try {
             resourceResolver.commit();
         } catch (PersistenceException ex) {
diff --git a/src/test/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImplTest.java b/src/test/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImplTest.java
index 46d0b11..77e7ddd 100644
--- a/src/test/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImplTest.java
+++ b/src/test/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImplTest.java
@@ -45,6 +45,7 @@
 import org.mockito.junit.MockitoJUnitRunner;
 
 @RunWith(MockitoJUnitRunner.class)
+@SuppressWarnings("null")
 public class ResourceBuilderImplTest {
     
     private String testRootPath;
diff --git a/src/test/java/org/apache/sling/resourcebuilder/it/FileRetrievalIT.java b/src/test/java/org/apache/sling/resourcebuilder/it/FileRetrievalIT.java
index 76630a8..ea58168 100644
--- a/src/test/java/org/apache/sling/resourcebuilder/it/FileRetrievalIT.java
+++ b/src/test/java/org/apache/sling/resourcebuilder/it/FileRetrievalIT.java
@@ -42,6 +42,7 @@
  *  by creating a file and retrieving it via
  *  a Sling request. 
  */
+@SuppressWarnings("null")
 public class FileRetrievalIT {
     
     @Rule
diff --git a/src/test/java/org/apache/sling/resourcebuilder/it/ResourceBuilderIT.java b/src/test/java/org/apache/sling/resourcebuilder/it/ResourceBuilderIT.java
index 3ec402c..ace30df 100644
--- a/src/test/java/org/apache/sling/resourcebuilder/it/ResourceBuilderIT.java
+++ b/src/test/java/org/apache/sling/resourcebuilder/it/ResourceBuilderIT.java
@@ -35,6 +35,7 @@
 /** Server-side integration test for the 
  *  ResourceBuilder, acquired via the ResourceBuilderProvider
  */
+@SuppressWarnings("null")
 public class ResourceBuilderIT {
     
     @Rule
diff --git a/src/test/java/org/apache/sling/resourcebuilder/it/TestEnvironment.java b/src/test/java/org/apache/sling/resourcebuilder/it/TestEnvironment.java
index 0678392..8b0334a 100644
--- a/src/test/java/org/apache/sling/resourcebuilder/it/TestEnvironment.java
+++ b/src/test/java/org/apache/sling/resourcebuilder/it/TestEnvironment.java
@@ -29,6 +29,7 @@
 import org.apache.sling.resourcebuilder.api.ResourceBuilder;
 import org.apache.sling.resourcebuilder.api.ResourceBuilderFactory;
 
+@SuppressWarnings("null")
 class TestEnvironment {
     
     final ResourceBuilder builder;
diff --git a/src/test/java/org/apache/sling/resourcebuilder/test/ResourceAssertions.java b/src/test/java/org/apache/sling/resourcebuilder/test/ResourceAssertions.java
index 787c66d..7abad01 100644
--- a/src/test/java/org/apache/sling/resourcebuilder/test/ResourceAssertions.java
+++ b/src/test/java/org/apache/sling/resourcebuilder/test/ResourceAssertions.java
@@ -37,6 +37,7 @@
 import org.apache.sling.resourcebuilder.impl.ResourceBuilderImpl;
 
 /** Utilities for asserting Resources and their properties */
+@SuppressWarnings("null")
 public class ResourceAssertions {
     
     private final ResourceResolver resourceResolver;