JCRVLT-546 remove private references from public API (#156)

deprecate Packaging.getJcrPackageRegistry which returns private
JcrPackageRegistry
Move artifact implementations to non-exported package (potentially
backwards incompatible)
import and export o.a.j.spi2dav.ConnectionOptions due to usage in API
diff --git a/parent/pom.xml b/parent/pom.xml
index 922baae..b47f14d 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -147,6 +147,10 @@
 -exportcontents: ${removeall;${packages;VERSIONED};${packages;CONDITIONAL}}
 # support only DS 1.4 (https://github.com/bndtools/bnd/pull/3121/files)
 -dsannotations-options: version;maximum=1.4.0
+# generate error (instead of warning) when exported package uses private (non-exported) reference
+-fixupmessages:"Export *,  has \\d+,  private references"; \
+    restrict:=warning; \
+    is:=error
                                 ]]></bnd>
                             </configuration>
                         </execution>
diff --git a/vault-core/bnd.bnd b/vault-core/bnd.bnd
index 342c6eb..5c5a0d4 100644
--- a/vault-core/bnd.bnd
+++ b/vault-core/bnd.bnd
@@ -13,12 +13,17 @@
 #  See the License for the specific language governing permissions and
 #  limitations under the License.
 
-Import-Package: org.apache.jackrabbit.*;version=!,\
+# JR2 packages not semantically versioned
+Import-Package: org.apache.jackrabbit.spi2dav;resolution:=optional,\
                             org.apache.sling.jcr.api;resolution:=optional,\
+                            org.apache.jackrabbit.*;version=!,\
                             *
 DynamicImport-Package: *
 -includeresource: @txw2-[0-9.]*.jar!/com/sun/xml/txw2/output/(IndentingXMLStreamWriter|DelegatingXMLStreamWriter).*,\
                   @woodstox-core-[0-9.]*.jar!/!module-info.class,\
                   @stax2-api-[0-9.]*.jar!/!module-info.class,\
-                  @jackrabbit-spi2dav-*.jar!/org/apache/jackrabbit/spi2dav/ConnectionOptions*.class,\
-                  @maven-artifact-*.jar!/org/apache/maven/artifact/versioning/ComparableVersion*.class
\ No newline at end of file
+                  @maven-artifact-*.jar!/org/apache/maven/artifact/versioning/ComparableVersion*.class
+# whitelist the private reference usage in Packaging.getJcrPackageRegistry(Session)
+-fixupmessages:"Export org.apache.jackrabbit.vault.packaging,  has 1,  private references [org.apache.jackrabbit.vault.packaging.registry.impl]"; \
+    restrict:=warning; \
+    is:=warn
\ No newline at end of file
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/ArtifactSetImpl.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/ArtifactSetImpl.java
index 8309dbc..4a1fc3f 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/ArtifactSetImpl.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/ArtifactSetImpl.java
@@ -30,8 +30,6 @@
 import javax.jcr.Property;
 import javax.jcr.RepositoryException;
 
-import org.apache.jackrabbit.vault.fs.PropertyValueArtifact;
-import org.apache.jackrabbit.vault.fs.SerializerArtifact;
 import org.apache.jackrabbit.vault.fs.api.Artifact;
 import org.apache.jackrabbit.vault.fs.api.ArtifactIterator;
 import org.apache.jackrabbit.vault.fs.api.ArtifactSet;
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/DirectoryArtifact.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/DirectoryArtifact.java
similarity index 96%
rename from vault-core/src/main/java/org/apache/jackrabbit/vault/fs/DirectoryArtifact.java
rename to vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/DirectoryArtifact.java
index feb9c82..e457e19 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/DirectoryArtifact.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/DirectoryArtifact.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.jackrabbit.vault.fs;
+package org.apache.jackrabbit.vault.fs.impl;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -29,7 +29,6 @@
 import org.apache.jackrabbit.vault.fs.api.ImportArtifact;
 import org.apache.jackrabbit.vault.fs.api.SerializationType;
 import org.apache.jackrabbit.vault.fs.api.VaultInputSource;
-import org.apache.jackrabbit.vault.fs.impl.AbstractArtifact;
 
 /**
  * Implements a generic directory artifact.
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/HintArtifact.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/HintArtifact.java
similarity index 96%
rename from vault-core/src/main/java/org/apache/jackrabbit/vault/fs/HintArtifact.java
rename to vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/HintArtifact.java
index 1a5aabd..9465338 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/HintArtifact.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/HintArtifact.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.jackrabbit.vault.fs;
+package org.apache.jackrabbit.vault.fs.impl;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -29,7 +29,6 @@
 import org.apache.jackrabbit.vault.fs.api.ImportArtifact;
 import org.apache.jackrabbit.vault.fs.api.SerializationType;
 import org.apache.jackrabbit.vault.fs.api.VaultInputSource;
-import org.apache.jackrabbit.vault.fs.impl.AbstractArtifact;
 
 /**
  * Implements a generic hint artifact.
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/PropertyValueArtifact.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/PropertyValueArtifact.java
similarity index 98%
rename from vault-core/src/main/java/org/apache/jackrabbit/vault/fs/PropertyValueArtifact.java
rename to vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/PropertyValueArtifact.java
index 5120a88..bcafe13 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/PropertyValueArtifact.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/PropertyValueArtifact.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.jackrabbit.vault.fs;
+package org.apache.jackrabbit.vault.fs.impl;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -37,7 +37,6 @@
 import org.apache.jackrabbit.vault.fs.api.ExportArtifact;
 import org.apache.jackrabbit.vault.fs.api.SerializationType;
 import org.apache.jackrabbit.vault.fs.api.VaultInputSource;
-import org.apache.jackrabbit.vault.fs.impl.AbstractArtifact;
 import org.apache.jackrabbit.vault.util.JcrConstants;
 
 /**
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/SerializerArtifact.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/SerializerArtifact.java
similarity index 98%
rename from vault-core/src/main/java/org/apache/jackrabbit/vault/fs/SerializerArtifact.java
rename to vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/SerializerArtifact.java
index e780bc2..2b6debb 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/SerializerArtifact.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/SerializerArtifact.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.jackrabbit.vault.fs;
+package org.apache.jackrabbit.vault.fs.impl;
 
 import java.io.ByteArrayInputStream;
 import java.io.FileNotFoundException;
@@ -32,7 +32,6 @@
 import org.apache.jackrabbit.vault.fs.api.ExportArtifact;
 import org.apache.jackrabbit.vault.fs.api.SerializationType;
 import org.apache.jackrabbit.vault.fs.api.VaultInputSource;
-import org.apache.jackrabbit.vault.fs.impl.AbstractArtifact;
 import org.apache.jackrabbit.vault.fs.io.Serializer;
 import org.apache.jackrabbit.vault.util.TempFileInputStream;
 
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/TransactionImpl.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/TransactionImpl.java
index 3befca2..5f22f07 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/TransactionImpl.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/TransactionImpl.java
@@ -28,7 +28,6 @@
 
 import javax.jcr.RepositoryException;
 
-import org.apache.jackrabbit.vault.fs.DirectoryArtifact;
 import org.apache.jackrabbit.vault.fs.api.Aggregate;
 import org.apache.jackrabbit.vault.fs.api.Artifact;
 import org.apache.jackrabbit.vault.fs.api.ArtifactType;
@@ -311,8 +310,8 @@
                         if (ret != null) {
                             allInfos.merge(ret);
                             if (verbose) {
-                                for (Map.Entry e: ret.getModifications().entrySet()) {
-                                    log.info("...comitting  {} {}", e.getValue(), e.getKey());
+                                for (Map.Entry<String,ImportInfo.Type> e: ret.getModifications().entrySet()) {
+                                    log.info("...committing  {} {}", e.getValue(), e.getKey());
                                 }
                             }
                         }
@@ -332,8 +331,8 @@
                             }
                         }
                         if (verbose && ret != null) {
-                            for (Map.Entry e: ret.getModifications().entrySet()) {
-                                log.info("...comitting  {} {}", e.getValue(), e.getKey());
+                            for (Map.Entry<String,ImportInfo.Type> e: ret.getModifications().entrySet()) {
+                                log.info("...committing  {} {}", e.getValue(), e.getKey());
                             }
                         }
                     }
@@ -743,7 +742,7 @@
 
         private final AggregateBuilder out;
 
-        private final Map<String, VaultFile> original = new HashMap<String, VaultFile>();
+        private final Map<String, VaultFile> original = new HashMap<>();
 
         private VaultFile parentFile;
 
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/aggregator/FileAggregator.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/aggregator/FileAggregator.java
index 3a7f6c0..f405ac1 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/aggregator/FileAggregator.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/aggregator/FileAggregator.java
@@ -23,7 +23,6 @@
 import javax.jcr.Session;
 import javax.jcr.Value;
 
-import org.apache.jackrabbit.vault.fs.DirectoryArtifact;
 import org.apache.jackrabbit.vault.fs.api.Aggregate;
 import org.apache.jackrabbit.vault.fs.api.Aggregator;
 import org.apache.jackrabbit.vault.fs.api.Artifact;
@@ -34,6 +33,7 @@
 import org.apache.jackrabbit.vault.fs.api.ImportInfo;
 import org.apache.jackrabbit.vault.fs.api.ItemFilterSet;
 import org.apache.jackrabbit.vault.fs.impl.ArtifactSetImpl;
+import org.apache.jackrabbit.vault.fs.impl.DirectoryArtifact;
 import org.apache.jackrabbit.vault.fs.impl.io.DocViewSerializer;
 import org.apache.jackrabbit.vault.fs.impl.io.ImportInfoImpl;
 import org.apache.jackrabbit.vault.fs.io.Serializer;
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/aggregator/GenericAggregator.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/aggregator/GenericAggregator.java
index 43b4ed3..d769cca 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/aggregator/GenericAggregator.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/aggregator/GenericAggregator.java
@@ -23,7 +23,6 @@
 import javax.jcr.Property;
 import javax.jcr.RepositoryException;
 
-import org.apache.jackrabbit.vault.fs.DirectoryArtifact;
 import org.apache.jackrabbit.vault.fs.api.Aggregate;
 import org.apache.jackrabbit.vault.fs.api.Aggregator;
 import org.apache.jackrabbit.vault.fs.api.Artifact;
@@ -34,6 +33,7 @@
 import org.apache.jackrabbit.vault.fs.api.ImportInfo;
 import org.apache.jackrabbit.vault.fs.api.ItemFilterSet;
 import org.apache.jackrabbit.vault.fs.impl.ArtifactSetImpl;
+import org.apache.jackrabbit.vault.fs.impl.DirectoryArtifact;
 import org.apache.jackrabbit.vault.fs.impl.io.DocViewSerializer;
 import org.apache.jackrabbit.vault.fs.impl.io.ImportInfoImpl;
 import org.apache.jackrabbit.vault.fs.io.Serializer;
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXImporter.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXImporter.java
index 8e128cc..e2aa8a2 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXImporter.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXImporter.java
@@ -54,7 +54,6 @@
 import org.apache.jackrabbit.spi.commons.name.NameConstants;
 import org.apache.jackrabbit.spi.commons.namespace.NamespaceResolver;
 import org.apache.jackrabbit.util.ISO9075;
-import org.apache.jackrabbit.vault.fs.PropertyValueArtifact;
 import org.apache.jackrabbit.vault.fs.api.Artifact;
 import org.apache.jackrabbit.vault.fs.api.ArtifactType;
 import org.apache.jackrabbit.vault.fs.api.ImportMode;
@@ -63,6 +62,7 @@
 import org.apache.jackrabbit.vault.fs.api.SerializationType;
 import org.apache.jackrabbit.vault.fs.api.WorkspaceFilter;
 import org.apache.jackrabbit.vault.fs.impl.ArtifactSetImpl;
+import org.apache.jackrabbit.vault.fs.impl.PropertyValueArtifact;
 import org.apache.jackrabbit.vault.fs.io.AccessControlHandling;
 import org.apache.jackrabbit.vault.fs.spi.ACLManagement;
 import org.apache.jackrabbit.vault.fs.spi.ServiceProviderFactory;
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/Importer.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/Importer.java
index 372ba8d..e94d8b1 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/Importer.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/io/Importer.java
@@ -45,8 +45,6 @@
 import org.apache.jackrabbit.spi.commons.namespace.NamespaceMapping;
 import org.apache.jackrabbit.spi.commons.namespace.NamespaceResolver;
 import org.apache.jackrabbit.spi.commons.namespace.SessionNamespaceResolver;
-import org.apache.jackrabbit.vault.fs.DirectoryArtifact;
-import org.apache.jackrabbit.vault.fs.HintArtifact;
 import org.apache.jackrabbit.vault.fs.api.Artifact;
 import org.apache.jackrabbit.vault.fs.api.ArtifactType;
 import org.apache.jackrabbit.vault.fs.api.ImportInfo;
@@ -62,6 +60,8 @@
 import org.apache.jackrabbit.vault.fs.config.MetaInf;
 import org.apache.jackrabbit.vault.fs.config.VaultSettings;
 import org.apache.jackrabbit.vault.fs.impl.ArtifactSetImpl;
+import org.apache.jackrabbit.vault.fs.impl.DirectoryArtifact;
+import org.apache.jackrabbit.vault.fs.impl.HintArtifact;
 import org.apache.jackrabbit.vault.fs.impl.io.FileArtifactHandler;
 import org.apache.jackrabbit.vault.fs.impl.io.FolderArtifactHandler;
 import org.apache.jackrabbit.vault.fs.impl.io.GenericArtifactHandler;
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/package-info.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/package-info.java
index 5fa92b7..dc2c0d2 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/package-info.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/package-info.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-@Version("2.4.0")
+@Version("3.0.0")
 package org.apache.jackrabbit.vault.fs;
 
 import org.osgi.annotation.versioning.Version;
\ No newline at end of file
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/Packaging.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/Packaging.java
index de67cf2..a45cc97 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/Packaging.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/Packaging.java
@@ -92,6 +92,15 @@
      * Returns a JCR-based package registry using the given session.
      * @param session the JCR session to use for reading/writing nodes in the repository
      * @return the JCR-based package registry
+     * @deprecated Rather use {@link #getJcrBasedPackageRegistry(Session)} which doesn't return a private class
      */
+    @Deprecated
     JcrPackageRegistry getJcrPackageRegistry(Session session);
+
+    /**
+     * Returns a JCR-based package registry using the given session.
+     * @param session the JCR session to use for reading/writing nodes in the repository
+     * @return the JCR-based package registry
+     */
+    PackageRegistry getJcrBasedPackageRegistry(Session session);
 }
\ No newline at end of file
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackagingImpl.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackagingImpl.java
index 45df491..6b1347b 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackagingImpl.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackagingImpl.java
@@ -170,6 +170,12 @@
         return getJcrPackageRegistry(session, true);
     }
 
+    
+    @Override
+    public PackageRegistry getJcrBasedPackageRegistry(Session session) {
+        return getJcrPackageRegistry(session);
+    }
+
     private JcrPackageRegistry getJcrPackageRegistry(Session session, boolean useBaseRegistry) {
         JcrPackageRegistry registry = new JcrPackageRegistry(session, new AbstractPackageRegistry.SecurityConfig(config.authIdsForHookExecution(), config.authIdsForRootInstallation()), config.isStrict(), config.packageRoots());
         registry.setDispatcher(eventDispatcher);
diff --git a/vault-rcp/bnd.bnd b/vault-rcp/bnd.bnd
index 3dd73ce..0fd45fe 100644
--- a/vault-rcp/bnd.bnd
+++ b/vault-rcp/bnd.bnd
@@ -21,4 +21,11 @@
                   @jackrabbit-jcr2spi-[0-9.]*(-SNAPSHOT)?.jar
 -conditionalpackage: org.apache.jackrabbit.util,org.apache.jackrabbit.api.security
 # make sure to only export the relevant packages (https://github.com/bndtools/bnd/issues/4219)
--exportcontents: org.apache.jackrabbit.vault.rcp
\ No newline at end of file
+-exportcontents: org.apache.jackrabbit.vault.rcp
+# due to Jackrabbit2 JARs poorly designed for OSGi, only export the class used in the API from package "org.apache.jackrabbit.spi2dav", as the other classes in that package have lots of private references
+# http://docs.osgi.org/specification/osgi.core/7.0.0/framework.module.html#i3106983
+Export-Package: org.apache.jackrabbit.spi2dav;include:=ConnectionOptions;-split-package:=merge-first
+# prevent false positive due to https://github.com/bndtools/bnd/issues/1943
+-fixupmessages:"Export org.apache.jackrabbit.spi2dav,  has 8,  private references [org.apache.jackrabbit.spi, org.apache.jackrabbit.spi.commons, org.apache.jackrabbit.spi.commons.conversion, org.apache.jackrabbit.webdav, org.apache.jackrabbit.webdav.lock, org.apache.jackrabbit.webdav.observation, org.apache.jackrabbit.webdav.property, org.apache.jackrabbit.webdav.xml]";\
+    restrict:=warning; \
+    is:=ignore
\ No newline at end of file