You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2016/01/22 22:47:45 UTC

svn commit: r1726322 - in /jackrabbit/commons/filevault/trunk/vault-core/src: main/java/org/apache/jackrabbit/vault/packaging/ main/java/org/apache/jackrabbit/vault/packaging/impl/ test/java/org/apache/jackrabbit/vault/packaging/integration/

Author: tripod
Date: Fri Jan 22 21:47:44 2016
New Revision: 1726322

URL: http://svn.apache.org/viewvc?rev=1726322&view=rev
Log:
JCRVLT-89 JcrPackageImpl.uninstall() throws exception if snapshot is missing

Modified:
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/JcrPackage.java
    jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageImpl.java
    jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestPackageInstall.java

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/JcrPackage.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/JcrPackage.java?rev=1726322&r1=1726321&r2=1726322&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/JcrPackage.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/JcrPackage.java Fri Jan 22 21:47:44 2016
@@ -147,6 +147,7 @@ public interface JcrPackage extends Comp
      * @throws PackageException if an error during packaging occurs or if no
      *         snapshot is available.
      * @throws IllegalStateException if the package is not valid.
+     * @throws PackageException if no snapshot is present and {@link ImportOptions#isStrict()} is {@code true}.
      * @throws IOException if an I/O error occurs
      *
      * @since 2.3.14

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageImpl.java?rev=1726322&r1=1726321&r2=1726322&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageImpl.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageImpl.java Fri Jan 22 21:47:44 2016
@@ -606,43 +606,53 @@ public class JcrPackageImpl implements J
     public void uninstall(ImportOptions opts) throws RepositoryException, PackageException, IOException {
         JcrPackage snap = getSnapshot();
         if (snap == null) {
-            throw new PackageException("Unable to uninstall package. No snapshot present.");
-        }
-        if (opts.getListener() != null) {
-            opts.getListener().onMessage(ProgressTrackerListener.Mode.TEXT, "Uninstalling package from snapshot " + snap.getDefinition().getId(), "");
-        }
-        Session s = getNode().getSession();
-        // check for recursive uninstall
-        if (!opts.isNonRecursive()) {
-            Node defNode = snap.getDefNode();
-            LinkedList<PackageId> subPackages = new LinkedList<PackageId>();
-            if (defNode.hasProperty(JcrPackageDefinition.PN_SUB_PACKAGES)) {
-                Value[] subIds = defNode.getProperty(JcrPackageDefinition.PN_SUB_PACKAGES).getValues();
-                for (Value v: subIds) {
-                    // reverse installation order
-                    subPackages.addLast(PackageId.fromString(v.getString()));
-                }
+            if (opts.isStrict()) {
+                throw new PackageException("Unable to uninstall package. No snapshot present.");
             }
-            if (subPackages.size() > 0) {
-                JcrPackageManagerImpl packMgr = new JcrPackageManagerImpl(s);
-                for (PackageId id: subPackages) {
-                    JcrPackage pack = packMgr.open(id);
-                    if (pack != null) {
-                        if (pack.getSnapshot() == null) {
-                            log.warn("Unable to uninstall sub package {}. Snapshot missing.", id);
-                        } else {
-                            pack.uninstall(opts);
+            log.warn("Unable to revert package content {}. Snapshot missing.", getDefinition().getId());
+            if (opts.getListener() != null) {
+                opts.getListener().onMessage(ProgressTrackerListener.Mode.TEXT, "Unable to revert package content. Snapshot missing.", "");
+            }
+
+        } else {
+            Session s = getNode().getSession();
+            // check for recursive uninstall
+            if (!opts.isNonRecursive()) {
+                Node defNode = snap.getDefNode();
+                LinkedList<PackageId> subPackages = new LinkedList<PackageId>();
+                if (defNode.hasProperty(JcrPackageDefinition.PN_SUB_PACKAGES)) {
+                    Value[] subIds = defNode.getProperty(JcrPackageDefinition.PN_SUB_PACKAGES).getValues();
+                    for (Value v : subIds) {
+                        // reverse installation order
+                        subPackages.addLast(PackageId.fromString(v.getString()));
+                    }
+                }
+                if (subPackages.size() > 0) {
+                    JcrPackageManagerImpl packMgr = new JcrPackageManagerImpl(s);
+                    for (PackageId id : subPackages) {
+                        JcrPackage pack = packMgr.open(id);
+                        if (pack != null) {
+                            if (pack.getSnapshot() == null) {
+                                log.warn("Unable to uninstall sub package {}. Snapshot missing.", id);
+                            } else {
+                                pack.uninstall(opts);
+                            }
                         }
                     }
+
                 }
+            }
 
+            if (opts.getListener() != null) {
+                opts.getListener().onMessage(ProgressTrackerListener.Mode.TEXT, "Uninstalling package from snapshot " + snap.getDefinition().getId(), "");
             }
+            // override import mode
+            opts.setImportMode(ImportMode.REPLACE);
+            snap.extract(opts);
+            snap.getNode().remove();
+            s.save();
         }
-        // override import mode
-        opts.setImportMode(ImportMode.REPLACE);
-        snap.extract(opts);
-        snap.getNode().remove();
-        s.save();
+
         // revert installed flags on this package
         JcrPackageDefinitionImpl def = (JcrPackageDefinitionImpl) getDefinition();
         def.clearLastUnpacked(true);

Modified: jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestPackageInstall.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestPackageInstall.java?rev=1726322&r1=1726321&r2=1726322&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestPackageInstall.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestPackageInstall.java Fri Jan 22 21:47:44 2016
@@ -24,13 +24,13 @@ import javax.jcr.NodeIterator;
 import javax.jcr.RepositoryException;
 
 import org.apache.commons.io.FileUtils;
+import org.apache.derby.impl.load.Import;
 import org.apache.jackrabbit.vault.fs.io.ImportOptions;
 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.tika.io.IOUtils;
-import org.junit.Ignore;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
@@ -306,9 +306,74 @@ public class TestPackageInstall extends
         assertEquals("child order", "jcr:content,toolbar,products,services,company,events,support,community,blog,", names.toString());
     }
 
+    /**
+     * Installs a package that and checks if snapshot is created
+     */
+    @Test
+    public void testSnapshotExists() throws RepositoryException, IOException, PackageException {
+        JcrPackage pack = packMgr.upload(getStream("testpackages/tmp.zip"), false);
+        assertNotNull(pack);
+        pack.install(getDefaultOptions());
+
+        assertNodeExists("/etc/packages/my_packages/.snapshot/tmp.zip");
+        assertNodeExists("/tmp/foo/bar/tobi");
+    }
+
+    /**
+     * Installs and uninstalls a package that and checks if the content is reverted.
+     */
+    @Test
+    public void testUninstall() throws RepositoryException, IOException, PackageException {
+        JcrPackage pack = packMgr.upload(getStream("testpackages/tmp.zip"), false);
+        assertNotNull(pack);
+        pack.install(getDefaultOptions());
+        assertNodeExists("/tmp/foo/bar/tobi");
+
+        pack.uninstall(getDefaultOptions());
+        assertNodeMissing("/tmp/foo/bar/tobi");
+    }
+
+    /**
+     * Uninstalls a package that has no snapshot (JCRVLT-89)
+     */
+    @Test
+    public void testUninstallNoSnapshot() throws RepositoryException, IOException, PackageException {
+        JcrPackage pack = packMgr.upload(getStream("testpackages/tmp.zip"), false);
+        assertNotNull(pack);
+
+        // extract should not generate snapshots
+        pack.extract(getDefaultOptions());
+        assertNodeExists("/tmp/foo/bar/tobi");
+        assertNodeMissing("/etc/packages/my_packages/.snapshot/tmp.zip");
+
+        pack.uninstall(getDefaultOptions());
+        assertNodeExists("/tmp/foo/bar/tobi");
+    }
+
+    /**
+     * Checks if uninstalling a package in strict mode with no snapshot fails (JCRVLT-89).
+     */
+    @Test
+    public void testUninstallNoSnapshotStrict() throws RepositoryException, IOException, PackageException {
+        JcrPackage pack = packMgr.upload(getStream("testpackages/tmp.zip"), false);
+        assertNotNull(pack);
+
+        // extract should not generate snapshots
+        pack.extract(getDefaultOptions());
+        assertNodeExists("/tmp/foo/bar/tobi");
+        assertNodeMissing("/etc/packages/my_packages/.snapshot/tmp.zip");
+
+        ImportOptions opts = getDefaultOptions();
+        opts.setStrict(true);
+        try {
+            pack.uninstall(opts);
+            fail("uninstalling a package with no snapshot should fail in strict mode.");
+        } catch (PackageException e) {
+            // ok
+        }
+    }
+
     // todo: upload with version
-    // todo: install / uninstall
-    // todo: sub packages
     // todo: rename
 
 }
\ No newline at end of file