/*
|
* 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 2014 ForgeRock AS
|
*/
|
package org.opends.guitools.controlpanel.ui;
|
|
import java.awt.Component;
|
import java.awt.GridBagConstraints;
|
import java.awt.GridBagLayout;
|
import java.awt.event.ItemEvent;
|
import java.awt.event.ItemListener;
|
import java.io.File;
|
import java.util.*;
|
|
import javax.swing.*;
|
import javax.swing.event.ChangeEvent;
|
import javax.swing.event.ChangeListener;
|
|
import org.forgerock.i18n.LocalizableMessage;
|
import org.forgerock.i18n.LocalizableMessageBuilder;
|
import org.forgerock.opendj.ldap.schema.AttributeUsage;
|
import org.opends.guitools.controlpanel.datamodel.ServerDescriptor;
|
import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
|
import org.opends.guitools.controlpanel.event.ConfigurationElementCreatedListener;
|
import org.opends.guitools.controlpanel.task.NewSchemaElementsTask;
|
import org.opends.guitools.controlpanel.task.Task;
|
import org.opends.guitools.controlpanel.ui.components.BasicExpander;
|
import org.opends.guitools.controlpanel.ui.renderer.SchemaElementComboBoxCellRenderer;
|
import org.opends.guitools.controlpanel.util.LowerCaseComparator;
|
import org.opends.guitools.controlpanel.util.Utilities;
|
import org.opends.server.api.*;
|
import org.opends.server.config.ConfigConstants;
|
import org.opends.server.types.AttributeType;
|
import org.opends.server.types.ObjectClass;
|
import org.opends.server.types.Schema;
|
import org.opends.server.util.ServerConstants;
|
import org.opends.server.util.StaticUtils;
|
|
import static org.opends.messages.AdminToolMessages.*;
|
|
/**
|
* The panel displayed when the user wants to define a new attribute in the
|
* schema.
|
*/
|
public class NewAttributePanel extends StatusGenericPanel
|
{
|
private static final long serialVersionUID = 2340170241535771321L;
|
private JLabel lName = Utilities.createPrimaryLabel(
|
INFO_CTRL_PANEL_ATTRIBUTE_NAME_LABEL.get());
|
private JLabel lParent = Utilities.createPrimaryLabel(
|
INFO_CTRL_PANEL_ATTRIBUTE_PARENT_LABEL.get());
|
private JLabel lOID = Utilities.createPrimaryLabel(
|
INFO_CTRL_PANEL_ATTRIBUTE_OID_LABEL.get());
|
private JLabel lAliases = Utilities.createPrimaryLabel(
|
INFO_CTRL_PANEL_ATTRIBUTE_ALIASES_LABEL.get());
|
private JLabel lOrigin = Utilities.createPrimaryLabel(
|
INFO_CTRL_PANEL_ATTRIBUTE_ORIGIN_LABEL.get());
|
private JLabel lFile = Utilities.createPrimaryLabel(
|
INFO_CTRL_PANEL_ATTRIBUTE_FILE_LABEL.get());
|
private JLabel lDescription = Utilities.createPrimaryLabel(
|
INFO_CTRL_PANEL_ATTRIBUTE_DESCRIPTION_LABEL.get());
|
private JLabel lUsage = Utilities.createPrimaryLabel(
|
INFO_CTRL_PANEL_ATTRIBUTE_USAGE_LABEL.get());
|
private JLabel lSyntax = Utilities.createPrimaryLabel(
|
INFO_CTRL_PANEL_ATTRIBUTE_SYNTAX_LABEL.get());
|
private JLabel lApproximate = Utilities.createPrimaryLabel(
|
INFO_CTRL_PANEL_ATTRIBUTE_APPROXIMATE_MATCHING_RULE_LABEL.get());
|
private JLabel lEquality = Utilities.createPrimaryLabel(
|
INFO_CTRL_PANEL_ATTRIBUTE_EQUALITY_MATCHING_RULE_LABEL.get());
|
private JLabel lOrdering = Utilities.createPrimaryLabel(
|
INFO_CTRL_PANEL_ATTRIBUTE_ORDERING_MATCHING_RULE_LABEL.get());
|
private JLabel lSubstring = Utilities.createPrimaryLabel(
|
INFO_CTRL_PANEL_ATTRIBUTE_SUBSTRING_MATCHING_RULE_LABEL.get());
|
private JLabel lType = Utilities.createPrimaryLabel();
|
|
private JLabel[] labels = {lName, lParent, lOID, lAliases, lOrigin, lFile,
|
lDescription, lUsage, lSyntax, lApproximate,
|
lEquality, lOrdering, lSubstring, lType
|
};
|
|
private JTextField name = Utilities.createMediumTextField();
|
private JComboBox parent = Utilities.createComboBox();
|
private JTextField oid = Utilities.createMediumTextField();
|
private JTextField aliases = Utilities.createLongTextField();
|
private JTextField description = Utilities.createLongTextField();
|
private JTextField origin = Utilities.createLongTextField();
|
private JTextField file = Utilities.createLongTextField();
|
private JComboBox usage = Utilities.createComboBox();
|
private JComboBox syntax = Utilities.createComboBox();
|
private JComboBox approximate = Utilities.createComboBox();
|
private JComboBox equality = Utilities.createComboBox();
|
private JComboBox ordering = Utilities.createComboBox();
|
private JComboBox substring = Utilities.createComboBox();
|
private JCheckBox nonModifiable = Utilities.createCheckBox(
|
INFO_CTRL_PANEL_ATTRIBUTE_NON_MODIFIABLE_LABEL.get());
|
private JCheckBox singleValued = Utilities.createCheckBox(
|
INFO_CTRL_PANEL_ATTRIBUTE_SINGLE_VALUED_LABEL.get());
|
private JCheckBox collective = Utilities.createCheckBox(
|
INFO_CTRL_PANEL_ATTRIBUTE_COLLECTIVE_LABEL.get());
|
private JCheckBox obsolete = Utilities.createCheckBox(
|
INFO_CTRL_PANEL_ATTRIBUTE_OBSOLETE_LABEL.get());
|
|
private Schema schema;
|
|
private Component relativeComponent;
|
|
private LocalizableMessage NO_PARENT = INFO_CTRL_PANEL_NO_PARENT_FOR_ATTRIBUTE.get();
|
private LocalizableMessage NO_MATCHING_RULE =
|
INFO_CTRL_PANEL_NO_MATCHING_RULE_FOR_ATTRIBUTE.get();
|
|
/**
|
* Constructor of the new attribute panel.
|
* @param relativeComponent the component relative to which the dialog
|
* containing this panel must be centered.
|
*/
|
public NewAttributePanel(Component relativeComponent)
|
{
|
super();
|
this.relativeComponent = relativeComponent;
|
createLayout();
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
@Override
|
public LocalizableMessage getTitle()
|
{
|
return INFO_CTRL_PANEL_NEW_ATTRIBUTE_PANEL_TITLE.get();
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
@Override
|
public Component getPreferredFocusComponent()
|
{
|
return name;
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
@Override
|
public void configurationChanged(ConfigurationChangeEvent ev)
|
{
|
ArrayList<AttributeSyntax<?>> newSyntaxes =
|
new ArrayList<AttributeSyntax<?>>();
|
|
final ServerDescriptor desc = ev.getNewDescriptor();
|
Schema s = desc.getSchema();
|
|
final boolean firstSchema = schema == null;
|
final boolean[] repack = {firstSchema};
|
final boolean[] error = {false};
|
|
boolean schemaChanged;
|
if (schema != null && s != null)
|
{
|
schemaChanged = !ServerDescriptor.areSchemasEqual(s, schema);
|
}
|
else if (schema == null && s != null)
|
{
|
schemaChanged = true;
|
}
|
else if (s == null && schema != null)
|
{
|
schemaChanged = false;
|
}
|
else
|
{
|
schemaChanged = false;
|
}
|
if (schemaChanged)
|
{
|
schema = s;
|
|
HashMap<String, AttributeSyntax<?>> syntaxNameMap = new HashMap<String,
|
AttributeSyntax<?>>();
|
for (String key : schema.getSyntaxes().keySet())
|
{
|
AttributeSyntax<?> syntax = schema.getSyntax(key);
|
String name = syntax.getName();
|
if (name == null)
|
{
|
name = syntax.getOID();
|
}
|
syntaxNameMap.put(name, syntax);
|
}
|
|
SortedSet<String> orderedKeys =
|
new TreeSet<String>(new LowerCaseComparator());
|
orderedKeys.addAll(syntaxNameMap.keySet());
|
for (String key : orderedKeys)
|
{
|
newSyntaxes.add(syntaxNameMap.get(key));
|
}
|
updateComboBoxModel(newSyntaxes,
|
((DefaultComboBoxModel)syntax.getModel()));
|
|
HashMap<String, AttributeType> attributeNameMap = new HashMap<String,
|
AttributeType>();
|
for (String key : schema.getAttributeTypes().keySet())
|
{
|
AttributeType attr = schema.getAttributeType(key);
|
attributeNameMap.put(attr.getNameOrOID(), attr);
|
}
|
orderedKeys.clear();
|
orderedKeys.addAll(attributeNameMap.keySet());
|
ArrayList<Object> newParents = new ArrayList<Object>();
|
for (String key : orderedKeys)
|
{
|
newParents.add(attributeNameMap.get(key));
|
}
|
newParents.add(0, NO_PARENT);
|
updateComboBoxModel(newParents,
|
((DefaultComboBoxModel)parent.getModel()));
|
|
ArrayList<MatchingRule> approximateElements =
|
new ArrayList<MatchingRule>();
|
ArrayList<MatchingRule> equalityElements = new ArrayList<MatchingRule>();
|
ArrayList<MatchingRule> orderingElements = new ArrayList<MatchingRule>();
|
ArrayList<MatchingRule> substringElements = new ArrayList<MatchingRule>();
|
|
HashMap<String, MatchingRule> matchingRuleNameMap = new HashMap<String,
|
MatchingRule>();
|
for (String key : schema.getMatchingRules().keySet())
|
{
|
MatchingRule rule = schema.getMatchingRule(key);
|
matchingRuleNameMap.put(rule.getNameOrOID(), rule);
|
}
|
|
orderedKeys.clear();
|
orderedKeys.addAll(matchingRuleNameMap.keySet());
|
for (String key : orderedKeys)
|
{
|
MatchingRule matchingRule = matchingRuleNameMap.get(key);
|
if (Utilities.isApproximateMatchingRule(matchingRule))
|
{
|
approximateElements.add(matchingRule);
|
}
|
else if (Utilities.isEqualityMatchingRule(matchingRule))
|
{
|
equalityElements.add(matchingRule);
|
}
|
else if (Utilities.isOrderingMatchingRule(matchingRule))
|
{
|
orderingElements.add(matchingRule);
|
}
|
else if (Utilities.isSubstringMatchingRule(matchingRule))
|
{
|
substringElements.add(matchingRule);
|
}
|
}
|
JComboBox[] combos = {approximate, equality, ordering, substring};
|
ArrayList<ArrayList<MatchingRule>> ruleNames =
|
new ArrayList<ArrayList<MatchingRule>>();
|
ruleNames.add(approximateElements);
|
ruleNames.add(equalityElements);
|
ruleNames.add(orderingElements);
|
ruleNames.add(substringElements);
|
for (int i=0; i<combos.length; i++)
|
{
|
DefaultComboBoxModel model = (DefaultComboBoxModel)combos[i].getModel();
|
ArrayList<Object> el = new ArrayList<Object>();
|
el.addAll(ruleNames.get(i));
|
if (model.getSize() == 0)
|
{
|
el.add(0, NO_MATCHING_RULE);
|
}
|
else
|
{
|
el.add(0, model.getElementAt(0));
|
}
|
updateComboBoxModel(el, model);
|
}
|
}
|
else if (schema == null)
|
{
|
updateErrorPane(errorPane,
|
ERR_CTRL_PANEL_SCHEMA_NOT_FOUND_SUMMARY.get(),
|
ColorAndFontConstants.errorTitleFont,
|
ERR_CTRL_PANEL_SCHEMA_NOT_FOUND_DETAILS.get(),
|
ColorAndFontConstants.defaultFont);
|
repack[0] = true;
|
error[0] = true;
|
}
|
SwingUtilities.invokeLater(new Runnable()
|
{
|
/**
|
* {@inheritDoc}
|
*/
|
@Override
|
public void run()
|
{
|
setEnabledOK(!error[0]);
|
errorPane.setVisible(error[0]);
|
if (firstSchema)
|
{
|
for (int i=0; i<syntax.getModel().getSize(); i++)
|
{
|
AttributeSyntax<?> syn =
|
(AttributeSyntax<?>)syntax.getModel().getElementAt(i);
|
if ("DirectoryString".equals(syn.getName()))
|
{
|
syntax.setSelectedIndex(i);
|
break;
|
}
|
}
|
}
|
else
|
{
|
updateDefaultMatchingRuleNames();
|
}
|
|
if (repack[0])
|
{
|
packParentDialog();
|
if (relativeComponent != null)
|
{
|
Utilities.centerGoldenMean(
|
Utilities.getParentDialog(NewAttributePanel.this),
|
relativeComponent);
|
}
|
}
|
}
|
});
|
if (!error[0])
|
{
|
updateErrorPaneAndOKButtonIfAuthRequired(desc,
|
isLocal() ?
|
INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_TO_CREATE_ATTRIBUTE_SUMMARY.get() :
|
INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(desc.getHostname()));
|
}
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
@Override
|
public void okClicked()
|
{
|
ArrayList<LocalizableMessage> errors = new ArrayList<LocalizableMessage>();
|
for (JLabel label : labels)
|
{
|
setPrimaryValid(label);
|
}
|
String n = getAttributeName();
|
LocalizableMessageBuilder err = new LocalizableMessageBuilder();
|
if (n.length() == 0)
|
{
|
errors.add(ERR_CTRL_PANEL_ATTRIBUTE_NAME_REQUIRED.get());
|
setPrimaryInvalid(lName);
|
}
|
else if (!StaticUtils.isValidSchemaElement(n, 0, n.length(), err))
|
{
|
errors.add(ERR_CTRL_PANEL_INVALID_ATTRIBUTE_NAME.get(err));
|
setPrimaryInvalid(lName);
|
err = new LocalizableMessageBuilder();
|
}
|
else
|
{
|
LocalizableMessage elementType = getSchemaElementType(n, schema);
|
if (elementType != null)
|
{
|
errors.add(ERR_CTRL_PANEL_ATTRIBUTE_NAME_ALREADY_IN_USE.get(n, elementType));
|
setPrimaryInvalid(lName);
|
}
|
}
|
|
n = oid.getText().trim();
|
if (n.length() > 0)
|
{
|
if (!StaticUtils.isValidSchemaElement(n, 0, n.length(), err))
|
{
|
errors.add(ERR_CTRL_PANEL_OID_NOT_VALID.get(err));
|
setPrimaryInvalid(lOID);
|
err = new LocalizableMessageBuilder();
|
}
|
else
|
{
|
LocalizableMessage elementType = getSchemaElementType(n, schema);
|
if (elementType != null)
|
{
|
errors.add(ERR_CTRL_PANEL_OID_ALREADY_IN_USE.get(n, elementType));
|
setPrimaryInvalid(lOID);
|
}
|
}
|
}
|
|
if (aliases.getText().trim().length() > 0)
|
{
|
String[] al = aliases.getText().split(",");
|
if (al.length > 0)
|
{
|
for (String alias : al)
|
{
|
if (alias.trim().length() == 0)
|
{
|
errors.add(ERR_CTRL_PANEL_EMPTY_ALIAS.get());
|
setPrimaryInvalid(lAliases);
|
}
|
else
|
{
|
LocalizableMessage elementType = getSchemaElementType(alias, schema);
|
if (elementType != null)
|
{
|
errors.add(ERR_CTRL_PANEL_ALIAS_ALREADY_IN_USE.get(n, elementType));
|
setPrimaryInvalid(lAliases);
|
}
|
}
|
}
|
}
|
}
|
|
setPrimaryValid(lUsage);
|
if (nonModifiable.isSelected())
|
{
|
if (AttributeUsage.USER_APPLICATIONS.equals(usage.getSelectedItem()))
|
{
|
errors.add(ERR_NON_MODIFIABLE_CANNOT_BE_USER_APPLICATIONS.get());
|
setPrimaryInvalid(lUsage);
|
}
|
}
|
|
ProgressDialog dlg = new ProgressDialog(
|
Utilities.createFrame(),
|
Utilities.getParentDialog(this),
|
INFO_CTRL_PANEL_NEW_ATTRIBUTE_PANEL_TITLE.get(), getInfo());
|
NewSchemaElementsTask newTask = null;
|
if (errors.size() == 0)
|
{
|
LinkedHashSet<AttributeType> attributes =
|
new LinkedHashSet<AttributeType>();
|
attributes.add(getAttribute());
|
LinkedHashSet<ObjectClass> ocs = new LinkedHashSet<ObjectClass>(0);
|
newTask = new NewSchemaElementsTask(getInfo(), dlg, ocs, attributes);
|
for (Task task : getInfo().getTasks())
|
{
|
task.canLaunch(newTask, errors);
|
}
|
for (ConfigurationElementCreatedListener listener :
|
getConfigurationElementCreatedListeners())
|
{
|
newTask.addConfigurationElementCreatedListener(listener);
|
}
|
}
|
if (errors.size() == 0)
|
{
|
String attrName = getAttributeName();
|
launchOperation(newTask,
|
INFO_CTRL_PANEL_CREATING_ATTRIBUTE_SUMMARY.get(attrName),
|
INFO_CTRL_PANEL_CREATING_ATTRIBUTE_COMPLETE.get(),
|
INFO_CTRL_PANEL_CREATING_ATTRIBUTE_SUCCESSFUL.get(attrName),
|
ERR_CTRL_PANEL_CREATING_ATTRIBUTE_ERROR_SUMMARY.get(),
|
ERR_CTRL_PANEL_CREATING_ATTRIBUTE_ERROR_DETAILS.get(attrName),
|
null,
|
dlg);
|
dlg.setVisible(true);
|
name.setText("");
|
oid.setText("");
|
description.setText("");
|
aliases.setText("");
|
name.grabFocus();
|
Utilities.getParentDialog(this).setVisible(false);
|
}
|
else
|
{
|
displayErrorDialog(errors);
|
}
|
}
|
|
/**
|
* Returns the message representing the schema element type.
|
* @param name the name of the schema element.
|
* @param schema the schema.
|
* @return the message representing the schema element type.
|
*/
|
static LocalizableMessage getSchemaElementType(String name, Schema schema)
|
{
|
if (schema.getAttributeType(name.toLowerCase()) != null)
|
{
|
return INFO_CTRL_PANEL_TYPE_ATTRIBUTE.get();
|
}
|
else if (schema.getObjectClass(name.toLowerCase()) != null)
|
{
|
return INFO_CTRL_PANEL_TYPE_OBJECT_CLASS.get();
|
}
|
else if (schema.getSyntax(name.toLowerCase()) != null)
|
{
|
return INFO_CTRL_PANEL_TYPE_ATTRIBUTE_SYNTAX.get();
|
}
|
else if (schema.getMatchingRule(name.toLowerCase()) != null)
|
{
|
return INFO_CTRL_PANEL_TYPE_MATCHING_RULE.get();
|
}
|
|
for (AttributeSyntax<?> attr : schema.getSyntaxes().values())
|
{
|
String n = attr.getName();
|
if (n != null)
|
{
|
if (n.equalsIgnoreCase(name))
|
{
|
return INFO_CTRL_PANEL_TYPE_ATTRIBUTE_SYNTAX.get();
|
}
|
}
|
}
|
|
for (MatchingRule rule : schema.getMatchingRules().values())
|
{
|
String n = rule.getNameOrOID();
|
if (n != null && n.equalsIgnoreCase(name))
|
{
|
return INFO_CTRL_PANEL_TYPE_MATCHING_RULE.get();
|
}
|
}
|
|
return null;
|
}
|
|
|
/**
|
* Creates the layout of the panel (but the contents are not populated here).
|
*/
|
private void createLayout()
|
{
|
GridBagConstraints gbc = new GridBagConstraints();
|
Utilities.setRequiredIcon(lName);
|
|
gbc.gridwidth = 2;
|
gbc.gridy = 0;
|
addErrorPane(gbc);
|
|
gbc.gridy ++;
|
gbc.gridwidth = 1;
|
gbc.weighty = 0.0;
|
gbc.gridx = 1;
|
gbc.anchor = GridBagConstraints.EAST;
|
gbc.fill = GridBagConstraints.NONE;
|
JLabel requiredLabel = createRequiredLabel();
|
gbc.insets.bottom = 10;
|
add(requiredLabel, gbc);
|
|
gbc.gridy ++;
|
gbc.fill = GridBagConstraints.HORIZONTAL;
|
gbc.anchor = GridBagConstraints.WEST;
|
gbc.insets.bottom = 0;
|
|
JComboBox[] comboBoxes = {parent, syntax, approximate,
|
equality, ordering, substring};
|
LocalizableMessage[] defaultValues = {NO_PARENT, LocalizableMessage.EMPTY, NO_MATCHING_RULE,
|
NO_MATCHING_RULE, NO_MATCHING_RULE, NO_MATCHING_RULE
|
};
|
SchemaElementComboBoxCellRenderer renderer = new
|
SchemaElementComboBoxCellRenderer(syntax);
|
for (int i=0; i<comboBoxes.length; i++)
|
{
|
DefaultComboBoxModel model = new DefaultComboBoxModel(
|
new Object[]{defaultValues[i]});
|
comboBoxes[i].setModel(model);
|
comboBoxes[i].setRenderer(renderer);
|
}
|
|
DefaultComboBoxModel model = new DefaultComboBoxModel();
|
for (AttributeUsage us : AttributeUsage.values())
|
{
|
model.addElement(us);
|
}
|
usage.setModel(model);
|
usage.setSelectedItem(AttributeUsage.USER_APPLICATIONS);
|
usage.setRenderer(renderer);
|
|
Component[] basicComps = {name, oid, description,
|
syntax};
|
JLabel[] basicLabels = {lName, lOID, lDescription, lSyntax};
|
JLabel[] basicInlineHelp = new JLabel[] {null, null, null,
|
Utilities.createInlineHelpLabel(
|
INFO_CTRL_PANEL_SYNTAX_INLINE_HELP.get())};
|
add(basicLabels, basicComps, basicInlineHelp, this, gbc);
|
|
BasicExpander[] expanders = new BasicExpander[] {
|
new BasicExpander(INFO_CTRL_PANEL_EXTRA_OPTIONS_EXPANDER.get()),
|
new BasicExpander(
|
INFO_CTRL_PANEL_ATTRIBUTE_TYPE_OPTIONS_EXPANDER.get()),
|
new BasicExpander(INFO_CTRL_PANEL_MATCHING_RULE_OPTIONS_EXPANDER.get())
|
};
|
|
Component[][] comps = {{parent, aliases, origin, file},
|
{usage, singleValued, nonModifiable, collective, obsolete},
|
{approximate, equality, ordering, substring}};
|
JLabel[][] labels = {{lParent, lAliases, lOrigin, lFile},
|
{lUsage, lType, null, null, null},
|
{lApproximate, lEquality, lOrdering, lSubstring}};
|
JLabel[][] inlineHelps = {{null,
|
Utilities.createInlineHelpLabel(
|
INFO_CTRL_PANEL_SEPARATED_WITH_COMMAS_HELP.get()), null,
|
Utilities.createInlineHelpLabel(
|
INFO_CTRL_PANEL_SCHEMA_FILE_ATTRIBUTE_HELP.get(File.separator))},
|
{null, null, null, null, null, null},
|
{Utilities.createInlineHelpLabel(
|
INFO_CTRL_PANEL_MATCHING_RULE_APPROXIMATE_HELP.get()),
|
Utilities.createInlineHelpLabel(
|
INFO_CTRL_PANEL_MATCHING_RULE_EQUALITY_HELP.get()),
|
Utilities.createInlineHelpLabel(
|
INFO_CTRL_PANEL_MATCHING_RULE_ORDERING_HELP.get()),
|
Utilities.createInlineHelpLabel(
|
INFO_CTRL_PANEL_MATCHING_RULE_SUBSTRING_HELP.get())
|
}
|
};
|
for (int i=0; i<expanders.length; i++)
|
{
|
gbc.gridwidth = 2;
|
gbc.gridx = 0;
|
gbc.insets.left = 0;
|
add(expanders[i], gbc);
|
final JPanel p = new JPanel(new GridBagLayout());
|
gbc.insets.left = 15;
|
gbc.gridy ++;
|
add(p, gbc);
|
gbc.gridy ++;
|
p.setOpaque(false);
|
|
GridBagConstraints gbc1 = new GridBagConstraints();
|
gbc1.fill = GridBagConstraints.HORIZONTAL;
|
gbc1.gridy = 0;
|
|
add(labels[i], comps[i], inlineHelps[i], p, gbc1);
|
final BasicExpander expander = expanders[i];
|
ChangeListener changeListener = new ChangeListener()
|
{
|
/**
|
* {@inheritDoc}
|
*/
|
@Override
|
public void stateChanged(ChangeEvent e)
|
{
|
p.setVisible(expander.isSelected());
|
}
|
};
|
expander.addChangeListener(changeListener);
|
expander.setSelected(false);
|
changeListener.stateChanged(null);
|
}
|
addBottomGlue(gbc);
|
|
ItemListener itemListener = new ItemListener()
|
{
|
/**
|
* {@inheritDoc}
|
*/
|
@Override
|
public void itemStateChanged(ItemEvent ev)
|
{
|
if (ev.getStateChange() == ItemEvent.SELECTED)
|
{
|
updateDefaultMatchingRuleNames();
|
approximate.setSelectedIndex(0);
|
substring.setSelectedIndex(0);
|
equality.setSelectedIndex(0);
|
ordering.setSelectedIndex(0);
|
}
|
}
|
};
|
syntax.addItemListener(itemListener);
|
|
file.setText(ConfigConstants.FILE_USER_SCHEMA_ELEMENTS);
|
}
|
|
|
private void updateDefaultMatchingRuleNames()
|
{
|
AttributeSyntax<?> syn = (AttributeSyntax<?>)syntax.getSelectedItem();
|
if (syn != null)
|
{
|
MatchingRule[] rules = {syn.getApproximateMatchingRule(),
|
syn.getSubstringMatchingRule(),
|
syn.getEqualityMatchingRule(),
|
syn.getOrderingMatchingRule()};
|
JComboBox[] combos = {approximate, substring, equality, ordering};
|
for (int i=0; i<rules.length; i++)
|
{
|
DefaultComboBoxModel model = (DefaultComboBoxModel)combos[i].getModel();
|
int index = combos[i].getSelectedIndex();
|
if (rules[i] != null)
|
{
|
if (model.getSize() > 0)
|
{
|
model.removeElementAt(0);
|
}
|
model.insertElementAt(INFO_CTRL_PANEL_DEFAULT_DEFINED_IN_SYNTAX.get(
|
rules[i].getNameOrOID()), 0);
|
}
|
else
|
{
|
if (model.getSize() > 0)
|
{
|
model.removeElementAt(0);
|
}
|
model.insertElementAt(NO_MATCHING_RULE, 0);
|
}
|
combos[i].setSelectedIndex(index);
|
}
|
}
|
}
|
|
private String getAttributeName()
|
{
|
return name.getText().trim();
|
}
|
|
private String getOID()
|
{
|
String o = oid.getText().trim();
|
if (o.length() == 0)
|
{
|
o = getAttributeName()+"-oid";
|
}
|
return o;
|
}
|
|
private ArrayList<String> getAliases()
|
{
|
ArrayList<String> al = new ArrayList<String>();
|
String s = aliases.getText().trim();
|
if (s.length() > 0)
|
{
|
String[] a = s.split(",");
|
for (String alias : a)
|
{
|
al.add(alias.trim());
|
}
|
}
|
return al;
|
}
|
|
private ArrayList<String> getAllNames()
|
{
|
ArrayList<String> al = new ArrayList<String>();
|
al.add(getAttributeName());
|
al.addAll(getAliases());
|
return al;
|
}
|
|
private AttributeType getSuperior()
|
{
|
Object o = parent.getSelectedItem();
|
if (NO_PARENT.equals(o))
|
{
|
return null;
|
}
|
else
|
{
|
return (AttributeType)o;
|
}
|
}
|
|
private MatchingRule getApproximateMatchingRule()
|
{
|
if (approximate.getSelectedIndex() == 0)
|
{
|
return null;
|
}
|
else
|
{
|
return (MatchingRule)approximate.getSelectedItem();
|
}
|
}
|
|
private MatchingRule getEqualityMatchingRule()
|
{
|
if (equality.getSelectedIndex() == 0)
|
{
|
return null;
|
}
|
else
|
{
|
return (MatchingRule)equality.getSelectedItem();
|
}
|
}
|
|
private SubstringMatchingRule getSubstringMatchingRule()
|
{
|
if (substring.getSelectedIndex() == 0)
|
{
|
return null;
|
}
|
else
|
{
|
return (SubstringMatchingRule)substring.getSelectedItem();
|
}
|
}
|
|
private OrderingMatchingRule getOrderingMatchingRule()
|
{
|
if (ordering.getSelectedIndex() == 0)
|
{
|
return null;
|
}
|
else
|
{
|
return (OrderingMatchingRule)ordering.getSelectedItem();
|
}
|
}
|
|
private Map<String, List<String>> getExtraProperties()
|
{
|
Map<String, List<String>> map = new HashMap<String, List<String>>();
|
String f = file.getText().trim();
|
if (f.length() > 0)
|
{
|
ArrayList<String> list = new ArrayList<String>();
|
list.add(f);
|
map.put(ServerConstants.SCHEMA_PROPERTY_FILENAME, list);
|
}
|
String or = origin.getText().trim();
|
if (or.length() > 0)
|
{
|
ArrayList<String> list = new ArrayList<String>();
|
list.add(or);
|
map.put(ServerConstants.SCHEMA_PROPERTY_ORIGIN, list);
|
}
|
return map;
|
}
|
|
private String getDescription()
|
{
|
return description.getText().trim();
|
}
|
|
private AttributeType getAttribute()
|
{
|
AttributeType attr = new AttributeType("", getAttributeName(),
|
getAllNames(),
|
getOID(),
|
getDescription(),
|
getSuperior(),
|
(AttributeSyntax<?>)syntax.getSelectedItem(),
|
getApproximateMatchingRule(),
|
getEqualityMatchingRule(),
|
getOrderingMatchingRule(),
|
getSubstringMatchingRule(),
|
(AttributeUsage)usage.getSelectedItem(),
|
collective.isSelected(), nonModifiable.isSelected(),
|
obsolete.isSelected(), singleValued.isSelected(),
|
getExtraProperties());
|
|
return attr;
|
}
|
}
|