/*   Copyright 2004 The Apache Software Foundation
 *
 *   Licensed 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.
 */
package xmlcursor.xquery.detailed;

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.util.zip.ZipFile;
import java.util.zip.ZipEntry;
import java.util.HashMap;

/**
 *
 */
public class ZipUtil
{
     static String getStringFromZip(String pathToZip,String zipName,String file)
         throws IOException
    {
        BufferedReader in = new BufferedReader(
                new InputStreamReader(getStreamFromZip(pathToZip,zipName,file)));

        StringBuffer stb = new StringBuffer();
        String buffer;

        while (!((buffer = in.readLine()) == null)) {
            stb.append(buffer + EOL);
        }
        return stb.toString();
    }

    static InputStream getStreamFromZip(String zipFileName,String fileName) throws IOException
       {
           Object file;
           if ( (file = ZipFileMap.get(fileName)) == null ){
               file = new ZipFile(zipFileName);
               ZipFileMap.put(fileName,file);
           }
           ZipEntry entry = ((ZipFile)file).getEntry(fileName);
           return ((ZipFile)file).getInputStream(entry);
       }

     static InputStream getStreamFromZip(String pathToZip,String zipName,String file)
         throws IOException {
         return getStreamFromZip(pathToZip+SLASH+zipName,file);
     }

    private static HashMap ZipFileMap=new HashMap();
     static final String SLASH = System.getProperty("file.separator");
     static final String EOL=System.getProperty("line.separator");
}
