COMPJSC: reduce duplicate code for writing zip file entries to SWCs
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 979d70e..5c058b9 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
@@ -496,48 +496,9 @@
                             {
                                 System.out.println("Writing file: " + outputClassFile);     	
                             }
-	                        long fileDate = System.currentTimeMillis();
-	                        long zipFileDate = fileDate;
-	                    	String metadataDate = targetSettings.getSWFMetadataDate();
-	                    	if (metadataDate != null)
-	                    	{
-	                    		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"));
-	                    			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();
-	                			} catch (IllegalArgumentException e1) {
-	                				e1.printStackTrace();
-	                			}
-	                    	}
-	                    	ZipEntry ze = new ZipEntry(outputClassFile);
-	                    	ze.setTime(zipFileDate);
-	                    	ze.setMethod(ZipEntry.STORED);
-	                    	
 	                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
 	                        temp.writeTo(baos);
-	                        ze.setSize(baos.size());
-	                        ze.setCompressedSize(baos.size());
-	                        CRC32 crc = new CRC32();
-	                        crc.reset();
-	                        crc.update(baos.toByteArray());
-	                        ze.setCrc(crc.getValue());
-
-	                        zipOutputStream.putNextEntry(ze);
-	                        baos.writeTo(zipOutputStream);
-                            zipOutputStream.flush();
-	                        zipOutputStream.closeEntry();
-	                        fileList.append("        <file path=\"" + outputClassFile + "\" mod=\"" + fileDate + "\"/>\n");
+                            writeFileToZip(zipOutputStream, outputClassFile, baos, fileList);
                             if(sourceMapTemp != null)
                             {
                                 String sourceMapFile = getOutputSourceMapFile(
@@ -549,24 +510,9 @@
                                 {
                                     System.out.println("Writing file: " + sourceMapFile);
                                 }
-                                ze = new ZipEntry(sourceMapFile);
-    	                    	ze.setTime(zipFileDate);
-    	                    	ze.setMethod(ZipEntry.STORED);
-    	                    	
     	                        baos = new ByteArrayOutputStream();
                                 sourceMapTemp.writeTo(baos);
-    	                        ze.setSize(baos.size());
-    	                        ze.setCompressedSize(baos.size());
-    	                        crc = new CRC32();
-    	                        crc.reset();
-    	                        crc.update(baos.toByteArray());
-    	                        ze.setCrc(crc.getValue());
-                                
-                                zipOutputStream.putNextEntry(ze);
-    	                        baos.writeTo(zipOutputStream);
-                                zipOutputStream.flush();
-                                zipOutputStream.closeEntry();
-                                fileList.append("        <file path=\"" + sourceMapFile + "\" mod=\"" + fileDate + "\"/>\n");
+                                writeFileToZip(zipOutputStream, sourceMapFile, baos, fileList);
                             }
                             writer.close();
                         }
@@ -670,6 +616,50 @@
         return compilationSuccess;
     }
 
+    private void writeFileToZip(ZipOutputStream zipOutputStream, String entryFilePath, ByteArrayOutputStream baos, StringBuilder fileList) throws IOException
+    {
+        long fileDate = System.currentTimeMillis();
+        long zipFileDate = fileDate;
+        String metadataDate = targetSettings.getSWFMetadataDate();
+        if (metadataDate != null)
+        {
+            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"));
+                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();
+            } catch (IllegalArgumentException e1) {
+                e1.printStackTrace();
+            }
+        }
+        ZipEntry ze = new ZipEntry(entryFilePath);
+        ze.setTime(zipFileDate);
+        ze.setMethod(ZipEntry.STORED);
+        
+        ze.setSize(baos.size());
+        ze.setCompressedSize(baos.size());
+        CRC32 crc = new CRC32();
+        crc.reset();
+        crc.update(baos.toByteArray());
+        ze.setCrc(crc.getValue());
+
+        zipOutputStream.putNextEntry(ze);
+        baos.writeTo(zipOutputStream);
+        zipOutputStream.flush();
+        zipOutputStream.closeEntry();
+        fileList.append("        <file path=\"" + entryFilePath + "\" mod=\"" + fileDate + "\"/>\n");
+    }
+
     /**
      * Build target artifact.
      * 
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCNative.java b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCNative.java
index 7f85f76..e2b3d11 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCNative.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSCNative.java
@@ -26,11 +26,20 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Collection;
+import java.util.Date;
 import java.util.Enumeration;
+import java.util.GregorianCalendar;
 import java.util.List;
 import java.util.Set;
+import java.util.TimeZone;
+import java.util.zip.CRC32;
 import java.util.zip.Deflater;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
@@ -352,11 +361,9 @@
                             {
                                 System.out.println("Writing file: " + outputClassFile);     	
                             }
-	                        zipOutputStream.putNextEntry(new ZipEntry(outputClassFile));
-	                        temp.writeTo(zipOutputStream);
-                            zipOutputStream.flush();
-	                        zipOutputStream.closeEntry();
-	                        fileList.append("        <file path=\"" + outputClassFile + "\" mod=\"" + System.currentTimeMillis() + "\"/>\n");
+	                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+	                        temp.writeTo(baos);
+                            writeFileToZip(zipOutputStream, outputClassFile, baos, fileList);
                             if(sourceMapTemp != null)
                             {
                                 String sourceMapFile = getOutputSourceMapFile(
@@ -368,11 +375,9 @@
                                 {
                                     System.out.println("Writing file: " + sourceMapFile);
                                 }
-                                zipOutputStream.putNextEntry(new ZipEntry(sourceMapFile));
-                                sourceMapTemp.writeTo(zipOutputStream);
-                                zipOutputStream.flush();
-                                zipOutputStream.closeEntry();
-                                fileList.append("        <file path=\"" + sourceMapFile + "\" mod=\"" + System.currentTimeMillis() + "\"/>\n");
+    	                        baos = new ByteArrayOutputStream();
+                                sourceMapTemp.writeTo(baos);
+                                writeFileToZip(zipOutputStream, sourceMapFile, baos, fileList);
                             }
                             writer.close();
                         }
@@ -408,6 +413,50 @@
         return compilationSuccess;
     }
 
+    private void writeFileToZip(ZipOutputStream zipOutputStream, String entryFilePath, ByteArrayOutputStream baos, StringBuilder fileList) throws IOException
+    {
+        long fileDate = System.currentTimeMillis();
+        long zipFileDate = fileDate;
+        String metadataDate = targetSettings.getSWFMetadataDate();
+        if (metadataDate != null)
+        {
+            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"));
+                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();
+            } catch (IllegalArgumentException e1) {
+                e1.printStackTrace();
+            }
+        }
+        ZipEntry ze = new ZipEntry(entryFilePath);
+        ze.setTime(zipFileDate);
+        ze.setMethod(ZipEntry.STORED);
+        
+        ze.setSize(baos.size());
+        ze.setCompressedSize(baos.size());
+        CRC32 crc = new CRC32();
+        crc.reset();
+        crc.update(baos.toByteArray());
+        ze.setCrc(crc.getValue());
+
+        zipOutputStream.putNextEntry(ze);
+        baos.writeTo(zipOutputStream);
+        zipOutputStream.flush();
+        zipOutputStream.closeEntry();
+        fileList.append("        <file path=\"" + entryFilePath + "\" mod=\"" + fileDate + "\"/>\n");
+    }
+
     /**
      * Build target artifact.
      * 
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 ed38c4b..4ed9d8c 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
@@ -382,48 +382,9 @@
                             {
                                 System.out.println("Writing file: " + outputClassFile);     	
                             }
-	                        long fileDate = System.currentTimeMillis();
-	                        long zipFileDate = fileDate;
-	                    	String metadataDate = targetSettings.getSWFMetadataDate();
-	                    	if (metadataDate != null)
-	                    	{
-	                    		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"));
-	                    			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();
-	                			} catch (IllegalArgumentException e1) {
-	                				e1.printStackTrace();
-	                			}
-	                    	}
-	                    	ZipEntry ze = new ZipEntry(outputClassFile);
-	                    	ze.setTime(zipFileDate);
-	                    	ze.setMethod(ZipEntry.STORED);
-	                    	
 	                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-	                        temp.writeTo(baos);
-	                        ze.setSize(baos.size());
-	                        ze.setCompressedSize(baos.size());
-	                        CRC32 crc = new CRC32();
-	                        crc.reset();
-	                        crc.update(baos.toByteArray());
-	                        ze.setCrc(crc.getValue());
-
-	                        zipOutputStream.putNextEntry(ze);
-	                        baos.writeTo(zipOutputStream);
-                            zipOutputStream.flush();
-                            zipOutputStream.closeEntry();
-                            fileList.append("        <file path=\"" + outputClassFile + "\" mod=\"" + fileDate + "\"/>\n");
+                            temp.writeTo(baos);
+                            writeFileToZip(zipOutputStream, outputClassFile, baos, fileList);
                             
                             if(sourceMapTemp != null)
                             {
@@ -436,24 +397,9 @@
                                 {
                                     System.out.println("Writing file: " + sourceMapFile);
                                 }
-                                ze = new ZipEntry(sourceMapFile);
-                                ze.setTime(zipFileDate);
-                                ze.setMethod(ZipEntry.STORED);
-                                
                                 baos = new ByteArrayOutputStream();
                                 sourceMapTemp.writeTo(baos);
-                                ze.setSize(baos.size());
-                                ze.setCompressedSize(baos.size());
-                                crc = new CRC32();
-                                crc.reset();
-                                crc.update(baos.toByteArray());
-                                ze.setCrc(crc.getValue());
-                                
-                                zipOutputStream.putNextEntry(ze);
-                                baos.writeTo(zipOutputStream);
-                                zipOutputStream.flush();
-                                zipOutputStream.closeEntry();
-                                fileList.append("        <file path=\"" + sourceMapFile + "\" mod=\"" + fileDate + "\"/>\n");
+                                writeFileToZip(zipOutputStream, sourceMapFile, baos, fileList);
                             }
 	                        writer.close();
                     	}
@@ -534,6 +480,50 @@
         return compilationSuccess;
     }
 
+    private void writeFileToZip(ZipOutputStream zipOutputStream, String entryFilePath, ByteArrayOutputStream baos, StringBuilder fileList) throws IOException
+    {
+        long fileDate = System.currentTimeMillis();
+        long zipFileDate = fileDate;
+        String metadataDate = targetSettings.getSWFMetadataDate();
+        if (metadataDate != null)
+        {
+            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"));
+                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();
+            } catch (IllegalArgumentException e1) {
+                e1.printStackTrace();
+            }
+        }
+        ZipEntry ze = new ZipEntry(entryFilePath);
+        ze.setTime(zipFileDate);
+        ze.setMethod(ZipEntry.STORED);
+        
+        ze.setSize(baos.size());
+        ze.setCompressedSize(baos.size());
+        CRC32 crc = new CRC32();
+        crc.reset();
+        crc.update(baos.toByteArray());
+        ze.setCrc(crc.getValue());
+
+        zipOutputStream.putNextEntry(ze);
+        baos.writeTo(zipOutputStream);
+        zipOutputStream.flush();
+        zipOutputStream.closeEntry();
+        fileList.append("        <file path=\"" + entryFilePath + "\" mod=\"" + fileDate + "\"/>\n");
+    }
+
     /**
      * Build target artifact.
      *