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 < 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;