You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by kw...@apache.org on 2021/04/19 09:50:25 UTC
[sling-org-apache-sling-jcr-contentloader] branch master updated:
SLING-10297 expose PathEntry as API (#6)
This is an automated email from the ASF dual-hosted git repository.
kwin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jcr-contentloader.git
The following commit(s) were added to refs/heads/master by this push:
new 372e212 SLING-10297 expose PathEntry as API (#6)
372e212 is described below
commit 372e212078ee0a5da31f21943d9a5d6ec96a509b
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Mon Apr 19 11:49:35 2021 +0200
SLING-10297 expose PathEntry as API (#6)
---
pom.xml | 6 +++
.../contentloader/{internal => }/PathEntry.java | 60 ++++++++++++++++++----
.../contentloader/hc/BundleContentLoadedCheck.java | 2 +-
.../contentloader/internal/BaseImportLoader.java | 1 +
.../internal/BundleContentLoader.java | 1 +
.../sling/jcr/contentloader/package-info.java | 2 +-
.../{internal => }/ImportOptionsFactory.java | 4 +-
.../{internal => }/PathEntryTest.java | 2 +-
.../jcr/contentloader/internal/CreateNodeTest.java | 8 +--
.../internal/DefaultContentCreatorTest.java | 12 ++---
10 files changed, 73 insertions(+), 25 deletions(-)
diff --git a/pom.xml b/pom.xml
index da1ecde..59cbe7a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -136,6 +136,12 @@
<artifactId>org.osgi.annotation.bundle</artifactId>
</dependency>
+ <!-- JetBrains annotations for null-analysis (SLING-7798) -->
+ <dependency>
+ <groupId>org.jetbrains</groupId>
+ <artifactId>annotations</artifactId>
+ </dependency>
+
<!-- -->
<dependency>
<groupId>javax.jcr</groupId>
diff --git a/src/main/java/org/apache/sling/jcr/contentloader/internal/PathEntry.java b/src/main/java/org/apache/sling/jcr/contentloader/PathEntry.java
similarity index 76%
rename from src/main/java/org/apache/sling/jcr/contentloader/internal/PathEntry.java
rename to src/main/java/org/apache/sling/jcr/contentloader/PathEntry.java
index 38898ae..8495b62 100644
--- a/src/main/java/org/apache/sling/jcr/contentloader/internal/PathEntry.java
+++ b/src/main/java/org/apache/sling/jcr/contentloader/PathEntry.java
@@ -16,15 +16,22 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.sling.jcr.contentloader.internal;
+package org.apache.sling.jcr.contentloader;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Dictionary;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.StringTokenizer;
+import java.util.function.Function;
+import java.util.jar.Manifest;
+import java.util.stream.Collectors;
import org.apache.sling.commons.osgi.ManifestHeader;
-import org.apache.sling.jcr.contentloader.ImportOptions;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import org.osgi.framework.Bundle;
/**
@@ -129,14 +136,43 @@ public class PathEntry extends ImportOptions {
private long lastModified;
- public static Iterator<PathEntry> getContentPaths(final Bundle bundle) {
+ /**
+ * Parses the "Sling-Initial-Content" header from the given manifest and returns the resolved PathEntries
+ *
+ * @param manifest the manifest
+ * @param bundleLastModified the timestamp when the bundle has been last modified or -1 if not known
+ * @return an iterator over the parsed {@code PathEntry} items or {@code null} in case no "Sling-Initial-Content" header was found in the manifest
+ */
+ public static @Nullable Iterator<PathEntry> getContentPaths(@NotNull final Manifest manifest, long bundleLastModified) {
+ // convert to map of right type (Attributes has Attributes.Name as key type, not String), so simple casting won't do
+ Map<String, String> headers = manifest.getMainAttributes().entrySet().stream().collect(Collectors.toMap( e -> e.getKey().toString(), e-> e.getValue().toString()));
+ return getContentPaths(headers, bundleLastModified);
+ }
+
+ /**
+ * Parses the "Sling-Initial-Content" header from the given bundle and returns the resolved PathEntries
+ *
+ * @param bundle the bundle
+ * @return an iterator over the parsed {@code PathEntry} items or {@code null} in case no "Sling-Initial-Content" header was found in the bundle's manifest
+ */
+ public static @Nullable Iterator<PathEntry> getContentPaths(final Bundle bundle) {
+ return getContentPaths(toMap(bundle.getHeaders()), bundle.getLastModified());
+ }
+
+ /**
+ * Parses the "Sling-Initial-Content" header from the given headers and returns the resolved PathEntries
+ *
+ * @param headers the manifest headers
+ * @param bundleLastModified the timestamp when the bundle has been last modified or -1 if not known
+ * @return an iterator over the parsed {@code PathEntry} items or {@code null} in case no "Sling-Initial-Content" header was found
+ */
+ public static @Nullable Iterator<PathEntry> getContentPaths(final Map<String, String> headers, long bundleLastModified) {
final List<PathEntry> entries = new ArrayList<>();
- String bundleLastModifiedStamp = bundle.getHeaders().get("Bnd-LastModified");
- long bundleLastModified = bundle.getLastModified(); // time last modified inside the container
+ String bundleLastModifiedStamp = headers.get("Bnd-LastModified");
if ( bundleLastModifiedStamp != null ) {
bundleLastModified = Math.min(bundleLastModified, Long.parseLong(bundleLastModifiedStamp));
}
- final String root = bundle.getHeaders().get(CONTENT_HEADER);
+ final String root = headers.get(CONTENT_HEADER);
if (root != null) {
final ManifestHeader header = ManifestHeader.parse(root);
for (final ManifestHeader.Entry entry : header.getEntries()) {
@@ -151,6 +187,12 @@ public class PathEntry extends ImportOptions {
return entries.iterator();
}
+ private static Map<String, String> toMap(Dictionary<String, String> dict) {
+ List<String> keys = Collections.list(dict.keys());
+ return keys.stream()
+ .collect(Collectors.toMap(Function.identity(), dict::get));
+ }
+
public PathEntry(ManifestHeader.Entry entry, long bundleLastModified) {
this.path = entry.getValue();
this.lastModified = bundleLastModified;
@@ -250,7 +292,7 @@ public class PathEntry extends ImportOptions {
}
/* (non-Javadoc)
- * @see org.apache.sling.jcr.contentloader.internal.ImportOptions#isOverwrite()
+ * @see org.apache.sling.jcr.contentloader.ImportOptions#isOverwrite()
*/
public boolean isOverwrite() {
return this.overwrite;
@@ -269,7 +311,7 @@ public class PathEntry extends ImportOptions {
}
/* (non-Javadoc)
- * @see org.apache.sling.jcr.contentloader.internal.ImportOptions#isCheckin()
+ * @see org.apache.sling.jcr.contentloader.ImportOptions#isCheckin()
*/
public boolean isCheckin() {
return this.checkin;
@@ -284,7 +326,7 @@ public class PathEntry extends ImportOptions {
}
/* (non-Javadoc)
- * @see org.apache.sling.jcr.contentloader.internal.ImportOptions#isIgnoredImportProvider(java.lang.String)
+ * @see org.apache.sling.jcr.contentloader.ImportOptions#isIgnoredImportProvider(java.lang.String)
*/
public boolean isIgnoredImportProvider(String extension) {
if ( extension.startsWith(".") ) {
diff --git a/src/main/java/org/apache/sling/jcr/contentloader/hc/BundleContentLoadedCheck.java b/src/main/java/org/apache/sling/jcr/contentloader/hc/BundleContentLoadedCheck.java
index 10a3692..b032bc6 100644
--- a/src/main/java/org/apache/sling/jcr/contentloader/hc/BundleContentLoadedCheck.java
+++ b/src/main/java/org/apache/sling/jcr/contentloader/hc/BundleContentLoadedCheck.java
@@ -31,8 +31,8 @@ import org.apache.felix.hc.api.HealthCheck;
import org.apache.felix.hc.api.Result;
import org.apache.sling.jcr.api.SlingRepository;
import org.apache.sling.jcr.contentloader.internal.BundleHelper;
+import org.apache.sling.jcr.contentloader.PathEntry;
import org.apache.sling.jcr.contentloader.internal.BundleContentLoaderListener;
-import org.apache.sling.jcr.contentloader.internal.PathEntry;
import org.apache.sling.serviceusermapping.ServiceUserMapped;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
diff --git a/src/main/java/org/apache/sling/jcr/contentloader/internal/BaseImportLoader.java b/src/main/java/org/apache/sling/jcr/contentloader/internal/BaseImportLoader.java
index 4a9dd52..39c9473 100644
--- a/src/main/java/org/apache/sling/jcr/contentloader/internal/BaseImportLoader.java
+++ b/src/main/java/org/apache/sling/jcr/contentloader/internal/BaseImportLoader.java
@@ -25,6 +25,7 @@ import java.util.Map.Entry;
import org.apache.sling.jcr.contentloader.ContentReader;
import org.apache.sling.jcr.contentloader.ImportOptions;
+import org.apache.sling.jcr.contentloader.PathEntry;
/**
* Base class that takes care of the details that are common to bundle content
diff --git a/src/main/java/org/apache/sling/jcr/contentloader/internal/BundleContentLoader.java b/src/main/java/org/apache/sling/jcr/contentloader/internal/BundleContentLoader.java
index 9bb7f71..8bbb26e 100644
--- a/src/main/java/org/apache/sling/jcr/contentloader/internal/BundleContentLoader.java
+++ b/src/main/java/org/apache/sling/jcr/contentloader/internal/BundleContentLoader.java
@@ -50,6 +50,7 @@ import javax.jcr.version.VersionManager;
import org.apache.commons.io.IOUtils;
import org.apache.sling.jcr.contentloader.ContentReader;
+import org.apache.sling.jcr.contentloader.PathEntry;
import org.osgi.framework.Bundle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/src/main/java/org/apache/sling/jcr/contentloader/package-info.java b/src/main/java/org/apache/sling/jcr/contentloader/package-info.java
index 7bb87b6..569304a 100644
--- a/src/main/java/org/apache/sling/jcr/contentloader/package-info.java
+++ b/src/main/java/org/apache/sling/jcr/contentloader/package-info.java
@@ -17,6 +17,6 @@
* under the License.
*/
-@org.osgi.annotation.versioning.Version("0.4.0")
+@org.osgi.annotation.versioning.Version("0.5.0")
package org.apache.sling.jcr.contentloader;
diff --git a/src/test/java/org/apache/sling/jcr/contentloader/internal/ImportOptionsFactory.java b/src/test/java/org/apache/sling/jcr/contentloader/ImportOptionsFactory.java
similarity index 95%
rename from src/test/java/org/apache/sling/jcr/contentloader/internal/ImportOptionsFactory.java
rename to src/test/java/org/apache/sling/jcr/contentloader/ImportOptionsFactory.java
index abcec72..c1ab108 100644
--- a/src/test/java/org/apache/sling/jcr/contentloader/internal/ImportOptionsFactory.java
+++ b/src/test/java/org/apache/sling/jcr/contentloader/ImportOptionsFactory.java
@@ -14,9 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.sling.jcr.contentloader.internal;
-
-import org.apache.sling.jcr.contentloader.ImportOptions;
+package org.apache.sling.jcr.contentloader;
public final class ImportOptionsFactory {
diff --git a/src/test/java/org/apache/sling/jcr/contentloader/internal/PathEntryTest.java b/src/test/java/org/apache/sling/jcr/contentloader/PathEntryTest.java
similarity index 99%
rename from src/test/java/org/apache/sling/jcr/contentloader/internal/PathEntryTest.java
rename to src/test/java/org/apache/sling/jcr/contentloader/PathEntryTest.java
index 6f3ea61..083efda 100644
--- a/src/test/java/org/apache/sling/jcr/contentloader/internal/PathEntryTest.java
+++ b/src/test/java/org/apache/sling/jcr/contentloader/PathEntryTest.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.sling.jcr.contentloader.internal;
+package org.apache.sling.jcr.contentloader;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
diff --git a/src/test/java/org/apache/sling/jcr/contentloader/internal/CreateNodeTest.java b/src/test/java/org/apache/sling/jcr/contentloader/internal/CreateNodeTest.java
index b54273b..9a4e549 100644
--- a/src/test/java/org/apache/sling/jcr/contentloader/internal/CreateNodeTest.java
+++ b/src/test/java/org/apache/sling/jcr/contentloader/internal/CreateNodeTest.java
@@ -16,10 +16,10 @@
*/
package org.apache.sling.jcr.contentloader.internal;
-import static org.apache.sling.jcr.contentloader.internal.ImportOptionsFactory.AUTO_CHECKOUT;
-import static org.apache.sling.jcr.contentloader.internal.ImportOptionsFactory.OVERWRITE_NODE;
-import static org.apache.sling.jcr.contentloader.internal.ImportOptionsFactory.OVERWRITE_PROPERTIES;
-import static org.apache.sling.jcr.contentloader.internal.ImportOptionsFactory.createImportOptions;
+import static org.apache.sling.jcr.contentloader.ImportOptionsFactory.AUTO_CHECKOUT;
+import static org.apache.sling.jcr.contentloader.ImportOptionsFactory.OVERWRITE_NODE;
+import static org.apache.sling.jcr.contentloader.ImportOptionsFactory.OVERWRITE_PROPERTIES;
+import static org.apache.sling.jcr.contentloader.ImportOptionsFactory.createImportOptions;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
diff --git a/src/test/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreatorTest.java b/src/test/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreatorTest.java
index bd97172..c316a46 100644
--- a/src/test/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreatorTest.java
+++ b/src/test/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreatorTest.java
@@ -16,12 +16,12 @@
*/
package org.apache.sling.jcr.contentloader.internal;
-import static org.apache.sling.jcr.contentloader.internal.ImportOptionsFactory.AUTO_CHECKOUT;
-import static org.apache.sling.jcr.contentloader.internal.ImportOptionsFactory.CHECK_IN;
-import static org.apache.sling.jcr.contentloader.internal.ImportOptionsFactory.NO_OPTIONS;
-import static org.apache.sling.jcr.contentloader.internal.ImportOptionsFactory.OVERWRITE_NODE;
-import static org.apache.sling.jcr.contentloader.internal.ImportOptionsFactory.OVERWRITE_PROPERTIES;
-import static org.apache.sling.jcr.contentloader.internal.ImportOptionsFactory.createImportOptions;
+import static org.apache.sling.jcr.contentloader.ImportOptionsFactory.AUTO_CHECKOUT;
+import static org.apache.sling.jcr.contentloader.ImportOptionsFactory.CHECK_IN;
+import static org.apache.sling.jcr.contentloader.ImportOptionsFactory.NO_OPTIONS;
+import static org.apache.sling.jcr.contentloader.ImportOptionsFactory.OVERWRITE_NODE;
+import static org.apache.sling.jcr.contentloader.ImportOptionsFactory.OVERWRITE_PROPERTIES;
+import static org.apache.sling.jcr.contentloader.ImportOptionsFactory.createImportOptions;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;