001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018:
019: package org.apache.tools.ant.types.selectors;
020:
021: import org.apache.tools.ant.types.Mapper;
022: import org.apache.tools.ant.BuildException;
023: import org.apache.tools.ant.util.IdentityMapper;
024: import org.apache.tools.ant.util.FileNameMapper;
025: import org.apache.tools.ant.util.FileUtils;
026:
027: import java.io.File;
028:
029: /**
030: * A mapping selector is an abstract class adding mapping support to the base
031: * selector
032: */
033: public abstract class MappingSelector extends BaseSelector {
034:
035: /** Utilities used for file operations */
036: private static final FileUtils FILE_UTILS = FileUtils
037: .getFileUtils();
038:
039: // CheckStyle:VisibilityModifier OFF - bc
040:
041: protected File targetdir = null;
042: protected Mapper mapperElement = null;
043: protected FileNameMapper map = null;
044: protected int granularity = 0;
045:
046: // CheckStyle:VisibilityModifier ON
047:
048: /**
049: * Creates a new <code>MappingSelector</code> instance.
050: *
051: */
052: public MappingSelector() {
053: granularity = (int) FILE_UTILS.getFileTimestampGranularity();
054: }
055:
056: /**
057: * The name of the file or directory which is checked for out-of-date
058: * files.
059: *
060: * @param targetdir the directory to scan looking for files.
061: */
062: public void setTargetdir(File targetdir) {
063: this .targetdir = targetdir;
064: }
065:
066: /**
067: * Defines the FileNameMapper to use (nested mapper element).
068: * @return a mapper to be configured
069: * @throws BuildException if more that one mapper defined
070: */
071: public Mapper createMapper() throws BuildException {
072: if (mapperElement != null) {
073: throw new BuildException(
074: "Cannot define more than one mapper");
075: }
076: mapperElement = new Mapper(getProject());
077: return mapperElement;
078: }
079:
080: /**
081: * Checks to make sure all settings are kosher. In this case, it
082: * means that the dest attribute has been set and we have a mapper.
083: */
084: public void verifySettings() {
085: if (targetdir == null) {
086: setError("The targetdir attribute is required.");
087: }
088: if (mapperElement == null) {
089: map = new IdentityMapper();
090: } else {
091: map = mapperElement.getImplementation();
092: }
093: if (map == null) {
094: setError("Could not set <mapper> element.");
095: }
096: }
097:
098: /**
099: * The heart of the matter. This is where the selector gets to decide
100: * on the inclusion of a file in a particular fileset.
101: *
102: * @param basedir the base directory the scan is being done from
103: * @param filename is the name of the file to check
104: * @param file is a java.io.File object the selector can use
105: * @return whether the file should be selected or not
106: */
107: public boolean isSelected(File basedir, String filename, File file) {
108:
109: // throw BuildException on error
110: validate();
111:
112: // Determine file whose out-of-dateness is to be checked
113: String[] destfiles = map.mapFileName(filename);
114: // If filename does not match the To attribute of the mapper
115: // then filter it out of the files we are considering
116: if (destfiles == null) {
117: return false;
118: }
119: // Sanity check
120: if (destfiles.length != 1 || destfiles[0] == null) {
121: throw new BuildException(
122: "Invalid destination file results for "
123: + targetdir.getName() + " with filename "
124: + filename);
125: }
126: String destname = destfiles[0];
127: File destfile = new File(targetdir, destname);
128:
129: boolean selected = selectionTest(file, destfile);
130: return selected;
131: }
132:
133: /**
134: * this test is our selection test that compared the file with the destfile
135: * @param srcfile file to test; may be null
136: * @param destfile destination file
137: * @return true if source file compares with destination file
138: */
139: protected abstract boolean selectionTest(File srcfile, File destfile);
140:
141: /**
142: * Sets the number of milliseconds leeway we will give before we consider
143: * a file out of date. Defaults to 2000 on MS-DOS derivatives and 1000 on
144: * others.
145: * @param granularity the leeway in milliseconds
146: */
147: public void setGranularity(int granularity) {
148: this.granularity = granularity;
149: }
150:
151: }
|