/*
|
* 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-2010 Sun Microsystems, Inc.
|
* Portions Copyright 2013 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.opends.messages.Message;
|
import org.opends.messages.MessageBuilder;
|
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 = null;
|
|
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 Message getInstructions()
|
{
|
return INFO_SUFFIXES_TO_REPLICATE_PANEL_INSTRUCTIONS.get();
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
protected Message 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) &&
|
!Utils.areDnsEqual(suffix.getDN(),
|
Constants.REPLICATION_CHANGES_DN))
|
{
|
orderedSuffixes.add(suffix);
|
}
|
}
|
hmCheckBoxes.clear();
|
for (SuffixDescriptor suffix : orderedSuffixes)
|
{
|
JCheckBox cb = UIFactory.makeJCheckBox(Message.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(
|
Message.raw(getSuffixString(suffix)),
|
UIFactory.TextStyle.SECONDARY_FIELD_VALID);
|
l.setOpaque(false);
|
|
/* Use a prototype label to get the additional insets */
|
JEditorPane proto = UIFactory.makeTextPane(
|
Message.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<Message> replicaDisplays = new TreeSet<Message>();
|
for (ReplicaDescriptor rep: desc.getReplicas())
|
{
|
replicaDisplays.add(getReplicaDisplay(rep));
|
}
|
MessageBuilder buf = new MessageBuilder();
|
for (Message display: replicaDisplays)
|
{
|
if (buf.length() > 0)
|
{
|
buf.append("\n");
|
}
|
buf.append(display);
|
}
|
return buf.toString();
|
}
|
|
private Message getReplicaDisplay(ReplicaDescriptor replica)
|
{
|
Message 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, String.valueOf(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));
|
}
|
}
|