You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by od...@apache.org on 2009/07/30 10:43:44 UTC

svn commit: r799203 - /harmony/enhanced/jdktools/trunk/modules/jdktools/src/main/java/org/apache/harmony/tools/jar/Main.java

Author: odeakin
Date: Thu Jul 30 08:43:44 2009
New Revision: 799203

URL: http://svn.apache.org/viewvc?rev=799203&view=rev
Log:
Apply patch for HARMONY-6255 (Implementation of createJar method), also with tabs converted to spaces.

Modified:
    harmony/enhanced/jdktools/trunk/modules/jdktools/src/main/java/org/apache/harmony/tools/jar/Main.java

Modified: harmony/enhanced/jdktools/trunk/modules/jdktools/src/main/java/org/apache/harmony/tools/jar/Main.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/jdktools/trunk/modules/jdktools/src/main/java/org/apache/harmony/tools/jar/Main.java?rev=799203&r1=799202&r2=799203&view=diff
==============================================================================
--- harmony/enhanced/jdktools/trunk/modules/jdktools/src/main/java/org/apache/harmony/tools/jar/Main.java (original)
+++ harmony/enhanced/jdktools/trunk/modules/jdktools/src/main/java/org/apache/harmony/tools/jar/Main.java Thu Jul 30 08:43:44 2009
@@ -20,11 +20,13 @@
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
+import java.io.IOException;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
 
 /**
  * This is a tool that allows you to create/unpack jar/zip 
@@ -94,8 +96,58 @@
     /**
      * Creates a jar file with the specified arguments
      */
-    private static void createJar(String[] args) {
-        System.out.println("Error: Jar creation not yet implemented");
+    private static void createJar(String[] args) throws Exception {
+        boolean verboseFlag = false, fileFlag = false, manifestFlag = false;
+
+        // Check for expected and unexpected flags
+        for (int i=1; i<args[0].length(); i++) {
+            switch (args[0].charAt(i)) {
+            case 'v':
+                verboseFlag = true;
+                break;
+            case 'f':
+                fileFlag = true;
+                break;
+            case 'm':
+                manifestFlag = true;
+                break;
+            default:
+                System.out.println("Error: Illegal option for -c: '"+args[0].charAt(i)+"'");
+                return;
+            }
+        }
+
+        ZipOutputStream zos;
+        if (!fileFlag) {
+            // Write to stdout
+            if (verboseFlag) System.out.println("Writing to stdout");
+            zos = new ZipOutputStream(System.out);
+        } else {
+            // Write to the specified file
+            if (verboseFlag) System.out.println("Creating jar file: "+args[1]);
+            zos = new ZipOutputStream(new FileOutputStream(new File(args[1])));
+        }
+
+        String workingDir = System.getProperty("user.dir");
+        int firstFileIndex = 0;
+        if (manifestFlag) {
+            firstFileIndex = 3;
+        } else {
+            firstFileIndex = 2;
+        }
+
+        // Assume that all the args following the manifest (if provided) are the name of files to add to the archive
+        for (int i=firstFileIndex; i < args.length; i++) {
+            // attempt to add the file to the output stream
+            File f = new File(workingDir + File.separator + args[i]);
+            if (f.isDirectory()) {
+                processDir(f, zos, workingDir, verboseFlag);
+            } else {
+                processFile(f, zos, workingDir, verboseFlag);
+            }
+        }
+        
+        zos.close();
     }
 
     /**
@@ -131,8 +183,8 @@
             System.out.println("Error: No file name specified for 'f' option");
             return;
         }
-    	
-    	ZipInputStream zis;
+    
+        ZipInputStream zis;
         if (!fileFlag) {
             // Read from stdin
             if (verboseFlag) System.out.println("Reading input from stdin");
@@ -148,35 +200,35 @@
         String workingDir = System.getProperty("user.dir");
         
         while ((ze = zis.getNextEntry()) != null) {
-        	if (ze.isDirectory()) {
-        		// create a new directory of the same name
-       			File newDir = new File(ze.getName());
-    			if (! newDir.exists()) {
-    				newDir.mkdirs();        				
-    			}
-    	        if (verboseFlag) {
-    	        	System.out.println("created: " + ze.getName());
-    	        }
-        	} else {
-        		// extract the file to the appropriate directory
-        		File f = new File(workingDir + File.separator + ze.getName());
-        		f.createNewFile();
-        		FileOutputStream fos = new FileOutputStream(f);
-        		int i;
-        		while ((i = zis.read()) != -1) {
-        			fos.write(i);
-        		}
-            	fos.close();
-            	if (verboseFlag) {
-            		System.out.println("inflated: " + ze.getName());
-            	}
-        	}           
+            if (ze.isDirectory()) {
+                // create a new directory of the same name
+                File newDir = new File(ze.getName());
+                if (! newDir.exists()) {
+                    newDir.mkdirs();
+                }
+                if (verboseFlag) {
+                    System.out.println("created: " + ze.getName());
+                }
+            } else {
+                // extract the file to the appropriate directory
+                File f = new File(workingDir + File.separator + ze.getName());
+                f.createNewFile();
+                FileOutputStream fos = new FileOutputStream(f);
+                int i;
+                while ((i = zis.read()) != -1) {
+                    fos.write(i);
+                }
+                fos.close();
+                if (verboseFlag) {
+                    System.out.println("inflated: " + ze.getName());
+                }
+            }
             zis.closeEntry();
         }
 
         zis.close();
     }
-    	
+
     /**
      * Lists contents of jar file with the specified arguments
      */
@@ -234,5 +286,43 @@
     private static void indexJar(String[] args) {
         System.out.println("Error: Jar indexing not yet implemented");
     }
+    
+    private static void processDir(File dir, ZipOutputStream zos, String workingDir, boolean verboseFlag) throws IOException {	
+        // First add the dir to the ZipOutputStream
+        String relativePath = dir.getAbsolutePath().substring(workingDir.length() + 1);		
+        ZipEntry zEntry = new ZipEntry(relativePath);
+        if (verboseFlag) {
+            System.out.println("adding: " + relativePath);
+        }
+        zos.putNextEntry(zEntry);
+
+        // Add all files in this directory
+        File[] filesInDir = dir.listFiles();
+        for (int i=0; i < filesInDir.length; i++) {
+            File curFile = filesInDir[i];
+            if (curFile.isDirectory()) {
+                processDir(curFile, zos, workingDir, verboseFlag);
+            } else {
+                processFile(curFile, zos, workingDir, verboseFlag);
+            }
+        }
+
+        zos.closeEntry();
+    }
+
+    private static void processFile(File file, ZipOutputStream zos, String workingDir, boolean verboseFlag) throws IOException {
+        String relativePath = file.getAbsolutePath().substring(workingDir.length() + 1);
+        if (verboseFlag) {
+            System.out.println("adding: " + relativePath);
+        }
 
+        ZipEntry zEntry = new ZipEntry(relativePath);
+        zos.putNextEntry(zEntry);
+        // now write the data
+        FileInputStream fis = new FileInputStream(file);
+        byte fileContent[] = new byte[(int)file.length()];
+        fis.read(fileContent);
+        zos.write(fileContent);
+        zos.closeEntry();
+    }    
 }