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/NewAttributePanel.java |  331 +++++++++++-------------------------------------------
 1 files changed, 71 insertions(+), 260 deletions(-)

diff --git a/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewAttributePanel.java b/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewAttributePanel.java
index 331cfbd..0510440 100644
--- a/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewAttributePanel.java
+++ b/opends/src/guitools/org/opends/guitools/controlpanel/ui/NewAttributePanel.java
@@ -37,15 +37,12 @@
 import java.io.File;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 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;
@@ -56,12 +53,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
@@ -78,18 +74,8 @@
 import org.opends.server.config.ConfigConstants;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.AttributeUsage;
-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.OpenDsException;
+import org.opends.server.types.ObjectClass;
 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;
 
@@ -207,22 +193,39 @@
     final boolean[] repack = {firstSchema};
     final boolean[] error = {false};
 
-    if (s != null)
+    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.getSyntaxName();
-       if (name == null)
-       {
-         name = syntax.getOID();
-       }
-       syntaxNameMap.put(name, syntax);
-     }
+      HashMap<String, AttributeSyntax<?>> syntaxNameMap = new HashMap<String,
+      AttributeSyntax<?>>();
+      for (String key : schema.getSyntaxes().keySet())
+      {
+        AttributeSyntax<?> syntax = schema.getSyntax(key);
+        String name = syntax.getSyntaxName();
+        if (name == null)
+        {
+          name = syntax.getOID();
+        }
+        syntaxNameMap.put(name, syntax);
+      }
 
       SortedSet<String> orderedKeys =
         new TreeSet<String>(syntaxNameMap.keySet());
@@ -310,7 +313,7 @@
         updateComboBoxModel(el, model);
       }
     }
-    else
+    else if (schema == null)
     {
       updateErrorPane(errorPane,
           ERR_CTRL_PANEL_SCHEMA_NOT_FOUND_SUMMARY.get(),
@@ -383,10 +386,12 @@
     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.toString()));
+      setPrimaryInvalid(lName);
       err = new MessageBuilder();
     }
     else
@@ -396,6 +401,7 @@
       {
         errors.add(ERR_CTRL_PANEL_ATTRIBUTE_NAME_ALREADY_IN_USE.get(n,
             elementType.toString()));
+        setPrimaryInvalid(lName);
       }
     }
 
@@ -405,6 +411,7 @@
       if (!StaticUtils.isValidSchemaElement(n, 0, n.length(), err))
       {
         errors.add(ERR_CTRL_PANEL_OID_NOT_VALID.get(err.toString()));
+        setPrimaryInvalid(lOID);
         err = new MessageBuilder();
       }
       else
@@ -414,6 +421,7 @@
         {
           errors.add(ERR_CTRL_PANEL_OID_ALREADY_IN_USE.get(n,
               elementType.toString()));
+          setPrimaryInvalid(lOID);
         }
       }
     }
@@ -428,6 +436,7 @@
           if (alias.trim().length() == 0)
           {
             errors.add(ERR_CTRL_PANEL_EMPTY_ALIAS.get());
+            setPrimaryInvalid(lAliases);
           }
           else
           {
@@ -436,24 +445,44 @@
             {
               errors.add(ERR_CTRL_PANEL_ALIAS_ALREADY_IN_USE.get(n,
                   elementType.toString()));
+              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());
-    NewAttributeTask newTask = null;
+    NewSchemaElementsTask newTask = null;
     if (errors.size() == 0)
     {
-      newTask = new NewAttributeTask(getInfo(), dlg);
+      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)
     {
@@ -834,11 +863,17 @@
     return map;
   }
 
+  private String getDescription()
+  {
+    return description.getText().trim();
+  }
+
   private AttributeType getAttribute()
   {
     AttributeType attr = new AttributeType("", getAttributeName(),
         getAllNames(),
-        getOID(), description.getText().trim(),
+        getOID(),
+        getDescription(),
         getSuperior(),
         (AttributeSyntax<?>)syntax.getSelectedItem(),
         getApproximateMatchingRule(),
@@ -852,228 +887,4 @@
 
     return attr;
   }
-
-  /**
-   * The task in charge of creating the attribute.
-   *
-   */
-  protected class NewAttributeTask extends SchemaTask
-  {
-    private AttributeType attribute;
-    private String attributeName;
-    private String attributeDefinition;
-    private String attributeWithoutFileDefinition;
-
-    /**
-     * The constructor of the task.
-     * @param info the control panel info.
-     * @param dlg the progress dialog that shows the progress of the task.
-     */
-    public NewAttributeTask(ControlPanelInfo info, ProgressDialog dlg)
-    {
-      super(info, dlg);
-      attributeName = getAttributeName();
-      attributeDefinition = attribute.toString();
-      AttributeType attr = getAttribute();
-      attr.setExtraProperty(ServerConstants.SCHEMA_PROPERTY_FILENAME,
-          (String)null);
-      attributeWithoutFileDefinition = attr.toString();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public Type getType()
-    {
-      return Type.NEW_ATTRIBUTE;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected CommonSchemaElements getSchemaElement()
-    {
-      if (attribute == null)
-      {
-        attribute = getAttribute();
-      }
-      return attribute;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public Message getTaskDescription()
-    {
-      return INFO_CTRL_PANEL_NEW_ATTRIBUTE_TASK_DESCRIPTION.get(attributeName);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected String getSchemaFileAttributeName()
-    {
-      return "attributeTypes";
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected String getSchemaFileAttributeValue()
-    {
-      if (isServerRunning())
-      {
-        return attributeDefinition;
-      }
-      else
-      {
-        return attributeWithoutFileDefinition;
-      }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected void updateSchema() throws OpenDsException
-    {
-      SwingUtilities.invokeLater(new Runnable()
-      {
-        /**
-         * {@inheritDoc}
-         */
-        public void run()
-        {
-          printEquivalentCommandToAdd();
-          getProgressDialog().appendProgressHtml(
-              Utilities.getProgressWithPoints(
-                  INFO_CTRL_PANEL_CREATING_ATTRIBUTE_PROGRESS.get(
-                      attributeName),
-                  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(attribute);
-      SwingUtilities.invokeLater(new Runnable()
-      {
-        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)
-            {
-            }
-          }
-        }
-      }
-    }
-  }
 }

--
Gitblit v1.10.0