001/* 002 * Copyright (c) 2010 The Regents of the University of California. 003 * All rights reserved. 004 * 005 * '$Author: crawl $' 006 * '$Date: 2015-12-17 18:08:44 +0000 (Thu, 17 Dec 2015) $' 007 * '$Revision: 34346 $' 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.modulemanager.gui.patch; 031 032import java.awt.Container; 033import java.awt.event.ActionEvent; 034import java.awt.event.ActionListener; 035import java.util.ArrayList; 036import java.util.List; 037 038import javax.swing.DefaultListModel; 039import javax.swing.JButton; 040import javax.swing.JDialog; 041import javax.swing.JFrame; 042import javax.swing.JLabel; 043import javax.swing.JList; 044import javax.swing.JOptionPane; 045import javax.swing.JPanel; 046import javax.swing.JScrollPane; 047import javax.swing.SwingUtilities; 048import javax.swing.SwingWorker; 049 050import org.apache.tools.ant.DefaultLogger; 051import org.apache.tools.ant.Project; 052import org.jdesktop.layout.GroupLayout; 053import org.kepler.build.Run; 054import org.kepler.build.modules.Module; 055import org.kepler.build.project.ProjectLocator; 056import org.kepler.modulemanager.ModuleDownloader; 057import org.kepler.modulemanager.gui.ModuleDownloadProgressMonitor; 058import org.kepler.util.ShutdownNotifier; 059 060import ptolemy.util.MessageHandler; 061 062 063/** 064 * Created by David Welker. 065 * Date: Oct 31, 2009 066 * Time: 4:39:07 AM 067 */ 068public class UpgradeDialogPanel extends JPanel 069{ 070 List<ModulePair> upgradeList; 071 072 JLabel intro = new JLabel("The following modules may be upgraded:"); 073 JList<String> upgradeJList = new JList<String>(); 074 JScrollPane upgradeScrollPane = new JScrollPane(upgradeJList); 075 JLabel question = new JLabel("Would you like to upgrade these modules?"); 076 JButton yes = new JButton("Yes"); 077 JButton no = new JButton("No"); 078 079 public UpgradeDialogPanel(List<ModulePair> upgradeList) 080 { 081 super(); 082 this.upgradeList = upgradeList; 083 initComponents(); 084 layoutComponents(); 085 } 086 087 public boolean shouldDisplay() 088 { 089 return upgradeList != null && !upgradeList.isEmpty(); 090 } 091 092 private void dispose() 093 { 094 Container c = this; 095 096 while( c != null && !(c instanceof JDialog) ) 097 c = c.getParent(); 098 099 if( c != null && c instanceof JDialog ) 100 ((JDialog)c).dispose(); 101 else 102 System.out.println("ERROR: This dialog is not on a JDialog!"); 103 } 104 105 private void initComponents() 106 { 107 DefaultListModel<String> lm = new DefaultListModel<String>(); 108 for( ModulePair mp : upgradeList ) 109 lm.addElement(mp.from + " to " + mp.to); 110 upgradeJList.setModel(lm); 111 112 yes.addActionListener(new ActionListener() 113 { 114 @Override 115 public void actionPerformed(ActionEvent e) 116 { 117 int result = JOptionPane.showConfirmDialog( 118 UpgradeDialogPanel.this, 119 "Any unsaved work will be LOST. Continue?", 120 "Confirm", JOptionPane.YES_NO_OPTION); 121 if (result == JOptionPane.NO_OPTION){ 122 return; 123 } 124 125 yes.setEnabled(false); 126 no.setEnabled(false); 127 128 SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() 129 { 130 @Override 131 public Void doInBackground() throws Exception 132 { 133 downloadModules(upgradeList, UpgradeDialogPanel.this); 134 return null; 135 } 136 137 @Override 138 protected void done() 139 { 140 JOptionPane.showMessageDialog(UpgradeDialogPanel.this, 141 "Done upgrading modules. Kepler will now restart."); 142 143 Project project = new Project(); 144 project.setBaseDir(ProjectLocator.getProjectDir()); 145 DefaultLogger logger = new DefaultLogger(); 146 logger.setMessageOutputLevel(Project.MSG_INFO); 147 logger.setOutputPrintStream(System.out); 148 logger.setErrorPrintStream(System.out); 149 project.addBuildListener(logger); 150 151 //XXX call ShutdownNotifer.shutdown() before spawning new process, 152 // to avoid 2nd instance potentially interfering with quitting first. 153 // see: http://bugzilla.ecoinformatics.org/show_bug.cgi?id=5484 154 System.out.println("UpgradeDialogPanel notifiying shutdown listeners " + 155 "of impending shutdown. Any open databases may take awhile to close..."); 156 ShutdownNotifier.shutdown(); 157 158 System.out.println("UpgradeDialogPanel Spawning new Kepler process"); 159 Run run = new Run(); 160 run.setTaskName("run"); 161 run.setProject(project); 162 run.init(); 163 run.setSpawn(true); 164 run.execute(); 165 166 System.out.println("UpgradeDialogPanel Ending current Kepler process"); 167 168 //TODO why call exit with error arg here? 169 System.exit(1); 170 } 171 172 173 }; 174 worker.execute(); 175 } 176 }); 177 178 no.addActionListener(new ActionListener() 179 { 180 @Override 181 public void actionPerformed(ActionEvent e) 182 { 183 for(ModulePair mp : upgradeList) 184 mp.to.changeName(mp.from.getName()); 185 dispose(); 186 } 187 }); 188 189 } 190 191 // TODO move to another file 192 public static void downloadModules(List<ModulePair> upgradeList, Container container) 193 { 194 List<String> downloadList = new ArrayList<String>(); 195 for( ModulePair mp : upgradeList ) 196 { 197 downloadList.add( mp.to.getName() ); 198 } 199 ModuleDownloader downloader = new ModuleDownloader(); 200 if(container != null) { 201 ModuleDownloadProgressMonitor mdpm = new ModuleDownloadProgressMonitor(container); 202 downloader.addListener(mdpm); 203 } 204 try { 205 downloader.downloadModules(downloadList); 206 } catch (Exception e) { 207 MessageHandler.error("Error downloading and installing module.", e); 208 } 209 } 210 211 private void layoutComponents() 212 { 213 GroupLayout layout = new GroupLayout(this); 214 setLayout(layout); 215 layout.setAutocreateContainerGaps(true); 216 layout.setAutocreateGaps(true); 217 218 layout.setHorizontalGroup 219 ( 220 layout.createParallelGroup() 221 .add(intro) 222 .add(upgradeScrollPane) 223 .add(question) 224 .add(layout.createSequentialGroup() 225 .add(yes) 226 .add(no)) 227 ); 228 229 layout.setVerticalGroup 230 ( 231 layout.createSequentialGroup() 232 .add(intro) 233 .add(upgradeScrollPane) 234 .add(question) 235 .add(layout.createParallelGroup() 236 .add(yes) 237 .add(no)) 238 ); 239 240 241 } 242 243 public static void main(String[] args) 244 { 245 SwingUtilities.invokeLater( new Runnable() 246 { 247 248 @Override 249 public void run() 250 { 251 ModulePair m1 = new ModulePair(Module.make("module-manager-1.0.0"), Module.make("module-manager-1.0.1")); 252 ModulePair m2 = new ModulePair(Module.make("foo-1.0.2"), Module.make("foo-1.0.7")); 253 254 List<ModulePair> upgradeList = new ArrayList<ModulePair>(); 255 upgradeList.add(m1); 256 upgradeList.add(m2); 257 258 259 JFrame frame = new JFrame("Upgrade Dialog"); 260 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 261 frame.add(new UpgradeDialogPanel(upgradeList)); 262 frame.pack(); 263 frame.setSize(400,500); 264 frame.setVisible(true); 265 } 266 }); 267 268 } 269}