/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved. * * Oracle and Java are registered trademarks of Oracle and/or its affiliates. * Other names may be trademarks of their respective owners. * * The contents of this file are subject to the terms of either the GNU General * Public License Version 2 only ("GPL") or the Common Development and Distribution * License("CDDL") (collectively, the "License"). You may not use this file except in * compliance with the License. You can obtain a copy of the License at * http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the * License for the specific language governing permissions and limitations under the * License. When distributing the software, include this License Header Notice in * each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP. Oracle * designates this particular file as subject to the "Classpath" exception as * provided by Oracle in the GPL Version 2 section of the License file that * accompanied this code. If applicable, add the following below the License Header, * with the fields enclosed by brackets [] replaced by your own identifying * information: "Portions Copyrighted [year] [name of copyright owner]" * * Contributor(s): * * The Original Software is NetBeans. The Initial Developer of the Original Software * is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All * Rights Reserved. * * If you wish your version of this file to be governed by only the CDDL or only the * GPL Version 2, indicate your decision by adding "[Contributor] elects to include * this software in this distribution under the [CDDL or GPL Version 2] license." If * you do not indicate a single choice of license, a recipient has the option to * distribute your version of this file under either the CDDL, the GPL Version 2 or * to extend the choice of license to its licensees as provided above. However, if * you add GPL Version 2 code and therefore, elected the GPL Version 2 license, then * the option applies only if the new code is made subject to such option by the * copyright holder. */ package org.mycompany.installer.wizard.components.panels; import java.awt.ComponentOrientation; import java.awt.GridBagConstraints; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.border.EmptyBorder; import org.netbeans.installer.Installer; import org.netbeans.installer.product.Registry; import org.netbeans.installer.product.RegistryNode; import org.netbeans.installer.product.RegistryType; import org.netbeans.installer.product.components.Product; import org.netbeans.installer.utils.ErrorManager; import org.netbeans.installer.utils.FileUtils; import org.netbeans.installer.utils.LogManager; import org.netbeans.installer.utils.ResourceUtils; import org.netbeans.installer.utils.StringUtils; import org.netbeans.installer.utils.SystemUtils; import org.mycompany.installer.utils.applications.NetBeansRCPUtils; import org.netbeans.installer.utils.exceptions.NativeException; import org.netbeans.installer.utils.helper.swing.NbiCheckBox; import org.netbeans.installer.utils.helper.swing.NbiLabel; import org.netbeans.installer.utils.helper.swing.NbiPanel; import org.netbeans.installer.utils.helper.swing.NbiTextPane; import org.netbeans.installer.wizard.components.panels.ErrorMessagePanel; import org.netbeans.installer.wizard.components.panels.ErrorMessagePanel.ErrorMessagePanelSwingUi; import org.netbeans.installer.wizard.components.panels.ErrorMessagePanel.ErrorMessagePanelUi; import org.netbeans.installer.wizard.containers.SwingContainer; import org.netbeans.installer.wizard.ui.SwingUi; import org.netbeans.installer.wizard.ui.WizardUi; /** * * @author Dmitry Lipin */ public class PreInstallSummaryPanel extends ErrorMessagePanel { ///////////////////////////////////////////////////////////////////////////////// // Instance public PreInstallSummaryPanel() { setProperty(TITLE_PROPERTY, DEFAULT_TITLE); setProperty(DESCRIPTION_PROPERTY, DEFAULT_DESCRIPTION); setProperty(INSTALLATION_FOLDER_PROPERTY, DEFAULT_INSTALLATION_FOLDER); setProperty(UNINSTALL_LABEL_TEXT_PROPERTY, DEFAULT_UNINSTALL_LABEL_TEXT); setProperty(INSTALLATION_SIZE_PROPERTY, DEFAULT_INSTALLATION_SIZE); setProperty(DOWNLOAD_SIZE_PROPERTY, DEFAULT_DOWNLOAD_SIZE); setProperty(NEXT_BUTTON_TEXT_PROPERTY, DEFAULT_NEXT_BUTTON_TEXT); setProperty(ERROR_NOT_ENOUGH_SPACE_PROPERTY, DEFAULT_ERROR_NOT_ENOUGH_SPACE); setProperty(ERROR_CANNOT_CHECK_SPACE_PROPERTY, DEFAULT_ERROR_CANNOT_CHECK_SPACE); setProperty(ERROR_LOGIC_ACCESS_PROPERTY, DEFAULT_ERROR_LOGIC_ACCESS); setProperty(ERROR_FSROOTS_PROPERTY, DEFAULT_ERROR_FSROOTS); setProperty(ERROR_NON_EXISTENT_ROOT_PROPERTY, DEFAULT_ERROR_NON_EXISTENT_ROOT); setProperty(ERROR_CANNOT_WRITE_PROPERTY, DEFAULT_ERROR_CANNOT_WRITE); setProperty(REMOVE_APP_USERDIR_TEXT_PROPERTY, DEFAULT_REMOVE_APP_USERDIR_TEXT); setProperty(REMOVE_APP_USERDIR_CHECKBOX_PROPERTY, DEFAULT_REMOVE_APP_USERDIR_CHECKBOX); } @Override public WizardUi getWizardUi() { if (wizardUi == null) { wizardUi = new PreInstallSummaryPanelUi(this); } return wizardUi; } @Override public void initialize() { final List<Product> toInstall = Registry.getInstance().getProductsToInstall(); if (toInstall.size() > 0) { setProperty(NEXT_BUTTON_TEXT_PROPERTY, DEFAULT_NEXT_BUTTON_TEXT); setProperty(DESCRIPTION_PROPERTY, DEFAULT_DESCRIPTION); } else { setProperty(NEXT_BUTTON_TEXT_PROPERTY, DEFAULT_NEXT_BUTTON_TEXT_UNINSTALL); setProperty(DESCRIPTION_PROPERTY, DEFAULT_DESCRIPTION_UNINSTALL); } } ///////////////////////////////////////////////////////////////////////////////// // Inner Classes public static class PreInstallSummaryPanelUi extends ErrorMessagePanelUi { protected PreInstallSummaryPanel component; public PreInstallSummaryPanelUi(PreInstallSummaryPanel component) { super(component); this.component = component; } @Override public SwingUi getSwingUi(SwingContainer container) { if (swingUi == null) { swingUi = new PreInstallSummaryPanelSwingUi(component, container); } return super.getSwingUi(container); } } public static class PreInstallSummaryPanelSwingUi extends ErrorMessagePanelSwingUi { protected PreInstallSummaryPanel component; private NbiTextPane locationsPane; private NbiLabel uninstallListLabel; private NbiTextPane uninstallListPane; private NbiLabel installationSizeLabel; private NbiLabel installationSizeValue; private NbiLabel downloadSizeLabel; private NbiLabel downloadSizeValue; private NbiCheckBox removeUserdirCheckbox; private NbiTextPane removeUserdirPane; private NbiPanel spacer; private int gridy = 0; public PreInstallSummaryPanelSwingUi( final PreInstallSummaryPanel component, final SwingContainer container) { super(component, container); this.component = component; initComponents(); } // protected //////////////////////////////////////////////////////////////// @Override protected void initializeContainer() { super.initializeContainer(); container.getNextButton().setText( panel.getProperty(NEXT_BUTTON_TEXT_PROPERTY)); } @Override protected void initialize() { final Registry registry = Registry.getInstance(); final StringBuilder text = new StringBuilder(); long installationSize = 0; long downloadSize = 0; for (Product product : registry.getProductsToInstall()) { installationSize += product.getRequiredDiskSpace(); downloadSize += product.getDownloadSize(); } // add top-level components like nb-base, glassfish, tomcat, jdk for (Product product : registry.getProductsToInstall()) { text.append(StringUtils.LF); text.append(StringUtils.format(panel.getProperty(INSTALLATION_FOLDER_PROPERTY), product.getDisplayName())); text.append(StringUtils.LF); text.append(" " + product.getInstallationLocation()); text.append(StringUtils.LF); } locationsPane.setText(text); List<Product> toUninstall = registry.getProductsToUninstall(); String uninstallLabelText = toUninstall.size() > 0 ? StringUtils.format( panel.getProperty(UNINSTALL_LABEL_TEXT_PROPERTY), toUninstall.get(0).getDisplayName()) : ""; uninstallListLabel.setText(uninstallLabelText); installationSizeLabel.setText( panel.getProperty(INSTALLATION_SIZE_PROPERTY)); installationSizeValue.setText(StringUtils.formatSize( installationSize)); downloadSizeLabel.setText( panel.getProperty(DOWNLOAD_SIZE_PROPERTY)); downloadSizeValue.setText(StringUtils.formatSize( downloadSize)); if (registry.getProductsToInstall().size() == 0) { locationsPane.setVisible(false); installationSizeLabel.setVisible(false); installationSizeValue.setVisible(false); } else { locationsPane.setVisible(true); installationSizeLabel.setVisible(true); installationSizeValue.setVisible(true); } if (registry.getProductsToUninstall().size() == 0) { uninstallListLabel.setVisible(false); uninstallListPane.setVisible(false); } else { uninstallListLabel.setVisible(true); uninstallListPane.setVisible(true); } downloadSizeLabel.setVisible(false); downloadSizeValue.setVisible(false); for (RegistryNode remoteNode : registry.getNodes(RegistryType.REMOTE)) { if (remoteNode.isVisible()) { downloadSizeLabel.setVisible(true); downloadSizeValue.setVisible(true); } } if (Boolean.getBoolean(REMOVE_APP_USERDIR_PROPERTY)) { removeUserdirCheckbox.doClick(); } removeUserdirCheckbox.setVisible(false); removeUserdirPane.setVisible(false); for (Product product : Registry.getInstance().getProductsToUninstall()) { try { File installLocation = product.getInstallationLocation(); LogManager.log("... product installation directory: " + installLocation); File userDir = NetBeansRCPUtils.getApplicationUserDirFile(installLocation); LogManager.log("... product userdir: " + userDir); if (FileUtils.exists(userDir) && FileUtils.canWrite(userDir)) { removeUserdirCheckbox.setText( StringUtils.format( panel.getProperty(REMOVE_APP_USERDIR_CHECKBOX_PROPERTY), userDir.getAbsolutePath())); removeUserdirCheckbox.setBorder(new EmptyBorder(0, 0, 0, 0)); removeUserdirCheckbox.setVisible(true); removeUserdirPane.setVisible(true); removeUserdirPane.setContentType("text/html"); removeUserdirPane.setText( StringUtils.format( panel.getProperty(REMOVE_APP_USERDIR_TEXT_PROPERTY), product.getDisplayName())); } break; } catch (IOException e) { LogManager.log(e); } } //if(productCheckboxList!=null) { // for(Pair <Product, NbiCheckBox> pair : productCheckboxList) { // pair.getSecond().doClick(); // } //} super.initialize(); } @Override protected String validateInput() { try { if (!Boolean.getBoolean(SystemUtils.NO_SPACE_CHECK_PROPERTY)) { final List<File> roots = SystemUtils.getFileSystemRoots(); final List<Product> toInstall = Registry.getInstance().getProductsToInstall(); final Map<File, Long> spaceMap = new HashMap<File, Long>(); LogManager.log("Available roots : " + StringUtils.asString(roots)); File downloadDataDirRoot = FileUtils.getRoot( Installer.getInstance().getLocalDirectory(), roots); long downloadSize = 0; for (Product product : toInstall) { downloadSize += product.getDownloadSize(); } // the critical check point - we download all the data spaceMap.put(downloadDataDirRoot, new Long(downloadSize)); long lastDataSize = 0; for (Product product : toInstall) { final File installLocation = product.getInstallationLocation(); final File root = FileUtils.getRoot(installLocation, roots); final long productSize = product.getRequiredDiskSpace(); LogManager.log(" [" + root + "] <- " + installLocation); if (root != null) { Long ddSize = spaceMap.get(downloadDataDirRoot); // remove space that was freed after the remove of previos product data spaceMap.put(downloadDataDirRoot, Long.valueOf(ddSize - lastDataSize)); // add space required for next product installation Long size = spaceMap.get(root); size = Long.valueOf( (size != null ? size.longValue() : 0L) + productSize); spaceMap.put(root, size); lastDataSize = product.getDownloadSize(); } else { return StringUtils.format( panel.getProperty(ERROR_NON_EXISTENT_ROOT_PROPERTY), product, installLocation); } } for (File root : spaceMap.keySet()) { try { final long availableSpace = SystemUtils.getFreeSpace(root); final long requiredSpace = spaceMap.get(root) + REQUIRED_SPACE_ADDITION; if (availableSpace < requiredSpace) { return StringUtils.format( panel.getProperty(ERROR_NOT_ENOUGH_SPACE_PROPERTY), root, StringUtils.formatSize(requiredSpace - availableSpace)); } } catch (NativeException e) { ErrorManager.notifyError( panel.getProperty(ERROR_CANNOT_CHECK_SPACE_PROPERTY), e); } } } final List<Product> toUninstall = Registry.getInstance().getProductsToUninstall(); for (Product product : toUninstall) { if (!FileUtils.canWrite(product.getInstallationLocation())) { return StringUtils.format( panel.getProperty(ERROR_CANNOT_WRITE_PROPERTY), product, product.getInstallationLocation()); } } } catch (IOException e) { ErrorManager.notifyError( panel.getProperty(ERROR_FSROOTS_PROPERTY), e); } return null; } // private ////////////////////////////////////////////////////////////////// private void initComponents() { gridy = 0; // locationsPane //////////////////////////////////////////////////////// locationsPane = new NbiTextPane(); // uninstallListPane //////////////////////////////////////////////////// uninstallListPane = new NbiTextPane(); // uninstallListLabel /////////////////////////////////////////////////// uninstallListLabel = new NbiLabel(); uninstallListLabel.setLabelFor(uninstallListPane); // installationSizeValue //////////////////////////////////////////////// installationSizeValue = new NbiLabel(); //installationSizeValue.setFocusable(true); // installationSizeLabel //////////////////////////////////////////////// installationSizeLabel = new NbiLabel(); installationSizeLabel.setLabelFor(installationSizeValue); // downloadSizeValue //////////////////////////////////////////////////// downloadSizeValue = new NbiLabel(); //downloadSizeValue.setFocusable(true); // downloadSizeLabel //////////////////////////////////////////////////// downloadSizeLabel = new NbiLabel(); downloadSizeLabel.setLabelFor(downloadSizeValue); // spacer /////////////////////////////////////////////////////////////// spacer = new NbiPanel(); // this ///////////////////////////////////////////////////////////////// add(locationsPane, new GridBagConstraints( 0, gridy++, // x, y 1, 1, // width, height 1.0, 0.0, // weight-x, weight-y GridBagConstraints.PAGE_START, // anchor GridBagConstraints.HORIZONTAL, // fill new Insets(11, 11, 0, 11), // padding 0, 0)); // padx, pady - ??? add(uninstallListLabel, new GridBagConstraints( 0, gridy++, // x, y 1, 1, // width, height 1.0, 0.0, // weight-x, weight-y GridBagConstraints.PAGE_START, // anchor GridBagConstraints.HORIZONTAL, // fill new Insets(11, 11, 0, 11), // padding 0, 0)); // padx, pady - ??? add(uninstallListPane, new GridBagConstraints( 0, gridy++, // x, y 1, 1, // width, height 1.0, 0.0, // weight-x, weight-y GridBagConstraints.PAGE_START, // anchor GridBagConstraints.HORIZONTAL, // fill new Insets(0, 11, 0, 11), // padding 0, 0)); // padx, pady - ??? int gridy0 = gridy; gridy++; removeUserdirPane = new NbiTextPane(); add(removeUserdirPane, new GridBagConstraints( 0, gridy++, // x, y 1, 1, // width, height 1.0, 0.0, // weight-x, weight-y GridBagConstraints.PAGE_START, // anchor GridBagConstraints.HORIZONTAL, // fill new Insets(11, 11, 0, 11), // padding 0, 0)); // padx, pady - ??? removeUserdirCheckbox = new NbiCheckBox(); add(removeUserdirCheckbox, new GridBagConstraints( 0, gridy++, // x, y 1, 1, // width, height 1.0, 0.0, // weight-x, weight-y GridBagConstraints.PAGE_START, // anchor GridBagConstraints.HORIZONTAL, // fill new Insets(4, 20, 0, 11), // padding 0, 0)); // padx, pady - ??? removeUserdirCheckbox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.setProperty(REMOVE_APP_USERDIR_PROPERTY, "" + removeUserdirCheckbox.isSelected()); } }); add(installationSizeLabel, new GridBagConstraints( 0, gridy++, // x, y 1, 1, // width, height 1.0, 0.0, // weight-x, weight-y GridBagConstraints.LINE_START, // anchor GridBagConstraints.HORIZONTAL, // fill new Insets(22, 11, 0, 11), // padding 0, 0)); // padx, pady - ??? add(installationSizeValue, new GridBagConstraints( 0, gridy++, // x, y 1, 1, // width, height 1.0, 0.0, // weight-x, weight-y GridBagConstraints.LINE_START, // anchor GridBagConstraints.HORIZONTAL, // fill new Insets(4, 22, 0, 11), // padding 0, 0)); // padx, pady - ??? add(downloadSizeLabel, new GridBagConstraints( 0, gridy++, // x, y 1, 1, // width, height 1.0, 0.0, // weight-x, weight-y GridBagConstraints.LINE_START, // anchor GridBagConstraints.HORIZONTAL, // fill new Insets(4, 11, 0, 11), // padding 0, 0)); // padx, pady - ??? add(downloadSizeValue, new GridBagConstraints( 0, gridy++, // x, y 1, 1, // width, height 1.0, 0.0, // weight-x, weight-y GridBagConstraints.LINE_START, // anchor GridBagConstraints.HORIZONTAL, // fill new Insets(4, 22, 0, 11), // padding 0, 0)); // padx, pady - ??? add(spacer, new GridBagConstraints( 0, gridy + 10, // x, y 1, 1, // width, height 1.0, 1.0, // weight-x, weight-y GridBagConstraints.CENTER, // anchor GridBagConstraints.BOTH, // fill new Insets(0, 11, 0, 11), // padding 0, 0)); // padx, pady - ??? } } ///////////////////////////////////////////////////////////////////////////////// // Constants public static final String INSTALLATION_FOLDER_PROPERTY = "installation.folder"; // NOI18N public static final String UNINSTALL_LABEL_TEXT_PROPERTY = "uninstall.list.label.text"; // NOI18N public static final String INSTALLATION_SIZE_PROPERTY = "installation.size"; // NOI18N public static final String DOWNLOAD_SIZE_PROPERTY = "download.size"; // NOI18N public static final String ERROR_NOT_ENOUGH_SPACE_PROPERTY = "error.not.enough.space"; // NOI18N public static final String ERROR_CANNOT_CHECK_SPACE_PROPERTY = "error.cannot.check.space"; // NOI18N public static final String ERROR_LOGIC_ACCESS_PROPERTY = "error.logic.access"; // NOI18N public static final String ERROR_FSROOTS_PROPERTY = "error.fsroots"; // NOI18N public static final String ERROR_NON_EXISTENT_ROOT_PROPERTY = "error.non.existent.root"; // NOI18N public static final String ERROR_CANNOT_WRITE_PROPERTY = "error.cannot.write"; // NOI18N public static final String REMOVE_APP_USERDIR_PROPERTY = "remove.app.userdir"; public static final String REMOVE_APP_USERDIR_TEXT_PROPERTY = "remove.app.userdir.text"; public static final String REMOVE_APP_USERDIR_CHECKBOX_PROPERTY = "remove.app.userdir.checkbox"; public static final String DEFAULT_TITLE = ResourceUtils.getString(PreInstallSummaryPanel.class, "PrISP.title"); // NOI18N public static final String DEFAULT_DESCRIPTION = ResourceUtils.getString(PreInstallSummaryPanel.class, "PrISP.description"); // NOI18N public static final String DEFAULT_DESCRIPTION_UNINSTALL = ResourceUtils.getString(PreInstallSummaryPanel.class, "PrISP.description.uninstall"); // NOI18N public static final String DEFAULT_INSTALLATION_FOLDER = ResourceUtils.getString(PreInstallSummaryPanel.class, "PrISP.installation.folder"); // NOI18N public static final String DEFAULT_UNINSTALL_LABEL_TEXT = ResourceUtils.getString(PreInstallSummaryPanel.class, "PrISP.uninstall.list.label.text"); // NOI18N public static final String DEFAULT_INSTALLATION_SIZE = ResourceUtils.getString(PreInstallSummaryPanel.class, "PrISP.installation.size"); // NOI18N public static final String DEFAULT_DOWNLOAD_SIZE = ResourceUtils.getString(PreInstallSummaryPanel.class, "PrISP.download.size"); // NOI18N public static final String DEFAULT_NEXT_BUTTON_TEXT = ResourceUtils.getString(PreInstallSummaryPanel.class, "PrISP.next.button.text"); // NOI18N public static final String DEFAULT_NEXT_BUTTON_TEXT_UNINSTALL = ResourceUtils.getString(PreInstallSummaryPanel.class, "PrISP.next.button.text.uninstall"); // NOI18N public static final String DEFAULT_ERROR_NOT_ENOUGH_SPACE = ResourceUtils.getString(PreInstallSummaryPanel.class, "PrISP.error.not.enough.space"); // NOI18N public static final String DEFAULT_ERROR_CANNOT_CHECK_SPACE = ResourceUtils.getString(PreInstallSummaryPanel.class, "PrISP.error.cannot.check.space");// NOI18N public static final String DEFAULT_ERROR_LOGIC_ACCESS = ResourceUtils.getString(PreInstallSummaryPanel.class, "PrISP.error.logic.access");// NOI18N public static final String DEFAULT_ERROR_FSROOTS = ResourceUtils.getString(PreInstallSummaryPanel.class, "PrISP.error.fsroots"); // NOI18N public static final String DEFAULT_ERROR_NON_EXISTENT_ROOT = ResourceUtils.getString(PreInstallSummaryPanel.class, "PrISP.error.non.existent.root"); // NOI18N public static final String DEFAULT_ERROR_CANNOT_WRITE = ResourceUtils.getString(PreInstallSummaryPanel.class, "PrISP.error.cannot.write"); // NOI18N public static final String DEFAULT_REMOVE_APP_USERDIR_TEXT = ResourceUtils.getString(PreInstallSummaryPanel.class, "PrISP.remove.app.userdir.text"); // NOI18N public static final String DEFAULT_REMOVE_APP_USERDIR_CHECKBOX = ResourceUtils.getString(PreInstallSummaryPanel.class, "PrISP.remove.app.userdir.checkbox"); // NOI18N public static final long REQUIRED_SPACE_ADDITION = 10L * 1024L * 1024L; // 10MB }