/*
|
* 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-2015 ForgeRock AS
|
*/
|
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.ItemEvent;
|
import java.awt.event.ItemListener;
|
import java.io.File;
|
import java.util.ArrayList;
|
import java.util.Arrays;
|
import java.util.HashMap;
|
import java.util.LinkedHashSet;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.Set;
|
import java.util.SortedSet;
|
import java.util.TreeSet;
|
|
import javax.swing.DefaultComboBoxModel;
|
import javax.swing.JCheckBox;
|
import javax.swing.JComboBox;
|
import javax.swing.JLabel;
|
import javax.swing.JPanel;
|
import javax.swing.JTextField;
|
import javax.swing.SwingUtilities;
|
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.forgerock.opendj.ldap.schema.MatchingRule;
|
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.forgerock.opendj.ldap.schema.Syntax;
|
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;
|
|
/**
|
* 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 static final LocalizableMessage NO_PARENT = INFO_CTRL_PANEL_NO_PARENT_FOR_ATTRIBUTE.get();
|
private static final LocalizableMessage NO_MATCHING_RULE = INFO_CTRL_PANEL_NO_MATCHING_RULE_FOR_ATTRIBUTE.get();
|
|
private final JLabel lName = Utilities.createPrimaryLabel(INFO_CTRL_PANEL_ATTRIBUTE_NAME_LABEL.get());
|
private final JLabel lParent = Utilities.createPrimaryLabel(INFO_CTRL_PANEL_ATTRIBUTE_PARENT_LABEL.get());
|
private final JLabel lOID = Utilities.createPrimaryLabel(INFO_CTRL_PANEL_ATTRIBUTE_OID_LABEL.get());
|
private final JLabel lAliases = Utilities.createPrimaryLabel(INFO_CTRL_PANEL_ATTRIBUTE_ALIASES_LABEL.get());
|
private final JLabel lOrigin = Utilities.createPrimaryLabel(INFO_CTRL_PANEL_ATTRIBUTE_ORIGIN_LABEL.get());
|
private final JLabel lFile = Utilities.createPrimaryLabel(INFO_CTRL_PANEL_ATTRIBUTE_FILE_LABEL.get());
|
private final JLabel lDescription = Utilities.createPrimaryLabel(INFO_CTRL_PANEL_ATTRIBUTE_DESCRIPTION_LABEL.get());
|
private final JLabel lUsage = Utilities.createPrimaryLabel(INFO_CTRL_PANEL_ATTRIBUTE_USAGE_LABEL.get());
|
private final JLabel lSyntax = Utilities.createPrimaryLabel(INFO_CTRL_PANEL_ATTRIBUTE_SYNTAX_LABEL.get());
|
private final JLabel lApproximate = Utilities.createPrimaryLabel(
|
INFO_CTRL_PANEL_ATTRIBUTE_APPROXIMATE_MATCHING_RULE_LABEL.get());
|
private final JLabel lEquality = Utilities.createPrimaryLabel(
|
INFO_CTRL_PANEL_ATTRIBUTE_EQUALITY_MATCHING_RULE_LABEL.get());
|
private final JLabel lOrdering = Utilities.createPrimaryLabel(
|
INFO_CTRL_PANEL_ATTRIBUTE_ORDERING_MATCHING_RULE_LABEL.get());
|
private final JLabel lSubstring = Utilities.createPrimaryLabel(
|
INFO_CTRL_PANEL_ATTRIBUTE_SUBSTRING_MATCHING_RULE_LABEL.get());
|
private final JLabel lType = Utilities.createPrimaryLabel();
|
|
private final JLabel[] labels = { lName, lParent, lOID, lAliases, lOrigin, lFile, lDescription, lUsage, lSyntax,
|
lApproximate, lEquality, lOrdering, lSubstring, lType };
|
|
private final JTextField name = Utilities.createMediumTextField();
|
private final JComboBox parent = Utilities.createComboBox();
|
private final JTextField oid = Utilities.createMediumTextField();
|
private final JTextField aliases = Utilities.createLongTextField();
|
private final JTextField description = Utilities.createLongTextField();
|
private final JTextField origin = Utilities.createLongTextField();
|
private final JTextField file = Utilities.createLongTextField();
|
private final JComboBox<AttributeUsage> usage = Utilities.createComboBox();
|
private final JComboBox syntax = Utilities.createComboBox();
|
private final JComboBox approximate = Utilities.createComboBox();
|
private final JComboBox equality = Utilities.createComboBox();
|
private final JComboBox ordering = Utilities.createComboBox();
|
private final JComboBox substring = Utilities.createComboBox();
|
private final JCheckBox nonModifiable = Utilities.createCheckBox(
|
INFO_CTRL_PANEL_ATTRIBUTE_NON_MODIFIABLE_LABEL.get());
|
private final JCheckBox singleValued = Utilities.createCheckBox(INFO_CTRL_PANEL_ATTRIBUTE_SINGLE_VALUED_LABEL.get());
|
private final JCheckBox collective = Utilities.createCheckBox(INFO_CTRL_PANEL_ATTRIBUTE_COLLECTIVE_LABEL.get());
|
private final JCheckBox obsolete = Utilities.createCheckBox(INFO_CTRL_PANEL_ATTRIBUTE_OBSOLETE_LABEL.get());
|
|
private Schema schema;
|
|
private final Component relativeComponent;
|
|
/**
|
* 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)
|
{
|
this.relativeComponent = relativeComponent;
|
createLayout();
|
}
|
|
@Override
|
public LocalizableMessage getTitle()
|
{
|
return INFO_CTRL_PANEL_NEW_ATTRIBUTE_PANEL_TITLE.get();
|
}
|
|
@Override
|
public Component getPreferredFocusComponent()
|
{
|
return name;
|
}
|
|
@Override
|
public void configurationChanged(ConfigurationChangeEvent ev)
|
{
|
List<Syntax> newSyntaxes = new ArrayList<>();
|
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;
|
Map<String, Syntax> syntaxNameMap = new HashMap<>();
|
|
for (String key : schema.getSyntaxes().keySet())
|
{
|
Syntax syntax = schema.getSyntax(key);
|
String name = syntax.getName();
|
if (name == null)
|
{
|
name = syntax.getOID();
|
}
|
syntaxNameMap.put(name, syntax);
|
}
|
|
SortedSet<String> orderedKeys = new TreeSet<>(new LowerCaseComparator());
|
orderedKeys.addAll(syntaxNameMap.keySet());
|
for (String key : orderedKeys)
|
{
|
newSyntaxes.add(syntaxNameMap.get(key));
|
}
|
updateComboBoxModel(newSyntaxes, (DefaultComboBoxModel) syntax.getModel());
|
|
Map<String, AttributeType> attributeNameMap = new HashMap<>();
|
for (String key : schema.getAttributeTypes().keySet())
|
{
|
AttributeType attr = schema.getAttributeType(key);
|
attributeNameMap.put(attr.getNameOrOID(), attr);
|
}
|
orderedKeys.clear();
|
orderedKeys.addAll(attributeNameMap.keySet());
|
List<Object> newParents = new ArrayList<>();
|
for (String key : orderedKeys)
|
{
|
newParents.add(attributeNameMap.get(key));
|
}
|
newParents.add(0, NO_PARENT);
|
updateComboBoxModel(newParents, (DefaultComboBoxModel) parent.getModel());
|
|
final List<MatchingRule> availableMatchingRules = new ArrayList<>();
|
final Map<String, MatchingRule> matchingRuleNameMap = new HashMap<>();
|
for (String key : schema.getMatchingRules().keySet())
|
{
|
MatchingRule rule = schema.getMatchingRule(key);
|
matchingRuleNameMap.put(rule.getNameOrOID(), rule);
|
}
|
|
orderedKeys.clear();
|
orderedKeys.addAll(matchingRuleNameMap.keySet());
|
for (final String key : orderedKeys)
|
{
|
availableMatchingRules.add(matchingRuleNameMap.get(key));
|
}
|
|
final JComboBox[] combos = { approximate, equality, ordering, substring };
|
for (int i = 0; i < combos.length; i++)
|
{
|
final DefaultComboBoxModel model = (DefaultComboBoxModel) combos[i].getModel();
|
final List<Object> el = new ArrayList<Object>(availableMatchingRules);
|
el.add(0, model.getSize() == 0 ? NO_MATCHING_RULE : 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()
|
{
|
@Override
|
public void run()
|
{
|
setEnabledOK(!error[0]);
|
errorPane.setVisible(error[0]);
|
if (firstSchema)
|
{
|
for (int i = 0; i < syntax.getModel().getSize(); i++)
|
{
|
Syntax syn = (Syntax) 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()));
|
}
|
}
|
|
@Override
|
public void okClicked()
|
{
|
List<LocalizableMessage> errors = new ArrayList<>();
|
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() && 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.isEmpty())
|
{
|
Set<AttributeType> attributes = new LinkedHashSet<>();
|
attributes.add(getAttribute());
|
Set<ObjectClass> ocs = new LinkedHashSet<>(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.isEmpty())
|
{
|
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)
|
{
|
final String lowerCase = name.toLowerCase();
|
if (schema.getAttributeType(lowerCase) != null)
|
{
|
return INFO_CTRL_PANEL_TYPE_ATTRIBUTE.get();
|
}
|
else if (schema.getObjectClass(lowerCase) != null)
|
{
|
return INFO_CTRL_PANEL_TYPE_OBJECT_CLASS.get();
|
}
|
else if (schema.getSyntax(lowerCase) != null)
|
{
|
return INFO_CTRL_PANEL_TYPE_ATTRIBUTE_SYNTAX.get();
|
}
|
else if (schema.getMatchingRule(lowerCase) != null)
|
{
|
return INFO_CTRL_PANEL_TYPE_MATCHING_RULE.get();
|
}
|
|
for (Syntax attr : schema.getSyntaxes().values())
|
{
|
if (name.equalsIgnoreCase(attr.getName()))
|
{
|
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<AttributeUsage> 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()
|
{
|
@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()
|
{
|
@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()
|
{
|
Syntax syn = (Syntax) 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 (model.getSize() > 0)
|
{
|
model.removeElementAt(0);
|
}
|
|
final LocalizableMessage msg =
|
rules[i] != null ? INFO_CTRL_PANEL_DEFAULT_DEFINED_IN_SYNTAX.get(rules[i].getNameOrOID())
|
: NO_MATCHING_RULE;
|
model.insertElementAt(msg, 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 List<String> getAliases()
|
{
|
List<String> al = new ArrayList<>();
|
String s = aliases.getText().trim();
|
if (s.length() > 0)
|
{
|
String[] a = s.split(",");
|
for (String alias : a)
|
{
|
al.add(alias.trim());
|
}
|
}
|
return al;
|
}
|
|
private List<String> getAllNames()
|
{
|
List<String> al = new ArrayList<>();
|
al.add(getAttributeName());
|
al.addAll(getAliases());
|
return al;
|
}
|
|
private AttributeType getSuperior()
|
{
|
Object o = parent.getSelectedItem();
|
if (NO_PARENT.equals(o))
|
{
|
return null;
|
}
|
return (AttributeType) o;
|
}
|
|
private MatchingRule getApproximateMatchingRule()
|
{
|
return getMatchingRule(approximate);
|
}
|
|
private MatchingRule getEqualityMatchingRule()
|
{
|
return getMatchingRule(equality);
|
}
|
|
private MatchingRule getSubstringMatchingRule()
|
{
|
return getMatchingRule(substring);
|
}
|
|
private MatchingRule getOrderingMatchingRule()
|
{
|
return getMatchingRule(ordering);
|
}
|
|
private MatchingRule getMatchingRule(JComboBox comboBox)
|
{
|
if (comboBox.getSelectedIndex() != 0)
|
{
|
return (MatchingRule) comboBox.getSelectedItem();
|
}
|
return null;
|
}
|
|
private Map<String, List<String>> getExtraProperties()
|
{
|
final Map<String, List<String>> map = new HashMap<>();
|
addExtraPropertyFromTextField(file, ServerConstants.SCHEMA_PROPERTY_FILENAME, map);
|
addExtraPropertyFromTextField(origin, ServerConstants.SCHEMA_PROPERTY_ORIGIN, map);
|
return map;
|
}
|
|
private void addExtraPropertyFromTextField(
|
final JTextField value, final String key, final Map<String, List<String>> map)
|
{
|
final String trimmedValue = value.getText().trim();
|
if (!trimmedValue.trim().isEmpty())
|
{
|
map.put(key, Arrays.asList(trimmedValue));
|
}
|
}
|
|
private String getDescription()
|
{
|
return description.getText().trim();
|
}
|
|
private AttributeType getAttribute()
|
{
|
return new AttributeType("",
|
getAttributeName(),
|
getAllNames(),
|
getOID(),
|
getDescription(),
|
getSuperior(),
|
(Syntax) syntax.getSelectedItem(),
|
getApproximateMatchingRule(),
|
getEqualityMatchingRule(),
|
getOrderingMatchingRule(),
|
getSubstringMatchingRule(),
|
(AttributeUsage) usage.getSelectedItem(),
|
collective.isSelected(),
|
nonModifiable.isSelected(),
|
obsolete.isSelected(),
|
singleValued.isSelected(),
|
getExtraProperties());
|
}
|
}
|