git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271422 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -62,12 +62,13 @@ import java.io.OutputStream; | |||
| import java.io.ByteArrayOutputStream; | |||
| import java.io.ByteArrayInputStream; | |||
| import java.util.Calendar; | |||
| import java.util.Hashtable; | |||
| import java.util.Stack; | |||
| import java.util.Vector; | |||
| import java.util.zip.CRC32; | |||
| import java.util.zip.ZipInputStream; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.FileScanner; | |||
| import org.apache.tools.ant.Project; | |||
| @@ -76,6 +77,7 @@ import org.apache.tools.ant.types.FileSet; | |||
| import org.apache.tools.ant.types.EnumeratedAttribute; | |||
| import org.apache.tools.ant.types.ZipFileSet; | |||
| import org.apache.tools.ant.types.ZipScanner; | |||
| import org.apache.tools.ant.util.DateUtils; | |||
| import org.apache.tools.ant.util.FileUtils; | |||
| import org.apache.tools.ant.util.SourceFileScanner; | |||
| import org.apache.tools.ant.util.MergingMapper; | |||
| @@ -135,9 +137,21 @@ public class Zip extends MatchingTask { | |||
| * @deprecated Use setDestFile(File) instead | |||
| */ | |||
| public void setFile(File file) { | |||
| log("DEPRECATED - The file attribute has been renamed destfile." | |||
| +" This attribute will be unsupported before Ant1.5 is released", | |||
| log("DEPRECATED - The file attribute has been renamed destfile.", | |||
| Project.MSG_ERR); | |||
| log("This attribute will be unsupported before Ant1.5 is released.", | |||
| Project.MSG_ERR); | |||
| log("Be aware that the effect of using the file attribute depends on", | |||
| Project.MSG_ERR); | |||
| log("the phase of the moon.", Project.MSG_WARN); | |||
| int phase = DateUtils.getPhaseOfMoon(Calendar.getInstance()); | |||
| if (phase == 4) { | |||
| log("You are lucky! Full moon tonight."); | |||
| } else if (phase == 0) { | |||
| log("Be careful! New moon tonight.", Project.MSG_WARN); | |||
| } | |||
| setDestFile(file); | |||
| } | |||
| @@ -57,6 +57,7 @@ import java.text.ChoiceFormat; | |||
| import java.text.DateFormat; | |||
| import java.text.MessageFormat; | |||
| import java.text.SimpleDateFormat; | |||
| import java.util.Calendar; | |||
| import java.util.Date; | |||
| import java.util.TimeZone; | |||
| @@ -66,6 +67,11 @@ import java.util.TimeZone; | |||
| * or a plurialization correct elapsed time in minutes and seconds. | |||
| * | |||
| * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * | |||
| * @since Ant 1.5 | |||
| * | |||
| * @version $Revision$ | |||
| */ | |||
| public final class DateUtils { | |||
| @@ -172,4 +178,45 @@ public final class DateUtils { | |||
| return sdf; | |||
| } | |||
| /** | |||
| * Calculate the phase of the moon for a given date. | |||
| * | |||
| * <p>Code heavily influenced by hacklib.c in <a | |||
| * href="http://www.nethack.org/">Nethack</a></p> | |||
| * | |||
| * <p>The Algorithm: | |||
| * | |||
| * <pre> | |||
| * moon period = 29.53058 days ~= 30, year = 365.2422 days | |||
| * | |||
| * days moon phase advances on first day of year compared to preceding year | |||
| * = 365.2422 - 12*29.53058 ~= 11 | |||
| * | |||
| * years in Metonic cycle (time until same phases fall on the same days of | |||
| * the month) = 18.6 ~= 19 | |||
| * | |||
| * moon phase on first day of year (epact) ~= (11*(year%19) + 18) % 30 | |||
| * (18 as initial condition for 1900) | |||
| * | |||
| * current phase in days = first day phase + days elapsed in year | |||
| * | |||
| * 6 moons ~= 177 days | |||
| * 177 ~= 8 reported phases * 22 | |||
| * + 11/22 for rounding | |||
| * </pre> | |||
| * | |||
| * @return The phase of the moon as a number between 0 and 7 with | |||
| * 0 meaning new moon and 4 meaning full moon. | |||
| * | |||
| * @since 1.2, Ant 1.5 | |||
| */ | |||
| public static int getPhaseOfMoon(Calendar cal) { | |||
| int dayOfTheYear = cal.get(Calendar.DAY_OF_YEAR); | |||
| int yearInMetonicCycle = ((cal.get(Calendar.YEAR)-1900) % 19) + 1; | |||
| int epact = (11 * yearInMetonicCycle + 18) % 30; | |||
| if ((epact == 25 && yearInMetonicCycle > 11) || epact == 24) { | |||
| epact++; | |||
| } | |||
| return (((((dayOfTheYear + epact) * 6) + 11) % 177) / 22) & 7; | |||
| } | |||
| } | |||
| @@ -63,6 +63,7 @@ import junit.framework.TestCase; | |||
| * TestCase for DateUtils. | |||
| * | |||
| * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| */ | |||
| public class DateUtilsTest extends TestCase { | |||
| public DateUtilsTest(String s) { | |||
| @@ -115,4 +116,15 @@ public class DateUtilsTest extends TestCase { | |||
| DateUtils.ISO8601_TIME_PATTERN); | |||
| assertEquals("20:11:12", text); | |||
| } | |||
| public void testPhaseOfMoon() { | |||
| TimeZone timeZone = TimeZone.getTimeZone("GMT"); | |||
| Calendar cal = Calendar.getInstance(timeZone); | |||
| // should be full moon | |||
| cal.set(2002, 2, 27); | |||
| assertEquals(4, DateUtils.getPhaseOfMoon(cal)); | |||
| // should be new moon | |||
| cal.set(2002, 2, 12); | |||
| assertEquals(0, DateUtils.getPhaseOfMoon(cal)); | |||
| } | |||
| } | |||