package net.bytebuddy.build.gradle; import lombok.EqualsAndHashCode; import java.io.File; import java.util.Iterator; /** * An abstract base class for a user configuration implying a class path. */ public class AbstractUserConfiguration { /** * The class to use for this configuration path or {@code null} if no class path is specified. */ private Iterable<File> classPath; /** * Returns the class path or builds a class path from the supplied arguments if no class path was set. * * @param root The root directory of the project being built. * @param classPath The class path dependencies. * @return An iterable of all elements of the class path to be used. */ public Iterable<? extends File> getClassPath(File root, Iterable<? extends File> classPath) { return this.classPath == null ? new PrefixIterable(root, classPath) : this.classPath; } /** * Sets the class path to use for this configuration. * * @param classPath The class path to use. */ public void setClassPath(Iterable<File> classPath) { this.classPath = classPath; } /** * An iterable with a single {@link File} element prepended. */ @EqualsAndHashCode protected static class PrefixIterable implements Iterable<File> { /** * The prefixed file. */ private final File file; /** * The iterable containing the reminder files. */ private final Iterable<? extends File> files; /** * @param file The prefixed file. * @param files The iterable containing the reminder files. */ protected PrefixIterable(File file, Iterable<? extends File> files) { this.file = file; this.files = files; } @Override public Iterator<File> iterator() { return new PrefixIterator(file, files.iterator()); } @Override public String toString() { return "AbstractUserConfiguration.PrefixIterable{" + "file=" + file + ", files=" + files + '}'; } /** * An iterator with a single prefixed file. */ protected static class PrefixIterator implements Iterator<File> { /** * The file being prefixed. */ private final File file; /** * An iterator over the reminind files. */ private final Iterator<? extends File> files; /** * {@code true} if the prefix was not yet returned from the iteration. */ private boolean first; /** * Creates a prefix iterator. * * @param file The file being prefixed. * @param files An iterator over the reminind files. */ protected PrefixIterator(File file, Iterator<? extends File> files) { this.file = file; this.files = files; first = true; } @Override public boolean hasNext() { return first || files.hasNext(); } @Override public File next() { if (first) { first = false; return file; } else { return files.next(); } } @Override public void remove() { throw new UnsupportedOperationException("Cannot remove file from iterator"); } @Override public String toString() { return "AbstractUserConfiguration.PrefixIterable.PrefixIterator{" + "file=" + file + ", files=" + files + ", first=" + first + '}'; } } } }