001/*
002 * Copyright (c) 2010-2011 The Regents of the University of California.
003 * All rights reserved.
004 *
005 * '$Author: crawl $'
006 * '$Date: 2012-11-26 22:22:04 +0000 (Mon, 26 Nov 2012) $' 
007 * '$Revision: 31121 $'
008 * 
009 * Permission is hereby granted, without written agreement and without
010 * license or royalty fees, to use, copy, modify, and distribute this
011 * software and its documentation for any purpose, provided that the above
012 * copyright notice and the following two paragraphs appear in all copies
013 * of this software.
014 *
015 * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
016 * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
017 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
018 * THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
019 * SUCH DAMAGE.
020 *
021 * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
022 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
023 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
024 * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
025 * CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
026 * ENHANCEMENTS, OR MODIFICATIONS.
027 *
028 */
029
030package org.kepler.objectmanager.repository;
031
032import java.awt.BorderLayout;
033import java.awt.Dimension;
034import java.awt.Frame;
035import java.io.File;
036
037import javax.swing.JDialog;
038import javax.swing.JLabel;
039import javax.swing.JPanel;
040import javax.swing.JProgressBar;
041
042import org.kepler.kar.karxml.KarXml;
043
044/**
045 * Created by IntelliJ IDEA.
046 * User: sean
047 * Date: Mar 24, 2010
048 * Time: 11:48:05 AM
049 */
050
051public class KARDownloader {
052        
053        private String karPath = null;
054        private String karName = null;
055        private static KARDownloader instance = null;
056        private JDialog dialog;
057        private JProgressBar progressBar;
058        private long downloadedByteTotal = 0;
059        private long karFileSize;
060
061        public static KARDownloader getInstance() {
062                if (instance == null) {
063                        instance = new KARDownloader();
064                }
065                return instance;
066        }
067        
068        private KARDownloader() {
069                setupProgressBar();
070        }
071        
072        private void setupProgressBar() {
073                progressBar = new JProgressBar(0, 100);
074                progressBar.setPreferredSize(new Dimension(175, 20));
075                progressBar.setString("Downloading");
076                progressBar.setStringPainted(false);
077                progressBar.setValue(0);
078                
079                JLabel label = new JLabel("Progress: ");
080                JPanel panel = new JPanel();
081                
082                panel.add(label);
083                panel.add(progressBar);
084                
085                dialog = new JDialog((Frame) null, "Downloading...", false);
086                dialog.getContentPane().add(panel, BorderLayout.CENTER);
087                dialog.pack();
088        }
089
090        public void updateDownloadProgress(int bytes) {
091                if (bytes == -1) {
092                        // The stream is over
093                        progressBar.setValue(100);
094                        dialog.setVisible(false);
095//                      dialog.dispose();
096                        return;
097                }
098                
099                // Update downloaded total
100                downloadedByteTotal += bytes;
101                progressBar.setValue((int) ((downloadedByteTotal * 100) / karFileSize));                
102        }
103        
104        /**
105         * Download a KAR. 
106         * @param karLSID
107         * @param karSize
108         * @param repositoryName
109         * @return downloaded File, or null.
110         */
111        public File download(String karLSID, Long karSize, String repositoryName, boolean authenticate){
112
113                karFileSize = karSize;
114                dialog.setLocationRelativeTo(null);
115                dialog.setVisible(true);
116                
117                if (karLSID == null || karLSID.length()==0 || 
118                                repositoryName == null || repositoryName.length()==0){
119                        System.out.println("KARDownloader download(karLSID, karSize, repositoryName) got null or empty lsid " +
120                                        "or repositoryName!");
121                        return null;
122                }
123                
124                try {
125                        progressBar.setValue(0);
126                        EcogridRepositoryResults result = new EcogridRepositoryResults(karLSID, repositoryName, authenticate);
127                        result.setDownloader(this);
128                        File local = result.cacheKAR(authenticate);
129                        return local;
130                }
131                catch(RepositoryException ex) {
132                        System.out.println("Caught repository exception!");
133                        dialog.setVisible(false);
134                        ex.printStackTrace();
135                }
136                
137                return null;
138        }
139        
140        /**
141         * Given karXML for a KAR, download KAR.
142         * @see download(String karLSID, Long karSize, String repositoryName) for alternative 
143         * you may want to use to avoid having to download karXml.
144         * @param karXml
145         * @return kar File
146         */
147        public File download(KarXml karXml, boolean authenticate) {
148                
149                karFileSize = karXml.getSize();
150                
151                dialog.setLocationRelativeTo(null);
152                dialog.setVisible(true);
153
154                String lsid = karXml.getLsid();
155                String repositoryName = karXml.getRepositoryName();
156                
157                if (lsid == null || lsid.length()==0 || 
158                                repositoryName == null || repositoryName.length()==0){
159                        System.out.println("KARDownloader download(karxml) got null or empty lsid " +
160                                        "or repositoryName from karXml!");
161                        return null;
162                }
163                
164                try {
165                        progressBar.setValue(0);
166                        EcogridRepositoryResults result = 
167                                new EcogridRepositoryResults(lsid, repositoryName, authenticate);
168                        result.setDownloader(this);
169                        File local = result.cacheKAR(authenticate);
170                        return local;
171                }
172                catch(RepositoryException ex) {
173                        System.out.println("Caught repository exception!");
174                        ex.printStackTrace();
175                }
176                
177                return null;
178        }
179
180        public void setKarPath(String karPath) {
181                System.out.println("KARDownloader setKarPath() - " + karPath);
182                this.karPath = karPath;
183        }
184
185        public String getKarPath() {
186                return karPath;
187        }
188        
189        public void setKarName(String karName) {
190                System.out.println("KARDownloader setKarName() - " + karName);
191                this.karName = karName;
192        }
193        
194        public String getKarName() {
195                return karName;
196        }
197}