/*******************************************************************************
* Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Marc R. Hoffmann - initial API and implementation
* Dominik Stadler - source folder support
*
*******************************************************************************/
package org.jacoco.ant;
import java.util.Iterator;
import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.resources.FileResource;
import org.jacoco.report.DirectorySourceFileLocator;
import org.jacoco.report.MultiSourceFileLocator;
/**
* Source file locator based on Ant resources. The locator supports files as
* well as directories. The lookup is first performed on files (matching the
* local file name) and afterwards on directories, by the order the directory
* resources have been added. The directories are considered as source folders
* that are searched for source files with the fully qualified name (package and
* local name).
*/
class AntResourcesLocator extends MultiSourceFileLocator {
private final String encoding;
private final AntFilesLocator filesLocator;
private boolean empty;
AntResourcesLocator(final String encoding, final int tabWidth) {
super(tabWidth);
this.encoding = encoding;
this.filesLocator = new AntFilesLocator(encoding, tabWidth);
this.empty = true;
super.add(filesLocator);
}
/**
* Adds the given file or directory resource to the locator.
*
* @param resource
* resource to add
*/
void add(final Resource resource) {
empty = false;
if (resource.isDirectory()) {
final FileResource dir = (FileResource) resource;
super.add(new DirectorySourceFileLocator(dir.getFile(), encoding,
getTabWidth()));
} else {
filesLocator.add(resource);
}
}
void addAll(final Iterator<?> iterator) {
while (iterator.hasNext()) {
add((Resource) iterator.next());
}
}
/**
* Checks, whether resources have been added.
*
* @return <code>true</code>, if no resources have been added
*/
boolean isEmpty() {
return empty;
}
}