You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by pa...@apache.org on 2021/01/12 15:44:05 UTC

[sling-org-apache-sling-feature-cpconverter] branch issues/SLING-9974 created (now 1383254)

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

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


      at 1383254  SLING-9974: add nullability annotations

This branch includes the following new commits:

     new 1383254  SLING-9974: add nullability annotations

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[sling-org-apache-sling-feature-cpconverter] 01/01: SLING-9974: add nullability annotations

Posted by pa...@apache.org.
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 <ka...@gmail.com>
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;
         }