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