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.ByteArrayOutputStream; | ||||
import java.io.ByteArrayInputStream; | import java.io.ByteArrayInputStream; | ||||
import java.util.Calendar; | |||||
import java.util.Hashtable; | import java.util.Hashtable; | ||||
import java.util.Stack; | import java.util.Stack; | ||||
import java.util.Vector; | import java.util.Vector; | ||||
import java.util.zip.CRC32; | import java.util.zip.CRC32; | ||||
import java.util.zip.ZipInputStream; | import java.util.zip.ZipInputStream; | ||||
import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
import org.apache.tools.ant.FileScanner; | import org.apache.tools.ant.FileScanner; | ||||
import org.apache.tools.ant.Project; | 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.EnumeratedAttribute; | ||||
import org.apache.tools.ant.types.ZipFileSet; | import org.apache.tools.ant.types.ZipFileSet; | ||||
import org.apache.tools.ant.types.ZipScanner; | 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.FileUtils; | ||||
import org.apache.tools.ant.util.SourceFileScanner; | import org.apache.tools.ant.util.SourceFileScanner; | ||||
import org.apache.tools.ant.util.MergingMapper; | import org.apache.tools.ant.util.MergingMapper; | ||||
@@ -135,9 +137,21 @@ public class Zip extends MatchingTask { | |||||
* @deprecated Use setDestFile(File) instead | * @deprecated Use setDestFile(File) instead | ||||
*/ | */ | ||||
public void setFile(File file) { | 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); | 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); | setDestFile(file); | ||||
} | } | ||||
@@ -57,6 +57,7 @@ import java.text.ChoiceFormat; | |||||
import java.text.DateFormat; | import java.text.DateFormat; | ||||
import java.text.MessageFormat; | import java.text.MessageFormat; | ||||
import java.text.SimpleDateFormat; | import java.text.SimpleDateFormat; | ||||
import java.util.Calendar; | |||||
import java.util.Date; | import java.util.Date; | ||||
import java.util.TimeZone; | import java.util.TimeZone; | ||||
@@ -66,6 +67,11 @@ import java.util.TimeZone; | |||||
* or a plurialization correct elapsed time in minutes and seconds. | * or a plurialization correct elapsed time in minutes and seconds. | ||||
* | * | ||||
* @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | * @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 { | public final class DateUtils { | ||||
@@ -172,4 +178,45 @@ public final class DateUtils { | |||||
return sdf; | 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. | * TestCase for DateUtils. | ||||
* | * | ||||
* @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | * @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 class DateUtilsTest extends TestCase { | ||||
public DateUtilsTest(String s) { | public DateUtilsTest(String s) { | ||||
@@ -115,4 +116,15 @@ public class DateUtilsTest extends TestCase { | |||||
DateUtils.ISO8601_TIME_PATTERN); | DateUtils.ISO8601_TIME_PATTERN); | ||||
assertEquals("20:11:12", text); | 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)); | |||||
} | |||||
} | } |