This is an automated email from the ASF dual-hosted git repository.

pauls pushed a commit to branch issues/SLING-9974
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-cpconverter.git

commit 13832549fe0173350a395d361f9088c7976dba37
Author: Karl Pauls <[email protected]>
AuthorDate: Tue Jan 12 16:43:48 2021 +0100

    SLING-9974: add nullability annotations
---
 .../ContentPackage2FeatureModelConverter.java      | 66 ++++++++++----------
 .../accesscontrol/AccessControlEntry.java          | 14 +++--
 .../accesscontrol/DefaultAclManager.java           | 71 ++++++++++-----------
 .../accesscontrol/PrimaryTypeParser.java           |  3 +-
 .../cpconverter/accesscontrol/SystemUser.java      |  9 +--
 .../cpconverter/artifacts/ArtifactWriter.java      |  4 +-
 .../cpconverter/artifacts/ArtifactsDeployer.java   |  5 +-
 .../artifacts/DefaultArtifactsDeployer.java        |  7 ++-
 .../cpconverter/artifacts/FileArtifactWriter.java  |  6 +-
 .../artifacts/InputStreamArtifactWriter.java       |  5 +-
 .../artifacts/MavenPomSupplierWriter.java          |  5 +-
 ...ntentPackage2FeatureModelConverterLauncher.java |  7 ++-
 .../feature/cpconverter/cli/ShutDownHook.java      |  3 +-
 .../features/DefaultFeaturesManager.java           | 36 ++++++-----
 .../cpconverter/features/FeaturesManager.java      | 18 +++---
 .../cpconverter/features/RunmodeMapper.java        |  9 ++-
 .../filtering/RegexBasedResourceFilter.java        |  5 +-
 .../cpconverter/filtering/ResourceFilter.java      |  4 +-
 .../AbstractConfigurationEntryHandler.java         | 10 +--
 .../handlers/AbstractContentPackageHandler.java    |  6 +-
 .../cpconverter/handlers/AbstractPolicyParser.java |  3 +-
 .../handlers/AbstractRegexEntryHandler.java        |  9 +--
 .../cpconverter/handlers/BundleEntryHandler.java   | 32 +++++-----
 .../handlers/ConfigurationEntryHandler.java        |  3 +-
 .../handlers/ContentPackageEntryHandler.java       | 12 ++--
 .../handlers/DefaultEntryHandlersManager.java      | 12 ++--
 .../feature/cpconverter/handlers/EntryHandler.java |  5 +-
 .../cpconverter/handlers/EntryHandlersManager.java |  7 ++-
 .../handlers/JsonConfigurationEntryHandler.java    |  3 +-
 .../handlers/NodeTypesEntryHandler.java            | 12 ++--
 .../cpconverter/handlers/PrivilegesHandler.java    |  5 +-
 .../PropertiesConfigurationEntryHandler.java       |  4 +-
 .../handlers/SystemUsersEntryHandler.java          |  5 +-
 .../VersionResolverContentPackageEntryHandler.java | 10 +--
 .../handlers/XmlConfigurationEntryHandler.java     | 72 ++++++++++------------
 .../interpolator/SimpleVariablesInterpolator.java  |  5 +-
 .../interpolator/VariablesInterpolator.java        |  5 +-
 .../cpconverter/shared/AbstractJcrNodeParser.java  |  5 +-
 .../sling/feature/cpconverter/shared/RepoPath.java | 11 ++--
 .../vltpkg/BaseVaultPackageScanner.java            | 20 +++---
 .../vltpkg/DefaultPackagesEventsEmitter.java       | 13 ++--
 .../cpconverter/vltpkg/PackagesEventsEmitter.java  |  5 +-
 .../vltpkg/RecollectorVaultPackageScanner.java     |  7 ++-
 .../cpconverter/vltpkg/VaultPackageAssembler.java  | 47 +++++++-------
 .../cpconverter/vltpkg/VaultPackageUtils.java      |  8 ++-
 45 files changed, 336 insertions(+), 277 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
index ee41228..d9a3ef7 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
@@ -54,6 +54,8 @@ import 
org.apache.sling.feature.cpconverter.vltpkg.BaseVaultPackageScanner;
 import org.apache.sling.feature.cpconverter.vltpkg.PackagesEventsEmitter;
 import 
org.apache.sling.feature.cpconverter.vltpkg.RecollectorVaultPackageScanner;
 import org.apache.sling.feature.cpconverter.vltpkg.VaultPackageAssembler;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class ContentPackage2FeatureModelConverter extends 
BaseVaultPackageScanner {
 
@@ -79,9 +81,9 @@ public class ContentPackage2FeatureModelConverter extends 
BaseVaultPackageScanne
 
     private ArtifactsDeployer artifactsDeployer;
 
-    private VaultPackageAssembler mainPackageAssembler = null;
+    private VaultPackageAssembler mainPackageAssembler;
 
-    private RecollectorVaultPackageScanner recollectorVaultPackageScanner;
+    private final RecollectorVaultPackageScanner 
recollectorVaultPackageScanner;
 
     private PackagesEventsEmitter emitter;
 
@@ -98,68 +100,68 @@ public class ContentPackage2FeatureModelConverter extends 
BaseVaultPackageScanne
         this.recollectorVaultPackageScanner = new 
RecollectorVaultPackageScanner(this, this.packageManager, strictValidation, 
subContentPackages);
     }
 
-    public ContentPackage2FeatureModelConverter 
setEntryHandlersManager(EntryHandlersManager handlersManager) {
+    public @NotNull ContentPackage2FeatureModelConverter 
setEntryHandlersManager(@Nullable EntryHandlersManager handlersManager) {
         this.handlersManager = handlersManager;
         return this;
     }
 
-    public FeaturesManager getFeaturesManager() {
+    public @Nullable FeaturesManager getFeaturesManager() {
         return featuresManager;
     }
 
-    public ContentPackage2FeatureModelConverter 
setFeaturesManager(FeaturesManager featuresManager) {
+    public @NotNull ContentPackage2FeatureModelConverter 
setFeaturesManager(@Nullable FeaturesManager featuresManager) {
         this.featuresManager = featuresManager;
         return this;
     }
 
-    public ContentPackage2FeatureModelConverter 
setResourceFilter(ResourceFilter resourceFilter) {
+    public @NotNull ContentPackage2FeatureModelConverter 
setResourceFilter(@Nullable ResourceFilter resourceFilter) {
         this.resourceFilter = resourceFilter;
         return this;
     }
 
-    public ArtifactsDeployer getArtifactsDeployer() {
+    public @Nullable ArtifactsDeployer getArtifactsDeployer() {
         return artifactsDeployer;
     }
 
-    public ContentPackage2FeatureModelConverter 
setBundlesDeployer(ArtifactsDeployer bundlesDeployer) {
+    public @NotNull ContentPackage2FeatureModelConverter 
setBundlesDeployer(@Nullable ArtifactsDeployer bundlesDeployer) {
         this.artifactsDeployer = bundlesDeployer;
         return this;
     }
 
-    public AclManager getAclManager() {
+    public @Nullable AclManager getAclManager() {
         return aclManager;
     }
 
-    public ContentPackage2FeatureModelConverter setAclManager(AclManager 
aclManager) {
+    public @NotNull ContentPackage2FeatureModelConverter 
setAclManager(@Nullable AclManager aclManager) {
         this.aclManager = aclManager;
         return this;
     }
 
-    public VaultPackageAssembler getMainPackageAssembler() {
+    public @Nullable VaultPackageAssembler getMainPackageAssembler() {
         return mainPackageAssembler;
     }
 
-    public ContentPackage2FeatureModelConverter 
setEmitter(PackagesEventsEmitter emitter) {
+    public @NotNull ContentPackage2FeatureModelConverter setEmitter(@Nullable 
PackagesEventsEmitter emitter) {
         this.emitter = emitter;
         return this;
     }
     
-    public ContentPackage2FeatureModelConverter setDropContent(boolean 
dropContent) {
+    public @NotNull ContentPackage2FeatureModelConverter 
setDropContent(boolean dropContent) {
         this.dropContent = dropContent;
         return this;
     }
 
-    public ContentPackage2FeatureModelConverter setFailOnMixedPackages(boolean 
failOnMixedPackages) {
+    public @NotNull ContentPackage2FeatureModelConverter 
setFailOnMixedPackages(boolean failOnMixedPackages) {
         this.failOnMixedPackages = failOnMixedPackages;
         return this;
     }
 
-    public void convert(File...contentPackages) throws Exception {
+    public void convert(@NotNull File...contentPackages) throws Exception {
         requireNonNull(contentPackages , "Null content-package(s) can not be 
converted.");
         secondPass(firstPass(contentPackages));
     }
 
-    protected Collection<VaultPackage> firstPass(File...contentPackages) 
throws Exception {
+    protected @NotNull Collection<VaultPackage> firstPass(@NotNull 
File...contentPackages) throws Exception {
         Map<PackageId, VaultPackage> idFileMap = new LinkedHashMap<>();
         Map<PackageId, VaultPackage> idPackageMapping = new 
ConcurrentHashMap<>();
 
@@ -185,7 +187,7 @@ public class ContentPackage2FeatureModelConverter extends 
BaseVaultPackageScanne
         logger.info("Ordering input content-package(s) {}...", 
idPackageMapping.keySet());
 
         for (VaultPackage pack : idPackageMapping.values()) {
-            orderDependencies(idFileMap, idPackageMapping, pack, new 
HashSet<PackageId>());
+            orderDependencies(idFileMap, idPackageMapping, pack, new 
HashSet<>());
         }
 
         logger.info("New content-package(s) order: {}", idFileMap.keySet());
@@ -193,7 +195,7 @@ public class ContentPackage2FeatureModelConverter extends 
BaseVaultPackageScanne
         return idFileMap.values();
     }
 
-    protected void secondPass(Collection<VaultPackage> orderedContentPackages) 
throws Exception {
+    protected void secondPass(@NotNull Collection<VaultPackage> 
orderedContentPackages) throws Exception {
         emitter.start();
 
         for (VaultPackage vaultPackage : orderedContentPackages) {
@@ -210,7 +212,7 @@ public class ContentPackage2FeatureModelConverter extends 
BaseVaultPackageScanne
 
                 traverse(vaultPackage);
 
-                // make sure 
+                // make sure
 
                 mainPackageAssembler.updateDependencies(mutableContentsIds);
 
@@ -247,10 +249,10 @@ public class ContentPackage2FeatureModelConverter extends 
BaseVaultPackageScanne
         emitter.end();
     }
 
-    private void orderDependencies(Map<PackageId, VaultPackage> idFileMap,
-                                   Map<PackageId, VaultPackage> 
idPackageMapping,
-                                   VaultPackage pack,
-                                   Set<PackageId> visited) throws 
CyclicDependencyException {
+    private void orderDependencies(@NotNull Map<PackageId, VaultPackage> 
idFileMap,
+                                   @NotNull Map<PackageId, VaultPackage> 
idPackageMapping,
+                                   @NotNull VaultPackage pack,
+                                   @NotNull Set<PackageId> visited) throws 
CyclicDependencyException {
         if (!visited.add(pack.getId())) {
             throw new CyclicDependencyException("Cyclic dependency detected, " 
+ pack.getId() + " was previously visited already");
         }
@@ -268,7 +270,7 @@ public class ContentPackage2FeatureModelConverter extends 
BaseVaultPackageScanne
         idPackageMapping.remove(pack.getId());
     }
 
-    public void processSubPackage(String path, String runMode, VaultPackage 
vaultPackage, boolean isEmbeddedPackage) throws Exception {
+    public void processSubPackage(@NotNull String path, @Nullable String 
runMode, @NotNull VaultPackage vaultPackage, boolean isEmbeddedPackage) throws 
Exception {
         requireNonNull(path, "Impossible to process a null vault package");
         requireNonNull(vaultPackage, "Impossible to process a null vault 
package");
 
@@ -315,10 +317,10 @@ public class ContentPackage2FeatureModelConverter extends 
BaseVaultPackageScanne
         emitter.endSubPackage();
     }
 
-    private void processContentPackageArchive(File contentPackageArchive,
-                                              String runMode,
-                                              ArtifactId mvnPackageId,
-                                              PackageId originalPackageId) 
throws Exception {
+    private void processContentPackageArchive(@NotNull File 
contentPackageArchive,
+                                              @Nullable String runMode,
+                                              @NotNull ArtifactId mvnPackageId,
+                                              @NotNull PackageId 
originalPackageId) throws Exception {
         try (VaultPackage vaultPackage = open(contentPackageArchive)) {
             PackageType packageType = detectPackageType(vaultPackage);
 
@@ -344,12 +346,12 @@ public class ContentPackage2FeatureModelConverter extends 
BaseVaultPackageScanne
         }
     }
 
-    protected boolean isSubContentPackageIncluded(String path) {
+    protected boolean isSubContentPackageIncluded(@NotNull String path) {
         return subContentPackages.containsValue(path);
     }
 
     @Override
-    protected void onFile(String entryPath, Archive archive, Entry entry) 
throws Exception {
+    protected void onFile(@NotNull String entryPath, @NotNull Archive archive, 
@NotNull Entry entry) throws Exception {
         if (resourceFilter != null && resourceFilter.isFilteredOut(entryPath)) 
{
             throw new IllegalArgumentException("Path '"
                                                + entryPath
@@ -366,7 +368,7 @@ public class ContentPackage2FeatureModelConverter extends 
BaseVaultPackageScanne
         entryHandler.handle(entryPath, archive, entry, this);
     }
 
-    private static ArtifactId toArtifactId(VaultPackage vaultPackage) {
+    private static @NotNull ArtifactId toArtifactId(@NotNull VaultPackage 
vaultPackage) {
         PackageId packageId = vaultPackage.getId();
         String groupId = requireNonNull(packageId.getGroup(),
             PackageProperties.NAME_GROUP
@@ -393,7 +395,7 @@ public class ContentPackage2FeatureModelConverter extends 
BaseVaultPackageScanne
     }
 
     @Override
-    protected void addCdnPattern(Pattern cndPattern) {
+    protected void addCdnPattern(@NotNull Pattern cndPattern) {
         handlersManager.addEntryHandler(new NodeTypesEntryHandler(cndPattern));
     }
 
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/accesscontrol/AccessControlEntry.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/accesscontrol/AccessControlEntry.java
index f07eef7..6e05162 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/accesscontrol/AccessControlEntry.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/accesscontrol/AccessControlEntry.java
@@ -17,6 +17,8 @@
 package org.apache.sling.feature.cpconverter.accesscontrol;
 
 import org.apache.sling.feature.cpconverter.shared.RepoPath;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.LinkedList;
 import java.util.List;
@@ -34,31 +36,31 @@ public final class AccessControlEntry {
 
     private final List<String> restrictions = new LinkedList<>();
 
-    public AccessControlEntry(boolean isAllow, String privileges, RepoPath 
repositoryPath) {
+    public AccessControlEntry(boolean isAllow, @Nullable String privileges, 
@NotNull RepoPath repositoryPath) {
         this.isAllow = isAllow;
         this.privileges = privileges;
         this.repositoryPath = repositoryPath;
     }
 
-    public void addRestriction(String restriction) {
+    public void addRestriction(@Nullable String restriction) {
         if (restriction != null && !restriction.isEmpty()) {
             restrictions.add(restriction);
         }
     }
 
-    public String getOperation() {
+    public @NotNull String getOperation() {
         return isAllow ? "allow" : "deny";
     }
 
-    public String getPrivileges() {
+    public @Nullable String getPrivileges() {
         return privileges;
     }
 
-    public RepoPath getRepositoryPath() {
+    public @NotNull RepoPath getRepositoryPath() {
         return repositoryPath;
     }
 
-    public List<String> getRestrictions() {
+    public @NotNull List<String> getRestrictions() {
         return restrictions;
     }
 
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/accesscontrol/DefaultAclManager.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/accesscontrol/DefaultAclManager.java
index f348c02..2bc6e06 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/accesscontrol/DefaultAclManager.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/accesscontrol/DefaultAclManager.java
@@ -20,6 +20,8 @@ import org.apache.jackrabbit.vault.util.PlatformNameFormat;
 import org.apache.sling.feature.cpconverter.features.FeaturesManager;
 import org.apache.sling.feature.cpconverter.shared.RepoPath;
 import org.apache.sling.feature.cpconverter.vltpkg.VaultPackageAssembler;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -53,18 +55,18 @@ public final class DefaultAclManager implements AclManager {
 
     private final Map<String, List<AccessControlEntry>> acls = new HashMap<>();
 
-    private List<String> nodetypeRegistrationSentences = new LinkedList<>();
+    private final List<String> nodetypeRegistrationSentences = new 
LinkedList<>();
 
-    private Set<String> privileges = new LinkedHashSet<>();
+    private final Set<String> privileges = new LinkedHashSet<>();
 
-    public boolean addSystemUser(SystemUser systemUser) {
+    public boolean addSystemUser(@NotNull SystemUser systemUser) {
         if (preProvidedSystemUsers.add(systemUser)) {
             return systemUsers.add(systemUser);
         }
         return false;
     }
 
-    public boolean addAcl(String systemUser, AccessControlEntry acl) {
+    public boolean addAcl(@NotNull String systemUser, @NotNull 
AccessControlEntry acl) {
         if (getSystemUser(systemUser).isPresent()) {
             acls.computeIfAbsent(systemUser, k -> new LinkedList<>()).add(acl);
             return true;
@@ -72,7 +74,7 @@ public final class DefaultAclManager implements AclManager {
         return false;
     }
 
-    private void addPath(RepoPath path, Set<RepoPath> paths) {
+    private void addPath(@NotNull RepoPath path, @NotNull Set<RepoPath> paths) 
{
         if (preProvidedPaths.add(path)) {
             paths.add(path);
         }
@@ -83,10 +85,8 @@ public final class DefaultAclManager implements AclManager {
         }
     }
 
-    public void addRepoinitExtension(List<VaultPackageAssembler> 
packageAssemblers, FeaturesManager featureManager) {
-        Formatter formatter = null;
-        try {
-            formatter = new Formatter();
+    public void addRepoinitExtension(@NotNull List<VaultPackageAssembler> 
packageAssemblers, @NotNull FeaturesManager featureManager) {
+        try (Formatter formatter = new Formatter()) {
 
             if (!privileges.isEmpty()) {
                 for (String privilege : privileges) {
@@ -112,7 +112,9 @@ public final class DefaultAclManager implements AclManager {
 
                 List<AccessControlEntry> authorizations = 
acls.remove(systemUser.getId());
 
-                addStatements(systemUser, authorizations, packageAssemblers, 
formatter);
+                if (authorizations != null) {
+                    addStatements(systemUser, authorizations, 
packageAssemblers, formatter);
+                }
             }
 
             // all the resting ACLs can now be set
@@ -122,8 +124,9 @@ public final class DefaultAclManager implements AclManager {
 
                 if (systemUser.isPresent()) {
                     List<AccessControlEntry> authorizations = 
currentAcls.getValue();
-
-                    addStatements(systemUser.get(), authorizations, 
packageAssemblers, formatter);
+                    if (authorizations != null) {
+                        addStatements(systemUser.get(), authorizations, 
packageAssemblers, formatter);
+                    }
                 }
             }
 
@@ -132,26 +135,20 @@ public final class DefaultAclManager implements 
AclManager {
             if (!text.isEmpty()) {
                 featureManager.addOrAppendRepoInitExtension(text, null);
             }
-        } finally {
-            if (formatter != null) {
-                formatter.close();
-            }
         }
     }
 
-    private void addStatements(SystemUser systemUser,
-                               List<AccessControlEntry> authorizations,
-                               List<VaultPackageAssembler> packageAssemblers,
-                               Formatter formatter) {
+    private void addStatements(@NotNull SystemUser systemUser,
+                               @NotNull List<AccessControlEntry> 
authorizations,
+                               @NotNull List<VaultPackageAssembler> 
packageAssemblers,
+                               @NotNull Formatter formatter) {
         // clean the unneeded ACLs, see SLING-8561
-        if (authorizations != null) {
-            Iterator<AccessControlEntry> authorizationsIterator = 
authorizations.iterator();
-            while (authorizationsIterator.hasNext()) {
-                AccessControlEntry acl = authorizationsIterator.next();
+        Iterator<AccessControlEntry> authorizationsIterator = 
authorizations.iterator();
+        while (authorizationsIterator.hasNext()) {
+            AccessControlEntry acl = authorizationsIterator.next();
 
-                if 
(acl.getRepositoryPath().startsWith(systemUser.getIntermediatePath())) {
-                    authorizationsIterator.remove();
-                }
+            if 
(acl.getRepositoryPath().startsWith(systemUser.getIntermediatePath())) {
+                authorizationsIterator.remove();
             }
         }
 
@@ -164,7 +161,7 @@ public final class DefaultAclManager implements AclManager {
         addAclStatement(formatter, systemUser.getId(), authorizations);
     }
 
-    private Optional<SystemUser> getSystemUser(String id) {
+    private @NotNull Optional<SystemUser> getSystemUser(@NotNull String id) {
         for (SystemUser systemUser : preProvidedSystemUsers) {
             if (id.equals(systemUser.getId())) {
                 return Optional.of(systemUser);
@@ -173,21 +170,21 @@ public final class DefaultAclManager implements 
AclManager {
         return Optional.empty();
     }
 
-    private final void addSystemUserPath(Formatter formatter, RepoPath path) {
+    private void addSystemUserPath(@NotNull Formatter formatter, @NotNull 
RepoPath path) {
         if (preProvidedSystemPaths.add(path)) {
             formatter.format("create path (rep:AuthorizableFolder) %s%n", 
path);
         }
     }
 
     @Override
-    public void addNodetypeRegistrationSentence(String 
nodetypeRegistrationSentence) {
+    public void addNodetypeRegistrationSentence(@Nullable String 
nodetypeRegistrationSentence) {
         if (nodetypeRegistrationSentence != null) {
             nodetypeRegistrationSentences.add(nodetypeRegistrationSentence);
         }
     }
 
     @Override
-    public void addPrivilege(String privilege) {
+    public void addPrivilege(@NotNull String privilege) {
         privileges.add(privilege);
     }
 
@@ -198,7 +195,7 @@ public final class DefaultAclManager implements AclManager {
         privileges.clear();
     }
 
-    private void addPaths(List<AccessControlEntry> authorizations, 
List<VaultPackageAssembler> packageAssemblers, Formatter formatter) {
+    private void addPaths(@NotNull List<AccessControlEntry> authorizations, 
@NotNull List<VaultPackageAssembler> packageAssemblers, @NotNull Formatter 
formatter) {
         if (areEmpty(authorizations)) {
             return;
         }
@@ -215,7 +212,7 @@ public final class DefaultAclManager implements AclManager {
         }
     }
 
-       private static String computePathType(RepoPath path, 
List<VaultPackageAssembler> packageAssemblers) {
+       private static @NotNull String computePathType(@NotNull RepoPath path, 
@NotNull List<VaultPackageAssembler> packageAssemblers) {
         path = new 
RepoPath(PlatformNameFormat.getPlatformPath(path.toString()));
 
         for (VaultPackageAssembler packageAssembler: packageAssemblers) {
@@ -239,8 +236,8 @@ public final class DefaultAclManager implements AclManager {
         return DEFAULT_TYPE;
     }
 
-    private static void addAclStatement(Formatter formatter, String 
systemUser, List<AccessControlEntry> authorizations) {
-        if (authorizations == null || areEmpty(authorizations)) {
+    private static void addAclStatement(@NotNull Formatter formatter, @NotNull 
String systemUser, @NotNull List<AccessControlEntry> authorizations) {
+        if (areEmpty(authorizations)) {
             return;
         }
 
@@ -254,7 +251,7 @@ public final class DefaultAclManager implements AclManager {
 
             if (!authorization.getRestrictions().isEmpty()) {
                 formatter.format(" restriction(%s)",
-                                 
authorization.getRestrictions().stream().collect(Collectors.joining(",")));
+                        String.join(",", authorization.getRestrictions()));
             }
 
             formatter.format("%n");
@@ -263,7 +260,7 @@ public final class DefaultAclManager implements AclManager {
         formatter.format("end%n");
     }
 
-    private static boolean areEmpty(List<AccessControlEntry> authorizations) {
+    private static boolean areEmpty(@Nullable List<AccessControlEntry> 
authorizations) {
         return authorizations == null || authorizations.isEmpty();
     }
 }
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/accesscontrol/PrimaryTypeParser.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/accesscontrol/PrimaryTypeParser.java
index 2208cd9..ce600c2 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/accesscontrol/PrimaryTypeParser.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/accesscontrol/PrimaryTypeParser.java
@@ -17,6 +17,7 @@
 package org.apache.sling.feature.cpconverter.accesscontrol;
 
 import org.apache.sling.feature.cpconverter.shared.AbstractJcrNodeParser;
+import org.jetbrains.annotations.NotNull;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 
@@ -24,7 +25,7 @@ final class PrimaryTypeParser extends 
AbstractJcrNodeParser<String> {
 
     private String detectedPrimaryType;
 
-    public PrimaryTypeParser(String primaryType) {
+    public PrimaryTypeParser(@NotNull String primaryType) {
         super(primaryType);
     }
 
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/accesscontrol/SystemUser.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/accesscontrol/SystemUser.java
index d467259..6cce9f4 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/accesscontrol/SystemUser.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/accesscontrol/SystemUser.java
@@ -17,6 +17,7 @@
 package org.apache.sling.feature.cpconverter.accesscontrol;
 
 import org.apache.sling.feature.cpconverter.shared.RepoPath;
+import org.jetbrains.annotations.NotNull;
 
 import java.util.Objects;
 
@@ -32,21 +33,21 @@ public class SystemUser {
      * @param path - the original repository path of the user in the 
content-package.
      * @param intermediatePath - the intermediate path the user should have - 
most likely the (direct) parent of the path.
      */
-    public SystemUser(String id, RepoPath path, RepoPath intermediatePath) {
+    public SystemUser(@NotNull String id, @NotNull RepoPath path, @NotNull 
RepoPath intermediatePath) {
         this.id = id;
         this.path = path;
         this.intermediatePath = intermediatePath;
     }
 
-    public String getId() {
+    public @NotNull String getId() {
         return id;
     }
 
-    public RepoPath getPath() {
+    public @NotNull RepoPath getPath() {
         return path;
     }
 
-    public RepoPath getIntermediatePath() {
+    public @NotNull RepoPath getIntermediatePath() {
         return intermediatePath;
     }
 
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/artifacts/ArtifactWriter.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/artifacts/ArtifactWriter.java
index 61de667..b36aadd 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/artifacts/ArtifactWriter.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/artifacts/ArtifactWriter.java
@@ -16,11 +16,13 @@
  */
 package org.apache.sling.feature.cpconverter.artifacts;
 
+import org.jetbrains.annotations.NotNull;
+
 import java.io.IOException;
 import java.io.OutputStream;
 
 public interface ArtifactWriter {
 
-    void write(OutputStream output) throws IOException;
+    void write(@NotNull OutputStream output) throws IOException;
 
 }
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/artifacts/ArtifactsDeployer.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/artifacts/ArtifactsDeployer.java
index 3e189fd..c94dfe9 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/artifacts/ArtifactsDeployer.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/artifacts/ArtifactsDeployer.java
@@ -20,11 +20,12 @@ import java.io.File;
 import java.io.IOException;
 
 import org.apache.sling.feature.ArtifactId;
+import org.jetbrains.annotations.NotNull;
 
 public interface ArtifactsDeployer {
 
-    File getBundlesDirectory();
+    @NotNull File getBundlesDirectory();
 
-    void deploy(ArtifactWriter artifactWriter, ArtifactId id) throws 
IOException;
+    void deploy(@NotNull ArtifactWriter artifactWriter, @NotNull ArtifactId 
id) throws IOException;
 
 }
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/artifacts/DefaultArtifactsDeployer.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/artifacts/DefaultArtifactsDeployer.java
index c1dda4c..eaec649 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/artifacts/DefaultArtifactsDeployer.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/artifacts/DefaultArtifactsDeployer.java
@@ -24,6 +24,7 @@ import java.io.IOException;
 import java.util.StringTokenizer;
 
 import org.apache.sling.feature.ArtifactId;
+import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -33,7 +34,7 @@ public final class DefaultArtifactsDeployer implements 
ArtifactsDeployer {
 
     private final File artifactsDirectory;
 
-    public DefaultArtifactsDeployer(File outputDirectory) {
+    public DefaultArtifactsDeployer(@NotNull File outputDirectory) {
         artifactsDirectory = outputDirectory;
         if (!artifactsDirectory.exists()) {
             artifactsDirectory.mkdirs();
@@ -41,12 +42,12 @@ public final class DefaultArtifactsDeployer implements 
ArtifactsDeployer {
     }
 
     @Override
-    public File getBundlesDirectory() {
+    public @NotNull File getBundlesDirectory() {
         return artifactsDirectory;
     }
 
     @Override
-    public void deploy(ArtifactWriter artifactWriter, ArtifactId id) throws 
IOException {
+    public void deploy(@NotNull ArtifactWriter artifactWriter, @NotNull 
ArtifactId id) throws IOException {
         requireNonNull(artifactWriter, "Null ArtifactWriter can not install an 
artifact to a Maven repository.");
         requireNonNull(id, "Bundle can not be installed to a Maven repository 
without specifying a valid id.");
 
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/artifacts/FileArtifactWriter.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/artifacts/FileArtifactWriter.java
index f876866..558ea10 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/artifacts/FileArtifactWriter.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/artifacts/FileArtifactWriter.java
@@ -16,6 +16,8 @@
  */
 package org.apache.sling.feature.cpconverter.artifacts;
 
+import org.jetbrains.annotations.NotNull;
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
@@ -26,12 +28,12 @@ public final class FileArtifactWriter implements 
ArtifactWriter {
 
     private final File fileArtifact;
 
-    public FileArtifactWriter(File fileArtifact) {
+    public FileArtifactWriter(@NotNull File fileArtifact) {
         this.fileArtifact = fileArtifact;
     }
 
     @Override
-    public void write(OutputStream output) throws IOException {
+    public void write(@NotNull OutputStream output) throws IOException {
         try (InputStream input = new FileInputStream(fileArtifact)) {
             new InputStreamArtifactWriter(input).write(output);
         }
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/artifacts/InputStreamArtifactWriter.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/artifacts/InputStreamArtifactWriter.java
index 1f975a5..eba539e 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/artifacts/InputStreamArtifactWriter.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/artifacts/InputStreamArtifactWriter.java
@@ -21,17 +21,18 @@ import java.io.InputStream;
 import java.io.OutputStream;
 
 import org.apache.commons.io.IOUtils;
+import org.jetbrains.annotations.NotNull;
 
 public class InputStreamArtifactWriter implements ArtifactWriter {
 
     private final InputStream input;
 
-    public InputStreamArtifactWriter(InputStream input) {
+    public InputStreamArtifactWriter(@NotNull InputStream input) {
         this.input = input;
     }
 
     @Override
-    public void write(OutputStream output) throws IOException {
+    public void write(@NotNull OutputStream output) throws IOException {
         IOUtils.copy(input, output);
     }
 
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/artifacts/MavenPomSupplierWriter.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/artifacts/MavenPomSupplierWriter.java
index f1f03f4..9ff7348 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/artifacts/MavenPomSupplierWriter.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/artifacts/MavenPomSupplierWriter.java
@@ -22,17 +22,18 @@ import java.io.OutputStream;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
 import org.apache.sling.feature.ArtifactId;
+import org.jetbrains.annotations.NotNull;
 
 public final class MavenPomSupplierWriter implements ArtifactWriter {
 
     private final ArtifactId id;
 
-    public MavenPomSupplierWriter(ArtifactId id) {
+    public MavenPomSupplierWriter(@NotNull ArtifactId id) {
         this.id = id;
     }
 
     @Override
-    public void write(OutputStream outputStream) throws IOException {
+    public void write(@NotNull OutputStream outputStream) throws IOException {
         Model model = new Model();
         // Maven complains if Model Version is not set
         model.setModelVersion("4.0.0");
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/cli/ContentPackage2FeatureModelConverterLauncher.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/cli/ContentPackage2FeatureModelConverterLauncher.java
index 055ca2e..bc2d44b 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/cli/ContentPackage2FeatureModelConverterLauncher.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/cli/ContentPackage2FeatureModelConverterLauncher.java
@@ -29,6 +29,7 @@ import 
org.apache.sling.feature.cpconverter.features.DefaultFeaturesManager;
 import org.apache.sling.feature.cpconverter.filtering.RegexBasedResourceFilter;
 import 
org.apache.sling.feature.cpconverter.handlers.DefaultEntryHandlersManager;
 import 
org.apache.sling.feature.cpconverter.vltpkg.DefaultPackagesEventsEmitter;
+import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -178,7 +179,7 @@ public final class 
ContentPackage2FeatureModelConverterLauncher implements Runna
         }
     }
 
-    private static void printVersion(final Logger logger) {
+    private static void printVersion(@NotNull final Logger logger) {
         logger.info("{} v{} (built on {})",
                 System.getProperty("project.artifactId"),
                 System.getProperty("project.version"),
@@ -200,7 +201,7 @@ public final class 
ContentPackage2FeatureModelConverterLauncher implements Runna
         logger.info("+-----------------------------------------------------+");
     }
 
-    private static final String getOsFamily() {
+    private static final @NotNull String getOsFamily() {
         String osName = System.getProperty("os.name").toLowerCase();
         String pathSep = System.getProperty("path.separator");
 
@@ -230,7 +231,7 @@ public final class 
ContentPackage2FeatureModelConverterLauncher implements Runna
         return "undefined";
     }
 
-    public static void main(String[] args) {
+    public static void main(@NotNull String[] args) {
         CommandLine.run(new ContentPackage2FeatureModelConverterLauncher(), 
args);
     }
 
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/cli/ShutDownHook.java 
b/src/main/java/org/apache/sling/feature/cpconverter/cli/ShutDownHook.java
index 6674d11..3f60e14 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/cli/ShutDownHook.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/cli/ShutDownHook.java
@@ -22,6 +22,7 @@ import java.util.Date;
 import java.util.Formatter;
 
 import org.apache.commons.io.FileUtils;
+import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 
 final class ShutDownHook extends Thread {
@@ -30,7 +31,7 @@ final class ShutDownHook extends Thread {
 
     private final Logger logger;
 
-    public ShutDownHook(Logger logger) {
+    public ShutDownHook(@NotNull Logger logger) {
         this.logger = logger;
     }
 
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/features/DefaultFeaturesManager.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/features/DefaultFeaturesManager.java
index c1f93df..202189e 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/features/DefaultFeaturesManager.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/features/DefaultFeaturesManager.java
@@ -47,6 +47,8 @@ import 
org.apache.sling.feature.extension.apiregions.api.ApiExport;
 import org.apache.sling.feature.extension.apiregions.api.ApiRegion;
 import org.apache.sling.feature.extension.apiregions.api.ApiRegions;
 import org.apache.sling.feature.io.json.FeatureJSONWriter;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.osgi.framework.Constants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -89,16 +91,16 @@ public class DefaultFeaturesManager implements 
FeaturesManager {
         this(null);
     }
 
-    public DefaultFeaturesManager(File tempDir) {
+    public DefaultFeaturesManager(@NotNull File tempDir) {
         this(true, 20, tempDir, null, null, null);
     }
 
     public DefaultFeaturesManager(boolean mergeConfigurations,
                                   int bundlesStartOrder,
-                                  File featureModelsOutputDirectory,
-                                  String artifactIdOverride,
-                                  String prefix,
-                                  Map<String, String> properties) {
+                                  @NotNull File featureModelsOutputDirectory,
+                                  @Nullable String artifactIdOverride,
+                                  @Nullable String prefix,
+                                  @NotNull Map<String, String> properties) {
         this.mergeConfigurations = mergeConfigurations;
         this.bundlesStartOrder = bundlesStartOrder;
         this.featureModelsOutputDirectory = featureModelsOutputDirectory;
@@ -108,19 +110,19 @@ public class DefaultFeaturesManager implements 
FeaturesManager {
     }
 
     @Override
-    public void init(String groupId, String artifactId, String version) {
+    public void init(@NotNull String groupId, @NotNull String artifactId, 
@NotNull String version) {
         targetFeature = new Feature(new ArtifactId(groupId, artifactId, 
version, null, SLING_OSGI_FEATURE_TILE_TYPE));
 
         runModes.clear();
     }
 
     @Override
-    public Feature getTargetFeature() {
+    public @Nullable Feature getTargetFeature() {
         return targetFeature;
     }
 
     @Override
-    public Feature getRunMode(String runMode) {
+    public @NotNull Feature getRunMode(@Nullable String runMode) {
         if (getTargetFeature() == null) {
             throw new IllegalStateException("Target Feature not initialized 
yet, please make sure convert() method was invoked first.");
         }
@@ -138,12 +140,12 @@ public class DefaultFeaturesManager implements 
FeaturesManager {
     }
 
     @Override
-    public void addArtifact(String runMode, ArtifactId id) {
+    public void addArtifact(@Nullable String runMode, @NotNull ArtifactId id) {
         addArtifact(runMode, id, null);
     }
 
     @Override
-    public void addArtifact(String runMode, ArtifactId id, Integer startOrder) 
{
+    public void addArtifact(@Nullable String runMode, @NotNull ArtifactId id, 
@Nullable Integer startOrder) {
         requireNonNull(id, "Artifact can not be attached to a feature without 
specifying a valid ArtifactId.");
 
         Artifact artifact = new Artifact(id);
@@ -170,7 +172,7 @@ public class DefaultFeaturesManager implements 
FeaturesManager {
         artifacts.add(artifact);
     }
 
-    private ArtifactId appendRunmode(ArtifactId id, String runMode) {
+    private @NotNull ArtifactId appendRunmode(@NotNull ArtifactId id, 
@Nullable String runMode) {
         ArtifactId newId;
         if (runMode == null) {
             newId = id;
@@ -188,7 +190,7 @@ public class DefaultFeaturesManager implements 
FeaturesManager {
     }
 
     @Override
-    public void addAPIRegionExport(String runMode, String exportedPackage) {
+    public void addAPIRegionExport(@Nullable String runMode, @NotNull String 
exportedPackage) {
         if (exportsToAPIRegion == null)
             return; // Ignore if we're not exporting to an API region
 
@@ -200,7 +202,7 @@ public class DefaultFeaturesManager implements 
FeaturesManager {
     }
 
     @Override
-    public void addConfiguration(String runMode, String pid, 
Dictionary<String, Object> configurationProperties) {
+    public void addConfiguration(@Nullable String runMode, @NotNull String 
pid, @Nullable Dictionary<String, Object> configurationProperties) {
         Feature feature = getRunMode(runMode);
         Configuration configuration = 
feature.getConfigurations().getConfiguration(pid);
 
@@ -232,7 +234,7 @@ public class DefaultFeaturesManager implements 
FeaturesManager {
         configuration.getProperties().remove("service.factoryPid");
     }
 
-    private void addAPIRegions(Feature feature, List<String> exportedPackages) 
throws IOException {
+    private void addAPIRegions(@NotNull Feature feature, @Nullable 
List<String> exportedPackages) throws IOException {
         if (exportedPackages == null)
             exportedPackages = Collections.emptyList();
 
@@ -315,19 +317,19 @@ public class DefaultFeaturesManager implements 
FeaturesManager {
         }
     }
 
-    public synchronized DefaultFeaturesManager setAPIRegions(List<String> 
regions) {
+    public synchronized @NotNull DefaultFeaturesManager setAPIRegions(@NotNull 
List<String> regions) {
         targetAPIRegions.clear();
         targetAPIRegions.addAll(regions);
         return this;
     }
 
-    public synchronized DefaultFeaturesManager setExportToAPIRegion(String 
region) {
+    public synchronized @NotNull DefaultFeaturesManager 
setExportToAPIRegion(@NotNull String region) {
         exportsToAPIRegion = region;
         return this;
     }
 
     @Override
-    public void addOrAppendRepoInitExtension(String text, String runMode) {
+    public void addOrAppendRepoInitExtension(@NotNull String text, @Nullable 
String runMode) {
 
         logger.info("Adding/Appending RepoInitExtension for runMode: {}", 
runMode );
         Extension repoInitExtension = 
getRunMode(runMode).getExtensions().getByName(Extension.EXTENSION_NAME_REPOINIT);
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/features/FeaturesManager.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/features/FeaturesManager.java
index 8a8f642..c771cdb 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/features/FeaturesManager.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/features/FeaturesManager.java
@@ -20,25 +20,27 @@ import java.util.Dictionary;
 
 import org.apache.sling.feature.ArtifactId;
 import org.apache.sling.feature.Feature;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public interface FeaturesManager {
 
-    void init(String groupId, String artifactId, String version);
+    void init(@NotNull String groupId, @NotNull String artifactId, @NotNull 
String version);
 
-    Feature getTargetFeature();
+    @Nullable Feature getTargetFeature();
 
-    Feature getRunMode(String runMode);
+    @NotNull Feature getRunMode(@Nullable String runMode);
 
-    void addArtifact(String runMode, ArtifactId id);
+    void addArtifact(@Nullable String runMode, @NotNull ArtifactId id);
 
-    void addArtifact(String runMode, ArtifactId id, Integer startOrder);
+    void addArtifact(@Nullable String runMode, @NotNull ArtifactId id, 
@Nullable Integer startOrder);
 
-    void addAPIRegionExport(String runMode, String exportedPackage);
+    void addAPIRegionExport(@Nullable String runMode, @NotNull String 
exportedPackage);
 
-    void addConfiguration(String runMode, String pid, Dictionary<String, 
Object> configurationProperties);
+    void addConfiguration(@Nullable String runMode, @NotNull String pid, 
@Nullable Dictionary<String, Object> configurationProperties);
 
     void serialize() throws Exception;
 
-    void addOrAppendRepoInitExtension(String text, String runMode);
+    void addOrAppendRepoInitExtension(@NotNull String text, @Nullable String 
runMode);
 
 }
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/features/RunmodeMapper.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/features/RunmodeMapper.java
index 23d1347..e10ef67 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/features/RunmodeMapper.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/features/RunmodeMapper.java
@@ -16,6 +16,9 @@
  */
 package org.apache.sling.feature.cpconverter.features;
 
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
@@ -26,7 +29,7 @@ final class RunmodeMapper {
 
     private static final String FILENAME = "runmode.mapping";
 
-    public static RunmodeMapper open(File featureModelsOutputDirectory) throws 
IOException {
+    public static @NotNull RunmodeMapper open(@NotNull File 
featureModelsOutputDirectory) throws IOException {
         Properties properties = new Properties();
 
         File runmodeMappingFile = new File(featureModelsOutputDirectory, 
FILENAME);
@@ -45,12 +48,12 @@ final class RunmodeMapper {
 
     private final Properties properties;
 
-    private RunmodeMapper(File runmodeMappingFile, Properties properties) {
+    private RunmodeMapper(@NotNull File runmodeMappingFile, @NotNull 
Properties properties) {
         this.runmodeMappingFile = runmodeMappingFile;
         this.properties = properties;
     }
 
-    public void addOrUpdate(String runMode, String jsonFileName) {
+    public void addOrUpdate(@Nullable String runMode, @NotNull String 
jsonFileName) {
         if (runMode == null) {
             runMode = DEFAULT;
         }
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/filtering/RegexBasedResourceFilter.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/filtering/RegexBasedResourceFilter.java
index d6fd02a..4ac864d 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/filtering/RegexBasedResourceFilter.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/filtering/RegexBasedResourceFilter.java
@@ -22,6 +22,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.regex.Pattern;
 
+import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -31,7 +32,7 @@ public final class RegexBasedResourceFilter implements 
ResourceFilter {
 
     private final List<Pattern> patterns = new LinkedList<>();
 
-    public void addFilteringPattern(String filteringPattern) {
+    public void addFilteringPattern(@NotNull String filteringPattern) {
         requireNonNull(filteringPattern, "Null pattern to filter resources out 
is not a valid filtering pattern");
 
         if (filteringPattern.isEmpty()) {
@@ -41,7 +42,7 @@ public final class RegexBasedResourceFilter implements 
ResourceFilter {
         patterns.add(Pattern.compile(filteringPattern));
     }
 
-    public boolean isFilteredOut(String path) {
+    public boolean isFilteredOut(@NotNull String path) {
         for (Pattern pattern : patterns) {
             logger.debug("Checking if path '{}' matches against '{}' 
pattern...", path, pattern);
 
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/filtering/ResourceFilter.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/filtering/ResourceFilter.java
index 2959efc..7992345 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/filtering/ResourceFilter.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/filtering/ResourceFilter.java
@@ -16,8 +16,10 @@
  */
 package org.apache.sling.feature.cpconverter.filtering;
 
+import org.jetbrains.annotations.NotNull;
+
 public interface ResourceFilter {
 
-    boolean isFilteredOut(String path);
+    boolean isFilteredOut(@NotNull String path);
 
 }
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractConfigurationEntryHandler.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractConfigurationEntryHandler.java
index a0a94c7..0507ea3 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractConfigurationEntryHandler.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractConfigurationEntryHandler.java
@@ -23,6 +23,8 @@ import java.util.regex.Matcher;
 import org.apache.jackrabbit.vault.fs.io.Archive;
 import org.apache.jackrabbit.vault.fs.io.Archive.Entry;
 import 
org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.osgi.util.converter.Converters;
 
 abstract class AbstractConfigurationEntryHandler extends 
AbstractRegexEntryHandler {
@@ -31,12 +33,12 @@ abstract class AbstractConfigurationEntryHandler extends 
AbstractRegexEntryHandl
 
     private static final String REPOINIT_PID = 
"org.apache.sling.jcr.repoinit.impl.RepositoryInitializer";
 
-    public AbstractConfigurationEntryHandler(String extension) {
+    public AbstractConfigurationEntryHandler(@NotNull String extension) {
         
super("/jcr_root/(?:apps|libs)/.+/config(\\.(?<runmode>[^/]+))?/(?<pid>.*)\\." 
+ extension);
     }
 
     @Override
-    public final void handle(String path, Archive archive, Entry entry, 
ContentPackage2FeatureModelConverter converter) throws Exception {
+    public final void handle(@NotNull String path, @NotNull Archive archive, 
@NotNull Entry entry, @NotNull ContentPackage2FeatureModelConverter converter) 
throws Exception {
 
         Matcher matcher = getPattern().matcher(path);
         
@@ -103,7 +105,7 @@ abstract class AbstractConfigurationEntryHandler extends 
AbstractRegexEntryHandl
         }
     }
 
-    private void checkReferences(final Dictionary<String, Object> 
configurationProperties, final String pid) {
+    private void checkReferences(@NotNull final Dictionary<String, Object> 
configurationProperties, @NotNull final String pid) {
         final String[] references = 
Converters.standardConverter().convert(configurationProperties.get("references")).to(String[].class);
         if ( references != null && references.length > 0 ) {
             for(final String r  : references ) {
@@ -114,6 +116,6 @@ abstract class AbstractConfigurationEntryHandler extends 
AbstractRegexEntryHandl
         }
     }
 
-    protected abstract Dictionary<String, Object> parseConfiguration(String 
name, InputStream input) throws Exception;
+    protected abstract @Nullable Dictionary<String, Object> 
parseConfiguration(@NotNull String name, @NotNull InputStream input) throws 
Exception;
 
 }
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractContentPackageHandler.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractContentPackageHandler.java
index 8d65e29..d0d2a50 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractContentPackageHandler.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractContentPackageHandler.java
@@ -29,6 +29,8 @@ import org.apache.jackrabbit.vault.fs.io.Archive.Entry;
 import org.apache.jackrabbit.vault.packaging.VaultPackage;
 import 
org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
 import org.codehaus.plexus.util.StringUtils;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public abstract class AbstractContentPackageHandler extends 
AbstractRegexEntryHandler {
 
@@ -44,7 +46,7 @@ public abstract class AbstractContentPackageHandler extends 
AbstractRegexEntryHa
     }
 
     @Override
-    public final void handle(String path, Archive archive, Entry entry, 
ContentPackage2FeatureModelConverter converter)
+    public final void handle(@NotNull String path, @NotNull Archive archive, 
@NotNull Entry entry, @NotNull ContentPackage2FeatureModelConverter converter)
             throws Exception {
         logger.info("Processing sub-content package '{}'...", entry.getName());
 
@@ -96,6 +98,6 @@ public abstract class AbstractContentPackageHandler extends 
AbstractRegexEntryHa
         logger.info("Sub-content package '{}' processing is over", 
entry.getName());
     }
 
-    protected abstract void processSubPackage(String path, String runMode, 
VaultPackage contentPackage, ContentPackage2FeatureModelConverter converter, 
boolean isEmbeddedPackage) throws Exception;
+    protected abstract void processSubPackage(@NotNull String path, @Nullable 
String runMode, @NotNull VaultPackage contentPackage, @NotNull 
ContentPackage2FeatureModelConverter converter, boolean isEmbeddedPackage) 
throws Exception;
 
 }
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractPolicyParser.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractPolicyParser.java
index c36479a..e50029b 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractPolicyParser.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractPolicyParser.java
@@ -21,6 +21,7 @@ import 
org.apache.sling.feature.cpconverter.accesscontrol.AclManager;
 import org.apache.sling.feature.cpconverter.shared.AbstractJcrNodeParser;
 import org.apache.sling.feature.cpconverter.shared.RepoPath;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 
@@ -54,7 +55,7 @@ abstract class AbstractPolicyParser extends 
AbstractJcrNodeParser<Boolean> {
         this.aclManager = aclManager;
     }
 
-    private static String extractValue(String expression) {
+    private static @Nullable String extractValue(@Nullable String expression) {
         if (expression == null || expression.isEmpty()) {
             return expression;
         }
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractRegexEntryHandler.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractRegexEntryHandler.java
index 6b06023..7552908 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractRegexEntryHandler.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractRegexEntryHandler.java
@@ -18,6 +18,7 @@ package org.apache.sling.feature.cpconverter.handlers;
 
 import java.util.regex.Pattern;
 
+import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -27,20 +28,20 @@ abstract class AbstractRegexEntryHandler implements 
EntryHandler {
 
     private final Pattern pattern;
 
-    public AbstractRegexEntryHandler(String regex) {
+    public AbstractRegexEntryHandler(@NotNull String regex) {
         this(Pattern.compile(regex));
     }
 
-    public AbstractRegexEntryHandler(Pattern pattern) {
+    public AbstractRegexEntryHandler(@NotNull Pattern pattern) {
         this.pattern = pattern;
     }
 
     @Override
-    public final boolean matches(String path) {
+    public final boolean matches(@NotNull String path) {
         return pattern.matcher(path).matches();
     }
 
-    protected final Pattern getPattern() {
+    protected final @NotNull Pattern getPattern() {
         return pattern;
     }
 
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/BundleEntryHandler.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/BundleEntryHandler.java
index 54a943a..13a8fa0 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/BundleEntryHandler.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/BundleEntryHandler.java
@@ -21,6 +21,7 @@ import static 
org.apache.jackrabbit.vault.packaging.PackageProperties.NAME_VERSI
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Objects;
 import java.util.Properties;
 import java.util.jar.JarEntry;
 import java.util.jar.JarInputStream;
@@ -36,6 +37,7 @@ import org.apache.sling.feature.ArtifactId;
 import 
org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
 import 
org.apache.sling.feature.cpconverter.artifacts.InputStreamArtifactWriter;
 import org.codehaus.plexus.util.StringUtils;
+import org.jetbrains.annotations.NotNull;
 import org.osgi.framework.Constants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -65,7 +67,7 @@ public final class BundleEntryHandler extends 
AbstractRegexEntryHandler {
     }
 
     @Override
-    public void handle(String path, Archive archive, Entry entry, 
ContentPackage2FeatureModelConverter converter) throws Exception {
+    public void handle(@NotNull String path, @NotNull Archive archive, 
@NotNull Entry entry, @NotNull ContentPackage2FeatureModelConverter converter) 
throws Exception {
         logger.info("Processing bundle {}...", entry.getName());
 
         String groupId;
@@ -74,7 +76,7 @@ public final class BundleEntryHandler extends 
AbstractRegexEntryHandler {
         String classifier = null;
         Manifest manifest;
 
-        try (JarInputStream jarInput = new 
JarInputStream(archive.openInputStream(entry))) {
+        try (JarInputStream jarInput = new 
JarInputStream(Objects.requireNonNull(archive.openInputStream(entry)))) {
             Properties properties = readGav(entry.getName(), jarInput);
             manifest = jarInput.getManifest();
 
@@ -119,23 +121,25 @@ public final class BundleEntryHandler extends 
AbstractRegexEntryHandler {
         }
 
         try (InputStream input = archive.openInputStream(entry)) {
-            ArtifactId id = new ArtifactId(groupId, artifactId, version, 
classifier, JAR_TYPE);
+            if (input != null) {
+                ArtifactId id = new ArtifactId(groupId, artifactId, version, 
classifier, JAR_TYPE);
 
-            converter.getArtifactsDeployer().deploy(new 
InputStreamArtifactWriter(input), id);
+                
Objects.requireNonNull(converter.getArtifactsDeployer()).deploy(new 
InputStreamArtifactWriter(input), id);
 
-            converter.getFeaturesManager().addArtifact(runMode, id, 
startLevel);
+                
Objects.requireNonNull(converter.getFeaturesManager()).addArtifact(runMode, id, 
startLevel);
 
-            String epHeader = 
manifest.getMainAttributes().getValue(Constants.EXPORT_PACKAGE);
-            if (epHeader != null) {
-                for (Clause clause : Parser.parseHeader(epHeader)) {
-                    converter.getFeaturesManager().addAPIRegionExport(runMode, 
clause.getName());
+                String epHeader = 
manifest.getMainAttributes().getValue(Constants.EXPORT_PACKAGE);
+                if (epHeader != null) {
+                    for (Clause clause : Parser.parseHeader(epHeader)) {
+                        
converter.getFeaturesManager().addAPIRegionExport(runMode, clause.getName());
+                    }
                 }
             }
         }
     }
 
     // method visibility set to 'protected' fot testing purposes
-    protected Properties readGav(String entryName, JarInputStream jarInput) 
throws IOException {
+    protected @NotNull Properties readGav(@NotNull String entryName, @NotNull 
JarInputStream jarInput) throws IOException {
         Properties properties = new Properties();
 
         String bundleName = entryName;
@@ -151,7 +155,7 @@ public final class BundleEntryHandler extends 
AbstractRegexEntryHandler {
         }
 
         JarEntry jarEntry;
-        dance : while ((jarEntry = jarInput.getNextJarEntry()) != null) {
+        while ((jarEntry = jarInput.getNextJarEntry()) != null) {
             String nextEntryName = jarEntry.getName();
 
             if (pomPropertiesPattern.matcher(nextEntryName).matches()) {
@@ -188,7 +192,7 @@ public final class BundleEntryHandler extends 
AbstractRegexEntryHandler {
                         }
                     }
 
-                    break dance;
+                    break;
                 }
             }
         }
@@ -196,14 +200,14 @@ public final class BundleEntryHandler extends 
AbstractRegexEntryHandler {
         return properties;
     }
 
-    private static String getCheckedProperty(Manifest manifest, String name) {
+    private static @NotNull String getCheckedProperty(@NotNull Manifest 
manifest, @NotNull String name) {
         String property = manifest.getMainAttributes().getValue(name).trim();
         return requireNonNull(property, "Jar file can not be defined as a 
valid OSGi bundle without specifying a valid '"
                                          + name
                                          + "' property.");
     }
 
-    private static String getCheckedProperty(Properties properties, String 
name) {
+    private static String getCheckedProperty(@NotNull Properties properties, 
@NotNull String name) {
         String property = properties.getProperty(name).trim();
         return requireNonNull(property, "Jar file can not be defined as a 
valid Maven artifact without specifying a valid '"
                                          + name
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/ConfigurationEntryHandler.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/ConfigurationEntryHandler.java
index 64c8647..a32e71a 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/ConfigurationEntryHandler.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/ConfigurationEntryHandler.java
@@ -20,6 +20,7 @@ import java.io.InputStream;
 import java.util.Dictionary;
 
 import org.apache.felix.cm.file.ConfigurationHandler;
+import org.jetbrains.annotations.NotNull;
 
 public final class ConfigurationEntryHandler extends 
AbstractConfigurationEntryHandler {
 
@@ -29,7 +30,7 @@ public final class ConfigurationEntryHandler extends 
AbstractConfigurationEntryH
 
     @Override
     @SuppressWarnings("unchecked")
-    protected Dictionary<String, Object> parseConfiguration(String name, 
InputStream input) throws Exception {
+    protected @NotNull Dictionary<String, Object> parseConfiguration(@NotNull 
String name, @NotNull InputStream input) throws Exception {
         return ConfigurationHandler.read(input);
     }
 
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/ContentPackageEntryHandler.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/ContentPackageEntryHandler.java
index c1d4c2d..59b435a 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/ContentPackageEntryHandler.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/ContentPackageEntryHandler.java
@@ -18,15 +18,17 @@ package org.apache.sling.feature.cpconverter.handlers;
 
 import org.apache.jackrabbit.vault.packaging.VaultPackage;
 import 
org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public final class ContentPackageEntryHandler extends 
AbstractContentPackageHandler {
 
     @Override
-    protected void processSubPackage(String path, String runMode,
-            VaultPackage contentPackage,
-            ContentPackage2FeatureModelConverter converter,
-            boolean isEmbeddedPackage) throws Exception {
-                converter.processSubPackage(path, runMode, contentPackage, 
isEmbeddedPackage);
+    protected void processSubPackage(@NotNull String path, @Nullable String 
runMode,
+                                     @NotNull VaultPackage contentPackage,
+                                     @NotNull 
ContentPackage2FeatureModelConverter converter,
+                                     boolean isEmbeddedPackage) throws 
Exception {
+        converter.processSubPackage(path, runMode, contentPackage, 
isEmbeddedPackage);
         
     }
 
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/DefaultEntryHandlersManager.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/DefaultEntryHandlersManager.java
index f7c4472..a2ba894 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/DefaultEntryHandlersManager.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/DefaultEntryHandlersManager.java
@@ -16,6 +16,9 @@
  */
 package org.apache.sling.feature.cpconverter.handlers;
 
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
@@ -27,23 +30,20 @@ public class DefaultEntryHandlersManager implements 
EntryHandlersManager {
 
     public DefaultEntryHandlersManager() {
         ServiceLoader<EntryHandler> entryHandlersLoader = 
ServiceLoader.load(EntryHandler.class);
-        Iterator<EntryHandler> entryHandlersIterator = 
entryHandlersLoader.iterator();
-        while (entryHandlersIterator.hasNext()) {
-            EntryHandler entryHandler = entryHandlersIterator.next();
-
+        for (EntryHandler entryHandler : entryHandlersLoader) {
             addEntryHandler(entryHandler);
         }
     }
 
     @Override
-    public void addEntryHandler(EntryHandler handler) {
+    public void addEntryHandler(@NotNull EntryHandler handler) {
         if (handler != null) {
             entryHandlers.add(handler);
         }
     }
 
     @Override
-    public EntryHandler getEntryHandlerByEntryPath(String path) {
+    public @Nullable EntryHandler getEntryHandlerByEntryPath(@NotNull String 
path) {
         for (EntryHandler entryHandler : entryHandlers) {
             if (entryHandler.matches(path)) {
                 return entryHandler;
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/EntryHandler.java 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/EntryHandler.java
index 5518313..1160ad3 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/EntryHandler.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/EntryHandler.java
@@ -19,11 +19,12 @@ package org.apache.sling.feature.cpconverter.handlers;
 import org.apache.jackrabbit.vault.fs.io.Archive;
 import org.apache.jackrabbit.vault.fs.io.Archive.Entry;
 import 
org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
+import org.jetbrains.annotations.NotNull;
 
 public interface EntryHandler {
 
-    boolean matches(String path);
+    boolean matches(@NotNull String path);
 
-    void handle(String path, Archive archive, Entry entry, 
ContentPackage2FeatureModelConverter converter) throws Exception;
+    void handle(@NotNull String path, @NotNull Archive archive, @NotNull Entry 
entry, @NotNull ContentPackage2FeatureModelConverter converter) throws 
Exception;
 
 }
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/EntryHandlersManager.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/EntryHandlersManager.java
index f6b0f42..430ba81 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/EntryHandlersManager.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/EntryHandlersManager.java
@@ -16,10 +16,13 @@
  */
 package org.apache.sling.feature.cpconverter.handlers;
 
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
 public interface EntryHandlersManager {
 
-    EntryHandler getEntryHandlerByEntryPath(String path);
+    @Nullable EntryHandler getEntryHandlerByEntryPath(@NotNull String path);
 
-    void addEntryHandler(EntryHandler handler);
+    void addEntryHandler(@NotNull EntryHandler handler);
 
 }
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/JsonConfigurationEntryHandler.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/JsonConfigurationEntryHandler.java
index a3f095a..d60a3a9 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/JsonConfigurationEntryHandler.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/JsonConfigurationEntryHandler.java
@@ -23,6 +23,7 @@ import java.util.Dictionary;
 import java.util.Hashtable;
 
 import org.apache.felix.cm.json.Configurations;
+import org.jetbrains.annotations.NotNull;
 
 public final class JsonConfigurationEntryHandler extends 
AbstractConfigurationEntryHandler {
 
@@ -31,7 +32,7 @@ public final class JsonConfigurationEntryHandler extends 
AbstractConfigurationEn
     }
 
     @Override
-    protected Dictionary<String, Object> parseConfiguration(String name, 
InputStream input) throws Exception {
+    protected @NotNull Dictionary<String, Object> parseConfiguration(@NotNull 
String name, @NotNull InputStream input) throws Exception {
         final Hashtable<String, Object> props = Configurations.buildReader()
             .withIdentifier(name)
             .build(new InputStreamReader(input, StandardCharsets.UTF_8))
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/NodeTypesEntryHandler.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/NodeTypesEntryHandler.java
index 54032dd..d653a2f 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/NodeTypesEntryHandler.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/NodeTypesEntryHandler.java
@@ -18,11 +18,13 @@ package org.apache.sling.feature.cpconverter.handlers;
 
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
+import java.util.Objects;
 import java.util.regex.Pattern;
 
 import org.apache.jackrabbit.vault.fs.io.Archive;
 import org.apache.jackrabbit.vault.fs.io.Archive.Entry;
 import 
org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
+import org.jetbrains.annotations.NotNull;
 
 public class NodeTypesEntryHandler extends AbstractRegexEntryHandler {
 
@@ -30,16 +32,16 @@ public class NodeTypesEntryHandler extends 
AbstractRegexEntryHandler {
         super("/META-INF/vault/nodetypes\\.cnd");
     }
 
-    public NodeTypesEntryHandler(Pattern pattern) {
+    public NodeTypesEntryHandler(@NotNull Pattern pattern) {
         super(pattern);
     }
 
     @Override
-    public void handle(String path, Archive archive, Entry entry, 
ContentPackage2FeatureModelConverter converter)
+    public void handle(@NotNull String path, @NotNull Archive archive, 
@NotNull Entry entry, @NotNull ContentPackage2FeatureModelConverter converter)
             throws Exception {
-        try (BufferedReader reader = new BufferedReader(new 
InputStreamReader(archive.openInputStream(entry)))) {
-            
converter.getAclManager().addNodetypeRegistrationSentence("register nodetypes");
-            converter.getAclManager().addNodetypeRegistrationSentence("<<===");
+        try (BufferedReader reader = new BufferedReader(new 
InputStreamReader(Objects.requireNonNull(archive.openInputStream(entry))))) {
+            
Objects.requireNonNull(converter.getAclManager()).addNodetypeRegistrationSentence("register
 nodetypes");
+            
Objects.requireNonNull(converter.getAclManager()).addNodetypeRegistrationSentence("<<===");
 
             String nodetypeRegistrationSentence;
             while ((nodetypeRegistrationSentence = reader.readLine()) != null) 
{
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/PrivilegesHandler.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/PrivilegesHandler.java
index 00c7c40..866abbd 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/PrivilegesHandler.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/PrivilegesHandler.java
@@ -23,6 +23,7 @@ import org.apache.jackrabbit.vault.fs.io.Archive;
 import org.apache.jackrabbit.vault.fs.io.Archive.Entry;
 import 
org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
 import org.apache.sling.feature.cpconverter.accesscontrol.AclManager;
+import org.jetbrains.annotations.NotNull;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
@@ -40,7 +41,7 @@ public class PrivilegesHandler extends 
AbstractRegexEntryHandler {
     }
 
     @Override
-    public void handle(String path, Archive archive, Entry entry, 
ContentPackage2FeatureModelConverter converter)
+    public void handle(@NotNull String path, @NotNull Archive archive, 
@NotNull Entry entry, @NotNull ContentPackage2FeatureModelConverter converter)
             throws Exception {
         SAXParser saxParser = saxParserFactory.newSAXParser();
         AclManager aclManager = converter.getAclManager();
@@ -52,7 +53,7 @@ public class PrivilegesHandler extends 
AbstractRegexEntryHandler {
 
         private final AclManager aclManager;
 
-        public PrivilegeHandler(AclManager aclManager) {
+        public PrivilegeHandler(@NotNull AclManager aclManager) {
             this.aclManager = aclManager;
         }
 
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/PropertiesConfigurationEntryHandler.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/PropertiesConfigurationEntryHandler.java
index faa0dac..95c0160 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/PropertiesConfigurationEntryHandler.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/PropertiesConfigurationEntryHandler.java
@@ -16,6 +16,8 @@
  */
 package org.apache.sling.feature.cpconverter.handlers;
 
+import org.jetbrains.annotations.NotNull;
+
 import java.io.BufferedInputStream;
 import java.io.InputStream;
 import java.util.Dictionary;
@@ -30,7 +32,7 @@ public final class PropertiesConfigurationEntryHandler 
extends AbstractConfigura
     }
 
     @Override
-    protected Dictionary<String, Object> parseConfiguration(String name, 
InputStream input) throws Exception {
+    protected @NotNull Dictionary<String, Object> parseConfiguration(@NotNull 
String name, @NotNull InputStream input) throws Exception {
         final Properties properties = new Properties();
 
         try (final BufferedInputStream in = new BufferedInputStream(input)) {
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/SystemUsersEntryHandler.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/SystemUsersEntryHandler.java
index 4162b16..3785a2c 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/SystemUsersEntryHandler.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/SystemUsersEntryHandler.java
@@ -17,6 +17,7 @@
 package org.apache.sling.feature.cpconverter.handlers;
 
 import org.apache.jackrabbit.vault.util.PlatformNameFormat;
+import org.jetbrains.annotations.NotNull;
 import org.xml.sax.Attributes;
 
 import org.apache.jackrabbit.vault.fs.io.Archive;
@@ -36,7 +37,7 @@ public final class SystemUsersEntryHandler extends 
AbstractRegexEntryHandler {
     }
 
     @Override
-    public void handle(String path, Archive archive, Entry entry, 
ContentPackage2FeatureModelConverter converter)
+    public void handle(@NotNull String path, @NotNull Archive archive, 
@NotNull Entry entry, @NotNull ContentPackage2FeatureModelConverter converter)
             throws Exception {
         Matcher matcher = getPattern().matcher(path);
         if (matcher.matches()) {
@@ -69,7 +70,7 @@ public final class SystemUsersEntryHandler extends 
AbstractRegexEntryHandler {
          * @param path - the original repository path of the user in the 
content-package.
          * @param intermediatePath - the intermediate path the user should 
have - most likely the (direct) parent of the path.
          */
-        public SystemUserParser(ContentPackage2FeatureModelConverter 
converter, RepoPath path, RepoPath intermediatePath) {
+        public SystemUserParser(@NotNull ContentPackage2FeatureModelConverter 
converter, @NotNull RepoPath path, @NotNull RepoPath intermediatePath) {
             super(REP_SYSTEM_USER);
             this.converter = converter;
             this.path = path;
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/VersionResolverContentPackageEntryHandler.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/VersionResolverContentPackageEntryHandler.java
index ac143cb..c5e9223 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/VersionResolverContentPackageEntryHandler.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/VersionResolverContentPackageEntryHandler.java
@@ -22,6 +22,8 @@ import org.apache.jackrabbit.vault.packaging.PackageId;
 import org.apache.jackrabbit.vault.packaging.VaultPackage;
 import 
org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
 import 
org.apache.sling.feature.cpconverter.vltpkg.RecollectorVaultPackageScanner;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -33,16 +35,16 @@ public final class 
VersionResolverContentPackageEntryHandler extends AbstractCon
 
     private final Map<PackageId, String> subContentPackages;
 
-    public 
VersionResolverContentPackageEntryHandler(RecollectorVaultPackageScanner 
scanner, Map<PackageId, String> subContentPackages) {
+    public VersionResolverContentPackageEntryHandler(@NotNull 
RecollectorVaultPackageScanner scanner, @NotNull Map<PackageId, String> 
subContentPackages) {
         this.scanner = scanner;
         this.subContentPackages = subContentPackages;
     }
 
     @Override
-    protected void processSubPackage(String path, String runMode, VaultPackage 
contentPackage, ContentPackage2FeatureModelConverter converter, boolean 
isEmbeddedPackage)
+    protected void processSubPackage(@NotNull String path, @Nullable String 
runMode, @NotNull VaultPackage contentPackage, @NotNull 
ContentPackage2FeatureModelConverter converter, boolean isEmbeddedPackage)
             throws Exception {
 
-        boolean addPackage = false;
+        boolean addPackage;
         PackageId currentId = contentPackage.getId();
 
         logger.info("Checking if other {}:{} content-package versions were 
handled already", currentId.getGroup(), currentId.getName());
@@ -75,7 +77,7 @@ public final class VersionResolverContentPackageEntryHandler 
extends AbstractCon
         }
     }
 
-    private PackageId getPackage(PackageId expectedId) {
+    private @Nullable PackageId getPackage(@NotNull PackageId expectedId) {
         for (PackageId currentId : subContentPackages.keySet()) {
             if (expectedId.getGroup().equals(currentId.getGroup())
                     && expectedId.getName().equals(currentId.getName())) {
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/XmlConfigurationEntryHandler.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/XmlConfigurationEntryHandler.java
index 5ee290e..3500c6d 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/XmlConfigurationEntryHandler.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/XmlConfigurationEntryHandler.java
@@ -29,11 +29,9 @@ import org.apache.jackrabbit.util.ISO8601;
 import org.apache.jackrabbit.vault.util.DocViewProperty;
 import org.apache.sling.feature.cpconverter.shared.AbstractJcrNodeParser;
 import org.codehaus.plexus.util.StringUtils;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Lists;
 
 public final class XmlConfigurationEntryHandler extends 
AbstractConfigurationEntryHandler {
 
@@ -42,7 +40,7 @@ public final class XmlConfigurationEntryHandler extends 
AbstractConfigurationEnt
     }
 
     @Override
-    protected Dictionary<String, Object> parseConfiguration(String name, 
InputStream input) throws Exception {
+    protected @Nullable Dictionary<String, Object> parseConfiguration(@NotNull 
String name, @NotNull InputStream input) {
         JcrConfigurationHandler configurationHandler = new 
JcrConfigurationHandler();
         try {
             return configurationHandler.parse(input);
@@ -63,7 +61,7 @@ public final class XmlConfigurationEntryHandler extends 
AbstractConfigurationEnt
         }
 
         @Override
-        protected void onJcrRootElement(String uri, String localName, String 
qName, Attributes attributes) throws SAXException {
+        protected void onJcrRootElement(String uri, String localName, String 
qName, Attributes attributes) {
             configuration = Configurations.newConfiguration();
 
             for (int i = 0; i < attributes.getLength(); i++) {
@@ -81,51 +79,43 @@ public final class XmlConfigurationEntryHandler extends 
AbstractConfigurationEnt
                             case PropertyType.DATE:
                                 // Date was never properly supported as osgi 
configs don't support dates so converting to millis 
                                 // Scenario should just be theoretical
-                                value = Lists.transform(strValues, new 
Function<String, Long>() {
-                                   public Long apply(String s) {
-                                      Long res = null;
-                                      if (s != null) {
-                                           Calendar cal = ISO8601.parse(s);
-                                           if (cal != null) {
-                                               res = cal.getTimeInMillis();
-                                           }
-                                      } 
-                                      return res;
-                                   }
+                                value = strValues.stream().map(s -> {
+                                    Long res = null;
+                                    if (s != null) {
+                                        Calendar cal = ISO8601.parse(s);
+                                        if (cal != null) {
+                                            res = cal.getTimeInMillis();
+                                        }
+                                    }
+                                    return res;
                                 }).toArray();
                                 break;
                             case PropertyType.DOUBLE:
-                                value = Lists.transform(strValues, new 
Function<String, Double>() {
-                                   public Double apply(String s) {
-                                      Double res = null;
-                                      if (StringUtils.isNotEmpty(s)) {
-                                          res = Double.parseDouble(s);
-                                      }
-                                      return res;
-                                   }
+                                value = strValues.stream().map(s -> {
+                                    Double res = null;
+                                    if (StringUtils.isNotEmpty(s)) {
+                                        res = Double.parseDouble(s);
+                                    }
+                                    return res;
                                 }).toArray();
                                 break;
                             case PropertyType.LONG:
-                                value = Lists.transform(strValues, new 
Function<String, Long>() {
-                                    public Long apply(String s) {
-                                       Long res = null;
-                                       if (StringUtils.isNotEmpty(s)) {
-                                          res = Long.parseLong(s);
-                                       }
-                                       return res;
+                                value = strValues.stream().map(s -> {
+                                    Long res = null;
+                                    if (StringUtils.isNotEmpty(s)) {
+                                        res = Long.parseLong(s);
                                     }
-                                 }).toArray();
+                                    return res;
+                                }).toArray();
                                 break;
                             case PropertyType.BOOLEAN:
-                                value = Lists.transform(strValues, new 
Function<String, Boolean>() {
-                                    public Boolean apply(String s) {
-                                       Boolean res = null;
-                                       if (s != null) {
-                                          res = Boolean.valueOf(s);
-                                       } 
-                                       return res;
+                                value = strValues.stream().map(s -> {
+                                    Boolean res = null;
+                                    if (s != null) {
+                                        res = Boolean.valueOf(s);
                                     }
-                                 }).toArray();
+                                    return res;
+                                }).toArray();
                                 break;
                         }
                         if (!property.isMulti) {
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/interpolator/SimpleVariablesInterpolator.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/interpolator/SimpleVariablesInterpolator.java
index 0513bd6..dc07337 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/interpolator/SimpleVariablesInterpolator.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/interpolator/SimpleVariablesInterpolator.java
@@ -16,6 +16,9 @@
  */
 package org.apache.sling.feature.cpconverter.interpolator;
 
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
 import static java.util.Objects.requireNonNull;
 
 import java.util.Map;
@@ -26,7 +29,7 @@ public final class SimpleVariablesInterpolator implements 
VariablesInterpolator
 
     private final Pattern replacementPattern = 
Pattern.compile("\\$\\{\\{(.+?)\\}\\}");
 
-    public String interpolate(String format, Map<String, String> properties) {
+    public @NotNull String interpolate(@NotNull String format, @Nullable 
Map<String, String> properties) {
         requireNonNull(format, "Input string format must be not null");
 
         if (properties == null || properties.isEmpty()) {
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/interpolator/VariablesInterpolator.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/interpolator/VariablesInterpolator.java
index f2e13a8..14e9f1b 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/interpolator/VariablesInterpolator.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/interpolator/VariablesInterpolator.java
@@ -16,10 +16,13 @@
  */
 package org.apache.sling.feature.cpconverter.interpolator;
 
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
 import java.util.Map;
 
 public interface VariablesInterpolator {
 
-    String interpolate(String format, Map<String, String> properties);
+    @NotNull String interpolate(@NotNull String format, @Nullable Map<String, 
String> properties);
 
 }
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/shared/AbstractJcrNodeParser.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/shared/AbstractJcrNodeParser.java
index 5fc42ec..79caf44 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/shared/AbstractJcrNodeParser.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/shared/AbstractJcrNodeParser.java
@@ -23,6 +23,7 @@ import java.io.InputStream;
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 
+import org.jetbrains.annotations.NotNull;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
@@ -35,7 +36,7 @@ public abstract class AbstractJcrNodeParser<O> extends 
DefaultHandler {
 
     private final String primaryType;
 
-    public AbstractJcrNodeParser(String primaryType) {
+    public AbstractJcrNodeParser(@NotNull String primaryType) {
         this.primaryType = primaryType;
     }
 
@@ -53,7 +54,7 @@ public abstract class AbstractJcrNodeParser<O> extends 
DefaultHandler {
         }
     }
 
-    protected final String getPrimaryType() {
+    protected final @NotNull String getPrimaryType() {
         return primaryType;
     }
 
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/shared/RepoPath.java 
b/src/main/java/org/apache/sling/feature/cpconverter/shared/RepoPath.java
index 6253de3..6f4be68 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/shared/RepoPath.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/shared/RepoPath.java
@@ -16,6 +16,9 @@
  */
 package org.apache.sling.feature.cpconverter.shared;
 
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -39,7 +42,7 @@ public class RepoPath implements Comparable<RepoPath>{
      * @param path The string representation of the path. If the initial 
leading forward
      * slash is missing it will be assumed to be there.
      */
-    public RepoPath(String path) {
+    public RepoPath(@NotNull String path) {
         path = path.trim();
         if (path.startsWith("/"))
             path = path.substring(1);
@@ -53,12 +56,12 @@ public class RepoPath implements Comparable<RepoPath>{
      * @param list The list to create the repo path from. The list should not 
have
      * any separators.
      */
-    public RepoPath(List<String> list) {
+    public RepoPath(@NotNull List<String> list) {
         this.path = new ArrayList<>(list);
     }
 
     @Override
-    public int compareTo(RepoPath o) {
+    public int compareTo(@NotNull RepoPath o) {
         String me = toString();
         String them = o.toString();
         return me.compareTo(them);
@@ -70,7 +73,7 @@ public class RepoPath implements Comparable<RepoPath>{
      * @return The parent path, or {@code null} if we are at the root and 
there is no
      * further parent.
      */
-    public RepoPath getParent() {
+    public @Nullable RepoPath getParent() {
         if (path.isEmpty())
             return null;
 
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/BaseVaultPackageScanner.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/BaseVaultPackageScanner.java
index 608b166..1df8c2b 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/BaseVaultPackageScanner.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/BaseVaultPackageScanner.java
@@ -29,6 +29,8 @@ import org.apache.jackrabbit.vault.packaging.PackageManager;
 import org.apache.jackrabbit.vault.packaging.PackageProperties;
 import org.apache.jackrabbit.vault.packaging.VaultPackage;
 import org.apache.jackrabbit.vault.packaging.impl.PackageManagerImpl;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,17 +46,17 @@ public abstract class BaseVaultPackageScanner {
         this(new PackageManagerImpl(), strictValidation);
     }
 
-    public BaseVaultPackageScanner(PackageManager packageManager, boolean 
strictValidation) {
+    public BaseVaultPackageScanner(@NotNull PackageManager packageManager, 
boolean strictValidation) {
         this.packageManager = packageManager;
         this.strictValidation = strictValidation;
     }
 
-    public VaultPackage open(File vaultPackage) throws Exception {
+    public @NotNull VaultPackage open(@NotNull File vaultPackage) throws 
Exception {
         requireNonNull(vaultPackage, "Impossible to process a null vault 
package");
         return packageManager.open(vaultPackage, strictValidation);
     }
 
-    public final void traverse(File vaultPackageFile, boolean 
closeOnTraversed) throws Exception {
+    public final void traverse(@NotNull File vaultPackageFile, boolean 
closeOnTraversed) throws Exception {
         VaultPackage vaultPackage = null;
         try {
             vaultPackage = open(vaultPackageFile);
@@ -68,7 +70,7 @@ public abstract class BaseVaultPackageScanner {
         }
     }
 
-    public final void traverse(VaultPackage vaultPackage) throws Exception {
+    public final void traverse(@NotNull VaultPackage vaultPackage) throws 
Exception {
         requireNonNull(vaultPackage, "Impossible to process a null vault 
package");
 
         PackageProperties properties = vaultPackage.getProperties();
@@ -90,7 +92,7 @@ public abstract class BaseVaultPackageScanner {
         }
     }
 
-    private void traverse(String path, Archive archive, Entry entry) throws 
Exception {
+    private void traverse(@Nullable String path, @NotNull Archive archive, 
@NotNull Entry entry) throws Exception {
         String entryPath = newPath(path, entry.getName());
 
         if (entry.isDirectory()) {
@@ -110,7 +112,7 @@ public abstract class BaseVaultPackageScanner {
         logger.debug("Entry {} successfully processed.", entryPath);
     }
 
-    private static String newPath(String path, String entryName) {
+    private static @NotNull String newPath(@Nullable String path, @NotNull 
String entryName) {
         if (path == null) {
             return entryName;
         }
@@ -118,15 +120,15 @@ public abstract class BaseVaultPackageScanner {
         return path + '/' + entryName;
     }
 
-    protected void onDirectory(String path, Archive archive, Entry entry) 
throws Exception {
+    protected void onDirectory(@NotNull String path, @NotNull Archive archive, 
@NotNull Entry entry)  {
         // do nothing by default
     }
 
-    protected void onFile(String path, Archive archive, Entry entry) throws 
Exception {
+    protected void onFile(@NotNull String path, @NotNull Archive archive, 
@NotNull Entry entry) throws Exception {
         // do nothing by default
     }
 
-    protected void addCdnPattern(Pattern cndPattern) {
+    protected void addCdnPattern(@NotNull Pattern cndPattern) {
         // do nothing by default
     }
 
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/DefaultPackagesEventsEmitter.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/DefaultPackagesEventsEmitter.java
index 9993bc3..58ee22a 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/DefaultPackagesEventsEmitter.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/DefaultPackagesEventsEmitter.java
@@ -48,6 +48,7 @@ import 
org.apache.jackrabbit.vault.packaging.PackageProperties;
 import org.apache.jackrabbit.vault.packaging.PackageType;
 import org.apache.jackrabbit.vault.packaging.SubPackageHandling;
 import org.apache.jackrabbit.vault.packaging.VaultPackage;
+import org.jetbrains.annotations.NotNull;
 
 /**
  * Writes a CSV file 
<code>containerFile,packageId,packageType[,parentId,pathInParent]</code>
@@ -58,7 +59,7 @@ public final class DefaultPackagesEventsEmitter implements 
PackagesEventsEmitter
 
     private static final String PATH_SEPARATOR_CHAR = "!";
 
-    public static DefaultPackagesEventsEmitter open(File 
featureModelsOutputDirectory) throws IOException {
+    public static @NotNull DefaultPackagesEventsEmitter open(@NotNull File 
featureModelsOutputDirectory) throws IOException {
         if (!featureModelsOutputDirectory.exists()) {
             featureModelsOutputDirectory.mkdirs();
         }
@@ -79,7 +80,7 @@ public final class DefaultPackagesEventsEmitter implements 
PackagesEventsEmitter
 
     private VaultPackage current;
 
-    protected DefaultPackagesEventsEmitter(Writer writer) {
+    protected DefaultPackagesEventsEmitter(@NotNull Writer writer) {
         this.writer = new PrintWriter(writer, true);
     }
 
@@ -109,7 +110,7 @@ public final class DefaultPackagesEventsEmitter implements 
PackagesEventsEmitter
     }
 
     @Override
-    public void startPackage(VaultPackage vaultPackage) {
+    public void startPackage(@NotNull VaultPackage vaultPackage) {
         PackageId id = vaultPackage.getId();
         Dependency[] dependencies = vaultPackage.getDependencies();
         paths.add(vaultPackage.getFile().getAbsolutePath());
@@ -132,7 +133,7 @@ public final class DefaultPackagesEventsEmitter implements 
PackagesEventsEmitter
     }
 
     @Override
-    public void startSubPackage(String path, VaultPackage vaultPackage) {
+    public void startSubPackage(@NotNull String path, @NotNull VaultPackage 
vaultPackage) {
         PackageId id = vaultPackage.getId();
         Dependency[] dependencies = vaultPackage.getDependencies();
         paths.add(path);
@@ -155,8 +156,8 @@ public final class DefaultPackagesEventsEmitter implements 
PackagesEventsEmitter
         endPackage();
     }
     
-    static VaultPackage getDepOnlyPackage(PackageId id,
-            Dependency[] dependencies) {
+    static @NotNull VaultPackage getDepOnlyPackage(@NotNull PackageId id,
+            @NotNull Dependency[] dependencies) {
         return new VaultPackage() {
             
             
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/PackagesEventsEmitter.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/PackagesEventsEmitter.java
index a854b06..b8488ca 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/PackagesEventsEmitter.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/PackagesEventsEmitter.java
@@ -17,6 +17,7 @@
 package org.apache.sling.feature.cpconverter.vltpkg;
 
 import org.apache.jackrabbit.vault.packaging.VaultPackage;
+import org.jetbrains.annotations.NotNull;
 
 public interface PackagesEventsEmitter {
 
@@ -24,11 +25,11 @@ public interface PackagesEventsEmitter {
 
     void end();
 
-    void startPackage(VaultPackage vaultPackage);
+    void startPackage(@NotNull VaultPackage vaultPackage);
 
     void endPackage();
 
-    void startSubPackage(String path, VaultPackage vaultPackage);
+    void startSubPackage(@NotNull String path, @NotNull VaultPackage 
vaultPackage);
 
     void endSubPackage();
 
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/RecollectorVaultPackageScanner.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/RecollectorVaultPackageScanner.java
index 4284e1b..8e9f290 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/RecollectorVaultPackageScanner.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/RecollectorVaultPackageScanner.java
@@ -26,6 +26,7 @@ import 
org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter
 import org.apache.sling.feature.cpconverter.handlers.EntryHandler;
 import org.apache.sling.feature.cpconverter.handlers.SystemUsersEntryHandler;
 import 
org.apache.sling.feature.cpconverter.handlers.VersionResolverContentPackageEntryHandler;
+import org.jetbrains.annotations.NotNull;
 
 public final class RecollectorVaultPackageScanner extends 
BaseVaultPackageScanner {
 
@@ -33,10 +34,10 @@ public final class RecollectorVaultPackageScanner extends 
BaseVaultPackageScanne
 
     private final EntryHandler[] handlers;
 
-    public RecollectorVaultPackageScanner(ContentPackage2FeatureModelConverter 
converter,
-                                          PackageManager packageManager,
+    public RecollectorVaultPackageScanner(@NotNull 
ContentPackage2FeatureModelConverter converter,
+                                          @NotNull PackageManager 
packageManager,
                                           boolean strictValidation,
-                                          Map<PackageId, String> 
subContentPackages) {
+                                          @NotNull Map<PackageId, String> 
subContentPackages) {
         super(packageManager, strictValidation);
         this.converter = converter;
         handlers = new EntryHandler[] {
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java
index eaff712..3c7f96e 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java
@@ -58,6 +58,8 @@ import 
org.apache.sling.feature.cpconverter.handlers.EntryHandler;
 import org.codehaus.plexus.archiver.Archiver;
 import org.codehaus.plexus.archiver.util.DefaultFileSet;
 import org.codehaus.plexus.archiver.zip.ZipArchiver;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class VaultPackageAssembler implements EntryHandler, FileFilter {
 
@@ -71,11 +73,11 @@ public class VaultPackageAssembler implements EntryHandler, 
FileFilter {
 
     private static final Pattern OSGI_BUNDLE_PATTERN = 
Pattern.compile("(jcr_root)?/apps/[^/]+/install(\\.([^/]+))?/.+\\.jar");
     
-    public static VaultPackageAssembler create(VaultPackage vaultPackage) {
+    public static @NotNull VaultPackageAssembler create(@NotNull VaultPackage 
vaultPackage) {
         return create(vaultPackage, vaultPackage.getMetaInf().getFilter());
     }
 
-    public static File createSynthetic(VaultPackage vaultPackage) throws 
Exception {
+    public static @NotNull File createSynthetic(@NotNull VaultPackage 
vaultPackage) throws Exception {
         DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter();
         PathFilterSet filterSet = new PathFilterSet();
         SyntheticPathFilter pathFilter = new SyntheticPathFilter();
@@ -85,7 +87,7 @@ public class VaultPackageAssembler implements EntryHandler, 
FileFilter {
         return create(vaultPackage, filter).createPackage();
     }
 
-    private static VaultPackageAssembler create(VaultPackage vaultPackage, 
WorkspaceFilter filter) {
+    private static @NotNull VaultPackageAssembler create(@NotNull VaultPackage 
vaultPackage, @NotNull WorkspaceFilter filter) {
         PackageId packageId = vaultPackage.getId();
         String fileName = packageId.toString().replaceAll("/", 
"-").replaceAll(":", "-") + "-" + vaultPackage.getFile().getName();
         File storingDirectory = new File(TMP_DIR, fileName + "-deflated");
@@ -153,17 +155,17 @@ public class VaultPackageAssembler implements 
EntryHandler, FileFilter {
     /**
      * This class can not be instantiated from outside
      */
-    private VaultPackageAssembler(File storingDirectory, Properties 
properties, Set<Dependency> dependencies) {
+    private VaultPackageAssembler(@NotNull File storingDirectory, @NotNull 
Properties properties, @NotNull Set<Dependency> dependencies) {
         this.storingDirectory = storingDirectory;
         this.properties = properties;
         this.dependencies = dependencies;
     }
     
-    public Properties getPackageProperties() {
+    public @NotNull Properties getPackageProperties() {
         return this.properties;
     }
 
-    public void mergeFilters(WorkspaceFilter filter) {
+    public void mergeFilters(@NotNull WorkspaceFilter filter) {
         for (PathFilterSet pathFilterSet : filter.getFilterSets()) {
             if 
(!OSGI_BUNDLE_PATTERN.matcher(pathFilterSet.getRoot()).matches()) {
                 this.filter.add(pathFilterSet);
@@ -171,31 +173,31 @@ public class VaultPackageAssembler implements 
EntryHandler, FileFilter {
         }
     }
 
-    public void addEntry(String path, Archive archive, Entry entry) throws 
IOException {
+    public void addEntry(@NotNull String path, @NotNull Archive archive, 
@NotNull Entry entry) throws IOException {
         try (InputStream input = archive.openInputStream(entry)) {
             addEntry(path, input);
         }
     }
 
-    public void addEntry(String path, File file) throws IOException {
+    public void addEntry(@NotNull String path, @NotNull File file) throws 
IOException {
         try (InputStream input = new FileInputStream(file)) {
             addEntry(path, input);
         }
     }
 
-    public void addEntry(String path, InputStream input) throws IOException {
+    public void addEntry(@NotNull String path, @NotNull InputStream input) 
throws IOException {
         try (OutputStream output = createEntry(path)) {
             IOUtils.copy(input, output);
         }
     }
 
-    public OutputStream createEntry(String path) throws IOException {
+    public @NotNull OutputStream createEntry(@NotNull String path) throws 
IOException {
         File target = new File(storingDirectory, path);
         target.getParentFile().mkdirs();
         return new FileOutputStream(target);
     }
 
-    public File getEntry(String path) {
+    public @NotNull File getEntry(@NotNull String path) {
         if (!path.startsWith(ROOT_DIR)) {
             path = ROOT_DIR + path;
         }
@@ -203,7 +205,7 @@ public class VaultPackageAssembler implements EntryHandler, 
FileFilter {
         return new File(storingDirectory, path);
     }
 
-    public void updateDependencies(Map<PackageId, Set<Dependency>> 
mutableContentsIds) {
+    public void updateDependencies(@NotNull Map<PackageId, Set<Dependency>> 
mutableContentsIds) {
         Map<Dependency, Set<Dependency>> matches = new HashMap<>();
         for (Dependency dependency : dependencies) {
             for (java.util.Map.Entry<PackageId, Set<Dependency>> 
mutableContentId : mutableContentsIds.entrySet()) {
@@ -219,15 +221,15 @@ public class VaultPackageAssembler implements 
EntryHandler, FileFilter {
     }
     
 
-    public void addDependency(Dependency dependency) {
+    public void addDependency(@NotNull Dependency dependency) {
         dependencies.add(dependency);
     }
 
-    public File createPackage() throws IOException {
+    public @NotNull File createPackage() throws IOException {
         return createPackage(TMP_DIR);
     }
 
-    public File createPackage(File outputDirectory) throws IOException {
+    public @NotNull File createPackage(@NotNull File outputDirectory) throws 
IOException {
         // generate the Vault properties XML file
 
         File metaDir = new File(storingDirectory, META_DIR);
@@ -274,12 +276,13 @@ public class VaultPackageAssembler implements 
EntryHandler, FileFilter {
         return destFile;
     }
 
-    private void computeFilters(File outputDirectory) {
+    private void computeFilters(@NotNull File outputDirectory) {
         File jcrRootDir = new File(outputDirectory, JCR_ROOT_DIR);
 
         if (jcrRootDir.exists() && jcrRootDir.isDirectory()) {
             for (File child : jcrRootDir.listFiles(this)) {
-                File lowestCommonAncestor = lowestCommonAncestor(new 
TreeNode(child)).val;
+                TreeNode node = lowestCommonAncestor(new TreeNode(child));
+                File lowestCommonAncestor = node != null ? node.val : null;
                 if (lowestCommonAncestor != null) {
                     String root = 
outputDirectory.toURI().relativize(lowestCommonAncestor.toURI()).getPath();
 
@@ -290,11 +293,11 @@ public class VaultPackageAssembler implements 
EntryHandler, FileFilter {
     }
 
     @Override
-    public boolean accept(File pathname) {
+    public boolean accept(@NotNull File pathname) {
         return pathname.isDirectory();
     }
 
-    private TreeNode lowestCommonAncestor(TreeNode root) {
+    private @Nullable TreeNode lowestCommonAncestor(@NotNull TreeNode root) {
         int currMaxDepth = 0;//curr tree's deepest leaf depth
         int countMaxDepth = 0;//num of deepest leaves
         TreeNode node = null;
@@ -337,7 +340,7 @@ public class VaultPackageAssembler implements EntryHandler, 
FileFilter {
 
         int maxDepth;//this means the maxDepth of curr treenode-rooted 
(sub)tree
 
-        TreeNode(File x) {
+        TreeNode(@NotNull File x) {
             val = x;
             maxDepth = 0;
         }
@@ -345,11 +348,11 @@ public class VaultPackageAssembler implements 
EntryHandler, FileFilter {
     }
 
     public static class FolderDeletionException extends RuntimeException {
-        public FolderDeletionException(String message) {
+        public FolderDeletionException(@NotNull String message) {
             super(message);
         }
 
-        public FolderDeletionException(String message, Throwable cause) {
+        public FolderDeletionException(@NotNull String message, @NotNull 
Throwable cause) {
             super(message, cause);
         }
     }
diff --git 
a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageUtils.java
 
b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageUtils.java
index af6d8f1..4662f74 100644
--- 
a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageUtils.java
+++ 
b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageUtils.java
@@ -28,6 +28,8 @@ import org.apache.jackrabbit.vault.packaging.Dependency;
 import org.apache.jackrabbit.vault.packaging.PackageProperties;
 import org.apache.jackrabbit.vault.packaging.PackageType;
 import org.apache.jackrabbit.vault.packaging.VaultPackage;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class VaultPackageUtils {
 
@@ -37,7 +39,7 @@ public class VaultPackageUtils {
         // this class must not be instantiated from outside
     }
 
-    public static PackageType detectPackageType(VaultPackage vaultPackage) {
+    public static @NotNull PackageType detectPackageType(@NotNull VaultPackage 
vaultPackage) {
         PackageType packageType = vaultPackage.getPackageType();
         if (packageType != null) {
             return packageType;
@@ -72,7 +74,7 @@ public class VaultPackageUtils {
         return PackageType.MIXED;
     }
 
-    public static Set<Dependency> getDependencies(VaultPackage vaultPackage) {
+    public static @NotNull Set<Dependency> getDependencies(@NotNull 
VaultPackage vaultPackage) {
         Dependency[] originalDepenencies = vaultPackage.getDependencies();
 
         Set<Dependency> dependencies = new HashSet<>();
@@ -84,7 +86,7 @@ public class VaultPackageUtils {
         return dependencies;
     }
 
-    public static void setDependencies(Set<Dependency> dependencies, 
Properties properties) {
+    public static void setDependencies(@Nullable Set<Dependency> dependencies, 
@NotNull Properties properties) {
         if (dependencies == null || dependencies.isEmpty()) {
             return;
         }

Reply via email to