/*
* 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 2008-2009 Sun Microsystems, Inc.
*/
package org.opends.quicksetup.installer.ui;
import org.opends.messages.Message;
import static org.opends.messages.QuickSetupMessages.*;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import javax.swing.Box;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.text.JTextComponent;
import org.opends.admin.ads.ServerDescriptor;
import org.opends.quicksetup.UserData;
import org.opends.quicksetup.installer.AuthenticationData;
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 provide a data model for the list of servers for which
* we must provide a replication port.
*/
public class RemoteReplicationPortsPanel extends QuickSetupStepPanel
implements Comparator<ServerDescriptor>
{
private static final long serialVersionUID = -3742350600617826375L;
private Component lastFocusComponent;
private HashMap<String, JLabel> hmLabels =
new HashMap<String, JLabel>();
private HashMap<String, JTextComponent> hmFields =
new HashMap<String, JTextComponent>();
private HashMap<String, JCheckBox> hmCbs =
new HashMap<String, JCheckBox>();
private JScrollPane scroll;
private JPanel fieldsPanel;
private TreeSet<ServerDescriptor> orderedServers =
new TreeSet<ServerDescriptor>(this);
//The display of the server the user provided in the replication options
// panel
private String serverToConnectDisplay = null;
/**
* Constructor of the panel.
* @param application Application represented by this panel and used to
* initialize the fields of the panel.
*/
public RemoteReplicationPortsPanel(GuiApplication application)
{
super(application);
}
/**
* {@inheritDoc}
*/
public Object getFieldValue(FieldName fieldName)
{
Object value = null;
if (fieldName == FieldName.REMOTE_REPLICATION_PORT)
{
Map<String, String> hm = new HashMap<String, String>();
for (String id : hmFields.keySet())
{
hm.put(id, hmFields.get(id).getText());
}
value = hm;
}
else if (fieldName == FieldName.REMOTE_REPLICATION_SECURE)
{
Map<String, Boolean> hm = new HashMap<String, Boolean>();
for (String id : hmCbs.keySet())
{
hm.put(id, hmCbs.get(id).isSelected());
}
value = hm;
}
return value;
}
/**
* {@inheritDoc}
*/
public void displayFieldInvalid(FieldName fieldName, boolean invalid)
{
if (fieldName == FieldName.REMOTE_REPLICATION_PORT)
{
for (String id : hmLabels.keySet())
{
UIFactory.setTextStyle(hmLabels.get(id),
UIFactory.TextStyle.SECONDARY_FIELD_VALID);
}
if (invalid)
{
for (String id : hmLabels.keySet())
{
String sPort = hmFields.get(id).getText();
boolean isValid = false;
try
{
int replicationPort = Integer.parseInt(sPort);
if ((replicationPort >= 1) &&
(replicationPort <= 65535))
{
isValid = true;
}
}
catch (Throwable t)
{
}
if (!isValid)
{
UIFactory.setTextStyle(hmLabels.get(id),
UIFactory.TextStyle.SECONDARY_FIELD_INVALID);
}
}
}
}
}
/**
* {@inheritDoc}
*/
protected boolean requiresScroll()
{
return false;
}
/**
* {@inheritDoc}
*/
public int compare(ServerDescriptor desc1, ServerDescriptor desc2)
{
return desc1.getHostPort(true).compareTo(desc2.getHostPort(true));
}
/**
* {@inheritDoc}
*/
protected Component createInputPanel()
{
JPanel panel = new JPanel(new GridBagLayout());
panel.setOpaque(false);
GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = 1.0;
gbc.anchor = GridBagConstraints.NORTHWEST;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.insets = UIFactory.getEmptyInsets();
gbc.weighty = 1.0;
gbc.fill = GridBagConstraints.BOTH;
fieldsPanel = new JPanel(new GridBagLayout());
fieldsPanel.setOpaque(false);
scroll = UIFactory.createBorderLessScrollBar(fieldsPanel);
panel.add(scroll, gbc);
return panel;
}
/**
* {@inheritDoc}
*/
protected Message getInstructions()
{
return INFO_REMOTE_REPLICATION_PORT_INSTRUCTIONS.get();
}
/**
* {@inheritDoc}
*/
protected Message getTitle()
{
return INFO_REMOTE_REPLICATION_PORT_TITLE.get();
}
/**
* {@inheritDoc}
*/
public void beginDisplay(UserData data)
{
TreeSet<ServerDescriptor> array = orderServers(
data.getRemoteWithNoReplicationPort().keySet());
AuthenticationData authData =
data.getReplicationOptions().getAuthenticationData();
String newServerDisplay;
if (authData != null)
{
newServerDisplay = authData.getHostName()+":"+authData.getPort();
}
else
{
newServerDisplay = "";
}
if (!array.equals(orderedServers) ||
!newServerDisplay.equals(serverToConnectDisplay))
{
serverToConnectDisplay = newServerDisplay;
/**
* Adds the required focus listeners to the fields.
*/
final FocusListener l = new FocusListener()
{
public void focusGained(FocusEvent e)
{
lastFocusComponent = e.getComponent();
}
public void focusLost(FocusEvent e)
{
}
};
lastFocusComponent = null;
HashMap<String, String> hmOldValues = new HashMap<String, String>();
for (String id : hmFields.keySet())
{
hmOldValues.put(id, hmFields.get(id).getText());
}
HashMap<String, Boolean> hmOldSecureValues =
new HashMap<String, Boolean>();
for (String id : hmCbs.keySet())
{
hmOldSecureValues.put(id, hmCbs.get(id).isSelected());
}
orderedServers.clear();
orderedServers.addAll(array);
hmFields.clear();
hmCbs.clear();
hmLabels.clear();
for (ServerDescriptor server : orderedServers)
{
String serverDisplay;
if (server.getHostPort(false).equalsIgnoreCase(serverToConnectDisplay))
{
serverDisplay = serverToConnectDisplay;
}
else
{
serverDisplay = server.getHostPort(true);
}
LabelFieldDescriptor desc = new LabelFieldDescriptor(
Message.raw(serverDisplay),
INFO_REPLICATION_PORT_TOOLTIP.get(),
LabelFieldDescriptor.FieldType.TEXTFIELD,
LabelFieldDescriptor.LabelType.PRIMARY,
UIFactory.PORT_FIELD_SIZE);
AuthenticationData auth =
data.getRemoteWithNoReplicationPort().get(server);
JTextComponent field = UIFactory.makeJTextComponent(desc,
String.valueOf(auth.getPort()));
String oldValue = hmOldValues.get(server.getId());
if (oldValue != null)
{
field.setText(oldValue);
}
JLabel label = UIFactory.makeJLabel(desc);
hmFields.put(server.getId(), field);
label.setLabelFor(field);
field.addFocusListener(l);
if (lastFocusComponent == null)
{
lastFocusComponent = field;
}
hmLabels.put(server.getId(), label);
JCheckBox cb = UIFactory.makeJCheckBox(
INFO_SECURE_REPLICATION_LABEL.get(),
INFO_SECURE_REPLICATION_TOOLTIP.get(),
UIFactory.TextStyle.SECONDARY_FIELD_VALID);
cb.setSelected(auth.useSecureConnection());
Boolean oldSecureValue = hmOldSecureValues.get(server.getId());
if (oldSecureValue != null)
{
cb.setSelected(oldSecureValue);
}
hmCbs.put(server.getId(), cb);
}
populateFieldsPanel();
}
}
/**
* {@inheritDoc}
*/
public void endDisplay()
{
if (lastFocusComponent != null)
{
lastFocusComponent.requestFocusInWindow();
}
}
private void populateFieldsPanel()
{
fieldsPanel.removeAll();
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.NORTHWEST;
boolean first = true;
for (ServerDescriptor server : orderedServers)
{
gbc.insets.left = 0;
gbc.weightx = 0.0;
if (!first)
{
gbc.insets.top = UIFactory.TOP_INSET_SECONDARY_FIELD;
}
gbc.gridwidth = 4;
fieldsPanel.add(hmLabels.get(server.getId()), gbc);
gbc.insets.left = UIFactory.LEFT_INSET_PRIMARY_FIELD;
gbc.gridwidth--;
fieldsPanel.add(hmFields.get(server.getId()), gbc);
gbc.insets.left = UIFactory.LEFT_INSET_SECONDARY_FIELD;
gbc.gridwidth = GridBagConstraints.RELATIVE;
fieldsPanel.add(hmCbs.get(server.getId()), gbc);
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weightx = 1.0;
fieldsPanel.add(Box.createHorizontalGlue(), gbc);
first = false;
}
addVerticalGlue(fieldsPanel);
}
private TreeSet<ServerDescriptor> orderServers(
Set<ServerDescriptor> servers)
{
TreeSet<ServerDescriptor> ordered = new TreeSet<ServerDescriptor>(this);
ordered.addAll(servers);
return ordered;
}
}