/*
* 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.Container;
import java.awt.GridBagConstraints;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Comparator;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.swing.DefaultListModel;
import javax.swing.JLabel;
import javax.swing.JList;
import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
import org.opends.guitools.controlpanel.ui.components.TitlePanel;
import org.opends.guitools.controlpanel.util.LowerCaseComparator;
import org.opends.guitools.controlpanel.util.Utilities;
import org.opends.messages.Message;
import org.opends.messages.MessageBuilder;
import org.opends.server.api.MatchingRule;
import org.opends.server.types.AttributeType;
import org.opends.server.types.ObjectClass;
import org.opends.server.types.Schema;
/**
* The panel that displays a standard attribute definition.
*
*/
public class StandardAttributePanel extends SchemaElementPanel
{
private static final long serialVersionUID = -7922968631524763675L;
private TitlePanel titlePanel = new TitlePanel(Message.EMPTY,
Message.EMPTY);
private JLabel name = Utilities.createDefaultLabel();
private JLabel parent = Utilities.createDefaultLabel();
private JLabel oid = Utilities.createDefaultLabel();
private JLabel aliases = Utilities.createDefaultLabel();
private JLabel origin = Utilities.createDefaultLabel();
private JLabel description = Utilities.createDefaultLabel();
private JLabel usage = Utilities.createDefaultLabel();
private JLabel syntax = Utilities.createDefaultLabel();
private JLabel approximate = Utilities.createDefaultLabel();
private JLabel equality = Utilities.createDefaultLabel();
private JLabel ordering = Utilities.createDefaultLabel();
private JLabel substring = Utilities.createDefaultLabel();
private JLabel type = Utilities.createDefaultLabel();
private JList requiredBy = new JList(new DefaultListModel());
private JList optionalBy = new JList(new DefaultListModel());
/**
* Default constructor of the panel.
*
*/
public StandardAttributePanel()
{
super();
createLayout();
}
/**
* {@inheritDoc}
*/
public Message getTitle()
{
return INFO_CTRL_PANEL_STANDARD_ATTRIBUTE_TITLE.get();
}
/**
* {@inheritDoc}
*/
public Component getPreferredFocusComponent()
{
return requiredBy;
}
/**
* {@inheritDoc}
*/
public void configurationChanged(ConfigurationChangeEvent ev)
{
}
/**
* {@inheritDoc}
*/
public void okClicked()
{
}
/**
* Creates the layout of the panel (but the contents are not populated here).
*/
protected void createLayout()
{
createBasicLayout(this, new GridBagConstraints());
setBorder(PANEL_BORDER);
}
/**
* Creates the basic layout of the panel.
* @param c the container where all the components will be layed out.
* @param gbc the grid bag constraints.
*/
protected void createBasicLayout(Container c, GridBagConstraints gbc)
{
requiredBy.setVisibleRowCount(5);
optionalBy.setVisibleRowCount(9);
gbc.gridy = 0;
gbc.gridwidth = 2;
addErrorPane(c, gbc);
gbc.gridy ++;
gbc.anchor = GridBagConstraints.WEST;
titlePanel.setTitle(INFO_CTRL_PANEL_ATTRIBUTE_DETAILS.get());
gbc.fill = GridBagConstraints.NONE;
gbc.insets.top = 5;
gbc.insets.bottom = 7;
c.add(titlePanel, gbc);
gbc.insets.bottom = 0;
gbc.insets.top = 8;
gbc.gridy ++;
gbc.gridwidth = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
Message[] labels = {
INFO_CTRL_PANEL_ATTRIBUTE_NAME_LABEL.get(),
INFO_CTRL_PANEL_ATTRIBUTE_PARENT_LABEL.get(),
INFO_CTRL_PANEL_ATTRIBUTE_OID_LABEL.get(),
INFO_CTRL_PANEL_ATTRIBUTE_ALIASES_LABEL.get(),
INFO_CTRL_PANEL_ATTRIBUTE_ORIGIN_LABEL.get(),
INFO_CTRL_PANEL_ATTRIBUTE_DESCRIPTION_LABEL.get(),
INFO_CTRL_PANEL_ATTRIBUTE_USAGE_LABEL.get(),
INFO_CTRL_PANEL_ATTRIBUTE_SYNTAX_LABEL.get(),
INFO_CTRL_PANEL_ATTRIBUTE_TYPE_LABEL.get(),
INFO_CTRL_PANEL_ATTRIBUTE_APPROXIMATE_MATCHING_RULE_LABEL.get(),
INFO_CTRL_PANEL_ATTRIBUTE_EQUALITY_MATCHING_RULE_LABEL.get(),
INFO_CTRL_PANEL_ATTRIBUTE_ORDERING_MATCHING_RULE_LABEL.get(),
INFO_CTRL_PANEL_ATTRIBUTE_SUBSTRING_MATCHING_RULE_LABEL.get()
};
JLabel[] values = {name, parent, oid, aliases, origin, description, usage,
syntax, type, approximate, equality, ordering, substring};
for (int i=0; i < labels.length; i++)
{
gbc.insets.left = 0;
gbc.gridx = 0;
JLabel l = Utilities.createPrimaryLabel(labels[i]);
c.add(l, gbc);
gbc.insets.left = 10;
gbc.gridx = 1;
c.add(values[i], gbc);
gbc.gridy ++;
}
labels = new Message[] {
INFO_CTRL_PANEL_REQUIRED_BY_LABEL.get(),
INFO_CTRL_PANEL_ALLOWED_BY_LABEL.get()
};
JList[] lists = {requiredBy, optionalBy};
gbc.anchor = GridBagConstraints.NORTHWEST;
for (int i=0; i<2; i++)
{
gbc.insets.left = 0;
gbc.gridx = 0;
JLabel l = Utilities.createPrimaryLabel(labels[i]);
gbc.weightx = 0.0;
gbc.fill = GridBagConstraints.HORIZONTAL;
c.add(l, gbc);
gbc.insets.left = 10;
gbc.gridx = 1;
if (i == 0)
{
gbc.weighty = 0.35;
}
else
{
gbc.weighty = 0.65;
}
gbc.weightx = 1.0;
gbc.fill = GridBagConstraints.BOTH;
gbc.insets.top = 10;
c.add(Utilities.createScrollPane(lists[i]), gbc);
gbc.gridy ++;
final JList list = lists[i];
MouseAdapter clickListener = new MouseAdapter()
{
/**
* {@inheritDoc}
*/
public void mouseClicked(MouseEvent ev)
{
if (ev.getClickCount() == 1)
{
objectClassSelected(list);
}
}
};
list.addMouseListener(clickListener);
KeyAdapter keyListener = new KeyAdapter()
{
/**
* {@inheritDoc}
*/
public void keyTyped(KeyEvent ev)
{
if ((ev.getKeyChar() == KeyEvent.VK_SPACE) ||
(ev.getKeyChar() == KeyEvent.VK_ENTER))
{
objectClassSelected(list);
}
}
};
list.addKeyListener(keyListener);
}
}
/**
* Updates the contents of the panel with the provided attribute.
* @param attr the attribute.
* @param schema the schema.
*/
public void update(AttributeType attr, Schema schema)
{
String n = attr.getPrimaryName();
if (n == null)
{
n = NOT_APPLICABLE.toString();
}
titlePanel.setDetails(Message.raw(n));
name.setText(n);
AttributeType superior = attr.getSuperiorType();
if (superior == null)
{
n = null;
}
else
{
n = superior.getPrimaryName();
}
if (n == null)
{
n = NOT_APPLICABLE.toString();
}
parent.setText(n);
oid.setText(attr.getOID());
origin.setText(StandardObjectClassPanel.getOrigin(attr).toString());
n = attr.getDescription();
if (n == null)
{
n = NOT_APPLICABLE.toString();
}
description.setText(n);
if (attr.getUsage() == null)
{
n = NOT_APPLICABLE.toString();
}
else
{
n = attr.getUsage().toString();
}
usage.setText(n);
Set<String> aliases = getAliases(attr);
if (!aliases.isEmpty())
{
n = Utilities.getStringFromCollection(aliases, ", ");
}
else
{
n = NOT_APPLICABLE.toString();
}
this.aliases.setText(n);
syntax.setText(Utilities.getSyntaxText(attr.getSyntax()));
JLabel[] labels = {approximate, equality, ordering, substring};
MatchingRule[] rules = {attr.getApproximateMatchingRule(),
attr.getEqualityMatchingRule(), attr.getOrderingMatchingRule(),
attr.getSubstringMatchingRule()
};
for (int i=0; i<labels.length; i++)
{
if (rules[i] != null)
{
labels[i].setText(Utilities.getMatchingRuleText(rules[i]));
}
else
{
labels[i].setText(NOT_APPLICABLE.toString());
}
}
type.setText(getTypeValue(attr).toString());
Comparator<String> lowerCaseComparator = new LowerCaseComparator();
SortedSet<String> requiredByOcs = new TreeSet<String>(lowerCaseComparator);
for (ObjectClass oc : schema.getObjectClasses().values())
{
if (oc.getRequiredAttributeChain().contains(attr))
{
requiredByOcs.add(oc.getNameOrOID());
}
}
DefaultListModel model = (DefaultListModel)requiredBy.getModel();
model.clear();
for (String oc : requiredByOcs)
{
model.addElement(oc);
}
SortedSet<String> optionalByOcs = new TreeSet<String>(lowerCaseComparator);
for (ObjectClass oc : schema.getObjectClasses().values())
{
if (oc.getOptionalAttributeChain().contains(attr))
{
optionalByOcs.add(oc.getNameOrOID());
}
}
model = (DefaultListModel)optionalBy.getModel();
model.clear();
for (String oc : optionalByOcs)
{
model.addElement(oc);
}
}
/**
* Returns the message describing the attribute type (operational, single
* valued, etc.).
* @param attr the attribute.
* @return the message describing the attribute type (operational, single
* valued, etc.).
*/
static Message getTypeValue(AttributeType attr)
{
MessageBuilder mb = new MessageBuilder();
Boolean[] props = {attr.isOperational(), attr.isSingleValue(),
attr.isNoUserModification(), attr.isCollective(),
attr.isObsolete()};
Message[][] values = {
{INFO_CTRL_PANEL_ATTRIBUTE_OPERATIONAL_LABEL.get(), null},
{INFO_CTRL_PANEL_ATTRIBUTE_SINGLE_VALUED_LABEL.get(),
INFO_CTRL_PANEL_ATTRIBUTE_MULTI_VALUED_LABEL.get()},
{INFO_CTRL_PANEL_ATTRIBUTE_NON_MODIFIABLE_LABEL.get(), null},
{INFO_CTRL_PANEL_ATTRIBUTE_COLLECTIVE_LABEL.get(), null},
{INFO_CTRL_PANEL_ATTRIBUTE_OBSOLETE_LABEL.get(), null}};
int i = 0;
for (Boolean prop : props)
{
Message value = prop ? values[i][0] : values[i][1];
if (value != null)
{
if (mb.length() > 0)
{
mb.append(", ");
}
mb.append(value);
}
i++;
}
return mb.toMessage();
}
}