SuffixesToReplicatePanel.java revision e7cac727a9231ff3602e61a4ea678e0463eb0e39
/*
* 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-2010 Sun Microsystems, Inc.
* Portions Copyright 2013-2015 ForgeRock AS.
*/
package org.opends.quicksetup.installer.ui;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
import javax.swing.Box;
import javax.swing.JCheckBox;
import javax.swing.JEditorPane;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
import org.opends.admin.ads.ADSContext;
import org.opends.admin.ads.ReplicaDescriptor;
import org.opends.admin.ads.ServerDescriptor;
import org.opends.admin.ads.SuffixDescriptor;
import org.opends.quicksetup.Constants;
import org.opends.quicksetup.UserData;
import org.opends.quicksetup.installer.AuthenticationData;
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.Utils;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.LocalizableMessageBuilder;
import static org.opends.messages.QuickSetupMessages.*;
/**
* This class is used to provide a data model for the list of suffixes that
* we have to replicate on the new server.
*/
public class SuffixesToReplicatePanel extends QuickSetupStepPanel
implements Comparator<SuffixDescriptor>
{
private static final long serialVersionUID = -8051367953737385327L;
private TreeSet<SuffixDescriptor> orderedSuffixes =
new TreeSet<SuffixDescriptor>(this);
private HashMap<String, JCheckBox> hmCheckBoxes =
new HashMap<String, JCheckBox>();
/**
* The display of the server the user provided in the replication options
* panel.
*/
private String serverToConnectDisplay;
private JLabel noSuffixLabel;
private Component labelGlue;
private JPanel checkBoxPanel;
private JScrollPane scroll;
/**
* Constructor of the panel.
* @param application Application represented by this panel and used to
* initialize the fields of the panel.
*/
public SuffixesToReplicatePanel(GuiApplication application)
{
super(application);
createComponents();
}
/** {@inheritDoc} */
public Object getFieldValue(FieldName fieldName)
{
Object value = null;
if (fieldName == FieldName.SUFFIXES_TO_REPLICATE_OPTIONS)
{
value = SuffixesToReplicateOptions.Type.REPLICATE_WITH_EXISTING_SUFFIXES;
}
else if (fieldName == FieldName.SUFFIXES_TO_REPLICATE)
{
Set<SuffixDescriptor> suffixes = new HashSet<SuffixDescriptor>();
for (SuffixDescriptor suffix:orderedSuffixes)
{
if (hmCheckBoxes.get(suffix.getId()).isSelected())
{
suffixes.add(suffix);
}
}
value = suffixes;
}
return value;
}
/** {@inheritDoc} */
public int compare(SuffixDescriptor desc1, SuffixDescriptor desc2)
{
int result = compareSuffixDN(desc1, desc2);
if (result == 0)
{
result = compareSuffixStrings(desc1, desc2);
}
return result;
}
/** {@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.insets.top = UIFactory.TOP_INSET_SECONDARY_FIELD;
gbc.insets.left = UIFactory.LEFT_INSET_SUBPANEL_SUBORDINATE;
// Add the checkboxes
checkBoxPanel = new JPanel(new GridBagLayout());
checkBoxPanel.setOpaque(false);
gbc.insets.top = 0;
gbc.anchor = GridBagConstraints.NORTH;
gbc.weighty = 1.0;
gbc.fill = GridBagConstraints.BOTH;
scroll = UIFactory.createBorderLessScrollBar(checkBoxPanel);
panel.add(scroll, gbc);
gbc.weighty = 0.0;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets.top = UIFactory.TOP_INSET_SECONDARY_FIELD;
gbc.anchor = GridBagConstraints.NORTHEAST;
panel.add(noSuffixLabel, gbc);
noSuffixLabel.setVisible(false);
labelGlue = Box.createVerticalGlue();
gbc.fill = GridBagConstraints.VERTICAL;
gbc.weighty = 1.0;
panel.add(labelGlue, gbc);
labelGlue.setVisible(false);
return panel;
}
/** {@inheritDoc} */
protected boolean requiresScroll()
{
return false;
}
/** {@inheritDoc} */
protected LocalizableMessage getInstructions()
{
return INFO_SUFFIXES_TO_REPLICATE_PANEL_INSTRUCTIONS.get();
}
/** {@inheritDoc} */
protected LocalizableMessage getTitle()
{
return INFO_SUFFIXES_TO_REPLICATE_PANEL_TITLE.get();
}
/** {@inheritDoc} */
public void beginDisplay(UserData data)
{
TreeSet<SuffixDescriptor> array = orderSuffixes(
data.getSuffixesToReplicateOptions().getAvailableSuffixes());
AuthenticationData authData =
data.getReplicationOptions().getAuthenticationData();
String newServerDisplay;
if (authData != null)
{
newServerDisplay = authData.getHostName()+":"+authData.getPort();
}
else
{
newServerDisplay = "";
}
if (!array.equals(orderedSuffixes) ||
!newServerDisplay.equals(serverToConnectDisplay))
{
serverToConnectDisplay = newServerDisplay;
HashMap<String, Boolean> hmOldValues = new HashMap<String, Boolean>();
for (String id : hmCheckBoxes.keySet())
{
hmOldValues.put(id, hmCheckBoxes.get(id).isSelected());
}
orderedSuffixes.clear();
for (SuffixDescriptor suffix : array)
{
if (!Utils.areDnsEqual(suffix.getDN(),
ADSContext.getAdministrationSuffixDN()) &&
!Utils.areDnsEqual(suffix.getDN(), Constants.SCHEMA_DN))
{
orderedSuffixes.add(suffix);
}
}
hmCheckBoxes.clear();
for (SuffixDescriptor suffix : orderedSuffixes)
{
JCheckBox cb = UIFactory.makeJCheckBox(LocalizableMessage.raw(suffix.getDN()),
INFO_SUFFIXES_TO_REPLICATE_DN_TOOLTIP.get(),
UIFactory.TextStyle.SECONDARY_FIELD_VALID);
cb.setOpaque(false);
Boolean v = hmOldValues.get(suffix.getId());
if (v != null)
{
cb.setSelected(v);
}
hmCheckBoxes.put(suffix.getId(), cb);
}
populateCheckBoxPanel();
}
boolean display = orderedSuffixes.size() > 0;
noSuffixLabel.setVisible(!display);
labelGlue.setVisible(!display);
scroll.setVisible(display);
}
/**
* Creates the components of this panel.
*/
private void createComponents()
{
noSuffixLabel = UIFactory.makeJLabel(UIFactory.IconType.NO_ICON,
INFO_SUFFIX_LIST_EMPTY.get(),
UIFactory.TextStyle.SECONDARY_FIELD_VALID);
}
private void populateCheckBoxPanel()
{
checkBoxPanel.removeAll();
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridy = 0;
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.NORTH;
boolean first = true;
for (SuffixDescriptor suffix : orderedSuffixes)
{
gbc.insets.left = 0;
gbc.weightx = 0.0;
if (!first)
{
gbc.insets.top = UIFactory.TOP_INSET_SECONDARY_FIELD;
}
gbc.gridwidth = GridBagConstraints.RELATIVE;
JCheckBox cb = hmCheckBoxes.get(suffix.getId());
cb.setVerticalAlignment(SwingConstants.TOP);
gbc.gridx = 0;
checkBoxPanel.add(cb, gbc);
gbc.insets.left = UIFactory.LEFT_INSET_PRIMARY_FIELD;
gbc.weightx = 1.0;
gbc.gridwidth = GridBagConstraints.REMAINDER;
JEditorPane l = UIFactory.makeTextPane(
LocalizableMessage.raw(getSuffixString(suffix)),
UIFactory.TextStyle.SECONDARY_FIELD_VALID);
l.setOpaque(false);
/* Use a prototype label to get the additional insets */
JEditorPane proto = UIFactory.makeTextPane(
LocalizableMessage.raw(suffix.getDN()),
UIFactory.TextStyle.SECONDARY_FIELD_VALID);
gbc.insets.top += Math.abs(cb.getPreferredSize().height -
proto.getPreferredSize().height) / 2;
gbc.gridx = 1;
checkBoxPanel.add(l, gbc);
first = false;
gbc.gridy ++;
}
gbc.weighty = 1.0;
gbc.insets = UIFactory.getEmptyInsets();
gbc.fill = GridBagConstraints.VERTICAL;
checkBoxPanel.add(Box.createVerticalGlue(), gbc);
}
private String getSuffixString(SuffixDescriptor desc)
{
TreeSet<LocalizableMessage> replicaDisplays = new TreeSet<LocalizableMessage>();
for (ReplicaDescriptor rep: desc.getReplicas())
{
replicaDisplays.add(getReplicaDisplay(rep));
}
LocalizableMessageBuilder buf = new LocalizableMessageBuilder();
for (LocalizableMessage display: replicaDisplays)
{
if (buf.length() > 0)
{
buf.append("\n");
}
buf.append(display);
}
return buf.toString();
}
private LocalizableMessage getReplicaDisplay(ReplicaDescriptor replica)
{
LocalizableMessage display;
ServerDescriptor server = replica.getServer();
String serverDisplay;
if (server.getHostPort(false).equalsIgnoreCase(serverToConnectDisplay))
{
serverDisplay = serverToConnectDisplay;
}
else
{
serverDisplay = server.getHostPort(true);
}
int nEntries = replica.getEntries();
if (nEntries > 0)
{
display = INFO_SUFFIX_LIST_REPLICA_DISPLAY_ENTRIES.get(serverDisplay, nEntries);
}
else if (nEntries == 0)
{
display = INFO_SUFFIX_LIST_REPLICA_DISPLAY_NO_ENTRIES.get(serverDisplay);
}
else
{
display = INFO_SUFFIX_LIST_REPLICA_DISPLAY_ENTRIES_NOT_AVAILABLE.get(serverDisplay);
}
return display;
}
private TreeSet<SuffixDescriptor> orderSuffixes(
Set<SuffixDescriptor> suffixes)
{
TreeSet<SuffixDescriptor> ordered = new TreeSet<SuffixDescriptor>(this);
ordered.addAll(suffixes);
return ordered;
}
private int compareSuffixDN(SuffixDescriptor desc1, SuffixDescriptor desc2)
{
return desc1.getDN().compareTo(desc2.getDN());
}
private int compareSuffixStrings(SuffixDescriptor desc1,
SuffixDescriptor desc2)
{
return getSuffixString(desc1).compareTo(getSuffixString(desc2));
}
}