diff options
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Tstamp.java')
-rw-r--r-- | framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Tstamp.java | 341 |
1 files changed, 341 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Tstamp.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Tstamp.java new file mode 100644 index 00000000..805427ab --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Tstamp.java @@ -0,0 +1,341 @@ +/* + * 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.taskdefs; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.StringTokenizer; +import java.util.TimeZone; +import java.util.Vector; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Location; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.types.EnumeratedAttribute; + +/** + * Sets properties to the current time, or offsets from the current time. + * The default properties are TSTAMP, DSTAMP and TODAY; + * + * @since Ant 1.1 + * @ant.task category="utility" + */ +public class Tstamp extends Task { + + private Vector customFormats = new Vector(); + private String prefix = ""; + + /** + * Set a prefix for the properties. If the prefix does not end with a "." + * one is automatically added. + * @param prefix the prefix to use. + * @since Ant 1.5 + */ + public void setPrefix(String prefix) { + this.prefix = prefix; + if (!this.prefix.endsWith(".")) { + this.prefix += "."; + } + } + + /** + * create the timestamps. Custom ones are done before + * the standard ones, to get their retaliation in early. + * @throws BuildException on error. + */ + public void execute() throws BuildException { + try { + Date d = new Date(); + + Enumeration i = customFormats.elements(); + while (i.hasMoreElements()) { + CustomFormat cts = (CustomFormat) i.nextElement(); + cts.execute(getProject(), d, getLocation()); + } + + SimpleDateFormat dstamp = new SimpleDateFormat ("yyyyMMdd"); + setProperty("DSTAMP", dstamp.format(d)); + + SimpleDateFormat tstamp = new SimpleDateFormat ("HHmm"); + setProperty("TSTAMP", tstamp.format(d)); + + SimpleDateFormat today + = new SimpleDateFormat ("MMMM d yyyy", Locale.US); + setProperty("TODAY", today.format(d)); + + } catch (Exception e) { + throw new BuildException(e); + } + } + + /** + * create a custom format with the current prefix. + * @return a ready to fill-in format + */ + public CustomFormat createFormat() { + CustomFormat cts = new CustomFormat(); + customFormats.addElement(cts); + return cts; + } + + /** + * helper that encapsulates prefix logic and property setting + * policy (i.e. we use setNewProperty instead of setProperty). + */ + private void setProperty(String name, String value) { + getProject().setNewProperty(prefix + name, value); + } + + /** + * This nested element that allows a property to be set + * to the current date and time in a given format. + * The date/time patterns are as defined in the + * Java SimpleDateFormat class. + * The format element also allows offsets to be applied to + * the time to generate different time values. + * @todo consider refactoring out into a re-usable element. + */ + public class CustomFormat { + private TimeZone timeZone; + private String propertyName; + private String pattern; + private String language; + private String country; + private String variant; + private int offset = 0; + private int field = Calendar.DATE; + + /** + * Create a format + */ + public CustomFormat() { + } + + /** + * The property to receive the date/time string in the given pattern + * @param propertyName the name of the property. + */ + public void setProperty(String propertyName) { + this.propertyName = propertyName; + } + + /** + * The date/time pattern to be used. The values are as + * defined by the Java SimpleDateFormat class. + * @param pattern the pattern to use. + * @see java.text.SimpleDateFormat + */ + public void setPattern(String pattern) { + this.pattern = pattern; + } + + /** + * The locale used to create date/time string. + * The general form is "language, country, variant" but + * either variant or variant and country may be omitted. + * For more information please refer to documentation + * for the java.util.Locale class. + * @param locale the locale to use. + * @see java.util.Locale + */ + public void setLocale(String locale) { + StringTokenizer st = new StringTokenizer(locale, " \t\n\r\f,"); + try { + language = st.nextToken(); + if (st.hasMoreElements()) { + country = st.nextToken(); + if (st.hasMoreElements()) { + variant = st.nextToken(); + if (st.hasMoreElements()) { + throw new BuildException("bad locale format", + getLocation()); + } + } + } else { + country = ""; + } + } catch (NoSuchElementException e) { + throw new BuildException("bad locale format", e, + getLocation()); + } + } + + /** + * The timezone to use for displaying time. + * The values are as defined by the Java TimeZone class. + * @param id the timezone value. + * @see java.util.TimeZone + */ + public void setTimezone(String id) { + timeZone = TimeZone.getTimeZone(id); + } + + /** + * The numeric offset to the current time. + * @param offset the offset to use. + */ + public void setOffset(int offset) { + this.offset = offset; + } + + /** + * Set the unit type (using String). + * @param unit the unit to use. + * @deprecated since 1.5.x. + * setUnit(String) is deprecated and is replaced with + * setUnit(Tstamp.Unit) to make Ant's + * Introspection mechanism do the work and also to + * encapsulate operations on the unit in its own + * class. + */ + public void setUnit(String unit) { + log("DEPRECATED - The setUnit(String) method has been deprecated." + + " Use setUnit(Tstamp.Unit) instead."); + Unit u = new Unit(); + u.setValue(unit); + field = u.getCalendarField(); + } + + /** + * The unit of the offset to be applied to the current time. + * Valid Values are + * <ul> + * <li>millisecond</li> + * <li>second</li> + * <li>minute</li> + * <li>hour</li> + * <li>day</li> + * <li>week</li> + * <li>month</li> + * <li>year</li> + * </ul> + * The default unit is day. + * @param unit the unit to use. + */ + public void setUnit(Unit unit) { + field = unit.getCalendarField(); + } + + /** + * validate parameter and execute the format. + * @param project project to set property in. + * @param date date to use as a starting point. + * @param location line in file (for errors) + */ + public void execute(Project project, Date date, Location location) { + if (propertyName == null) { + throw new BuildException("property attribute must be provided", + location); + } + + if (pattern == null) { + throw new BuildException("pattern attribute must be provided", + location); + } + + SimpleDateFormat sdf; + if (language == null) { + sdf = new SimpleDateFormat(pattern); + } else if (variant == null) { + sdf = new SimpleDateFormat(pattern, + new Locale(language, country)); + } else { + sdf = new SimpleDateFormat(pattern, + new Locale(language, country, + variant)); + } + if (offset != 0) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(field, offset); + date = calendar.getTime(); + } + if (timeZone != null) { + sdf.setTimeZone(timeZone); + } + Tstamp.this.setProperty(propertyName, sdf.format(date)); + } + } + + /** + * set of valid units to use for time offsets. + */ + public static class Unit extends EnumeratedAttribute { + + private static final String MILLISECOND = "millisecond"; + private static final String SECOND = "second"; + private static final String MINUTE = "minute"; + private static final String HOUR = "hour"; + private static final String DAY = "day"; + private static final String WEEK = "week"; + private static final String MONTH = "month"; + private static final String YEAR = "year"; + + private static final String[] UNITS = { + MILLISECOND, + SECOND, + MINUTE, + HOUR, + DAY, + WEEK, + MONTH, + YEAR + }; + + private Map calendarFields = new HashMap(); + + /** Constructor for Unit enumerated type. */ + public Unit() { + calendarFields.put(MILLISECOND, + new Integer(Calendar.MILLISECOND)); + calendarFields.put(SECOND, new Integer(Calendar.SECOND)); + calendarFields.put(MINUTE, new Integer(Calendar.MINUTE)); + calendarFields.put(HOUR, new Integer(Calendar.HOUR_OF_DAY)); + calendarFields.put(DAY, new Integer(Calendar.DATE)); + calendarFields.put(WEEK, new Integer(Calendar.WEEK_OF_YEAR)); + calendarFields.put(MONTH, new Integer(Calendar.MONTH)); + calendarFields.put(YEAR, new Integer(Calendar.YEAR)); + } + + /** + * Convert the value to int unit value. + * @return an int value. + */ + public int getCalendarField() { + String key = getValue().toLowerCase(Locale.ENGLISH); + Integer i = (Integer) calendarFields.get(key); + return i.intValue(); + } + + /** + * Get the valid values. + * @return the value values. + */ + public String[] getValues() { + return UNITS; + } + } +} |