001/*
002 * $Id: BackgroundUnzipper.java,v 1.3 2011/03/24 16:06:35 davep Exp $
003 *
004 * This file is part of McIDAS-V
005 *
006 * Copyright 2007-2011
007 * Space Science and Engineering Center (SSEC)
008 * University of Wisconsin - Madison
009 * 1225 W. Dayton Street, Madison, WI 53706, USA
010 * https://www.ssec.wisc.edu/mcidas
011 * 
012 * All Rights Reserved
013 * 
014 * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and
015 * some McIDAS-V source code is based on IDV and VisAD source code.  
016 * 
017 * McIDAS-V is free software; you can redistribute it and/or modify
018 * it under the terms of the GNU Lesser Public License as published by
019 * the Free Software Foundation; either version 3 of the License, or
020 * (at your option) any later version.
021 * 
022 * McIDAS-V is distributed in the hope that it will be useful,
023 * but WITHOUT ANY WARRANTY; without even the implied warranty of
024 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
025 * GNU Lesser Public License for more details.
026 * 
027 * You should have received a copy of the GNU Lesser Public License
028 * along with this program.  If not, see http://www.gnu.org/licenses.
029 */
030package edu.wisc.ssec.mcidasv.util;
031
032import java.awt.event.ActionEvent;
033import java.awt.event.ActionListener;
034import java.io.BufferedInputStream;
035import java.io.File;
036import java.io.FilterInputStream;
037import java.io.IOException;
038import java.io.InputStream;
039import java.net.MalformedURLException;
040import java.net.URL;
041import java.net.URLConnection;
042import java.util.List;
043import java.util.zip.ZipEntry;
044import java.util.zip.ZipInputStream;
045
046import javax.swing.SwingWorker;
047import javax.swing.Timer;
048
049public class BackgroundUnzipper extends SwingWorker<Long, Long>{
050
051    private final String zipFile;
052    private CountingInputStream countingStream;
053    private ZipInputStream zipStream;
054
055    private long totalSize = 1;
056    
057    private String currentEntry;
058
059    private final ActionListener taskPerformer = new ActionListener() {
060        public void actionPerformed(final ActionEvent e) {
061            getPercentage();
062        }
063    };
064
065    private final Timer taskTimer = new Timer(250, taskPerformer);
066    
067    public BackgroundUnzipper(final String zipFile) {
068        this.zipFile = zipFile;
069    }
070
071    public Long getCurrentBytes() {
072        return countingStream.getTotalBytesRead();
073    }
074
075    public String getCurrentEntry() {
076        return currentEntry;
077    }
078    
079    public long getPercentage() {
080        double current = new Double(countingStream.getTotalBytesRead()).doubleValue();
081        double total = new Double(totalSize).doubleValue();
082        long val = Math.round((current / total) * 100);
083        setProgress(new Long(val).intValue());
084        return val;
085    }
086    
087    protected Long doInBackground() throws Exception {
088        
089        countingStream = new CountingInputStream(getInputStream(zipFile));
090        zipStream = new ZipInputStream(countingStream);
091        totalSize = new File(zipFile).length();
092        taskTimer.start();
093        ZipEntry entry = null;
094        while (!isCancelled() && ((entry = zipStream.getNextEntry()) != null)) {
095            publish(countingStream.getTotalBytesRead());
096            System.err.println("entry="+entry.getName());
097            currentEntry = entry.getName();
098            zipStream.closeEntry();
099        }
100        zipStream.close();
101        countingStream.close();
102        taskTimer.stop();
103        return countingStream.getTotalBytesRead();
104    }
105
106    protected void process(List<Long> durr) {
107        System.err.println("read "+countingStream.getTotalBytesRead()+" bytes so far...");
108    }
109
110    private InputStream getInputStream(final String path) {
111        File f = new File(path.trim());
112        if (!f.exists()) {
113           return null;
114        }
115
116        try {
117            URL url = f.toURI().toURL();
118            URLConnection connection = url.openConnection();
119            return new BufferedInputStream(connection.getInputStream());
120        } catch (MalformedURLException e) {
121            // TODO Auto-generated catch block
122            e.printStackTrace();
123        } catch (IOException e) {
124            e.printStackTrace();
125        }
126        return null;
127    }
128
129    public static class CountingInputStream extends FilterInputStream {
130
131        private long totalBytes = 0;
132
133        protected CountingInputStream(final InputStream in) {
134            super(in);
135        }
136
137        public long getTotalBytesRead() {
138            return totalBytes;
139        }
140
141        @Override public int read() throws IOException {
142            int byteValue = super.read();
143            if (byteValue != -1) totalBytes++;
144            return byteValue;
145        }
146
147        @Override public int read(byte[] b) throws IOException {
148            int bytesRead = super.read(b);
149            if (bytesRead != -1)
150                totalBytes += bytesRead;
151            return bytesRead;
152        }
153
154        @Override public int read(byte[] b, int off, int len) throws IOException {
155            int bytesRead = super.read(b,off,len);
156            if (bytesRead != -1)
157                totalBytes += bytesRead;
158            return bytesRead;
159        }
160    }
161
162}