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}