001/*
002 * Copyright (c) 2010-2012 The Regents of the University of California.
003 * All rights reserved.
004 *
005 * '$Author: crawl $'
006 * '$Date: 2012-11-26 22:22:25 +0000 (Mon, 26 Nov 2012) $' 
007 * '$Revision: 31122 $'
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.gui.kar;
031
032import java.awt.event.ActionEvent;
033import java.io.File;
034import java.io.IOException;
035import java.lang.reflect.InvocationTargetException;
036import java.lang.reflect.Method;
037import java.sql.SQLException;
038
039import org.apache.commons.logging.Log;
040import org.apache.commons.logging.LogFactory;
041import org.kepler.gui.ComponentLibraryTab;
042import org.kepler.kar.KARFile;
043import org.kepler.kar.karxml.KarXml;
044import org.kepler.moml.DownloadableKAREntityLibrary;
045import org.kepler.objectmanager.cache.LocalRepositoryManager;
046import org.kepler.objectmanager.library.LibraryManager;
047
048import ptolemy.actor.gui.TableauFrame;
049import ptolemy.kernel.util.IllegalActionException;
050import ptolemy.vergil.toolbox.FigureAction;
051
052/**
053 * Created by IntelliJ IDEA.
054 * User: sean
055 * Date: Mar 23, 2010
056 * Time: 5:05:29 PM
057 */
058
059public class DownloadKARFileAction extends FigureAction {
060
061        public DownloadKARFileAction(TableauFrame parent) {
062                super("Download");
063                this.parent = parent;
064        }
065        
066        @Override
067        public void actionPerformed(ActionEvent e) {
068                // Due to module issues, I can't directly invoke KARDownloader
069                KarXml karXml = entityLibrary.getKarXml();
070                try {
071                        Class karDownloaderClass = Class.forName("org.kepler.objectmanager.repository.KARDownloader");
072                        Method getInstanceMethod = karDownloaderClass.getMethod("getInstance");
073                        Object karDownloaderInstance = getInstanceMethod.invoke(null);
074                        
075                        // Tell the KAR file where to end up
076                        Method setKarPathMethod = karDownloaderClass.getMethod("setKarPath", String.class);
077                        File localSaveRepo = LocalRepositoryManager.getInstance().getSaveRepository();
078                        setKarPathMethod.invoke(karDownloaderInstance, localSaveRepo.getAbsolutePath());
079                        
080                        Method setKarNameMethod = karDownloaderClass.getMethod("setKarName", String.class);
081                        String filename = karXml.getName();
082                        if (!filename.endsWith(".kar")) {
083                                filename += ".kar";
084                        }
085                        setKarNameMethod.invoke(karDownloaderInstance, filename);
086                        
087                        Method downloadMethod = karDownloaderClass.getMethod("download", KarXml.class, boolean.class);
088                        File karFile = (File) downloadMethod.invoke(
089                                        karDownloaderInstance, karXml, ComponentLibraryTab.AUTHENTICATE);
090                        try {
091                                KARFile kf = new KARFile(karFile);
092                                kf.cacheKARContents();
093                        }
094                        catch(IOException ex) {
095                                log.error("Error creating KARFile", ex);
096                        }
097                        catch(Exception ex) {
098                                log.error("Error caching KAR contents", ex);
099                        }
100                        
101                        
102                        try {
103                                LibraryManager.getInstance().addKAR(karFile);
104                                
105                                // Call buildLibrary() to fix not showing MyWorkflows dir
106                                // when this is first KAR placed in MyWorkflows. See bug#5581.
107                                // Also fixes at least one case of Remote Components entry
108                                // hanging around when it shouldn't. See bug#4953.
109                                // XXX This is expensive, about ~2s, and is used elsewhere
110                                // in the same fashion (before refreshJTrees()).
111                                LibraryManager.getInstance().buildLibrary();
112                                
113                                LibraryManager.getInstance().refreshJTrees();
114                        }
115                        catch(SQLException ex) {
116                                log.error("Failed to add to index", ex);
117                        }
118                        catch(IllegalActionException ex) {
119                                log.error("Failed to refresh trees", ex);
120                        }
121                }
122                catch(ClassNotFoundException ex) {
123                        ex.printStackTrace();
124                }
125                catch(NoSuchMethodException ex) {
126                        ex.printStackTrace();
127                }
128                catch(InvocationTargetException ex) {
129                        ex.printStackTrace();
130                }
131                catch(IllegalAccessException ex) {
132                        ex.printStackTrace();
133                }
134        }
135        
136        
137        public void setEntityLibrary(DownloadableKAREntityLibrary entityLibrary) {
138                this.entityLibrary = entityLibrary;
139        }
140
141        private TableauFrame parent;
142        private DownloadableKAREntityLibrary entityLibrary;
143        private static final Log log = LogFactory.getLog(DownloadKARFileAction.class);
144
145}