You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by kw...@apache.org on 2022/02/11 09:44:24 UTC

[jackrabbit-filevault] 01/01: JCRVLT-606 support PackageManager.rewrap(...) on non-ZIP based packages

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

kwin pushed a commit to branch bugfix/JCRVLT-606-rewrap-on-arbitrary-vaultpackages
in repository https://gitbox.apache.org/repos/asf/jackrabbit-filevault.git

commit 06b36848afc10860dc49010ee3f8e24c15bdc21c
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Fri Feb 11 10:42:34 2022 +0100

    JCRVLT-606 support PackageManager.rewrap(...) on non-ZIP based packages
---
 .../vault/packaging/impl/PackageManagerImpl.java   | 80 +++++++++++++---------
 .../packaging/integration/PackageInstallIT.java    | 24 +++++++
 2 files changed, 72 insertions(+), 32 deletions(-)

diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackageManagerImpl.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackageManagerImpl.java
index 140a7c9..21e8102 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackageManagerImpl.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/PackageManagerImpl.java
@@ -21,13 +21,12 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.URISyntaxException;
-import java.util.Enumeration;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
 
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
@@ -41,6 +40,7 @@ import org.apache.jackrabbit.vault.fs.api.VaultFsConfig;
 import org.apache.jackrabbit.vault.fs.config.DefaultMetaInf;
 import org.apache.jackrabbit.vault.fs.config.MetaInf;
 import org.apache.jackrabbit.vault.fs.impl.AggregateManagerImpl;
+import org.apache.jackrabbit.vault.fs.io.AbstractExporter;
 import org.apache.jackrabbit.vault.fs.io.Archive;
 import org.apache.jackrabbit.vault.fs.io.JarExporter;
 import org.apache.jackrabbit.vault.fs.spi.ProgressTracker;
@@ -210,37 +210,34 @@ public class PackageManagerImpl implements PackageManager {
                 tracker = new ProgressTracker();
                 exporter.setVerbose(opts.getListener());
             }
-    
+
             // merge
             MetaInf inf = opts.getMetaInf();
-            try (ZipFile zip = new ZipFile(src.getFile(), ZipFile.OPEN_READ)) {
-                if (opts.getPostProcessor() == null) {
-                    // no post processor, we keep all files except the properties
-                    Enumeration<? extends ZipEntry> e = zip.entries();
-                    while (e.hasMoreElements()) {
-                        ZipEntry entry = (ZipEntry) e.nextElement();
-                        String path = entry.getName();
-                        if (!path.equals(Constants.META_DIR + "/" + Constants.PROPERTIES_XML)) {
-                            exporter.write(zip, entry);
-                        }
-                    }
-                } else {
-                    Set<String> keep = new HashSet<String>();
-                    keep.add(Constants.META_DIR + "/");
-                    keep.add(Constants.META_DIR + "/" + Constants.NODETYPES_CND);
-                    keep.add(Constants.META_DIR + "/" + Constants.CONFIG_XML);
-                    keep.add(Constants.META_DIR + "/" + Constants.FILTER_XML);
-                    Enumeration<? extends ZipEntry> e = zip.entries();
-                    while (e.hasMoreElements()) {
-                        ZipEntry entry = (ZipEntry) e.nextElement();
-                        String path = entry.getName();
-                        if (!path.startsWith(Constants.META_DIR + "/") || keep.contains(path)) {
-                            exporter.write(zip, entry);
-                        }
-                    }
-                }
+            if (inf == null || inf.getProperties() == null) {
+                throw new IllegalArgumentException("The export options didn't set the mandatory properties");
             }
-    
+
+            final Set<String> metaInfIncludes;
+            final Set<String> metaInfExcludes;
+            if (opts.getPostProcessor() == null) {
+                // no post processor, we keep all metadata files except the properties
+                metaInfIncludes = Collections.emptySet();
+                metaInfExcludes = Collections.singleton(Constants.META_DIR + "/" + Constants.PROPERTIES_XML);
+            } else {
+                
+                metaInfIncludes = new HashSet<>();
+                metaInfIncludes.add(Constants.META_DIR + "/");
+                metaInfIncludes.add(Constants.META_DIR + "/" + Constants.NODETYPES_CND);
+                metaInfIncludes.add(Constants.META_DIR + "/" + Constants.CONFIG_XML);
+                metaInfIncludes.add(Constants.META_DIR + "/" + Constants.FILTER_XML);
+                metaInfExcludes = Collections.emptySet();
+            }
+
+            try (Archive archive = src.getArchive()) {
+                archive.open(false);
+                addArchiveEntryToExporter(exporter, archive, "", archive.getRoot(), metaInfIncludes, metaInfExcludes);
+            }
+
             // write updated properties
             ByteArrayOutputStream tmpOut = new ByteArrayOutputStream();
             inf.getProperties().storeToXML(tmpOut, "FileVault Package Properties", "utf-8");
@@ -248,13 +245,32 @@ public class PackageManagerImpl implements PackageManager {
             if (tracker != null) {
                 tracker.track("A", Constants.META_DIR + "/" + Constants.PROPERTIES_XML);
             }
-    
+
             if (opts.getPostProcessor() != null) {
                 opts.getPostProcessor().process(exporter);
             }
         }
     }
 
+    private static void addArchiveEntryToExporter(AbstractExporter exporter, Archive archive, String parentPath, Archive.Entry entry, Set<String> metaInfIncludes, Set<String> metaInfExcludes) throws IOException {
+        String path = parentPath + entry.getName();
+        if (path.startsWith(Constants.META_INF + "/")) {
+            if ((!metaInfIncludes.isEmpty() && !metaInfIncludes.contains(path)) || metaInfExcludes.contains(path)) {
+                return;
+            }
+        }
+        if (entry.isDirectory()) {
+            exporter.createDirectory(path);
+            for (Archive.Entry child : entry.getChildren()) {
+                addArchiveEntryToExporter(exporter, archive, path.isEmpty() ? path : path + "/", child, metaInfIncludes, metaInfExcludes);
+            }
+        } else {
+            try (InputStream input = archive.openInputStream(entry)) {
+                exporter.writeFile(input, path);
+            }
+        }
+    }
+
     @Nullable
     PackageEventDispatcher getDispatcher() {
         return dispatcher;
diff --git a/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/PackageInstallIT.java b/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/PackageInstallIT.java
index 5e91a31..a6e2d1b 100644
--- a/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/PackageInstallIT.java
+++ b/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/PackageInstallIT.java
@@ -24,9 +24,11 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import java.io.File;
 import java.io.IOException;
 import java.security.Principal;
 import java.util.Collections;
+import java.util.Properties;
 
 import javax.jcr.NodeIterator;
 import javax.jcr.Property;
@@ -44,12 +46,15 @@ import org.apache.jackrabbit.api.security.user.UserManager;
 import org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
 import org.apache.jackrabbit.vault.fs.api.IdConflictPolicy;
 import org.apache.jackrabbit.vault.fs.config.ConfigurationException;
+import org.apache.jackrabbit.vault.fs.config.DefaultMetaInf;
 import org.apache.jackrabbit.vault.fs.io.ImportOptions;
 import org.apache.jackrabbit.vault.packaging.Dependency;
+import org.apache.jackrabbit.vault.packaging.ExportOptions;
 import org.apache.jackrabbit.vault.packaging.InstallContext;
 import org.apache.jackrabbit.vault.packaging.JcrPackage;
 import org.apache.jackrabbit.vault.packaging.PackageException;
 import org.apache.jackrabbit.vault.packaging.PackageId;
+import org.apache.jackrabbit.vault.packaging.VaultPackage;
 import org.apache.jackrabbit.vault.packaging.events.impl.PackageEventDispatcherImpl;
 import org.apache.jackrabbit.vault.packaging.impl.ActivityLog;
 import org.apache.jackrabbit.vault.packaging.impl.JcrPackageManagerImpl;
@@ -100,6 +105,25 @@ public class PackageInstallIT extends IntegrationTestBase {
     }
 
     /**
+     * Test if rewrap on a folder-based package works
+     */
+    @Test
+    public void testRewrapOnNonZipBasedArchive() throws RepositoryException, IOException, PackageException {
+        try (VaultPackage pack = loadVaultPackage("/test-packages/tmp.zip")) {
+            ExportOptions opts = new ExportOptions();
+            DefaultMetaInf meta = new DefaultMetaInf();
+            Properties props = new Properties();
+            props.setProperty(VaultPackage.NAME_GROUP, "jackrabbit/test");
+            props.setProperty(VaultPackage.NAME_NAME, "rewrapped-package");
+            meta.setProperties(props);
+            opts.setMetaInf(meta);
+            try (VaultPackage rewrappedPack = packMgr.rewrap(opts, pack, (File)null)) {
+                assertNotNull(rewrappedPack);
+            }
+        }
+    }
+
+    /**
      * Tests if unwrapping an already installed package preserves the status
      */
     @Test