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