/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2010 Sun Microsystems, Inc. * Portions Copyright 2013 ForgeRock AS. */ package org.opends.quicksetup.installer.ui; import static org.opends.messages.QuickSetupMessages.*; import java.awt.Component; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.io.File; import java.util.Set; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JEditorPane; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import org.opends.admin.ads.ReplicaDescriptor; import org.opends.admin.ads.SuffixDescriptor; import org.opends.messages.Message; import org.opends.quicksetup.JavaArguments; import org.opends.quicksetup.UserData; import org.opends.quicksetup.installer.DataReplicationOptions; import org.opends.quicksetup.installer.NewSuffixOptions; import org.opends.quicksetup.installer.SuffixesToReplicateOptions; import org.opends.quicksetup.ui.FieldName; import org.opends.quicksetup.ui.GuiApplication; import org.opends.quicksetup.ui.QuickSetupStepPanel; import org.opends.quicksetup.ui.UIFactory; import org.opends.quicksetup.util.HtmlProgressMessageFormatter; /** * The panel where the user specifies the runtime settings. * */ public class RuntimeOptionsPanel extends QuickSetupStepPanel { private static final long serialVersionUID = -8303034619200476754L; private JButton bServer; private JButton bImport; private JLabel lServer; private JLabel lImport; private JEditorPane warning; private Component lastFocusComponent; private JavaArguments serverJavaArgs; private JavaArguments importJavaArgs; private JavaArguments defaultServerJavaArgs; private JavaArguments defaultImportJavaArgs; // The size of the LDIF file to be imported used as threshold to display // a warning message, telling the user to update the import runtime // settings. private static final long WARNING_THRESOLD_FOR_IMPORT = 200 * 1024 * 1024; private static final int WARNING_THRESOLD_AUTOMATICALLY_GENERATED_IMPORT = 100000; private static final int WARNING_THRESOLD_REPLICATED_ENTRIES = 100000; /** * Constructor of the panel. * @param application Application represented by this panel and used to * initialize the fields of the panel. */ public RuntimeOptionsPanel(GuiApplication application) { super(application); createComponents(); addFocusListeners(); } /** * {@inheritDoc} */ protected Component createInputPanel() { JPanel panel = new JPanel(new GridBagLayout()); panel.setOpaque(false); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridwidth = 4; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.anchor = GridBagConstraints.NORTHWEST; gbc.gridx = 0; gbc.gridy = 0; gbc.insets.top = UIFactory.TOP_INSET_PRIMARY_FIELD; gbc.insets.bottom = UIFactory.TOP_INSET_PRIMARY_FIELD; gbc.weightx = 1.0; panel.add(warning, gbc); warning.setVisible(false); gbc.gridy ++; gbc.gridwidth = 1; gbc.weightx = 0.0; gbc.insets.bottom = 0; JLabel l = UIFactory.makeJLabel(UIFactory.IconType.NO_ICON, INFO_SERVER_RUNTIME_ARGS_LABEL.get(), UIFactory.TextStyle.PRIMARY_FIELD_VALID); gbc.insets.top = Math.abs( bServer.getPreferredSize().height - l.getPreferredSize().height) / 2; panel.add(l, gbc); gbc.gridx ++; gbc.insets.left = UIFactory.LEFT_INSET_PRIMARY_FIELD; gbc.weightx = 0.5; panel.add(lServer, gbc); gbc.gridx ++; gbc.insets.top = 0; gbc.weightx = 0.0; panel.add(bServer, gbc); gbc.gridx ++; gbc.weightx = 1.0; gbc.insets.left = 0; panel.add(Box.createHorizontalGlue(), gbc); gbc.gridy++; gbc.gridx = 0; gbc.weightx = 0.0; l = UIFactory.makeJLabel(UIFactory.IconType.NO_ICON, INFO_IMPORT_RUNTIME_ARGS_LABEL.get(), UIFactory.TextStyle.PRIMARY_FIELD_VALID); int importInsetsTop = Math.abs( bImport.getPreferredSize().height - l.getPreferredSize().height) / 2; gbc.insets.top = importInsetsTop + UIFactory.TOP_INSET_SECONDARY_FIELD; panel.add(l, gbc); gbc.gridx ++; gbc.insets.left = UIFactory.LEFT_INSET_PRIMARY_FIELD; gbc.weightx = 0.5; panel.add(lImport, gbc); gbc.gridx ++; gbc.insets.top = UIFactory.TOP_INSET_SECONDARY_FIELD; gbc.weightx = 0.0; panel.add(bImport, gbc); gbc.gridx ++; gbc.weightx = 1.0; gbc.insets.left = 0; panel.add(Box.createHorizontalGlue(), gbc); gbc.gridx = 0; gbc.gridwidth = 4; gbc.gridy ++; gbc.insets = UIFactory.getEmptyInsets(); gbc.weightx = 1.0; gbc.weighty = 1.0; gbc.fill = GridBagConstraints.VERTICAL; panel.add(Box.createVerticalGlue(), gbc); return panel; } /** * {@inheritDoc} */ protected Message getInstructions() { return INFO_JAVA_RUNTIME_OPTIONS_PANEL_INSTRUCTIONS.get(); } /** * {@inheritDoc} */ protected Message getTitle() { return INFO_JAVA_RUNTIME_OPTIONS_PANEL_TITLE.get(); } /** * {@inheritDoc} */ @Override public Object getFieldValue(FieldName fieldName) { Object value = null; if (fieldName == FieldName.SERVER_JAVA_ARGUMENTS) { value = serverJavaArgs; } else if (fieldName == FieldName.IMPORT_JAVA_ARGUMENTS) { value = importJavaArgs; } return value; } /** * {@inheritDoc} */ @Override public void beginDisplay(UserData uData) { if (defaultServerJavaArgs == null) { defaultServerJavaArgs = uData.getDefaultJavaArguments(UserData.SERVER_SCRIPT_NAME); } if (defaultImportJavaArgs == null) { defaultImportJavaArgs = uData.getDefaultJavaArguments(UserData.IMPORT_SCRIPT_NAME); } boolean updatePanel = false; if (serverJavaArgs == null) { serverJavaArgs = uData.getJavaArguments(UserData.SERVER_SCRIPT_NAME); updatePanel = true; } if (importJavaArgs == null) { importJavaArgs = uData.getJavaArguments(UserData.IMPORT_SCRIPT_NAME); updatePanel = true; } if (updatePanel) { lServer.setText(JavaArguments.getMessageForJLabel( serverJavaArgs, defaultServerJavaArgs, UIFactory.SECONDARY_FIELD_VALID_FONT).toString()); lImport.setText(JavaArguments.getMessageForJLabel( importJavaArgs, defaultImportJavaArgs, UIFactory.SECONDARY_FIELD_VALID_FONT).toString()); } updateWarningMessage(uData); } /** * {@inheritDoc} */ public void endDisplay() { if (lastFocusComponent != null) { lastFocusComponent.requestFocusInWindow(); } } /** * {@inheritDoc} */ public boolean requiresScroll() { return false; } /** * Adds the required focus listeners to the fields. */ private void addFocusListeners() { FocusListener l = new FocusListener() { public void focusGained(FocusEvent e) { lastFocusComponent = e.getComponent(); } public void focusLost(FocusEvent e) { } }; bServer.addFocusListener(l); bImport.addFocusListener(l); lastFocusComponent = bServer; } private void changeServerClicked() { JavaArgumentsDialog dlg = new JavaArgumentsDialog( getFrame(), serverJavaArgs, INFO_SERVER_JAVA_ARGUMENTS_TITLE.get(), INFO_SERVER_JAVA_ARGUMENTS_MSG.get()); dlg.pack(); dlg.setModal(true); dlg.setVisible(true); if (!dlg.isCanceled()) { serverJavaArgs = dlg.getJavaArguments(); lServer.setText(JavaArguments.getMessageForJLabel( serverJavaArgs, defaultServerJavaArgs, UIFactory.SECONDARY_FIELD_VALID_FONT).toString()); } } private void changeImportClicked() { JavaArgumentsDialog dlg = new JavaArgumentsDialog( getFrame(), importJavaArgs, INFO_IMPORT_JAVA_ARGUMENTS_TITLE.get(), INFO_IMPORT_JAVA_ARGUMENTS_MSG.get()); dlg.pack(); dlg.setModal(true); dlg.setVisible(true); if (!dlg.isCanceled()) { importJavaArgs = dlg.getJavaArguments(); lImport.setText(JavaArguments.getMessageForJLabel( importJavaArgs, defaultImportJavaArgs, UIFactory.SECONDARY_FIELD_VALID_FONT).toString()); } } private void createComponents() { warning = UIFactory.makeHtmlPane(Message.EMPTY, UIFactory.INSTRUCTIONS_FONT); warning.setOpaque(false); lServer = UIFactory.makeJLabel(UIFactory.IconType.NO_ICON, Message.EMPTY, UIFactory.TextStyle.SECONDARY_FIELD_VALID); bServer = UIFactory.makeJButton(INFO_JAVA_RUNTIME_CHANGE_LABEL.get(), INFO_JAVA_RUNTIME_CHANGE_SERVER_TOOLTIP.get()); bServer.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { changeServerClicked(); } }); lImport = UIFactory.makeJLabel(UIFactory.IconType.NO_ICON, Message.EMPTY, UIFactory.TextStyle.SECONDARY_FIELD_VALID); bImport = UIFactory.makeJButton(INFO_JAVA_RUNTIME_CHANGE_LABEL.get(), INFO_JAVA_RUNTIME_CHANGE_IMPORT_TOOLTIP.get()); bImport.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { changeImportClicked(); } }); } private JFrame getFrame() { Component mainWindow = getMainWindow(); JFrame frame = null; if (mainWindow instanceof JFrame) { frame = (JFrame)mainWindow; } return frame; } private void updateWarningMessage(UserData uData) { Message msg = null; DataReplicationOptions repl = uData.getReplicationOptions(); SuffixesToReplicateOptions suf = uData.getSuffixesToReplicateOptions(); boolean createSuffix = repl.getType() == DataReplicationOptions.Type.FIRST_IN_TOPOLOGY || repl.getType() == DataReplicationOptions.Type.STANDALONE || suf.getType() == SuffixesToReplicateOptions.Type.NEW_SUFFIX_IN_TOPOLOGY; if (createSuffix) { NewSuffixOptions options = uData.getNewSuffixOptions(); switch (options.getType()) { case IMPORT_FROM_LDIF_FILE: File ldifFile = new File(options.getLDIFPaths().getFirst()); if (ldifFile.length() > WARNING_THRESOLD_FOR_IMPORT) { msg = INFO_IMPORT_FILE_WARNING_UPDATE_RUNTIME_ARGS.get(); } break; case IMPORT_AUTOMATICALLY_GENERATED_DATA: if (options.getNumberEntries() > WARNING_THRESOLD_AUTOMATICALLY_GENERATED_IMPORT) { msg = INFO_AUTOMATICALLY_GENERATED_DATA_WARNING_UPDATE_RUNTIME_ARGS. get(); } break; } } else if (repl.getType() == DataReplicationOptions.Type.IN_EXISTING_TOPOLOGY) { int maxReplicatedEntries = 0; Set<SuffixDescriptor> suffixes = suf.getSuffixes(); for (SuffixDescriptor suffix : suffixes) { int suffixEntries = 0; for (ReplicaDescriptor replica : suffix.getReplicas()) { suffixEntries = Math.max(suffixEntries, replica.getEntries()); } maxReplicatedEntries += suffixEntries; } if (maxReplicatedEntries > WARNING_THRESOLD_REPLICATED_ENTRIES) { msg = INFO_REPLICATED_ENTRIES_WARNING_UPDATE_RUNTIME_ARGS.get(); } } if (msg != null) { HtmlProgressMessageFormatter formatter = new HtmlProgressMessageFormatter(); StringBuilder buf = new StringBuilder(); String space = formatter.getSpace().toString(); String lBreak = formatter.getLineBreak().toString(); String title = UIFactory.applyFontToHtml( INFO_GENERAL_WARNING.get().toString(), UIFactory.TITLE_FONT); String details = UIFactory.applyFontToHtml(msg.toString(), UIFactory.SECONDARY_FIELD_VALID_FONT); buf.append(UIFactory.getIconHtml(UIFactory.IconType.WARNING_LARGE)) .append(space).append(space) .append(title) .append(lBreak).append(lBreak) .append(details); String s = "<form>"+UIFactory.applyErrorBackgroundToHtml(buf.toString())+ "</form>"; warning.setText(s); warning.setVisible(true); } else { warning.setText(""); warning.setVisible(false); } } }