This is an automated email from the ASF dual-hosted git repository. simonetripodi pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-cpconverter.git
commit 4acbf58e08c3592f6a92e2fc1b459167c2f89b1b Author: stripodi <[email protected]> AuthorDate: Thu Apr 11 17:47:39 2019 +0200 allow the tool generating Features and deplopying Artifacts in two different directories --- README.md | 26 ++++++++++------ .../ContentPackage2FeatureModelConverter.java | 35 +++++++++++++-------- .../cpconverter/DefaultBundlesDeployer.java | 4 +-- ...ntentPackage2FeatureModelConverterLauncher.java | 10 ++++-- .../ContentPackage2FeatureModelConverterTest.java | 36 ++++++++++++---------- .../cpconverter/DefaultBundlesDeployerTest.java | 1 - .../handlers/BundleEntryHandlerTest.java | 6 ++-- 7 files changed, 71 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index 3072730..2dd6c3f 100644 --- a/README.md +++ b/README.md @@ -205,7 +205,7 @@ bundles are collected in an _Apache Maven repository_ compliant directory, all o ``` $ tree bundles/ -bundles/ +artifacts/ └── org └── apache ├── felix @@ -265,8 +265,10 @@ new ContentPackage2FeatureModelConverter() .setMergeConfigurations(mergeConfigurations) // users can decide which is the bundles start order, declared in the generated Apache Sling Feature(s) .setBundlesStartOrder(bundlesStartOrder) - // a valid directory where the outputs will be generated (it will created, if not existing already) - .setOutputDirectory(outputDirectory) + // a valid directory where the artifacts will be deployed (it will created, if not existing already) + .setArtifactsOutputDirectory(outputDirectory) + // a valid directory where the Feature Models will be generated (it will created, if not existing already) + .setFeatureModelsOutputDirectory(sameOrDifferentOutputDirectory) // an existing and valid content-package file .convert(contentPackage); ``` @@ -348,9 +350,14 @@ once the package is decompressed, open the shell and type: ``` $ ./bin/cp2sf -h -Usage: cp2fm [-hmqsvX] [-b=<bundlesStartOrder>] -c=<contentPackage> - -o=<outputDirectory> [-f=<filteringPatterns>]... +Missing required options [--content-package=<contentPackage>, --artifacts-output-directory=<artifactsOutputDirectory>, --features-output-directory=<featureModelsOutputDirectory>] +Usage: cp2fm [-hmqsvX] -a=<artifactsOutputDirectory> [-b=<bundlesStartOrder>] + -c=<contentPackage> -o=<featureModelsOutputDirectory> + [-f=<filteringPatterns>]... Apache Sling Content Package to Sling Feature converter + -a, --artifacts-output-directory=<artifactsOutputDirectory> + The output directory where the artifacts will be + deployed. -b, --bundles-start-order=<bundlesStartOrder> The order to start detected bundles. -c, --content-package=<contentPackage> @@ -362,21 +369,22 @@ Apache Sling Content Package to Sling Feature converter -m, --merge-configurations Flag to mark OSGi configurations with same PID will be merged, the tool will fail otherwise. - -o, --output-directory=<outputDirectory> - The output directory where the Feature File and the - bundles will be deployed. + -o, --features-output-directory=<featureModelsOutputDirectory> + The output directory where the Feature File will be + generated. -q, --quiet Log errors only. -s, --strict-validation Flag to mark the content-package input file being strict validated. -v, --version Display version information. -X, --verbose Produce execution debug output. Copyright(c) 2019 The Apache Software Foundation. + ``` to see all the available options; a sample execution could look like: ``` -$ ./bin/cp2sf -v -b 20 -c /content-package-2-feature-model/src/test/resources/org/apache/sling/cp2fm/test-content-package.zip -o /tmp +$ ./bin/cp2sf -v -b 20 -c /content-package-2-feature-model/src/test/resources/org/apache/sling/cp2fm/test-content-package.zip -a /cache -o /tmp ``` Argument Files for Long Command Lines: 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 71ffa8e..e0e1c32 100644 --- a/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java +++ b/src/main/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverter.java @@ -84,7 +84,9 @@ public class ContentPackage2FeatureModelConverter { private int bundlesStartOrder = 0; - private File outputDirectory; + private File artifactsOutputDirectory; + + private File featureModelsOutputDirectory; private Feature targetFeature = null; @@ -113,13 +115,18 @@ public class ContentPackage2FeatureModelConverter { return this; } - public ContentPackage2FeatureModelConverter setOutputDirectory(File outputDirectory) { - this.outputDirectory = outputDirectory; + public ContentPackage2FeatureModelConverter setArtifactsOutputDirectory(File artifactsOutputDirectory) { + this.artifactsOutputDirectory = artifactsOutputDirectory; return this; } - public File getOutputDirectory() { - return outputDirectory; + public File getArtifactsOutputDirectory() { + return artifactsOutputDirectory; + } + + public ContentPackage2FeatureModelConverter setFeatureModelsOutputDirectory(File featureModelsOutputDirectory) { + this.featureModelsOutputDirectory = featureModelsOutputDirectory; + return this; } public Feature getTargetFeature() { @@ -166,20 +173,24 @@ public class ContentPackage2FeatureModelConverter { + " does not exist or it is not a valid file."); } - if (outputDirectory == null) { - throw new IllegalStateException("Null output directory not supported, it must be set before invoking the convert(File) method."); + if (artifactsOutputDirectory == null) { + throw new IllegalStateException("Null artifacts output directory not supported, it must be set before invoking the convert(File) method."); + } + + if (featureModelsOutputDirectory == null) { + throw new IllegalStateException("Null models output directory not supported, it must be set before invoking the convert(File) method."); } Iterator<BundlesDeployer> artifactDeployerLoader = ServiceLoader.load(BundlesDeployer.class).iterator(); if (!artifactDeployerLoader.hasNext()) { - artifactDeployer = new DefaultBundlesDeployer(outputDirectory); + artifactDeployer = new DefaultBundlesDeployer(artifactsOutputDirectory); } else { artifactDeployer = artifactDeployerLoader.next(); } - if (!outputDirectory.exists() && !outputDirectory.mkdirs()) { + if (!artifactsOutputDirectory.exists() && !artifactsOutputDirectory.mkdirs()) { throw new IllegalStateException("output directory " - + outputDirectory + + artifactsOutputDirectory + " does not exist and can not be created, please make sure current user '" + System.getProperty("user.name") + " has enough rights to write on the File System."); @@ -222,7 +233,7 @@ public class ContentPackage2FeatureModelConverter { // attach all unmatched resources as new content-package - File contentPackageArchive = mainPackageAssembler.createPackage(outputDirectory); + File contentPackageArchive = mainPackageAssembler.createPackage(artifactsOutputDirectory); // deploy the new zip content-package to the local mvn bundles dir @@ -308,7 +319,7 @@ public class ContentPackage2FeatureModelConverter { fileName.append(JSON_FILE_EXTENSION); - File targetFile = new File(outputDirectory, fileName.toString()); + File targetFile = new File(featureModelsOutputDirectory, fileName.toString()); logger.info("Conversion complete!", targetFile); logger.info("Writing resulting Feature File to '{}'...", targetFile); diff --git a/src/main/java/org/apache/sling/feature/cpconverter/DefaultBundlesDeployer.java b/src/main/java/org/apache/sling/feature/cpconverter/DefaultBundlesDeployer.java index 780aed8..7921074 100644 --- a/src/main/java/org/apache/sling/feature/cpconverter/DefaultBundlesDeployer.java +++ b/src/main/java/org/apache/sling/feature/cpconverter/DefaultBundlesDeployer.java @@ -29,14 +29,12 @@ import org.slf4j.LoggerFactory; public final class DefaultBundlesDeployer implements BundlesDeployer { - private static final String BUNDLES_RIRECTORY_NAME = "bundles"; - private final Logger logger = LoggerFactory.getLogger(getClass()); private final File artifactsDirectory; public DefaultBundlesDeployer(File outputDirectory) { - artifactsDirectory = new File(outputDirectory, BUNDLES_RIRECTORY_NAME); + artifactsDirectory = outputDirectory; if (!artifactsDirectory.exists()) { artifactsDirectory.mkdirs(); } 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 7aa7c50..cba9553 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 @@ -61,8 +61,11 @@ public final class ContentPackage2FeatureModelConverterLauncher implements Runna @Option(names = { "-f", "--filtering-patterns" }, description = "Regex based pattern(s) to reject content-package archive entries.", required = false) private String[] filteringPatterns; - @Option(names = { "-o", "--output-directory" }, description = "The output directory where the Feature File and the bundles will be deployed.", required = true) - private File outputDirectory; + @Option(names = { "-a", "--artifacts-output-directory" }, description = "The output directory where the artifacts will be deployed.", required = true) + private File artifactsOutputDirectory; + + @Option(names = { "-o", "--features-output-directory" }, description = "The output directory where the Feature File will be generated.", required = true) + private File featureModelsOutputDirectory; @Override public void run() { @@ -96,7 +99,8 @@ public final class ContentPackage2FeatureModelConverterLauncher implements Runna .setStrictValidation(strictValidation) .setMergeConfigurations(mergeConfigurations) .setBundlesStartOrder(bundlesStartOrder) - .setOutputDirectory(outputDirectory); + .setArtifactsOutputDirectory(artifactsOutputDirectory) + .setFeatureModelsOutputDirectory(featureModelsOutputDirectory); if (filteringPatterns != null && filteringPatterns.length > 0) { for (String filteringPattern : filteringPatterns) { 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 3c16634..6db646b 100644 --- a/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java +++ b/src/test/java/org/apache/sling/feature/cpconverter/ContentPackage2FeatureModelConverterTest.java @@ -121,7 +121,10 @@ public class ContentPackage2FeatureModelConverterTest { File outputDirectory = new File(System.getProperty("testDirectory"), getClass().getName() + '_' + System.currentTimeMillis()); - converter.setBundlesStartOrder(5).setOutputDirectory(outputDirectory).convert(packageFile); + converter.setBundlesStartOrder(5) + .setArtifactsOutputDirectory(outputDirectory) + .setFeatureModelsOutputDirectory(outputDirectory) + .convert(packageFile); verifyFeatureFile(outputDirectory, "asd.retail.all.json", @@ -142,7 +145,7 @@ public class ContentPackage2FeatureModelConverterTest { Arrays.asList("org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended-asd-retail"), Collections.emptyList()); - ZipFile zipFile = new ZipFile(new File(outputDirectory, "bundles/asd/sample/asd.retail.all/0.0.1/asd.retail.all-0.0.1-cp2fm-converted-feature.zip")); + ZipFile zipFile = new ZipFile(new File(outputDirectory, "asd/sample/asd.retail.all/0.0.1/asd.retail.all-0.0.1-cp2fm-converted-feature.zip")); for (String expectedEntry : new String[] { "jcr_root/content/asd/.content.xml", "jcr_root/content/asd/resources.xml", @@ -164,7 +167,7 @@ public class ContentPackage2FeatureModelConverterTest { private void verifyFeatureFile(File outputDirectory, String name, String expectedArtifactId, - List<String> expectedBundles, + List<String> expectedArtifacts, List<String> expectedConfigurations, List<String> expectedContentPackagesExtensions) throws Exception { File featureFile = new File(outputDirectory, name); @@ -175,9 +178,9 @@ public class ContentPackage2FeatureModelConverterTest { assertEquals(expectedArtifactId, feature.getId().toMvnId()); - for (String expectedBundle : expectedBundles) { - assertTrue(expectedBundle + " not found in Feature " + expectedArtifactId, feature.getBundles().containsExact(ArtifactId.fromMvnId(expectedBundle))); - verifyInstalledBundle(outputDirectory, expectedBundle); + for (String expectedArtifact : expectedArtifacts) { + assertTrue(expectedArtifact + " not found in Feature " + expectedArtifactId, feature.getBundles().containsExact(ArtifactId.fromMvnId(expectedArtifact))); + verifyInstalledArtifact(outputDirectory, expectedArtifact); } for (String expectedConfiguration : expectedConfigurations) { @@ -187,23 +190,21 @@ public class ContentPackage2FeatureModelConverterTest { for (String expectedContentPackagesExtension : expectedContentPackagesExtensions) { assertTrue(expectedContentPackagesExtension + " not found in Feature " + expectedArtifactId, feature.getExtensions().getByName("content-packages").getArtifacts().containsExact(ArtifactId.fromMvnId(expectedContentPackagesExtension))); - verifyInstalledBundle(outputDirectory, expectedContentPackagesExtension); + verifyInstalledArtifact(outputDirectory, expectedContentPackagesExtension); } } } - private void verifyInstalledBundle(File outputDirectory, String coordinates) { + private void verifyInstalledArtifact(File outputDirectory, String coordinates) { ArtifactId bundleId = ArtifactId.fromMvnId(coordinates); - File bundleDirectory = new File(outputDirectory, "bundles"); - StringTokenizer tokenizer = new StringTokenizer(bundleId.getGroupId(), "."); while (tokenizer.hasMoreTokens()) { - bundleDirectory = new File(bundleDirectory, tokenizer.nextToken()); + outputDirectory = new File(outputDirectory, tokenizer.nextToken()); } - bundleDirectory = new File(bundleDirectory, bundleId.getArtifactId()); - bundleDirectory = new File(bundleDirectory, bundleId.getVersion()); + outputDirectory = new File(outputDirectory, bundleId.getArtifactId()); + outputDirectory = new File(outputDirectory, bundleId.getVersion()); StringBuilder bundleFileName = new StringBuilder() .append(bundleId.getArtifactId()) @@ -214,10 +215,10 @@ public class ContentPackage2FeatureModelConverterTest { } bundleFileName.append('.').append(bundleId.getType()); - File bundleFile = new File(bundleDirectory, bundleFileName.toString()); + File bundleFile = new File(outputDirectory, bundleFileName.toString()); assertTrue("Bundle " + bundleFile + " does not exist", bundleFile.exists()); - File pomFile = new File(bundleDirectory, String.format("%s-%s.pom", bundleId.getArtifactId(), bundleId.getVersion())); + File pomFile = new File(outputDirectory, String.format("%s-%s.pom", bundleId.getArtifactId(), bundleId.getVersion())); assertTrue("POM file " + pomFile + " does not exist", pomFile.exists()); } @@ -230,7 +231,10 @@ public class ContentPackage2FeatureModelConverterTest { File outputDirectory = new File(System.getProperty("testDirectory"), getClass().getName() + '_' + System.currentTimeMillis()); - converter.setBundlesStartOrder(5).setOutputDirectory(outputDirectory).convert(packageFile); + converter.setBundlesStartOrder(5) + .setArtifactsOutputDirectory(outputDirectory) + .setFeatureModelsOutputDirectory(outputDirectory) + .convert(packageFile); } } diff --git a/src/test/java/org/apache/sling/feature/cpconverter/DefaultBundlesDeployerTest.java b/src/test/java/org/apache/sling/feature/cpconverter/DefaultBundlesDeployerTest.java index 1fe0429..477f02b 100644 --- a/src/test/java/org/apache/sling/feature/cpconverter/DefaultBundlesDeployerTest.java +++ b/src/test/java/org/apache/sling/feature/cpconverter/DefaultBundlesDeployerTest.java @@ -49,7 +49,6 @@ public class DefaultBundlesDeployerTest { assertNotNull(bundlesDirectory); assertTrue(bundlesDirectory.exists()); assertTrue(bundlesDirectory.isDirectory()); - assertEquals("bundles", bundlesDirectory.getName()); } @Test(expected = NullPointerException.class) diff --git a/src/test/java/org/apache/sling/feature/cpconverter/handlers/BundleEntryHandlerTest.java b/src/test/java/org/apache/sling/feature/cpconverter/handlers/BundleEntryHandlerTest.java index 8753d61..b6db188 100644 --- a/src/test/java/org/apache/sling/feature/cpconverter/handlers/BundleEntryHandlerTest.java +++ b/src/test/java/org/apache/sling/feature/cpconverter/handlers/BundleEntryHandlerTest.java @@ -84,7 +84,7 @@ public final class BundleEntryHandlerTest { ContentPackage2FeatureModelConverter converter = spy(ContentPackage2FeatureModelConverter.class); File testDirectory = new File(System.getProperty("testDirectory"), getClass().getName() + '_' + System.currentTimeMillis()); - when(converter.getOutputDirectory()).thenReturn(testDirectory); + when(converter.getArtifactsOutputDirectory()).thenReturn(testDirectory); doCallRealMethod().when(converter).attach(anyString(), anyString(), anyString(), anyString(), anyString(), anyString()); when(converter.getArtifactDeployer()).thenReturn(new DefaultBundlesDeployer(testDirectory)); @@ -95,8 +95,8 @@ public final class BundleEntryHandlerTest { bundleEntryHandler.handle(bundleLocation, archive, entry, converter); - assertTrue(new File(testDirectory, "bundles/org/apache/felix/org.apache.felix.framework/6.0.1/org.apache.felix.framework-6.0.1.pom").exists()); - assertTrue(new File(testDirectory, "bundles/org/apache/felix/org.apache.felix.framework/6.0.1/org.apache.felix.framework-6.0.1.jar").exists()); + assertTrue(new File(testDirectory, "org/apache/felix/org.apache.felix.framework/6.0.1/org.apache.felix.framework-6.0.1.pom").exists()); + assertTrue(new File(testDirectory, "org/apache/felix/org.apache.felix.framework/6.0.1/org.apache.felix.framework-6.0.1.jar").exists()); assertFalse(converter.getTargetFeature().getBundles().isEmpty()); assertEquals(1, feature.getBundles().size());
