another attempt at setting Zip timestamps
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSC.java b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSC.java
index 1e52a2c..2d42011 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSC.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSC.java
@@ -28,6 +28,8 @@
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
import java.util.*;
import java.util.zip.CRC32;
import java.util.zip.Deflater;
@@ -502,30 +504,15 @@
String metadataFormat = targetSettings.getSWFMetadataDateFormat();
try {
SimpleDateFormat sdf = new SimpleDateFormat(metadataFormat);
- sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
- fileDate = sdf.parse(metadataDate).getTime();
- } catch (ParseException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalArgumentException e1) {
- e1.printStackTrace();
- }
- // TODO: Fix this the same way that the compiler normalized the date
- // strip off timezone. Zip format doesn't store timezone
- // and the goal is to have the same date and time regardless
- // of which timezone the build machine is using.
- int c = metadataDate.lastIndexOf(' ');
- if(c != -1) {
- metadataDate = metadataDate.substring(0, c);
- }
- c = metadataFormat.lastIndexOf(' ');
- if(c != -1) {
- metadataFormat = metadataFormat.substring(0, c);
- }
- try {
- SimpleDateFormat sdf = new SimpleDateFormat(metadataFormat);
- sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
- zipFileDate = sdf.parse(metadataDate).getTime();
+ Date d = sdf.parse(metadataDate);
+ Calendar cal = new GregorianCalendar();
+ cal.setTime(d);
+ sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
+ d = sdf.parse(metadataDate);
+ fileDate = d.getTime();
+ ZonedDateTime zdt = ZonedDateTime.of(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH),
+ cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND), 0, ZoneId.systemDefault());
+ zipFileDate = zdt.toInstant().toEpochMilli();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
@@ -595,8 +582,15 @@
String metadataFormat = targetSettings.getSWFMetadataDateFormat();
try {
SimpleDateFormat sdf = new SimpleDateFormat(metadataFormat);
+ Date d = sdf.parse(metadataDate);
+ Calendar cal = new GregorianCalendar();
+ cal.setTime(d);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
- fileDate = sdf.parse(metadataDate).getTime();
+ d = sdf.parse(metadataDate);
+ fileDate = d.getTime();
+ ZonedDateTime zdt = ZonedDateTime.of(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH),
+ cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND), 0, ZoneId.systemDefault());
+ zipFileDate = zdt.toInstant().toEpochMilli();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
@@ -617,8 +611,17 @@
}
try {
SimpleDateFormat sdf = new SimpleDateFormat(metadataFormat);
+ Date d = sdf.parse(metadataDate);
+ // zip file wants dates in local time
+ Calendar cal = new GregorianCalendar();
+ cal.setTime(d);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
- zipFileDate = sdf.parse(metadataDate).getTime();
+ d = sdf.parse(metadataDate);
+ // other timestamps are in UTC
+ fileDate = d.getTime();
+ ZonedDateTime zdt = ZonedDateTime.of(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH),
+ cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND), 0, ZoneId.systemDefault());
+ zipFileDate = zdt.toInstant().toEpochMilli();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCRoyale.java b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCRoyale.java
index d2eed7d..a370772 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCRoyale.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCRoyale.java
@@ -28,6 +28,8 @@
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
import java.util.*;
import java.util.zip.CRC32;
import java.util.zip.Deflater;
@@ -220,30 +222,15 @@
String metadataFormat = targetSettings.getSWFMetadataDateFormat();
try {
SimpleDateFormat sdf = new SimpleDateFormat(metadataFormat);
- sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
- fileDate = sdf.parse(metadataDate).getTime();
- } catch (ParseException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalArgumentException e1) {
- e1.printStackTrace();
- }
- // TODO: Fix this the same way that the compiler normalized the date
- // strip off timezone. Zip format doesn't store timezone
- // and the goal is to have the same date and time regardless
- // of which timezone the build machine is using.
- int c = metadataDate.lastIndexOf(' ');
- if(c != -1) {
- metadataDate = metadataDate.substring(0, c);
- }
- c = metadataFormat.lastIndexOf(' ');
- if(c != -1) {
- metadataFormat = metadataFormat.substring(0, c);
- }
- try {
- SimpleDateFormat sdf = new SimpleDateFormat(metadataFormat);
- sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
- zipFileDate = sdf.parse(metadataDate).getTime();
+ Date d = sdf.parse(metadataDate);
+ Calendar cal = new GregorianCalendar();
+ cal.setTime(d);
+ sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
+ d = sdf.parse(metadataDate);
+ fileDate = d.getTime();
+ ZonedDateTime zdt = ZonedDateTime.of(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH),
+ cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND), 0, ZoneId.systemDefault());
+ zipFileDate = zdt.toInstant().toEpochMilli();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
@@ -403,30 +390,15 @@
String metadataFormat = targetSettings.getSWFMetadataDateFormat();
try {
SimpleDateFormat sdf = new SimpleDateFormat(metadataFormat);
- sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
- fileDate = sdf.parse(metadataDate).getTime();
- } catch (ParseException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalArgumentException e1) {
- e1.printStackTrace();
- }
- // TODO: Fix this the same way that the compiler normalized the date
- // strip off timezone. Zip format doesn't store timezone
- // and the goal is to have the same date and time regardless
- // of which timezone the build machine is using.
- int c = metadataDate.lastIndexOf(' ');
- if(c != -1) {
- metadataDate = metadataDate.substring(0, c);
- }
- c = metadataFormat.lastIndexOf(' ');
- if(c != -1) {
- metadataFormat = metadataFormat.substring(0, c);
- }
- try {
- SimpleDateFormat sdf = new SimpleDateFormat(metadataFormat);
- sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
- zipFileDate = sdf.parse(metadataDate).getTime();
+ Date d = sdf.parse(metadataDate);
+ Calendar cal = new GregorianCalendar();
+ cal.setTime(d);
+ sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
+ d = sdf.parse(metadataDate);
+ fileDate = d.getTime();
+ ZonedDateTime zdt = ZonedDateTime.of(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH),
+ cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND), 0, ZoneId.systemDefault());
+ zipFileDate = zdt.toInstant().toEpochMilli();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
@@ -505,30 +477,15 @@
String metadataFormat = targetSettings.getSWFMetadataDateFormat();
try {
SimpleDateFormat sdf = new SimpleDateFormat(metadataFormat);
+ Date d = sdf.parse(metadataDate);
+ Calendar cal = new GregorianCalendar();
+ cal.setTime(d);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
- fileDate = sdf.parse(metadataDate).getTime();
- } catch (ParseException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalArgumentException e1) {
- e1.printStackTrace();
- }
- // TODO: Fix this the same way that the compiler normalized the date
- // strip off timezone. Zip format doesn't store timezone
- // and the goal is to have the same date and time regardless
- // of which timezone the build machine is using.
- int c = metadataDate.lastIndexOf(' ');
- if(c != -1) {
- metadataDate = metadataDate.substring(0, c);
- }
- c = metadataFormat.lastIndexOf(' ');
- if(c != -1) {
- metadataFormat = metadataFormat.substring(0, c);
- }
- try {
- SimpleDateFormat sdf = new SimpleDateFormat(metadataFormat);
- sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
- zipFileDate = sdf.parse(metadataDate).getTime();
+ d = sdf.parse(metadataDate);
+ fileDate = d.getTime();
+ ZonedDateTime zdt = ZonedDateTime.of(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH),
+ cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND), 0, ZoneId.systemDefault());
+ zipFileDate = zdt.toInstant().toEpochMilli();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
diff --git a/compiler/src/main/java/org/apache/royale/swc/io/SWCWriter.java b/compiler/src/main/java/org/apache/royale/swc/io/SWCWriter.java
index c1a1a77..5ab959d 100644
--- a/compiler/src/main/java/org/apache/royale/swc/io/SWCWriter.java
+++ b/compiler/src/main/java/org/apache/royale/swc/io/SWCWriter.java
@@ -31,6 +31,11 @@
import java.security.DigestOutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
import java.util.TimeZone;
import java.util.zip.CRC32;
import java.util.zip.Deflater;
@@ -86,32 +91,23 @@
File outputDirectory = new File(outputFile.getAbsoluteFile().getParent());
outputDirectory.mkdirs();
- /*
if (metadataDate != null)
{
- // TODO: Perhaps parsing without modification and then serializing with a default timezone is the more solid approach.
- // strip off timezone. Zip format doesn't store timezone
- // and the goal is to have the same date and time regardless
- // of which timezone the build machine is using.
- int c = metadataDate.lastIndexOf(' ');
- if(c != -1) {
- metadataDate = metadataDate.substring(0, c);
- }
- c = metadataFormat.lastIndexOf(' ');
- if(c != -1) {
- metadataFormat = metadataFormat.substring(0, c);
- }
try {
SimpleDateFormat sdf = new SimpleDateFormat(metadataFormat);
- sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
- fileDate = sdf.parse(metadataDate).getTime();
+ Date d = sdf.parse(metadataDate);
+ Calendar cal = new GregorianCalendar();
+ cal.setTime(d);
+ ZonedDateTime zdt = ZonedDateTime.of(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH),
+ cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND), 0, ZoneId.systemDefault());
+ fileDate = zdt.toInstant().toEpochMilli();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
}
- }*/
+ }
zipOutputStream = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(filename)));
zipOutputStream.setLevel(Deflater.NO_COMPRESSION);
@@ -122,7 +118,7 @@
*/
private final ZipOutputStream zipOutputStream;
- private long fileDate = -1;
+ private long fileDate = System.currentTimeMillis();
@Override
void writeCatalog(final ISWC swc) throws IOException