Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 1&1 Internet AG, http://www.1and1.org
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU Lesser General Public License as published by
   * the Free Software Foundation; either version 2 of the License,
   * or (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  * See the GNU Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
 package net.sf.beezle.sushi.archive;
 
 
 import java.util.List;
 import java.util.Map;
Represents a Zip or Jar file. For Zip files, the manifest is null.
 
 public class Archive {
     public static final String META_INF = "META-INF";
     public static final String MANIFEST =  + "/MANIFEST.MF";
 
     public static Archive createZip(World world) {
         return new Archive(world.getMemoryFilesystem().root().node(""null), null);
     }
 
     public static Archive loadZip(Node srcthrows IOException {
         return createZip(src.getWorld()).read(src);
     }
 
     public static Archive createJar(World world) {
         return new Archive(world.getMemoryFilesystem().root().node(""null), new Manifest());
     }
 
     public static Archive loadJar(Node srcthrows IOException {
         return createJar(src.getWorld()).read(src);
     }
 
     private static String getPath(ZipEntry entry) {
         String path;
         
         path = entry.getName();
         if (entry.isDirectory()) {
             path = path.substring(0, path.length() - 1);
         }
         return path;
     }
     
     //--
     
     public final Node data;

    
null for zip files, not null for jars
 
     public final Manifest manifest;
 
     public Archive(Node dataManifest manifest) {
         this. = data;
         this. = manifest;
     }

    

Returns:
this
 
     public Archive read(Node filethrows IOException {
         Buffer buffer;
         ZipInputStream zip;
         ZipEntry entry;
         Node node;
         
         buffer = file.getWorld().getBuffer();
         zip = new ZipInputStream(file.createInputStream());
         while (true) {
             entry = zip.getNextEntry();
             if (entry == null) {
                 break;
             }
             node = .join(getPath(entry));
             if ("".equals(node.getPath())) {
                 continue;
             }
             if (entry.isDirectory()) {
                 node.mkdirsOpt();
             } else if (isManifest(node)) {
                mergeManifest(new Manifest(zip));
                zip.closeEntry();
            } else {
                node.getParent().mkdirsOpt();
                buffer.copy(zipnode);
                zip.closeEntry();
            }
        }
        zip.close();
        return this;
    }
    private boolean isManifest(Node node) {
        return  != null && .equals(node.getPath());        
    }
    
    public void mergeManifest(Manifest rightManifest) {
        Map<StringAttributesrightSections;
        Attributes left;
        
        .getMainAttributes().putAll(rightManifest.getMainAttributes());
        rightSections = rightManifest.getEntries();
        for (String name : rightSections.keySet()) {
            left = .getAttributes(name);
            if (left == null) {
                left = new Attributes();
                .getEntries().put(nameleft);
            }
            left.putAll(rightSections.get(name));
        }
    }
    public Archive save(Node destthrows IOException {
        OutputStream out;
        
        out = dest.createOutputStream();
        save(out);
        out.close();
        return this;
    }
    public Archive save(OutputStream destthrows IOException {
        ZipOutputStream out;
        InputStream in;
        List<Nodecontent;
        List<Nodefiles;
        
        out = new ZipOutputStream(dest);
        if ( != null) {
            out.putNextEntry(new ZipEntry());
            .write(out);
            out.closeEntry();
        }
        content = .find("**/*");
        files = new ArrayList<Node>();
        // directories first - jar does not extract files into non-existing directories
        for (Node node : content) {
            if (isManifest(node)) {
                throw new ArchiveException("manifest file not allowed");
            } else if (node.isFile()) {
                files.add(node);
            } else {
                out.putNextEntry(new ZipEntry(node.getPath() + "/"));
                out.closeEntry();
            }
        }
        for (Node file : files) {
            in = file.createInputStream();
            out.putNextEntry(new ZipEntry(file.getPath()));
            file.getWorld().getBuffer().copy(inout);
            out.closeEntry();
            in.close();
        }
        out.close();
        return this;
    }
New to GrepCode? Check out our FAQ X