This is an automated email from the ASF dual-hosted git repository. kwin pushed a commit to branch feature/recalculate-package-type in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-cpconverter.git
commit 7bf3d4ed8ebe84f798fc3214cf73ee38556b493b Author: Konrad Windszus <[email protected]> AuthorDate: Thu Mar 18 11:13:08 2021 +0100 SLING-10234 recalculate package type for converted packages --- .../cpconverter/vltpkg/VaultPackageAssembler.java | 72 ++++++++++++++++------ .../vltpkg/VaultPackageAssemblerTest.java | 2 +- .../VaultPackageAssemblerUnparameterizedTest.java | 53 ++++++++++++++++ .../cpconverter/immutable/jcr_root/apps/test.txt | 1 + .../cpconverter/mixed/jcr_root/apps/test.txt | 1 + .../cpconverter/mixed/jcr_root/content/test.txt | 1 + .../cpconverter/mutable/jcr_root/content/test.txt | 1 + 7 files changed, 110 insertions(+), 21 deletions(-) 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 a8ea4f8..58a1aa7 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 @@ -18,10 +18,7 @@ package org.apache.sling.feature.cpconverter.vltpkg; import static org.apache.jackrabbit.vault.util.Constants.FILTER_XML; import static org.apache.jackrabbit.vault.util.Constants.META_DIR; -import static org.apache.jackrabbit.vault.util.Constants.PACKAGE_DEFINITION_XML; -import static org.apache.jackrabbit.vault.util.Constants.CONFIG_XML; import static org.apache.jackrabbit.vault.util.Constants.PROPERTIES_XML; -import static org.apache.jackrabbit.vault.util.Constants.SETTINGS_XML; import static org.apache.jackrabbit.vault.util.Constants.ROOT_DIR; import static org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter.PACKAGE_CLASSIFIER; import static org.apache.sling.feature.cpconverter.vltpkg.VaultPackageUtils.getDependencies; @@ -39,12 +36,15 @@ import java.util.Map; import java.util.Objects; import java.util.Properties; import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Consumer; import java.util.function.Predicate; import java.util.regex.Pattern; import java.util.stream.Collectors; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; +import org.apache.commons.io.filefilter.DirectoryFileFilter; import org.apache.jackrabbit.vault.fs.api.PathFilterSet; import org.apache.jackrabbit.vault.fs.api.WorkspaceFilter; import org.apache.jackrabbit.vault.fs.config.DefaultWorkspaceFilter; @@ -53,6 +53,7 @@ import org.apache.jackrabbit.vault.fs.io.Archive.Entry; import org.apache.jackrabbit.vault.packaging.Dependency; import org.apache.jackrabbit.vault.packaging.PackageId; import org.apache.jackrabbit.vault.packaging.PackageProperties; +import org.apache.jackrabbit.vault.packaging.PackageType; import org.apache.jackrabbit.vault.packaging.VaultPackage; import org.apache.jackrabbit.vault.util.Constants; import org.apache.sling.feature.cpconverter.ContentPackage2FeatureModelConverter; @@ -65,7 +66,7 @@ import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class VaultPackageAssembler implements EntryHandler, FileFilter { +public class VaultPackageAssembler implements EntryHandler { private static final Pattern OSGI_BUNDLE_PATTERN = Pattern.compile("(jcr_root)?/apps/[^/]+/install(\\.([^/]+))?/.+\\.jar"); @@ -233,10 +234,6 @@ public class VaultPackageAssembler implements EntryHandler, FileFilter { } public @NotNull File createPackage() throws IOException { - return createPackage(this.tmpDir); - } - - public @NotNull File createPackage(@NotNull File outputDirectory) throws IOException { // generate the Vault properties XML file File metaDir = new File(storingDirectory, META_DIR); @@ -244,6 +241,18 @@ public class VaultPackageAssembler implements EntryHandler, FileFilter { throw new IOException("Could not create meta Dir: " + metaDir); } + final PackageType sourcePackageType; + final String sourcePackageTypeValue = (String)properties.get(PackageProperties.NAME_PACKAGE_TYPE); + if (sourcePackageTypeValue != null) { + sourcePackageType = PackageType.valueOf(sourcePackageTypeValue.toUpperCase()); + } else { + sourcePackageType = null; + } + PackageType newPackageType = recalculatePackageType(sourcePackageType, storingDirectory); + if (newPackageType != null) { + properties.setProperty(PackageProperties.NAME_PACKAGE_TYPE, newPackageType.name().toLowerCase()); + } + setDependencies(dependencies, properties); File xmlProperties = new File(metaDir, PROPERTIES_XML); @@ -252,8 +261,8 @@ public class VaultPackageAssembler implements EntryHandler, FileFilter { properties.storeToXML(fos, null); } - // generate the Vault filter XML file - computeFilters(outputDirectory); + // generate the Vault filter XML file based on new contents of the package + computeFilters(storingDirectory); File xmlFilter = new File(metaDir, FILTER_XML); try (InputStream input = filter.getSource(); FileOutputStream output = new FileOutputStream(xmlFilter)) { @@ -275,11 +284,31 @@ public class VaultPackageAssembler implements EntryHandler, FileFilter { return destFile; } - private void computeFilters(@NotNull File outputDirectory) { - File jcrRootDir = new File(outputDirectory, ROOT_DIR); + static @Nullable PackageType recalculatePackageType(PackageType sourcePackageType, @NotNull File outputDirectory) { + if (sourcePackageType != null && sourcePackageType != PackageType.MIXED) { + return null; + } + AtomicBoolean foundMutableFiles = new AtomicBoolean(); + AtomicBoolean foundImmutableFiles = new AtomicBoolean(); + forEachDirectoryBelowJcrRoot(outputDirectory, child -> { + if (child.getName().equals("apps") || child.getName().equals("libs")) { + foundImmutableFiles.weakCompareAndSet(false, true); + } else { + foundMutableFiles.weakCompareAndSet(false, true); + } + }); + if (foundImmutableFiles.get() && !foundMutableFiles.get()) { + return PackageType.APPLICATION; + } else if (!foundImmutableFiles.get() && foundMutableFiles.get()) { + return PackageType.CONTENT; + } else { + return PackageType.MIXED; + } + + } - if (jcrRootDir.exists() && jcrRootDir.isDirectory()) { - for (File child : jcrRootDir.listFiles(this)) { + private void computeFilters(@NotNull File outputDirectory) { + forEachDirectoryBelowJcrRoot(outputDirectory, child -> { TreeNode node = lowestCommonAncestor(new TreeNode(child)); File lowestCommonAncestor = node != null ? node.val : null; if (lowestCommonAncestor != null) { @@ -287,21 +316,24 @@ public class VaultPackageAssembler implements EntryHandler, FileFilter { filter.add(new PathFilterSet(root)); } + }); + } + + private static void forEachDirectoryBelowJcrRoot(File outputDirectory, Consumer<File> consumer) { + File jcrRootDir = new File(outputDirectory, ROOT_DIR); + if (jcrRootDir.exists() && jcrRootDir.isDirectory()) { + for (File child : jcrRootDir.listFiles((FileFilter)DirectoryFileFilter.INSTANCE)) { + consumer.accept(child); } } } - @Override - public boolean accept(@NotNull File pathname) { - return pathname.isDirectory(); - } - private @Nullable TreeNode lowestCommonAncestor(@NotNull TreeNode root) { int currMaxDepth = 0;//curr tree's deepest leaf depth int countMaxDepth = 0;//num of deepest leaves TreeNode node = null; - for (File child : root.val.listFiles(this)) { + for (File child : root.val.listFiles((FileFilter)DirectoryFileFilter.INSTANCE)) { TreeNode temp = lowestCommonAncestor(new TreeNode(child)); if (temp == null) { 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 c1726cf..1528fee 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 @@ -77,7 +77,7 @@ public class VaultPackageAssemblerTest { if (resourceLocation != null) { assembler.addEntry(resourceLocation, getClass().getResourceAsStream("../handlers" + resourceLocation)); } - File contentPackage = assembler.createPackage(testDirectory); + File contentPackage = assembler.createPackage(); ZipFile zipFile = new ZipFile(contentPackage); ZipEntry resourceEntry; diff --git a/src/test/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssemblerUnparameterizedTest.java b/src/test/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssemblerUnparameterizedTest.java new file mode 100644 index 0000000..268a933 --- /dev/null +++ b/src/test/java/org/apache/sling/feature/cpconverter/vltpkg/VaultPackageAssemblerUnparameterizedTest.java @@ -0,0 +1,53 @@ +/* + * 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.vltpkg; + +import java.io.File; +import java.net.URL; + +import org.apache.commons.io.FileUtils; +import org.apache.jackrabbit.vault.packaging.PackageType; +import org.junit.Assert; +import org.junit.Test; + +public class VaultPackageAssemblerUnparameterizedTest { + + @Test + public void testRecalculatePackageType() { + URL resource = VaultPackageAssemblerTest.class.getResource("../immutable"); + File immutableInput = FileUtils.toFile(resource); + resource = VaultPackageAssemblerTest.class.getResource("../mutable"); + File mutableInput = FileUtils.toFile(resource); + resource = VaultPackageAssemblerTest.class.getResource("../mixed"); + File mixedInput = FileUtils.toFile(resource); + + Assert.assertEquals(null, VaultPackageAssembler.recalculatePackageType(PackageType.APPLICATION, immutableInput)); + Assert.assertEquals(null, VaultPackageAssembler.recalculatePackageType(PackageType.CONTENT, immutableInput)); + Assert.assertEquals(PackageType.APPLICATION, VaultPackageAssembler.recalculatePackageType(PackageType.MIXED, immutableInput)); + Assert.assertEquals(PackageType.APPLICATION, VaultPackageAssembler.recalculatePackageType(null, immutableInput)); + + Assert.assertEquals(null, VaultPackageAssembler.recalculatePackageType(PackageType.APPLICATION, mutableInput)); + Assert.assertEquals(null, VaultPackageAssembler.recalculatePackageType(PackageType.CONTENT, mutableInput)); + Assert.assertEquals(PackageType.CONTENT, VaultPackageAssembler.recalculatePackageType(PackageType.MIXED, mutableInput)); + Assert.assertEquals(PackageType.CONTENT, VaultPackageAssembler.recalculatePackageType(null, mutableInput)); + + Assert.assertEquals(null, VaultPackageAssembler.recalculatePackageType(PackageType.APPLICATION, mixedInput)); + Assert.assertEquals(null, VaultPackageAssembler.recalculatePackageType(PackageType.CONTENT, mixedInput)); + Assert.assertEquals(PackageType.MIXED, VaultPackageAssembler.recalculatePackageType(PackageType.MIXED, mixedInput)); + Assert.assertEquals(PackageType.MIXED, VaultPackageAssembler.recalculatePackageType(null, mixedInput)); + } +} diff --git a/src/test/resources/org/apache/sling/feature/cpconverter/immutable/jcr_root/apps/test.txt b/src/test/resources/org/apache/sling/feature/cpconverter/immutable/jcr_root/apps/test.txt new file mode 100644 index 0000000..69414f5 --- /dev/null +++ b/src/test/resources/org/apache/sling/feature/cpconverter/immutable/jcr_root/apps/test.txt @@ -0,0 +1 @@ +Some file \ No newline at end of file diff --git a/src/test/resources/org/apache/sling/feature/cpconverter/mixed/jcr_root/apps/test.txt b/src/test/resources/org/apache/sling/feature/cpconverter/mixed/jcr_root/apps/test.txt new file mode 100644 index 0000000..69414f5 --- /dev/null +++ b/src/test/resources/org/apache/sling/feature/cpconverter/mixed/jcr_root/apps/test.txt @@ -0,0 +1 @@ +Some file \ No newline at end of file diff --git a/src/test/resources/org/apache/sling/feature/cpconverter/mixed/jcr_root/content/test.txt b/src/test/resources/org/apache/sling/feature/cpconverter/mixed/jcr_root/content/test.txt new file mode 100644 index 0000000..69414f5 --- /dev/null +++ b/src/test/resources/org/apache/sling/feature/cpconverter/mixed/jcr_root/content/test.txt @@ -0,0 +1 @@ +Some file \ No newline at end of file diff --git a/src/test/resources/org/apache/sling/feature/cpconverter/mutable/jcr_root/content/test.txt b/src/test/resources/org/apache/sling/feature/cpconverter/mutable/jcr_root/content/test.txt new file mode 100644 index 0000000..69414f5 --- /dev/null +++ b/src/test/resources/org/apache/sling/feature/cpconverter/mutable/jcr_root/content/test.txt @@ -0,0 +1 @@ +Some file \ No newline at end of file
