From 013494192c189ce5bd101f198c4d33230374d4b8 Mon Sep 17 00:00:00 2001
From: jvergara <jvergara@localhost>
Date: Thu, 17 Dec 2009 21:11:04 +0000
Subject: [PATCH] Fix for issue 3601 (Control Panel: unable to modify schema objects or attributes)
---
opends/src/guitools/org/opends/guitools/controlpanel/ui/NewObjectClassPanel.java | 300 +++++++++--------------------------------------------------
1 files changed, 48 insertions(+), 252 deletions(-)
diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewObjectClassPanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewObjectClassPanel.java
index a259816..193af06 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewObjectClassPanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewObjectClassPanel.java
@@ -40,16 +40,13 @@
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;
@@ -62,12 +59,11 @@
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;
@@ -78,20 +74,9 @@
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;
@@ -187,7 +172,24 @@
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;
@@ -230,7 +232,10 @@
{
parent.setSelectedItem(schema.getObjectClass("top"));
}
- updateAttributes();
+ if (schemaChanged)
+ {
+ updateAttributes();
+ }
}
if (repack[0])
{
@@ -332,14 +337,23 @@
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)
{
@@ -712,13 +726,19 @@
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());
@@ -735,243 +755,19 @@
{
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.
*
--
Gitblit v1.10.0