diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 902e6b8bb..26ff93d83 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -31,10 +31,6 @@ jobs: [ {"jdk": "17.0.2", "os": "windows-latest", distribution: "zulu" } ] - matrix-exclude: > - [ - {"jdk": "8"} - ] # deploy: # name: Deploy diff --git a/pom.xml b/pom.xml index 308b20d6d..b8a7335bd 100644 --- a/pom.xml +++ b/pom.xml @@ -47,7 +47,6 @@ - 17 1.7.36 1.1.0 2026-06-08T20:12:28Z @@ -201,4 +200,109 @@ + + + java17 + + [17,) + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + java17-main + + compile + + + 17 + + ${project.basedir}/src/main/java17 + + true + + + + + + + org.apache.maven.plugins + maven-antrun-plugin + + + compile-java17-integration-tests + + run + + pre-integration-test + + + + + + + + + + + + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + + ${project.build.directory}/${project.build.finalName}.jar + ${project.build.directory}/it-classes + true + + **/*IT.class + + + + + + integration-test + verify + + + + + + + + + plexus-release + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + enforce-java-17-for-release + + enforce + + + + + [17,) + To release this MultiRelease jar, use at least Java 17 + + + + + + + + + + diff --git a/src/test/java/org/codehaus/plexus/archiver/manager/CdiFactoryTest.java b/src/it/java17/org/codehaus/plexus/archiver/manager/CdiFactoryIT.java similarity index 99% rename from src/test/java/org/codehaus/plexus/archiver/manager/CdiFactoryTest.java rename to src/it/java17/org/codehaus/plexus/archiver/manager/CdiFactoryIT.java index 82cb3f6b3..4e469bea8 100644 --- a/src/test/java/org/codehaus/plexus/archiver/manager/CdiFactoryTest.java +++ b/src/it/java17/org/codehaus/plexus/archiver/manager/CdiFactoryIT.java @@ -28,7 +28,7 @@ import static org.assertj.core.api.Assertions.assertThat; -class CdiFactoryTest { +class CdiFactoryIT { @Test void createsConfiguredArchivers(@TempDir Path directory) { diff --git a/src/test/java/org/codehaus/plexus/archiver/manager/ServiceLoaderArchiverManagerTest.java b/src/it/java17/org/codehaus/plexus/archiver/manager/ServiceLoaderArchiverManagerIT.java similarity index 99% rename from src/test/java/org/codehaus/plexus/archiver/manager/ServiceLoaderArchiverManagerTest.java rename to src/it/java17/org/codehaus/plexus/archiver/manager/ServiceLoaderArchiverManagerIT.java index 457414076..692f04692 100644 --- a/src/test/java/org/codehaus/plexus/archiver/manager/ServiceLoaderArchiverManagerTest.java +++ b/src/it/java17/org/codehaus/plexus/archiver/manager/ServiceLoaderArchiverManagerIT.java @@ -65,7 +65,7 @@ *This is a copy of ArchiverManager, but without the {@code extends TestSupport} and always using * {@code SpiArchiverManager} as the ArchiverManager */ -class ServiceLoaderArchiverManagerTest { +class ServiceLoaderArchiverManagerIT { // list of items which support Archiver and UnArchiver private static Stream getArchiversAndUnArchiverForTests() { diff --git a/src/test/java/org/codehaus/plexus/archivers/spi/ArchiverProviderTest.java b/src/it/java17/org/codehaus/plexus/archivers/spi/ArchiverProviderIT.java similarity index 93% rename from src/test/java/org/codehaus/plexus/archivers/spi/ArchiverProviderTest.java rename to src/it/java17/org/codehaus/plexus/archivers/spi/ArchiverProviderIT.java index fab311a20..df9fa37c8 100644 --- a/src/test/java/org/codehaus/plexus/archivers/spi/ArchiverProviderTest.java +++ b/src/it/java17/org/codehaus/plexus/archivers/spi/ArchiverProviderIT.java @@ -25,20 +25,25 @@ import java.util.Comparator; import java.util.List; +import org.codehaus.plexus.archiver.ArchiveCreation; import org.codehaus.plexus.archiver.ArchivedFileSet; import org.codehaus.plexus.archiver.Archiver; +import org.codehaus.plexus.archiver.ArchiverConfigurer; +import org.codehaus.plexus.archiver.DuplicateHandling; +import org.codehaus.plexus.archiver.FileSet; +import org.codehaus.plexus.archiver.PermissionHandling; +import org.codehaus.plexus.archiver.UnixPermissions; +import org.codehaus.plexus.archiver.diags.NoOpArchiver; import org.codehaus.plexus.archiver.CaseSensitivities; import org.codehaus.plexus.archiver.CaseSensitivity; import org.codehaus.plexus.archiver.DefaultExcludes; import org.codehaus.plexus.archiver.EmptyDirectoryHandling; -import org.codehaus.plexus.archiver.FileSet; -import org.codehaus.plexus.archiver.diags.NoOpArchiver; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import static org.assertj.core.api.Assertions.assertThat; -class ArchiverProviderTest { +class ArchiverProviderIT { @Test void doesNotExposeUnconfiguredArchiverCreation() { @@ -51,7 +56,12 @@ void doesNotExposeUnconfiguredArchiverCreation() { .doesNotContain("create"); assertThat(Arrays.stream(ArchiverConfigurer.class.getMethods()) .filter(method -> Modifier.isStatic(method.getModifiers()))) - .isEmpty(); + .satisfiesExactly(m -> { + assertThat(m.getName()).isEqualTo("of"); + assertThat(m.getParameterCount()).isEqualTo(1); + assertThat(m.getParameterTypes()[0]).isEqualTo(Archiver.class); + assertThat(m.getReturnType()).isEqualTo(ArchiverConfigurer.class); + }); } @Test diff --git a/src/test/java/org/codehaus/plexus/archivers/spi/PlexusIoResourceCollectionProviderTest.java b/src/it/java17/org/codehaus/plexus/archivers/spi/PlexusIoResourceCollectionProviderIT.java similarity index 88% rename from src/test/java/org/codehaus/plexus/archivers/spi/PlexusIoResourceCollectionProviderTest.java rename to src/it/java17/org/codehaus/plexus/archivers/spi/PlexusIoResourceCollectionProviderIT.java index e383f2688..d374889a3 100644 --- a/src/test/java/org/codehaus/plexus/archivers/spi/PlexusIoResourceCollectionProviderTest.java +++ b/src/it/java17/org/codehaus/plexus/archivers/spi/PlexusIoResourceCollectionProviderIT.java @@ -23,22 +23,27 @@ import java.util.Arrays; import java.util.List; +import org.codehaus.plexus.archiver.PlexusIoResourceCollectionConfigurer; +import org.codehaus.plexus.archiver.SymbolicLinkHandling; +import org.codehaus.plexus.archiver.gzip.PlexusIoGzipResourceCollectionProvider; +import org.codehaus.plexus.archiver.Archiver; +import org.codehaus.plexus.archiver.ArchiverConfigurer; import org.codehaus.plexus.archiver.CaseSensitivity; import org.codehaus.plexus.archiver.DefaultExcludes; import org.codehaus.plexus.archiver.EmptyDirectoryHandling; -import org.codehaus.plexus.archiver.gzip.PlexusIoGzipResourceCollectionProvider; import org.codehaus.plexus.archiver.resources.PlexusIoFileResourceCollectionProvider; import org.codehaus.plexus.archiver.zip.PlexusArchiverZipFileResourceCollectionProvider; import org.codehaus.plexus.components.io.resources.AbstractPlexusIoArchiveResourceCollection; import org.codehaus.plexus.components.io.resources.AbstractPlexusIoResourceCollection; import org.codehaus.plexus.components.io.resources.PlexusIoCompressedFileResourceCollection; import org.codehaus.plexus.components.io.resources.PlexusIoFileResourceCollection; +import org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import static org.assertj.core.api.Assertions.assertThat; -class PlexusIoResourceCollectionProviderTest { +class PlexusIoResourceCollectionProviderIT { @Test void exposesOnlyConfiguredCreation() { @@ -53,7 +58,12 @@ void exposesOnlyConfiguredCreation() { .doesNotContain("create"); assertThat(Arrays.stream(PlexusIoResourceCollectionConfigurer.class.getMethods()) .filter(method -> Modifier.isStatic(method.getModifiers()))) - .isEmpty(); + .satisfiesExactly(m -> { + assertThat(m.getName()).isEqualTo("of"); + assertThat(m.getParameterCount()).isEqualTo(1); + assertThat(m.getParameterTypes()[0]).isEqualTo(PlexusIoResourceCollection.class); + assertThat(m.getReturnType()).isEqualTo(PlexusIoResourceCollectionConfigurer.class); + }); } @Test diff --git a/src/test/java/org/codehaus/plexus/archivers/spi/UnArchiverProviderTest.java b/src/it/java17/org/codehaus/plexus/archivers/spi/UnArchiverProviderIT.java similarity index 80% rename from src/test/java/org/codehaus/plexus/archivers/spi/UnArchiverProviderTest.java rename to src/it/java17/org/codehaus/plexus/archivers/spi/UnArchiverProviderIT.java index 0575e0895..6902690ee 100644 --- a/src/test/java/org/codehaus/plexus/archivers/spi/UnArchiverProviderTest.java +++ b/src/it/java17/org/codehaus/plexus/archivers/spi/UnArchiverProviderIT.java @@ -22,27 +22,37 @@ import java.util.Arrays; import java.util.List; +import org.codehaus.plexus.archiver.ExistingFileHandling; +import org.codehaus.plexus.archiver.PermissionHandling; +import org.codehaus.plexus.archiver.PlexusIoResourceCollectionConfigurer; import org.codehaus.plexus.archiver.UnArchiver; +import org.codehaus.plexus.archiver.UnArchiverConfigurer; import org.codehaus.plexus.archiver.zip.ZipUnArchiverProvider; +import org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import static org.assertj.core.api.Assertions.assertThat; -class UnArchiverProviderTest { +class UnArchiverProviderIT { @Test void exposesOnlyConfiguredCreation() { assertThat(UnArchiverProvider.class.getPermittedSubclasses()).containsExactly(AbstractUnArchiverProvider.class); assertThat(Arrays.stream(UnArchiverProvider.class.getMethods()) - .filter(method -> method.getName().equals("newUnarchiver")) + .filter(method -> method.getName().equals("newUnArchiver")) .map(method -> method.getParameterCount())) .containsExactly(1); assertThat(Arrays.stream(AbstractUnArchiverProvider.class.getMethods()).map(method -> method.getName())) .doesNotContain("create"); assertThat(Arrays.stream(UnArchiverConfigurer.class.getMethods()) .filter(method -> Modifier.isStatic(method.getModifiers()))) - .isEmpty(); + .satisfiesExactly(m -> { + assertThat(m.getName()).isEqualTo("of"); + assertThat(m.getParameterCount()).isEqualTo(1); + assertThat(m.getParameterTypes()[0]).isEqualTo(UnArchiver.class); + assertThat(m.getReturnType()).isEqualTo(UnArchiverConfigurer.class); + }); } @Test @@ -50,7 +60,7 @@ void configuresUnarchiverBeforeReturningIt(@TempDir Path directory) { Path source = directory.resolve("source.zip"); Path destination = directory.resolve("output"); - UnArchiver unarchiver = new ZipUnArchiverProvider().newUnarchiver(configurer -> { + UnArchiver unarchiver = new ZipUnArchiverProvider().newUnArchiver(configurer -> { configurer.setSource(source); configurer.setDestinationDirectory(destination); configurer.setExistingFileHandling(ExistingFileHandling.KEEP_NEWER); diff --git a/src/main/java/org/codehaus/plexus/archiver/AbstractArchiver.java b/src/main/java/org/codehaus/plexus/archiver/AbstractArchiver.java index 0d78450d2..a5c0310fc 100755 --- a/src/main/java/org/codehaus/plexus/archiver/AbstractArchiver.java +++ b/src/main/java/org/codehaus/plexus/archiver/AbstractArchiver.java @@ -395,7 +395,8 @@ private ArchiveEntry asArchiveEntry(final AddedResourceCollection collection, fi final String destFileName = collection.resources.getName(resource); int fromResource = PlexusIoResourceAttributes.UNKNOWN_OCTAL_MODE; - if (resource instanceof ResourceAttributeSupplier supplier) { + if (resource instanceof ResourceAttributeSupplier) { + ResourceAttributeSupplier supplier = (ResourceAttributeSupplier) resource; final PlexusIoResourceAttributes attrs = supplier.getAttributes(); if (attrs != null) { @@ -466,9 +467,10 @@ public boolean hasNext() { if (ioResourceIter == null) { if (addedResourceIter.hasNext()) { final Object o = addedResourceIter.next(); - if (o instanceof ArchiveEntry entry) { - nextEntry = entry; - } else if (o instanceof AddedResourceCollection collection) { + if (o instanceof ArchiveEntry) { + nextEntry = (ArchiveEntry) o; + } else if (o instanceof AddedResourceCollection) { + AddedResourceCollection collection = (AddedResourceCollection) o; currentResourceCollection = collection; try { @@ -553,8 +555,8 @@ private String normalizedForDuplicateCheck(ArchiveEntry entry) { } private static void closeIfCloseable(Object resource) throws IOException { - if (resource instanceof Closeable closeable) { - closeable.close(); + if (resource instanceof Closeable) { + ((Closeable) resource).close(); } } @@ -592,19 +594,19 @@ protected PlexusIoResourceCollection asResourceCollection(final ArchivedFileSet "Error adding archived file-set. PlexusIoResourceCollection not found for: " + archiveFile, e); } - if (resources instanceof EncodingSupported supported) { - supported.setEncoding(charset); + if (resources instanceof EncodingSupported) { + ((EncodingSupported) resources).setEncoding(charset); } - if (resources instanceof PlexusIoArchivedResourceCollection collection) { - collection.setFile(fileSet.getArchive()); + if (resources instanceof PlexusIoArchivedResourceCollection) { + ((PlexusIoArchivedResourceCollection) resources).setFile(fileSet.getArchive()); } else { throw new ArchiverException("Expected " + PlexusIoArchivedResourceCollection.class.getName() + ", got " + resources.getClass().getName()); } - if (resources instanceof AbstractPlexusIoResourceCollection collection1) { - collection1.setStreamTransformer(fileSet.getStreamTransformer()); + if (resources instanceof AbstractPlexusIoResourceCollection) { + ((AbstractPlexusIoResourceCollection) resources).setStreamTransformer(fileSet.getStreamTransformer()); } final PlexusIoProxyResourceCollection proxy = new PlexusIoProxyResourceCollection(resources); @@ -699,9 +701,10 @@ protected boolean isUptodate() throws ArchiverException { while (it.hasNext()) { final Object o = it.next(); final long l; - if (o instanceof ArchiveEntry entry) { - l = entry.getResource().getLastModified(); - } else if (o instanceof AddedResourceCollection collection) { + if (o instanceof ArchiveEntry) { + l = ((ArchiveEntry) o).getResource().getLastModified(); + } else if (o instanceof AddedResourceCollection) { + AddedResourceCollection collection = (AddedResourceCollection) o; try { l = collection.resources.getLastModified(); } catch (final IOException e) { @@ -827,8 +830,8 @@ protected void postCreateArchive() throws ArchiverException, IOException {} protected abstract String getArchiveType(); private void addCloseable(Object maybeCloseable) { - if (maybeCloseable instanceof Closeable closeable) { - closeables.add(closeable); + if (maybeCloseable instanceof Closeable) { + closeables.add((Closeable) maybeCloseable); } } @@ -844,8 +847,8 @@ protected void cleanUp() throws IOException { closeIterators(); for (Object resource : resources) { - if (resource instanceof PlexusIoProxyResourceCollection collection) { - resource = collection.getSrc(); + if (resource instanceof PlexusIoProxyResourceCollection) { + resource = ((PlexusIoProxyResourceCollection) resource).getSrc(); } closeIfCloseable(resource); diff --git a/src/main/java/org/codehaus/plexus/archiver/ArchiveEntry.java b/src/main/java/org/codehaus/plexus/archiver/ArchiveEntry.java index 21637e420..e8fd65f88 100644 --- a/src/main/java/org/codehaus/plexus/archiver/ArchiveEntry.java +++ b/src/main/java/org/codehaus/plexus/archiver/ArchiveEntry.java @@ -78,7 +78,9 @@ private ArchiveEntry( this.name = name; this.defaultDirMode = defaultDirMode; this.resource = collection != null ? collection.resolve(resource) : resource; - this.attributes = (resource instanceof ResourceAttributeSupplier ras) ? ras.getAttributes() : null; + this.attributes = resource instanceof ResourceAttributeSupplier + ? ((ResourceAttributeSupplier) resource).getAttributes() + : null; this.type = type; int permissions = mode; @@ -117,8 +119,8 @@ public String getName() { */ @Deprecated public File getFile() { - if (resource instanceof PlexusIoFileResource fileResource) { - return fileResource.getFile(); + if (resource instanceof PlexusIoFileResource) { + return ((PlexusIoFileResource) resource).getFile(); } return null; } diff --git a/src/main/java/org/codehaus/plexus/archiver/ArchivedFileSet.java b/src/main/java/org/codehaus/plexus/archiver/ArchivedFileSet.java index da677bf93..7102bb10c 100644 --- a/src/main/java/org/codehaus/plexus/archiver/ArchivedFileSet.java +++ b/src/main/java/org/codehaus/plexus/archiver/ArchivedFileSet.java @@ -5,6 +5,8 @@ import java.io.File; import java.nio.file.Path; +import org.codehaus.plexus.archiver.util.DefaultArchivedFileSet; + /** * A file set, which consists of the files and directories in * an archive. @@ -13,15 +15,8 @@ */ public interface ArchivedFileSet extends BaseFileSet { - /** - * Creates a fluent archived file set specification. - * - * @param archive the source archive - * @return a file set for the archive - * @since 5.0.0 - */ - static ArchivedFileSetSpec of(Path archive) { - return ArchivedFileSetSpec.of(archive); + public static ArchivedFileSet of(Path path) { + return new DefaultArchivedFileSet(path.toFile()); } /** diff --git a/src/main/java/org/codehaus/plexus/archiver/Archiver.java b/src/main/java/org/codehaus/plexus/archiver/Archiver.java index 32424882d..b26d0a9f3 100644 --- a/src/main/java/org/codehaus/plexus/archiver/Archiver.java +++ b/src/main/java/org/codehaus/plexus/archiver/Archiver.java @@ -76,17 +76,6 @@ public interface Archiver { */ void addFileSet(@Nonnull FileSet fileSet) throws ArchiverException; - /** - * Adds a modern file set specification to the archive. - * - * @param fileSetSpec the file set specification - * @throws ArchiverException if adding the file set failed - * @since 5.0.0 - */ - default void addFileSet(@Nonnull FileSetSpec fileSetSpec) throws ArchiverException { - addFileSet(fileSetSpec.toFileSet()); - } - void addSymlink(String symlinkName, String symlinkDestination) throws ArchiverException; void addSymlink(String symlinkName, int permissions, String symlinkDestination) throws ArchiverException; @@ -97,17 +86,6 @@ default void addFileSet(@Nonnull FileSetSpec fileSetSpec) throws ArchiverExcepti void addArchivedFileSet(ArchivedFileSet fileSet) throws ArchiverException; - /** - * Adds a modern archived file set specification to the archive. - * - * @param fileSetSpec the archived file set specification - * @throws ArchiverException if adding the file set failed - * @since 5.0.0 - */ - default void addArchivedFileSet(@Nonnull ArchivedFileSetSpec fileSetSpec) throws ArchiverException { - addArchivedFileSet(fileSetSpec.toArchivedFileSet()); - } - /** * Adds the given archive file set to the archive. * diff --git a/src/main/java/org/codehaus/plexus/archiver/FileSet.java b/src/main/java/org/codehaus/plexus/archiver/FileSet.java index c08a5f159..eaf64eb00 100644 --- a/src/main/java/org/codehaus/plexus/archiver/FileSet.java +++ b/src/main/java/org/codehaus/plexus/archiver/FileSet.java @@ -3,6 +3,8 @@ import java.io.File; import java.nio.file.Path; +import org.codehaus.plexus.archiver.util.DefaultFileSet; + /** * A file set, which consists of the files and directories in * a common base directory. @@ -11,15 +13,8 @@ */ public interface FileSet extends BaseFileSet { - /** - * Creates a fluent file set specification. - * - * @param directory the file set base directory - * @return a file set for the directory - * @since 5.0.0 - */ - static FileSetSpec of(Path directory) { - return FileSetSpec.of(directory); + static FileSet of(Path path) { + return new DefaultFileSet(path.toFile()); } /** diff --git a/src/main/java/org/codehaus/plexus/archiver/diags/TrackingArchiver.java b/src/main/java/org/codehaus/plexus/archiver/diags/TrackingArchiver.java index 2393ca7da..e2b3e7e59 100644 --- a/src/main/java/org/codehaus/plexus/archiver/diags/TrackingArchiver.java +++ b/src/main/java/org/codehaus/plexus/archiver/diags/TrackingArchiver.java @@ -226,15 +226,16 @@ public Addition( final String[] excludes, final int permissions) { this.resource = resource; - if (resource instanceof FileSet fs) { - directory = fs.getDirectory(); - this.destination = fs.getPrefix(); - this.includes = fs.getIncludes(); - this.excludes = fs.getExcludes(); + if (resource instanceof FileSet) { + FileSet fileSet = (FileSet) resource; + directory = fileSet.getDirectory(); + this.destination = fileSet.getPrefix(); + this.includes = fileSet.getIncludes(); + this.excludes = fileSet.getExcludes(); this.permissions = permissions; } else { - if (resource instanceof File file && file.isDirectory()) { - directory = file; + if (resource instanceof File && ((File) resource).isDirectory()) { + directory = (File) resource; } else { directory = null; } diff --git a/src/main/java/org/codehaus/plexus/archiver/dir/DirectoryArchiver.java b/src/main/java/org/codehaus/plexus/archiver/dir/DirectoryArchiver.java index 58c9de709..1034c83c6 100644 --- a/src/main/java/org/codehaus/plexus/archiver/dir/DirectoryArchiver.java +++ b/src/main/java/org/codehaus/plexus/archiver/dir/DirectoryArchiver.java @@ -90,8 +90,8 @@ public void execute() throws ArchiverException, IOException { final String destDir = destDirectory.getCanonicalPath(); fileName = destDir + File.separator + fileName; PlexusIoResource resource = f.getResource(); - if (resource instanceof SymlinkDestinationSupplier supplier) { - String dest = supplier.getSymlinkDestination(); + if (resource instanceof SymlinkDestinationSupplier) { + String dest = ((SymlinkDestinationSupplier) resource).getSymlinkDestination(); File target = new File(dest); File symlink = new File(fileName); makeParentDirectories(symlink); diff --git a/src/main/java/org/codehaus/plexus/archiver/jar/JarToolModularJarArchiver.java b/src/main/java/org/codehaus/plexus/archiver/jar/JarToolModularJarArchiver.java index c7b409099..987542991 100644 --- a/src/main/java/org/codehaus/plexus/archiver/jar/JarToolModularJarArchiver.java +++ b/src/main/java/org/codehaus/plexus/archiver/jar/JarToolModularJarArchiver.java @@ -21,6 +21,8 @@ import java.io.File; import java.io.IOException; import java.io.PrintStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.nio.file.Files; import java.nio.file.LinkOption; import java.nio.file.Path; @@ -35,9 +37,9 @@ import java.util.Enumeration; import java.util.List; import java.util.Locale; +import java.util.Optional; import java.util.TimeZone; import java.util.regex.Pattern; -import java.util.spi.ToolProvider; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; @@ -72,14 +74,36 @@ public class JarToolModularJarArchiver extends ModularJarArchiver { private static final Pattern MRJAR_VERSION_AREA = Pattern.compile("META-INF/versions/\\d+/"); - private final ToolProvider jarTool; + private final Object jarTool; + + private final Method jarToolRun; private boolean moduleDescriptorFound; private boolean hasJarDateOption; public JarToolModularJarArchiver() { - this.jarTool = ToolProvider.findFirst("jar").orElse(null); + Object tool = null; + Method run = null; + try { + Class toolProvider = Class.forName("java.util.spi.ToolProvider"); + Method findFirst = toolProvider.getMethod("findFirst", String.class); + Optional jarToolProvider = (Optional) findFirst.invoke(null, "jar"); + if (jarToolProvider.isPresent()) { + tool = jarToolProvider.get(); + run = toolProvider.getMethod("run", PrintStream.class, PrintStream.class, String[].class); + } + } catch (ClassNotFoundException e) { + // ToolProvider is not available before Java 9. + } catch (IllegalAccessException e) { + throw new IllegalStateException("Could not access the JDK jar tool", e); + } catch (InvocationTargetException e) { + throw new IllegalStateException("Could not locate the JDK jar tool", e.getCause()); + } catch (NoSuchMethodException e) { + throw new IllegalStateException("Could not access the JDK jar tool", e); + } + this.jarTool = tool; + this.jarToolRun = run; } @Override @@ -117,7 +141,7 @@ protected void postCreateArchive() throws ArchiverException { getLogger().debug("jar tool --date option is supported: " + hasJarDateOption); } - int result = jarTool.run(System.out, System.err, getJarToolArguments()); + int result = runJarTool(System.out, System.err, getJarToolArguments()); if (result != 0) { throw new ArchiverException( @@ -269,14 +293,31 @@ private static FileTime revertToLocalTime(FileTime time) { * * @return true if the JAR tool supports the {@code --date} option */ - private boolean isJarDateOptionSupported() { + private boolean isJarDateOptionSupported() throws ArchiverException { // Test the output code validating the --date option. String[] args = {"--date", "2099-12-31T23:59:59Z", "--version"}; PrintStream nullPrintStream = NullPrintStream.INSTANCE; - int result = jarTool.run(nullPrintStream, nullPrintStream, args); + int result = runJarTool(nullPrintStream, nullPrintStream, args); return result == 0; } + + private int runJarTool(PrintStream out, PrintStream err, String[] args) throws ArchiverException { + try { + return ((Integer) jarToolRun.invoke(jarTool, out, err, args)).intValue(); + } catch (IllegalAccessException e) { + throw new ArchiverException("Could not access the JDK jar tool", e); + } catch (InvocationTargetException e) { + Throwable cause = e.getCause(); + if (cause instanceof RuntimeException) { + throw (RuntimeException) cause; + } + if (cause instanceof Error) { + throw (Error) cause; + } + throw new ArchiverException("Could not invoke the JDK jar tool", cause); + } + } } diff --git a/src/main/java/org/codehaus/plexus/archiver/jar/Manifest.java b/src/main/java/org/codehaus/plexus/archiver/jar/Manifest.java index cc98eace7..db6534fa5 100644 --- a/src/main/java/org/codehaus/plexus/archiver/jar/Manifest.java +++ b/src/main/java/org/codehaus/plexus/archiver/jar/Manifest.java @@ -625,7 +625,8 @@ public int hashCode() { @Override public boolean equals(Object rhs) { - return rhs instanceof ExistingSection es && backingAttributes.equals(es.backingAttributes); + return rhs instanceof ExistingSection + && backingAttributes.equals(((ExistingSection) rhs).backingAttributes); } } diff --git a/src/main/java/org/codehaus/plexus/archiver/manager/AbstractArchiverManager.java b/src/main/java/org/codehaus/plexus/archiver/manager/AbstractArchiverManager.java index ca8e25686..c02706ba1 100644 --- a/src/main/java/org/codehaus/plexus/archiver/manager/AbstractArchiverManager.java +++ b/src/main/java/org/codehaus/plexus/archiver/manager/AbstractArchiverManager.java @@ -21,6 +21,7 @@ import java.io.File; import java.util.Collection; +import java.util.Collections; import java.util.Locale; import java.util.Map; @@ -43,15 +44,15 @@ protected AbstractArchiverManager( Map archivers, Map unArchivers, Map plexusIoResourceCollections) { - this.archivers = Map.copyOf(archivers); - this.unArchivers = Map.copyOf(unArchivers); - this.plexusIoResourceCollections = Map.copyOf(plexusIoResourceCollections); + this.archivers = Collections.unmodifiableMap(archivers); + this.unArchivers = Collections.unmodifiableMap(unArchivers); + this.plexusIoResourceCollections = Collections.unmodifiableMap(plexusIoResourceCollections); } @Override @Nonnull public final Archiver getArchiver(@Nonnull String archiverName) throws NoSuchArchiverException { - return getArchiverFactory(archiverName).create(configurer -> {}); + return getArchiverFactory(archiverName).create(); } @Override @@ -68,7 +69,7 @@ public final ArchiverFactory getArchiverFactory(@Nonnull String archiverName) th @Override @Nonnull public final UnArchiver getUnArchiver(@Nonnull String unArchiverName) throws NoSuchArchiverException { - return getUnArchiverFactory(unArchiverName).create(configurer -> {}); + return getUnArchiverFactory(unArchiverName).create(); } @Override @@ -86,7 +87,7 @@ public final UnArchiverFactory getUnArchiverFactory(@Nonnull String unArchiverNa @Nonnull public final PlexusIoResourceCollection getResourceCollection(String resourceCollectionName) throws NoSuchArchiverException { - return getResourceCollectionFactory(resourceCollectionName).create(configurer -> {}); + return getResourceCollectionFactory(resourceCollectionName).create(); } @Override diff --git a/src/main/java/org/codehaus/plexus/archiver/manager/ArchiverFactory.java b/src/main/java/org/codehaus/plexus/archiver/manager/ArchiverFactory.java index 895c1b895..a03a9ddfb 100644 --- a/src/main/java/org/codehaus/plexus/archiver/manager/ArchiverFactory.java +++ b/src/main/java/org/codehaus/plexus/archiver/manager/ArchiverFactory.java @@ -17,10 +17,7 @@ package org.codehaus.plexus.archiver.manager; -import java.util.function.Consumer; - import org.codehaus.plexus.archiver.Archiver; -import org.codehaus.plexus.archivers.spi.ArchiverConfigurer; /** * Creates configured archiver instances. @@ -29,5 +26,5 @@ */ @FunctionalInterface public interface ArchiverFactory { - Archiver create(Consumer configurer); + Archiver create(); } diff --git a/src/main/java/org/codehaus/plexus/archiver/manager/CdiArchiverFactory.java b/src/main/java/org/codehaus/plexus/archiver/manager/CdiArchiverFactory.java index 48635c088..5063f241f 100644 --- a/src/main/java/org/codehaus/plexus/archiver/manager/CdiArchiverFactory.java +++ b/src/main/java/org/codehaus/plexus/archiver/manager/CdiArchiverFactory.java @@ -20,11 +20,8 @@ import javax.inject.Provider; import java.util.Objects; -import java.util.function.Consumer; import org.codehaus.plexus.archiver.Archiver; -import org.codehaus.plexus.archivers.internal.DefaultArchiverConfigurer; -import org.codehaus.plexus.archivers.spi.ArchiverConfigurer; final class CdiArchiverFactory implements ArchiverFactory { private final Provider provider; @@ -34,9 +31,7 @@ final class CdiArchiverFactory implements ArchiverFactory { } @Override - public Archiver create(Consumer configurer) { - Archiver archiver = provider.get(); - Objects.requireNonNull(configurer, "configurer").accept(new DefaultArchiverConfigurer(archiver)); - return archiver; + public Archiver create() { + return provider.get(); } } diff --git a/src/main/java/org/codehaus/plexus/archiver/manager/CdiPlexusIoResourceCollectionFactory.java b/src/main/java/org/codehaus/plexus/archiver/manager/CdiPlexusIoResourceCollectionFactory.java index 2578646bb..d1b2e85dc 100644 --- a/src/main/java/org/codehaus/plexus/archiver/manager/CdiPlexusIoResourceCollectionFactory.java +++ b/src/main/java/org/codehaus/plexus/archiver/manager/CdiPlexusIoResourceCollectionFactory.java @@ -20,10 +20,7 @@ import javax.inject.Provider; import java.util.Objects; -import java.util.function.Consumer; -import org.codehaus.plexus.archivers.internal.DefaultPlexusIoResourceCollectionConfigurer; -import org.codehaus.plexus.archivers.spi.PlexusIoResourceCollectionConfigurer; import org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection; final class CdiPlexusIoResourceCollectionFactory implements PlexusIoResourceCollectionFactory { @@ -34,10 +31,7 @@ final class CdiPlexusIoResourceCollectionFactory implements PlexusIoResourceColl } @Override - public PlexusIoResourceCollection create(Consumer configurer) { - PlexusIoResourceCollection collection = provider.get(); - Objects.requireNonNull(configurer, "configurer") - .accept(new DefaultPlexusIoResourceCollectionConfigurer(collection)); - return collection; + public PlexusIoResourceCollection create() { + return provider.get(); } } diff --git a/src/main/java/org/codehaus/plexus/archiver/manager/CdiUnArchiverFactory.java b/src/main/java/org/codehaus/plexus/archiver/manager/CdiUnArchiverFactory.java index 8a5d720e2..17114bb85 100644 --- a/src/main/java/org/codehaus/plexus/archiver/manager/CdiUnArchiverFactory.java +++ b/src/main/java/org/codehaus/plexus/archiver/manager/CdiUnArchiverFactory.java @@ -20,11 +20,8 @@ import javax.inject.Provider; import java.util.Objects; -import java.util.function.Consumer; import org.codehaus.plexus.archiver.UnArchiver; -import org.codehaus.plexus.archivers.internal.DefaultUnArchiverConfigurer; -import org.codehaus.plexus.archivers.spi.UnArchiverConfigurer; final class CdiUnArchiverFactory implements UnArchiverFactory { private final Provider provider; @@ -34,9 +31,7 @@ final class CdiUnArchiverFactory implements UnArchiverFactory { } @Override - public UnArchiver create(Consumer configurer) { - UnArchiver unarchiver = provider.get(); - Objects.requireNonNull(configurer, "configurer").accept(new DefaultUnArchiverConfigurer(unarchiver)); - return unarchiver; + public UnArchiver create() { + return provider.get(); } } diff --git a/src/main/java/org/codehaus/plexus/archiver/manager/DefaultArchiverManager.java b/src/main/java/org/codehaus/plexus/archiver/manager/DefaultArchiverManager.java index c119299e5..ac7b1d8b8 100644 --- a/src/main/java/org/codehaus/plexus/archiver/manager/DefaultArchiverManager.java +++ b/src/main/java/org/codehaus/plexus/archiver/manager/DefaultArchiverManager.java @@ -45,20 +45,18 @@ public DefaultArchiverManager( private static Map archivers(Map> archivers) { return archivers.entrySet().stream() - .collect(Collectors.toUnmodifiableMap( - Map.Entry::getKey, entry -> new CdiArchiverFactory(entry.getValue()))); + .collect(Collectors.toMap(Map.Entry::getKey, entry -> new CdiArchiverFactory(entry.getValue()))); } private static Map unarchivers(Map> unArchivers) { return unArchivers.entrySet().stream() - .collect(Collectors.toUnmodifiableMap( - Map.Entry::getKey, entry -> new CdiUnArchiverFactory(entry.getValue()))); + .collect(Collectors.toMap(Map.Entry::getKey, entry -> new CdiUnArchiverFactory(entry.getValue()))); } private static Map plexusIoResourceCollections( Map> plexusIoResourceCollections) { return plexusIoResourceCollections.entrySet().stream() - .collect(Collectors.toUnmodifiableMap( + .collect(Collectors.toMap( Map.Entry::getKey, entry -> new CdiPlexusIoResourceCollectionFactory(entry.getValue()))); } } diff --git a/src/main/java/org/codehaus/plexus/archiver/manager/PlexusIoResourceCollectionFactory.java b/src/main/java/org/codehaus/plexus/archiver/manager/PlexusIoResourceCollectionFactory.java index 3e859ce0a..3107146db 100644 --- a/src/main/java/org/codehaus/plexus/archiver/manager/PlexusIoResourceCollectionFactory.java +++ b/src/main/java/org/codehaus/plexus/archiver/manager/PlexusIoResourceCollectionFactory.java @@ -17,9 +17,6 @@ package org.codehaus.plexus.archiver.manager; -import java.util.function.Consumer; - -import org.codehaus.plexus.archivers.spi.PlexusIoResourceCollectionConfigurer; import org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection; /** @@ -29,5 +26,5 @@ */ @FunctionalInterface public interface PlexusIoResourceCollectionFactory { - PlexusIoResourceCollection create(Consumer configurer); + PlexusIoResourceCollection create(); } diff --git a/src/main/java/org/codehaus/plexus/archiver/manager/ServiceLoaderArchiverManager.java b/src/main/java/org/codehaus/plexus/archiver/manager/ServiceLoaderArchiverManager.java deleted file mode 100644 index 8ded2eda9..000000000 --- a/src/main/java/org/codehaus/plexus/archiver/manager/ServiceLoaderArchiverManager.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright MojoHaus and Contributors - * - * Licensed 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.codehaus.plexus.archiver.manager; - -import java.util.Map; -import java.util.ServiceLoader; -import java.util.ServiceLoader.Provider; -import java.util.stream.Collectors; - -import org.codehaus.plexus.archivers.spi.ArchiverProvider; -import org.codehaus.plexus.archivers.spi.PlexusIoResourceCollectionProvider; -import org.codehaus.plexus.archivers.spi.UnArchiverProvider; - -public class ServiceLoaderArchiverManager extends AbstractArchiverManager { - - public ServiceLoaderArchiverManager() { - super(archivers(), unarchivers(), plexusIoResourceCollections()); - } - - private static Map archivers() { - return ServiceLoader.load(ArchiverProvider.class).stream() - .map(Provider::get) - .collect(Collectors.toMap(ArchiverProvider::getName, provider -> provider::newArchiver)); - } - - private static Map unarchivers() { - return ServiceLoader.load(UnArchiverProvider.class).stream() - .map(Provider::get) - .collect(Collectors.toMap(UnArchiverProvider::getName, provider -> provider::newUnarchiver)); - } - - private static Map plexusIoResourceCollections() { - return ServiceLoader.load(PlexusIoResourceCollectionProvider.class).stream() - .map(Provider::get) - .collect(Collectors.toMap( - PlexusIoResourceCollectionProvider::getName, - provider -> provider::newPlexusIoResourceCollection)); - } -} diff --git a/src/main/java/org/codehaus/plexus/archiver/manager/UnArchiverFactory.java b/src/main/java/org/codehaus/plexus/archiver/manager/UnArchiverFactory.java index 8ff6cd071..bf7146447 100644 --- a/src/main/java/org/codehaus/plexus/archiver/manager/UnArchiverFactory.java +++ b/src/main/java/org/codehaus/plexus/archiver/manager/UnArchiverFactory.java @@ -17,10 +17,7 @@ package org.codehaus.plexus.archiver.manager; -import java.util.function.Consumer; - import org.codehaus.plexus.archiver.UnArchiver; -import org.codehaus.plexus.archivers.spi.UnArchiverConfigurer; /** * Creates configured unarchiver instances. @@ -29,5 +26,5 @@ */ @FunctionalInterface public interface UnArchiverFactory { - UnArchiver create(Consumer configurer); + UnArchiver create(); } diff --git a/src/main/java/org/codehaus/plexus/archiver/util/ResourceUtils.java b/src/main/java/org/codehaus/plexus/archiver/util/ResourceUtils.java index ed351704d..b03a7e76c 100644 --- a/src/main/java/org/codehaus/plexus/archiver/util/ResourceUtils.java +++ b/src/main/java/org/codehaus/plexus/archiver/util/ResourceUtils.java @@ -74,8 +74,8 @@ public static void copyFile(InputStream input, File outFile) throws IOException * Checks, whether the resource and the file are identical. */ public static boolean isSame(PlexusIoResource resource, File file) { - if (resource instanceof FileSupplier supplier) { - File resourceFile = supplier.getFile(); + if (resource instanceof FileSupplier) { + File resourceFile = ((FileSupplier) resource).getFile(); return file.equals(resourceFile); } return false; @@ -87,8 +87,8 @@ public static boolean isSame(PlexusIoResource resource, File file) { * slower than comparing the files. */ public static boolean isCanonicalizedSame(PlexusIoResource resource, File file) throws IOException { - if (resource instanceof FileSupplier supplier) { - File resourceFile = supplier.getFile(); + if (resource instanceof FileSupplier) { + File resourceFile = ((FileSupplier) resource).getFile(); return file.getCanonicalFile().equals(resourceFile.getCanonicalFile()); } return false; diff --git a/src/main/java/org/codehaus/plexus/archiver/util/Streams.java b/src/main/java/org/codehaus/plexus/archiver/util/Streams.java index 99c0678e3..1e8f84bde 100644 --- a/src/main/java/org/codehaus/plexus/archiver/util/Streams.java +++ b/src/main/java/org/codehaus/plexus/archiver/util/Streams.java @@ -37,11 +37,11 @@ public class Streams { public static final InputStream EMPTY_INPUTSTREAM = new ByteArrayInputStream(new byte[0]); public static BufferedInputStream bufferedInputStream(InputStream is) { - return is instanceof BufferedInputStream bis ? bis : new BufferedInputStream(is, 65536); + return is instanceof BufferedInputStream ? (BufferedInputStream) is : new BufferedInputStream(is, 65536); } public static BufferedOutputStream bufferedOutputStream(OutputStream os) { - return os instanceof BufferedOutputStream bos ? bos : new BufferedOutputStream(os, 65536); + return os instanceof BufferedOutputStream ? (BufferedOutputStream) os : new BufferedOutputStream(os, 65536); } public static byte[] cacheBuffer() { diff --git a/src/main/java/org/codehaus/plexus/archivers/spi/AbstractArchiverProvider.java b/src/main/java17/org.codehaus.plexus.archivers/spi/AbstractArchiverProvider.java similarity index 91% rename from src/main/java/org/codehaus/plexus/archivers/spi/AbstractArchiverProvider.java rename to src/main/java17/org.codehaus.plexus.archivers/spi/AbstractArchiverProvider.java index ee0d7d313..b860e21ea 100644 --- a/src/main/java/org/codehaus/plexus/archivers/spi/AbstractArchiverProvider.java +++ b/src/main/java17/org.codehaus.plexus.archivers/spi/AbstractArchiverProvider.java @@ -21,7 +21,7 @@ import java.util.function.Consumer; import org.codehaus.plexus.archiver.Archiver; -import org.codehaus.plexus.archivers.internal.DefaultArchiverConfigurer; +import org.codehaus.plexus.archiver.ArchiverConfigurer; /** * Base implementation that keeps unconfigured archiver creation internal to service providers. @@ -35,7 +35,7 @@ public abstract non-sealed class AbstractArchiverProvider implements ArchiverPro @Override public final Archiver newArchiver(Consumer configurer) { Archiver archiver = createArchiver(); - Objects.requireNonNull(configurer, "configurer").accept(new DefaultArchiverConfigurer(archiver)); + Objects.requireNonNull(configurer, "configurer").accept(ArchiverConfigurer.of(archiver)); return archiver; } } diff --git a/src/main/java/org/codehaus/plexus/archivers/spi/AbstractPlexusIoResourceCollectionProvider.java b/src/main/java17/org.codehaus.plexus.archivers/spi/AbstractPlexusIoResourceCollectionProvider.java similarity index 89% rename from src/main/java/org/codehaus/plexus/archivers/spi/AbstractPlexusIoResourceCollectionProvider.java rename to src/main/java17/org.codehaus.plexus.archivers/spi/AbstractPlexusIoResourceCollectionProvider.java index 98cef8df1..e812594a5 100644 --- a/src/main/java/org/codehaus/plexus/archivers/spi/AbstractPlexusIoResourceCollectionProvider.java +++ b/src/main/java17/org.codehaus.plexus.archivers/spi/AbstractPlexusIoResourceCollectionProvider.java @@ -20,7 +20,7 @@ import java.util.Objects; import java.util.function.Consumer; -import org.codehaus.plexus.archivers.internal.DefaultPlexusIoResourceCollectionConfigurer; +import org.codehaus.plexus.archiver.PlexusIoResourceCollectionConfigurer; import org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection; /** @@ -38,7 +38,7 @@ public final PlexusIoResourceCollection newPlexusIoResourceCollection( Consumer configurer) { PlexusIoResourceCollection collection = createResourceCollection(); Objects.requireNonNull(configurer, "configurer") - .accept(new DefaultPlexusIoResourceCollectionConfigurer(collection)); + .accept(PlexusIoResourceCollectionConfigurer.of(collection)); return collection; } } diff --git a/src/main/java/org/codehaus/plexus/archivers/spi/AbstractUnArchiverProvider.java b/src/main/java17/org.codehaus.plexus.archivers/spi/AbstractUnArchiverProvider.java similarity index 86% rename from src/main/java/org/codehaus/plexus/archivers/spi/AbstractUnArchiverProvider.java rename to src/main/java17/org.codehaus.plexus.archivers/spi/AbstractUnArchiverProvider.java index c8fa5dab2..935af0932 100644 --- a/src/main/java/org/codehaus/plexus/archivers/spi/AbstractUnArchiverProvider.java +++ b/src/main/java17/org.codehaus.plexus.archivers/spi/AbstractUnArchiverProvider.java @@ -21,7 +21,7 @@ import java.util.function.Consumer; import org.codehaus.plexus.archiver.UnArchiver; -import org.codehaus.plexus.archivers.internal.DefaultUnArchiverConfigurer; +import org.codehaus.plexus.archiver.UnArchiverConfigurer; /** * Base implementation that keeps unconfigured unarchiver creation internal to service providers. @@ -33,9 +33,9 @@ public abstract non-sealed class AbstractUnArchiverProvider implements UnArchive protected abstract UnArchiver createUnarchiver(); @Override - public final UnArchiver newUnarchiver(Consumer configurer) { + public final UnArchiver newUnArchiver(Consumer configurer) { UnArchiver unarchiver = createUnarchiver(); - Objects.requireNonNull(configurer, "configurer").accept(new DefaultUnArchiverConfigurer(unarchiver)); + Objects.requireNonNull(configurer, "configurer").accept(UnArchiverConfigurer.of(unarchiver)); return unarchiver; } } diff --git a/src/main/java/org/codehaus/plexus/archivers/spi/ArchiverProvider.java b/src/main/java17/org.codehaus.plexus.archivers/spi/ArchiverProvider.java similarity index 95% rename from src/main/java/org/codehaus/plexus/archivers/spi/ArchiverProvider.java rename to src/main/java17/org.codehaus.plexus.archivers/spi/ArchiverProvider.java index 298ebbb4f..0389523a1 100644 --- a/src/main/java/org/codehaus/plexus/archivers/spi/ArchiverProvider.java +++ b/src/main/java17/org.codehaus.plexus.archivers/spi/ArchiverProvider.java @@ -20,6 +20,7 @@ import java.util.function.Consumer; import org.codehaus.plexus.archiver.Archiver; +import org.codehaus.plexus.archiver.ArchiverConfigurer; /** * Service provider for a named archive format. Archivers are exposed only after their initial configuration has been diff --git a/src/main/java/org/codehaus/plexus/archivers/spi/PlexusIoResourceCollectionProvider.java b/src/main/java17/org.codehaus.plexus.archivers/spi/PlexusIoResourceCollectionProvider.java similarity index 93% rename from src/main/java/org/codehaus/plexus/archivers/spi/PlexusIoResourceCollectionProvider.java rename to src/main/java17/org.codehaus.plexus.archivers/spi/PlexusIoResourceCollectionProvider.java index 12edd011e..d45517c41 100644 --- a/src/main/java/org/codehaus/plexus/archivers/spi/PlexusIoResourceCollectionProvider.java +++ b/src/main/java17/org.codehaus.plexus.archivers/spi/PlexusIoResourceCollectionProvider.java @@ -19,6 +19,7 @@ import java.util.function.Consumer; +import org.codehaus.plexus.archiver.PlexusIoResourceCollectionConfigurer; import org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection; /** diff --git a/src/main/java/org/codehaus/plexus/archivers/spi/UnArchiverProvider.java b/src/main/java17/org.codehaus.plexus.archivers/spi/UnArchiverProvider.java similarity index 88% rename from src/main/java/org/codehaus/plexus/archivers/spi/UnArchiverProvider.java rename to src/main/java17/org.codehaus.plexus.archivers/spi/UnArchiverProvider.java index ef2f8bb2c..ec8812348 100644 --- a/src/main/java/org/codehaus/plexus/archivers/spi/UnArchiverProvider.java +++ b/src/main/java17/org.codehaus.plexus.archivers/spi/UnArchiverProvider.java @@ -20,6 +20,7 @@ import java.util.function.Consumer; import org.codehaus.plexus.archiver.UnArchiver; +import org.codehaus.plexus.archiver.UnArchiverConfigurer; /** * Service provider for a named archive extraction format. @@ -30,5 +31,5 @@ public sealed interface UnArchiverProvider permits AbstractUnArchiverProvider { String getName(); - UnArchiver newUnarchiver(Consumer configurer); + UnArchiver newUnArchiver(Consumer configurer); } diff --git a/src/main/java/org/codehaus/plexus/archivers/spi/ArchiveCreation.java b/src/main/java17/org/codehaus/plexus/archiver/ArchiveCreation.java similarity index 96% rename from src/main/java/org/codehaus/plexus/archivers/spi/ArchiveCreation.java rename to src/main/java17/org/codehaus/plexus/archiver/ArchiveCreation.java index 4af7dda53..0e291686b 100644 --- a/src/main/java/org/codehaus/plexus/archivers/spi/ArchiveCreation.java +++ b/src/main/java17/org/codehaus/plexus/archiver/ArchiveCreation.java @@ -15,7 +15,7 @@ * */ -package org.codehaus.plexus.archivers.spi; +package org.codehaus.plexus.archiver; /** * Controls whether an archive is always recreated or only when out of date. diff --git a/src/main/java17/org/codehaus/plexus/archiver/ArchivedFileSet.java b/src/main/java17/org/codehaus/plexus/archiver/ArchivedFileSet.java new file mode 100644 index 000000000..da677bf93 --- /dev/null +++ b/src/main/java17/org/codehaus/plexus/archiver/ArchivedFileSet.java @@ -0,0 +1,32 @@ +package org.codehaus.plexus.archiver; + +import javax.annotation.CheckForNull; + +import java.io.File; +import java.nio.file.Path; + +/** + * A file set, which consists of the files and directories in + * an archive. + * + * @since 1.0-alpha-9 + */ +public interface ArchivedFileSet extends BaseFileSet { + + /** + * Creates a fluent archived file set specification. + * + * @param archive the source archive + * @return a file set for the archive + * @since 5.0.0 + */ + static ArchivedFileSetSpec of(Path archive) { + return ArchivedFileSetSpec.of(archive); + } + + /** + * Returns the archive file. + */ + @CheckForNull + File getArchive(); +} diff --git a/src/main/java/org/codehaus/plexus/archiver/ArchivedFileSetSpec.java b/src/main/java17/org/codehaus/plexus/archiver/ArchivedFileSetSpec.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/ArchivedFileSetSpec.java rename to src/main/java17/org/codehaus/plexus/archiver/ArchivedFileSetSpec.java diff --git a/src/main/java17/org/codehaus/plexus/archiver/Archiver.java b/src/main/java17/org/codehaus/plexus/archiver/Archiver.java new file mode 100644 index 000000000..32424882d --- /dev/null +++ b/src/main/java17/org/codehaus/plexus/archiver/Archiver.java @@ -0,0 +1,371 @@ +/** + * + * Copyright 2004 The Apache Software Foundation + * + * Licensed 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.codehaus.plexus.archiver; + +import javax.annotation.Nonnull; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.attribute.FileTime; +import java.util.Comparator; +import java.util.HashSet; +import java.util.Set; + +import org.codehaus.plexus.components.io.resources.PlexusIoResource; +import org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection; + +public interface Archiver { + + /** + * Default value for the dirmode attribute. + */ + int DEFAULT_DIR_MODE = UnixStat.DIR_FLAG | UnixStat.DEFAULT_DIR_PERM; + + /** + * Default value for the filemode attribute. + */ + int DEFAULT_FILE_MODE = UnixStat.FILE_FLAG | UnixStat.DEFAULT_FILE_PERM; + + /** + * Default value for the symlinkmode attribute. + */ + int DEFAULT_SYMLILNK_MODE = UnixStat.LINK_FLAG | UnixStat.DEFAULT_LINK_PERM; + + String DUPLICATES_ADD = "add"; + + String DUPLICATES_PRESERVE = "preserve"; + + String DUPLICATES_SKIP = "skip"; + + String DUPLICATES_FAIL = "fail"; + + Set DUPLICATES_VALID_BEHAVIORS = new HashSet() { + + private static final long serialVersionUID = 1L; + + { + add(DUPLICATES_ADD); + add(DUPLICATES_PRESERVE); + add(DUPLICATES_SKIP); + add(DUPLICATES_FAIL); + } + }; + + void createArchive() throws ArchiverException, IOException; + + /** + * Adds the given file set to the archive. + * + * @throws ArchiverException if adding the file set failed. + * @since 1.0-alpha-9 + */ + void addFileSet(@Nonnull FileSet fileSet) throws ArchiverException; + + /** + * Adds a modern file set specification to the archive. + * + * @param fileSetSpec the file set specification + * @throws ArchiverException if adding the file set failed + * @since 5.0.0 + */ + default void addFileSet(@Nonnull FileSetSpec fileSetSpec) throws ArchiverException { + addFileSet(fileSetSpec.toFileSet()); + } + + void addSymlink(String symlinkName, String symlinkDestination) throws ArchiverException; + + void addSymlink(String symlinkName, int permissions, String symlinkDestination) throws ArchiverException; + + void addFile(@Nonnull File inputFile, @Nonnull String destFileName) throws ArchiverException; + + void addFile(@Nonnull File inputFile, @Nonnull String destFileName, int permissions) throws ArchiverException; + + void addArchivedFileSet(ArchivedFileSet fileSet) throws ArchiverException; + + /** + * Adds a modern archived file set specification to the archive. + * + * @param fileSetSpec the archived file set specification + * @throws ArchiverException if adding the file set failed + * @since 5.0.0 + */ + default void addArchivedFileSet(@Nonnull ArchivedFileSetSpec fileSetSpec) throws ArchiverException { + addArchivedFileSet(fileSetSpec.toArchivedFileSet()); + } + + /** + * Adds the given archive file set to the archive. + * + * @param charset the encoding to use for filename encoding (e.g. for zip files) + * + * Stream transformers are supported on this method + * + * @since 1.0-alpha-9 + */ + void addArchivedFileSet(ArchivedFileSet fileSet, Charset charset) throws ArchiverException; + + /** + * Adds the given resource collection to the archive. + * + * Stream transformers are *not* supported on this method + * + * @since 1.0-alpha-10 + */ + void addResource(PlexusIoResource resource, String destFileName, int permissions) throws ArchiverException; + + /** + * Adds the given resource collection to the archive. + * + * Stream transformers are supported on this method + * + * @since 1.0-alpha-10 + */ + void addResources(PlexusIoResourceCollection resources) throws ArchiverException; + + File getDestFile(); + + void setDestFile(File destFile); + + void setFileMode(int mode); + + int getFileMode(); + + int getOverrideFileMode(); + + void setDefaultFileMode(int mode); + + int getDefaultFileMode(); + + /** + * This is the forced mode that should be used regardless if set, otherwise falls back to default. + * + * @param mode + */ + void setDirectoryMode(int mode); + + /** + * Gets the forced mode for directories, falling back to default if none is forced. + * + * @return + */ + int getDirectoryMode(); + + int getOverrideDirectoryMode(); + + /** + * This is the "default" value we should use if no other value is specified + * + * @param mode + */ + void setDefaultDirectoryMode(int mode); + + int getDefaultDirectoryMode(); + + boolean getIncludeEmptyDirs(); + + void setIncludeEmptyDirs(boolean includeEmptyDirs); + + void setDotFileDirectory(File dotFileDirectory); + + /** + * Returns an iterator over instances of {@link ArchiveEntry}, which have previously been added by calls to + * {@link #addResources(PlexusIoResourceCollection)}, {@link #addResource(PlexusIoResource, String, int)}, + * {@link #addFileSet(FileSet)}, etc. + * + * @since 1.0-alpha-10 + */ + @Nonnull + ResourceIterator getResources() throws ArchiverException; + + /** + *

+ * Returns, whether recreating the archive is forced (default). Setting this option to false means, that the + * archiver should compare the timestamps of included files with the timestamp of the target archive and rebuild the + * archive only, if the latter timestamp precedes the former timestamps. Checking for timestamps will typically + * offer a performance gain (in particular, if the following steps in a build can be suppressed, if an archive isn't + * recreated) on the cost that you get inaccurate results from time to time. In particular, removal of source files + * won't be detected. + *

+ *

+ * An archiver doesn't necessarily support checks for uptodate. If so, setting this option to true will simply be + * ignored. The method {@link #isSupportingForced()} may be called to check whether an archiver does support + * uptodate checks. + *

+ * + * @return true if the target archive should always be created; false otherwise + * + * @see #setForced(boolean) + * @see #isSupportingForced() + */ + boolean isForced(); + + /** + *

+ * Sets, whether recreating the archive is forced (default). Setting this option to false means, that the archiver + * should compare the timestamps of included files with the timestamp of the target archive and rebuild the archive + * only, if the latter timestamp precedes the former timestamps. Checking for timestamps will typically offer a + * performance gain (in particular, if the following steps in a build can be suppressed, if an archive isn't + * recreated) on the cost that you get inaccurate results from time to time. In particular, removal of source files + * won't be detected. + *

+ *

+ * An archiver doesn't necessarily support checks for uptodate. If so, setting this option to true will simply be + * ignored. The method {@link #isSupportingForced()} may be called to check whether an archiver does support + * uptodate checks. + *

+ * + * @param forced + * true, if the target archive should always be created; false otherwise + * + * @see #isForced() + * @see #isSupportingForced() + */ + void setForced(boolean forced); + + /** + * Returns, whether the archive supports uptodate checks. If so, you may set {@link #setForced(boolean)} to true. + * + * @return true, if the archiver does support uptodate checks, false otherwise + * + * @see #setForced(boolean) + * @see #isForced() + */ + boolean isSupportingForced(); + + /** + * Returns the behavior of this archiver when duplicate files are detected. + */ + String getDuplicateBehavior(); + + /** + * Set the behavior of this archiver when duplicate files are detected. One of:
+ *
    + *
  • add - Add the duplicates to the archive as duplicate entries
  • + *
  • skip/preserve - Leave the first entry encountered in the archive, skip the new one
  • + *
  • fail - throw an {@link ArchiverException}
  • + *
+ *
+ * See {@link Archiver#DUPLICATES_ADD}, {@link Archiver#DUPLICATES_SKIP}, {@link Archiver#DUPLICATES_PRESERVE}, + * {@link Archiver#DUPLICATES_FAIL}. + */ + void setDuplicateBehavior(String duplicate); + + /** + * @since 1.1 + */ + boolean isIgnorePermissions(); + + /** + * @since 1.1 + */ + void setIgnorePermissions(final boolean ignorePermissions); + + /** + * Sets the last modification time of the entries (if non null). + * + * @param lastModifiedTime to set in the archive entries + * + * @see #getLastModifiedTime() + * @since 4.3.0 + */ + void setLastModifiedTime(final FileTime lastModifiedTime); + + /** + * Returns the last modification time of the archiver. + * + * @return The last modification time of the archiver, null if not specified + * + * @see #setLastModifiedTime(FileTime) + * @since 4.3.0 + */ + FileTime getLastModifiedTime(); + + /** + * Set filename comparator, used to sort file entries when scanning directories since File.list() does not + * guarantee any order. + * + * @since 4.2.0 + */ + void setFilenameComparator(Comparator filenameComparator); + + /** + * @since 4.2.0 + */ + void setOverrideUid(int uid); + + /** + * @since 4.2.0 + */ + void setOverrideUserName(String userName); + + /** + * @since 4.2.0 + */ + int getOverrideUid(); + + /** + * @since 4.2.0 + */ + String getOverrideUserName(); + + /** + * @since 4.2.0 + */ + void setOverrideGid(int gid); + + /** + * @since 4.2.0 + */ + void setOverrideGroupName(String groupName); + + /** + * @since 4.2.0 + */ + int getOverrideGid(); + + /** + * @since 4.2.0 + */ + String getOverrideGroupName(); + + /** + * @since 4.7.0 + */ + void setUmask(int umask); + + /** + * @since 4.7.0 + */ + int getUmask(); + + /** + * Configure the archiver to create archives in a reproducible way (see + * Reproducible Builds). + *

This will configure: + *

    + *
  • reproducible archive entries order,
  • + *
  • defined entries timestamp
  • + *
+ * + * @param lastModifiedTime The last modification time of the entries + * + * @see Reproducible Builds + * @since 4.3.0 + */ + void configureReproducibleBuild(FileTime lastModifiedTime); +} diff --git a/src/main/java/org/codehaus/plexus/archivers/spi/ArchiverConfigurer.java b/src/main/java17/org/codehaus/plexus/archiver/ArchiverConfigurer.java similarity index 83% rename from src/main/java/org/codehaus/plexus/archivers/spi/ArchiverConfigurer.java rename to src/main/java17/org/codehaus/plexus/archiver/ArchiverConfigurer.java index 0b82cc92a..0fd20c64e 100644 --- a/src/main/java/org/codehaus/plexus/archivers/spi/ArchiverConfigurer.java +++ b/src/main/java17/org/codehaus/plexus/archiver/ArchiverConfigurer.java @@ -15,30 +15,25 @@ * */ -package org.codehaus.plexus.archivers.spi; +package org.codehaus.plexus.archiver; import java.nio.file.Path; import java.nio.file.attribute.FileTime; import java.util.Comparator; -import org.codehaus.plexus.archiver.ArchivedFileSet; -import org.codehaus.plexus.archiver.ArchivedFileSetSpec; -import org.codehaus.plexus.archiver.EmptyDirectoryHandling; -import org.codehaus.plexus.archiver.FileSet; -import org.codehaus.plexus.archiver.FileSetSpec; - /** * Configures content on an archiver without exposing its file set implementations. * * @since 5.0.0 */ public interface ArchiverConfigurer { - void addFileSet(FileSet fileSet); - + + static ArchiverConfigurer of(Archiver archiver) { + return new DefaultArchiverConfigurer(archiver); + } + void addFileSet(FileSetSpec fileSetSpec); - void addArchivedFileSet(ArchivedFileSet fileSet); - void addArchivedFileSet(ArchivedFileSetSpec fileSetSpec); void setDestFile(Path destFile); diff --git a/src/main/java/org/codehaus/plexus/archiver/CaseSensitivities.java b/src/main/java17/org/codehaus/plexus/archiver/CaseSensitivities.java similarity index 89% rename from src/main/java/org/codehaus/plexus/archiver/CaseSensitivities.java rename to src/main/java17/org/codehaus/plexus/archiver/CaseSensitivities.java index 1ef309df2..dd1794b34 100644 --- a/src/main/java/org/codehaus/plexus/archiver/CaseSensitivities.java +++ b/src/main/java17/org/codehaus/plexus/archiver/CaseSensitivities.java @@ -31,8 +31,8 @@ private CaseSensitivities() {} public static boolean resolve(CaseSensitivity caseSensitivity) { Objects.requireNonNull(caseSensitivity, "caseSensitivity"); - if (caseSensitivity instanceof FixedCaseSensitivity fixed) { - return fixed.caseSensitive; + if (caseSensitivity instanceof FixedCaseSensitivity) { + return ((FixedCaseSensitivity) caseSensitivity).caseSensitive; } String osName = System.getProperty("os.name", "").toLowerCase(Locale.ROOT); diff --git a/src/main/java/org/codehaus/plexus/archiver/CaseSensitivity.java b/src/main/java17/org/codehaus/plexus/archiver/CaseSensitivity.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/CaseSensitivity.java rename to src/main/java17/org/codehaus/plexus/archiver/CaseSensitivity.java diff --git a/src/main/java/org/codehaus/plexus/archivers/internal/DefaultArchiverConfigurer.java b/src/main/java17/org/codehaus/plexus/archiver/DefaultArchiverConfigurer.java similarity index 88% rename from src/main/java/org/codehaus/plexus/archivers/internal/DefaultArchiverConfigurer.java rename to src/main/java17/org/codehaus/plexus/archiver/DefaultArchiverConfigurer.java index a68f87560..f36dfb151 100644 --- a/src/main/java/org/codehaus/plexus/archivers/internal/DefaultArchiverConfigurer.java +++ b/src/main/java17/org/codehaus/plexus/archiver/DefaultArchiverConfigurer.java @@ -15,7 +15,7 @@ * */ -package org.codehaus.plexus.archivers.internal; +package org.codehaus.plexus.archiver; import java.nio.file.Path; import java.nio.file.attribute.FileTime; @@ -26,37 +26,27 @@ import org.codehaus.plexus.archiver.ArchivedFileSet; import org.codehaus.plexus.archiver.ArchivedFileSetSpec; import org.codehaus.plexus.archiver.Archiver; -import org.codehaus.plexus.archiver.EmptyDirectoryHandling; import org.codehaus.plexus.archiver.FileSet; import org.codehaus.plexus.archiver.FileSetSpec; -import org.codehaus.plexus.archivers.spi.ArchiveCreation; -import org.codehaus.plexus.archivers.spi.ArchiverConfigurer; -import org.codehaus.plexus.archivers.spi.DuplicateHandling; -import org.codehaus.plexus.archivers.spi.PermissionHandling; -import org.codehaus.plexus.archivers.spi.UnixPermissions; +import org.codehaus.plexus.archiver.ArchiverConfigurer; +import org.codehaus.plexus.archiver.ArchiveCreation; +import org.codehaus.plexus.archiver.DuplicateHandling; +import org.codehaus.plexus.archiver.EmptyDirectoryHandling; +import org.codehaus.plexus.archiver.PermissionHandling; +import org.codehaus.plexus.archiver.UnixPermissions; -public final class DefaultArchiverConfigurer implements ArchiverConfigurer { +final class DefaultArchiverConfigurer implements ArchiverConfigurer { private final Archiver archiver; - public DefaultArchiverConfigurer(Archiver archiver) { + DefaultArchiverConfigurer(Archiver archiver) { this.archiver = Objects.requireNonNull(archiver, "archiver"); } - @Override - public void addFileSet(FileSet fileSet) { - archiver.addFileSet(Objects.requireNonNull(fileSet, "fileSet")); - } - @Override public void addFileSet(FileSetSpec fileSetSpec) { archiver.addFileSet(Objects.requireNonNull(fileSetSpec, "fileSetSpec")); } - @Override - public void addArchivedFileSet(ArchivedFileSet fileSet) { - archiver.addArchivedFileSet(Objects.requireNonNull(fileSet, "fileSet")); - } - @Override public void addArchivedFileSet(ArchivedFileSetSpec fileSetSpec) { archiver.addArchivedFileSet(Objects.requireNonNull(fileSetSpec, "fileSetSpec")); diff --git a/src/main/java/org/codehaus/plexus/archiver/DefaultExcludes.java b/src/main/java17/org/codehaus/plexus/archiver/DefaultExcludes.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/DefaultExcludes.java rename to src/main/java17/org/codehaus/plexus/archiver/DefaultExcludes.java diff --git a/src/main/java/org/codehaus/plexus/archivers/internal/DefaultPlexusIoResourceCollectionConfigurer.java b/src/main/java17/org/codehaus/plexus/archiver/DefaultPlexusIoResourceCollectionConfigurer.java similarity index 93% rename from src/main/java/org/codehaus/plexus/archivers/internal/DefaultPlexusIoResourceCollectionConfigurer.java rename to src/main/java17/org/codehaus/plexus/archiver/DefaultPlexusIoResourceCollectionConfigurer.java index e64f96966..d97998334 100644 --- a/src/main/java/org/codehaus/plexus/archivers/internal/DefaultPlexusIoResourceCollectionConfigurer.java +++ b/src/main/java17/org/codehaus/plexus/archiver/DefaultPlexusIoResourceCollectionConfigurer.java @@ -15,7 +15,7 @@ * */ -package org.codehaus.plexus.archivers.internal; +package org.codehaus.plexus.archiver; import java.nio.charset.Charset; import java.nio.file.Path; @@ -26,8 +26,8 @@ import org.codehaus.plexus.archiver.CaseSensitivity; import org.codehaus.plexus.archiver.DefaultExcludes; import org.codehaus.plexus.archiver.EmptyDirectoryHandling; -import org.codehaus.plexus.archivers.spi.PlexusIoResourceCollectionConfigurer; -import org.codehaus.plexus.archivers.spi.SymbolicLinkHandling; +import org.codehaus.plexus.archiver.PlexusIoResourceCollectionConfigurer; +import org.codehaus.plexus.archiver.SymbolicLinkHandling; import org.codehaus.plexus.components.io.filemappers.FileMapper; import org.codehaus.plexus.components.io.fileselectors.FileSelector; import org.codehaus.plexus.components.io.functions.InputStreamTransformer; @@ -38,10 +38,10 @@ import org.codehaus.plexus.components.io.resources.PlexusIoFileResourceCollection; import org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection; -public final class DefaultPlexusIoResourceCollectionConfigurer implements PlexusIoResourceCollectionConfigurer { +final class DefaultPlexusIoResourceCollectionConfigurer implements PlexusIoResourceCollectionConfigurer { private final PlexusIoResourceCollection collection; - public DefaultPlexusIoResourceCollectionConfigurer(PlexusIoResourceCollection collection) { + DefaultPlexusIoResourceCollectionConfigurer(PlexusIoResourceCollection collection) { this.collection = Objects.requireNonNull(collection, "collection"); } diff --git a/src/main/java/org/codehaus/plexus/archivers/internal/DefaultUnArchiverConfigurer.java b/src/main/java17/org/codehaus/plexus/archiver/DefaultUnArchiverConfigurer.java similarity index 86% rename from src/main/java/org/codehaus/plexus/archivers/internal/DefaultUnArchiverConfigurer.java rename to src/main/java17/org/codehaus/plexus/archiver/DefaultUnArchiverConfigurer.java index 4c4ea593a..513b24095 100644 --- a/src/main/java/org/codehaus/plexus/archivers/internal/DefaultUnArchiverConfigurer.java +++ b/src/main/java17/org/codehaus/plexus/archiver/DefaultUnArchiverConfigurer.java @@ -15,23 +15,23 @@ * */ -package org.codehaus.plexus.archivers.internal; +package org.codehaus.plexus.archiver; import java.nio.file.Path; import java.util.List; import java.util.Objects; import org.codehaus.plexus.archiver.UnArchiver; -import org.codehaus.plexus.archivers.spi.ExistingFileHandling; -import org.codehaus.plexus.archivers.spi.PermissionHandling; -import org.codehaus.plexus.archivers.spi.UnArchiverConfigurer; +import org.codehaus.plexus.archiver.ExistingFileHandling; +import org.codehaus.plexus.archiver.PermissionHandling; +import org.codehaus.plexus.archiver.UnArchiverConfigurer; import org.codehaus.plexus.components.io.filemappers.FileMapper; import org.codehaus.plexus.components.io.fileselectors.FileSelector; -public final class DefaultUnArchiverConfigurer implements UnArchiverConfigurer { +final class DefaultUnArchiverConfigurer implements UnArchiverConfigurer { private final UnArchiver unarchiver; - public DefaultUnArchiverConfigurer(UnArchiver unarchiver) { + DefaultUnArchiverConfigurer(UnArchiver unarchiver) { this.unarchiver = Objects.requireNonNull(unarchiver, "unarchiver"); } diff --git a/src/main/java/org/codehaus/plexus/archivers/spi/DuplicateHandling.java b/src/main/java17/org/codehaus/plexus/archiver/DuplicateHandling.java similarity index 93% rename from src/main/java/org/codehaus/plexus/archivers/spi/DuplicateHandling.java rename to src/main/java17/org/codehaus/plexus/archiver/DuplicateHandling.java index 244ef9360..98ce25a82 100644 --- a/src/main/java/org/codehaus/plexus/archivers/spi/DuplicateHandling.java +++ b/src/main/java17/org/codehaus/plexus/archiver/DuplicateHandling.java @@ -15,9 +15,7 @@ * */ -package org.codehaus.plexus.archivers.spi; - -import org.codehaus.plexus.archiver.Archiver; +package org.codehaus.plexus.archiver; /** * Controls how duplicate archive entries are handled. diff --git a/src/main/java/org/codehaus/plexus/archiver/EmptyDirectoryHandling.java b/src/main/java17/org/codehaus/plexus/archiver/EmptyDirectoryHandling.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/EmptyDirectoryHandling.java rename to src/main/java17/org/codehaus/plexus/archiver/EmptyDirectoryHandling.java diff --git a/src/main/java/org/codehaus/plexus/archivers/spi/ExistingFileHandling.java b/src/main/java17/org/codehaus/plexus/archiver/ExistingFileHandling.java similarity index 81% rename from src/main/java/org/codehaus/plexus/archivers/spi/ExistingFileHandling.java rename to src/main/java17/org/codehaus/plexus/archiver/ExistingFileHandling.java index eb1d1ee1f..d7fed61b8 100644 --- a/src/main/java/org/codehaus/plexus/archivers/spi/ExistingFileHandling.java +++ b/src/main/java17/org/codehaus/plexus/archiver/ExistingFileHandling.java @@ -15,7 +15,7 @@ * */ -package org.codehaus.plexus.archivers.spi; +package org.codehaus.plexus.archiver; /** * Controls how extraction handles existing destination files. @@ -23,8 +23,8 @@ * @since 5.0.0 */ public sealed interface ExistingFileHandling permits FixedExistingFileHandling { - ExistingFileHandling OVERWRITE = new FixedExistingFileHandling(true); - ExistingFileHandling KEEP_NEWER = new FixedExistingFileHandling(false); + public static final ExistingFileHandling OVERWRITE = new FixedExistingFileHandling(true); + public static final ExistingFileHandling KEEP_NEWER = new FixedExistingFileHandling(false); } final class FixedExistingFileHandling implements ExistingFileHandling { diff --git a/src/main/java17/org/codehaus/plexus/archiver/FileSet.java b/src/main/java17/org/codehaus/plexus/archiver/FileSet.java new file mode 100644 index 000000000..c08a5f159 --- /dev/null +++ b/src/main/java17/org/codehaus/plexus/archiver/FileSet.java @@ -0,0 +1,29 @@ +package org.codehaus.plexus.archiver; + +import java.io.File; +import java.nio.file.Path; + +/** + * A file set, which consists of the files and directories in + * a common base directory. + * + * @since 1.0-alpha-9 + */ +public interface FileSet extends BaseFileSet { + + /** + * Creates a fluent file set specification. + * + * @param directory the file set base directory + * @return a file set for the directory + * @since 5.0.0 + */ + static FileSetSpec of(Path directory) { + return FileSetSpec.of(directory); + } + + /** + * Returns the file sets base directory. + */ + File getDirectory(); +} diff --git a/src/main/java/org/codehaus/plexus/archiver/FileSetSpec.java b/src/main/java17/org/codehaus/plexus/archiver/FileSetSpec.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/FileSetSpec.java rename to src/main/java17/org/codehaus/plexus/archiver/FileSetSpec.java diff --git a/src/main/java/org/codehaus/plexus/archivers/spi/PermissionHandling.java b/src/main/java17/org/codehaus/plexus/archiver/PermissionHandling.java similarity index 96% rename from src/main/java/org/codehaus/plexus/archivers/spi/PermissionHandling.java rename to src/main/java17/org/codehaus/plexus/archiver/PermissionHandling.java index cac175871..35f45b855 100644 --- a/src/main/java/org/codehaus/plexus/archivers/spi/PermissionHandling.java +++ b/src/main/java17/org/codehaus/plexus/archiver/PermissionHandling.java @@ -15,7 +15,7 @@ * */ -package org.codehaus.plexus.archivers.spi; +package org.codehaus.plexus.archiver; /** * Controls whether source permissions are preserved. diff --git a/src/main/java/org/codehaus/plexus/archivers/spi/PlexusIoResourceCollectionConfigurer.java b/src/main/java17/org/codehaus/plexus/archiver/PlexusIoResourceCollectionConfigurer.java similarity index 85% rename from src/main/java/org/codehaus/plexus/archivers/spi/PlexusIoResourceCollectionConfigurer.java rename to src/main/java17/org/codehaus/plexus/archiver/PlexusIoResourceCollectionConfigurer.java index 233c4557f..0b550e22a 100644 --- a/src/main/java/org/codehaus/plexus/archivers/spi/PlexusIoResourceCollectionConfigurer.java +++ b/src/main/java17/org/codehaus/plexus/archiver/PlexusIoResourceCollectionConfigurer.java @@ -15,18 +15,16 @@ * */ -package org.codehaus.plexus.archivers.spi; +package org.codehaus.plexus.archiver; import java.nio.charset.Charset; import java.nio.file.Path; import java.util.List; -import org.codehaus.plexus.archiver.CaseSensitivity; -import org.codehaus.plexus.archiver.DefaultExcludes; -import org.codehaus.plexus.archiver.EmptyDirectoryHandling; import org.codehaus.plexus.components.io.filemappers.FileMapper; import org.codehaus.plexus.components.io.fileselectors.FileSelector; import org.codehaus.plexus.components.io.functions.InputStreamTransformer; +import org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection; /** * Configures a Plexus IO resource collection before it is exposed to callers. @@ -34,6 +32,11 @@ * @since 5.0.0 */ public interface PlexusIoResourceCollectionConfigurer { + + static PlexusIoResourceCollectionConfigurer of(PlexusIoResourceCollection resourceCollection) { + return new DefaultPlexusIoResourceCollectionConfigurer(resourceCollection); + + } void setSource(Path source); void setPrefix(String prefix); diff --git a/src/main/java/org/codehaus/plexus/archivers/spi/SymbolicLinkHandling.java b/src/main/java17/org/codehaus/plexus/archiver/SymbolicLinkHandling.java similarity index 96% rename from src/main/java/org/codehaus/plexus/archivers/spi/SymbolicLinkHandling.java rename to src/main/java17/org/codehaus/plexus/archiver/SymbolicLinkHandling.java index 6843d14ab..c82561012 100644 --- a/src/main/java/org/codehaus/plexus/archivers/spi/SymbolicLinkHandling.java +++ b/src/main/java17/org/codehaus/plexus/archiver/SymbolicLinkHandling.java @@ -15,7 +15,7 @@ * */ -package org.codehaus.plexus.archivers.spi; +package org.codehaus.plexus.archiver; /** * Controls whether a filesystem resource collection follows symbolic links. diff --git a/src/main/java/org/codehaus/plexus/archivers/spi/UnArchiverConfigurer.java b/src/main/java17/org/codehaus/plexus/archiver/UnArchiverConfigurer.java similarity index 89% rename from src/main/java/org/codehaus/plexus/archivers/spi/UnArchiverConfigurer.java rename to src/main/java17/org/codehaus/plexus/archiver/UnArchiverConfigurer.java index 92fcbf217..5baed5d99 100644 --- a/src/main/java/org/codehaus/plexus/archivers/spi/UnArchiverConfigurer.java +++ b/src/main/java17/org/codehaus/plexus/archiver/UnArchiverConfigurer.java @@ -15,7 +15,7 @@ * */ -package org.codehaus.plexus.archivers.spi; +package org.codehaus.plexus.archiver; import java.nio.file.Path; import java.util.List; @@ -29,6 +29,11 @@ * @since 5.0.0 */ public interface UnArchiverConfigurer { + + static UnArchiverConfigurer of(UnArchiver unArchiver) { + return new DefaultUnArchiverConfigurer(unArchiver); + } + void setSource(Path source); void setDestinationDirectory(Path destinationDirectory); diff --git a/src/main/java/org/codehaus/plexus/archivers/spi/UnixPermissions.java b/src/main/java17/org/codehaus/plexus/archiver/UnixPermissions.java similarity index 97% rename from src/main/java/org/codehaus/plexus/archivers/spi/UnixPermissions.java rename to src/main/java17/org/codehaus/plexus/archiver/UnixPermissions.java index 60eaa1e4f..d629df7f4 100644 --- a/src/main/java/org/codehaus/plexus/archivers/spi/UnixPermissions.java +++ b/src/main/java17/org/codehaus/plexus/archiver/UnixPermissions.java @@ -15,7 +15,7 @@ * */ -package org.codehaus.plexus.archivers.spi; +package org.codehaus.plexus.archiver; import java.nio.file.attribute.PosixFilePermission; import java.util.Objects; diff --git a/src/main/java/org/codehaus/plexus/archiver/bzip2/BZip2ArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/bzip2/BZip2ArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/bzip2/BZip2ArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/bzip2/BZip2ArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/bzip2/BZip2UnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/bzip2/BZip2UnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/bzip2/BZip2UnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/bzip2/BZip2UnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/bzip2/PlexusIoBz2ResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/bzip2/PlexusIoBz2ResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/bzip2/PlexusIoBz2ResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/bzip2/PlexusIoBz2ResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/bzip2/PlexusIoBzip2ResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/bzip2/PlexusIoBzip2ResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/bzip2/PlexusIoBzip2ResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/bzip2/PlexusIoBzip2ResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/car/CarUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/car/CarUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/car/CarUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/car/CarUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/car/PlexusIoCarFileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/car/PlexusIoCarFileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/car/PlexusIoCarFileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/car/PlexusIoCarFileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/dir/DirectoryArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/dir/DirectoryArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/dir/DirectoryArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/dir/DirectoryArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/ear/EarArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/ear/EarArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/ear/EarArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/ear/EarArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/ear/EarUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/ear/EarUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/ear/EarUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/ear/EarUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/ear/PlexusIoEarFileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/ear/PlexusIoEarFileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/ear/PlexusIoEarFileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/ear/PlexusIoEarFileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/esb/EsbUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/esb/EsbUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/esb/EsbUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/esb/EsbUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/esb/PlexusIoEsbFileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/esb/PlexusIoEsbFileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/esb/PlexusIoEsbFileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/esb/PlexusIoEsbFileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/gzip/GZipArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/gzip/GZipArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/gzip/GZipArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/gzip/GZipArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/gzip/GZipUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/gzip/GZipUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/gzip/GZipUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/gzip/GZipUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/gzip/PlexusIoGzResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/gzip/PlexusIoGzResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/gzip/PlexusIoGzResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/gzip/PlexusIoGzResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/gzip/PlexusIoGzipResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/gzip/PlexusIoGzipResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/gzip/PlexusIoGzipResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/gzip/PlexusIoGzipResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/jar/JarArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/jar/JarArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/jar/JarArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/jar/JarArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/jar/JarToolModularJarArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/jar/JarToolModularJarArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/jar/JarToolModularJarArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/jar/JarToolModularJarArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/jar/JarUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/jar/JarUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/jar/JarUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/jar/JarUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/jar/PlexusIoJarFileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/jar/PlexusIoJarFileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/jar/PlexusIoJarFileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/jar/PlexusIoJarFileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archivers/internal/package-info.java b/src/main/java17/org/codehaus/plexus/archiver/manager/ArchiverFactory.java similarity index 53% rename from src/main/java/org/codehaus/plexus/archivers/internal/package-info.java rename to src/main/java17/org/codehaus/plexus/archiver/manager/ArchiverFactory.java index 6beca257b..f8429d5a0 100644 --- a/src/main/java/org/codehaus/plexus/archivers/internal/package-info.java +++ b/src/main/java17/org/codehaus/plexus/archiver/manager/ArchiverFactory.java @@ -15,7 +15,25 @@ * */ +package org.codehaus.plexus.archiver.manager; + +import java.util.function.Consumer; + +import org.codehaus.plexus.archiver.Archiver; +import org.codehaus.plexus.archiver.ArchiverConfigurer; + /** - * Internal implementations. This package must not be exported by the module descriptor. + * Creates configured archiver instances. + * + * @since 5.0.0 */ -package org.codehaus.plexus.archivers.internal; +@FunctionalInterface +public interface ArchiverFactory { + Archiver create(); + + default Archiver create(Consumer configurer) { + Archiver archiver = create(); + configurer.accept(ArchiverConfigurer.of(archiver)); + return archiver; + } +} diff --git a/src/main/java17/org/codehaus/plexus/archiver/manager/ArchiverManager.java b/src/main/java17/org/codehaus/plexus/archiver/manager/ArchiverManager.java new file mode 100644 index 000000000..5f29d7eac --- /dev/null +++ b/src/main/java17/org/codehaus/plexus/archiver/manager/ArchiverManager.java @@ -0,0 +1,104 @@ +/* + * Copyright 2001,2004 The Apache Software Foundation + * + * Licensed 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.codehaus.plexus.archiver.manager; + +import javax.annotation.Nonnull; + +import java.io.File; +import java.util.Collection; + +import org.codehaus.plexus.archiver.Archiver; +import org.codehaus.plexus.archiver.UnArchiver; +import org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection; + +public interface ArchiverManager { + @Nonnull + Archiver getArchiver(@Nonnull String archiverName) throws NoSuchArchiverException; + + /** + * Returns a factory for the named archive format. + * + * @since 5.0.0 + */ + @Nonnull + ArchiverFactory getArchiverFactory(@Nonnull String archiverName) throws NoSuchArchiverException; + + @Nonnull + Archiver getArchiver(@Nonnull File file) throws NoSuchArchiverException; + + /** + * Returns an archiver factory selected from the file extension. + * + * @since 5.0.0 + */ + @Nonnull + ArchiverFactory getArchiverFactory(@Nonnull File file) throws NoSuchArchiverException; + + @Nonnull + Collection getAvailableArchivers(); + + @Nonnull + UnArchiver getUnArchiver(@Nonnull String unArchiverName) throws NoSuchArchiverException; + + /** + * Returns a factory for the named archive extraction format. + * + * @since 5.0.0 + */ + @Nonnull + UnArchiverFactory getUnArchiverFactory(@Nonnull String unArchiverName) throws NoSuchArchiverException; + + @Nonnull + UnArchiver getUnArchiver(@Nonnull File file) throws NoSuchArchiverException; + + /** + * Returns an unarchiver factory selected from the file extension. + * + * @since 5.0.0 + */ + @Nonnull + UnArchiverFactory getUnArchiverFactory(@Nonnull File file) throws NoSuchArchiverException; + + @Nonnull + Collection getAvailableUnArchivers(); + + @Nonnull + PlexusIoResourceCollection getResourceCollection(@Nonnull File file) throws NoSuchArchiverException; + + /** + * Returns a resource collection factory selected from the file extension. + * + * @since 5.0.0 + */ + @Nonnull + PlexusIoResourceCollectionFactory getResourceCollectionFactory(@Nonnull File file) throws NoSuchArchiverException; + + @Nonnull + PlexusIoResourceCollection getResourceCollection(String unArchiverName) throws NoSuchArchiverException; + + /** + * Returns a resource collection factory for the named format. + * + * @since 5.0.0 + */ + @Nonnull + PlexusIoResourceCollectionFactory getResourceCollectionFactory(String resourceCollectionName) + throws NoSuchArchiverException; + + @Nonnull + Collection getAvailableResourceCollections(); +} diff --git a/src/main/java17/org/codehaus/plexus/archiver/manager/PlexusIoResourceCollectionFactory.java b/src/main/java17/org/codehaus/plexus/archiver/manager/PlexusIoResourceCollectionFactory.java new file mode 100644 index 000000000..35cf57770 --- /dev/null +++ b/src/main/java17/org/codehaus/plexus/archiver/manager/PlexusIoResourceCollectionFactory.java @@ -0,0 +1,39 @@ +/* + * Copyright MojoHaus and Contributors + * + * Licensed 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.codehaus.plexus.archiver.manager; + +import java.util.function.Consumer; + +import org.codehaus.plexus.archiver.PlexusIoResourceCollectionConfigurer; +import org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection; + +/** + * Creates configured Plexus IO resource collection instances. + * + * @since 5.0.0 + */ +@FunctionalInterface +public interface PlexusIoResourceCollectionFactory { + PlexusIoResourceCollection create(); + + default PlexusIoResourceCollection create(Consumer configurer) { + PlexusIoResourceCollection resourceCollection = create(); + configurer.accept(PlexusIoResourceCollectionConfigurer.of(resourceCollection)); + return resourceCollection; + } +} diff --git a/src/main/java17/org/codehaus/plexus/archiver/manager/ServiceLoaderArchiverManager.java b/src/main/java17/org/codehaus/plexus/archiver/manager/ServiceLoaderArchiverManager.java new file mode 100644 index 000000000..4e9c1ec10 --- /dev/null +++ b/src/main/java17/org/codehaus/plexus/archiver/manager/ServiceLoaderArchiverManager.java @@ -0,0 +1,105 @@ +/* + * Copyright MojoHaus and Contributors + * + * Licensed 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.codehaus.plexus.archiver.manager; + +import java.util.Map; +import java.util.ServiceLoader; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +import org.codehaus.plexus.archiver.Archiver; +import org.codehaus.plexus.archiver.ArchiverConfigurer; +import org.codehaus.plexus.archiver.PlexusIoResourceCollectionConfigurer; +import org.codehaus.plexus.archiver.UnArchiver; +import org.codehaus.plexus.archiver.UnArchiverConfigurer; +import org.codehaus.plexus.archivers.spi.ArchiverProvider; +import org.codehaus.plexus.archivers.spi.PlexusIoResourceCollectionProvider; +import org.codehaus.plexus.archivers.spi.UnArchiverProvider; +import org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection; + +public class ServiceLoaderArchiverManager extends AbstractArchiverManager { + + public ServiceLoaderArchiverManager() { + super(archivers(), unarchivers(), plexusIoResourceCollections()); + } + + private static Map archivers() { + return StreamSupport.stream(ServiceLoader.load(ArchiverProvider.class).spliterator(), false) + .collect(Collectors.toMap(ArchiverProvider::getName, ServiceLoaderArchiverManager::toArchiverFactory)); + } + + private static Map unarchivers() { + return StreamSupport.stream(ServiceLoader.load(UnArchiverProvider.class).spliterator(), false) + .collect(Collectors.toMap(UnArchiverProvider::getName, ServiceLoaderArchiverManager::toUnArchiverFactory)); + } + + private static Map plexusIoResourceCollections() { + return StreamSupport.stream( + ServiceLoader.load(PlexusIoResourceCollectionProvider.class) + .spliterator(), + false) + .collect(Collectors.toMap( + PlexusIoResourceCollectionProvider::getName, + ServiceLoaderArchiverManager::toPlexusIoResourceCollectionFactory)); + } + + + private static ArchiverFactory toArchiverFactory(ArchiverProvider provider) { + return new ArchiverFactory() { + + @Override + public Archiver create() { + return create(c -> {}); + } + + public Archiver create(Consumer configurer) { + return provider.newArchiver(configurer); + } + }; + } + + private static UnArchiverFactory toUnArchiverFactory(UnArchiverProvider provider) { + return new UnArchiverFactory() { + + @Override + public UnArchiver create() { + return create(c -> {}); + } + + public UnArchiver create(Consumer configurer) { + return provider.newUnArchiver(configurer); + } + }; + } + + private static PlexusIoResourceCollectionFactory toPlexusIoResourceCollectionFactory(PlexusIoResourceCollectionProvider provider) { + return new PlexusIoResourceCollectionFactory() { + + @Override + public PlexusIoResourceCollection create() { + return create(c -> {}); + } + + public PlexusIoResourceCollection create(Consumer configurer) { + return provider.newPlexusIoResourceCollection(configurer); + } + }; + } + +} diff --git a/src/main/java17/org/codehaus/plexus/archiver/manager/UnArchiverFactory.java b/src/main/java17/org/codehaus/plexus/archiver/manager/UnArchiverFactory.java new file mode 100644 index 000000000..3a8261fcb --- /dev/null +++ b/src/main/java17/org/codehaus/plexus/archiver/manager/UnArchiverFactory.java @@ -0,0 +1,39 @@ +/* + * Copyright MojoHaus and Contributors + * + * Licensed 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.codehaus.plexus.archiver.manager; + +import java.util.function.Consumer; + +import org.codehaus.plexus.archiver.UnArchiver; +import org.codehaus.plexus.archiver.UnArchiverConfigurer; + +/** + * Creates configured unarchiver instances. + * + * @since 5.0.0 + */ +@FunctionalInterface +public interface UnArchiverFactory { + UnArchiver create(); + + default UnArchiver create(Consumer configurer) { + UnArchiver unArchiver = create(); + configurer.accept(UnArchiverConfigurer.of(unArchiver)); + return unArchiver; + } +} diff --git a/src/main/java/org/codehaus/plexus/archiver/nar/NarUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/nar/NarUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/nar/NarUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/nar/NarUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/nar/PlexusIoNarFileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/nar/PlexusIoNarFileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/nar/PlexusIoNarFileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/nar/PlexusIoNarFileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/par/ParUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/par/ParUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/par/ParUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/par/ParUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/par/PlexusIoParFileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/par/PlexusIoParFileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/par/PlexusIoParFileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/par/PlexusIoParFileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/rar/PlexusIoRarFileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/rar/PlexusIoRarFileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/rar/PlexusIoRarFileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/rar/PlexusIoRarFileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/rar/RarArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/rar/RarArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/rar/RarArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/rar/RarArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/rar/RarUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/rar/RarUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/rar/RarUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/rar/RarUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/resources/DefaultPlexusIoFileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/resources/DefaultPlexusIoFileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/resources/DefaultPlexusIoFileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/resources/DefaultPlexusIoFileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/resources/PlexusIoFileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/resources/PlexusIoFileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/resources/PlexusIoFileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/resources/PlexusIoFileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/sar/PlexusIoSarFileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/sar/PlexusIoSarFileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/sar/PlexusIoSarFileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/sar/PlexusIoSarFileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/sar/SarUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/sar/SarUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/sar/SarUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/sar/SarUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/snappy/PlexusIoSnappyResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/snappy/PlexusIoSnappyResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/snappy/PlexusIoSnappyResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/snappy/PlexusIoSnappyResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/snappy/SnappyArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/snappy/SnappyArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/snappy/SnappyArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/snappy/SnappyArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/snappy/SnappyUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/snappy/SnappyUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/snappy/SnappyUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/snappy/SnappyUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/swc/PlexusIoSwcFileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/swc/PlexusIoSwcFileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/swc/PlexusIoSwcFileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/swc/PlexusIoSwcFileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/swc/SwcUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/swc/SwcUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/swc/SwcUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/swc/SwcUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/PlexusIoTBZ2FileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/PlexusIoTBZ2FileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/PlexusIoTBZ2FileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/PlexusIoTBZ2FileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/PlexusIoTGZFileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/PlexusIoTGZFileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/PlexusIoTGZFileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/PlexusIoTGZFileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/PlexusIoTXZFileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/PlexusIoTXZFileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/PlexusIoTXZFileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/PlexusIoTXZFileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/PlexusIoTZstdFileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/PlexusIoTZstdFileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/PlexusIoTZstdFileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/PlexusIoTZstdFileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/PlexusIoTarBZip2FileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/PlexusIoTarBZip2FileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/PlexusIoTarBZip2FileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/PlexusIoTarBZip2FileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/PlexusIoTarFileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/PlexusIoTarFileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/PlexusIoTarFileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/PlexusIoTarFileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/PlexusIoTarGZipFileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/PlexusIoTarGZipFileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/PlexusIoTarGZipFileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/PlexusIoTarGZipFileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/PlexusIoTarSnappyFileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/PlexusIoTarSnappyFileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/PlexusIoTarSnappyFileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/PlexusIoTarSnappyFileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/PlexusIoTarXZFileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/PlexusIoTarXZFileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/PlexusIoTarXZFileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/PlexusIoTarXZFileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/PlexusIoTarZstdFileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/PlexusIoTarZstdFileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/PlexusIoTarZstdFileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/PlexusIoTarZstdFileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/TBZ2ArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/TBZ2ArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/TBZ2ArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/TBZ2ArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/TBZ2UnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/TBZ2UnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/TBZ2UnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/TBZ2UnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/TGZArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/TGZArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/TGZArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/TGZArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/TGZUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/TGZUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/TGZUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/TGZUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/TXZArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/TXZArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/TXZArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/TXZArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/TXZUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/TXZUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/TXZUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/TXZUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/TZstdArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/TZstdArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/TZstdArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/TZstdArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/TZstdUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/TZstdUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/TZstdUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/TZstdUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/TarArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/TarArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/TarArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/TarArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/TarBZip2ArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/TarBZip2ArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/TarBZip2ArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/TarBZip2ArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/TarBZip2UnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/TarBZip2UnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/TarBZip2UnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/TarBZip2UnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/TarGZipArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/TarGZipArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/TarGZipArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/TarGZipArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/TarGZipUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/TarGZipUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/TarGZipUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/TarGZipUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/TarSnappyArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/TarSnappyArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/TarSnappyArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/TarSnappyArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/TarSnappyUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/TarSnappyUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/TarSnappyUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/TarSnappyUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/TarUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/TarUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/TarUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/TarUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/TarXZArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/TarXZArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/TarXZArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/TarXZArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/TarXZUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/TarXZUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/TarXZUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/TarXZUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/TarZstdArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/TarZstdArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/TarZstdArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/TarZstdArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/TarZstdUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/tar/TarZstdUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/tar/TarZstdUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/tar/TarZstdUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/war/PlexusIoWarFileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/war/PlexusIoWarFileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/war/PlexusIoWarFileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/war/PlexusIoWarFileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/war/WarArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/war/WarArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/war/WarArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/war/WarArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/war/WarUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/war/WarUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/war/WarUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/war/WarUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/xz/PlexusIoXZResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/xz/PlexusIoXZResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/xz/PlexusIoXZResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/xz/PlexusIoXZResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/xz/XZArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/xz/XZArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/xz/XZArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/xz/XZArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/xz/XZUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/xz/XZUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/xz/XZUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/xz/XZUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/zip/PlexusArchiverZipFileResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/zip/PlexusArchiverZipFileResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/zip/PlexusArchiverZipFileResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/zip/PlexusArchiverZipFileResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/zip/ZipArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/zip/ZipArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/zip/ZipArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/zip/ZipArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/zip/ZipUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/zip/ZipUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/zip/ZipUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/zip/ZipUnArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/zstd/PlexusIoZstdResourceCollectionProvider.java b/src/main/java17/org/codehaus/plexus/archiver/zstd/PlexusIoZstdResourceCollectionProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/zstd/PlexusIoZstdResourceCollectionProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/zstd/PlexusIoZstdResourceCollectionProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/zstd/ZstdArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/zstd/ZstdArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/zstd/ZstdArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/zstd/ZstdArchiverProvider.java diff --git a/src/main/java/org/codehaus/plexus/archiver/zstd/ZstdUnArchiverProvider.java b/src/main/java17/org/codehaus/plexus/archiver/zstd/ZstdUnArchiverProvider.java similarity index 100% rename from src/main/java/org/codehaus/plexus/archiver/zstd/ZstdUnArchiverProvider.java rename to src/main/java17/org/codehaus/plexus/archiver/zstd/ZstdUnArchiverProvider.java diff --git a/src/test/java/org/codehaus/plexus/archiver/TestSupport.java b/src/test/java/org/codehaus/plexus/archiver/TestSupport.java index 168a05acd..0b2d65d31 100644 --- a/src/test/java/org/codehaus/plexus/archiver/TestSupport.java +++ b/src/test/java/org/codehaus/plexus/archiver/TestSupport.java @@ -2,6 +2,7 @@ import java.io.File; import java.nio.file.Path; +import java.nio.file.Paths; import org.eclipse.sisu.launch.InjectedTest; import org.junit.jupiter.api.AfterEach; @@ -24,7 +25,7 @@ public void tearDown() throws Exception { } private static Path basedir() { - return Path.of(System.getProperty("basedir", (new File("")).getAbsolutePath())); + return Paths.get(System.getProperty("basedir", (new File("")).getAbsolutePath())); } protected static File getTestFile(final String path) { diff --git a/src/test/java/org/codehaus/plexus/archiver/jar/BaseJarArchiverTest.java b/src/test/java/org/codehaus/plexus/archiver/jar/BaseJarArchiverTest.java index 51f0b1495..832b76299 100644 --- a/src/test/java/org/codehaus/plexus/archiver/jar/BaseJarArchiverTest.java +++ b/src/test/java/org/codehaus/plexus/archiver/jar/BaseJarArchiverTest.java @@ -19,7 +19,7 @@ import java.io.File; import java.io.InputStream; import java.nio.file.Files; -import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Calendar; import java.util.Enumeration; import java.util.Locale; @@ -63,7 +63,7 @@ void createJar() throws Exception { ZipEntry classFileEntry = resultingArchive.getEntry("com/example/app/Main.class"); InputStream resultingClassFile = resultingArchive.getInputStream(classFileEntry); InputStream originalClassFile = - Files.newInputStream(Path.of("src/test/resources/java-classes/com/example/app/Main.class")); + Files.newInputStream(Paths.get("src/test/resources/java-classes/com/example/app/Main.class")); assertTrue(IOUtil.contentEquals(originalClassFile, resultingClassFile)); } diff --git a/src/test/java/org/codehaus/plexus/archiver/jar/JarToolModularJarArchiverTest.java b/src/test/java/org/codehaus/plexus/archiver/jar/JarToolModularJarArchiverTest.java index 023061297..b40a4ba5c 100644 --- a/src/test/java/org/codehaus/plexus/archiver/jar/JarToolModularJarArchiverTest.java +++ b/src/test/java/org/codehaus/plexus/archiver/jar/JarToolModularJarArchiverTest.java @@ -18,7 +18,8 @@ import java.io.File; import java.io.InputStream; -import java.lang.module.ModuleDescriptor; +import java.lang.reflect.Method; +import java.nio.file.Paths; import java.nio.file.attribute.FileTime; import java.text.SimpleDateFormat; import java.util.Arrays; @@ -29,11 +30,14 @@ import java.util.zip.ZipFile; import org.codehaus.plexus.archiver.ArchiverException; -import org.codehaus.plexus.archiver.util.DefaultFileSet; +import org.codehaus.plexus.archiver.FileSet; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledIf; +import org.junit.jupiter.api.condition.EnabledIf; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; class JarToolModularJarArchiverTest extends BaseJarArchiverTest { @@ -50,15 +54,16 @@ void setup() throws Exception { archiver = getJarArchiver(); archiver.setDestFile(jarFile); - archiver.addFileSet(DefaultFileSet.fileSet(new File("src/test/resources/java-classes"))); + archiver.addFileSet(FileSet.of(Paths.get("src/test/resources/java-classes"))); } /* * Verify that the main class and the version are properly set for a modular JAR file. */ @Test + @EnabledIf("modulesAreSupported") void modularJarWithMainClassAndVersion() throws Exception { - archiver.addFileSet(DefaultFileSet.fileSet(new File("src/test/resources/java-module-descriptor"))); + archiver.addFileSet(FileSet.of(Paths.get("src/test/resources/java-module-descriptor"))); archiver.setModuleVersion("1.0.0"); archiver.setModuleMainClass("com.example.app.Main"); @@ -75,8 +80,9 @@ void modularJarWithMainClassAndVersion() throws Exception { * value is overridden */ @Test + @EnabledIf("modulesAreSupported") void modularJarWithManifestAndModuleMainClass() throws Exception { - archiver.addFileSet(DefaultFileSet.fileSet(new File("src/test/resources/java-module-descriptor"))); + archiver.addFileSet(FileSet.of(Paths.get("src/test/resources/java-module-descriptor"))); Manifest manifest = new Manifest(); manifest.addConfiguredAttribute(new Manifest.Attribute("Main-Class", "com.example.app.Main2")); archiver.addConfiguredManifest(manifest); @@ -96,8 +102,9 @@ void modularJarWithManifestAndModuleMainClass() throws Exception { * the manifest main class attribute (if present) is used instead */ @Test + @EnabledIf("modulesAreSupported") void modularJarWithManifestMainClassAttribute() throws Exception { - archiver.addFileSet(DefaultFileSet.fileSet(new File("src/test/resources/java-module-descriptor"))); + archiver.addFileSet(FileSet.of(Paths.get("src/test/resources/java-module-descriptor"))); Manifest manifest = new Manifest(); manifest.addConfiguredAttribute(new Manifest.Attribute("Main-Class", "com.example.app.Main2")); archiver.addConfiguredManifest(manifest); @@ -114,8 +121,9 @@ void modularJarWithManifestMainClassAttribute() throws Exception { * Verify that a modular JAR file is created even when no additional attributes are set. */ @Test + @EnabledIf("modulesAreSupported") void modularJar() throws Exception { - archiver.addFileSet(DefaultFileSet.fileSet(new File("src/test/resources/java-module-descriptor"))); + archiver.addFileSet(FileSet.of(Paths.get("src/test/resources/java-module-descriptor"))); archiver.createArchive(); // verify that the proper version and main class are set @@ -126,20 +134,41 @@ void modularJar() throws Exception { * Verify that exception is thrown when the modular JAR is not valid. */ @Test + @EnabledIf("modulesAreSupported") void invalidModularJar() throws Exception { - archiver.addFileSet(DefaultFileSet.fileSet(new File("src/test/resources/java-module-descriptor"))); + archiver.addFileSet(FileSet.of(Paths.get("src/test/resources/java-module-descriptor"))); // Not a valid version archiver.setModuleVersion("notAValidVersion"); assertThrows(ArchiverException.class, () -> archiver.createArchive()); } + /* + * Verify that modular JAR files could be created even + * if the Java version does not support modules. + */ + @Test + @DisabledIf("modulesAreSupported") + void modularJarPriorJava9() throws Exception { + archiver.addFileSet(FileSet.of(Paths.get("src/test/resources/java-module-descriptor"))); + archiver.setModuleVersion("1.0.0"); + archiver.setModuleMainClass("com.example.app.Main"); + + archiver.createArchive(); + + // verify that the modular jar is created + try (ZipFile resultingArchive = new ZipFile(archiver.getDestFile())) { + assertNotNull(resultingArchive.getEntry("module-info.class")); + } + } + /* * Verify that the compression flag is respected. */ @Test + @EnabledIf("modulesAreSupported") void noCompression() throws Exception { - archiver.addFileSet(DefaultFileSet.fileSet(new File("src/test/resources/java-module-descriptor"))); + archiver.addFileSet(FileSet.of(Paths.get("src/test/resources/java-module-descriptor"))); archiver.setCompress(false); archiver.createArchive(); @@ -161,8 +190,9 @@ void noCompression() throws Exception { * is kept after it is updated to modular JAR file. */ @Test + @EnabledIf("modulesAreSupported") void compression() throws Exception { - archiver.addFileSet(DefaultFileSet.fileSet(new File("src/test/resources/java-module-descriptor"))); + archiver.addFileSet(FileSet.of(Paths.get("src/test/resources/java-module-descriptor"))); archiver.addFile(new File("src/test/jars/test.jar"), "META-INF/lib/test.jar"); archiver.setRecompressAddedZips(false); @@ -186,6 +216,7 @@ void compression() throws Exception { * Verify that a module descriptor in the versioned area is handled correctly. */ @Test + @EnabledIf("modulesAreSupported") void modularMultiReleaseJar() throws Exception { // Add two module-info.class, one on the root and one on the multi-release dir. archiver.addFile( @@ -271,11 +302,35 @@ private void assertModuleDescriptor( String expectedMainClass, String... expectedPackages) throws Exception { - ModuleDescriptor moduleDescriptor = ModuleDescriptor.read(moduleDescriptorInputStream); + // ModuleDescriptor methods are available from Java 9 so let's get by reflection + Class moduleDescriptorClass = Class.forName("java.lang.module.ModuleDescriptor"); + Class optionalClass = Class.forName("java.util.Optional"); + Method readMethod = moduleDescriptorClass.getMethod("read", InputStream.class); + Method mainClassMethod = moduleDescriptorClass.getMethod("mainClass"); + Method rawVersionMethod = moduleDescriptorClass.getMethod("rawVersion"); + Method packagesMethod = moduleDescriptorClass.getMethod("packages"); + Method isPresentMethod = optionalClass.getMethod("isPresent"); + Method getMethod = optionalClass.getMethod("get"); + + // Read the module from the input stream + Object moduleDescriptor = readMethod.invoke(null, moduleDescriptorInputStream); + + // Get the module main class + Object mainClassOptional = mainClassMethod.invoke(moduleDescriptor); + String actualMainClass = null; + if ((boolean) isPresentMethod.invoke(mainClassOptional)) { + actualMainClass = (String) getMethod.invoke(mainClassOptional); + } - String actualMainClass = moduleDescriptor.mainClass().orElse(null); - String actualVersion = moduleDescriptor.rawVersion().orElse(null); - Set actualPackagesSet = moduleDescriptor.packages(); + // Get the module version + Object versionOptional = rawVersionMethod.invoke(moduleDescriptor); + String actualVersion = null; + if ((boolean) isPresentMethod.invoke(versionOptional)) { + actualVersion = (String) getMethod.invoke(versionOptional); + } + + // Get the module packages + Set actualPackagesSet = (Set) packagesMethod.invoke(moduleDescriptor); Set expectedPackagesSet = new HashSet<>(Arrays.asList(expectedPackages)); assertEquals(expectedMainClass, actualMainClass); @@ -295,4 +350,17 @@ private void assertManifestMainClass(File jarFile, String expectedMainClass) thr assertEquals(expectedMainClass, actualManifestMainClass); } } + + /* + * Returns true if the current version of Java does support modules. + */ + private boolean modulesAreSupported() { + try { + Class.forName("java.lang.module.ModuleDescriptor"); + } catch (ClassNotFoundException e) { + return false; + } + + return true; + } } diff --git a/src/test/java/org/codehaus/plexus/archiver/manager/ArchiverManagerTest.java b/src/test/java/org/codehaus/plexus/archiver/manager/ArchiverManagerTest.java index d61ee2caa..96fd84858 100644 --- a/src/test/java/org/codehaus/plexus/archiver/manager/ArchiverManagerTest.java +++ b/src/test/java/org/codehaus/plexus/archiver/manager/ArchiverManagerTest.java @@ -24,14 +24,14 @@ package org.codehaus.plexus.archiver.manager; import java.io.File; +import java.nio.file.Paths; import java.util.stream.Collectors; import java.util.stream.Stream; import org.codehaus.plexus.archiver.Archiver; +import org.codehaus.plexus.archiver.FileSet; import org.codehaus.plexus.archiver.TestSupport; import org.codehaus.plexus.archiver.UnArchiver; -import org.codehaus.plexus.archiver.util.DefaultFileSet; -import org.codehaus.plexus.components.io.resources.AbstractPlexusIoArchiveResourceCollection; import org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -107,7 +107,7 @@ void reuseArchiver() throws Exception { Archiver archiver = manager.getArchiver("jar"); assertNotNull(archiver); - archiver.addFileSet(DefaultFileSet.fileSet(new File(getBasedir()))); + archiver.addFileSet(FileSet.of(Paths.get(getBasedir()))); Archiver newArchiver = manager.getArchiver("jar"); assertNotNull(newArchiver); @@ -168,33 +168,6 @@ void lookupResourceCollection(String resourceName) throws Exception { assertThat(resourceCollection).isNotNull(); } - @Test - void configuredLookups() throws Exception { - ArchiverManager manager = lookup(ArchiverManager.class); - File archiveFile = getTestFile("target/configured-manager/archive.zip"); - File outputDirectory = getTestFile("target/configured-manager/output"); - - ArchiverFactory archiverFactory = manager.getArchiverFactory("zip"); - Archiver archiver = archiverFactory.create(configurer -> configurer.setDestFile(archiveFile.toPath())); - Archiver secondArchiver = archiverFactory.create(configurer -> {}); - UnArchiver unarchiver = manager.getUnArchiverFactory(archiveFile).create(configurer -> { - configurer.setSource(archiveFile.toPath()); - configurer.setDestinationDirectory(outputDirectory.toPath()); - }); - AbstractPlexusIoArchiveResourceCollection resourceCollection = (AbstractPlexusIoArchiveResourceCollection) - manager.getResourceCollectionFactory(archiveFile).create(configurer -> { - configurer.setSource(archiveFile.toPath()); - configurer.setPrefix("content/"); - }); - - assertThat(archiver.getDestFile()).isEqualTo(archiveFile); - assertThat(secondArchiver).isNotSameAs(archiver); - assertThat(unarchiver.getSourceFile()).isEqualTo(archiveFile); - assertThat(unarchiver.getDestDirectory()).isEqualTo(outputDirectory); - assertThat(resourceCollection.getFile()).isEqualTo(archiveFile); - assertThat(resourceCollection.getPrefix()).isEqualTo("content/"); - } - @Test void lookupUnknownArchiver() { ArchiverManager manager = lookup(ArchiverManager.class);