/*
|
* 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 static org.opends.messages.QuickSetupMessages.*;
|
|
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.Map;
|
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.forgerock.i18n.LocalizableMessage;
|
import org.forgerock.i18n.LocalizableMessageBuilder;
|
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;
|
|
/**
|
* 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 final Set<SuffixDescriptor> orderedSuffixes = new TreeSet<>(this);
|
private final Map<String, JCheckBox> hmCheckBoxes = new HashMap<>();
|
/**
|
* 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();
|
}
|
|
@Override
|
public Object getFieldValue(FieldName fieldName)
|
{
|
if (fieldName == FieldName.SUFFIXES_TO_REPLICATE_OPTIONS)
|
{
|
return SuffixesToReplicateOptions.Type.REPLICATE_WITH_EXISTING_SUFFIXES;
|
}
|
else if (fieldName == FieldName.SUFFIXES_TO_REPLICATE)
|
{
|
Set<SuffixDescriptor> suffixes = new HashSet<>();
|
for (SuffixDescriptor suffix : orderedSuffixes)
|
{
|
if (hmCheckBoxes.get(suffix.getId()).isSelected())
|
{
|
suffixes.add(suffix);
|
}
|
}
|
return suffixes;
|
}
|
|
return null;
|
}
|
|
@Override
|
public int compare(SuffixDescriptor desc1, SuffixDescriptor desc2)
|
{
|
int result = compareSuffixDN(desc1, desc2);
|
if (result == 0)
|
{
|
result = compareSuffixStrings(desc1, desc2);
|
}
|
return result;
|
}
|
|
@Override
|
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;
|
}
|
|
@Override
|
protected boolean requiresScroll()
|
{
|
return false;
|
}
|
|
@Override
|
protected LocalizableMessage getInstructions()
|
{
|
return INFO_SUFFIXES_TO_REPLICATE_PANEL_INSTRUCTIONS.get();
|
}
|
|
@Override
|
protected LocalizableMessage getTitle()
|
{
|
return INFO_SUFFIXES_TO_REPLICATE_PANEL_TITLE.get();
|
}
|
|
@Override
|
public void beginDisplay(UserData data)
|
{
|
Set<SuffixDescriptor> array = orderSuffixes(data.getSuffixesToReplicateOptions().getAvailableSuffixes());
|
AuthenticationData authData = data.getReplicationOptions().getAuthenticationData();
|
String newServerDisplay;
|
newServerDisplay = authData != null ? authData.getHostName() + ":" + authData.getPort() : "";
|
|
if (!array.equals(orderedSuffixes) || !newServerDisplay.equals(serverToConnectDisplay))
|
{
|
serverToConnectDisplay = newServerDisplay;
|
Map<String, Boolean> hmOldValues = new HashMap<>();
|
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)
|
&& !Utils.areDnsEqual(suffix.getDN(), Constants.REPLICATION_CHANGES_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.isEmpty();
|
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);
|
|
/* 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)
|
{
|
Set<LocalizableMessage> replicaDisplays = new TreeSet<>();
|
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)
|
{
|
ServerDescriptor server = replica.getServer();
|
boolean isServerToConnect = server.getHostPort(false).equalsIgnoreCase(serverToConnectDisplay);
|
String serverDisplay = isServerToConnect ? serverToConnectDisplay : server.getHostPort(true);
|
|
int nEntries = replica.getEntries();
|
if (nEntries > 0)
|
{
|
return INFO_SUFFIX_LIST_REPLICA_DISPLAY_ENTRIES.get(serverDisplay, nEntries);
|
}
|
else if (nEntries == 0)
|
{
|
return INFO_SUFFIX_LIST_REPLICA_DISPLAY_NO_ENTRIES.get(serverDisplay);
|
}
|
else
|
{
|
return INFO_SUFFIX_LIST_REPLICA_DISPLAY_ENTRIES_NOT_AVAILABLE.get(serverDisplay);
|
}
|
}
|
|
private Set<SuffixDescriptor> orderSuffixes(Set<SuffixDescriptor> suffixes)
|
{
|
Set<SuffixDescriptor> ordered = new TreeSet<>(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));
|
}
|
|
}
|