String[] outputFileNames = outputMapper.mapFileName(typedResource.getResource().getName());
// Mapper may produce zero or more filenames,
// which may or may not be what was wanted but
// only the user will know that.
if (outputFileNames != null) {
Union outputResources = new Union();
for (String fileName : outputFileNames) {
outputResources.add(new FileResource(destDir, fileName));
}
useOutputResources.put(port, outputResources);
}
}
}
}
process(useInputResources, useOutputResources);
} else { // Using implicit and/or explicit filesets
if (useImplicitFileset) {
DirectoryScanner scanner = getDirectoryScanner(baseDir);
log("Pipelining into " + destDir, Project.MSG_INFO);
// Process all the files marked for styling
String[] includedFiles = scanner.getIncludedFiles();
for (int i = 0; i < includedFiles.length; ++i) {
resources.add(new FileResource(baseDir, includedFiles[i]));
}
if (performDirectoryScan) {
// Process all the directories marked for styling
String[] includedDirs = scanner.getIncludedDirectories();
for (int j = 0; j < includedDirs.length; ++j) {
includedFiles = new File(baseDir, includedDirs[j]).list();
for (int i = 0; i < includedFiles.length; ++i) {
resources.add(new FileResource(baseDir, includedDirs[j] + File.separator + includedFiles[i]));
}
}
}
} else { // only resource collections, there better be some
if (resources.size() == 0) {
if (failOnNoResources) {
handleError("no resources specified");
}
return;
}
}
FileNameMapper useMapper = null;
if (!outputResources.containsKey(outPort)) {
if (mapper != null) {
useMapper = mapper;
} else {
useMapper = new ExtensionMapper();
}
}
// Process implicit and/or explicit resources one at a
// time.
for (Resource resource : resources.listResources()) {
log("Resource: " + resource.getName(), Project.MSG_DEBUG);
Map<String, List<TypedResource>> useInputResources = new HashMap<String, List<TypedResource>>();
// Any fixed resources on other input ports.
useInputResources.putAll(inputResources);
// The resource.
useInputResources.put(inPort, asList(new TypedResource(resource, inType)));
// Any mapped resources on other input ports.
for (String port : inputMappers.keySet()) {
TypedFileNameMapper inputMapper = inputMappers.get(port);
String[] inputFileNames = inputMapper.mapFileName(resource.getName());
// Mapper may produce zero or more filenames,
// which may or may not be what was wanted but
// only the user will know that.
if (inputFileNames != null) {
List<TypedResource> mappedResources = new ArrayList<TypedResource>();
for (String fileName : inputFileNames) {
FileResource mappedResource = new FileResource(baseDir, fileName);
mappedResources.add(new TypedResource(mappedResource, inputMapper.getType(), inputMapper.getContentType()));
}
useInputResources.put(port, mappedResources);
}
}
HashMap<String, Union> useOutputResources = new HashMap<String, Union>();
useOutputResources.putAll(outputResources);
// FIXME: Why is it necessary to check for null?
if (useMapper != null) {
String[] outFileName = useMapper.mapFileName(resource.getName());
// Require exactly one output for each mapped
// input.
if (outFileName == null || outFileName.length == 0) {
log("Skipping '" + resource.getName() + "' as it cannot be mapped to output.", Project.MSG_VERBOSE);
continue;
} else if (outFileName == null || outFileName.length > 1) {
log("Skipping " + resource.getName() + " as its mapping is ambiguous.", Project.MSG_VERBOSE);
continue;
}
useOutputResources.put(outPort, new Union(new FileResource(destDir, outFileName[0])));
}
// Any mapped resources on other output ports.
for (String port : outputMappers.keySet()) {
FileNameMapper outputMapper = outputMappers.get(port);
String[] outputFileNames = outputMapper.mapFileName(resource.getName());
// Mapper may produce zero or more filenames,
// which may or may not be what was wanted but
// only the user will know that.
if (outputFileNames != null) {
Union outputResources = new Union();
for (String fileName : outputFileNames) {
outputResources.add(new FileResource(destDir, fileName));
}
useOutputResources.put(port, outputResources);
}
}
process(useInputResources, useOutputResources);
}
}
} finally {
// Same instance is reused when Ant runs this task
// again, so reset everything.
userArgs = new UserArgs();
inputResources.clear();
inputMappers.clear();
baseDir = null;
inPort = null;
inResource = null;
inType = XML;
failOnNoResources = true;
pipelineResource = null;
destDir = null;
outPort = null;
outResource = null;
outputResources.clear();
outputMappers.clear();
targetExtension = "-out.xml";
isTargetExtensionSet = false;
failOnError = true;
resources = new Union();
useImplicitFileset = true;
performDirectoryScan = true;
mapper = null;
force = false;
if (sysProperties.size() > 0) {