/*
|
* 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.guitools.controlpanel.ui;
|
|
import static org.opends.messages.AdminToolMessages.*;
|
|
import java.awt.Component;
|
import java.awt.GridBagConstraints;
|
import java.awt.GridBagLayout;
|
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionListener;
|
import java.util.ArrayList;
|
import java.util.Collection;
|
import java.util.HashMap;
|
import java.util.HashSet;
|
import java.util.LinkedHashSet;
|
import java.util.Map;
|
import java.util.Set;
|
import java.util.SortedSet;
|
import java.util.TreeSet;
|
|
import javax.swing.Box;
|
import javax.swing.DefaultListModel;
|
import javax.swing.JButton;
|
import javax.swing.JLabel;
|
import javax.swing.JList;
|
import javax.swing.JPanel;
|
import javax.swing.SwingUtilities;
|
import javax.swing.event.ListSelectionEvent;
|
import javax.swing.event.ListSelectionListener;
|
|
import org.opends.guitools.controlpanel.datamodel.BackendDescriptor;
|
import org.opends.guitools.controlpanel.datamodel.BaseDNDescriptor;
|
import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
|
import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
|
import org.opends.guitools.controlpanel.task.DeleteBaseDNAndBackendTask;
|
import org.opends.guitools.controlpanel.task.Task;
|
import org.opends.guitools.controlpanel.ui.renderer.CustomListCellRenderer;
|
import org.opends.guitools.controlpanel.util.Utilities;
|
import org.opends.messages.Message;
|
import org.opends.messages.MessageBuilder;
|
import org.opends.server.types.DN;
|
|
/**
|
* The panel displayed when the user clicks on 'Delete Base DN...' in the
|
* browse entries dialog.
|
*
|
*/
|
public class DeleteBaseDNPanel extends StatusGenericPanel
|
{
|
private static final long serialVersionUID = 2182662824496761087L;
|
|
/**
|
* The list containing the base DNs.
|
*/
|
protected JList list;
|
|
/**
|
* Label indicating that no element was found.
|
*/
|
protected JLabel lNoElementsFound;
|
|
/**
|
* The main panel.
|
*/
|
protected JPanel mainPanel;
|
|
/**
|
* Default constructor.
|
*
|
*/
|
public DeleteBaseDNPanel()
|
{
|
super();
|
createLayout();
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
public Message getTitle()
|
{
|
return INFO_CTRL_PANEL_DELETE_BASE_DN_TITLE.get();
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
public Component getPreferredFocusComponent()
|
{
|
return list;
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
public boolean requiresScroll()
|
{
|
return false;
|
}
|
|
|
/**
|
* Returns the no backend found label.
|
* @return the no backend found label.
|
*/
|
protected Message getNoElementsFoundLabel()
|
{
|
return INFO_CTRL_PANEL_NO_BASE_DNS_FOUND_LABEL.get();
|
}
|
|
/**
|
* Returns the list label.
|
* @return the list label.
|
*/
|
protected Message getListLabel()
|
{
|
return INFO_CTRL_PANEL_SELECT_BASE_DNS_TO_DELETE.get();
|
}
|
|
/**
|
* Updates the list of base DNs.
|
* @param newElements the base DNs to be used to update the list.
|
*/
|
protected void updateList(final Collection<?> newElements)
|
{
|
final DefaultListModel model = (DefaultListModel)list.getModel();
|
boolean changed = newElements.size() != model.getSize();
|
if (!changed)
|
{
|
int i = 0;
|
for (Object newElement : newElements)
|
{
|
changed = !newElement.equals(model.getElementAt(i));
|
if (changed)
|
{
|
break;
|
}
|
i++;
|
}
|
}
|
if (changed)
|
{
|
SwingUtilities.invokeLater(new Runnable()
|
{
|
/**
|
* {@inheritDoc}
|
*/
|
public void run()
|
{
|
@SuppressWarnings("deprecation")
|
Object[] s = list.getSelectedValues();
|
Set<Object> selected = new HashSet<Object>();
|
if (s != null)
|
{
|
for (Object o : s)
|
{
|
selected.add(o);
|
}
|
}
|
final DefaultListModel model = (DefaultListModel)list.getModel();
|
model.clear();
|
SortedSet<Integer> indices = new TreeSet<Integer>();
|
int i = 0;
|
for (Object newElement : newElements)
|
{
|
model.addElement(newElement);
|
if (selected.contains(newElement))
|
{
|
indices.add(i);
|
}
|
i ++;
|
}
|
if (selected.size() > 0)
|
{
|
int[] indArray = new int[indices.size()];
|
i = 0;
|
for (Integer index : indices)
|
{
|
indArray[i] = index;
|
i++;
|
}
|
list.setSelectedIndices(indArray);
|
}
|
checkVisibility();
|
}
|
});
|
}
|
}
|
|
private void checkVisibility()
|
{
|
mainPanel.setVisible(list.getModel().getSize() > 0);
|
lNoElementsFound.setVisible(list.getModel().getSize() == 0);
|
}
|
|
/**
|
* Creates the layout of the panel (but the contents are not populated here).
|
*/
|
private void createLayout()
|
{
|
GridBagConstraints gbc = new GridBagConstraints();
|
|
gbc.gridx = 0;
|
gbc.gridy = 0;
|
gbc.gridwidth = 1;
|
addErrorPane(gbc);
|
|
mainPanel = new JPanel(new GridBagLayout());
|
mainPanel.setOpaque(false);
|
gbc.gridy ++;
|
gbc.weightx = 1.0;
|
gbc.weighty = 1.0;
|
gbc.fill = GridBagConstraints.BOTH;
|
add(mainPanel, gbc);
|
|
gbc.anchor = GridBagConstraints.CENTER;
|
gbc.fill = GridBagConstraints.NONE;
|
lNoElementsFound = Utilities.createPrimaryLabel(getNoElementsFoundLabel());
|
add(lNoElementsFound, gbc);
|
lNoElementsFound.setVisible(false);
|
|
gbc.gridy = 0;
|
gbc.anchor = GridBagConstraints.WEST;
|
gbc.weightx = 0.0;
|
gbc.gridwidth = 2;
|
gbc.weightx = 0.0;
|
gbc.weighty = 0.0;
|
gbc.fill = GridBagConstraints.NONE;
|
JLabel lBaseDNs =
|
Utilities.createPrimaryLabel(getListLabel());
|
mainPanel.add(lBaseDNs, gbc);
|
gbc.insets.top = 5;
|
list = new JList(new DefaultListModel());
|
list.setCellRenderer(new CustomListCellRenderer(list));
|
list.setVisibleRowCount(15);
|
gbc.gridy ++;
|
gbc.gridheight = 3;
|
gbc.gridwidth = 1;
|
gbc.weightx = 1.0;
|
gbc.weighty = 1.0;
|
gbc.fill = GridBagConstraints.BOTH;
|
mainPanel.add(Utilities.createScrollPane(list), gbc);
|
|
JButton selectAllButton = Utilities.createButton(
|
INFO_CTRL_PANEL_SELECT_ALL_BUTTON.get());
|
selectAllButton.addActionListener(new ActionListener()
|
{
|
/**
|
* {@inheritDoc}
|
*/
|
public void actionPerformed(ActionEvent ev)
|
{
|
int[] indices = new int[list.getModel().getSize()];
|
for (int i=0 ; i<indices.length; i++)
|
{
|
indices[i] = i;
|
}
|
list.setSelectedIndices(indices);
|
}
|
});
|
gbc.gridx ++;
|
gbc.gridheight = 1;
|
gbc.fill = GridBagConstraints.HORIZONTAL;
|
gbc.insets.left = 5;
|
gbc.weightx = 0.0;
|
gbc.weighty = 0.0;
|
mainPanel.add(selectAllButton, gbc);
|
|
gbc.gridy ++;
|
JButton unselectAllButton = Utilities.createButton(
|
INFO_CTRL_PANEL_CLEAR_SELECTION_BUTTON.get());
|
unselectAllButton.addActionListener(new ActionListener()
|
{
|
/**
|
* {@inheritDoc}
|
*/
|
public void actionPerformed(ActionEvent ev)
|
{
|
list.clearSelection();
|
}
|
});
|
mainPanel.add(unselectAllButton, gbc);
|
|
list.addListSelectionListener(new ListSelectionListener()
|
{
|
/**
|
* {@inheritDoc}
|
*/
|
public void valueChanged(ListSelectionEvent ev)
|
{
|
checkOKButtonEnable();
|
}
|
});
|
|
gbc.gridy ++;
|
gbc.fill = GridBagConstraints.VERTICAL;
|
gbc.insets.top = 0;
|
gbc.weighty = 1.0;
|
mainPanel.add(Box.createVerticalGlue(), gbc);
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
public void toBeDisplayed(boolean visible)
|
{
|
if (visible)
|
{
|
list.clearSelection();
|
checkVisibility();
|
}
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
protected void checkOKButtonEnable()
|
{
|
setEnabledOK(!list.isSelectionEmpty() && mainPanel.isVisible());
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
public void configurationChanged(ConfigurationChangeEvent ev)
|
{
|
ServerDescriptor desc = ev.getNewDescriptor();
|
final SortedSet<DN> newElements = new TreeSet<DN>();
|
for (BackendDescriptor backend : desc.getBackends())
|
{
|
if (!backend.isConfigBackend())
|
{
|
for (BaseDNDescriptor baseDN : backend.getBaseDns())
|
{
|
newElements.add(baseDN.getDn());
|
}
|
}
|
}
|
updateList(newElements);
|
updateErrorPaneAndOKButtonIfAuthRequired(desc,
|
isLocal() ?
|
INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_BASE_DN_DELETE.get() :
|
INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(desc.getHostname()));
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
public void okClicked()
|
{
|
final LinkedHashSet<Message> errors = new LinkedHashSet<Message>();
|
ProgressDialog progressDialog = new ProgressDialog(
|
Utilities.createFrame(),
|
Utilities.getParentDialog(this), getTitle(), getInfo());
|
@SuppressWarnings("deprecation")
|
Object[] dns = list.getSelectedValues();
|
ArrayList<BaseDNDescriptor> baseDNsToDelete =
|
new ArrayList<BaseDNDescriptor>();
|
for (Object o : dns)
|
{
|
DN dn = (DN)o;
|
boolean found = false;
|
for (BackendDescriptor backend :
|
getInfo().getServerDescriptor().getBackends())
|
{
|
for (BaseDNDescriptor baseDN : backend.getBaseDns())
|
{
|
if (baseDN.getDn().equals(dn))
|
{
|
baseDNsToDelete.add(baseDN);
|
found = true;
|
break;
|
}
|
}
|
if (found)
|
{
|
break;
|
}
|
}
|
}
|
DeleteBaseDNAndBackendTask newTask = new DeleteBaseDNAndBackendTask(
|
getInfo(), progressDialog, new HashSet<BackendDescriptor>(),
|
baseDNsToDelete);
|
for (Task task : getInfo().getTasks())
|
{
|
task.canLaunch(newTask, errors);
|
}
|
if (errors.isEmpty())
|
{
|
Message confirmationMessage = getConfirmationMessage(baseDNsToDelete);
|
if (displayConfirmationDialog(
|
INFO_CTRL_PANEL_CONFIRMATION_REQUIRED_SUMMARY.get(),
|
confirmationMessage))
|
{
|
launchOperation(newTask,
|
INFO_CTRL_PANEL_DELETING_BASE_DNS_SUMMARY.get(),
|
INFO_CTRL_PANEL_DELETING_BASE_DNS_COMPLETE.get(),
|
INFO_CTRL_PANEL_DELETING_BASE_DNS_SUCCESSFUL.get(),
|
ERR_CTRL_PANEL_DELETING_BASE_DNS_ERROR_SUMMARY.get(),
|
ERR_CTRL_PANEL_DELETING_BASE_DNS_ERROR_DETAILS.get(),
|
null,
|
progressDialog);
|
progressDialog.setVisible(true);
|
Utilities.getParentDialog(this).setVisible(false);
|
}
|
}
|
if (errors.size() > 0)
|
{
|
displayErrorDialog(errors);
|
}
|
}
|
|
private Message getConfirmationMessage(
|
Collection<BaseDNDescriptor> baseDNsToDelete)
|
{
|
MessageBuilder mb = new MessageBuilder();
|
Map<String, Set<BaseDNDescriptor>> hmBackends =
|
new HashMap<String, Set<BaseDNDescriptor>>();
|
for (BaseDNDescriptor baseDN : baseDNsToDelete)
|
{
|
String backendID = baseDN.getBackend().getBackendID();
|
Set<BaseDNDescriptor> set = hmBackends.get(backendID);
|
if (set == null)
|
{
|
set = new HashSet<BaseDNDescriptor>();
|
hmBackends.put(backendID, set);
|
}
|
set.add(baseDN);
|
}
|
ArrayList<String> indirectBackendsToDelete = new ArrayList<String>();
|
for (Set<BaseDNDescriptor> set : hmBackends.values())
|
{
|
BackendDescriptor backend = set.iterator().next().getBackend();
|
if (set.size() == backend.getBaseDns().size())
|
{
|
// All of the suffixes must be deleted.
|
indirectBackendsToDelete.add(backend.getBackendID());
|
}
|
}
|
mb.append(INFO_CTRL_PANEL_CONFIRMATION_DELETE_BASE_DNS_DETAILS.get());
|
for (BaseDNDescriptor baseDN : baseDNsToDelete)
|
{
|
mb.append("<br> - "+baseDN.getDn());
|
}
|
if (indirectBackendsToDelete.size() > 0)
|
{
|
mb.append("<br><br>");
|
mb.append(
|
INFO_CTRL_PANEL_CONFIRMATION_DELETE_BASE_DNS_INDIRECT_DETAILS.get());
|
for (String backendID : indirectBackendsToDelete)
|
{
|
mb.append("<br> - "+backendID);
|
}
|
}
|
mb.append("<br><br>");
|
mb.append(INFO_CTRL_PANEL_DO_YOU_WANT_TO_CONTINUE.get());
|
return mb.toMessage();
|
}
|
}
|