You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2021/02/26 16:46:35 UTC

[sling-org-apache-sling-feature-cpconverter] branch master updated: SLING-10173 : Potential collision with tmp dir if run in parallel

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

cziegeler pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-cpconverter.git


The following commit(s) were added to refs/heads/master by this push:
     new 0e97f05  SLING-10173 : Potential collision with tmp dir if run in parallel
0e97f05 is described below

commit 0e97f0583db86b5564c57500dcc3d97f3b269acb
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Fri Feb 26 17:45:39 2021 +0100

    SLING-10173 : Potential collision with tmp dir if run in parallel
---
 .../ContentPackage2FeatureModelConverter.java      |  25 +++-
 ...ntentPackage2FeatureModelConverterLauncher.java | 159 ++++++++++++++-------
 .../feature/cpconverter/cli/ShutDownHook.java      |  98 -------------
 .../handlers/AbstractContentPackageHandler.java    |   5 +-
 .../cpconverter/vltpkg/VaultPackageAssembler.java  |  39 +++--
 .../ContentPackage2FeatureModelConverterTest.java  |   2 +-
 .../vltpkg/VaultPackageAssemblerTest.java          |  42 +++---
 7 files changed, 174 insertions(+), 196 deletions(-)

diff --git a/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java b/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
index d9a3ef7..2485a7b 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java
@@ -21,6 +21,7 @@ import static org.apache.sling.feature.cpconverter.vltpkg.VaultPackageUtils.dete
 import static org.apache.sling.feature.cpconverter.vltpkg.VaultPackageUtils.getDependencies;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -33,6 +34,7 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.regex.Pattern;
 
+import org.apache.commons.io.FileUtils;
 import org.apache.jackrabbit.vault.fs.io.Archive;
 import org.apache.jackrabbit.vault.fs.io.Archive.Entry;
 import org.apache.jackrabbit.vault.packaging.CyclicDependencyException;
@@ -91,6 +93,8 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
 
     private boolean dropContent = false;
 
+    private final File tmpDirectory;
+
     public ContentPackage2FeatureModelConverter() {
         this(false);
     }
@@ -98,6 +102,7 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
     public ContentPackage2FeatureModelConverter(boolean strictValidation) {
         super(strictValidation);
         this.recollectorVaultPackageScanner = new RecollectorVaultPackageScanner(this, this.packageManager, strictValidation, subContentPackages);
+        this.tmpDirectory = new File(new File ( System.getProperty("java.io.tmpdir") ), "cp2fm-converter_" + System.currentTimeMillis());
     }
 
     public @NotNull ContentPackage2FeatureModelConverter setEntryHandlersManager(@Nullable EntryHandlersManager handlersManager) {
@@ -156,6 +161,22 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
         return this;
     }
 
+    public File getTempDirectory() {
+        return this.tmpDirectory;
+    }
+    
+    public void cleanup() {
+        if ( this.tmpDirectory.exists() ) {
+            logger.info( "Cleaning up tmp directory {}", this.tmpDirectory);
+
+            try {
+                FileUtils.deleteDirectory( this.tmpDirectory );
+            } catch (IOException e) {
+                logger.error( "Error Deleting {}", this.tmpDirectory );
+            }
+        }
+    }
+    
     public void convert(@NotNull File...contentPackages) throws Exception {
         requireNonNull(contentPackages , "Null content-package(s) can not be converted.");
         secondPass(firstPass(contentPackages));
@@ -201,7 +222,7 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
         for (VaultPackage vaultPackage : orderedContentPackages) {
             try {
                 emitter.startPackage(vaultPackage);
-                mainPackageAssembler = VaultPackageAssembler.create(vaultPackage);
+                mainPackageAssembler = VaultPackageAssembler.create(this.getTempDirectory(), vaultPackage);
                 assemblers.add(mainPackageAssembler);
 
                 ArtifactId mvnPackageId = toArtifactId(vaultPackage);
@@ -283,7 +304,7 @@ public class ContentPackage2FeatureModelConverter extends BaseVaultPackageScanne
 
         PackageId originalPackageId = vaultPackage.getId();
         ArtifactId mvnPackageId = toArtifactId(vaultPackage);
-        VaultPackageAssembler clonedPackage = VaultPackageAssembler.create(vaultPackage);
+        VaultPackageAssembler clonedPackage = VaultPackageAssembler.create(this.getTempDirectory(), vaultPackage);
 
         // Please note: THIS IS A HACK to meet the new requirement without drastically change the original design
         // temporary swap the main handler to collect stuff
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/cli/ContentPackage2FeatureModelConverterLauncher.java b/src/main/java/org/apache/sling/feature/cpconverter/cli/ContentPackage2FeatureModelConverterLauncher.java
index 94332af..34e7017 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/cli/ContentPackage2FeatureModelConverterLauncher.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/cli/ContentPackage2FeatureModelConverterLauncher.java
@@ -17,11 +17,15 @@
 package org.apache.sling.feature.cpconverter.cli;
 
 import java.io.File;
+import java.io.IOException;
+import java.util.Date;
+import java.util.Formatter;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.TimeZone;
 
+import org.apache.commons.io.FileUtils;
 import org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter;
 import org.apache.sling.feature.cpconverter.accesscontrol.DefaultAclManager;
 import org.apache.sling.feature.cpconverter.artifacts.DefaultArtifactsDeployer;
@@ -121,9 +125,7 @@ public final class ContentPackage2FeatureModelConverterLauncher implements Runna
         //output the current tmp directory
         logger.debug("Using tmp directory {}", System.getProperty("java.io.tmpdir"));
 
-        // Add the Shutdown Hook to the Java virtual machine
-        // in order to destroy all the allocated resources
-        Runtime.getRuntime().addShutdownHook(new ShutDownHook(logger));
+        final long start = System.currentTimeMillis();
 
         if (printVersion) {
             printVersion(logger);
@@ -132,64 +134,119 @@ public final class ContentPackage2FeatureModelConverterLauncher implements Runna
         logger.info(appName);
         logger.info("");
 
+        boolean exitWithError = false;
+
         try {
-            DefaultFeaturesManager featuresManager = new DefaultFeaturesManager(mergeConfigurations,
-                                                            bundlesStartOrder,
-                                                            featureModelsOutputDirectory,
-                                                            artifactIdOverride,
-                                                            fmPrefix,
-                                                            properties);
-            if (apiRegions != null)
-                featuresManager.setAPIRegions(apiRegions);
-
-            if (exportsToRegion != null)
-                featuresManager.setExportToAPIRegion(exportsToRegion);
-
-            Map<String, String> entryHandlerConfigsMap = new HashMap<>();
-            if (entryHandlerConfigs != null) {
-                for (String config : entryHandlerConfigs) {
-                    int idx = config.indexOf(':');
-                    if (idx != -1) {
-                        entryHandlerConfigsMap.put(config.substring(0, idx), config.substring(idx + 1));
+            try {
+                DefaultFeaturesManager featuresManager = new DefaultFeaturesManager(mergeConfigurations,
+                                                                bundlesStartOrder,
+                                                                featureModelsOutputDirectory,
+                                                                artifactIdOverride,
+                                                                fmPrefix,
+                                                                properties);
+                if (apiRegions != null)
+                    featuresManager.setAPIRegions(apiRegions);
+
+                if (exportsToRegion != null)
+                    featuresManager.setExportToAPIRegion(exportsToRegion);
+
+                Map<String, String> entryHandlerConfigsMap = new HashMap<>();
+                if (entryHandlerConfigs != null) {
+                    for (String config : entryHandlerConfigs) {
+                        int idx = config.indexOf(':');
+                        if (idx != -1) {
+                            entryHandlerConfigsMap.put(config.substring(0, idx), config.substring(idx + 1));
+                        }
                     }
                 }
-            }
-            ContentPackage2FeatureModelConverter converter = new ContentPackage2FeatureModelConverter(strictValidation)
-                                                             .setFeaturesManager(featuresManager)
-                                                             .setBundlesDeployer(new DefaultArtifactsDeployer(artifactsOutputDirectory))
-                                                             .setEntryHandlersManager(new DefaultEntryHandlersManager(entryHandlerConfigsMap))
-                                                             .setAclManager(new DefaultAclManager(enforcePrincipalBasedSupportedPath))
-                                                             .setEmitter(DefaultPackagesEventsEmitter.open(featureModelsOutputDirectory))
-                                                             .setFailOnMixedPackages(failOnMixedPackages)
-                                                             .setDropContent(true);
-
-            if (filteringPatterns != null && filteringPatterns.length > 0) {
-                RegexBasedResourceFilter filter = new RegexBasedResourceFilter();
-
-                for (String filteringPattern : filteringPatterns) {
-                    filter.addFilteringPattern(filteringPattern);
-                }
 
-                converter.setResourceFilter(filter);
-            }
+                ContentPackage2FeatureModelConverter converter = new ContentPackage2FeatureModelConverter(strictValidation)
+                                                                .setFeaturesManager(featuresManager)
+                                                                .setBundlesDeployer(new DefaultArtifactsDeployer(artifactsOutputDirectory))
+                                                                .setEntryHandlersManager(new DefaultEntryHandlersManager(entryHandlerConfigsMap))
+                                                                .setAclManager(new DefaultAclManager(enforcePrincipalBasedSupportedPath))
+                                                                .setEmitter(DefaultPackagesEventsEmitter.open(featureModelsOutputDirectory))
+                                                                .setFailOnMixedPackages(failOnMixedPackages)
+                                                                .setDropContent(true);
 
-            converter.convert(contentPackages);
+                try {
+                    if (filteringPatterns != null && filteringPatterns.length > 0) {
+                        RegexBasedResourceFilter filter = new RegexBasedResourceFilter();
 
-            logger.info( "+-----------------------------------------------------+" );
-            logger.info("{} SUCCESS", appName);
-        } catch (Throwable t) {
-            logger.info( "+-----------------------------------------------------+" );
-            logger.info("{} FAILURE", appName);
-            logger.info( "+-----------------------------------------------------+" );
+                        for (String filteringPattern : filteringPatterns) {
+                            filter.addFilteringPattern(filteringPattern);
+                        }
 
-            if (debug) {
-                logger.error("Unable to convert content-package {}:", contentPackages, t);
+                        converter.setResourceFilter(filter);
+                    }
+
+                    converter.convert(contentPackages);
+                } finally {
+                    converter.cleanup();
+                }
+
+                logger.info( "+-----------------------------------------------------+" );
+                logger.info("{} SUCCESS", appName);
+            } catch (Throwable t) {
+                logger.info( "+-----------------------------------------------------+" );
+                logger.info("{} FAILURE", appName);
+                logger.info( "+-----------------------------------------------------+" );
+
+                if (debug) {
+                    logger.error("Unable to convert content-package {}:", contentPackages, t);
+                } else {
+                    logger.error("Unable to convert content-package {}: {}", contentPackages, t.getMessage());
+                }
+
+                logger.info( "+-----------------------------------------------------+" );
+
+                exitWithError = true;
+            }
+        } finally {
+            // format the uptime string
+            Formatter uptimeFormatter = new Formatter();
+            uptimeFormatter.format("Total time:");
+    
+            long uptime = System.currentTimeMillis() - start;
+            if (uptime < 1000) {
+                uptimeFormatter.format(" %s millisecond%s", uptime, (uptime > 1 ? "s" : ""));
             } else {
-                logger.error("Unable to convert content-package {}: {}", contentPackages, t.getMessage());
+                long uptimeInSeconds = (uptime) / 1000;
+                final long hours = uptimeInSeconds / 3600;
+    
+                if (hours > 0) {
+                    uptimeFormatter.format(" %s hour%s", hours, (hours > 1 ? "s" : ""));
+                }
+    
+                uptimeInSeconds = uptimeInSeconds - (hours * 3600);
+                final long minutes = uptimeInSeconds / 60;
+    
+                if (minutes > 0) {
+                    uptimeFormatter.format(" %s minute%s", minutes, (minutes > 1 ? "s" : ""));
+                }
+    
+                uptimeInSeconds = uptimeInSeconds - (minutes * 60);
+    
+                if (uptimeInSeconds > 0) {
+                    uptimeFormatter.format(" %s second%s", uptimeInSeconds, (uptimeInSeconds > 1 ? "s" : ""));
+                }
             }
+            logger.info(uptimeFormatter.toString());
+    
+            uptimeFormatter.close();
+    
+            logger.info("Finished at: {}", new Date());
+    
+            final Runtime runtime = Runtime.getRuntime();
+            final int megaUnit = 1024 * 1024;
+    
+            logger.info("Final Memory: {}M/{}M",
+                        (runtime.totalMemory() - runtime.freeMemory()) / megaUnit,
+                        runtime.totalMemory() / megaUnit);
+            logger.info("+-----------------------------------------------------+");
+        }
 
-            logger.info( "+-----------------------------------------------------+" );
-
+        if ( exitWithError ) {
             System.exit(1);
         }
     }
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/cli/ShutDownHook.java b/src/main/java/org/apache/sling/feature/cpconverter/cli/ShutDownHook.java
deleted file mode 100644
index 3f60e14..0000000
--- a/src/main/java/org/apache/sling/feature/cpconverter/cli/ShutDownHook.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * 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.feature.cpconverter.cli;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Date;
-import java.util.Formatter;
-
-import org.apache.commons.io.FileUtils;
-import org.jetbrains.annotations.NotNull;
-import org.slf4j.Logger;
-
-final class ShutDownHook extends Thread {
-
-    private final long start = System.currentTimeMillis();
-
-    private final Logger logger;
-
-    public ShutDownHook(@NotNull Logger logger) {
-        this.logger = logger;
-    }
-
-    @Override
-    public void run() {
-
-        cleanUp();
-
-        // format the uptime string
-        Formatter uptimeFormatter = new Formatter();
-        uptimeFormatter.format("Total time:");
-
-        long uptime = System.currentTimeMillis() - start;
-        if (uptime < 1000) {
-            uptimeFormatter.format(" %s millisecond%s", uptime, (uptime > 1 ? "s" : ""));
-        } else {
-            long uptimeInSeconds = (uptime) / 1000;
-            final long hours = uptimeInSeconds / 3600;
-
-            if (hours > 0) {
-                uptimeFormatter.format(" %s hour%s", hours, (hours > 1 ? "s" : ""));
-            }
-
-            uptimeInSeconds = uptimeInSeconds - (hours * 3600);
-            final long minutes = uptimeInSeconds / 60;
-
-            if (minutes > 0) {
-                uptimeFormatter.format(" %s minute%s", minutes, (minutes > 1 ? "s" : ""));
-            }
-
-            uptimeInSeconds = uptimeInSeconds - (minutes * 60);
-
-            if (uptimeInSeconds > 0) {
-                uptimeFormatter.format(" %s second%s", uptimeInSeconds, (uptimeInSeconds > 1 ? "s" : ""));
-            }
-        }
-        logger.info(uptimeFormatter.toString());
-
-        uptimeFormatter.close();
-
-        logger.info("Finished at: {}", new Date());
-
-        final Runtime runtime = Runtime.getRuntime();
-        final int megaUnit = 1024 * 1024;
-
-        logger.info("Final Memory: {}M/{}M",
-                    (runtime.totalMemory() - runtime.freeMemory()) / megaUnit,
-                    runtime.totalMemory() / megaUnit);
-        logger.info("+-----------------------------------------------------+");
-    }
-
-    private void cleanUp(){
-        File tmpDir = new File ( System.getProperty("java.io.tmpdir") );
-        logger.info( "Cleaning up tmp directories {}, {}", tmpDir.getAbsolutePath() + "/sub-content-packages",
-                tmpDir.getAbsolutePath() + "/synthetic-content-packages" );
-
-        try {
-            FileUtils.deleteDirectory( new File (tmpDir, "synthetic-content-packages") );
-            FileUtils.deleteDirectory( new File(tmpDir, "sub-content-packages") );
-        } catch (IOException e) {
-            logger.error( "Error Deleting {}, {}", tmpDir + "sub-content-packages", tmpDir + "syntethic-content-packages" );
-        }
-    }
-}
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractContentPackageHandler.java b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractContentPackageHandler.java
index d0d2a50..efd8ebf 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractContentPackageHandler.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractContentPackageHandler.java
@@ -36,13 +36,10 @@ public abstract class AbstractContentPackageHandler extends AbstractRegexEntryHa
 
     private static final String SNAPSHOT_POSTFIX = "-SNAPSHOT";
 
-    private final File temporaryDir = new File(System.getProperty("java.io.tmpdir"), "sub-content-packages");
-
     private final Pattern EMBEDDED_PACKAGE_PATTERN = Pattern.compile("/jcr_root/apps/.+/install(?:\\\\.([^/]+))?/.+.zip");
     
     public AbstractContentPackageHandler() {
         super("/jcr_root/(?:etc/packages|apps/.+/install(?:\\.([^/]+))?)/.+.zip");
-        temporaryDir.mkdirs();
     }
 
     @Override
@@ -50,6 +47,8 @@ public abstract class AbstractContentPackageHandler extends AbstractRegexEntryHa
             throws Exception {
         logger.info("Processing sub-content package '{}'...", entry.getName());
 
+        final File temporaryDir = new File(converter.getTempDirectory(), "sub-content-packages");
+        temporaryDir.mkdirs();
         File temporaryContentPackage = new File(temporaryDir, entry.getName());
 
         if (entry.getName().contains(SNAPSHOT_POSTFIX) && temporaryContentPackage.exists()) {
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java
index 90d6457..4991088 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssembler.java
@@ -39,7 +39,6 @@ import java.util.regex.Pattern;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
-import org.apache.jackrabbit.vault.fs.api.ImportMode;
 import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
 import org.apache.jackrabbit.vault.fs.api.WorkspaceFilter;
 import org.apache.jackrabbit.vault.fs.config.DefaultWorkspaceFilter;
@@ -65,28 +64,17 @@ public class VaultPackageAssembler implements EntryHandler, FileFilter {
 
     private static final String[] INCLUDE_RESOURCES = { PACKAGE_DEFINITION_XML, CONFIG_XML, SETTINGS_XML };
 
-    private static final File TMP_DIR = new File(System.getProperty("java.io.tmpdir"), "synthetic-content-packages");
-
     private static final Pattern OSGI_BUNDLE_PATTERN = Pattern.compile("(jcr_root)?/apps/[^/]+/install(\\.([^/]+))?/.+\\.jar");
     
-    public static @NotNull VaultPackageAssembler create(@NotNull VaultPackage vaultPackage) {
-        return create(vaultPackage, Objects.requireNonNull(vaultPackage.getMetaInf().getFilter()));
-    }
-/*
-    public static @NotNull File createSynthetic(@NotNull VaultPackage vaultPackage) throws Exception {
-        DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter();
-        PathFilterSet filterSet = new PathFilterSet();
-        SyntheticPathFilter pathFilter = new SyntheticPathFilter();
-        filterSet.addExclude(pathFilter);
-        filterSet.setImportMode(ImportMode.MERGE);
-        filter.add(filterSet);
-        return create(vaultPackage, filter).createPackage();
+    public static @NotNull VaultPackageAssembler create(@NotNull File tempDir, @NotNull VaultPackage vaultPackage) {
+        return create(tempDir, vaultPackage, Objects.requireNonNull(vaultPackage.getMetaInf().getFilter()));
     }
-*/
-    private static @NotNull VaultPackageAssembler create(@NotNull VaultPackage vaultPackage, @NotNull WorkspaceFilter filter) {
+
+    private static @NotNull VaultPackageAssembler create(@NotNull File baseTempDir, @NotNull VaultPackage vaultPackage, @NotNull WorkspaceFilter filter) {
+        final File tempDir = new File(baseTempDir, "synthetic-content-packages_" + System.currentTimeMillis());
         PackageId packageId = vaultPackage.getId();
         String fileName = packageId.toString().replaceAll("/", "-").replaceAll(":", "-") + "-" + vaultPackage.getFile().getName();
-        File storingDirectory = new File(TMP_DIR, fileName + "-deflated");
+        File storingDirectory = new File(tempDir, fileName + "-deflated");
         if(storingDirectory.exists()) {
             try {
                 FileUtils.deleteDirectory(storingDirectory);
@@ -126,7 +114,7 @@ public class VaultPackageAssembler implements EntryHandler, FileFilter {
 
         Set<Dependency> dependencies = getDependencies(vaultPackage);
 
-        VaultPackageAssembler assembler = new VaultPackageAssembler(storingDirectory, properties, dependencies);
+        VaultPackageAssembler assembler = new VaultPackageAssembler(tempDir, storingDirectory, properties, dependencies);
         assembler.mergeFilters(filter);
         return assembler;
     }
@@ -139,6 +127,12 @@ public class VaultPackageAssembler implements EntryHandler, FileFilter {
 
     private final Properties properties;
 
+    private final File tmpDir;
+
+    File getTempDir() {
+        return this.tmpDir;
+    }
+
     @Override
     public boolean matches(@NotNull String path) {
         return true;
@@ -153,10 +147,11 @@ public class VaultPackageAssembler implements EntryHandler, FileFilter {
     /**
      * This class can not be instantiated from outside
      */
-    private VaultPackageAssembler(@NotNull File storingDirectory, @NotNull Properties properties, @NotNull Set<Dependency> dependencies) {
+    private VaultPackageAssembler(@NotNull File tempDir, @NotNull File storingDirectory, @NotNull Properties properties, @NotNull Set<Dependency> dependencies) {
         this.storingDirectory = storingDirectory;
         this.properties = properties;
         this.dependencies = dependencies;
+        this.tmpDir = tempDir;
     }
     
     public @NotNull Properties getPackageProperties() {
@@ -226,7 +221,7 @@ public class VaultPackageAssembler implements EntryHandler, FileFilter {
     }
 
     public @NotNull File createPackage() throws IOException {
-        return createPackage(TMP_DIR);
+        return createPackage(this.tmpDir);
     }
 
     public @NotNull File createPackage(@NotNull File outputDirectory) throws IOException {
@@ -267,7 +262,7 @@ public class VaultPackageAssembler implements EntryHandler, FileFilter {
         archiver.setIncludeEmptyDirs(true);
 
         String destFileName = storingDirectory.getName().substring(0, storingDirectory.getName().lastIndexOf('-'));
-        File destFile = new File(TMP_DIR, destFileName);
+        File destFile = new File(this.tmpDir, destFileName);
 
         archiver.setDestFile(destFile);
         archiver.addFileSet(new DefaultFileSet(storingDirectory));
diff --git a/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java b/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java
index 1cfa29d..90855ab 100644
--- a/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java
+++ b/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java
@@ -100,7 +100,7 @@ public class ContentPackage2FeatureModelConverterTest {
 
     @After
     public void tearDowd() {
-        converter = null;
+        converter.cleanup();
     }
 
     @Test
diff --git a/src/test/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssemblerTest.java b/src/test/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssemblerTest.java
index 0f82f1a..a757177 100644
--- a/src/test/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssemblerTest.java
+++ b/src/test/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssemblerTest.java
@@ -20,6 +20,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import java.io.File;
+import java.io.IOException;
 import java.net.URL;
 import java.util.Arrays;
 import java.util.Collection;
@@ -30,6 +31,7 @@ import org.apache.commons.io.FileUtils;
 import org.apache.jackrabbit.vault.packaging.PackageId;
 import org.apache.jackrabbit.vault.packaging.VaultPackage;
 import org.apache.jackrabbit.vault.packaging.impl.PackageManagerImpl;
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -39,24 +41,32 @@ import org.junit.runners.Parameterized.Parameters;
 @RunWith(Parameterized.class)
 public class VaultPackageAssemblerTest {
 
-    private static final File TMP_DIR = new File(System.getProperty("java.io.tmpdir"), "synthetic-content-packages");
-
     private File testDirectory;
 
-    private final VaultPackageAssembler assembler;
+    private VaultPackageAssembler assembler;
 
     private final String resourceLocation;
 
-    public VaultPackageAssemblerTest(String resourceLocation, VaultPackageAssembler assembler) {
+    public VaultPackageAssemblerTest(String resourceLocation) {
         this.resourceLocation = resourceLocation;
-        this.assembler = assembler;
     }
 
     @Before
-    public void setUp() {
-        testDirectory = new File(System.getProperty("java.io.tmpdir"), getClass().getName() + '_' + System.currentTimeMillis());
+    public void setUp() throws IOException {
+        URL resource = VaultPackageAssemblerTest.class.getResource("../test-content-package.zip");
+        File file = FileUtils.toFile(resource);
+ 
+        VaultPackage vaultPackage = new PackageManagerImpl().open(file);
+
+        this.testDirectory = new File(System.getProperty("java.io.tmpdir"), getClass().getName() + '_' + System.currentTimeMillis());
+        this.assembler = VaultPackageAssembler.create(testDirectory, vaultPackage);
     }
 
+    @After
+    public void tearDown() throws IOException {
+        FileUtils.deleteDirectory(this.testDirectory);
+    }
+    
     @Test
     public void matchAll() {
         assembler.matches(resourceLocation);
@@ -88,26 +98,20 @@ public class VaultPackageAssemblerTest {
         File file = FileUtils.toFile(resource);
         VaultPackage vaultPackage = new PackageManagerImpl().open(file);
 
-        VaultPackageAssembler assembler = VaultPackageAssembler.create(vaultPackage);
+        VaultPackageAssembler assembler = VaultPackageAssembler.create(testDirectory, vaultPackage);
         PackageId packageId = vaultPackage.getId();
         String fileName = packageId.toString().replaceAll("/", "-").replaceAll(":", "-") + "-" + vaultPackage.getFile().getName();
-        File storingDirectory = new File(TMP_DIR, fileName + "-deflated");
+        File storingDirectory = new File(assembler.getTempDir(), fileName + "-deflated");
         assertTrue("Storing Directory for Vault Package does not exist", storingDirectory.exists());
     }
 
     @Parameters
     public static Collection<Object[]> data() throws Exception {
-        URL resource = VaultPackageAssemblerTest.class.getResource("../test-content-package.zip");
-        File file = FileUtils.toFile(resource);
-        VaultPackage vaultPackage = new PackageManagerImpl().open(file);
-
-        VaultPackageAssembler assembler = VaultPackageAssembler.create(vaultPackage);
-
         return Arrays.asList(new Object[][] {
-            { null, assembler },
-            { "/jcr_root/.content.xml", assembler },
-            { "/jcr_root/asd/.content.xml", assembler },
-            { "/jcr_root/asd/public/license.txt", assembler }
+            { null },
+            { "/jcr_root/.content.xml" },
+            { "/jcr_root/asd/.content.xml" },
+            { "/jcr_root/asd/public/license.txt" }
         });
     }