| | |
| | | import java.util.Comparator; |
| | | import java.util.HashMap; |
| | | import java.util.HashSet; |
| | | 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.naming.NamingException; |
| | | import javax.naming.directory.BasicAttribute; |
| | | import javax.naming.directory.DirContext; |
| | | import javax.naming.directory.ModificationItem; |
| | | import javax.swing.DefaultComboBoxModel; |
| | | import javax.swing.JCheckBox; |
| | | import javax.swing.JComboBox; |
| | |
| | | import javax.swing.event.ChangeEvent; |
| | | import javax.swing.event.ChangeListener; |
| | | |
| | | import org.opends.guitools.controlpanel.datamodel.ControlPanelInfo; |
| | | import org.opends.guitools.controlpanel.datamodel.ServerDescriptor; |
| | | import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent; |
| | | import org.opends.guitools.controlpanel.task.OfflineUpdateException; |
| | | import org.opends.guitools.controlpanel.task.OnlineUpdateException; |
| | | import org.opends.guitools.controlpanel.task.SchemaTask; |
| | | 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.components.DoubleAddRemovePanel; |
| | |
| | | import org.opends.messages.MessageBuilder; |
| | | import org.opends.server.config.ConfigConstants; |
| | | import org.opends.server.types.AttributeType; |
| | | import org.opends.server.types.Attributes; |
| | | import org.opends.server.types.CommonSchemaElements; |
| | | import org.opends.server.types.Entry; |
| | | import org.opends.server.types.ExistingFileBehavior; |
| | | import org.opends.server.types.LDIFExportConfig; |
| | | import org.opends.server.types.LDIFImportConfig; |
| | | import org.opends.server.types.Modification; |
| | | import org.opends.server.types.ModificationType; |
| | | import org.opends.server.types.ObjectClass; |
| | | import org.opends.server.types.ObjectClassType; |
| | | import org.opends.server.types.OpenDsException; |
| | | import org.opends.server.types.Schema; |
| | | import org.opends.server.util.LDIFReader; |
| | | import org.opends.server.util.LDIFWriter; |
| | | import org.opends.server.util.ServerConstants; |
| | | import org.opends.server.util.StaticUtils; |
| | | |
| | |
| | | final boolean[] repack = {firstSchema}; |
| | | final boolean[] error = {false}; |
| | | |
| | | if (s != null) |
| | | final 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; |
| | | |
| | |
| | | { |
| | | parent.setSelectedItem(schema.getObjectClass("top")); |
| | | } |
| | | updateAttributes(); |
| | | if (schemaChanged) |
| | | { |
| | | updateAttributes(); |
| | | } |
| | | } |
| | | if (repack[0]) |
| | | { |
| | |
| | | Utilities.createFrame(), |
| | | Utilities.getParentDialog(this), |
| | | INFO_CTRL_PANEL_NEW_OBJECTCLASS_PANEL_TITLE.get(), getInfo()); |
| | | NewObjectClassTask newTask = null; |
| | | NewSchemaElementsTask newTask = null; |
| | | if (errors.size() == 0) |
| | | { |
| | | newTask = new NewObjectClassTask(getInfo(), dlg); |
| | | LinkedHashSet<AttributeType> attributes = |
| | | new LinkedHashSet<AttributeType>(1); |
| | | LinkedHashSet<ObjectClass> ocs = new LinkedHashSet<ObjectClass>(); |
| | | ocs.add(getObjectClass()); |
| | | 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) |
| | | { |
| | |
| | | return al; |
| | | } |
| | | |
| | | private String getDescription() |
| | | { |
| | | return description.getText().trim(); |
| | | } |
| | | |
| | | private ObjectClass getObjectClass() |
| | | { |
| | | ObjectClass oc = new ObjectClass("", getObjectClassName(), getAllNames(), |
| | | getOID(), description.getText().trim(), |
| | | getOID(), |
| | | getDescription(), |
| | | getSuperior(), |
| | | getRequiredAttributes(), |
| | | getAllowedAttributes(), |
| | | getOptionalAttributes(), |
| | | getObjectClassType(), |
| | | obsolete.isSelected(), |
| | | getExtraProperties()); |
| | |
| | | { |
| | | HashSet<AttributeType> attrs = new HashSet<AttributeType>(); |
| | | attrs.addAll(attributes.getSelectedListModel1().getData()); |
| | | attrs.removeAll(inheritedRequiredAttributes); |
| | | return attrs; |
| | | } |
| | | |
| | | private Set<AttributeType> getAllowedAttributes() |
| | | private Set<AttributeType> getOptionalAttributes() |
| | | { |
| | | HashSet<AttributeType> attrs = new HashSet<AttributeType>(); |
| | | attrs.addAll(attributes.getSelectedListModel2().getData()); |
| | | attrs.removeAll(inheritedOptionalAttributes); |
| | | return attrs; |
| | | } |
| | | |
| | | /** |
| | | * The task in charge of creating the object class. |
| | | * |
| | | */ |
| | | protected class NewObjectClassTask extends SchemaTask |
| | | { |
| | | private ObjectClass oc; |
| | | private String ocName; |
| | | private String ocDefinition; |
| | | private String ocWithoutFileDefinition; |
| | | |
| | | /** |
| | | * The constructor of the task. |
| | | * @param info the control panel info. |
| | | * @param dlg the progress dialog that shows the progress of the task. |
| | | */ |
| | | public NewObjectClassTask(ControlPanelInfo info, ProgressDialog dlg) |
| | | { |
| | | super(info, dlg); |
| | | ocName = getObjectClassName(); |
| | | ocDefinition = getSchemaElement().toString(); |
| | | ObjectClass oc = getObjectClass(); |
| | | oc.setExtraProperty(ServerConstants.SCHEMA_PROPERTY_FILENAME, |
| | | (String)null); |
| | | ocWithoutFileDefinition = oc.toString(); |
| | | } |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | public Type getType() |
| | | { |
| | | return Type.NEW_OBJECTCLASS; |
| | | } |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | protected CommonSchemaElements getSchemaElement() |
| | | { |
| | | if (oc == null) |
| | | { |
| | | oc = getObjectClass(); |
| | | } |
| | | return oc; |
| | | } |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | public Message getTaskDescription() |
| | | { |
| | | return INFO_CTRL_PANEL_NEW_OBJECTCLASS_TASK_DESCRIPTION.get(ocName); |
| | | } |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | protected String getSchemaFileAttributeName() |
| | | { |
| | | return "objectClasses"; |
| | | } |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | protected String getSchemaFileAttributeValue() |
| | | { |
| | | if (isServerRunning()) |
| | | { |
| | | return ocDefinition; |
| | | } |
| | | else |
| | | { |
| | | return ocWithoutFileDefinition; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | protected void updateSchema() throws OpenDsException |
| | | { |
| | | SwingUtilities.invokeLater(new Runnable() |
| | | { |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | public void run() |
| | | { |
| | | printEquivalentCommandToAdd(); |
| | | getProgressDialog().appendProgressHtml( |
| | | Utilities.getProgressWithPoints( |
| | | INFO_CTRL_PANEL_CREATING_OBJECTCLASS_PROGRESS.get(ocName), |
| | | ColorAndFontConstants.progressFont)); |
| | | } |
| | | }); |
| | | |
| | | if (isServerRunning()) |
| | | { |
| | | try |
| | | { |
| | | BasicAttribute attr = |
| | | new BasicAttribute(getSchemaFileAttributeName()); |
| | | attr.add(getSchemaFileAttributeValue()); |
| | | ModificationItem mod = new ModificationItem(DirContext.ADD_ATTRIBUTE, |
| | | attr); |
| | | getInfo().getDirContext().modifyAttributes( |
| | | ConfigConstants.DN_DEFAULT_SCHEMA_ROOT, |
| | | new ModificationItem[] { mod }); |
| | | } |
| | | catch (NamingException ne) |
| | | { |
| | | throw new OnlineUpdateException( |
| | | ERR_CTRL_PANEL_ERROR_UPDATING_SCHEMA.get(ne.toString()), ne); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | updateSchemaFile(); |
| | | } |
| | | notifyConfigurationElementCreated(oc); |
| | | SwingUtilities.invokeLater(new Runnable() |
| | | { |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | public void run() |
| | | { |
| | | getProgressDialog().appendProgressHtml( |
| | | Utilities.getProgressDone(ColorAndFontConstants.progressFont)); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * Updates the contents of the schema file. |
| | | * @throws OpenDsException if an error occurs updating the schema file. |
| | | */ |
| | | private void updateSchemaFile() throws OpenDsException |
| | | { |
| | | if (isSchemaFileDefined) |
| | | { |
| | | LDIFExportConfig exportConfig = |
| | | new LDIFExportConfig(schemaFile, |
| | | ExistingFileBehavior.OVERWRITE); |
| | | LDIFReader reader = null; |
| | | Entry schemaEntry = null; |
| | | try |
| | | { |
| | | reader = new LDIFReader(new LDIFImportConfig(schemaFile)); |
| | | schemaEntry = reader.readEntry(); |
| | | |
| | | Modification mod = new Modification(ModificationType.ADD, |
| | | Attributes.create(getSchemaFileAttributeName().toLowerCase(), |
| | | getSchemaFileAttributeValue())); |
| | | schemaEntry.applyModification(mod); |
| | | LDIFWriter writer = new LDIFWriter(exportConfig); |
| | | writer.writeEntry(schemaEntry); |
| | | exportConfig.getWriter().newLine(); |
| | | } |
| | | catch (Throwable t) |
| | | { |
| | | } |
| | | finally |
| | | { |
| | | if (reader != null) |
| | | { |
| | | try |
| | | { |
| | | reader.close(); |
| | | } |
| | | catch (Throwable t) |
| | | { |
| | | } |
| | | } |
| | | if (exportConfig != null) |
| | | { |
| | | try |
| | | { |
| | | exportConfig.close(); |
| | | } |
| | | catch (Throwable t) |
| | | { |
| | | } |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LDIFExportConfig exportConfig = |
| | | new LDIFExportConfig(schemaFile, |
| | | ExistingFileBehavior.FAIL); |
| | | try |
| | | { |
| | | ArrayList<String> lines = getSchemaEntryLines(); |
| | | for (String line : lines) |
| | | { |
| | | LDIFWriter.writeLDIFLine(new StringBuilder(line), |
| | | exportConfig.getWriter(), exportConfig.getWrapColumn() > 1, |
| | | exportConfig.getWrapColumn()); |
| | | } |
| | | exportConfig.getWriter().newLine(); |
| | | } |
| | | catch (Throwable t) |
| | | { |
| | | throw new OfflineUpdateException( |
| | | ERR_CTRL_PANEL_ERROR_UPDATING_SCHEMA.get(t.toString()), t); |
| | | } |
| | | finally |
| | | { |
| | | if (exportConfig != null) |
| | | { |
| | | try |
| | | { |
| | | exportConfig.close(); |
| | | } |
| | | catch (Throwable t) |
| | | { |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * A renderer for the attribute lists. The renderer basically marks the |
| | | * inherited attributes with an asterisk. |
| | | * |