/*
|
* 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 legal-notices/CDDLv1_0.txt
|
* or http://forgerock.org/license/CDDLv1.0.html.
|
* 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 legal-notices/CDDLv1_0.txt.
|
* 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 2008-2009 Sun Microsystems, Inc.
|
* Portions Copyright 2013-2015 ForgeRock AS.
|
*/
|
package org.opends.quicksetup.installer.ui;
|
|
import org.forgerock.i18n.LocalizableMessage;
|
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.util.HashMap;
|
|
import javax.swing.Box;
|
import javax.swing.ButtonGroup;
|
import javax.swing.JCheckBox;
|
import javax.swing.JLabel;
|
import javax.swing.JPanel;
|
import javax.swing.JRadioButton;
|
import javax.swing.event.DocumentEvent;
|
import javax.swing.event.DocumentListener;
|
import javax.swing.text.JTextComponent;
|
|
import org.opends.quicksetup.ButtonName;
|
import org.opends.quicksetup.UserData;
|
import org.opends.quicksetup.event.ButtonEvent;
|
import org.opends.quicksetup.installer.AuthenticationData;
|
import org.opends.quicksetup.installer.DataReplicationOptions;
|
import org.opends.quicksetup.ui.FieldName;
|
import org.opends.quicksetup.ui.GuiApplication;
|
import org.opends.quicksetup.ui.LabelFieldDescriptor;
|
import org.opends.quicksetup.ui.QuickSetupStepPanel;
|
import org.opends.quicksetup.ui.UIFactory;
|
|
/**
|
* This class is used to display the replication options for the server
|
* that is being installed.
|
*/
|
public class DataReplicationPanel extends QuickSetupStepPanel
|
{
|
private static final long serialVersionUID = -1721551487477733587L;
|
private Component lastFocusComponent;
|
private UserData defaultUserData;
|
|
private JRadioButton rbStandalone;
|
private JRadioButton rbReplicated;
|
private JCheckBox cbSecureReplication;
|
private JCheckBox cbTopologyExists;
|
private HashMap<FieldName, JLabel> hmLabels = new HashMap<>();
|
private HashMap<FieldName, JTextComponent> hmFields = new HashMap<>();
|
|
/**
|
* Constructor of the panel.
|
* @param application Application represented by this panel and used to
|
* initialize the fields of the panel.
|
*/
|
public DataReplicationPanel(GuiApplication application)
|
{
|
super(application);
|
this.defaultUserData = application.getUserData();
|
populateComponentMaps();
|
addDocumentListeners();
|
addFocusListeners();
|
addActionListeners();
|
}
|
|
/** {@inheritDoc} */
|
public Object getFieldValue(FieldName fieldName)
|
{
|
Object value = null;
|
|
if (fieldName == FieldName.REPLICATION_OPTIONS)
|
{
|
if (rbStandalone.isSelected())
|
{
|
value = DataReplicationOptions.Type.STANDALONE;
|
}
|
else if (cbTopologyExists.isSelected())
|
{
|
value =
|
DataReplicationOptions.Type.IN_EXISTING_TOPOLOGY;
|
}
|
else
|
{
|
value = DataReplicationOptions.Type.FIRST_IN_TOPOLOGY;
|
}
|
}
|
else if (fieldName == FieldName.REPLICATION_SECURE)
|
{
|
value = Boolean.valueOf(cbSecureReplication.isSelected());
|
}
|
else
|
{
|
JTextComponent field = getField(fieldName);
|
if (field != null)
|
{
|
value = field.getText();
|
}
|
}
|
|
return value;
|
}
|
|
/** {@inheritDoc} */
|
public void displayFieldInvalid(FieldName fieldName, boolean invalid)
|
{
|
JLabel label = getLabel(fieldName);
|
if (label != null)
|
{
|
UIFactory.TextStyle style;
|
|
if (invalid)
|
{
|
style = UIFactory.TextStyle.SECONDARY_FIELD_INVALID;
|
} else
|
{
|
style = UIFactory.TextStyle.SECONDARY_FIELD_VALID;
|
}
|
|
UIFactory.setTextStyle(label, style);
|
}
|
}
|
|
/** {@inheritDoc} */
|
protected Component createInputPanel()
|
{
|
JPanel panel = new JPanel(new GridBagLayout());
|
panel.setOpaque(false);
|
|
GridBagConstraints gbc = new GridBagConstraints();
|
gbc.weightx = 1.0;
|
gbc.fill = GridBagConstraints.HORIZONTAL;
|
gbc.gridwidth = GridBagConstraints.REMAINDER;
|
gbc.insets = UIFactory.getEmptyInsets();
|
panel.add(rbStandalone, gbc);
|
|
gbc.insets.top = UIFactory.TOP_INSET_RADIOBUTTON;
|
panel.add(rbReplicated, gbc);
|
|
gbc.insets.top = UIFactory.TOP_INSET_SECONDARY_FIELD;
|
gbc.insets.left = UIFactory.LEFT_INSET_RADIO_SUBORDINATE;
|
JPanel auxPanel = new JPanel(new GridBagLayout());
|
auxPanel.setOpaque(false);
|
panel.add(auxPanel, gbc);
|
panel.add(cbTopologyExists, gbc);
|
gbc.insets = UIFactory.getEmptyInsets();
|
gbc.gridwidth = 4;
|
gbc.weightx = 0.0;
|
gbc.insets.left = 0;
|
gbc.anchor = GridBagConstraints.WEST;
|
auxPanel.add(getLabel(FieldName.REPLICATION_PORT), gbc);
|
|
gbc.gridwidth--;
|
gbc.insets.left = UIFactory.LEFT_INSET_SECONDARY_FIELD;
|
gbc.fill = GridBagConstraints.HORIZONTAL;
|
gbc.weightx = 0.0;
|
auxPanel.add(getField(FieldName.REPLICATION_PORT), gbc);
|
|
gbc.gridwidth = GridBagConstraints.RELATIVE;
|
gbc.fill = GridBagConstraints.HORIZONTAL;
|
gbc.weightx = 0.0;
|
auxPanel.add(cbSecureReplication, gbc);
|
|
gbc.gridwidth = GridBagConstraints.REMAINDER;
|
gbc.insets.left = 0;
|
gbc.weightx = 1.0;
|
gbc.fill = GridBagConstraints.HORIZONTAL;
|
auxPanel.add(Box.createHorizontalGlue(), gbc);
|
|
auxPanel = new JPanel(new GridBagLayout());
|
auxPanel.setOpaque(false);
|
gbc.insets.left = 2 * UIFactory.LEFT_INSET_RADIO_SUBORDINATE;
|
panel.add(auxPanel, gbc);
|
|
// Add the server location widgets
|
FieldName[] fields =
|
{
|
FieldName.REMOTE_SERVER_HOST,
|
FieldName.REMOTE_SERVER_PORT,
|
FieldName.REMOTE_SERVER_DN,
|
FieldName.REMOTE_SERVER_PWD
|
};
|
|
gbc.insets = UIFactory.getEmptyInsets();
|
for (int i=0; i<fields.length; i++)
|
{
|
if (i != 0)
|
{
|
gbc.insets.top = UIFactory.TOP_INSET_SECONDARY_FIELD;
|
}
|
else
|
{
|
gbc.insets.top = 0;
|
}
|
gbc.gridwidth = GridBagConstraints.RELATIVE;
|
gbc.weightx = 0.0;
|
gbc.insets.left = 0;
|
gbc.anchor = GridBagConstraints.WEST;
|
auxPanel.add(getLabel(fields[i]), gbc);
|
|
JPanel aux2Panel = new JPanel(new GridBagLayout());
|
aux2Panel.setOpaque(false);
|
|
if (fields[i] == FieldName.REMOTE_SERVER_PORT)
|
{
|
gbc.gridwidth = 3;
|
}
|
else
|
{
|
gbc.gridwidth = GridBagConstraints.RELATIVE;
|
}
|
gbc.insets.left = UIFactory.LEFT_INSET_SECONDARY_FIELD;
|
gbc.fill = GridBagConstraints.HORIZONTAL;
|
gbc.weightx = 0.0;
|
aux2Panel.add(getField(fields[i]), gbc);
|
|
gbc.gridwidth = GridBagConstraints.REMAINDER;
|
gbc.insets.left = 0;
|
gbc.weightx = 1.0;
|
gbc.fill = GridBagConstraints.HORIZONTAL;
|
aux2Panel.add(Box.createHorizontalGlue(), gbc);
|
|
gbc.weightx = 1.0;
|
gbc.fill = GridBagConstraints.HORIZONTAL;
|
gbc.insets = UIFactory.getEmptyInsets();
|
gbc.gridwidth = GridBagConstraints.REMAINDER;
|
auxPanel.add(aux2Panel, gbc);
|
}
|
|
addVerticalGlue(panel);
|
|
return panel;
|
}
|
|
/** {@inheritDoc} */
|
protected LocalizableMessage getInstructions()
|
{
|
return INFO_DATA_REPLICATION_OPTIONS_PANEL_INSTRUCTIONS.get();
|
}
|
|
/** {@inheritDoc} */
|
protected LocalizableMessage getTitle()
|
{
|
return INFO_DATA_REPLICATION_OPTIONS_PANEL_TITLE.get();
|
}
|
|
/** {@inheritDoc} */
|
public void endDisplay()
|
{
|
if (lastFocusComponent != null)
|
{
|
lastFocusComponent.requestFocusInWindow();
|
}
|
}
|
|
/** {@inheritDoc} */
|
protected LocalizableMessage getTextForIcon(UIFactory.IconType iconType)
|
{
|
if (iconType == UIFactory.IconType.WAIT &&
|
rbReplicated.isSelected() && cbTopologyExists.isSelected())
|
{
|
return INFO_CONTACTING_SERVER_LABEL.get();
|
}
|
else
|
{
|
return super.getTextForIcon(iconType);
|
}
|
}
|
|
/**
|
* Returns the default value for the provided field Name.
|
* @param fieldName the field name for which we want to get the default
|
* value.
|
* @return the default value for the provided field Name.
|
*/
|
private Object getDefaultValue(FieldName fieldName)
|
{
|
AuthenticationData auth =
|
defaultUserData.getReplicationOptions().getAuthenticationData();
|
switch (fieldName)
|
{
|
case REPLICATION_PORT:
|
return defaultUserData.getReplicationOptions().getReplicationPort();
|
case REMOTE_SERVER_DN:
|
return auth.getDn();
|
case REMOTE_SERVER_PWD:
|
return auth.getPwd();
|
case REMOTE_SERVER_HOST:
|
return auth.getHostName();
|
case REMOTE_SERVER_PORT:
|
return auth.getPort();
|
case REPLICATION_OPTIONS:
|
return defaultUserData.getReplicationOptions().getType();
|
default:
|
throw new IllegalArgumentException("Unknown field name: " + fieldName);
|
}
|
}
|
|
/**
|
* Returns the default string value for the provided field Name.
|
* @param fieldName the field name for which we want to get the default
|
* string value.
|
* @return the default value for the provided field Name.
|
*/
|
private String getDefaultStringValue(FieldName fieldName)
|
{
|
Object v = getDefaultValue(fieldName);
|
if (v != null)
|
{
|
return String.valueOf(v);
|
}
|
return null;
|
}
|
|
/**
|
* Creates the components and populates the Maps with them.
|
*/
|
private void populateComponentMaps()
|
{
|
HashMap<FieldName, LabelFieldDescriptor> hm = new HashMap<>();
|
|
hm.put(FieldName.REPLICATION_PORT, new LabelFieldDescriptor(
|
INFO_REPLICATION_PORT_LABEL.get(),
|
INFO_REPLICATION_PORT_TOOLTIP.get(),
|
LabelFieldDescriptor.FieldType.TEXTFIELD,
|
LabelFieldDescriptor.LabelType.SECONDARY,
|
UIFactory.PORT_FIELD_SIZE));
|
|
hm.put(FieldName.REMOTE_SERVER_DN, new LabelFieldDescriptor(
|
INFO_REMOTE_SERVER_DN_LABEL.get(),
|
INFO_REMOTE_SERVER_DN_TOOLTIP.get(),
|
LabelFieldDescriptor.FieldType.TEXTFIELD,
|
LabelFieldDescriptor.LabelType.SECONDARY, UIFactory.DN_FIELD_SIZE));
|
|
hm.put(FieldName.REMOTE_SERVER_PWD, new LabelFieldDescriptor(
|
INFO_REMOTE_SERVER_PWD_LABEL.get(),
|
INFO_REMOTE_SERVER_PWD_TOOLTIP.get(),
|
LabelFieldDescriptor.FieldType.PASSWORD,
|
LabelFieldDescriptor.LabelType.SECONDARY,
|
UIFactory.PASSWORD_FIELD_SIZE));
|
|
hm.put(FieldName.REMOTE_SERVER_HOST, new LabelFieldDescriptor(
|
INFO_REMOTE_SERVER_HOST_LABEL.get(),
|
INFO_REMOTE_SERVER_HOST_TOOLTIP.get(),
|
LabelFieldDescriptor.FieldType.TEXTFIELD,
|
LabelFieldDescriptor.LabelType.SECONDARY,
|
UIFactory.HOST_FIELD_SIZE));
|
|
hm.put(FieldName.REMOTE_SERVER_PORT, new LabelFieldDescriptor(
|
INFO_REMOTE_SERVER_PORT_LABEL.get(),
|
INFO_REMOTE_SERVER_PORT_TOOLTIP.get(),
|
LabelFieldDescriptor.FieldType.TEXTFIELD,
|
LabelFieldDescriptor.LabelType.SECONDARY,
|
UIFactory.PORT_FIELD_SIZE));
|
|
for (FieldName fieldName : hm.keySet())
|
{
|
LabelFieldDescriptor desc = hm.get(fieldName);
|
|
String defaultValue = getDefaultStringValue(fieldName);
|
JTextComponent field = UIFactory.makeJTextComponent(desc, defaultValue);
|
|
hmFields.put(fieldName, field);
|
|
JLabel l = UIFactory.makeJLabel(desc);
|
l.setLabelFor(field);
|
|
hmLabels.put(fieldName, l);
|
}
|
|
ButtonGroup buttonGroup = new ButtonGroup();
|
rbStandalone =
|
UIFactory.makeJRadioButton(INFO_STANDALONE_SERVER_LABEL.get(),
|
INFO_STANDALONE_SERVER_TOOLTIP.get(),
|
UIFactory.TextStyle.SECONDARY_FIELD_VALID);
|
rbStandalone.setOpaque(false);
|
rbReplicated =
|
UIFactory.makeJRadioButton(INFO_REPLICATED_SERVER_LABEL.get(),
|
INFO_REPLICATED_SERVER_TOOLTIP.get(),
|
UIFactory.TextStyle.SECONDARY_FIELD_VALID);
|
rbReplicated.setOpaque(false);
|
buttonGroup.add(rbStandalone);
|
buttonGroup.add(rbReplicated);
|
|
DataReplicationOptions.Type type =
|
defaultUserData.getReplicationOptions().getType();
|
cbTopologyExists = UIFactory.makeJCheckBox(INFO_TOPOLOGY_EXISTS_LABEL.get(),
|
INFO_TOPOLOGY_EXISTS_TOOLTIP.get(),
|
UIFactory.TextStyle.SECONDARY_FIELD_VALID);
|
cbTopologyExists.setOpaque(false);
|
rbStandalone.setSelected(type ==
|
DataReplicationOptions.Type.STANDALONE);
|
rbReplicated.setSelected(type !=
|
DataReplicationOptions.Type.STANDALONE);
|
cbSecureReplication = UIFactory.makeJCheckBox(
|
INFO_SECURE_REPLICATION_LABEL.get(),
|
INFO_SECURE_REPLICATION_TOOLTIP.get(),
|
UIFactory.TextStyle.SECONDARY_FIELD_VALID);
|
cbSecureReplication.setSelected(
|
defaultUserData.getReplicationOptions().useSecureReplication());
|
cbTopologyExists.setSelected(type ==
|
DataReplicationOptions.Type.IN_EXISTING_TOPOLOGY);
|
checkEnablingState();
|
}
|
|
/**
|
* Adds all the required document listeners to the fields.
|
*/
|
private void addDocumentListeners()
|
{
|
FieldName[] fields = {
|
FieldName.REMOTE_SERVER_DN,
|
FieldName.REMOTE_SERVER_PWD,
|
FieldName.REMOTE_SERVER_HOST,
|
FieldName.REMOTE_SERVER_PORT
|
};
|
for (FieldName field : fields) {
|
JTextComponent tf = getField(field);
|
tf.getDocument().addDocumentListener(new DocumentListener() {
|
public void changedUpdate(DocumentEvent ev) {
|
if (!rbReplicated.isSelected()) {
|
rbReplicated.setSelected(true);
|
}
|
if (!cbTopologyExists.isSelected()) {
|
cbTopologyExists.setSelected(true);
|
}
|
}
|
|
public void insertUpdate(DocumentEvent ev) {
|
changedUpdate(ev);
|
}
|
|
public void removeUpdate(DocumentEvent ev) {
|
changedUpdate(ev);
|
}
|
});
|
}
|
}
|
|
/**
|
* Adds the required focus listeners to the fields.
|
*/
|
private void addFocusListeners()
|
{
|
final FocusListener l = new FocusListener()
|
{
|
public void focusGained(FocusEvent e)
|
{
|
lastFocusComponent = e.getComponent();
|
if (lastFocusComponent instanceof JTextComponent)
|
{
|
rbReplicated.setSelected(true);
|
if (lastFocusComponent != getField(FieldName.REPLICATION_PORT))
|
{
|
cbTopologyExists.setSelected(true);
|
}
|
}
|
}
|
|
public void focusLost(FocusEvent e)
|
{
|
}
|
};
|
|
for (JTextComponent tf : hmFields.values())
|
{
|
tf.addFocusListener(l);
|
}
|
rbReplicated.addFocusListener(l);
|
rbStandalone.addFocusListener(l);
|
cbTopologyExists.addFocusListener(l);
|
cbSecureReplication.addFocusListener(l);
|
|
lastFocusComponent = rbStandalone;
|
}
|
|
/**
|
* Adds the required focus listeners to the fields.
|
*/
|
private void addActionListeners()
|
{
|
final ActionListener l = new ActionListener()
|
{
|
public void actionPerformed(ActionEvent ev)
|
{
|
checkEnablingState();
|
ButtonEvent be = new ButtonEvent(ev.getSource(),
|
ButtonName.INPUT_PANEL_BUTTON);
|
notifyButtonListeners(be);
|
}
|
};
|
rbReplicated.addActionListener(l);
|
rbStandalone.addActionListener(l);
|
cbTopologyExists.addActionListener(l);
|
cbTopologyExists.addActionListener(new ActionListener()
|
{
|
public void actionPerformed(ActionEvent ev)
|
{
|
if (cbTopologyExists.isSelected())
|
{
|
rbReplicated.setSelected(true);
|
}
|
}
|
});
|
}
|
|
/**
|
* Enables/disables the fields.
|
*/
|
private void checkEnablingState()
|
{
|
boolean enableFields = rbReplicated.isSelected() &&
|
cbTopologyExists.isSelected();
|
|
for (JTextComponent tf : hmFields.values())
|
{
|
tf.setEnabled(enableFields);
|
}
|
|
for (JLabel l : hmLabels.values())
|
{
|
l.setEnabled(enableFields);
|
}
|
|
cbTopologyExists.setEnabled(rbReplicated.isSelected());
|
getLabel(FieldName.REPLICATION_PORT).setEnabled(rbReplicated.isSelected());
|
getField(FieldName.REPLICATION_PORT).setEnabled(rbReplicated.isSelected());
|
cbSecureReplication.setEnabled(rbReplicated.isSelected());
|
}
|
|
/**
|
* Returns the label associated with the given field name.
|
* @param fieldName the field name for which we want to retrieve the JLabel.
|
* @return the label associated with the given field name.
|
*/
|
private JLabel getLabel(FieldName fieldName)
|
{
|
return hmLabels.get(fieldName);
|
}
|
|
/**
|
* Returns the JTextComponent associated with the given field name.
|
* @param fieldName the field name for which we want to retrieve the
|
* JTextComponent.
|
* @return the JTextComponent associated with the given field name.
|
*/
|
private JTextComponent getField(FieldName fieldName)
|
{
|
return hmFields.get(fieldName);
|
}
|
}
|