blob: 0719a1855b7998b1169f5912a290b55f5a41fa51 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.types.resources.selectors;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.TimeComparison;
import org.apache.tools.ant.util.FileUtils;
/**
* Date ResourceSelector. Based on the date FileSelector, with the most
* notable difference being the lack of support for the includedirs attribute.
* It is recommended that the effect of includeDirs = "false" be achieved for
* resources by enclosing a "dir" Type ResourceSelector and a Date
* ResourceSelector in an Or ResourceSelector.
* @since Ant 1.7
*/
public class Date implements ResourceSelector {
private static final String MILLIS_OR_DATETIME
= "Either the millis or the datetime attribute must be set.";
private static final FileUtils FILE_UTILS = FileUtils.getFileUtils();
private Long millis = null;
private String dateTime = null;
private String pattern = null;
private TimeComparison when = TimeComparison.EQUAL;
private long granularity = FILE_UTILS.getFileTimestampGranularity();
/**
* Set the date/time in milliseconds since 1970.
* @param m the number of millis.
*/
public synchronized void setMillis(long m) {
millis = new Long(m);
}
/**
* Get the date/time in ms.
* @return long number of millis since 1970.
*/
public synchronized long getMillis() {
return millis == null ? -1L : millis.longValue();
}
/**
* Set the date and time as a String.
* @param s the date and time to use.
*/
public synchronized void setDateTime(String s) {
dateTime = s;
millis = null;
}
/**
* Get the date and time in String format.
* @return a String representing a date and time.
*/
public synchronized String getDatetime() {
return dateTime;
}
/**
* Set the granularity to use for this ResourceSelector.
* @param g the timestamp granularity.
*/
public synchronized void setGranularity(long g) {
granularity = g;
}
/**
* Get the timestamp granularity used by this ResourceSelector.
* @return the long granularity.
*/
public synchronized long getGranularity() {
return granularity;
}
/**
* Set the optional pattern to use with the datetime attribute.
* @param p the SimpleDateFormat-compatible pattern string.
*/
public synchronized void setPattern(String p) {
pattern = p;
}
/**
* Get the pattern for use with the datetime attribute.
* @return a SimpleDateFormat-compatible pattern string.
*/
public synchronized String getPattern() {
return pattern;
}
/**
* Set the comparison mode.
* @param c a TimeComparison object.
*/
public synchronized void setWhen(TimeComparison c) {
when = c;
}
/**
* Get the comparison mode.
* @return a TimeComparison object.
*/
public synchronized TimeComparison getWhen() {
return when;
}
/**
* Return true if this Resource is selected.
* @param r the Resource to check.
* @return whether the Resource was selected.
*/
public synchronized boolean isSelected(Resource r) {
if (dateTime == null && millis == null) {
throw new BuildException(MILLIS_OR_DATETIME);
}
if (millis == null) {
String p = pattern == null ? "MM/dd/yyyy hh:mm a" : pattern;
DateFormat df = pattern == null
? new SimpleDateFormat(p, Locale.US)
: new SimpleDateFormat(p);
try {
long m = df.parse(dateTime).getTime();
if (m < 0) {
throw new BuildException("Date of " + dateTime
+ " results in negative milliseconds value"
+ " relative to epoch (January 1, 1970, 00:00:00 GMT).");
}
setMillis(m);
} catch (ParseException pe) {
throw new BuildException("Date of " + dateTime
+ " Cannot be parsed correctly. It should be in '"
+ p + "' format.");
}
}
return when.evaluate(r.getLastModified(), millis.longValue(), granularity);
}
}