| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.FileInputStream; |
| import java.io.RandomAccessFile; |
| import java.io.BufferedInputStream; |
| import java.io.ByteArrayOutputStream; |
| import java.util.Enumeration; |
| import java.util.zip.ZipFile; |
| import java.util.zip.ZipEntry; |
| |
| public class XmlZipExtract |
| { |
| |
| public static final String CONTENT = "Content.xml"; |
| public static final String OLDCONTENT = "content.xml"; |
| private static final int BUFFER_SIZE = 2048; |
| |
| |
| /** |
| * Full path of the Zip file to process. |
| */ |
| private String filename = null; |
| |
| |
| /** |
| * Constructor |
| * |
| * @param filename Full Path to Zip file to process |
| * |
| */ |
| public XmlZipExtract(String filename) { |
| this.filename = filename; |
| } |
| |
| /** |
| * Copies Content.xml from zip file onto the filename passed as |
| * an argument |
| * |
| * @param fname Full Path to file to which contents have to be copied |
| * |
| */ |
| public void getContentXml(String fname) throws IOException |
| { |
| try |
| { |
| getContentXmlInt(fname, XmlZipExtract.CONTENT); |
| } |
| catch (NullPointerException e1) |
| { |
| // If the new name of the content file failed, try |
| // the older name. |
| // |
| System.out.println(filename + " Content.xml does not exist, trying content.xml..."); |
| try |
| { |
| getContentXmlInt(fname, XmlZipExtract.OLDCONTENT); |
| } |
| catch (NullPointerException e2) |
| { |
| System.out.println(filename + " content.xml does not exist, trying content.xml..."); |
| throw e2; |
| } |
| } |
| } |
| |
| public void getContentXmlInt(String fname, String cname) throws IOException |
| { |
| byte b[] = getEntry(cname); |
| |
| RandomAccessFile raf=null; |
| raf = new RandomAccessFile(fname, "rw"); |
| raf.write(b); |
| raf.close(); |
| } |
| |
| /** |
| * Get the specified entry in the zip file as a stream. |
| * |
| * @param entryName The name of the entry in the zipfile to get. |
| * This should be one of the constants defined above. |
| * |
| * @return byte[] bits for entryName |
| * |
| * @throws IOException if something goes wrong |
| */ |
| public byte[] getEntry(String entryName) throws IOException |
| { |
| ZipFile zf = new ZipFile(filename); |
| ZipEntry ze = zf.getEntry(entryName); |
| byte[] bits = readStream(zf.getInputStream(ze)); |
| zf.close(); |
| return bits; |
| } |
| |
| |
| /** |
| * Read an InputStream into an array of bytes. |
| * |
| * @param is InputStream of data from Zip file |
| * |
| * @return an array of Bytes |
| */ |
| private byte[] readStream(InputStream is) throws IOException |
| { |
| BufferedInputStream bis = new BufferedInputStream(is); |
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| byte[] buffer = new byte[BUFFER_SIZE]; |
| int eof = 0; |
| while ((eof = bis.read(buffer, 0, buffer.length)) > 0) { |
| baos.write(buffer, 0, eof); |
| } |
| |
| return baos.toByteArray(); |
| } |
| } |
| |
| |