/* * RapidMiner * * Copyright (C) 2001-2011 by Rapid-I and the contributors * * Complete list of developers available at our web site: * * http://rapid-i.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see http://www.gnu.org/licenses/. */ package com.rapid_i.deployment.update.client; import java.awt.event.ActionEvent; import java.net.PasswordAuthentication; import java.net.URISyntaxException; import java.net.URL; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.swing.Action; import javax.swing.SwingUtilities; import com.rapid_i.Launcher; import com.rapidminer.deployment.client.wsimport.PackageDescriptor; import com.rapidminer.deployment.client.wsimport.UpdateService; import com.rapidminer.gui.RapidMinerGUI; import com.rapidminer.gui.tools.PasswordDialog; import com.rapidminer.gui.tools.ProgressThread; import com.rapidminer.gui.tools.ResourceAction; import com.rapidminer.gui.tools.SwingTools; import com.rapidminer.gui.tools.dialogs.ButtonDialog; import com.rapidminer.gui.tools.dialogs.ConfirmDialog; import com.rapidminer.tools.GlobalAuthenticator; import com.rapidminer.tools.LogService; /** * * @author Simon Fischer * */ public class UpdateDialog extends ButtonDialog { protected static final String PACKAGEID_RAPIDMINER = "rapidminer"; private static final long serialVersionUID = 1L; public static final Action UPDATE_ACTION = new ResourceAction("update_manager") { private static final long serialVersionUID = 1L; { setCondition(EDIT_IN_PROGRESS, DONT_CARE); } @Override public void actionPerformed(ActionEvent arg0) { showUpdateDialog(); } }; private final UpdateService service; private final UpdateListPanel ulp; static { GlobalAuthenticator.registerServerAuthenticator(new GlobalAuthenticator.URLAuthenticator() { @Override public PasswordAuthentication getAuthentication(URL url) { try { if (url.toString().startsWith(UpdateManager.getUpdateServerURI("").toString())) { return PasswordDialog.getPasswordAuthentication(url.toString(), false, false); } else { return null; } } catch (URISyntaxException e) { return null; } } @Override public String getName() { return "UpdateService authenticator."; } @Override public String toString() { return getName(); } }); } public UpdateDialog(UpdateService service, List<PackageDescriptor> descriptors, String[] preselectedExtensions) { super("update"); this.service = service; ulp = new UpdateListPanel(this, descriptors, preselectedExtensions); layoutDefault(ulp, ulp.getFetchFromAccountButton(), ulp.getInstallButton(), makeOkButton("update.install"), makeCloseButton()); } public static void showUpdateDialog(final String... preselectedExtensions) { new ProgressThread("fetching_updates", true) { public void run() { getProgressListener().setTotal(100); getProgressListener().setCompleted(10); final UpdateService service; try { service = UpdateManager.getService(); } catch (Exception e) { SwingTools.showSimpleErrorMessage("failed_update_server", e, UpdateManager.getBaseUrl()); getProgressListener().complete(); return; } finally { getProgressListener().complete(); } //final UpdateService service = serviceTmp; try { getProgressListener().setCompleted(20); final List<PackageDescriptor> descriptors = new LinkedList<PackageDescriptor>(); if (Launcher.isDevelopmentBuild()) { LogService.getRoot().config("This is a development build. Ignoring update check."); } else { String rmPlatform = Launcher.getPlatform(); String latestRMVersion = service.getLatestVersion(PACKAGEID_RAPIDMINER, rmPlatform); PackageDescriptor packageInfo = service.getPackageInfo(PACKAGEID_RAPIDMINER, latestRMVersion, rmPlatform); if (packageInfo != null) { descriptors.add(packageInfo); } } getProgressListener().setCompleted(30); String targetPlatform = "ANY"; List<String> extensions = service.getExtensions(PACKAGEID_RAPIDMINER); int i = 0; for (String extension : extensions) { String version = service.getLatestVersion(extension, targetPlatform); PackageDescriptor packageInfo = service.getPackageInfo(extension, version, targetPlatform); descriptors.add(packageInfo); i++; getProgressListener().setCompleted(30 + 70 * i / extensions.size()); } SwingUtilities.invokeLater(new Runnable() { public void run() { UpdateManager.saveLastUpdateCheckDate(); new UpdateDialog(service, descriptors, preselectedExtensions).setVisible(true); } }); } catch (Exception e) { SwingTools.showSimpleErrorMessage("error_during_update", e, e.getMessage()); } finally { getProgressListener().complete(); } } }.start(); } public void startUpdate(final List<PackageDescriptor> downloadList) { new ProgressThread("installing_updates", true) { @Override public void run() { try { getProgressListener().setTotal(100); getProgressListener().setCompleted(10); // Download licenses Map<String, String> licenses = new HashMap<String, String>(); for (PackageDescriptor desc : downloadList) { String license = licenses.get(desc.getLicenseName()); if (license == null) { license = service.getLicenseText(desc.getLicenseName()); licenses.put(desc.getLicenseName(), license); } } // Confirm licenses getProgressListener().setCompleted(20); List<PackageDescriptor> acceptedList = new LinkedList<PackageDescriptor>(); for (PackageDescriptor desc : downloadList) { if (ConfirmLicenseDialog.confirm(desc, licenses.get(desc.getLicenseName()))) { acceptedList.add(desc); } } if (!acceptedList.isEmpty()) { UpdateManager um = new UpdateManager(service); um.performUpdates(acceptedList, getProgressListener()); getProgressListener().complete(); UpdateDialog.this.dispose(); // TODO: re-enable // ManagedExtension.checkForLicenseConflicts(); if (SwingTools.showConfirmDialog("update.complete_restart", ConfirmDialog.YES_NO_OPTION) == ConfirmDialog.YES_OPTION) { RapidMinerGUI.getMainFrame().exit(true); } } else { getProgressListener().complete(); } } catch (Exception e) { SwingTools.showSimpleErrorMessage("error_installing_update", e, e.getMessage()); } } }.start(); } @Override protected void ok() { ulp.startUpdate(); } }