in vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/impl/JcrPackageImpl.java [991:1057]
private void uninstall(Set<PackageId> processed, ImportOptions opts) throws RepositoryException, PackageException, IOException {
getDefinition();
if (def != null) {
processed.add(def.getId());
}
if (opts.getDependencyHandling() != null && opts.getDependencyHandling() != DependencyHandling.IGNORE) {
uninstallUsages(processed, opts);
}
JcrPackage snap = getSnapshot();
List<PackageId> subPackages = snap == null
? def.getSubPackages()
: ((JcrPackageDefinitionImpl) snap.getDefinition()).getSubPackages();
if (snap == null) {
if (opts.isStrict(mgr.isStrictByDefault())) {
throw new PackageException("Unable to uninstall package. No snapshot present.");
}
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() && subPackages.size() > 0) {
JcrPackageManagerImpl packMgr = new JcrPackageManagerImpl(mgr);
for (PackageId id : subPackages) {
try (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();
}
// uninstallation always removes the sub-packages, unless non-recursive and snapshot missing
if (!opts.isNonRecursive() || snap != null) {
for (PackageId id : subPackages) {
if (mgr.contains(id)) {
mgr.remove(id);
}
}
}
// revert installed flags on this package
JcrPackageDefinitionImpl def = (JcrPackageDefinitionImpl) getDefinition();
def.clearLastUnpacked(true);
mgr.dispatch(PackageEvent.Type.UNINSTALL, def.getId(), null);
}