name.remal.gradle_plugins.toolkit.FileTreeElementUtils Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of toolkit Show documentation
Show all versions of toolkit Show documentation
Remal Gradle plugins: toolkit: toolkit
package name.remal.gradle_plugins.toolkit;
import static java.util.Arrays.asList;
import static java.util.Collections.unmodifiableSet;
import static java.util.stream.Collectors.toCollection;
import static lombok.AccessLevel.PRIVATE;
import static name.remal.gradle_plugins.toolkit.reflection.ReflectionUtils.tryLoadClass;
import static name.remal.gradle_plugins.toolkit.reflection.ReflectionUtils.unwrapGeneratedSubclass;
import java.util.LinkedHashSet;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Stream;
import lombok.NoArgsConstructor;
import lombok.val;
import name.remal.gradle_plugins.toolkit.annotations.ReliesOnInternalGradleApi;
import org.gradle.api.file.FileTreeElement;
import org.jetbrains.annotations.VisibleForTesting;
@NoArgsConstructor(access = PRIVATE)
public abstract class FileTreeElementUtils {
@ReliesOnInternalGradleApi
@VisibleForTesting
static final Set> ABSTRACT_ARCHIVE_FILE_TREE_CLASSES = Stream.of(
tryLoadClass("org.gradle.api.internal.file.archive.AbstractArchiveFileTree"),
tryLoadClass("org.gradle.api.internal.file.collections.FileSystemMirroringFileTree")
)
.filter(Objects::nonNull)
.collect(toCollection(LinkedHashSet::new));
private static final Set ARCHIVE_FILE_TREE_SIMPLE_CLASS_NAMES = unmodifiableSet(new LinkedHashSet<>(asList(
// supported by Gradle natively:
"TarFileTree",
"ZipFileTree",
// supported by https://github.com/freefair/gradle-plugins/:
"ArFileTree",
"ArchiveFileTree",
"ArjFileTree",
"DumpFileTree",
"SevenZipFileTree"
)));
public static boolean isArchiveEntry(FileTreeElement details) {
val detailsClass = unwrapGeneratedSubclass(details.getClass());
val enclosingClass = detailsClass.getEnclosingClass();
if (enclosingClass == null) {
return false;
}
val isArchive = ABSTRACT_ARCHIVE_FILE_TREE_CLASSES.contains(enclosingClass)
|| ARCHIVE_FILE_TREE_SIMPLE_CLASS_NAMES.contains(enclosingClass.getSimpleName());
return isArchive;
}
public static boolean isNotArchiveEntry(FileTreeElement details) {
return !isArchiveEntry(details);
}
}