http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/DirectoryScanner.java ---------------------------------------------------------------------- diff --git a/src/main/org/apache/tools/ant/DirectoryScanner.java b/src/main/org/apache/tools/ant/DirectoryScanner.java index 6b52897..f4c26f6 100644 --- a/src/main/org/apache/tools/ant/DirectoryScanner.java +++ b/src/main/org/apache/tools/ant/DirectoryScanner.java @@ -22,13 +22,17 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.Deque; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.Vector; +import java.util.function.Predicate; +import java.util.stream.Stream; import org.apache.tools.ant.taskdefs.condition.Os; import org.apache.tools.ant.types.Resource; @@ -39,7 +43,6 @@ import org.apache.tools.ant.types.selectors.SelectorScanner; import org.apache.tools.ant.types.selectors.SelectorUtils; import org.apache.tools.ant.types.selectors.TokenizedPath; import org.apache.tools.ant.types.selectors.TokenizedPattern; -import org.apache.tools.ant.util.CollectionUtils; import org.apache.tools.ant.util.FileUtils; import org.apache.tools.ant.util.SymbolicLinkUtils; import org.apache.tools.ant.util.VectorSet; @@ -217,7 +220,7 @@ public class DirectoryScanner * * @see #addDefaultExcludes() */ - private static final Set<String> defaultExcludes = new HashSet<String>(); + private static final Set<String> defaultExcludes = new HashSet<>(); static { resetDefaultExcludes(); } @@ -310,7 +313,7 @@ public class DirectoryScanner * * @since Ant 1.6 */ - private final Set<String> scannedDirs = new HashSet<String>(); + private final Set<String> scannedDirs = new HashSet<>(); /** * Map of all include patterns that are full file names and don't @@ -327,7 +330,7 @@ public class DirectoryScanner * * @since Ant 1.8.0 */ - private final Map<String, TokenizedPath> includeNonPatterns = new HashMap<String, TokenizedPath>(); + private final Map<String, TokenizedPath> includeNonPatterns = new HashMap<>(); /** * Map of all exclude patterns that are full file names and don't @@ -344,7 +347,7 @@ public class DirectoryScanner * * @since Ant 1.8.0 */ - private final Map<String, TokenizedPath> excludeNonPatterns = new HashMap<String, TokenizedPath>(); + private final Map<String, TokenizedPath> excludeNonPatterns = new HashMap<>(); /** * Array of all include patterns that contain wildcards. @@ -423,13 +426,7 @@ public class DirectoryScanner * * @since Ant 1.8.0 */ - private final Set<String> notFollowedSymlinks = new HashSet<String>(); - - /** - * Sole constructor. - */ - public DirectoryScanner() { - } + private final Set<String> notFollowedSymlinks = new HashSet<>(); /** * Test whether or not a given path matches the start of a given @@ -605,8 +602,8 @@ public class DirectoryScanner public static void resetDefaultExcludes() { synchronized (defaultExcludes) { defaultExcludes.clear(); - for (int i = 0; i < DEFAULTEXCLUDES.length; i++) { - defaultExcludes.add(DEFAULTEXCLUDES[i]); + for (String element : DEFAULTEXCLUDES) { + defaultExcludes.add(element); } } } @@ -619,8 +616,9 @@ public class DirectoryScanner * * @param basedir The base directory to scan. */ + @Override public void setBasedir(final String basedir) { - setBasedir(basedir == null ? (File) null + setBasedir(basedir == null ? null : new File(basedir.replace('/', File.separatorChar).replace( '\\', File.separatorChar))); } @@ -631,6 +629,7 @@ public class DirectoryScanner * * @param basedir The base directory for scanning. */ + @Override public synchronized void setBasedir(final File basedir) { this.basedir = basedir; } @@ -641,6 +640,7 @@ public class DirectoryScanner * * @return the base directory to be scanned. */ + @Override public synchronized File getBasedir() { return basedir; } @@ -662,6 +662,7 @@ public class DirectoryScanner * @param isCaseSensitive whether or not the file system should be * regarded as a case sensitive one. */ + @Override public synchronized void setCaseSensitive(final boolean isCaseSensitive) { this.isCaseSensitive = isCaseSensitive; } @@ -720,14 +721,13 @@ public class DirectoryScanner * list is given, all elements must be * non-<code>null</code>. */ + @Override public synchronized void setIncludes(final String[] includes) { if (includes == null) { this.includes = null; } else { - this.includes = new String[includes.length]; - for (int i = 0; i < includes.length; i++) { - this.includes[i] = normalizePattern(includes[i]); - } + this.includes = Stream.of(includes) + .map(DirectoryScanner::normalizePattern).toArray(String[]::new); } } @@ -743,14 +743,13 @@ public class DirectoryScanner * should be excluded. If a non-<code>null</code> list is * given, all elements must be non-<code>null</code>. */ + @Override public synchronized void setExcludes(final String[] excludes) { if (excludes == null) { this.excludes = null; } else { - this.excludes = new String[excludes.length]; - for (int i = 0; i < excludes.length; i++) { - this.excludes[i] = normalizePattern(excludes[i]); - } + this.excludes = Stream.of(excludes) + .map(DirectoryScanner::normalizePattern).toArray(String[]::new); } } @@ -769,18 +768,14 @@ public class DirectoryScanner */ public synchronized void addExcludes(final String[] excludes) { if (excludes != null && excludes.length > 0) { - if (this.excludes != null && this.excludes.length > 0) { - final String[] tmp = new String[excludes.length - + this.excludes.length]; - System.arraycopy(this.excludes, 0, tmp, 0, - this.excludes.length); - for (int i = 0; i < excludes.length; i++) { - tmp[this.excludes.length + i] = - normalizePattern(excludes[i]); - } - this.excludes = tmp; - } else { + if (this.excludes == null || this.excludes.length == 0) { setExcludes(excludes); + } else { + this.excludes = Stream + .concat(Stream.of(this.excludes), + Stream.of(excludes) + .map(DirectoryScanner::normalizePattern)) + .toArray(String[]::new); } } } @@ -808,6 +803,7 @@ public class DirectoryScanner * * @param selectors specifies the selectors to be invoked on a scan. */ + @Override public synchronized void setSelectors(final FileSelector[] selectors) { this.selectors = selectors; } @@ -833,6 +829,7 @@ public class DirectoryScanner * @exception IllegalStateException if the base directory was set * incorrectly (i.e. if it doesn't exist or isn't a directory). */ + @Override public void scan() throws IllegalStateException { synchronized (scanLock) { if (scanning) { @@ -857,10 +854,10 @@ public class DirectoryScanner clearResults(); // set in/excludes to reasonable defaults if needed: - final boolean nullIncludes = (includes == null); + final boolean nullIncludes = includes == null; includes = nullIncludes - ? new String[] {SelectorUtils.DEEP_TREE_MATCH} : includes; - final boolean nullExcludes = (excludes == null); + ? new String[] { SelectorUtils.DEEP_TREE_MATCH } : includes; + final boolean nullExcludes = excludes == null; excludes = nullExcludes ? new String[0] : excludes; if (basedir != null && !followSymlinks @@ -887,22 +884,19 @@ public class DirectoryScanner } else if (!basedir.isDirectory()) { illegal = new IllegalStateException("basedir " + basedir - + " is not a" - + " directory."); + + " is not a directory."); } if (illegal != null) { throw illegal; } } if (isIncluded(TokenizedPath.EMPTY_PATH)) { - if (!isExcluded(TokenizedPath.EMPTY_PATH)) { - if (isSelected("", basedir)) { - dirsIncluded.addElement(""); - } else { - dirsDeselected.addElement(""); - } - } else { + if (isExcluded(TokenizedPath.EMPTY_PATH)) { dirsExcluded.addElement(""); + } else if (isSelected("", basedir)) { + dirsIncluded.addElement(""); + } else { + dirsDeselected.addElement(""); } } else { dirsNotIncluded.addElement(""); @@ -930,18 +924,19 @@ public class DirectoryScanner */ private void checkIncludePatterns() { ensureNonPatternSetsReady(); - final Map<TokenizedPath, String> newroots = new HashMap<TokenizedPath, String>(); + final Map<TokenizedPath, String> newroots = new HashMap<>(); // put in the newroots map the include patterns without // wildcard tokens - for (int i = 0; i < includePatterns.length; i++) { - final String pattern = includePatterns[i].toString(); + for (TokenizedPattern includePattern : includePatterns) { + final String pattern = includePattern.toString(); if (!shouldSkipPattern(pattern)) { - newroots.put(includePatterns[i].rtrimWildcardTokens(), + newroots.put(includePattern.rtrimWildcardTokens(), pattern); } } - for (final Map.Entry<String, TokenizedPath> entry : includeNonPatterns.entrySet()) { + for (final Map.Entry<String, TokenizedPath> entry : includeNonPatterns + .entrySet()) { final String pattern = entry.getKey(); if (!shouldSkipPattern(pattern)) { newroots.put(entry.getValue(), pattern); @@ -1046,10 +1041,9 @@ public class DirectoryScanner private boolean shouldSkipPattern(final String pattern) { if (FileUtils.isAbsolutePath(pattern)) { //skip abs. paths not under basedir, if set: - if (basedir != null - && !SelectorUtils.matchPatternStart(pattern, - basedir.getAbsolutePath(), - isCaseSensitive())) { + if (!(basedir == null || SelectorUtils.matchPatternStart(pattern, + basedir.getAbsolutePath(), + isCaseSensitive()))) { return true; } } else if (basedir == null) { @@ -1063,14 +1057,14 @@ public class DirectoryScanner * Clear the result caches for a scan. */ protected synchronized void clearResults() { - filesIncluded = new VectorSet<String>(); - filesNotIncluded = new VectorSet<String>(); - filesExcluded = new VectorSet<String>(); - filesDeselected = new VectorSet<String>(); - dirsIncluded = new VectorSet<String>(); - dirsNotIncluded = new VectorSet<String>(); - dirsExcluded = new VectorSet<String>(); - dirsDeselected = new VectorSet<String>(); + filesIncluded = new VectorSet<>(); + filesNotIncluded = new VectorSet<>(); + filesExcluded = new VectorSet<>(); + filesDeselected = new VectorSet<>(); + dirsIncluded = new VectorSet<>(); + dirsNotIncluded = new VectorSet<>(); + dirsExcluded = new VectorSet<>(); + dirsDeselected = new VectorSet<>(); everythingIncluded = (basedir != null); scannedDirs.clear(); notFollowedSymlinks.clear(); @@ -1135,10 +1129,10 @@ public class DirectoryScanner } private void processSlowScan(final String[] arr) { - for (int i = 0; i < arr.length; i++) { - final TokenizedPath path = new TokenizedPath(arr[i]); + for (String element : arr) { + final TokenizedPath path = new TokenizedPath(element); if (!couldHoldIncluded(path) || contentsExcluded(path)) { - scandir(new File(basedir, arr[i]), path, false); + scandir(new File(basedir, element), path, false); } } } @@ -1196,17 +1190,17 @@ public class DirectoryScanner if (!dir.exists()) { throw new BuildException(dir + DOES_NOT_EXIST_POSTFIX); } else if (!dir.isDirectory()) { - throw new BuildException(dir + " is not a directory."); + throw new BuildException("%s is not a directory.", dir); } else { - throw new BuildException("IO error scanning directory '" - + dir.getAbsolutePath() + "'"); + throw new BuildException("IO error scanning directory '%s'", + dir.getAbsolutePath()); } } scandir(dir, path, fast, newfiles, new LinkedList<String>()); } private void scandir(final File dir, final TokenizedPath path, final boolean fast, - String[] newfiles, final LinkedList<String> directoryNamesFollowed) { + String[] newfiles, final Deque<String> directoryNamesFollowed) { String vpath = path.toString(); if (vpath.length() > 0 && !vpath.endsWith(File.separator)) { vpath += File.separator; @@ -1217,12 +1211,12 @@ public class DirectoryScanner return; } if (!followSymlinks) { - final ArrayList<String> noLinks = new ArrayList<String>(); - for (int i = 0; i < newfiles.length; i++) { + final ArrayList<String> noLinks = new ArrayList<>(); + for (String newfile : newfiles) { try { - if (SYMLINK_UTILS.isSymbolicLink(dir, newfiles[i])) { - final String name = vpath + newfiles[i]; - final File file = new File(dir, newfiles[i]); + if (SYMLINK_UTILS.isSymbolicLink(dir, newfile)) { + final String name = vpath + newfile; + final File file = new File(dir, newfile); if (file.isDirectory()) { dirsExcluded.addElement(name); } else if (file.isFile()) { @@ -1230,17 +1224,17 @@ public class DirectoryScanner } accountForNotFollowedSymlink(name, file); } else { - noLinks.add(newfiles[i]); + noLinks.add(newfile); } } catch (final IOException ioe) { final String msg = "IOException caught while checking " + "for links, couldn't get canonical path!"; // will be caught and redirected to Ant's logging system System.err.println(msg); - noLinks.add(newfiles[i]); + noLinks.add(newfile); } } - newfiles = (noLinks.toArray(new String[noLinks.size()])); + newfiles = noLinks.toArray(new String[noLinks.size()]); } else { directoryNamesFollowed.addFirst(dir.getName()); } @@ -1322,7 +1316,7 @@ public class DirectoryScanner private void accountForIncludedDir(final TokenizedPath name, final File file, final boolean fast, final String[] children, - final LinkedList<String> directoryNamesFollowed) { + final Deque<String> directoryNamesFollowed) { processIncluded(name, file, dirsIncluded, dirsExcluded, dirsDeselected); if (fast && couldHoldIncluded(name) && !contentsExcluded(name)) { scandir(file, name, fast, children, directoryNamesFollowed); @@ -1343,13 +1337,12 @@ public class DirectoryScanner } private void processIncluded(final TokenizedPath path, - final File file, final Vector<String> inc, final Vector<String> exc, - final Vector<String> des) { + final File file, final List<String> inc, final List<String> exc, + final List<String> des) { final String name = path.toString(); if (inc.contains(name) || exc.contains(name) || des.contains(name)) { return; } - boolean included = false; if (isExcluded(path)) { exc.add(name); @@ -1385,17 +1378,13 @@ public class DirectoryScanner private boolean isIncluded(final TokenizedPath path) { ensureNonPatternSetsReady(); - if (isCaseSensitive() - ? includeNonPatterns.containsKey(path.toString()) - : includeNonPatterns.containsKey(path.toString().toUpperCase())) { - return true; - } - for (int i = 0; i < includePatterns.length; i++) { - if (includePatterns[i].matchPath(path, isCaseSensitive())) { - return true; - } + String toMatch = path.toString(); + if (!isCaseSensitive()) { + toMatch = toMatch.toUpperCase(); } - return false; + return includeNonPatterns.containsKey(toMatch) + || Stream.of(includePatterns) + .anyMatch(p -> p.matchPath(path, isCaseSensitive())); } /** @@ -1419,19 +1408,11 @@ public class DirectoryScanner * least one include pattern, or <code>false</code> otherwise. */ private boolean couldHoldIncluded(final TokenizedPath tokenizedName) { - for (int i = 0; i < includePatterns.length; i++) { - if (couldHoldIncluded(tokenizedName, includePatterns[i])) { - return true; - } - } - for (final Iterator<TokenizedPath> iter = includeNonPatterns.values().iterator(); - iter.hasNext();) { - if (couldHoldIncluded(tokenizedName, - iter.next().toPattern())) { - return true; - } - } - return false; + return Stream + .concat(Stream.of(includePatterns), + includeNonPatterns.values().stream() + .map(TokenizedPath::toPattern)) + .anyMatch(pat -> couldHoldIncluded(tokenizedName, pat)); } /** @@ -1481,12 +1462,8 @@ public class DirectoryScanner private boolean isMorePowerfulThanExcludes(final String name) { final String soughtexclude = name + File.separatorChar + SelectorUtils.DEEP_TREE_MATCH; - for (int counter = 0; counter < excludePatterns.length; counter++) { - if (excludePatterns[counter].toString().equals(soughtexclude)) { - return false; - } - } - return true; + return Stream.of(excludePatterns).map(Object::toString) + .noneMatch(Predicate.isEqual(soughtexclude)); } /** @@ -1495,14 +1472,10 @@ public class DirectoryScanner * @return whether all the specified directory's contents are excluded. */ /* package */ boolean contentsExcluded(final TokenizedPath path) { - for (int i = 0; i < excludePatterns.length; i++) { - if (excludePatterns[i].endsWith(SelectorUtils.DEEP_TREE_MATCH) - && excludePatterns[i].withoutLastToken() - .matchPath(path, isCaseSensitive())) { - return true; - } - } - return false; + return Stream.of(excludePatterns) + .filter(p -> p.endsWith(SelectorUtils.DEEP_TREE_MATCH)) + .map(TokenizedPattern::withoutLastToken) + .anyMatch(wlt -> wlt.matchPath(path, isCaseSensitive())); } /** @@ -1528,17 +1501,13 @@ public class DirectoryScanner private boolean isExcluded(final TokenizedPath name) { ensureNonPatternSetsReady(); - if (isCaseSensitive() - ? excludeNonPatterns.containsKey(name.toString()) - : excludeNonPatterns.containsKey(name.toString().toUpperCase())) { - return true; - } - for (int i = 0; i < excludePatterns.length; i++) { - if (excludePatterns[i].matchPath(name, isCaseSensitive())) { - return true; - } + String toMatch = name.toString(); + if (!isCaseSensitive()) { + toMatch = toMatch.toUpperCase(); } - return false; + return excludeNonPatterns.containsKey(toMatch) + || Stream.of(excludePatterns) + .anyMatch(p -> p.matchPath(name, isCaseSensitive())); } /** @@ -1550,14 +1519,8 @@ public class DirectoryScanner * should not be selected, <code>true</code> otherwise. */ protected boolean isSelected(final String name, final File file) { - if (selectors != null) { - for (int i = 0; i < selectors.length; i++) { - if (!selectors[i].isSelected(basedir, name, file)) { - return false; - } - } - } - return true; + return selectors == null || Stream.of(selectors) + .allMatch(sel -> sel.isSelected(basedir, name, file)); } /** @@ -1568,14 +1531,14 @@ public class DirectoryScanner * @return the names of the files which matched at least one of the * include patterns and none of the exclude patterns. */ + @Override public String[] getIncludedFiles() { String[] files; synchronized (this) { if (filesIncluded == null) { throw new IllegalStateException("Must call scan() first"); } - files = new String[filesIncluded.size()]; - filesIncluded.copyInto(files); + files = filesIncluded.toArray(new String[filesIncluded.size()]); } Arrays.sort(files); return files; @@ -1603,11 +1566,10 @@ public class DirectoryScanner * * @see #slowScan */ + @Override public synchronized String[] getNotIncludedFiles() { slowScan(); - final String[] files = new String[filesNotIncluded.size()]; - filesNotIncluded.copyInto(files); - return files; + return filesNotIncluded.toArray(new String[filesNotIncluded.size()]); } /** @@ -1621,11 +1583,10 @@ public class DirectoryScanner * * @see #slowScan */ + @Override public synchronized String[] getExcludedFiles() { slowScan(); - final String[] files = new String[filesExcluded.size()]; - filesExcluded.copyInto(files); - return files; + return filesExcluded.toArray(new String[filesExcluded.size()]); } /** @@ -1639,11 +1600,10 @@ public class DirectoryScanner * * @see #slowScan */ + @Override public synchronized String[] getDeselectedFiles() { slowScan(); - final String[] files = new String[filesDeselected.size()]; - filesDeselected.copyInto(files); - return files; + return filesDeselected.toArray(new String[filesDeselected.size()]); } /** @@ -1654,14 +1614,14 @@ public class DirectoryScanner * @return the names of the directories which matched at least one of the * include patterns and none of the exclude patterns. */ + @Override public String[] getIncludedDirectories() { String[] directories; synchronized (this) { if (dirsIncluded == null) { throw new IllegalStateException("Must call scan() first"); } - directories = new String[dirsIncluded.size()]; - dirsIncluded.copyInto(directories); + directories = dirsIncluded.toArray(new String[dirsIncluded.size()]); } Arrays.sort(directories); return directories; @@ -1689,11 +1649,10 @@ public class DirectoryScanner * * @see #slowScan */ + @Override public synchronized String[] getNotIncludedDirectories() { slowScan(); - final String[] directories = new String[dirsNotIncluded.size()]; - dirsNotIncluded.copyInto(directories); - return directories; + return dirsNotIncluded.toArray(new String[dirsNotIncluded.size()]); } /** @@ -1707,11 +1666,10 @@ public class DirectoryScanner * * @see #slowScan */ + @Override public synchronized String[] getExcludedDirectories() { slowScan(); - final String[] directories = new String[dirsExcluded.size()]; - dirsExcluded.copyInto(directories); - return directories; + return dirsExcluded.toArray(new String[dirsExcluded.size()]); } /** @@ -1725,11 +1683,10 @@ public class DirectoryScanner * * @see #slowScan */ + @Override public synchronized String[] getDeselectedDirectories() { slowScan(); - final String[] directories = new String[dirsDeselected.size()]; - dirsDeselected.copyInto(directories); - return directories; + return dirsDeselected.toArray(new String[dirsDeselected.size()]); } /** @@ -1754,20 +1711,15 @@ public class DirectoryScanner /** * Add default exclusions to the current exclusions set. */ + @Override public synchronized void addDefaultExcludes() { - final int excludesLength = excludes == null ? 0 : excludes.length; - String[] newExcludes; - final String[] defaultExcludesTemp = getDefaultExcludes(); - newExcludes = new String[excludesLength + defaultExcludesTemp.length]; - if (excludesLength > 0) { - System.arraycopy(excludes, 0, newExcludes, 0, excludesLength); - } - for (int i = 0; i < defaultExcludesTemp.length; i++) { - newExcludes[i + excludesLength] = - defaultExcludesTemp[i].replace('/', File.separatorChar) - .replace('\\', File.separatorChar); + Stream<String> s = Stream.of(getDefaultExcludes()) + .map(p -> p.replace('/', File.separatorChar).replace('\\', + File.separatorChar)); + if (excludes != null) { + s = Stream.concat(Stream.of(excludes), s); } - excludes = newExcludes; + excludes = s.toArray(String[]::new); } /** @@ -1777,6 +1729,7 @@ public class DirectoryScanner * @return the resource with the given name. * @since Ant 1.5.2 */ + @Override public synchronized Resource getResource(final String name) { return new FileResource(basedir, name); } @@ -1838,14 +1791,14 @@ public class DirectoryScanner * @since Ant 1.8.0 */ private TokenizedPattern[] fillNonPatternSet(final Map<String, TokenizedPath> map, final String[] patterns) { - final ArrayList<TokenizedPattern> al = new ArrayList<TokenizedPattern>(patterns.length); - for (int i = 0; i < patterns.length; i++) { - if (!SelectorUtils.hasWildcards(patterns[i])) { + final List<TokenizedPattern> al = new ArrayList<>(patterns.length); + for (String pattern : patterns) { + if (SelectorUtils.hasWildcards(pattern)) { + al.add(new TokenizedPattern(pattern)); + } else { final String s = isCaseSensitive() - ? patterns[i] : patterns[i].toUpperCase(); + ? pattern : pattern.toUpperCase(); map.put(s, new TokenizedPath(s)); - } else { - al.add(new TokenizedPattern(patterns[i])); } } return al.toArray(new TokenizedPattern[al.size()]); @@ -1863,14 +1816,14 @@ public class DirectoryScanner * @since Ant 1.8.0 */ private boolean causesIllegalSymlinkLoop(final String dirName, final File parent, - final LinkedList<String> directoryNamesFollowed) { + final Deque<String> directoryNamesFollowed) { try { if (directoryNamesFollowed.size() >= maxLevelsOfSymlinks - && CollectionUtils.frequency(directoryNamesFollowed, dirName) + && Collections.frequency(directoryNamesFollowed, dirName) >= maxLevelsOfSymlinks && SYMLINK_UTILS.isSymbolicLink(parent, dirName)) { - final ArrayList<String> files = new ArrayList<String>(); + final List<String> files = new ArrayList<>(); File f = FILE_UTILS.resolveFile(parent, dirName); final String target = f.getCanonicalPath(); files.add(target); @@ -1882,18 +1835,17 @@ public class DirectoryScanner f = FILE_UTILS.resolveFile(parent, relPath + dir); files.add(f.getCanonicalPath()); if (files.size() > maxLevelsOfSymlinks - && CollectionUtils.frequency(files, target) + && Collections.frequency(files, target) > maxLevelsOfSymlinks) { return true; } } } - } return false; } catch (final IOException ex) { - throw new BuildException("Caught error while checking for" - + " symbolic links", ex); + throw new BuildException( + "Caught error while checking for symbolic links", ex); } }
http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/DynamicConfigurator.java ---------------------------------------------------------------------- diff --git a/src/main/org/apache/tools/ant/DynamicConfigurator.java b/src/main/org/apache/tools/ant/DynamicConfigurator.java index e48062b..1eb321e 100644 --- a/src/main/org/apache/tools/ant/DynamicConfigurator.java +++ b/src/main/org/apache/tools/ant/DynamicConfigurator.java @@ -26,4 +26,3 @@ package org.apache.tools.ant; public interface DynamicConfigurator extends DynamicAttribute, DynamicElement { } - http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/Evaluable.java ---------------------------------------------------------------------- diff --git a/src/main/org/apache/tools/ant/Evaluable.java b/src/main/org/apache/tools/ant/Evaluable.java index 47f09c7..bd0ec7e 100644 --- a/src/main/org/apache/tools/ant/Evaluable.java +++ b/src/main/org/apache/tools/ant/Evaluable.java @@ -17,13 +17,19 @@ */ package org.apache.tools.ant; +import java.util.function.Supplier; + /** * Kind of task attribute that can be evaluated before being assigned + * @param <T> as {@link Supplier} * * @see RuntimeConfigurable */ -public interface Evaluable { +public interface Evaluable<T> extends Supplier<T> { - Object eval(); + T eval(); + default T get() { + return eval(); + } } http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/IntrospectionHelper.java ---------------------------------------------------------------------- diff --git a/src/main/org/apache/tools/ant/IntrospectionHelper.java b/src/main/org/apache/tools/ant/IntrospectionHelper.java index 2b31e43..5368042 100644 --- a/src/main/org/apache/tools/ant/IntrospectionHelper.java +++ b/src/main/org/apache/tools/ant/IntrospectionHelper.java @@ -63,7 +63,7 @@ public final class IntrospectionHelper { /** * Helper instances we've already created (Class.getName() to IntrospectionHelper). */ - private static final Map<String, IntrospectionHelper> HELPERS = new Hashtable<String, IntrospectionHelper>(); + private static final Map<String, IntrospectionHelper> HELPERS = new Hashtable<>(); /** * Map from primitive types to wrapper classes for use in @@ -71,7 +71,7 @@ public final class IntrospectionHelper { * and boolean are in here even though they get special treatment * - this way we only need to test for the wrapper class. */ - private static final Map<Class<?>, Class<?>> PRIMITIVE_TYPE_MAP = new HashMap<Class<?>, Class<?>>(8); + private static final Map<Class<?>, Class<?>> PRIMITIVE_TYPE_MAP = new HashMap<>(8); // Set up PRIMITIVE_TYPE_MAP static { @@ -91,30 +91,30 @@ public final class IntrospectionHelper { * Map from attribute names to attribute types * (String to Class). */ - private final Hashtable<String, Class<?>> attributeTypes = new Hashtable<String, Class<?>>(); + private final Map<String, Class<?>> attributeTypes = new Hashtable<>(); /** * Map from attribute names to attribute setter methods * (String to AttributeSetter). */ - private final Hashtable<String, AttributeSetter> attributeSetters = new Hashtable<String, AttributeSetter>(); + private final Map<String, AttributeSetter> attributeSetters = new Hashtable<>(); /** * Map from attribute names to nested types * (String to Class). */ - private final Hashtable<String, Class<?>> nestedTypes = new Hashtable<String, Class<?>>(); + private final Map<String, Class<?>> nestedTypes = new Hashtable<>(); /** * Map from attribute names to methods to create nested types * (String to NestedCreator). */ - private final Hashtable<String, NestedCreator> nestedCreators = new Hashtable<String, NestedCreator>(); + private final Map<String, NestedCreator> nestedCreators = new Hashtable<>(); /** * Vector of methods matching add[Configured](Class) pattern. */ - private final List<Method> addTypeMethods = new ArrayList<Method>(); + private final List<Method> addTypeMethods = new ArrayList<>(); /** * The method to invoke to add PCDATA. @@ -706,7 +706,7 @@ public final class IntrospectionHelper { * @return true if the given nested element is supported */ public boolean supportsNestedElement(final String parentUri, final String elementName) { - if (isDynamic() || addTypeMethods.size() > 0) { + if (isDynamic() || !addTypeMethods.isEmpty()) { return true; } return supportsReflectElement(parentUri, elementName); @@ -731,7 +731,7 @@ public final class IntrospectionHelper { */ public boolean supportsNestedElement(final String parentUri, final String elementName, final Project project, final Object parent) { - if (addTypeMethods.size() > 0 + if (!addTypeMethods.isEmpty() && createAddTypeCreator(project, parent, elementName) != null) { return true; } @@ -944,7 +944,7 @@ public final class IntrospectionHelper { * @see #getAttributeMap */ public Enumeration<String> getAttributes() { - return attributeSetters.keys(); + return Collections.enumeration(attributeSetters.keySet()); } /** @@ -968,7 +968,7 @@ public final class IntrospectionHelper { * @see #getNestedElementMap */ public Enumeration<String> getNestedElements() { - return nestedTypes.keys(); + return Collections.enumeration(nestedTypes.keySet()); } /** @@ -1533,7 +1533,7 @@ public final class IntrospectionHelper { */ private NestedCreator createAddTypeCreator( final Project project, final Object parent, final String elementName) throws BuildException { - if (addTypeMethods.size() == 0) { + if (addTypeMethods.isEmpty()) { return null; } final ComponentHelper helper = ComponentHelper.getComponentHelper(project); @@ -1602,7 +1602,7 @@ public final class IntrospectionHelper { for (int c = 0; c < size; ++c) { final Method current = addTypeMethods.get(c); if (current.getParameterTypes()[0].equals(argClass)) { - if (method.getName().equals("addConfigured")) { + if ("addConfigured".equals(method.getName())) { // add configured replaces the add method addTypeMethods.set(c, method); } http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/Location.java ---------------------------------------------------------------------- diff --git a/src/main/org/apache/tools/ant/Location.java b/src/main/org/apache/tools/ant/Location.java index 8e25d10..0e83760 100644 --- a/src/main/org/apache/tools/ant/Location.java +++ b/src/main/org/apache/tools/ant/Location.java @@ -19,6 +19,7 @@ package org.apache.tools.ant; import java.io.Serializable; +import java.util.Objects; import org.apache.tools.ant.util.FileUtils; import org.xml.sax.Locator; @@ -131,8 +132,9 @@ public class Location implements Serializable { * <code>"fileName: "</code> if only the file name is known, * and the empty string for unknown locations. */ + @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); if (fileName != null) { buf.append(fileName); @@ -155,6 +157,7 @@ public class Location implements Serializable { * as this object. * @since Ant 1.6.3 */ + @Override public boolean equals(Object other) { if (this == other) { return true; @@ -173,7 +176,8 @@ public class Location implements Serializable { * @return a hash code value for this location. * @since Ant 1.6.3 */ + @Override public int hashCode() { - return toString().hashCode(); + return Objects.hash(fileName, lineNumber); } } http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/Main.java ---------------------------------------------------------------------- diff --git a/src/main/org/apache/tools/ant/Main.java b/src/main/org/apache/tools/ant/Main.java index bbaadd0..1ad6277 100644 --- a/src/main/org/apache/tools/ant/Main.java +++ b/src/main/org/apache/tools/ant/Main.java @@ -87,16 +87,16 @@ public class Main implements AntMain { private PrintStream err = System.err; /** The build targets. */ - private final Vector<String> targets = new Vector<String>(); + private final Vector<String> targets = new Vector<>(); /** Set of properties that can be used by tasks. */ private final Properties definedProps = new Properties(); /** Names of classes to add as listeners to project. */ - private final Vector<String> listeners = new Vector<String>(1); + private final Vector<String> listeners = new Vector<>(1); /** File names of property files to load on startup. */ - private final Vector<String> propertyFiles = new Vector<String>(1); + private final Vector<String> propertyFiles = new Vector<>(1); /** Indicates whether this build is to support interactive input */ private boolean allowInput = true; @@ -155,17 +155,9 @@ public class Main implements AntMain { */ private boolean proxy = false; - private final Map<Class<?>, List<String>> extraArguments = new HashMap<Class<?>, List<String>>(); - - private static final GetProperty NOPROPERTIES = new GetProperty() { - public Object getProperty(final String aName) { - // No existing property takes precedence - return null; - } - }; - - + private final Map<Class<?>, List<String>> extraArguments = new HashMap<>(); + private static final GetProperty NOPROPERTIES = aName -> null; /** * Prints the message of the Throwable if it (the message) is not @@ -569,8 +561,8 @@ public class Main implements AntMain { */ final String arg = args[argPos]; String name = arg.substring(2, arg.length()); - String value = null; - final int posEq = name.indexOf("="); + String value; + final int posEq = name.indexOf('='); if (posEq > 0) { value = name.substring(posEq + 1); name = name.substring(0, posEq); @@ -1153,7 +1145,7 @@ public class Main implements AntMain { * @return the filtered targets. */ private static Map<String, Target> removeDuplicateTargets(final Map<String, Target> targets) { - final Map<Location, Target> locationMap = new HashMap<Location, Target>(); + final Map<Location, Target> locationMap = new HashMap<>(); for (final Entry<String, Target> entry : targets.entrySet()) { final String name = entry.getKey(); final Target target = entry.getValue(); @@ -1168,7 +1160,7 @@ public class Main implements AntMain { target.getLocation(), target); // Smallest name wins } } - final Map<String, Target> ret = new HashMap<String, Target>(); + final Map<String, Target> ret = new HashMap<>(); for (final Target target : locationMap.values()) { ret.put(target.getName(), target); } @@ -1191,15 +1183,15 @@ public class Main implements AntMain { final Map<String, Target> ptargets = removeDuplicateTargets(project.getTargets()); // split the targets in top-level and sub-targets depending // on the presence of a description - final Vector<String> topNames = new Vector<String>(); - final Vector<String> topDescriptions = new Vector<String>(); - final Vector<Enumeration<String>> topDependencies = new Vector<Enumeration<String>>(); - final Vector<String> subNames = new Vector<String>(); - final Vector<Enumeration<String>> subDependencies = new Vector<Enumeration<String>>(); + final Vector<String> topNames = new Vector<>(); + final Vector<String> topDescriptions = new Vector<>(); + final Vector<Enumeration<String>> topDependencies = new Vector<>(); + final Vector<String> subNames = new Vector<>(); + final Vector<Enumeration<String>> subDependencies = new Vector<>(); for (final Target currentTarget : ptargets.values()) { final String targetName = currentTarget.getName(); - if (targetName.equals("")) { + if ("".equals(targetName)) { continue; } final String targetDescription = currentTarget.getDescription(); @@ -1227,7 +1219,7 @@ public class Main implements AntMain { "Main targets:", maxLength); //if there were no main targets, we list all subtargets //as it means nothing has a description - if (topNames.size() == 0) { + if (topNames.isEmpty()) { printSubTargets = true; } if (printSubTargets) { http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/PathTokenizer.java ---------------------------------------------------------------------- diff --git a/src/main/org/apache/tools/ant/PathTokenizer.java b/src/main/org/apache/tools/ant/PathTokenizer.java index 6e6bea6..2beb09c 100644 --- a/src/main/org/apache/tools/ant/PathTokenizer.java +++ b/src/main/org/apache/tools/ant/PathTokenizer.java @@ -127,7 +127,7 @@ public class PathTokenizer { } else { // we are on NetWare, tokenizing is handled a little differently, // due to the fact that NetWare has multiple-character volume names. - if (token.equals(File.pathSeparator) || token.equals(":")) { + if (token.equals(File.pathSeparator) || ":".equals(token)) { // ignore ";" and get the next token token = tokenizer.nextToken().trim(); } @@ -138,7 +138,7 @@ public class PathTokenizer { // make sure we aren't going to get the path separator next if (!nextToken.equals(File.pathSeparator)) { - if (nextToken.equals(":")) { + if (":".equals(nextToken)) { if (!token.startsWith("/") && !token.startsWith("\\") && !token.startsWith(".") && !token.startsWith("..")) { @@ -163,4 +163,3 @@ public class PathTokenizer { return token; } } - http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/Project.java ---------------------------------------------------------------------- diff --git a/src/main/org/apache/tools/ant/Project.java b/src/main/org/apache/tools/ant/Project.java index 17f2467..23799bc 100644 --- a/src/main/org/apache/tools/ant/Project.java +++ b/src/main/org/apache/tools/ant/Project.java @@ -144,13 +144,13 @@ public class Project implements ResourceFactory { private final Hashtable<String, Object> references = new AntRefTable(); /** Map of id references - used for indicating broken build files */ - private final HashMap<String, Object> idReferences = new HashMap<String, Object>(); + private final HashMap<String, Object> idReferences = new HashMap<>(); /** Name of the project's default target. */ private String defaultTarget; /** Map from target names to targets (String to Target). */ - private final Hashtable<String, Target> targets = new Hashtable<String, Target>(); + private final Hashtable<String, Target> targets = new Hashtable<>(); /** Set of global filters. */ private final FilterSet globalFilterSet = new FilterSet(); @@ -193,11 +193,11 @@ public class Project implements ResourceFactory { /** Records the latest task to be executed on a thread. */ private final Map<Thread,Task> threadTasks = - Collections.synchronizedMap(new WeakHashMap<Thread, Task>()); + Collections.synchronizedMap(new WeakHashMap<>()); /** Records the latest task to be executed on a thread group. */ private final Map<ThreadGroup,Task> threadGroupTasks - = Collections.synchronizedMap(new WeakHashMap<ThreadGroup,Task>()); + = Collections.synchronizedMap(new WeakHashMap<>()); /** * Called to handle any input requests. @@ -437,7 +437,7 @@ public class Project implements ResourceFactory { */ public Vector<BuildListener> getBuildListeners() { synchronized (listenersLock) { - final Vector<BuildListener> r = new Vector<BuildListener>(listeners.length); + final Vector<BuildListener> r = new Vector<>(listeners.length); for (int i = 0; i < listeners.length; i++) { r.add(listeners[i]); } @@ -1046,7 +1046,7 @@ public class Project implements ResourceFactory { * @since Ant 1.8.1 */ public Map<String, Class<?>> getCopyOfTaskDefinitions() { - return new HashMap<String, Class<?>>(getTaskDefinitions()); + return new HashMap<>(getTaskDefinitions()); } /** @@ -1088,7 +1088,7 @@ public class Project implements ResourceFactory { * @since Ant 1.8.1 */ public Map<String, Class<?>> getCopyOfDataTypeDefinitions() { - return new HashMap<String, Class<?>>(getDataTypeDefinitions()); + return new HashMap<>(getDataTypeDefinitions()); } /** @@ -1168,7 +1168,7 @@ public class Project implements ResourceFactory { * @since Ant 1.8.1 */ public Map<String, Target> getCopyOfTargets() { - return new HashMap<String, Target>(targets); + return new HashMap<>(targets); } /** @@ -1273,12 +1273,10 @@ public class Project implements ResourceFactory { final Task task = getThreadTask(Thread.currentThread()); if (task == null) { log(output, isWarning ? MSG_WARN : MSG_INFO); + } else if (isWarning) { + task.handleErrorOutput(output); } else { - if (isWarning) { - task.handleErrorOutput(output); - } else { - task.handleOutput(output); - } + task.handleOutput(output); } } @@ -1297,12 +1295,11 @@ public class Project implements ResourceFactory { */ public int defaultInput(final byte[] buffer, final int offset, final int length) throws IOException { - if (defaultInputStream != null) { - System.out.flush(); - return defaultInputStream.read(buffer, offset, length); - } else { + if (defaultInputStream == null) { throw new EOFException("No input provided for project"); } + System.out.flush(); + return defaultInputStream.read(buffer, offset, length); } /** @@ -1322,9 +1319,8 @@ public class Project implements ResourceFactory { final Task task = getThreadTask(Thread.currentThread()); if (task == null) { return defaultInput(buffer, offset, length); - } else { - return task.handleInput(buffer, offset, length); } + return task.handleInput(buffer, offset, length); } /** @@ -1342,12 +1338,10 @@ public class Project implements ResourceFactory { final Task task = getThreadTask(Thread.currentThread()); if (task == null) { fireMessageLogged(this, output, isError ? MSG_ERR : MSG_INFO); + } else if (isError) { + task.handleErrorFlush(output); } else { - if (isError) { - task.handleErrorFlush(output); - } else { - task.handleFlush(output); - } + task.handleFlush(output); } } @@ -1383,7 +1377,7 @@ public class Project implements ResourceFactory { */ public void executeSortedTargets(final Vector<Target> sortedTargets) throws BuildException { - final Set<String> succeededTargets = new HashSet<String>(); + final Set<String> succeededTargets = new HashSet<>(); BuildException buildException = null; // first build exception for (final Target curtarget : sortedTargets) { boolean canExecute = true; @@ -1749,9 +1743,9 @@ public class Project implements ResourceFactory { return ((ProjectComponent) o).getProject(); } try { - final Method m = o.getClass().getMethod("getProject", (Class[]) null); - if (Project.class == m.getReturnType()) { - return (Project) m.invoke(o, (Object[]) null); + final Method m = o.getClass().getMethod("getProject"); + if (Project.class.equals(m.getReturnType())) { + return (Project) m.invoke(o); } } catch (final Exception e) { //too bad @@ -1819,9 +1813,9 @@ public class Project implements ResourceFactory { */ public final Vector<Target> topoSort(final String[] root, final Hashtable<String, Target> targetTable, final boolean returnAll) throws BuildException { - final Vector<Target> ret = new VectorSet<Target>(); - final Hashtable<String, String> state = new Hashtable<String, String>(); - final Stack<String> visiting = new Stack<String>(); + final Vector<Target> ret = new VectorSet<>(); + final Hashtable<String, String> state = new Hashtable<>(); + final Stack<String> visiting = new Stack<>(); // We first run a DFS based sort using each root as a starting node. // This creates the minimum sequence of Targets to the root node(s). @@ -1832,7 +1826,7 @@ public class Project implements ResourceFactory { // build Target. for (int i = 0; i < root.length; i++) { - final String st = (state.get(root[i])); + final String st = state.get(root[i]); if (st == null) { tsort(root[i], targetTable, state, visiting, ret); } else if (st == VISITING) { @@ -1840,7 +1834,7 @@ public class Project implements ResourceFactory { + root[i]); } } - final StringBuffer buf = new StringBuffer("Build sequence for target(s)"); + final StringBuilder buf = new StringBuilder("Build sequence for target(s)"); for (int j = 0; j < root.length; j++) { buf.append((j == 0) ? " `" : ", `").append(root[j]).append('\''); @@ -1848,7 +1842,7 @@ public class Project implements ResourceFactory { buf.append(" is ").append(ret); log(buf.toString(), MSG_VERBOSE); - final Vector<Target> complete = (returnAll) ? ret : new Vector<Target>(ret); + final Vector<Target> complete = (returnAll) ? ret : new Vector<>(ret); for (final Enumeration<String> en = targetTable.keys(); en.hasMoreElements();) { final String curTarget = en.nextElement(); final String st = state.get(curTarget); @@ -2035,7 +2029,7 @@ public class Project implements ResourceFactory { * @since Ant 1.8.1 */ public Map<String, Object> getCopyOfReferences() { - return new HashMap<String, Object>(references); + return new HashMap<>(references); } /** @@ -2488,6 +2482,7 @@ public class Project implements ResourceFactory { * @return the file resource. * @since Ant 1.7 */ + @Override public Resource getResource(final String name) { return new FileResource(getBaseDir(), name); } http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/ProjectComponent.java ---------------------------------------------------------------------- diff --git a/src/main/org/apache/tools/ant/ProjectComponent.java b/src/main/org/apache/tools/ant/ProjectComponent.java index ad92a31..451dbed 100644 --- a/src/main/org/apache/tools/ant/ProjectComponent.java +++ b/src/main/org/apache/tools/ant/ProjectComponent.java @@ -160,6 +160,7 @@ public abstract class ProjectComponent implements Cloneable { * @throws CloneNotSupportedException does not happen, * but is declared to allow subclasses to do so. */ + @Override public Object clone() throws CloneNotSupportedException { ProjectComponent pc = (ProjectComponent) super.clone(); pc.setLocation(getLocation()); http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/ProjectHelper.java ---------------------------------------------------------------------- diff --git a/src/main/org/apache/tools/ant/ProjectHelper.java b/src/main/org/apache/tools/ant/ProjectHelper.java index ab39368..0b51946 100644 --- a/src/main/org/apache/tools/ant/ProjectHelper.java +++ b/src/main/org/apache/tools/ant/ProjectHelper.java @@ -146,16 +146,12 @@ public class ProjectHelper { } } - /** Default constructor */ - public ProjectHelper() { - } - // -------------------- Common properties -------------------- // The following properties are required by import ( and other tasks // that read build files using ProjectHelper ). - private Vector<Object> importStack = new Vector<Object>(); - private List<String[]> extensionStack = new LinkedList<String[]>(); + private Vector<Object> importStack = new Vector<>(); + private List<String[]> extensionStack = new LinkedList<>(); /** * Import stack. @@ -181,7 +177,7 @@ public class ProjectHelper { return extensionStack; } - private static final ThreadLocal<String> targetPrefix = new ThreadLocal<String>(); + private static final ThreadLocal<String> targetPrefix = new ThreadLocal<>(); /** * The prefix to prepend to imported target names. @@ -292,7 +288,7 @@ public class ProjectHelper { * @see org.apache.tools.ant.ProjectHelperRepository#getHelpers() */ public static ProjectHelper getProjectHelper() { - return (ProjectHelper) ProjectHelperRepository.getInstance().getHelpers().next(); + return ProjectHelperRepository.getInstance().getHelpers().next(); } /** @@ -496,7 +492,7 @@ public class ProjectHelper { * @return The stringified form of the ns name */ public static String genComponentName(String uri, String name) { - if (uri == null || uri.equals("") || uri.equals(ANT_CORE_URI)) { + if (uri == null || "".equals(uri) || uri.equals(ANT_CORE_URI)) { return name; } return uri + ":" + name; http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/ProjectHelperRepository.java ---------------------------------------------------------------------- diff --git a/src/main/org/apache/tools/ant/ProjectHelperRepository.java b/src/main/org/apache/tools/ant/ProjectHelperRepository.java index e370a54..a11c05a 100644 --- a/src/main/org/apache/tools/ant/ProjectHelperRepository.java +++ b/src/main/org/apache/tools/ant/ProjectHelperRepository.java @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; import java.util.List; +import java.util.stream.Stream; import org.apache.tools.ant.helper.ProjectHelper2; import org.apache.tools.ant.types.Resource; @@ -53,7 +54,7 @@ public class ProjectHelperRepository { private static ProjectHelperRepository instance = new ProjectHelperRepository(); - private List<Constructor<? extends ProjectHelper>> helpers = new ArrayList<Constructor<? extends ProjectHelper>>(); + private List<Constructor<? extends ProjectHelper>> helpers = new ArrayList<>(); private static Constructor<ProjectHelper2> PROJECTHELPER2_CONSTRUCTOR; @@ -298,40 +299,15 @@ public class ProjectHelperRepository { * @return an iterator of {@link ProjectHelper} */ public Iterator<ProjectHelper> getHelpers() { - return new ConstructingIterator(helpers.iterator()); - } - - private static class ConstructingIterator implements Iterator<ProjectHelper> { - private final Iterator<Constructor<? extends ProjectHelper>> nested; - private boolean empty = false; - - ConstructingIterator(Iterator<Constructor<? extends ProjectHelper>> nested) { - this.nested = nested; - } - - public boolean hasNext() { - return nested.hasNext() || !empty; - } - - public ProjectHelper next() { - Constructor<? extends ProjectHelper> c; - if (nested.hasNext()) { - c = nested.next(); - } else { - // last but not least, ant default project helper - empty = true; - c = PROJECTHELPER2_CONSTRUCTOR; - } + Stream.Builder<Constructor<? extends ProjectHelper>> b = Stream.builder(); + helpers.forEach(b::add); + return b.add(PROJECTHELPER2_CONSTRUCTOR).build().map(c -> { try { return c.newInstance(); } catch (Exception e) { throw new BuildException("Failed to invoke no-arg constructor" - + " on " + c.getName()); + + " on " + c.getName()); } - } - - public void remove() { - throw new UnsupportedOperationException("remove is not supported"); - } + }).map(ProjectHelper.class::cast).iterator(); } } http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/PropertyHelper.java ---------------------------------------------------------------------- diff --git a/src/main/org/apache/tools/ant/PropertyHelper.java b/src/main/org/apache/tools/ant/PropertyHelper.java index 1dbb280..84121c9 100644 --- a/src/main/org/apache/tools/ant/PropertyHelper.java +++ b/src/main/org/apache/tools/ant/PropertyHelper.java @@ -17,7 +17,6 @@ */ package org.apache.tools.ant; -import java.text.ParsePosition; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -30,7 +29,6 @@ import java.util.Vector; import org.apache.tools.ant.property.GetProperty; import org.apache.tools.ant.property.NullReturn; -import org.apache.tools.ant.property.ParseNextProperty; import org.apache.tools.ant.property.ParseProperties; import org.apache.tools.ant.property.PropertyExpander; @@ -184,52 +182,41 @@ public class PropertyHelper implements GetProperty { } }; - private static final PropertyExpander DEFAULT_EXPANDER = new PropertyExpander() { - public String parsePropertyName( - String s, ParsePosition pos, ParseNextProperty notUsed) { + private static final PropertyExpander DEFAULT_EXPANDER = + (s, pos, notUsed) -> { int index = pos.getIndex(); //directly check near, triggering characters: - if (s.length() - index >= 3 - && '$' == s.charAt(index) && '{' == s.charAt(index + 1)) { + if (s.length() - index >= 3 && '$' == s.charAt(index) + && '{' == s.charAt(index + 1)) { int start = index + 2; //defer to String.indexOf() for protracted check: int end = s.indexOf('}', start); if (end < 0) { - throw new BuildException("Syntax error in property: " - + s.substring(index)); + throw new BuildException( + "Syntax error in property: " + s.substring(index)); } pos.setIndex(end + 1); - return start == end ? "" : s.substring(start, end); + return start == end ? "" : s.substring(start, end); } return null; - } - }; + }; /** dummy */ - private static final PropertyExpander SKIP_DOUBLE_DOLLAR - = new PropertyExpander() { - // CheckStyle:LineLengthCheck OFF see too long - /** - * {@inheritDoc} - * @see org.apache.tools.ant.property.PropertyExpander#parsePropertyName(java.lang.String, java.text.ParsePosition, org.apache.tools.ant.PropertyHelper) - */ - // CheckStyle:LineLengthCheck ON - public String parsePropertyName( - String s, ParsePosition pos, ParseNextProperty notUsed) { - int index = pos.getIndex(); - if (s.length() - index >= 2) { - /* check for $$; if found, advance by one-- - * this expander is at the bottom of the stack - * and will thus be the last consulted, - * so the next thing that ParseProperties will do - * is advance the parse position beyond the second $ - */ - if ('$' == s.charAt(index) && '$' == s.charAt(++index)) { - pos.setIndex(index); - } + private static final PropertyExpander SKIP_DOUBLE_DOLLAR = + (s, pos, notUsed) -> { + int index = pos.getIndex(); + if (s.length() - index >= 2) { + /* check for $$; if found, advance by one-- + * this expander is at the bottom of the stack + * and will thus be the last consulted, + * so the next thing that ParseProperties will do + * is advance the parse position beyond the second $ + */ + if ('$' == s.charAt(index) && '$' == s.charAt(++index)) { + pos.setIndex(index); } - return null; } + return null; }; /** @@ -248,24 +235,24 @@ public class PropertyHelper implements GetProperty { private Project project; private PropertyHelper next; - private final Hashtable<Class<? extends Delegate>, List<Delegate>> delegates = new Hashtable<Class<? extends Delegate>, List<Delegate>>(); + private final Hashtable<Class<? extends Delegate>, List<Delegate>> delegates = new Hashtable<>(); /** Project properties map (usually String to String). */ - private Hashtable<String, Object> properties = new Hashtable<String, Object>(); + private Hashtable<String, Object> properties = new Hashtable<>(); /** * Map of "user" properties (as created in the Ant task, for example). * Note that these key/value pairs are also always put into the * project properties, so only the project properties need to be queried. */ - private Hashtable<String, Object> userProperties = new Hashtable<String, Object>(); + private Hashtable<String, Object> userProperties = new Hashtable<>(); /** * Map of inherited "user" properties - that are those "user" * properties that have been created by tasks and not been set * from the command line or a GUI tool. */ - private Hashtable<String, Object> inheritedProperties = new Hashtable<String, Object>(); + private Hashtable<String, Object> inheritedProperties = new Hashtable<>(); /** * Default constructor. @@ -900,7 +887,7 @@ public class PropertyHelper implements GetProperty { public Hashtable<String, Object> getProperties() { //avoid concurrent modification: synchronized (properties) { - return new Hashtable<String, Object>(properties); + return new Hashtable<>(properties); } // There is a better way to save the context. This shouldn't // delegate to next, it's for backward compatibility only. @@ -917,7 +904,7 @@ public class PropertyHelper implements GetProperty { public Hashtable<String, Object> getUserProperties() { //avoid concurrent modification: synchronized (userProperties) { - return new Hashtable<String, Object>(userProperties); + return new Hashtable<>(userProperties); } } @@ -932,7 +919,7 @@ public class PropertyHelper implements GetProperty { public Hashtable<String, Object> getInheritedProperties() { //avoid concurrent modification: synchronized (inheritedProperties) { - return new Hashtable<String, Object>(inheritedProperties); + return new Hashtable<>(inheritedProperties); } } @@ -982,7 +969,7 @@ public class PropertyHelper implements GetProperty { synchronized (inheritedProperties) { Enumeration<String> e = inheritedProperties.keys(); while (e.hasMoreElements()) { - String arg = e.nextElement().toString(); + String arg = e.nextElement(); if (other.getUserProperty(arg) != null) { continue; } @@ -1036,7 +1023,7 @@ public class PropertyHelper implements GetProperty { int prev = 0; int pos; //search for the next instance of $ from the 'prev' position - while ((pos = value.indexOf("$", prev)) >= 0) { + while ((pos = value.indexOf('$', prev)) >= 0) { //if there was any text before this, add it as a fragment //TODO, this check could be modified to go if pos>prev; @@ -1096,10 +1083,10 @@ public class PropertyHelper implements GetProperty { for (Class<? extends Delegate> key : getDelegateInterfaces(delegate)) { List<Delegate> list = delegates.get(key); if (list == null) { - list = new ArrayList<Delegate>(); + list = new ArrayList<>(); } else { //copy on write, top priority - list = new ArrayList<Delegate>(list); + list = new ArrayList<>(list); list.remove(delegate); } list.add(0, delegate); @@ -1129,7 +1116,7 @@ public class PropertyHelper implements GetProperty { * @since Ant 1.8.0 */ protected static Set<Class<? extends Delegate>> getDelegateInterfaces(Delegate d) { - final HashSet<Class<? extends Delegate>> result = new HashSet<Class<? extends Delegate>>(); + final HashSet<Class<? extends Delegate>> result = new HashSet<>(); Class<?> c = d.getClass(); while (c != null) { Class<?>[] ifs = c.getInterfaces(); http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/RuntimeConfigurable.java ---------------------------------------------------------------------- diff --git a/src/main/org/apache/tools/ant/RuntimeConfigurable.java b/src/main/org/apache/tools/ant/RuntimeConfigurable.java index 0aafccb..8e54d8c 100644 --- a/src/main/org/apache/tools/ant/RuntimeConfigurable.java +++ b/src/main/org/apache/tools/ant/RuntimeConfigurable.java @@ -25,12 +25,11 @@ import java.util.Enumeration; import java.util.Hashtable; import java.util.LinkedHashMap; import java.util.List; -import java.util.Map.Entry; +import java.util.Map; import org.apache.tools.ant.attribute.EnableAttribute; import org.apache.tools.ant.taskdefs.MacroDef.Attribute; import org.apache.tools.ant.taskdefs.MacroInstance; -import org.apache.tools.ant.util.CollectionUtils; import org.xml.sax.AttributeList; import org.xml.sax.helpers.AttributeListImpl; @@ -46,14 +45,14 @@ public class RuntimeConfigurable implements Serializable { /** Empty Hashtable. */ private static final Hashtable<String, Object> EMPTY_HASHTABLE = - new Hashtable<String, Object>(0); + new Hashtable<>(0); /** Name of the element to configure. */ private String elementTag = null; /** List of child element wrappers. */ // picking ArrayList rather than List as arrayList is Serializable - private ArrayList<RuntimeConfigurable> children = null; + private List<RuntimeConfigurable> children = null; /** The element to configure. It is only used during * maybeConfigure. @@ -303,17 +302,17 @@ public class RuntimeConfigurable implements Serializable { this.polyType = value == null ? null : value.toString(); } else { if (attributeMap == null) { - attributeMap = new LinkedHashMap<String, Object>(); + attributeMap = new LinkedHashMap<>(); } - if (name.equalsIgnoreCase("refid") && !attributeMap.isEmpty()) { - LinkedHashMap<String, Object> newAttributeMap = new LinkedHashMap<String, Object>(); + if ("refid".equalsIgnoreCase(name) && !attributeMap.isEmpty()) { + LinkedHashMap<String, Object> newAttributeMap = new LinkedHashMap<>(); newAttributeMap.put(name, value); newAttributeMap.putAll(attributeMap); attributeMap = newAttributeMap; } else { attributeMap.put(name, value); } - if (name.equals("id")) { + if ("id".equals(name)) { this.id = value == null ? null : value.toString(); } } @@ -335,7 +334,7 @@ public class RuntimeConfigurable implements Serializable { */ public synchronized Hashtable<String, Object> getAttributeMap() { return (attributeMap == null) - ? EMPTY_HASHTABLE : new Hashtable<String, Object>(attributeMap); + ? EMPTY_HASHTABLE : new Hashtable<>(attributeMap); } /** @@ -356,7 +355,7 @@ public class RuntimeConfigurable implements Serializable { * Must not be <code>null</code>. */ public synchronized void addChild(RuntimeConfigurable child) { - children = (children == null) ? new ArrayList<RuntimeConfigurable>() : children; + children = (children == null) ? new ArrayList<>() : children; children.add(child); } @@ -378,7 +377,7 @@ public class RuntimeConfigurable implements Serializable { * @since Ant 1.6 */ public synchronized Enumeration<RuntimeConfigurable> getChildren() { - return (children == null) ? new CollectionUtils.EmptyEnumeration<RuntimeConfigurable>() + return (children == null) ? Collections.emptyEnumeration() : Collections.enumeration(children); } @@ -497,7 +496,7 @@ public class RuntimeConfigurable implements Serializable { IntrospectionHelper.getHelper(p, target.getClass()); ComponentHelper componentHelper = ComponentHelper.getComponentHelper(p); if (attributeMap != null) { - for (Entry<String, Object> entry : attributeMap.entrySet()) { + for (Map.Entry<String, Object> entry : attributeMap.entrySet()) { String name = entry.getKey(); // skip restricted attributes such as if:set AttributeComponentInformation attributeComponentInformation = isRestrictedAttribute(name, componentHelper); @@ -509,8 +508,8 @@ public class RuntimeConfigurable implements Serializable { // MacroInstance where properties are expanded for the // nested sequential Object attrValue; - if (value instanceof Evaluable) { - attrValue = ((Evaluable) value).eval(); + if (value instanceof Evaluable<?>) { + attrValue = ((Evaluable<?>) value).eval(); } else { attrValue = PropertyHelper.getPropertyHelper(p).parseProperties(value.toString()); } @@ -528,7 +527,7 @@ public class RuntimeConfigurable implements Serializable { ih.setAttribute(p, target, name, attrValue); } catch (UnsupportedAttributeException be) { // id attribute must be set externally - if (name.equals("id")) { + if ("id".equals(name)) { // Do nothing } else if (getElementTag() == null) { throw be; @@ -538,7 +537,7 @@ public class RuntimeConfigurable implements Serializable { + be.getAttribute() + "\" attribute", be); } } catch (BuildException be) { - if (name.equals("id")) { + if ("id".equals(name)) { // Assume that this is an not supported attribute type // thrown for example by a dymanic attribute task // Do nothing @@ -590,7 +589,7 @@ public class RuntimeConfigurable implements Serializable { // Children (this is a shadow of UnknownElement#children) if (r.children != null) { - ArrayList<RuntimeConfigurable> newChildren = new ArrayList<RuntimeConfigurable>(); + List<RuntimeConfigurable> newChildren = new ArrayList<>(); newChildren.addAll(r.children); if (children != null) { newChildren.addAll(children); @@ -601,7 +600,7 @@ public class RuntimeConfigurable implements Serializable { // Text if (r.characters != null) { if (characters == null - || characters.toString().trim().length() == 0) { + || characters.toString().trim().isEmpty()) { characters = new StringBuffer(r.characters.toString()); } } http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/Target.java ---------------------------------------------------------------------- diff --git a/src/main/org/apache/tools/ant/Target.java b/src/main/org/apache/tools/ant/Target.java index 796b7e1..dba7e25 100644 --- a/src/main/org/apache/tools/ant/Target.java +++ b/src/main/org/apache/tools/ant/Target.java @@ -55,7 +55,7 @@ public class Target implements TaskContainer { private List<String> dependencies = null; /** Children of this target (tasks and data types). */ - private List<Object> children = new ArrayList<Object>(); + private List<Object> children = new ArrayList<>(); /** Since Ant 1.6.2 */ private Location location = Location.UNKNOWN_LOCATION; @@ -145,7 +145,7 @@ public class Target implements TaskContainer { public static List<String> parseDepends(String depends, String targetName, String attributeName) { - List<String> list = new ArrayList<String>(); + List<String> list = new ArrayList<>(); if (depends.length() > 0) { StringTokenizer tok = new StringTokenizer(depends, ",", true); @@ -225,7 +225,7 @@ public class Target implements TaskContainer { * @return an array of the tasks currently within this target */ public Task[] getTasks() { - List<Task> tasks = new ArrayList<Task>(children.size()); + List<Task> tasks = new ArrayList<>(children.size()); for (Object o : children) { if (o instanceof Task) { tasks.add((Task) o); @@ -242,7 +242,7 @@ public class Target implements TaskContainer { */ public void addDependency(String dependency) { if (dependencies == null) { - dependencies = new ArrayList<String>(2); + dependencies = new ArrayList<>(2); } dependencies.add(dependency); } @@ -253,8 +253,8 @@ public class Target implements TaskContainer { * @return an enumeration of the dependencies of this target (enumeration of String) */ public Enumeration<String> getDependencies() { - return Collections - .enumeration(dependencies == null ? Collections.<String> emptyList() : dependencies); + return dependencies == null ? Collections.emptyEnumeration() + : Collections.enumeration(dependencies); } /** @@ -284,7 +284,12 @@ public class Target implements TaskContainer { */ public void setIf(String property) { ifString = property == null ? "" : property; - setIf(new IfStringCondition(ifString)); + setIf(() -> { + PropertyHelper propertyHelper = + PropertyHelper.getPropertyHelper(getProject()); + Object o = propertyHelper.parseProperties(ifString); + return propertyHelper.testIfCondition(o); + }); } /** @@ -331,7 +336,12 @@ public class Target implements TaskContainer { */ public void setUnless(String property) { unlessString = property == null ? "" : property; - setUnless(new UnlessStringCondition(unlessString)); + setUnless(() -> { + PropertyHelper propertyHelper = + PropertyHelper.getPropertyHelper(getProject()); + Object o = propertyHelper.parseProperties(unlessString); + return !propertyHelper.testUnlessCondition(o); + }); } /** @@ -390,6 +400,7 @@ public class Target implements TaskContainer { * @return the name of this target, or <code>null</code> if the * name has not been set yet. */ + @Override public String toString() { return name; } @@ -491,42 +502,4 @@ public class Target implements TaskContainer { children.set(index, o); } } - - /** - * Condition evaluating the 'if' attribute with the PropertyHelper. - */ - private class IfStringCondition implements Condition { - - private String condition; - - public IfStringCondition(String condition) { - this.condition = condition; - } - - public boolean eval() throws BuildException { - PropertyHelper propertyHelper = PropertyHelper.getPropertyHelper(getProject()); - Object o = propertyHelper.parseProperties(condition); - return propertyHelper.testIfCondition(o); - } - - } - - /** - * Condition evaluating the 'unless' attribute with the PropertyHelper. - */ - private class UnlessStringCondition implements Condition { - - private String condition; - - public UnlessStringCondition(String condition) { - this.condition = condition; - } - - public boolean eval() throws BuildException { - PropertyHelper propertyHelper = PropertyHelper.getPropertyHelper(getProject()); - Object o = propertyHelper.parseProperties(condition); - return !propertyHelper.testUnlessCondition(o); - } - - } } http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/Task.java ---------------------------------------------------------------------- diff --git a/src/main/org/apache/tools/ant/Task.java b/src/main/org/apache/tools/ant/Task.java index 0d08eb0..bdd2337 100644 --- a/src/main/org/apache/tools/ant/Task.java +++ b/src/main/org/apache/tools/ant/Task.java @@ -81,10 +81,6 @@ public abstract class Task extends ProjectComponent { */ private boolean invalid; - /** Sole constructor. */ - public Task() { - } - /** * Sets the target container of this task. * @@ -197,12 +193,10 @@ public abstract class Task extends ProjectComponent { * @exception BuildException if the task cannot be configured. */ public void maybeConfigure() throws BuildException { - if (!invalid) { - if (wrapper != null) { - wrapper.maybeConfigure(getProject()); - } - } else { + if (invalid) { getReplacement(); + } else if (wrapper != null) { + wrapper.maybeConfigure(getProject()); } } @@ -290,10 +284,10 @@ public abstract class Task extends ProjectComponent { * be logged. */ public void log(String msg, int msgLevel) { - if (getProject() != null) { - getProject().log(this, msg, msgLevel); - } else { + if (getProject() == null) { super.log(msg, msgLevel); + } else { + getProject().log(this, msg, msgLevel); } } @@ -323,10 +317,10 @@ public abstract class Task extends ProjectComponent { * @since 1.7 */ public void log(String msg, Throwable t, int msgLevel) { - if (getProject() != null) { - getProject().log(this, msg, t, msgLevel); - } else { + if (getProject() == null) { super.log(msg, msgLevel); + } else { + getProject().log(this, msg, t, msgLevel); } } @@ -340,7 +334,11 @@ public abstract class Task extends ProjectComponent { * is still fired, but with the exception as the cause. */ public final void perform() { - if (!invalid) { + if (invalid) { + UnknownElement ue = getReplacement(); + Task task = ue.getTask(); + task.perform(); + } else { getProject().fireTaskStarted(this); Throwable reason = null; try { @@ -363,10 +361,6 @@ public abstract class Task extends ProjectComponent { } finally { getProject().fireTaskFinished(this, reason); } - } else { - UnknownElement ue = getReplacement(); - Task task = ue.getTask(); - task.perform(); } } http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/TaskAdapter.java ---------------------------------------------------------------------- diff --git a/src/main/org/apache/tools/ant/TaskAdapter.java b/src/main/org/apache/tools/ant/TaskAdapter.java index 3a3001f..8a22f35 100644 --- a/src/main/org/apache/tools/ant/TaskAdapter.java +++ b/src/main/org/apache/tools/ant/TaskAdapter.java @@ -81,7 +81,7 @@ public class TaskAdapter extends Task implements TypeAdapter { // don't have to check for interface, since then // taskClass would be abstract too. try { - final Method executeM = taskClass.getMethod("execute", (Class[]) null); + final Method executeM = taskClass.getMethod("execute"); // don't have to check for public, since // getMethod finds public method only. // don't have to check for abstract, since then @@ -122,10 +122,10 @@ public class TaskAdapter extends Task implements TypeAdapter { */ public void execute() throws BuildException { try { - Method setLocationM = proxy.getClass().getMethod( - "setLocation", new Class[] {Location.class}); + Method setLocationM = + proxy.getClass().getMethod("setLocation", Location.class); if (setLocationM != null) { - setLocationM.invoke(proxy, new Object[] {getLocation()}); + setLocationM.invoke(proxy, getLocation()); } } catch (NoSuchMethodException e) { // ignore this if the class being used as a task does not have @@ -137,10 +137,10 @@ public class TaskAdapter extends Task implements TypeAdapter { } try { - Method setProjectM = proxy.getClass().getMethod( - "setProject", new Class[] {Project.class}); + Method setProjectM = + proxy.getClass().getMethod("setProject", Project.class); if (setProjectM != null) { - setProjectM.invoke(proxy, new Object[] {getProject()}); + setProjectM.invoke(proxy, getProject()); } } catch (NoSuchMethodException e) { // ignore this if the class being used as a task does not have http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/TaskConfigurationChecker.java ---------------------------------------------------------------------- diff --git a/src/main/org/apache/tools/ant/TaskConfigurationChecker.java b/src/main/org/apache/tools/ant/TaskConfigurationChecker.java index e8e7444..70ccd80 100644 --- a/src/main/org/apache/tools/ant/TaskConfigurationChecker.java +++ b/src/main/org/apache/tools/ant/TaskConfigurationChecker.java @@ -55,7 +55,7 @@ import java.util.List; public class TaskConfigurationChecker { /** List of all collected error messages. */ - private List<String> errors = new ArrayList<String>(); + private List<String> errors = new ArrayList<>(); /** Task for which the configuration should be checked. */ private final Task task; @@ -94,8 +94,7 @@ public class TaskConfigurationChecker { */ public void checkErrors() throws BuildException { if (!errors.isEmpty()) { - StringBuffer sb = new StringBuffer(); - sb.append("Configurationerror on <"); + StringBuilder sb = new StringBuilder("Configurationerror on <"); sb.append(task.getTaskName()); sb.append(">:"); sb.append(System.getProperty("line.separator"));
