| @@ -52,6 +52,15 @@ Fixed bugs: | |||||
| worked on OSes where sed is GNU sed. | worked on OSes where sed is GNU sed. | ||||
| Bugzilla Report 59898 | Bugzilla Report 59898 | ||||
| * <touch>'s default pattern as well as the default patterns used by | |||||
| the <date> (resource) selectors depended on the JDK being used - or | |||||
| rather the locale provider being used and the default locale | |||||
| provider changed with Java 9. | |||||
| They are now fixed and the documentation has been updated to | |||||
| reflect the real patterns used rather than a non-formal description | |||||
| of the expected format. | |||||
| Bugzilla Report 59909 | |||||
| Other changes: | Other changes: | ||||
| -------------- | -------------- | ||||
| @@ -74,8 +74,10 @@ resource collections (which also includes directories). Prior to Apache Ant | |||||
| </tr> | </tr> | ||||
| <tr> | <tr> | ||||
| <td valign="top">pattern</td> | <td valign="top">pattern</td> | ||||
| <td valign="top">SimpleDateFormat-compatible pattern string. | |||||
| Defaults to MM/DD/YYYY HH:MM AM_or_PM or MM/DD/YYYY HH:MM:SS AM_or_PM. | |||||
| <td valign="top">SimpleDateFormat-compatible pattern string using | |||||
| the current locale. | |||||
| Defaults to "MM/dd/YYYY hh:mm a" or "MM/dd/yyyy hh:mm:ss a" | |||||
| using the US locale. | |||||
| <b>Since Ant 1.6.3</b></td> | <b>Since Ant 1.6.3</b></td> | ||||
| <td valign="top" align="center">No</td> | <td valign="top" align="center">No</td> | ||||
| </tr> | </tr> | ||||
| @@ -641,9 +641,10 @@ platforms. | |||||
| <tr> | <tr> | ||||
| <td valign="top">pattern</td> | <td valign="top">pattern</td> | ||||
| <td valign="top">SimpleDateFormat-compatible pattern | <td valign="top">SimpleDateFormat-compatible pattern | ||||
| for use with the <code>datetime</code> attribute</td> | |||||
| for use with the <code>datetime</code> attribute using the | |||||
| current locale</td> | |||||
| <td align="center" valign="top"> | <td align="center" valign="top"> | ||||
| No, default is "MM/DD/YYYY HH:MM AM_or_PM"</td> | |||||
| No, default is "MM/dd/yyyy hh:mm a" using the US locale</td> | |||||
| </tr> | </tr> | ||||
| <tr> | <tr> | ||||
| <td valign="top">granularity</td> | <td valign="top">granularity</td> | ||||
| @@ -179,9 +179,9 @@ | |||||
| <tr> | <tr> | ||||
| <td valign="top">datetime</td> | <td valign="top">datetime</td> | ||||
| <td valign="top">Specifies the date and time to test for. | <td valign="top">Specifies the date and time to test for. | ||||
| Should be in the format MM/DD/YYYY HH:MM AM_or_PM, or | |||||
| an alternative pattern specified via the <i>pattern</i> | |||||
| attribute. | |||||
| Should be in the format "MM/dd/yyyy hh:mm a" using the US | |||||
| locale, or an alternative pattern specified via | |||||
| the <i>pattern</i> attribute. | |||||
| </td> | </td> | ||||
| <td valign="top" align="center" rowspan="2">At least one of the two.</td> | <td valign="top" align="center" rowspan="2">At least one of the two.</td> | ||||
| </tr> | </tr> | ||||
| @@ -218,7 +218,8 @@ | |||||
| <tr> | <tr> | ||||
| <td valign="top">pattern</td> | <td valign="top">pattern</td> | ||||
| <td valign="top">The <CODE>SimpleDateFormat</CODE>-compatible pattern | <td valign="top">The <CODE>SimpleDateFormat</CODE>-compatible pattern | ||||
| to use when interpreting the <i>datetime</i> attribute. | |||||
| to use when interpreting the <i>datetime</i> attribute using | |||||
| the current locale. | |||||
| <i>Since Ant 1.6.2</i> | <i>Since Ant 1.6.2</i> | ||||
| </td> | </td> | ||||
| <td valign="top" align="center">No</td> | <td valign="top" align="center">No</td> | ||||
| @@ -61,23 +61,29 @@ public class Touch extends Task { | |||||
| public static final DateFormatFactory DEFAULT_DF_FACTORY | public static final DateFormatFactory DEFAULT_DF_FACTORY | ||||
| = new DateFormatFactory() { | = new DateFormatFactory() { | ||||
| /* | |||||
| * The initial version used DateFormat.SHORT for the | |||||
| * time format, which ignores seconds. If we want | |||||
| * seconds as well, we need DateFormat.MEDIUM, which | |||||
| * in turn would break all old build files. | |||||
| * | |||||
| * First try to parse with DateFormat.SHORT and if | |||||
| * that fails with MEDIUM - throw an exception if both | |||||
| * fail. | |||||
| */ | |||||
| private ThreadLocal<DateFormat> primary = | |||||
| new ThreadLocal<DateFormat>() { | |||||
| @Override | |||||
| protected DateFormat initialValue() { | |||||
| return new SimpleDateFormat("MM/dd/yyyy hh:mm a", | |||||
| Locale.US); | |||||
| } | |||||
| }; | |||||
| private ThreadLocal<DateFormat> fallback = | |||||
| new ThreadLocal<DateFormat>() { | |||||
| @Override | |||||
| protected DateFormat initialValue() { | |||||
| return new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a", | |||||
| Locale.US); | |||||
| } | |||||
| }; | |||||
| public DateFormat getPrimaryFormat() { | public DateFormat getPrimaryFormat() { | ||||
| return DateFormat.getDateTimeInstance(DateFormat.SHORT, | |||||
| DateFormat.SHORT, Locale.US); | |||||
| return primary.get(); | |||||
| } | } | ||||
| public DateFormat getFallbackFormat() { | public DateFormat getFallbackFormat() { | ||||
| return DateFormat.getDateTimeInstance(DateFormat.SHORT, | |||||
| DateFormat.MEDIUM, Locale.US); | |||||
| return fallback.get(); | |||||
| } | } | ||||
| }; | }; | ||||
| private static final FileUtils FILE_UTILS = FileUtils.getFileUtils(); | private static final FileUtils FILE_UTILS = FileUtils.getFileUtils(); | ||||
| @@ -137,10 +137,10 @@ public class Date implements ResourceSelector { | |||||
| throw new BuildException(MILLIS_OR_DATETIME); | throw new BuildException(MILLIS_OR_DATETIME); | ||||
| } | } | ||||
| if (millis == null) { | if (millis == null) { | ||||
| DateFormat df = ((pattern == null) | |||||
| ? DateFormat.getDateTimeInstance( | |||||
| DateFormat.SHORT, DateFormat.SHORT, Locale.US) | |||||
| : new SimpleDateFormat(pattern)); | |||||
| String p = pattern == null ? "MM/dd/yyyy hh:mm a" : pattern; | |||||
| DateFormat df = pattern == null | |||||
| ? new SimpleDateFormat(p, Locale.US) | |||||
| : new SimpleDateFormat(p); | |||||
| try { | try { | ||||
| long m = df.parse(dateTime).getTime(); | long m = df.parse(dateTime).getTime(); | ||||
| if (m < 0) { | if (m < 0) { | ||||
| @@ -151,9 +151,8 @@ public class Date implements ResourceSelector { | |||||
| setMillis(m); | setMillis(m); | ||||
| } catch (ParseException pe) { | } catch (ParseException pe) { | ||||
| throw new BuildException("Date of " + dateTime | throw new BuildException("Date of " + dateTime | ||||
| + " Cannot be parsed correctly. It should be in" | |||||
| + (pattern == null | |||||
| ? " MM/DD/YYYY HH:MM AM_PM" : pattern) + " format."); | |||||
| + " Cannot be parsed correctly. It should be in '" | |||||
| + p + "' format."); | |||||
| } | } | ||||
| } | } | ||||
| return when.evaluate(r.getLastModified(), millis.longValue(), granularity); | return when.evaluate(r.getLastModified(), millis.longValue(), granularity); | ||||
| @@ -34,7 +34,7 @@ import org.apache.tools.ant.types.DataType; | |||||
| public abstract class BaseSelector extends DataType implements FileSelector { | public abstract class BaseSelector extends DataType implements FileSelector { | ||||
| private String errmsg = null; | private String errmsg = null; | ||||
| private Throwable cause; | |||||
| /** | /** | ||||
| * Do nothing constructor. | * Do nothing constructor. | ||||
| @@ -54,6 +54,19 @@ public abstract class BaseSelector extends DataType implements FileSelector { | |||||
| } | } | ||||
| } | } | ||||
| /** | |||||
| * Allows all selectors to indicate a setup error. Note that only | |||||
| * the first error message is recorded. | |||||
| * | |||||
| * @param msg The error message any BuildException should throw. | |||||
| */ | |||||
| public void setError(String msg, Throwable cause) { | |||||
| if (errmsg == null) { | |||||
| errmsg = msg; | |||||
| this.cause = cause; | |||||
| } | |||||
| } | |||||
| /** | /** | ||||
| * Returns any error messages that have been set. | * Returns any error messages that have been set. | ||||
| * | * | ||||
| @@ -87,7 +100,7 @@ public abstract class BaseSelector extends DataType implements FileSelector { | |||||
| verifySettings(); | verifySettings(); | ||||
| } | } | ||||
| if (getError() != null) { | if (getError() != null) { | ||||
| throw new BuildException(errmsg); | |||||
| throw new BuildException(errmsg, cause); | |||||
| } | } | ||||
| if (!isReference()) { | if (!isReference()) { | ||||
| dieOnCircularReference(); | dieOnCircularReference(); | ||||
| @@ -209,11 +209,10 @@ public class DateSelector extends BaseExtendSelector { | |||||
| setError("You must provide a datetime or the number of " | setError("You must provide a datetime or the number of " | ||||
| + "milliseconds."); | + "milliseconds."); | ||||
| } else if (millis < 0 && dateTime != null) { | } else if (millis < 0 && dateTime != null) { | ||||
| // check millis and only set it once. | |||||
| DateFormat df = ((pattern == null) | |||||
| ? DateFormat.getDateTimeInstance( | |||||
| DateFormat.SHORT, DateFormat.SHORT, Locale.US) | |||||
| : new SimpleDateFormat(pattern)); | |||||
| String p = pattern == null ? "MM/dd/yyyy hh:mm a" : pattern; | |||||
| DateFormat df = pattern == null | |||||
| ? new SimpleDateFormat(p, Locale.US) | |||||
| : new SimpleDateFormat(p); | |||||
| try { | try { | ||||
| setMillis(df.parse(dateTime).getTime()); | setMillis(df.parse(dateTime).getTime()); | ||||
| @@ -224,9 +223,8 @@ public class DateSelector extends BaseExtendSelector { | |||||
| } | } | ||||
| } catch (ParseException pe) { | } catch (ParseException pe) { | ||||
| setError("Date of " + dateTime | setError("Date of " + dateTime | ||||
| + " Cannot be parsed correctly. It should be in" | |||||
| + ((pattern == null) | |||||
| ? " MM/DD/YYYY HH:MM AM_PM" : pattern) + " format."); | |||||
| + " Cannot be parsed correctly. It should be in '" | |||||
| + p + "' format.", pe); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -1,129 +1,129 @@ | |||||
| package org.apache.tools.ant.taskdefs.optional; | |||||
| import static org.junit.Assert.assertTrue; | |||||
| import java.io.ByteArrayInputStream; | |||||
| import java.io.File; | |||||
| import java.io.InputStream; | |||||
| import java.security.Permission; | |||||
| import junit.framework.AssertionFailedError; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.taskdefs.XSLTLiaison; | |||||
| import org.apache.tools.ant.taskdefs.XSLTLogger; | |||||
| import org.apache.tools.ant.util.JAXPUtils; | |||||
| import org.junit.After; | |||||
| import org.junit.Assume; | |||||
| import org.junit.Test; | |||||
| /* | |||||
| * 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. | |||||
| * | |||||
| */ | |||||
| /** | |||||
| * TraX XSLTLiaison testcase | |||||
| */ | |||||
| public class TraXLiaisonTest extends AbstractXSLTLiaisonTest | |||||
| implements XSLTLogger { | |||||
| @After | |||||
| public void tearDown() { | |||||
| File f = new File("xalan2-redirect-out.tmp"); | |||||
| if (f.exists()) { | |||||
| f.delete(); | |||||
| } | |||||
| } | |||||
| public XSLTLiaison createLiaison() throws Exception { | |||||
| TraXLiaison l = new TraXLiaison(); | |||||
| l.setLogger(this); | |||||
| return l; | |||||
| } | |||||
| @Test | |||||
| public void testXalan2Redirect() throws Exception { | |||||
| try { | |||||
| getClass().getClassLoader().loadClass("org.apache.xalan.lib.Redirect"); | |||||
| } catch (Exception exc) { | |||||
| Assume.assumeNoException("xalan redirect is not on the classpath", exc); | |||||
| } | |||||
| File xsl = getFile("/taskdefs/optional/xalan-redirect-in.xsl"); | |||||
| liaison.setStylesheet(xsl); | |||||
| File out = new File("xalan2-redirect-out-dummy.tmp"); | |||||
| File in = getFile("/taskdefs/optional/xsltliaison-in.xsl"); | |||||
| ClassLoader orig = Thread.currentThread().getContextClassLoader(); | |||||
| try { | |||||
| liaison.addParam("xalan-version", "2"); | |||||
| // Use the JRE's Xerces, not lib/optional/xerces.jar: | |||||
| Thread.currentThread().setContextClassLoader(new ClassLoader(ClassLoader.getSystemClassLoader().getParent()) { | |||||
| public InputStream getResourceAsStream(String name) { | |||||
| if (name.startsWith("META-INF/services/")) { | |||||
| // work around JAXP #6723276 in JDK 6 | |||||
| return new ByteArrayInputStream(new byte[0]); | |||||
| } | |||||
| return super.getResourceAsStream(name); | |||||
| } | |||||
| }); | |||||
| // Tickle #52382: | |||||
| System.setSecurityManager(new SecurityManager() {public void checkPermission(Permission perm) {}}); | |||||
| liaison.transform(in, out); | |||||
| } finally { | |||||
| out.delete(); | |||||
| Thread.currentThread().setContextClassLoader(orig); | |||||
| System.setSecurityManager(null); | |||||
| } | |||||
| } | |||||
| @Test | |||||
| public void testMultipleTransform() throws Exception { | |||||
| File xsl = getFile("/taskdefs/optional/xsltliaison-in.xsl"); | |||||
| liaison.setStylesheet(xsl); | |||||
| liaison.addParam("param", "value"); | |||||
| File in = getFile("/taskdefs/optional/xsltliaison-in.xml"); | |||||
| // test for 10 consecutives transform | |||||
| for (int i = 0; i < 50; i++){ | |||||
| File out = new File("xsltliaison" + i + ".tmp"); | |||||
| try { | |||||
| liaison.transform(in, out); | |||||
| } catch (Exception e){ | |||||
| throw new BuildException("failed in transform " + i, e); | |||||
| } finally { | |||||
| out.delete(); | |||||
| } | |||||
| } | |||||
| } | |||||
| @Test | |||||
| public void testSystemId(){ | |||||
| File file = null; | |||||
| if ( File.separatorChar == '\\' ){ | |||||
| file = new File("d:\\jdk"); | |||||
| } else { | |||||
| file = new File("/user/local/bin"); | |||||
| } | |||||
| String systemid = JAXPUtils.getSystemId(file); | |||||
| assertTrue("SystemIDs should start by file:/", systemid.startsWith("file:/")); | |||||
| assertTrue("SystemIDs should not start with file:////", !systemid.startsWith("file:////")); | |||||
| } | |||||
| public void log(String message) { | |||||
| throw new AssertionFailedError("Liaison sent message: "+message); | |||||
| } | |||||
| } | |||||
| /* | |||||
| * 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.optional; | |||||
| import static org.junit.Assert.assertTrue; | |||||
| import java.io.ByteArrayInputStream; | |||||
| import java.io.File; | |||||
| import java.io.InputStream; | |||||
| import java.security.Permission; | |||||
| import junit.framework.AssertionFailedError; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.taskdefs.XSLTLiaison; | |||||
| import org.apache.tools.ant.taskdefs.XSLTLogger; | |||||
| import org.apache.tools.ant.util.JAXPUtils; | |||||
| import org.junit.After; | |||||
| import org.junit.Assume; | |||||
| import org.junit.Test; | |||||
| /** | |||||
| * TraX XSLTLiaison testcase | |||||
| */ | |||||
| public class TraXLiaisonTest extends AbstractXSLTLiaisonTest | |||||
| implements XSLTLogger { | |||||
| @After | |||||
| public void tearDown() { | |||||
| File f = new File("xalan2-redirect-out.tmp"); | |||||
| if (f.exists()) { | |||||
| f.delete(); | |||||
| } | |||||
| } | |||||
| public XSLTLiaison createLiaison() throws Exception { | |||||
| TraXLiaison l = new TraXLiaison(); | |||||
| l.setLogger(this); | |||||
| return l; | |||||
| } | |||||
| @Test | |||||
| public void testXalan2Redirect() throws Exception { | |||||
| try { | |||||
| getClass().getClassLoader().loadClass("org.apache.xalan.lib.Redirect"); | |||||
| } catch (Exception exc) { | |||||
| Assume.assumeNoException("xalan redirect is not on the classpath", exc); | |||||
| } | |||||
| File xsl = getFile("/taskdefs/optional/xalan-redirect-in.xsl"); | |||||
| liaison.setStylesheet(xsl); | |||||
| File out = new File("xalan2-redirect-out-dummy.tmp"); | |||||
| File in = getFile("/taskdefs/optional/xsltliaison-in.xsl"); | |||||
| ClassLoader orig = Thread.currentThread().getContextClassLoader(); | |||||
| try { | |||||
| liaison.addParam("xalan-version", "2"); | |||||
| // Use the JRE's Xerces, not lib/optional/xerces.jar: | |||||
| Thread.currentThread().setContextClassLoader(new ClassLoader(ClassLoader.getSystemClassLoader().getParent()) { | |||||
| public InputStream getResourceAsStream(String name) { | |||||
| if (name.startsWith("META-INF/services/")) { | |||||
| // work around JAXP #6723276 in JDK 6 | |||||
| return new ByteArrayInputStream(new byte[0]); | |||||
| } | |||||
| return super.getResourceAsStream(name); | |||||
| } | |||||
| }); | |||||
| // Tickle #52382: | |||||
| System.setSecurityManager(new SecurityManager() {public void checkPermission(Permission perm) {}}); | |||||
| liaison.transform(in, out); | |||||
| } finally { | |||||
| out.delete(); | |||||
| Thread.currentThread().setContextClassLoader(orig); | |||||
| System.setSecurityManager(null); | |||||
| } | |||||
| } | |||||
| @Test | |||||
| public void testMultipleTransform() throws Exception { | |||||
| File xsl = getFile("/taskdefs/optional/xsltliaison-in.xsl"); | |||||
| liaison.setStylesheet(xsl); | |||||
| liaison.addParam("param", "value"); | |||||
| File in = getFile("/taskdefs/optional/xsltliaison-in.xml"); | |||||
| // test for 10 consecutives transform | |||||
| for (int i = 0; i < 50; i++){ | |||||
| File out = new File("xsltliaison" + i + ".tmp"); | |||||
| try { | |||||
| liaison.transform(in, out); | |||||
| } catch (Exception e){ | |||||
| throw new BuildException("failed in transform " + i, e); | |||||
| } finally { | |||||
| out.delete(); | |||||
| } | |||||
| } | |||||
| } | |||||
| @Test | |||||
| public void testSystemId(){ | |||||
| File file = null; | |||||
| if ( File.separatorChar == '\\' ){ | |||||
| file = new File("d:\\jdk"); | |||||
| } else { | |||||
| file = new File("/user/local/bin"); | |||||
| } | |||||
| String systemid = JAXPUtils.getSystemId(file); | |||||
| assertTrue("SystemIDs should start by file:/", systemid.startsWith("file:/")); | |||||
| assertTrue("SystemIDs should not start with file:////", !systemid.startsWith("file:////")); | |||||
| } | |||||
| public void log(String message) { | |||||
| throw new AssertionFailedError("Liaison sent message: "+message); | |||||
| } | |||||
| } | |||||
| @@ -1,229 +1,229 @@ | |||||
| /* | |||||
| * 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.selectors; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.types.Parameter; | |||||
| import org.junit.Assume; | |||||
| import org.junit.Rule; | |||||
| import org.junit.Test; | |||||
| import static org.junit.Assert.assertEquals; | |||||
| import static org.junit.Assert.fail; | |||||
| /** | |||||
| * Tests Date Selectors. | |||||
| * | |||||
| */ | |||||
| public class DateSelectorTest { | |||||
| @Rule | |||||
| public final BaseSelectorRule selectorRule = new BaseSelectorRule(); | |||||
| /** | |||||
| * Test the code that validates the selector. | |||||
| */ | |||||
| @Test | |||||
| public void testValidate() { | |||||
| DateSelector s = new DateSelector(); | |||||
| try { | |||||
| s.isSelected(selectorRule.getProject().getBaseDir(),selectorRule.getFilenames()[0],selectorRule.getFiles()[0]); | |||||
| fail("DateSelector did not check for required fields"); | |||||
| } catch (BuildException be1) { | |||||
| assertEquals("You must provide a datetime or the number of " | |||||
| + "milliseconds.", be1.getMessage()); | |||||
| } | |||||
| s = new DateSelector(); | |||||
| s.setDatetime("01/01/1969 01:01 AM"); | |||||
| try { | |||||
| s.isSelected(selectorRule.getProject().getBaseDir(),selectorRule.getFilenames()[0],selectorRule.getFiles()[0]); | |||||
| fail("DateSelector did not check for Datetime being in the " | |||||
| + "allowable range"); | |||||
| } catch (BuildException be2) { | |||||
| assertEquals("Date of 01/01/1969 01:01 AM results in negative " | |||||
| + "milliseconds value relative to epoch (January 1, " | |||||
| + "1970, 00:00:00 GMT).", be2.getMessage()); | |||||
| } | |||||
| s = new DateSelector(); | |||||
| s.setDatetime("this is not a date"); | |||||
| try { | |||||
| s.isSelected(selectorRule.getProject().getBaseDir(),selectorRule.getFilenames()[0],selectorRule.getFiles()[0]); | |||||
| fail("DateSelector did not check for Datetime being in a " | |||||
| + "valid format"); | |||||
| } catch (BuildException be3) { | |||||
| assertEquals("Date of this is not a date" | |||||
| + " Cannot be parsed correctly. It should be in" | |||||
| + " MM/DD/YYYY HH:MM AM_PM format.", be3.getMessage()); | |||||
| } | |||||
| s = new DateSelector(); | |||||
| Parameter param = new Parameter(); | |||||
| param.setName("garbage in"); | |||||
| param.setValue("garbage out"); | |||||
| Parameter[] params = new Parameter[1]; | |||||
| params[0] = param; | |||||
| s.setParameters(params); | |||||
| try { | |||||
| s.isSelected(selectorRule.getProject().getBaseDir(),selectorRule.getFilenames()[0],selectorRule.getFiles()[0]); | |||||
| fail("DateSelector did not check for valid parameter element"); | |||||
| } catch (BuildException be4) { | |||||
| assertEquals("Invalid parameter garbage in", be4.getMessage()); | |||||
| } | |||||
| s = new DateSelector(); | |||||
| param = new Parameter(); | |||||
| param.setName("millis"); | |||||
| param.setValue("garbage out"); | |||||
| params[0] = param; | |||||
| s.setParameters(params); | |||||
| try { | |||||
| s.isSelected(selectorRule.getProject().getBaseDir(),selectorRule.getFilenames()[0],selectorRule.getFiles()[0]); | |||||
| fail("DateSelector did not check for valid millis parameter"); | |||||
| } catch (BuildException be5) { | |||||
| assertEquals("Invalid millisecond setting garbage out", | |||||
| be5.getMessage()); | |||||
| } | |||||
| s = new DateSelector(); | |||||
| param = new Parameter(); | |||||
| param.setName("granularity"); | |||||
| param.setValue("garbage out"); | |||||
| params[0] = param; | |||||
| s.setParameters(params); | |||||
| try { | |||||
| s.isSelected(selectorRule.getProject().getBaseDir(),selectorRule.getFilenames()[0],selectorRule.getFiles()[0]); | |||||
| fail("DateSelector did not check for valid granularity parameter"); | |||||
| } catch (BuildException be6) { | |||||
| assertEquals("Invalid granularity setting garbage out", | |||||
| be6.getMessage()); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Tests to make sure that the selector is selecting files correctly. | |||||
| */ | |||||
| @Test | |||||
| public void testSelectionBehaviour() { | |||||
| DateSelector s; | |||||
| String results; | |||||
| DateSelector.TimeComparisons before = new | |||||
| DateSelector.TimeComparisons(); | |||||
| before.setValue("before"); | |||||
| DateSelector.TimeComparisons equal = new | |||||
| DateSelector.TimeComparisons(); | |||||
| equal.setValue("equal"); | |||||
| DateSelector.TimeComparisons after = new | |||||
| DateSelector.TimeComparisons(); | |||||
| after.setValue("after"); | |||||
| s = new DateSelector(); | |||||
| s.setDatetime("10/10/1999 1:45 PM"); | |||||
| s.setWhen(before); | |||||
| results = selectorRule.selectionString(s); | |||||
| assertEquals("TFFFFFFFFFFT", results); | |||||
| s = new DateSelector(); | |||||
| s.setDatetime("10/10/1999 1:45 PM"); | |||||
| s.setWhen(before); | |||||
| s.setCheckdirs(true); | |||||
| results = selectorRule.selectionString(s); | |||||
| assertEquals("FFFFFFFFFFFF", results); | |||||
| s = new DateSelector(); | |||||
| s.setDatetime("10/10/1999 1:45 PM"); | |||||
| s.setWhen(after); | |||||
| results = selectorRule.selectionString(s); | |||||
| assertEquals("TTTTTTTTTTTT", results); | |||||
| s = new DateSelector(); | |||||
| s.setDatetime("11/21/2001 4:54 AM"); | |||||
| s.setWhen(before); | |||||
| results = selectorRule.selectionString(s); | |||||
| assertEquals("TFTFFFFFFFFT", results); | |||||
| s = new DateSelector(); | |||||
| s.setDatetime("11/21/2001 4:55 AM"); | |||||
| long milliseconds = s.getMillis(); | |||||
| s.setWhen(equal); | |||||
| results = selectorRule.selectionString(s); | |||||
| assertEquals("TTFFTFFFTTTT", results); | |||||
| s = new DateSelector(); | |||||
| s.setMillis(milliseconds); | |||||
| s.setWhen(equal); | |||||
| results = selectorRule.selectionString(s); | |||||
| assertEquals("TTFFTFFFTTTT", results); | |||||
| s = new DateSelector(); | |||||
| s.setDatetime("11/21/2001 4:56 AM"); | |||||
| s.setWhen(after); | |||||
| results = selectorRule.selectionString(s); | |||||
| assertEquals("TFFTFTTTFFFT", results); | |||||
| s = new DateSelector(); | |||||
| Parameter param1 = new Parameter(); | |||||
| Parameter param2 = new Parameter(); | |||||
| param1.setName("datetime"); | |||||
| param1.setValue("11/21/2001 4:56 AM"); | |||||
| param2.setName("when"); | |||||
| param2.setValue("after"); | |||||
| Parameter[] params = {param1,param2}; | |||||
| s.setParameters(params); | |||||
| results = selectorRule.selectionString(s); | |||||
| assertEquals("TFFTFTTTFFFT", results); | |||||
| s = new DateSelector(); | |||||
| long testtime = selectorRule.getMirrorFiles()[5].lastModified(); | |||||
| s.setMillis(testtime); | |||||
| s.setWhen(after); | |||||
| s.setGranularity(2); | |||||
| // setup the modified timestamp to match what the test needs, although be aware that the 3rd and 4th | |||||
| // files don't exist so can't be changed, so don't try and loop over them | |||||
| for (int i = 1; i <=2; i++) { | |||||
| Assume.assumeTrue("Cannot setup file times for test", selectorRule.getMirrorFiles()[i].setLastModified(testtime - (3*60*60*100))); | |||||
| } | |||||
| results = selectorRule.mirrorSelectionString(s); | |||||
| assertEquals("TFFFFTTTTTTT", results); | |||||
| s = new DateSelector(); | |||||
| testtime = selectorRule.getMirrorFiles()[6].lastModified(); | |||||
| s.setMillis(testtime); | |||||
| s.setWhen(before); | |||||
| s.setGranularity(2); | |||||
| for (int i = 7; i <= 10; i++) { | |||||
| Assume.assumeTrue("Cannot setup file times for test", selectorRule.getMirrorFiles()[i].setLastModified(testtime + (3*60*60*100))); | |||||
| } | |||||
| results = selectorRule.mirrorSelectionString(s); | |||||
| assertEquals("TTTTTTTFFFFT", results); | |||||
| } | |||||
| } | |||||
| /* | |||||
| * 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.selectors; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.types.Parameter; | |||||
| import org.junit.Assume; | |||||
| import org.junit.Rule; | |||||
| import org.junit.Test; | |||||
| import static org.junit.Assert.assertEquals; | |||||
| import static org.junit.Assert.fail; | |||||
| /** | |||||
| * Tests Date Selectors. | |||||
| * | |||||
| */ | |||||
| public class DateSelectorTest { | |||||
| @Rule | |||||
| public final BaseSelectorRule selectorRule = new BaseSelectorRule(); | |||||
| /** | |||||
| * Test the code that validates the selector. | |||||
| */ | |||||
| @Test | |||||
| public void testValidate() { | |||||
| DateSelector s = new DateSelector(); | |||||
| try { | |||||
| s.isSelected(selectorRule.getProject().getBaseDir(),selectorRule.getFilenames()[0],selectorRule.getFiles()[0]); | |||||
| fail("DateSelector did not check for required fields"); | |||||
| } catch (BuildException be1) { | |||||
| assertEquals("You must provide a datetime or the number of " | |||||
| + "milliseconds.", be1.getMessage()); | |||||
| } | |||||
| s = new DateSelector(); | |||||
| s.setDatetime("01/01/1969 01:01 AM"); | |||||
| try { | |||||
| s.isSelected(selectorRule.getProject().getBaseDir(),selectorRule.getFilenames()[0],selectorRule.getFiles()[0]); | |||||
| fail("DateSelector did not check for Datetime being in the " | |||||
| + "allowable range"); | |||||
| } catch (BuildException be2) { | |||||
| assertEquals("Date of 01/01/1969 01:01 AM results in negative " | |||||
| + "milliseconds value relative to epoch (January 1, " | |||||
| + "1970, 00:00:00 GMT).", be2.getMessage()); | |||||
| } | |||||
| s = new DateSelector(); | |||||
| s.setDatetime("this is not a date"); | |||||
| try { | |||||
| s.isSelected(selectorRule.getProject().getBaseDir(),selectorRule.getFilenames()[0],selectorRule.getFiles()[0]); | |||||
| fail("DateSelector did not check for Datetime being in a " | |||||
| + "valid format"); | |||||
| } catch (BuildException be3) { | |||||
| assertEquals("Date of this is not a date" | |||||
| + " Cannot be parsed correctly. It should be in" | |||||
| + " 'MM/dd/yyyy hh:mm a' format.", be3.getMessage()); | |||||
| } | |||||
| s = new DateSelector(); | |||||
| Parameter param = new Parameter(); | |||||
| param.setName("garbage in"); | |||||
| param.setValue("garbage out"); | |||||
| Parameter[] params = new Parameter[1]; | |||||
| params[0] = param; | |||||
| s.setParameters(params); | |||||
| try { | |||||
| s.isSelected(selectorRule.getProject().getBaseDir(),selectorRule.getFilenames()[0],selectorRule.getFiles()[0]); | |||||
| fail("DateSelector did not check for valid parameter element"); | |||||
| } catch (BuildException be4) { | |||||
| assertEquals("Invalid parameter garbage in", be4.getMessage()); | |||||
| } | |||||
| s = new DateSelector(); | |||||
| param = new Parameter(); | |||||
| param.setName("millis"); | |||||
| param.setValue("garbage out"); | |||||
| params[0] = param; | |||||
| s.setParameters(params); | |||||
| try { | |||||
| s.isSelected(selectorRule.getProject().getBaseDir(),selectorRule.getFilenames()[0],selectorRule.getFiles()[0]); | |||||
| fail("DateSelector did not check for valid millis parameter"); | |||||
| } catch (BuildException be5) { | |||||
| assertEquals("Invalid millisecond setting garbage out", | |||||
| be5.getMessage()); | |||||
| } | |||||
| s = new DateSelector(); | |||||
| param = new Parameter(); | |||||
| param.setName("granularity"); | |||||
| param.setValue("garbage out"); | |||||
| params[0] = param; | |||||
| s.setParameters(params); | |||||
| try { | |||||
| s.isSelected(selectorRule.getProject().getBaseDir(),selectorRule.getFilenames()[0],selectorRule.getFiles()[0]); | |||||
| fail("DateSelector did not check for valid granularity parameter"); | |||||
| } catch (BuildException be6) { | |||||
| assertEquals("Invalid granularity setting garbage out", | |||||
| be6.getMessage()); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Tests to make sure that the selector is selecting files correctly. | |||||
| */ | |||||
| @Test | |||||
| public void testSelectionBehaviour() { | |||||
| DateSelector s; | |||||
| String results; | |||||
| DateSelector.TimeComparisons before = new | |||||
| DateSelector.TimeComparisons(); | |||||
| before.setValue("before"); | |||||
| DateSelector.TimeComparisons equal = new | |||||
| DateSelector.TimeComparisons(); | |||||
| equal.setValue("equal"); | |||||
| DateSelector.TimeComparisons after = new | |||||
| DateSelector.TimeComparisons(); | |||||
| after.setValue("after"); | |||||
| s = new DateSelector(); | |||||
| s.setDatetime("10/10/1999 1:45 PM"); | |||||
| s.setWhen(before); | |||||
| results = selectorRule.selectionString(s); | |||||
| assertEquals("TFFFFFFFFFFT", results); | |||||
| s = new DateSelector(); | |||||
| s.setDatetime("10/10/1999 1:45 PM"); | |||||
| s.setWhen(before); | |||||
| s.setCheckdirs(true); | |||||
| results = selectorRule.selectionString(s); | |||||
| assertEquals("FFFFFFFFFFFF", results); | |||||
| s = new DateSelector(); | |||||
| s.setDatetime("10/10/1999 1:45 PM"); | |||||
| s.setWhen(after); | |||||
| results = selectorRule.selectionString(s); | |||||
| assertEquals("TTTTTTTTTTTT", results); | |||||
| s = new DateSelector(); | |||||
| s.setDatetime("11/21/2001 4:54 AM"); | |||||
| s.setWhen(before); | |||||
| results = selectorRule.selectionString(s); | |||||
| assertEquals("TFTFFFFFFFFT", results); | |||||
| s = new DateSelector(); | |||||
| s.setDatetime("11/21/2001 4:55 AM"); | |||||
| long milliseconds = s.getMillis(); | |||||
| s.setWhen(equal); | |||||
| results = selectorRule.selectionString(s); | |||||
| assertEquals("TTFFTFFFTTTT", results); | |||||
| s = new DateSelector(); | |||||
| s.setMillis(milliseconds); | |||||
| s.setWhen(equal); | |||||
| results = selectorRule.selectionString(s); | |||||
| assertEquals("TTFFTFFFTTTT", results); | |||||
| s = new DateSelector(); | |||||
| s.setDatetime("11/21/2001 4:56 AM"); | |||||
| s.setWhen(after); | |||||
| results = selectorRule.selectionString(s); | |||||
| assertEquals("TFFTFTTTFFFT", results); | |||||
| s = new DateSelector(); | |||||
| Parameter param1 = new Parameter(); | |||||
| Parameter param2 = new Parameter(); | |||||
| param1.setName("datetime"); | |||||
| param1.setValue("11/21/2001 4:56 AM"); | |||||
| param2.setName("when"); | |||||
| param2.setValue("after"); | |||||
| Parameter[] params = {param1,param2}; | |||||
| s.setParameters(params); | |||||
| results = selectorRule.selectionString(s); | |||||
| assertEquals("TFFTFTTTFFFT", results); | |||||
| s = new DateSelector(); | |||||
| long testtime = selectorRule.getMirrorFiles()[5].lastModified(); | |||||
| s.setMillis(testtime); | |||||
| s.setWhen(after); | |||||
| s.setGranularity(2); | |||||
| // setup the modified timestamp to match what the test needs, although be aware that the 3rd and 4th | |||||
| // files don't exist so can't be changed, so don't try and loop over them | |||||
| for (int i = 1; i <=2; i++) { | |||||
| Assume.assumeTrue("Cannot setup file times for test", selectorRule.getMirrorFiles()[i].setLastModified(testtime - (3*60*60*100))); | |||||
| } | |||||
| results = selectorRule.mirrorSelectionString(s); | |||||
| assertEquals("TFFFFTTTTTTT", results); | |||||
| s = new DateSelector(); | |||||
| testtime = selectorRule.getMirrorFiles()[6].lastModified(); | |||||
| s.setMillis(testtime); | |||||
| s.setWhen(before); | |||||
| s.setGranularity(2); | |||||
| for (int i = 7; i <= 10; i++) { | |||||
| Assume.assumeTrue("Cannot setup file times for test", selectorRule.getMirrorFiles()[i].setLastModified(testtime + (3*60*60*100))); | |||||
| } | |||||
| results = selectorRule.mirrorSelectionString(s); | |||||
| assertEquals("TTTTTTTFFFFT", results); | |||||
| } | |||||
| } | |||||