You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by mp...@apache.org on 2015/05/19 16:57:35 UTC
svn commit: r1680309 - in /sling/trunk/contrib/extensions/distribution:
core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/
core/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/
it/src/test/java/org/apache/sling/...
Author: mpetria
Date: Tue May 19 14:57:35 2015
New Revision: 1680309
URL: http://svn.apache.org/r1680309
Log:
SLING-4727: add customization options for temp folders in vlt package builders
Added:
sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionPackageExporterImporterTemporaryFoldersTest.java
sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impexp/
sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impexp/org.apache.sling.distribution.agent.impl.QueueDistributionAgentFactory-temp.json
sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impexp/org.apache.sling.distribution.packaging.impl.exporter.AgentDistributionPackageExporterFactory-temp.json
sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impexp/org.apache.sling.distribution.packaging.impl.importer.LocalDistributionPackageImporterFactory-temp.json
sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impexp/org.apache.sling.distribution.serialization.impl.vlt.VaultDistributionPackageBuilderFactory-tempvlt.json
sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/var/
sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/var/sling/
sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/var/sling/distribution/
sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/var/sling/distribution/jcrpackages.json
sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/var/sling/distribution/packages.json
Modified:
sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackage.java
sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilder.java
sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/JcrVaultDistributionPackage.java
sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/JcrVaultDistributionPackageBuilder.java
sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java
sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VltUtils.java
sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilderTest.java
sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionIntegrationTestBase.java
sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionUtils.java
sling/trunk/contrib/extensions/distribution/sample/pom.xml
sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install/org.apache.sling.distribution.serialization.impl.vlt.VaultDistributionPackageBuilderFactory-vlt.json
Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackage.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackage.java?rev=1680309&r1=1680308&r2=1680309&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackage.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackage.java Tue May 19 14:57:35 2015
@@ -75,13 +75,7 @@ public class FileVaultDistributionPackag
public void delete() {
try {
- File file = pkg.getFile();
-
- close();
-
- if (file.exists()) {
- file.delete();
- }
+ VltUtils.deletePackage(pkg);
} catch (Throwable e) {
log.error("cannot delete file", e);
}
Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilder.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilder.java?rev=1680309&r1=1680308&r2=1680309&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilder.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilder.java Tue May 19 14:57:35 2015
@@ -65,19 +65,27 @@ public class FileVaultDistributionPackag
private AccessControlHandling aclHandling;
private final String[] packageRoots;
+ private final File tempDirectory;
- public FileVaultDistributionPackageBuilder(String type, Packaging packaging, ImportMode importMode, AccessControlHandling aclHandling, String[] packageRoots) {
+ public FileVaultDistributionPackageBuilder(String type, Packaging packaging, ImportMode importMode, AccessControlHandling aclHandling, String[] packageRoots, String tempFilesFolder) {
super(type);
this.packaging = packaging;
this.importMode = importMode;
this.aclHandling = aclHandling;
this.packageRoots = packageRoots;
+
+
+
+ tempDirectory = VltUtils.getTempFolder(tempFilesFolder);
+
+ log.info("using temp directory {}", tempDirectory == null ? tempDirectory : tempDirectory.getPath());
}
@Override
protected DistributionPackage createPackageForAdd(@Nonnull ResourceResolver resourceResolver, @Nonnull DistributionRequest request)
throws DistributionPackageBuildingException {
Session session = null;
+ VaultPackage vaultPackage = null;
try {
session = getSession(resourceResolver);
@@ -88,10 +96,11 @@ public class FileVaultDistributionPackag
ExportOptions opts = VltUtils.getExportOptions(filter, packageRoots, packageGroup, packageName, VERSION);
log.debug("assembling package {}", packageGroup + '/' + packageName + "-" + VERSION);
- File tmpFile = File.createTempFile("rp-vlt-create-" + System.nanoTime(), ".zip");
- VaultPackage vaultPackage = packaging.getPackageManager().assemble(session, opts, tmpFile);
+
+ vaultPackage = VltUtils.createPackage(packaging.getPackageManager(), session, opts, tempDirectory);
return new FileVaultDistributionPackage(getType(), vaultPackage);
} catch (Exception e) {
+ VltUtils.deletePackage(vaultPackage);
throw new DistributionPackageBuildingException(e);
} finally {
ungetSession(session);
@@ -102,25 +111,16 @@ public class FileVaultDistributionPackag
protected DistributionPackage readPackageInternal(@Nonnull ResourceResolver resourceResolver, @Nonnull final InputStream stream)
throws DistributionPackageReadingException {
log.debug("reading a stream");
- DistributionPackage pkg = null;
+ VaultPackage vaultPackage = null;
try {
- File tmpFile = File.createTempFile("rp-vlt-read-" + System.nanoTime(), ".zip");
- FileOutputStream fileStream = new FileOutputStream(tmpFile);
- IOUtils.copy(stream, fileStream);
- IOUtils.closeQuietly(fileStream);
-
- VaultPackage vaultPackage = packaging.getPackageManager().open(tmpFile);
-
- if (vaultPackage != null) {
- pkg = new FileVaultDistributionPackage(getType(), vaultPackage);
- } else {
- log.warn("stream could not be read as a vlt package");
- }
+ vaultPackage = VltUtils.readPackage(packaging.getPackageManager(), stream, tempDirectory);
+
+ return new FileVaultDistributionPackage(getType(), vaultPackage);
} catch (Exception e) {
- throw new DistributionPackageReadingException("could not read / install the package", e);
+ VltUtils.deletePackage(vaultPackage);
+ throw new DistributionPackageReadingException("could not read package", e);
}
- return pkg;
}
@@ -157,13 +157,11 @@ public class FileVaultDistributionPackag
return true;
}
} catch (Exception e) {
- log.error("could not read / install the package", e);
+ log.error("could not install the package", e);
throw new DistributionPackageReadingException(e);
} finally {
ungetSession(session);
}
return false;
}
-
-
}
Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/JcrVaultDistributionPackage.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/JcrVaultDistributionPackage.java?rev=1680309&r1=1680308&r2=1680309&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/JcrVaultDistributionPackage.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/JcrVaultDistributionPackage.java Tue May 19 14:57:35 2015
@@ -92,11 +92,7 @@ public class JcrVaultDistributionPackage
public void delete() {
try {
- Node node = jcrPackage.getNode();
-
- close();
-
- node.remove();
+ VltUtils.deletePackage(jcrPackage);
session.save();
} catch (Throwable e) {
log.error("Cannot delete package", e);
Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/JcrVaultDistributionPackageBuilder.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/JcrVaultDistributionPackageBuilder.java?rev=1680309&r1=1680308&r2=1680309&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/JcrVaultDistributionPackageBuilder.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/JcrVaultDistributionPackageBuilder.java Tue May 19 14:57:35 2015
@@ -19,24 +19,35 @@
package org.apache.sling.distribution.serialization.impl.vlt;
+import java.io.ByteArrayInputStream;
import java.io.File;
+import java.io.IOException;
import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Properties;
import java.util.UUID;
import javax.annotation.Nonnull;
+import javax.jcr.Node;
+import javax.jcr.Property;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.jackrabbit.commons.JcrUtils;
import org.apache.jackrabbit.vault.fs.api.ImportMode;
import org.apache.jackrabbit.vault.fs.api.WorkspaceFilter;
import org.apache.jackrabbit.vault.fs.io.AccessControlHandling;
import org.apache.jackrabbit.vault.fs.io.ImportOptions;
import org.apache.jackrabbit.vault.packaging.ExportOptions;
import org.apache.jackrabbit.vault.packaging.JcrPackage;
+import org.apache.jackrabbit.vault.packaging.JcrPackageDefinition;
import org.apache.jackrabbit.vault.packaging.JcrPackageManager;
import org.apache.jackrabbit.vault.packaging.PackageId;
import org.apache.jackrabbit.vault.packaging.Packaging;
import org.apache.jackrabbit.vault.packaging.VaultPackage;
+import org.apache.jackrabbit.vault.util.JcrConstants;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.distribution.DistributionRequest;
import org.apache.sling.distribution.packaging.DistributionPackage;
@@ -64,8 +75,10 @@ public class JcrVaultDistributionPackage
private ImportMode importMode;
private AccessControlHandling aclHandling;
private final String[] packageRoots;
+ private final String tempPackagesNode;
+ private final File tempDirectory;
- public JcrVaultDistributionPackageBuilder(String type, Packaging packaging, ImportMode importMode, AccessControlHandling aclHandling, String[] packageRoots) {
+ public JcrVaultDistributionPackageBuilder(String type, Packaging packaging, ImportMode importMode, AccessControlHandling aclHandling, String[] packageRoots, String tempFilesFolder, String tempPackagesNode) {
super(type);
this.packaging = packaging;
@@ -73,11 +86,17 @@ public class JcrVaultDistributionPackage
this.importMode = importMode;
this.aclHandling = aclHandling;
this.packageRoots = packageRoots;
+ this.tempPackagesNode = tempPackagesNode;
+
+ this.tempDirectory = VltUtils.getTempFolder(tempFilesFolder);
}
@Override
protected DistributionPackage createPackageForAdd(@Nonnull ResourceResolver resourceResolver, @Nonnull DistributionRequest request) throws DistributionPackageBuildingException {
Session session = null;
+ VaultPackage vaultPackage = null;
+ JcrPackage jcrPackage = null;
+
try {
session = getSession(resourceResolver);
@@ -89,34 +108,39 @@ public class JcrVaultDistributionPackage
log.debug("assembling package {}", packageGroup + '/' + packageName + "-" + VERSION);
- VaultPackage vaultPackage = packaging.getPackageManager().assemble(session, opts, (File) null);
+ vaultPackage = VltUtils.createPackage(packaging.getPackageManager(), session, opts, tempDirectory);
- JcrPackageManager packageManager = packaging.getPackageManager(session);
- JcrPackage jcrPackage = packageManager.upload(vaultPackage.getFile(), true, true, null);
- vaultPackage.close();
+ jcrPackage = uploadPackage(session, vaultPackage);
return new JcrVaultDistributionPackage(getType(), jcrPackage, session);
} catch (Exception e) {
+ VltUtils.deletePackage(jcrPackage);
throw new DistributionPackageBuildingException(e);
} finally {
ungetSession(session);
+ VltUtils.deletePackage(vaultPackage);
}
}
@Override
protected DistributionPackage readPackageInternal(@Nonnull ResourceResolver resourceResolver, @Nonnull InputStream stream) throws DistributionPackageReadingException {
Session session = null;
+ VaultPackage vaultPackage = null;
+ JcrPackage jcrPackage = null;
+
try {
session = getSession(resourceResolver);
- JcrPackageManager packageManager = packaging.getPackageManager(session);
+ vaultPackage = VltUtils.readPackage(packaging.getPackageManager(), stream, tempDirectory);
- JcrPackage jcrPackage = packageManager.upload(stream, true);
+ jcrPackage = uploadPackage(session, vaultPackage);
return new JcrVaultDistributionPackage(getType(), jcrPackage, session);
} catch (Exception e) {
+ VltUtils.deletePackage(jcrPackage);
throw new DistributionPackageReadingException(e);
} finally {
ungetSession(session);
+ VltUtils.deletePackage(vaultPackage);
}
}
@@ -125,12 +149,9 @@ public class JcrVaultDistributionPackage
Session session = null;
try {
session = getSession(resourceResolver);
- JcrPackageManager packageManager = packaging.getPackageManager(session);
-
-
String packageName = distributionPackage.getId();
- JcrPackage jcrPackage = packageManager.open(new PackageId(PACKAGE_GROUP, packageName, VERSION));
+ JcrPackage jcrPackage = openPackage(session, packageName);
ImportOptions importOptions = VltUtils.getImportOptions(aclHandling, importMode);
jcrPackage.extract(importOptions);
@@ -148,14 +169,10 @@ public class JcrVaultDistributionPackage
Session session = null;
try {
session = getSession(resourceResolver);
- JcrPackageManager packageManager = packaging.getPackageManager(session);
String packageName = id;
- JcrPackage jcrPackage = packageManager.open(new PackageId(PACKAGE_GROUP, packageName, VERSION));
+ JcrPackage jcrPackage = openPackage(session, packageName);
- if (jcrPackage == null) {
- return null;
- }
return new JcrVaultDistributionPackage(getType(), jcrPackage, session);
} catch (RepositoryException e) {
log.error("cannot ge package with id {}", id, e);
@@ -164,4 +181,67 @@ public class JcrVaultDistributionPackage
ungetSession(session);
}
}
+
+
+ private JcrPackage uploadPackage(Session session, VaultPackage pack) throws IOException, RepositoryException {
+ JcrPackageManager packageManager = packaging.getPackageManager(session);
+
+ Node packageRoot = getPackageRoot(session);
+ PackageId packageId = getPackageId(pack);
+
+ InputStream in = FileUtils.openInputStream(pack.getFile());
+ try {
+ if (packageRoot != null) {
+ JcrPackage jcrPackage = packageManager.create(packageRoot, packageId.getDownloadName());
+ Property data = jcrPackage.getData();
+ data.setValue(in);
+ JcrPackageDefinition def = jcrPackage.getDefinition();
+ def.unwrap(pack, true, false);
+
+ log.debug("package uploaded to {}", jcrPackage.getNode().getPath());
+
+ return jcrPackage;
+ } else {
+ JcrPackage jcrPackage = packageManager.upload(in, true);
+ return jcrPackage;
+ }
+ } finally {
+ IOUtils.closeQuietly(in);
+ }
+ }
+
+ private JcrPackage openPackage(Session session, String packageName) throws RepositoryException {
+ JcrPackageManager packageManager = packaging.getPackageManager(session);
+
+
+ Node packageRoot = getPackageRoot(session);
+ PackageId packageId = new PackageId(PACKAGE_GROUP, packageName, VERSION);
+
+ if (packageRoot != null) {
+ Node packageNode = packageRoot.getNode(packageId.getDownloadName());
+ JcrPackage jcrPackage = packageManager.open(packageNode);
+ return jcrPackage;
+ } else {
+ JcrPackage jcrPackage = packageManager.open(packageId);
+ return jcrPackage;
+ }
+ }
+
+ private PackageId getPackageId(VaultPackage vaultPackage) {
+ Properties props = vaultPackage.getMetaInf().getProperties();
+
+ String version = props.getProperty(VaultPackage.NAME_VERSION);
+ String group = props.getProperty(VaultPackage.NAME_GROUP);
+ String name = props.getProperty(VaultPackage.NAME_NAME);
+
+ return new PackageId(group, name, version);
+ }
+
+ private Node getPackageRoot(Session session) throws RepositoryException {
+ Node packageRoot = null;
+ if (tempPackagesNode != null && session.nodeExists(tempPackagesNode)) {
+ packageRoot = session.getNode(tempPackagesNode);
+ }
+ return packageRoot;
+ }
}
Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java?rev=1680309&r1=1680308&r2=1680309&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VaultDistributionPackageBuilderFactory.java Tue May 19 14:57:35 2015
@@ -89,11 +89,24 @@ public class VaultDistributionPackageBui
public static final String ACL_HANDLING = "aclHandling";
/**
- * ACL handling property for file vault package builder
+ * Package roots
*/
@Property(label = "Package Roots", description = "The package roots to be used for created packages. (this is useful for assembling packages with an user that cannot read above the package root)")
public static final String PACKAGE_ROOTS = "package.roots";
+
+ /**
+ * Temp file folder
+ */
+ @Property(label = "Temp Filesystem Folder", description = "The filesystem folder where the temporary files should be saved.")
+ public static final String TEMP_FS_FOLDER = "tempFsFolder";
+
+ /**
+ * Temp file folder
+ */
+ @Property(label = "Temp JCR Folder", description = "The jcr folder where the temporary files should be saved")
+ public static final String TEMP_JCR_FOLDER = "tempJcrFolder";
+
@Reference
private Packaging packaging;
@@ -108,6 +121,10 @@ public class VaultDistributionPackageBui
String importModeString = PropertiesUtil.toString(config.get(IMPORT_MODE), null);
String aclHandlingString = PropertiesUtil.toString(config.get(ACL_HANDLING), null);
String[] packageRoots = PropertiesUtil.toStringArray(config.get(PACKAGE_ROOTS), null);
+ String tempFsFolder = PropertiesUtil.toString(config.get(TEMP_FS_FOLDER), null);
+ String tempJcrFolder = PropertiesUtil.toString(config.get(TEMP_JCR_FOLDER), null);
+
+
packageRoots = SettingsUtils.removeEmptyEntries(packageRoots);
ImportMode importMode = null;
@@ -120,9 +137,9 @@ public class VaultDistributionPackageBui
aclHandling= AccessControlHandling.valueOf(aclHandlingString.trim());
}
if ("filevlt".equals(type)) {
- packageBuilder = new ResourceSharedDistributionPackageBuilder(new FileVaultDistributionPackageBuilder(name, packaging, importMode, aclHandling, packageRoots));
+ packageBuilder = new ResourceSharedDistributionPackageBuilder(new FileVaultDistributionPackageBuilder(name, packaging, importMode, aclHandling, packageRoots, tempFsFolder));
} else {
- packageBuilder = new ResourceSharedDistributionPackageBuilder(new JcrVaultDistributionPackageBuilder(name, packaging, importMode, aclHandling, packageRoots));
+ packageBuilder = new ResourceSharedDistributionPackageBuilder(new JcrVaultDistributionPackageBuilder(name, packaging, importMode, aclHandling, packageRoots, tempFsFolder, tempJcrFolder));
}
}
Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VltUtils.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VltUtils.java?rev=1680309&r1=1680308&r2=1680309&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VltUtils.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/serialization/impl/vlt/VltUtils.java Tue May 19 14:57:35 2015
@@ -21,6 +21,8 @@ package org.apache.sling.distribution.se
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
import org.apache.jackrabbit.util.Text;
import org.apache.jackrabbit.vault.fs.api.ImportMode;
import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
@@ -32,9 +34,19 @@ import org.apache.jackrabbit.vault.fs.fi
import org.apache.jackrabbit.vault.fs.io.AccessControlHandling;
import org.apache.jackrabbit.vault.fs.io.ImportOptions;
import org.apache.jackrabbit.vault.packaging.ExportOptions;
+import org.apache.jackrabbit.vault.packaging.JcrPackage;
+import org.apache.jackrabbit.vault.packaging.PackageManager;
+import org.apache.jackrabbit.vault.packaging.Packaging;
import org.apache.jackrabbit.vault.packaging.VaultPackage;
import org.apache.sling.distribution.DistributionRequest;
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.util.List;
import java.util.Properties;
@@ -163,4 +175,73 @@ public class VltUtils {
return opts;
}
+
+ public static VaultPackage createPackage(PackageManager packageManager, Session session, ExportOptions options, File tempFolder) throws IOException, RepositoryException {
+ File file = File.createTempFile("distr-vault-create-" + System.nanoTime(), ".zip", tempFolder);
+
+ try {
+ VaultPackage vaultPackage = packageManager.assemble(session, options, file);
+ return vaultPackage;
+ } catch (RepositoryException e) {
+ FileUtils.deleteQuietly(file);
+ throw e;
+ }
+ }
+
+ public static VaultPackage readPackage(PackageManager packageManager, InputStream stream, File tempFolder) throws IOException {
+ File file = File.createTempFile("distr-vault-read-" + System.nanoTime(), ".zip", tempFolder);
+ OutputStream out = FileUtils.openOutputStream(file);
+ try {
+ IOUtils.copy(stream, out);
+ return packageManager.open(file);
+ } catch (IOException e) {
+ FileUtils.deleteQuietly(file);
+ throw e;
+ } finally {
+ IOUtils.closeQuietly(stream);
+ IOUtils.closeQuietly(out);
+ }
+ }
+
+ public static void deletePackage(VaultPackage vaultPackage) {
+ if (vaultPackage == null) {
+ return;
+ }
+
+ File file = vaultPackage.getFile();
+ vaultPackage.close();
+
+ FileUtils.deleteQuietly(file);
+ }
+
+ public static void deletePackage(JcrPackage jcrPackage) {
+ if (jcrPackage == null) {
+ return;
+ }
+
+ Node node = jcrPackage.getNode();
+ jcrPackage.close();
+
+ try {
+ if (node != null) {
+ node.remove();
+ }
+ } catch (RepositoryException e) {
+ // do nothing
+ }
+ }
+
+ public static File getTempFolder(String tempFolderPath) {
+ File directory = null;
+ try {
+ directory = new File(tempFolderPath);
+ if (!directory.exists() || !directory.isDirectory()) {
+ directory = null;
+ }
+ } catch (Throwable e) {
+ directory = null;
+ }
+
+ return directory;
+ }
}
Modified: sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilderTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilderTest.java?rev=1680309&r1=1680308&r2=1680309&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilderTest.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/serialization/impl/vlt/FileVaultDistributionPackageBuilderTest.java Tue May 19 14:57:35 2015
@@ -76,7 +76,7 @@ public class FileVaultDistributionPackag
when(resourceResolver.adaptTo(Session.class)).thenReturn(session);
- FileVaultDistributionPackageBuilder fileVaultdistributionPackageBuilder = new FileVaultDistributionPackageBuilder("filevlt", packaging, null, null, null);
+ FileVaultDistributionPackageBuilder fileVaultdistributionPackageBuilder = new FileVaultDistributionPackageBuilder("filevlt", packaging, null, null, null, null);
DistributionRequest request = new SimpleDistributionRequest(DistributionRequestType.ADD, "/");
DistributionPackage distributionPackage = fileVaultdistributionPackageBuilder.createPackageForAdd(resourceResolver, request);
assertNotNull(distributionPackage);
@@ -88,12 +88,19 @@ public class FileVaultDistributionPackag
PackageManager packageManager = mock(PackageManager.class);
when(packaging.getPackageManager()).thenReturn(packageManager);
- FileVaultDistributionPackageBuilder fileVaultdistributionPackageBuilder = new FileVaultDistributionPackageBuilder("filevlt", packaging, null, null, null);
+ FileVaultDistributionPackageBuilder fileVaultdistributionPackageBuilder = new FileVaultDistributionPackageBuilder("filevlt", packaging, null, null, null, null);
ResourceResolver resourceResolver = mock(ResourceResolver.class);
InputStream stream = new ByteArrayInputStream("some binary".getBytes("UTF-8"));
- DistributionPackage distributionPackage = fileVaultdistributionPackageBuilder.readPackageInternal(resourceResolver, stream);
- assertNull(distributionPackage);
+
+ boolean throwsException = false;
+ try {
+ DistributionPackage distributionPackage = fileVaultdistributionPackageBuilder.readPackageInternal(resourceResolver, stream);
+ } catch (Exception e) {
+ throwsException = true;
+ }
+
+ assertTrue(throwsException);
}
@Test
@@ -102,7 +109,7 @@ public class FileVaultDistributionPackag
PackageManager packageManager = mock(PackageManager.class);
when(packaging.getPackageManager()).thenReturn(packageManager);
- FileVaultDistributionPackageBuilder fileVaultdistributionPackageBuilder = new FileVaultDistributionPackageBuilder("filevlt", packaging, null, null, null);
+ FileVaultDistributionPackageBuilder fileVaultdistributionPackageBuilder = new FileVaultDistributionPackageBuilder("filevlt", packaging, null, null, null, null);
ResourceResolver resourceResolver = mock(ResourceResolver.class);
String id = "some-id";
@@ -119,7 +126,7 @@ public class FileVaultDistributionPackag
when(packageManager.open(tempFile)).thenReturn(vaultPackage);
when(packaging.getPackageManager()).thenReturn(packageManager);
- FileVaultDistributionPackageBuilder fileVaultdistributionPackageBuilder = new FileVaultDistributionPackageBuilder("filevlt", packaging, null, null, null);
+ FileVaultDistributionPackageBuilder fileVaultdistributionPackageBuilder = new FileVaultDistributionPackageBuilder("filevlt", packaging, null, null, null, null);
ResourceResolver resourceResolver = mock(ResourceResolver.class);
Session session = mock(Session.class);
@@ -150,7 +157,7 @@ public class FileVaultDistributionPackag
when(packaging.getPackageManager()).thenReturn(packageManager);
FileVaultDistributionPackageBuilder fileVaultdistributionPackageBuilder = new FileVaultDistributionPackageBuilder("filevlt", packaging,
- ImportMode.MERGE, AccessControlHandling.MERGE, null);
+ ImportMode.MERGE, AccessControlHandling.MERGE, null, null);
ResourceResolver resourceResolver = mock(ResourceResolver.class);
Session session = mock(Session.class);
Modified: sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionIntegrationTestBase.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionIntegrationTestBase.java?rev=1680309&r1=1680308&r2=1680309&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionIntegrationTestBase.java (original)
+++ sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionIntegrationTestBase.java Tue May 19 14:57:35 2015
@@ -30,6 +30,7 @@ import org.junit.AfterClass;
import org.junit.BeforeClass;
import static org.apache.sling.distribution.it.DistributionUtils.agentUrl;
+import static org.apache.sling.distribution.it.DistributionUtils.assertEmptyFolder;
import static org.apache.sling.distribution.it.DistributionUtils.assertExists;
import static org.apache.sling.distribution.it.DistributionUtils.assertPostResourceWithParameters;
import static org.apache.sling.distribution.it.DistributionUtils.authorAgentConfigUrl;
@@ -113,23 +114,16 @@ public abstract class DistributionIntegr
@AfterClass
public static void checkNoPackagesLeft() throws IOException, JSONException {
- if (authorClient.exists("/var/sling/distribution/packages")) {
- JSONObject authorJson = getResource(author, "/var/sling/distribution/packages.1.json");
- Iterator<String> it = authorJson.keys();
- while (it.hasNext()) {
- String key = it.next();
- assertFalse(key.startsWith("distrpackage"));
- }
- }
- if (publishClient.exists("/var/sling/distribution/packages")) {
- JSONObject authorJson = getResource(publish, "/var/sling/distribution/packages.1.json");
- Iterator<String> it = authorJson.keys();
- while (it.hasNext()) {
- String key = it.next();
- assertFalse(key.startsWith("distrpackage"));
- }
- }
+
+ assertEmptyFolder(author, authorClient, "/var/sling/distribution/packages");
+ assertEmptyFolder(author, authorClient, "/etc/packages/sling/distribution");
+ assertEmptyFolder(author, authorClient, "/var/sling/distribution/jcrpackages");
+
+
+ assertEmptyFolder(publish, publishClient, "/var/sling/distribution/packages");
+ assertEmptyFolder(publish, publishClient, "/etc/packages/sling/distribution");
+ assertEmptyFolder(publish, publishClient, "/var/sling/distribution/jcrpackages");
}
Added: sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionPackageExporterImporterTemporaryFoldersTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionPackageExporterImporterTemporaryFoldersTest.java?rev=1680309&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionPackageExporterImporterTemporaryFoldersTest.java (added)
+++ sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionPackageExporterImporterTemporaryFoldersTest.java Tue May 19 14:57:35 2015
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.distribution.it;
+
+import org.apache.http.protocol.HTTP;
+import org.apache.sling.distribution.DistributionRequestType;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.apache.sling.distribution.it.DistributionUtils.assertExists;
+import static org.apache.sling.distribution.it.DistributionUtils.assertNotExists;
+import static org.apache.sling.distribution.it.DistributionUtils.createRandomNode;
+import static org.apache.sling.distribution.it.DistributionUtils.distribute;
+import static org.apache.sling.distribution.it.DistributionUtils.doExport;
+import static org.apache.sling.distribution.it.DistributionUtils.doImport;
+import static org.apache.sling.distribution.it.DistributionUtils.getChildrenForFolder;
+import static org.junit.Assert.assertEquals;
+
+public class DistributionPackageExporterImporterTemporaryFoldersTest extends DistributionIntegrationTestBase {
+
+
+
+ @Test
+ public void testAddExportImportTemp() throws Exception {
+
+ List<String> jcrPackages = getChildrenForFolder(publish, "/var/sling/distribution/jcrpackages");
+ assertEquals(0, jcrPackages.size());
+
+ String nodePath = createRandomNode(publishClient, "/content/export_" + System.nanoTime());
+ assertExists(publishClient, nodePath);
+
+ distribute(publish, "temp", DistributionRequestType.ADD, nodePath);
+
+ jcrPackages = getChildrenForFolder(publish, "/var/sling/distribution/jcrpackages");
+ assertEquals(1, jcrPackages.size());
+
+ publishClient.delete(nodePath);
+ assertNotExists(publishClient, nodePath);
+
+ String content = doExport(publish, "temp", DistributionRequestType.PULL);
+
+ jcrPackages = getChildrenForFolder(publish, "/var/sling/distribution/jcrpackages");
+ assertEquals(0, jcrPackages.size());
+
+ doImport(publish, "temp", content.getBytes(HTTP.DEFAULT_CONTENT_CHARSET));
+ assertExists(publishClient, nodePath);
+
+ }
+}
Modified: sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionUtils.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionUtils.java?rev=1680309&r1=1680308&r2=1680309&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionUtils.java (original)
+++ sling/trunk/contrib/extensions/distribution/it/src/test/java/org/apache/sling/distribution/it/DistributionUtils.java Tue May 19 14:57:35 2015
@@ -21,6 +21,7 @@ package org.apache.sling.distribution.it
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
import java.util.UUID;
@@ -269,4 +270,30 @@ public class DistributionUtils {
return triggerRootUrl() + "/" + triggerName + ".event";
}
+
+ public static void assertEmptyFolder(SlingInstance instance, SlingClient client, String path) throws IOException, JSONException {
+
+ if (client.exists(path)) {
+ List<String> children = getChildrenForFolder(instance, path);
+
+ assertEquals(0, children.size());
+ }
+
+ }
+
+
+ public static List<String> getChildrenForFolder(SlingInstance instance, String path) throws IOException, JSONException {
+ List<String> result = new ArrayList<String>();
+ JSONObject authorJson = getResource(instance, path + ".1.json");
+ Iterator<String> it = authorJson.keys();
+ while (it.hasNext()) {
+ String key = it.next();
+
+ if (!key.contains(":")) {
+ result.add(key);
+ }
+ }
+ return result;
+ }
+
}
Modified: sling/trunk/contrib/extensions/distribution/sample/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/sample/pom.xml?rev=1680309&r1=1680308&r2=1680309&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/sample/pom.xml (original)
+++ sling/trunk/contrib/extensions/distribution/sample/pom.xml Tue May 19 14:57:35 2015
@@ -67,7 +67,8 @@
<instructions>
<Bundle-SymbolicName>org.apache.sling.distribution.sample</Bundle-SymbolicName>
<Sling-Initial-Content>
- SLING-CONTENT/libs/sling/distribution;path:=/libs/sling/distribution;overwrite:=true
+ SLING-CONTENT/libs/sling/distribution;path:=/libs/sling/distribution;overwrite:=true,
+ SLING-CONTENT/var/sling/distribution;path:=/var/sling/distribution;overwrite:=true
</Sling-Initial-Content>
</instructions>
</configuration>
Added: sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impexp/org.apache.sling.distribution.agent.impl.QueueDistributionAgentFactory-temp.json
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impexp/org.apache.sling.distribution.agent.impl.QueueDistributionAgentFactory-temp.json?rev=1680309&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impexp/org.apache.sling.distribution.agent.impl.QueueDistributionAgentFactory-temp.json (added)
+++ sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impexp/org.apache.sling.distribution.agent.impl.QueueDistributionAgentFactory-temp.json Tue May 19 14:57:35 2015
@@ -0,0 +1,10 @@
+{
+ "jcr:primaryType": "sling:OsgiConfig",
+ "name": "temp",
+
+ "serviceName" : "distributionService",
+
+ "requestAuthorizationStrategy.target" : "(name=privilegeRead)",
+
+ "packageBuilder.target" : "(name=tempvlt)"
+}
\ No newline at end of file
Added: sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impexp/org.apache.sling.distribution.packaging.impl.exporter.AgentDistributionPackageExporterFactory-temp.json
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impexp/org.apache.sling.distribution.packaging.impl.exporter.AgentDistributionPackageExporterFactory-temp.json?rev=1680309&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impexp/org.apache.sling.distribution.packaging.impl.exporter.AgentDistributionPackageExporterFactory-temp.json (added)
+++ sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impexp/org.apache.sling.distribution.packaging.impl.exporter.AgentDistributionPackageExporterFactory-temp.json Tue May 19 14:57:35 2015
@@ -0,0 +1,6 @@
+{
+ "jcr:primaryType": "sling:OsgiConfig",
+ "name": "temp",
+
+ "agent.target": "(name=temp)"
+}
\ No newline at end of file
Added: sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impexp/org.apache.sling.distribution.packaging.impl.importer.LocalDistributionPackageImporterFactory-temp.json
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impexp/org.apache.sling.distribution.packaging.impl.importer.LocalDistributionPackageImporterFactory-temp.json?rev=1680309&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impexp/org.apache.sling.distribution.packaging.impl.importer.LocalDistributionPackageImporterFactory-temp.json (added)
+++ sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impexp/org.apache.sling.distribution.packaging.impl.importer.LocalDistributionPackageImporterFactory-temp.json Tue May 19 14:57:35 2015
@@ -0,0 +1,6 @@
+{
+ "jcr:primaryType": "sling:OsgiConfig",
+ "name": "temp",
+
+ "packageBuilder.target" : "(name=tempvlt)"
+}
\ No newline at end of file
Added: sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impexp/org.apache.sling.distribution.serialization.impl.vlt.VaultDistributionPackageBuilderFactory-tempvlt.json
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impexp/org.apache.sling.distribution.serialization.impl.vlt.VaultDistributionPackageBuilderFactory-tempvlt.json?rev=1680309&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impexp/org.apache.sling.distribution.serialization.impl.vlt.VaultDistributionPackageBuilderFactory-tempvlt.json (added)
+++ sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install.publish/impexp/org.apache.sling.distribution.serialization.impl.vlt.VaultDistributionPackageBuilderFactory-tempvlt.json Tue May 19 14:57:35 2015
@@ -0,0 +1,7 @@
+{
+ "jcr:primaryType": "sling:OsgiConfig",
+ "name": "tempvlt",
+ "type": "jcrvlt",
+ "tempJcrFolder" : "/var/sling/distribution/jcrpackages",
+ "tempFsFolder" : "/var/sling/distribution/packages"
+}
\ No newline at end of file
Modified: sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install/org.apache.sling.distribution.serialization.impl.vlt.VaultDistributionPackageBuilderFactory-vlt.json
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install/org.apache.sling.distribution.serialization.impl.vlt.VaultDistributionPackageBuilderFactory-vlt.json?rev=1680309&r1=1680308&r2=1680309&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install/org.apache.sling.distribution.serialization.impl.vlt.VaultDistributionPackageBuilderFactory-vlt.json (original)
+++ sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/libs/sling/distribution/install/org.apache.sling.distribution.serialization.impl.vlt.VaultDistributionPackageBuilderFactory-vlt.json Tue May 19 14:57:35 2015
@@ -1,5 +1,6 @@
{
"jcr:primaryType": "sling:OsgiConfig",
"name": "vlt",
- "type": "jcrvlt"
+ "type": "jcrvlt",
+ "tempFsFolder": "/Users/mpetria/work/temp"
}
\ No newline at end of file
Added: sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/var/sling/distribution/jcrpackages.json
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/var/sling/distribution/jcrpackages.json?rev=1680309&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/var/sling/distribution/jcrpackages.json (added)
+++ sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/var/sling/distribution/jcrpackages.json Tue May 19 14:57:35 2015
@@ -0,0 +1,3 @@
+{
+ "jcr:primaryType": "sling:Folder"
+}
\ No newline at end of file
Added: sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/var/sling/distribution/packages.json
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/var/sling/distribution/packages.json?rev=1680309&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/var/sling/distribution/packages.json (added)
+++ sling/trunk/contrib/extensions/distribution/sample/src/main/resources/SLING-CONTENT/var/sling/distribution/packages.json Tue May 19 14:57:35 2015
@@ -0,0 +1,3 @@
+{
+ "jcr:primaryType": "sling:Folder"
+}
\ No newline at end of file