mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Jean-Noel Rouvignac
04.36.2014 d41ebfdf1b752c71ff76b2b613e424adf3b0fd4c
opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/datamodel/ServerDescriptor.java
@@ -22,8 +22,8 @@
 *
 *
 *      Copyright 2008-2010 Sun Microsystems, Inc.
 *      Portions Copyright 2014 ForgeRock AS
 */
package org.opends.guitools.controlpanel.datamodel;
import java.io.File;
@@ -49,6 +49,8 @@
import org.opends.server.types.OperatingSystem;
import org.opends.server.types.Schema;
import static org.opends.server.types.CommonSchemaElements.*;
/**
 * This is just a class used to provide a data model describing what the
 * StatusPanelDialog will show to the user.
@@ -779,7 +781,7 @@
    {
      Object[] compareWithEqual = {attr1.getApproximateMatchingRule(),
          attr2.getApproximateMatchingRule(),
          attr1.getDefinitionWithFileName(), attr2.getDefinitionWithFileName(),
          getDefinitionWithFileName(attr1), getDefinitionWithFileName(attr2),
          attr1.getDescription(), attr2.getDescription(),
          attr1.getEqualityMatchingRule(), attr2.getEqualityMatchingRule(),
          attr1.getOrderingMatchingRule(), attr2.getOrderingMatchingRule(),
@@ -798,8 +800,8 @@
      if (areEqual)
      {
        Iterable<?>[] iterables = {attr1.getExtraPropertyNames(),
            attr2.getExtraPropertyNames(),
        Iterable<?>[] iterables = {attr1.getExtraProperties().keySet(),
            attr2.getExtraProperties().keySet(),
            attr1.getNormalizedNames(), attr2.getNormalizedNames(),
            attr1.getUserDefinedNames(), attr2.getUserDefinedNames()};
        for (int i=0; i<iterables.length && areEqual; i++)
@@ -840,7 +842,7 @@
    if (areEqual)
    {
      Object[] compareWithEqual = {
          oc1.getDefinitionWithFileName(), oc2.getDefinitionWithFileName(),
          getDefinitionWithFileName(oc1), getDefinitionWithFileName(oc2),
          oc1.getDescription(), oc2.getDescription(),
          oc1.getObjectClassType(), oc2.getObjectClassType(),
          oc1.getOptionalAttributes(), oc2.getOptionalAttributes(),
@@ -858,7 +860,7 @@
    if (areEqual)
    {
      Iterable<?>[] iterables = {
          oc1.getExtraPropertyNames(), oc2.getExtraPropertyNames(),
          oc1.getExtraProperties().keySet(), oc2.getExtraProperties().keySet(),
          oc1.getNormalizedNames(), oc2.getNormalizedNames(),
          oc1.getUserDefinedNames(), oc2.getUserDefinedNames()};
      for (int i=0; i<iterables.length && areEqual; i++)
opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/task/DeleteSchemaElementsTask.java
@@ -76,22 +76,25 @@
public class DeleteSchemaElementsTask extends Task
{
  // The list of object classes that the user asked to delete.
  LinkedHashSet<ObjectClass> providedOcsToDelete =
  private LinkedHashSet<ObjectClass> providedOcsToDelete =
    new LinkedHashSet<ObjectClass>();
  // The list of attributes that the user asked to delete.
  LinkedHashSet<AttributeType> providedAttrsToDelete =
  private LinkedHashSet<AttributeType> providedAttrsToDelete =
    new LinkedHashSet<AttributeType>();
  // The list of object classes that will be actually deleted (some might be
  // recreated).
  LinkedHashSet<ObjectClass> ocsToDelete = new LinkedHashSet<ObjectClass>();
  private LinkedHashSet<ObjectClass> ocsToDelete =
      new LinkedHashSet<ObjectClass>();
  // The list of attributes that will be actually deleted (some might be
  // recreated).
  LinkedHashSet<AttributeType> attrsToDelete =
  private LinkedHashSet<AttributeType> attrsToDelete =
    new LinkedHashSet<AttributeType>();
  // The list of object classes that will be recreated.
  LinkedHashSet<ObjectClass> ocsToAdd = new LinkedHashSet<ObjectClass>();
  private LinkedHashSet<ObjectClass> ocsToAdd =
      new LinkedHashSet<ObjectClass>();
  // The list of attributes that will be recreated.
  LinkedHashSet<AttributeType> attrsToAdd = new LinkedHashSet<AttributeType>();
  private LinkedHashSet<AttributeType> attrsToAdd =
      new LinkedHashSet<AttributeType>();
  /**
   * Constructor of the task.
@@ -403,7 +406,7 @@
  private void updateSchemaFile(CommonSchemaElements schemaElement)
  throws OpenDsException
  {
    String schemaFile = getSchemaFile((SchemaFileElement)schemaElement);
    String schemaFile = getSchemaFile(schemaElement);
    LDIFExportConfig exportConfig =
      new LDIFExportConfig(schemaFile,
          ExistingFileBehavior.OVERWRITE);
@@ -441,7 +444,7 @@
   */
  private String getSchemaFile(SchemaFileElement element)
  {
    String schemaFile = element.getSchemaFile();
    String schemaFile = CommonSchemaElements.getSchemaFile(element);
    if (schemaFile == null)
    {
      schemaFile = ConfigConstants.FILE_USER_SCHEMA_ELEMENTS;
@@ -483,14 +486,7 @@
   */
  private String getSchemaFileAttributeValue(CommonSchemaElements element)
  {
    if (element instanceof AttributeType)
    {
      return ((AttributeType)element).getDefinition();
    }
    else
    {
      return ((ObjectClass)element).getDefinition();
    }
    return element.getDefinition();
  }
  /**
@@ -500,7 +496,7 @@
   */
  private void printEquivalentCommandToDelete(CommonSchemaElements element)
  {
    String schemaFile = getSchemaFile((SchemaFileElement)element);
    String schemaFile = getSchemaFile(element);
    String attrName = getSchemaFileAttributeName(element);
    String attrValue = getSchemaFileAttributeValue(element);
    if (!isServerRunning())
@@ -798,14 +794,10 @@
  {
    Map<String, List<String>> extraProperties =
      new HashMap<String, List<String>>();
    for (String name : element.getExtraPropertyNames())
    Map<String, List<String>> props = element.getExtraProperties();
    for (String name : props.keySet())
    {
      List<String> values = new ArrayList<String>();
      Iterable<String> properties = element.getExtraProperty(name);
      for (String v : properties)
      {
        values.add(v);
      }
      List<String> values = new ArrayList<String>(props.get(name));
      extraProperties.put(name, values);
    }
    return extraProperties;
opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/task/NewSchemaElementsTask.java
@@ -37,6 +37,7 @@
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.naming.NamingException;
@@ -63,11 +64,14 @@
import org.forgerock.opendj.ldap.ModificationType;
import org.opends.server.types.ObjectClass;
import org.opends.server.types.OpenDsException;
import org.opends.server.types.SchemaFileElement;
import org.opends.server.util.LDIFReader;
import org.opends.server.util.LDIFWriter;
import org.opends.server.util.ServerConstants;
import org.opends.server.util.StaticUtils;
import static org.opends.server.types.CommonSchemaElements.*;
/**
 * An abstract class used to re-factor some code between the different tasks
 * that create elements in the schema.
@@ -97,6 +101,7 @@
  /**
   * {@inheritDoc}
   */
  @Override
  public Set<String> getBackends()
  {
    return Collections.emptySet();
@@ -105,6 +110,7 @@
  /**
   * {@inheritDoc}
   */
  @Override
  public boolean canLaunch(Task taskToBeLaunched,
      Collection<LocalizableMessage> incompatibilityReasons)
  {
@@ -124,6 +130,7 @@
  /**
   * {@inheritDoc}
   */
  @Override
  public void runTask()
  {
    state = State.RUNNING;
@@ -144,6 +151,7 @@
  /**
   * {@inheritDoc}
   */
  @Override
  public Type getType()
  {
    return Type.NEW_SCHEMA_ELEMENT;
@@ -152,6 +160,7 @@
  /**
   * {@inheritDoc}
   */
  @Override
  public LocalizableMessage getTaskDescription()
  {
    if (attrsToAdd.size() == 1 && ocsToAdd.isEmpty())
@@ -212,6 +221,7 @@
  /**
   * {@inheritDoc}
   */
  @Override
  protected String getCommandLinePath()
  {
    return null;
@@ -220,6 +230,7 @@
  /**
   * {@inheritDoc}
   */
  @Override
  protected List<String> getCommandLineArguments()
  {
    return Collections.emptyList();
@@ -234,6 +245,7 @@
      addAttributeOnline(attr);
      SwingUtilities.invokeLater(new Runnable()
      {
        @Override
        public void run()
        {
          getProgressDialog().appendProgressHtml(Utilities.applyFont("<br><br>",
@@ -246,6 +258,7 @@
      addObjectClassOnline(oc);
      SwingUtilities.invokeLater(new Runnable()
      {
        @Override
        public void run()
        {
          getProgressDialog().appendProgressHtml(Utilities.applyFont("<br><br>",
@@ -258,57 +271,16 @@
  private void updateSchemaOffline() throws OpenDsException
  {
    // Group the changes in the same schema file.
    LinkedHashMap<String, List<AttributeType>> hmAttrs =
      new LinkedHashMap<String, List<AttributeType>>();
    for (AttributeType attr : attrsToAdd)
    {
      String fileName = getFileName(attr);
      if (fileName == null)
      {
        fileName = "";
      }
      List<AttributeType> attrs = hmAttrs.get(fileName);
      if (attrs == null)
      {
        attrs = new ArrayList<AttributeType>();
        hmAttrs.put(fileName, attrs);
      }
      attrs.add(attr);
    }
    LinkedHashMap<String, List<ObjectClass>> hmOcs =
      new LinkedHashMap<String, List<ObjectClass>>();
    for (ObjectClass oc : ocsToAdd)
    {
      String fileName = getFileName(oc);
      if (fileName == null)
      {
        fileName = "";
      }
      List<ObjectClass> ocs = hmOcs.get(fileName);
      if (ocs == null)
      {
        ocs = new ArrayList<ObjectClass>();
        hmOcs.put(fileName, ocs);
      }
      ocs.add(oc);
    }
    LinkedHashMap<String, List<AttributeType>> hmAttrs = copy(attrsToAdd);
    LinkedHashMap<String, List<ObjectClass>> hmOcs = copy(ocsToAdd);
    LinkedHashSet<String> allFileNames = new LinkedHashSet<String>();
    allFileNames.addAll(hmAttrs.keySet());
    allFileNames.addAll(hmOcs.keySet());
    for (String fileName : allFileNames)
    {
      List<AttributeType> attrs = hmAttrs.get(fileName);
      List<ObjectClass> ocs = hmOcs.get(fileName);
      if (attrs == null)
      {
        attrs = Collections.emptyList();
      }
      if (ocs == null)
      {
        ocs = Collections.emptyList();
      }
      List<AttributeType> attrs = get(hmAttrs, fileName);
      List<ObjectClass> ocs = get(hmOcs, fileName);
      if (fileName.equals(""))
      {
@@ -317,6 +289,7 @@
      updateSchemaOffline(fileName, attrs, ocs);
      SwingUtilities.invokeLater(new Runnable()
      {
        @Override
        public void run()
        {
          getProgressDialog().appendProgressHtml(Utilities.applyFont("<br><br>",
@@ -326,6 +299,40 @@
    }
  }
  private <T extends SchemaFileElement> List<T> get(
      LinkedHashMap<String, List<T>> hmElems, String fileName)
  {
    List<T> elems = hmElems.get(fileName);
    if (elems != null)
    {
      return elems;
    }
    return Collections.emptyList();
  }
  private <T extends SchemaFileElement> LinkedHashMap<String, List<T>> copy(
      LinkedHashSet<T> elemsToAdd)
  {
    LinkedHashMap<String, List<T>> hmElems =
        new LinkedHashMap<String, List<T>>();
    for (T elem : elemsToAdd)
    {
      String fileName = CommonSchemaElements.getSchemaFile(elem);
      if (fileName == null)
      {
        fileName = "";
      }
      List<T> elems = hmElems.get(fileName);
      if (elems == null)
      {
        elems = new ArrayList<T>();
        hmElems.put(fileName, elems);
      }
      elems.add(elem);
    }
    return hmElems;
  }
  private void addAttributeOnline(final AttributeType attribute)
  throws OpenDsException
  {
@@ -334,6 +341,7 @@
      /**
       * {@inheritDoc}
       */
      @Override
      public void run()
      {
        printEquivalentCommandLineToAddOnline(attribute);
@@ -362,6 +370,7 @@
    notifyConfigurationElementCreated(attribute);
    SwingUtilities.invokeLater(new Runnable()
    {
      @Override
      public void run()
      {
        getProgressDialog().appendProgressHtml(
@@ -378,6 +387,7 @@
      /**
       * {@inheritDoc}
       */
      @Override
      public void run()
      {
        printEquivalentCommandLineToAddOnline(objectClass);
@@ -406,6 +416,7 @@
    notifyConfigurationElementCreated(objectClass);
    SwingUtilities.invokeLater(new Runnable()
    {
      @Override
      public void run()
      {
        getProgressDialog().appendProgressHtml(
@@ -421,23 +432,16 @@
  private String getValueOffline(CommonSchemaElements element)
  {
    Iterable<String> previousValues =
      element.getExtraProperty(ServerConstants.SCHEMA_PROPERTY_FILENAME);
    element.setExtraProperty(ServerConstants.SCHEMA_PROPERTY_FILENAME,
        (String)null);
    final Map<String, List<String>> props = element.getExtraProperties();
    List<String> previousValues =
        props.get(ServerConstants.SCHEMA_PROPERTY_FILENAME);
    setExtraProperty(element, ServerConstants.SCHEMA_PROPERTY_FILENAME, null);
    String attributeWithoutFileDefinition = element.toString();
    if (previousValues != null)
    if (previousValues != null && !previousValues.isEmpty())
    {
      ArrayList<String> vs = new ArrayList<String>();
      for (String s : previousValues)
      {
        vs.add(s);
      }
      if (!vs.isEmpty())
      {
        element.setExtraProperty(ServerConstants.SCHEMA_PROPERTY_FILENAME, vs);
      }
      ArrayList<String> vs = new ArrayList<String>(previousValues);
      element.setExtraProperty(ServerConstants.SCHEMA_PROPERTY_FILENAME, vs);
    }
    return attributeWithoutFileDefinition;
  }
@@ -491,21 +495,6 @@
    }
  }
  private String getFileName(CommonSchemaElements element)
  {
    String value = null;
    Iterable<String> vs =
      element.getExtraProperty(ServerConstants.SCHEMA_PROPERTY_FILENAME);
    if (vs != null)
    {
      if (vs.iterator().hasNext())
      {
        value = vs.iterator().next();
      }
    }
    return value;
  }
  private void updateSchemaOffline(String file,
      final List<AttributeType> attributes,
      final List<ObjectClass> objectClasses) throws OpenDsException
@@ -528,6 +517,7 @@
      /**
       * {@inheritDoc}
       */
      @Override
      public void run()
      {
        printEquivalentCommandToAddOffline(fileName, isSchemaFileDefined,
@@ -573,6 +563,7 @@
    }
    SwingUtilities.invokeLater(new Runnable()
    {
      @Override
      public void run()
      {
        getProgressDialog().appendProgressHtml(
opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/CustomAttributePanel.java
@@ -98,6 +98,8 @@
import org.opends.server.util.ServerConstants;
import org.opends.server.util.StaticUtils;
import static org.opends.server.types.CommonSchemaElements.*;
/**
 * The panel that displays a custom attribute definition.
 */
@@ -189,9 +191,8 @@
    createLayout();
  }
  /**
   * {@inheritDoc}
   */
  /** {@inheritDoc} */
  @Override
  public LocalizableMessage getTitle()
  {
    return INFO_CTRL_PANEL_CUSTOM_ATTRIBUTE_TITLE.get();
@@ -231,9 +232,8 @@
    add(delete, gbc);
    delete.addActionListener(new ActionListener()
    {
      /**
       * {@inheritDoc}
       */
      /** {@inheritDoc} */
      @Override
      public void actionPerformed(ActionEvent ev)
      {
        deleteAttribute();
@@ -248,9 +248,8 @@
    add(saveChanges, gbc);
    saveChanges.addActionListener(new ActionListener()
    {
      /**
       * {@inheritDoc}
       */
      /** {@inheritDoc} */
      @Override
      public void actionPerformed(ActionEvent ev)
      {
        ArrayList<LocalizableMessage> errors = new ArrayList<LocalizableMessage>();
@@ -369,9 +368,8 @@
      final BasicExpander expander = expanders[i];
      ChangeListener changeListener = new ChangeListener()
      {
        /**
         * {@inheritDoc}
         */
        /** {@inheritDoc} */
        @Override
        public void stateChanged(ChangeEvent e)
        {
          p.setVisible(expander.isSelected());
@@ -384,9 +382,8 @@
    ItemListener itemListener = new ItemListener()
    {
      /**
       * {@inheritDoc}
       */
      /** {@inheritDoc} */
      @Override
      public void itemStateChanged(ItemEvent ev)
      {
        if (ev.getStateChange() == ItemEvent.SELECTED)
@@ -439,9 +436,7 @@
      final JList list = lists[i];
      MouseAdapter clickListener = new MouseAdapter()
      {
        /**
         * {@inheritDoc}
         */
        /** {@inheritDoc} */
        @Override
        public void mouseClicked(MouseEvent ev)
        {
@@ -455,9 +450,7 @@
      KeyAdapter keyListener = new KeyAdapter()
      {
        /**
         * {@inheritDoc}
         */
        /** {@inheritDoc} */
        @Override
        public void keyTyped(KeyEvent ev)
        {
@@ -473,25 +466,22 @@
    DocumentListener docListener = new DocumentListener()
    {
      /**
       * {@inheritDoc}
       */
      /** {@inheritDoc} */
      @Override
      public void insertUpdate(DocumentEvent ev)
      {
        checkEnableSaveChanges();
      }
      /**
       * {@inheritDoc}
       */
      /** {@inheritDoc} */
      @Override
      public void removeUpdate(DocumentEvent ev)
      {
        checkEnableSaveChanges();
      }
      /**
       * {@inheritDoc}
       */
      /** {@inheritDoc} */
      @Override
      public void changedUpdate(DocumentEvent arg0)
      {
        checkEnableSaveChanges();
@@ -505,6 +495,7 @@
    ActionListener actionListener = new ActionListener()
    {
      @Override
      public void actionPerformed(ActionEvent ev)
      {
        checkEnableSaveChanges();
@@ -526,18 +517,14 @@
    }
  }
  /**
   * {@inheritDoc}
   */
  /** {@inheritDoc} */
  @Override
  public boolean mustCheckUnsavedChanges()
  {
    return saveChanges.isEnabled();
  }
  /**
   * {@inheritDoc}
   */
  /** {@inheritDoc} */
  @Override
  public UnsavedChangesDialog.Result checkUnsavedChanges()
  {
@@ -564,18 +551,14 @@
    return result;
  }
  /**
   * {@inheritDoc}
   */
  /** {@inheritDoc} */
  @Override
  public boolean requiresScroll()
  {
    return false;
  }
  /**
   * {@inheritDoc}
   */
  /** {@inheritDoc} */
  public void update(AttributeType attr, Schema schema)
  {
    ignoreChangeEvents = true;
@@ -618,7 +601,7 @@
    }
    origin.setText(sOrigin);
    String sFile = attr.getSchemaFile();
    String sFile = getSchemaFile(attr);
    if (sFile == null)
    {
      sFile = "";
@@ -693,9 +676,8 @@
    ignoreChangeEvents = false;
  }
  /**
   * {@inheritDoc}
   */
  /** {@inheritDoc} */
  @Override
  public void configurationChanged(ConfigurationChangeEvent ev)
  {
    ArrayList<AttributeSyntax<?>> newSyntaxes =
@@ -841,9 +823,8 @@
    }
    SwingUtilities.invokeLater(new Runnable()
    {
      /**
       * {@inheritDoc}
       */
      /** {@inheritDoc} */
      @Override
      public void run()
      {
        delete.setEnabled(!authenticationRequired(desc) &&
@@ -857,17 +838,15 @@
    });
  }
  /**
   * {@inheritDoc}
   */
  /** {@inheritDoc} */
  @Override
  public Component getPreferredFocusComponent()
  {
    return name;
  }
  /**
   * {@inheritDoc}
   */
  /** {@inheritDoc} */
  @Override
  public void okClicked()
  {
  }
@@ -1309,21 +1288,17 @@
      {
        DefaultComboBoxModel model = (DefaultComboBoxModel)combos[i].getModel();
        int index = combos[i].getSelectedIndex();
        if (model.getSize() > 0)
        {
          model.removeElementAt(0);
        }
        if (rules[i] != null)
        {
          if (model.getSize() > 0)
          {
            model.removeElementAt(0);
          }
          model.insertElementAt(INFO_CTRL_PANEL_DEFAULT_DEFINED_IN_SYNTAX.get(
              rules[i].getNameOrOID()), 0);
        }
        else
        {
          if (model.getSize() > 0)
          {
            model.removeElementAt(0);
          }
          model.insertElementAt(NO_MATCHING_RULE, 0);
        }
        combos[i].setSelectedIndex(index);
opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/CustomObjectClassPanel.java
@@ -95,6 +95,8 @@
import org.opends.server.util.ServerConstants;
import org.opends.server.util.StaticUtils;
import static org.opends.server.types.CommonSchemaElements.*;
/**
 * The panel that displays a custom object class definition.
 *
@@ -166,9 +168,8 @@
    createLayout();
  }
  /**
   * {@inheritDoc}
   */
  /** {@inheritDoc} */
  @Override
  public LocalizableMessage getTitle()
  {
    return INFO_CTRL_PANEL_CUSTOM_OBJECTCLASS_TITLE.get();
@@ -208,9 +209,8 @@
    add(delete, gbc);
    delete.addActionListener(new ActionListener()
    {
      /**
       * {@inheritDoc}
       */
      /** {@inheritDoc} */
      @Override
      public void actionPerformed(ActionEvent ev)
      {
        deleteObjectclass();
@@ -225,9 +225,8 @@
    add(saveChanges, gbc);
    saveChanges.addActionListener(new ActionListener()
    {
      /**
       * {@inheritDoc}
       */
      /** {@inheritDoc} */
      @Override
      public void actionPerformed(ActionEvent ev)
      {
        ArrayList<LocalizableMessage> errors = new ArrayList<LocalizableMessage>();
@@ -246,9 +245,8 @@
    SuperiorObjectClassesChangedListener listener =
      new SuperiorObjectClassesChangedListener()
    {
      /**
       * {@inheritDoc}
       */
      /** {@inheritDoc} */
      @Override
      public void parentObjectClassesChanged(
          SuperiorObjectClassesChangedEvent ev)
      {
@@ -284,9 +282,8 @@
      new DoubleAddRemovePanel<AttributeType>(0, AttributeType.class);
    Comparator<AttributeType> comparator = new Comparator<AttributeType>()
    {
      /**
       * {@inheritDoc}
       */
      /** {@inheritDoc} */
      @Override
      public int compare(AttributeType attr1, AttributeType attr2)
      {
        return attr1.getNameOrOID().toLowerCase().compareTo(
@@ -385,9 +382,8 @@
    add(labels, comps, inlineHelps, p, gbc1);
    ChangeListener changeListener = new ChangeListener()
    {
      /**
       * {@inheritDoc}
       */
      /** {@inheritDoc} */
      @Override
      public void stateChanged(ChangeEvent e)
      {
        p.setVisible(expander.isSelected());
@@ -399,25 +395,22 @@
    DocumentListener docListener = new DocumentListener()
    {
      /**
       * {@inheritDoc}
       */
      /** {@inheritDoc} */
      @Override
      public void insertUpdate(DocumentEvent ev)
      {
        checkEnableSaveChanges();
      }
      /**
       * {@inheritDoc}
       */
      /** {@inheritDoc} */
      @Override
      public void removeUpdate(DocumentEvent ev)
      {
        checkEnableSaveChanges();
      }
      /**
       * {@inheritDoc}
       */
      /** {@inheritDoc} */
      @Override
      public void changedUpdate(DocumentEvent arg0)
      {
        checkEnableSaveChanges();
@@ -431,6 +424,7 @@
    ActionListener actionListener = new ActionListener()
    {
      @Override
      public void actionPerformed(ActionEvent ev)
      {
        checkEnableSaveChanges();
@@ -441,23 +435,20 @@
    ListDataListener dataListener = new ListDataListener()
    {
      /**
       * {@inheritDoc}
       */
      /** {@inheritDoc} */
      @Override
      public void contentsChanged(ListDataEvent e)
      {
        checkEnableSaveChanges();
      }
      /**
       * {@inheritDoc}
       */
      /** {@inheritDoc} */
      @Override
      public void intervalAdded(ListDataEvent e)
      {
        checkEnableSaveChanges();
      }
      /**
       * {@inheritDoc}
       */
      /** {@inheritDoc} */
      @Override
      public void intervalRemoved(ListDataEvent e)
      {
        checkEnableSaveChanges();
@@ -552,7 +543,7 @@
    }
    origin.setText(sOrigin);
    String sFile = oc.getSchemaFile();
    String sFile = getSchemaFile(oc);
    if (sFile == null)
    {
      sFile = "";
@@ -573,9 +564,8 @@
    ignoreChangeEvents = false;
  }
  /**
   * {@inheritDoc}
   */
  /** {@inheritDoc} */
  @Override
  public void configurationChanged(ConfigurationChangeEvent ev)
  {
    final ServerDescriptor desc = ev.getNewDescriptor();
@@ -616,9 +606,8 @@
    }
    SwingUtilities.invokeLater(new Runnable()
    {
      /**
       * {@inheritDoc}
       */
      /** {@inheritDoc} */
      @Override
      public void run()
      {
        delete.setEnabled(!authenticationRequired(desc)
@@ -638,17 +627,15 @@
    });
  }
  /**
   * {@inheritDoc}
   */
  /** {@inheritDoc} */
  @Override
  public boolean mustCheckUnsavedChanges()
  {
    return saveChanges.isEnabled();
  }
  /**
   * {@inheritDoc}
   */
  /** {@inheritDoc} */
  @Override
  public UnsavedChangesDialog.Result checkUnsavedChanges()
  {
    UnsavedChangesDialog.Result result;
@@ -674,17 +661,15 @@
    return result;
  }
  /**
   * {@inheritDoc}
   */
  /** {@inheritDoc} */
  @Override
  public Component getPreferredFocusComponent()
  {
    return name;
  }
  /**
   * {@inheritDoc}
   */
  /** {@inheritDoc} */
  @Override
  public void okClicked()
  {
  }
@@ -1111,11 +1096,11 @@
      if (sel != null)
      {
        ArrayList<Integer> indexes = new ArrayList<Integer>();
        for (int j=0; j<sel.length; j++)
        for (int element : sel)
        {
          if (sel[j] < lists[i].getModel().getSize())
          if (element < lists[i].getModel().getSize())
          {
            indexes.add(sel[j]);
            indexes.add(element);
          }
        }
        int[] newSelection = new int[indexes.size()];
@@ -1210,9 +1195,8 @@
      defaultRenderer = attributes.getAvailableList().getCellRenderer();
    }
    /**
     * {@inheritDoc}
     */
    /** {@inheritDoc} */
    @Override
    public Component getListCellRendererComponent(JList list, Object value,
        int index, boolean isSelected, boolean cellHasFocus)
    {
opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/ui/StandardObjectClassPanel.java
@@ -60,6 +60,8 @@
import org.opends.server.types.ObjectClass;
import org.opends.server.types.Schema;
import static org.opends.server.types.CommonSchemaElements.*;
/**
 * The panel that displays a standard object class definition.
 *
@@ -103,32 +105,28 @@
    createLayout();
  }
  /**
   * {@inheritDoc}
   */
  /** {@inheritDoc} */
  @Override
  public LocalizableMessage getTitle()
  {
    return INFO_CTRL_PANEL_STANDARD_OBJECTCLASS_TITLE.get();
  }
  /**
   * {@inheritDoc}
   */
  /** {@inheritDoc} */
  @Override
  public Component getPreferredFocusComponent()
  {
    return requiredAttributes;
  }
  /**
   * {@inheritDoc}
   */
  /** {@inheritDoc} */
  @Override
  public void configurationChanged(ConfigurationChangeEvent ev)
  {
  }
  /**
   * {@inheritDoc}
   */
  /** {@inheritDoc} */
  @Override
  public void okClicked()
  {
  }
@@ -234,9 +232,8 @@
      final JList list = lists[i];
      MouseAdapter clickListener = new MouseAdapter()
      {
        /**
         * {@inheritDoc}
         */
        /** {@inheritDoc} */
        @Override
        public void mouseClicked(MouseEvent ev)
        {
          if (ev.getClickCount() == 1)
@@ -249,9 +246,8 @@
      KeyAdapter keyListener = new KeyAdapter()
      {
        /**
         * {@inheritDoc}
         */
        /** {@inheritDoc} */
        @Override
        public void keyTyped(KeyEvent ev)
        {
          if ((ev.getKeyChar() == KeyEvent.VK_SPACE) ||
@@ -273,7 +269,7 @@
  static LocalizableMessage getOrigin(CommonSchemaElements element)
  {
    LocalizableMessageBuilder returnValue = new LocalizableMessageBuilder();
    String fileName = element.getSchemaFile();
    String fileName = getSchemaFile(element);
    String xOrigin = Utilities.getOrigin(element);
    if (xOrigin != null)
    {
opendj3-server-dev/src/guitools/org/opends/guitools/controlpanel/util/Utilities.java
@@ -48,7 +48,6 @@
import java.util.Collection;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -126,6 +125,8 @@
import org.opends.server.util.ServerConstants;
import org.opends.server.util.StaticUtils;
import static org.opends.server.types.CommonSchemaElements.*;
/**
 * A static class that provides miscellaneous functions.
 */
@@ -2112,17 +2113,10 @@
  public static boolean isStandard(SchemaFileElement fileElement)
  {
    boolean isStandard = false;
    String fileName = fileElement.getSchemaFile();
    String fileName = getSchemaFile(fileElement);
    if (fileName != null)
    {
      for (String name : standardSchemaFileNames)
      {
        isStandard = fileName.equals(name);
        if (isStandard)
        {
          break;
        }
      }
      isStandard = contains(standardSchemaFileNames, fileName);
      if (!isStandard)
      {
        isStandard = fileName.toLowerCase().indexOf("-rfc") != -1;
@@ -2130,18 +2124,10 @@
    }
    else if (fileElement instanceof CommonSchemaElements)
    {
      CommonSchemaElements element = (CommonSchemaElements)fileElement;
      String xOrigin = getOrigin(element);
      String xOrigin = getOrigin(fileElement);
      if (xOrigin != null)
      {
        for (String name : standardSchemaOrigins)
        {
          isStandard = xOrigin.equals(name);
          if (isStandard)
          {
            break;
          }
        }
        isStandard = contains(standardSchemaOrigins, xOrigin);
        if (!isStandard)
        {
          isStandard = xOrigin.startsWith("RFC ") ||
@@ -2162,56 +2148,43 @@
  public static boolean isConfiguration(SchemaFileElement fileElement)
  {
    boolean isConfiguration = false;
    String fileName = fileElement.getSchemaFile();
    String fileName = getSchemaFile(fileElement);
    if (fileName != null)
    {
      for (String name : configurationSchemaFileNames)
      {
        isConfiguration = fileName.equals(name);
        if (isConfiguration)
        {
          break;
        }
      }
      isConfiguration = contains(configurationSchemaFileNames, fileName);
    }
    else if (fileElement instanceof CommonSchemaElements)
    {
      CommonSchemaElements element = (CommonSchemaElements)fileElement;
      String xOrigin = getOrigin(element);
      String xOrigin = getOrigin(fileElement);
      if (xOrigin != null)
      {
        for (String name : configurationSchemaOrigins)
        {
          isConfiguration = xOrigin.equals(name);
          if (isConfiguration)
          {
            break;
          }
        }
        isConfiguration = contains(configurationSchemaOrigins, xOrigin);
      }
    }
    return isConfiguration;
  }
  private static boolean contains(String[] names, String toFind)
  {
    for (String name : names)
    {
      if (toFind.equals(name))
      {
        return true;
      }
    }
    return false;
  }
  /**
   * Returns the origin of the provided schema element.
   * @param element the schema element.
   * @return the origin of the provided schema element.
   */
  public static String getOrigin(CommonSchemaElements element)
  public static String getOrigin(SchemaFileElement element)
  {
    String xOrigin = null;
    Iterable<String> it =
      element.getExtraProperty(ServerConstants.SCHEMA_PROPERTY_ORIGIN);
    if (it != null)
    {
      Iterator<String> iterator = it.iterator();
      if (iterator.hasNext())
      {
        xOrigin = iterator.next();
      }
    }
    return xOrigin;
    return CommonSchemaElements.getSingleValueProperty(
        element, ServerConstants.SCHEMA_PROPERTY_ORIGIN);
  }
  /**
opendj3-server-dev/src/server/org/opends/server/backends/SchemaBackend.java
@@ -97,6 +97,7 @@
import static org.opends.messages.SchemaMessages.*;
import static org.opends.server.config.ConfigConstants.*;
import static org.opends.server.schema.SchemaConstants.*;
import static org.opends.server.types.CommonSchemaElements.*;
import static org.opends.server.util.ServerConstants.*;
import static org.opends.server.util.StaticUtils.*;
@@ -753,7 +754,7 @@
          newValueSet.add(
              AttributeValues.create(attributeTypesType,
                  attrType.getDefinitionWithFileName()));
              getDefinitionWithFileName(attrType)));
        }
        catch (DirectoryException e)
        {
@@ -826,7 +827,7 @@
              value.getValue(), schema, false);
          oc = DirectoryServer.getObjectClass(oc.getOID());
          newValueSet.add(AttributeValues.create(
              objectClassesType, oc.getDefinitionWithFileName()));
              objectClassesType, getDefinitionWithFileName(oc)));
        }
        catch (DirectoryException e)
        {
@@ -1718,11 +1719,11 @@
    if (existingType == null)
    {
      schema.registerAttributeType(attributeType, false);
      String schemaFile = attributeType.getSchemaFile();
      String schemaFile = getSchemaFile(attributeType);
      if ((schemaFile == null) || (schemaFile.length() == 0))
      {
        schemaFile = FILE_USER_SCHEMA_ELEMENTS;
        attributeType.setSchemaFile(schemaFile);
        setSchemaFile(attributeType, schemaFile);
      }
      modifiedSchemaFiles.add(schemaFile);
@@ -1733,22 +1734,22 @@
      schema.registerAttributeType(attributeType, false);
      schema.rebuildDependentElements(existingType);
      if ((attributeType.getSchemaFile() == null) ||
          (attributeType.getSchemaFile().length() == 0))
      if ((getSchemaFile(attributeType) == null)
          || (getSchemaFile(attributeType).length() == 0))
      {
        String schemaFile = existingType.getSchemaFile();
        String schemaFile = getSchemaFile(existingType);
        if ((schemaFile == null) || (schemaFile.length() == 0))
        {
          schemaFile = FILE_USER_SCHEMA_ELEMENTS;
        }
        attributeType.setSchemaFile(schemaFile);
        setSchemaFile(attributeType, schemaFile);
        modifiedSchemaFiles.add(schemaFile);
      }
      else
      {
        String newSchemaFile = attributeType.getSchemaFile();
        String oldSchemaFile = existingType.getSchemaFile();
        String newSchemaFile = getSchemaFile(attributeType);
        String oldSchemaFile = getSchemaFile(existingType);
        if ((oldSchemaFile == null) || oldSchemaFile.equals(newSchemaFile))
        {
          modifiedSchemaFiles.add(newSchemaFile);
@@ -1929,7 +1930,7 @@
    // If we've gotten here, then it's OK to remove the attribute type from
    // the schema.
    schema.deregisterAttributeType(removeType);
    String schemaFile = removeType.getSchemaFile();
    String schemaFile = getSchemaFile(removeType);
    if (schemaFile != null)
    {
      modifiedSchemaFiles.add(schemaFile);
@@ -2047,11 +2048,11 @@
    if (existingClass == null)
    {
      schema.registerObjectClass(objectClass, false);
      String schemaFile = objectClass.getSchemaFile();
      String schemaFile = getSchemaFile(objectClass);
      if ((schemaFile == null) || (schemaFile.length() == 0))
      {
        schemaFile = FILE_USER_SCHEMA_ELEMENTS;
        objectClass.setSchemaFile(schemaFile);
        setSchemaFile(objectClass, schemaFile);
      }
      modifiedSchemaFiles.add(schemaFile);
@@ -2062,22 +2063,22 @@
      schema.registerObjectClass(objectClass, false);
      schema.rebuildDependentElements(existingClass);
      if ((objectClass.getSchemaFile() == null) ||
          (objectClass.getSchemaFile().length() == 0))
      if ((getSchemaFile(objectClass) == null)
          || (getSchemaFile(objectClass).length() == 0))
      {
        String schemaFile = existingClass.getSchemaFile();
        String schemaFile = getSchemaFile(existingClass);
        if ((schemaFile == null) || (schemaFile.length() == 0))
        {
          schemaFile = FILE_USER_SCHEMA_ELEMENTS;
        }
        objectClass.setSchemaFile(schemaFile);
        setSchemaFile(objectClass, schemaFile);
        modifiedSchemaFiles.add(schemaFile);
      }
      else
      {
        String newSchemaFile = objectClass.getSchemaFile();
        String oldSchemaFile = existingClass.getSchemaFile();
        String newSchemaFile = getSchemaFile(objectClass);
        String oldSchemaFile = getSchemaFile(existingClass);
        if ((oldSchemaFile == null) || oldSchemaFile.equals(newSchemaFile))
        {
          modifiedSchemaFiles.add(newSchemaFile);
@@ -2229,7 +2230,7 @@
    // If we've gotten here, then it's OK to remove the objectclass from the
    // schema.
    schema.deregisterObjectClass(removeClass);
    String schemaFile = removeClass.getSchemaFile();
    String schemaFile = getSchemaFile(removeClass);
    if (schemaFile != null)
    {
      modifiedSchemaFiles.add(schemaFile);
@@ -2350,11 +2351,11 @@
    if (existingNF == null)
    {
      schema.registerNameForm(nameForm, false);
      String schemaFile = nameForm.getSchemaFile();
      String schemaFile = getSchemaFile(nameForm);
      if ((schemaFile == null) || (schemaFile.length() == 0))
      {
        schemaFile = FILE_USER_SCHEMA_ELEMENTS;
        nameForm.setSchemaFile(schemaFile);
        setSchemaFile(nameForm, schemaFile);
      }
      modifiedSchemaFiles.add(schemaFile);
@@ -2365,22 +2366,22 @@
      schema.registerNameForm(nameForm, false);
      schema.rebuildDependentElements(existingNF);
      if ((nameForm.getSchemaFile() == null) ||
          (nameForm.getSchemaFile().length() == 0))
      if ((getSchemaFile(nameForm) == null) ||
          (getSchemaFile(nameForm).length() == 0))
      {
        String schemaFile = existingNF.getSchemaFile();
        String schemaFile = getSchemaFile(existingNF);
        if ((schemaFile == null) || (schemaFile.length() == 0))
        {
          schemaFile = FILE_USER_SCHEMA_ELEMENTS;
        }
        nameForm.setSchemaFile(schemaFile);
        setSchemaFile(nameForm, schemaFile);
        modifiedSchemaFiles.add(schemaFile);
      }
      else
      {
        String newSchemaFile = nameForm.getSchemaFile();
        String oldSchemaFile = existingNF.getSchemaFile();
        String newSchemaFile = getSchemaFile(nameForm);
        String oldSchemaFile = getSchemaFile(existingNF);
        if ((oldSchemaFile == null) || oldSchemaFile.equals(newSchemaFile))
        {
          modifiedSchemaFiles.add(newSchemaFile);
@@ -2494,7 +2495,7 @@
    // If we've gotten here, then it's OK to remove the name form from the
    // schema.
    schema.deregisterNameForm(removeNF);
    String schemaFile = removeNF.getSchemaFile();
    String schemaFile = getSchemaFile(removeNF);
    if (schemaFile != null)
    {
      modifiedSchemaFiles.add(schemaFile);
@@ -2668,11 +2669,11 @@
    if (existingDCR == null)
    {
      schema.registerDITContentRule(ditContentRule, false);
      String schemaFile = ditContentRule.getSchemaFile();
      String schemaFile = getSchemaFile(ditContentRule);
      if ((schemaFile == null) || (schemaFile.length() == 0))
      {
        schemaFile = FILE_USER_SCHEMA_ELEMENTS;
        ditContentRule.setSchemaFile(schemaFile);
        setSchemaFile(ditContentRule, schemaFile);
      }
      modifiedSchemaFiles.add(schemaFile);
@@ -2683,22 +2684,22 @@
      schema.registerDITContentRule(ditContentRule, false);
      schema.rebuildDependentElements(existingDCR);
      if ((ditContentRule.getSchemaFile() == null) ||
          (ditContentRule.getSchemaFile().length() == 0))
      if ((getSchemaFile(ditContentRule) == null) ||
          (getSchemaFile(ditContentRule).length() == 0))
      {
        String schemaFile = existingDCR.getSchemaFile();
        String schemaFile = getSchemaFile(existingDCR);
        if ((schemaFile == null) || (schemaFile.length() == 0))
        {
          schemaFile = FILE_USER_SCHEMA_ELEMENTS;
        }
        ditContentRule.setSchemaFile(schemaFile);
        setSchemaFile(ditContentRule, schemaFile);
        modifiedSchemaFiles.add(schemaFile);
      }
      else
      {
        String newSchemaFile = ditContentRule.getSchemaFile();
        String oldSchemaFile = existingDCR.getSchemaFile();
        String newSchemaFile = getSchemaFile(ditContentRule);
        String oldSchemaFile = getSchemaFile(existingDCR);
        if ((oldSchemaFile == null) || oldSchemaFile.equals(newSchemaFile))
        {
          modifiedSchemaFiles.add(newSchemaFile);
@@ -2764,7 +2765,7 @@
    // just remove the DIT content rule now, and if it is added back later then
    // there still won't be any conflict.
    schema.deregisterDITContentRule(removeDCR);
    String schemaFile = removeDCR.getSchemaFile();
    String schemaFile = getSchemaFile(removeDCR);
    if (schemaFile != null)
    {
      modifiedSchemaFiles.add(schemaFile);
@@ -2889,11 +2890,11 @@
    if (existingDSR == null)
    {
      schema.registerDITStructureRule(ditStructureRule, false);
      String schemaFile = ditStructureRule.getSchemaFile();
      String schemaFile = getSchemaFile(ditStructureRule);
      if ((schemaFile == null) || (schemaFile.length() == 0))
      {
        schemaFile = FILE_USER_SCHEMA_ELEMENTS;
        ditStructureRule.setSchemaFile(schemaFile);
        setSchemaFile(ditStructureRule, schemaFile);
      }
      modifiedSchemaFiles.add(schemaFile);
@@ -2904,22 +2905,22 @@
      schema.registerDITStructureRule(ditStructureRule, false);
      schema.rebuildDependentElements(existingDSR);
      if ((ditStructureRule.getSchemaFile() == null) ||
          (ditStructureRule.getSchemaFile().length() == 0))
      if ((getSchemaFile(ditStructureRule) == null) ||
          (getSchemaFile(ditStructureRule).length() == 0))
      {
        String schemaFile = existingDSR.getSchemaFile();
        String schemaFile = getSchemaFile(existingDSR);
        if ((schemaFile == null) || (schemaFile.length() == 0))
        {
          schemaFile = FILE_USER_SCHEMA_ELEMENTS;
        }
        ditStructureRule.setSchemaFile(schemaFile);
        setSchemaFile(ditStructureRule, schemaFile);
        modifiedSchemaFiles.add(schemaFile);
      }
      else
      {
        String newSchemaFile = ditStructureRule.getSchemaFile();
        String oldSchemaFile = existingDSR.getSchemaFile();
        String newSchemaFile = getSchemaFile(ditStructureRule);
        String oldSchemaFile = getSchemaFile(existingDSR);
        if ((oldSchemaFile == null) || oldSchemaFile.equals(newSchemaFile))
        {
          modifiedSchemaFiles.add(newSchemaFile);
@@ -3039,7 +3040,7 @@
    // If we've gotten here, then it's OK to remove the DIT structure rule from
    // the schema.
    schema.deregisterDITStructureRule(removeDSR);
    String schemaFile = removeDSR.getSchemaFile();
    String schemaFile = getSchemaFile(removeDSR);
    if (schemaFile != null)
    {
      modifiedSchemaFiles.add(schemaFile);
@@ -3149,11 +3150,11 @@
    if (existingMRU == null)
    {
      schema.registerMatchingRuleUse(matchingRuleUse, false);
      String schemaFile = matchingRuleUse.getSchemaFile();
      String schemaFile = getSchemaFile(matchingRuleUse);
      if ((schemaFile == null) || (schemaFile.length() == 0))
      {
        schemaFile = FILE_USER_SCHEMA_ELEMENTS;
        matchingRuleUse.setSchemaFile(schemaFile);
        setSchemaFile(matchingRuleUse, schemaFile);
      }
      modifiedSchemaFiles.add(schemaFile);
@@ -3164,22 +3165,22 @@
      schema.registerMatchingRuleUse(matchingRuleUse, false);
      schema.rebuildDependentElements(existingMRU);
      if ((matchingRuleUse.getSchemaFile() == null) ||
          (matchingRuleUse.getSchemaFile().length() == 0))
      if ((getSchemaFile(matchingRuleUse) == null) ||
          (getSchemaFile(matchingRuleUse).length() == 0))
      {
        String schemaFile = existingMRU.getSchemaFile();
        String schemaFile = getSchemaFile(existingMRU);
        if ((schemaFile == null) || (schemaFile.length() == 0))
        {
          schemaFile = FILE_USER_SCHEMA_ELEMENTS;
        }
        matchingRuleUse.setSchemaFile(schemaFile);
        setSchemaFile(matchingRuleUse, schemaFile);
        modifiedSchemaFiles.add(schemaFile);
      }
      else
      {
        String newSchemaFile = matchingRuleUse.getSchemaFile();
        String oldSchemaFile = existingMRU.getSchemaFile();
        String newSchemaFile = getSchemaFile(matchingRuleUse);
        String oldSchemaFile = getSchemaFile(existingMRU);
        if ((oldSchemaFile == null) || oldSchemaFile.equals(newSchemaFile))
        {
          modifiedSchemaFiles.add(newSchemaFile);
@@ -3246,7 +3247,7 @@
    // just remove the DIT content rule now, and if it is added back later then
    // there still won't be any conflict.
    schema.deregisterMatchingRuleUse(removeMRU);
    String schemaFile = removeMRU.getSchemaFile();
    String schemaFile = getSchemaFile(removeMRU);
    if (schemaFile != null)
    {
      modifiedSchemaFiles.add(schemaFile);
@@ -3298,11 +3299,11 @@
    if (existingLSD == null)
    {
      schema.registerLdapSyntaxDescription(ldapSyntaxDesc, false);
      String schemaFile = ldapSyntaxDesc.getSchemaFile();
      String schemaFile = getSchemaFile(ldapSyntaxDesc);
      if ((schemaFile == null) || (schemaFile.length() == 0))
      {
        schemaFile = FILE_USER_SCHEMA_ELEMENTS;
        ldapSyntaxDesc.setSchemaFile(schemaFile);
        setSchemaFile(ldapSyntaxDesc, schemaFile);
      }
      modifiedSchemaFiles.add(schemaFile);
@@ -3313,22 +3314,22 @@
      schema.registerLdapSyntaxDescription(ldapSyntaxDesc, false);
      schema.rebuildDependentElements(existingLSD);
      if ((ldapSyntaxDesc.getSchemaFile() == null) ||
          (ldapSyntaxDesc.getSchemaFile().length() == 0))
      if ((getSchemaFile(ldapSyntaxDesc) == null) ||
          (getSchemaFile(ldapSyntaxDesc).length() == 0))
      {
        String schemaFile = ldapSyntaxDesc.getSchemaFile();
        String schemaFile = getSchemaFile(ldapSyntaxDesc);
        if ((schemaFile == null) || (schemaFile.length() == 0))
        {
          schemaFile = FILE_USER_SCHEMA_ELEMENTS;
        }
        ldapSyntaxDesc.setSchemaFile(schemaFile);
        setSchemaFile(ldapSyntaxDesc, schemaFile);
        modifiedSchemaFiles.add(schemaFile);
      }
      else
      {
        String newSchemaFile = ldapSyntaxDesc.getSchemaFile();
        String oldSchemaFile = existingLSD.getSchemaFile();
        String newSchemaFile = getSchemaFile(ldapSyntaxDesc);
        String oldSchemaFile = getSchemaFile(existingLSD);
        if ((oldSchemaFile == null) || oldSchemaFile.equals(newSchemaFile))
        {
          modifiedSchemaFiles.add(newSchemaFile);
@@ -3365,7 +3366,7 @@
    }
    schema.deregisterLdapSyntaxDescription(removeLSD);
    String schemaFile = removeLSD.getSchemaFile();
    String schemaFile = getSchemaFile(removeLSD);
    if (schemaFile != null)
    {
      modifiedSchemaFiles.add(schemaFile);
@@ -3451,7 +3452,7 @@
    for (LDAPSyntaxDescription ldapSyntax :
                                   schema.getLdapSyntaxDescriptions().values())
    {
      if(schemaFile.equals(ldapSyntax.getSchemaFile()))
      if (schemaFile.equals(getSchemaFile(ldapSyntax)))
      {
        values.add(AttributeValues.create(ldapSyntaxesType,
                ldapSyntax.getDefinition()));
@@ -3474,7 +3475,7 @@
    values = new LinkedHashSet<AttributeValue>();
    for (AttributeType at : schema.getAttributeTypes().values())
    {
      if (schemaFile.equals(at.getSchemaFile()))
      if (schemaFile.equals(getSchemaFile(at)))
      {
        addAttrTypeToSchemaFile(schema, schemaFile, at, values, addedTypes, 0);
      }
@@ -3497,7 +3498,7 @@
    values = new LinkedHashSet<AttributeValue>();
    for (ObjectClass oc : schema.getObjectClasses().values())
    {
      if (schemaFile.equals(oc.getSchemaFile()))
      if (schemaFile.equals(getSchemaFile(oc)))
      {
        addObjectClassToSchemaFile(schema, schemaFile, oc, values, addedClasses,
                                   0);
@@ -3522,7 +3523,7 @@
    {
      for(NameForm nf : forms)
      {
        if (schemaFile.equals(nf.getSchemaFile()))
        if (schemaFile.equals(getSchemaFile(nf)))
        {
          values.add(AttributeValues.create(
              nameFormsType, nf.getDefinition()));
@@ -3546,7 +3547,7 @@
    values = new LinkedHashSet<AttributeValue>();
    for (DITContentRule dcr : schema.getDITContentRules().values())
    {
      if (schemaFile.equals(dcr.getSchemaFile()))
      if (schemaFile.equals(getSchemaFile(dcr)))
      {
        values.add(AttributeValues.create(ditContentRulesType,
                                      dcr.getDefinition()));
@@ -3570,7 +3571,7 @@
    values = new LinkedHashSet<AttributeValue>();
    for (DITStructureRule dsr : schema.getDITStructureRulesByID().values())
    {
      if (schemaFile.equals(dsr.getSchemaFile()))
      if (schemaFile.equals(getSchemaFile(dsr)))
      {
        addDITStructureRuleToSchemaFile(schema, schemaFile, dsr, values,
                                        addedDSRs, 0);
@@ -3593,7 +3594,7 @@
    values = new LinkedHashSet<AttributeValue>();
    for (MatchingRuleUse mru : schema.getMatchingRuleUses().values())
    {
      if (schemaFile.equals(mru.getSchemaFile()))
      if (schemaFile.equals(getSchemaFile(mru)))
      {
        values.add(AttributeValues.create(matchingRuleUsesType,
                                      mru.getDefinition()));
@@ -3672,7 +3673,7 @@
    AttributeType superiorType = attributeType.getSuperiorType();
    if ((superiorType != null) &&
        schemaFile.equals(superiorType.getSchemaFile()) &&
        schemaFile.equals(getSchemaFile(superiorType)) &&
        (! addedTypes.contains(superiorType)))
    {
      addAttrTypeToSchemaFile(schema, schemaFile, superiorType, values,
@@ -3723,7 +3724,7 @@
    for(ObjectClass superiorClass : objectClass.getSuperiorClasses())
    {
      if (schemaFile.equals(superiorClass.getSchemaFile()) &&
      if (schemaFile.equals(getSchemaFile(superiorClass)) &&
          (! addedClasses.contains(superiorClass)))
      {
        addObjectClassToSchemaFile(schema, schemaFile, superiorClass, values,
@@ -3774,7 +3775,7 @@
    for (DITStructureRule dsr : ditStructureRule.getSuperiorRules())
    {
      if (schemaFile.equals(dsr.getSchemaFile()) && (! addedDSRs.contains(dsr)))
      if (schemaFile.equals(getSchemaFile(dsr)) && (! addedDSRs.contains(dsr)))
      {
        addDITStructureRuleToSchemaFile(schema, schemaFile, dsr, values,
                                        addedDSRs, depth+1);
@@ -4363,7 +4364,7 @@
          // Parse the attribute type.
          AttributeType attrType = AttributeTypeSyntax.decodeAttributeType(
              v.getValue(), schema, false);
          String schemaFile = attrType.getSchemaFile();
          String schemaFile = getSchemaFile(attrType);
          if ((schemaFile != null) &&
              (schemaFile.equals(CONFIG_SCHEMA_ELEMENTS_FILE)))
          {
@@ -4410,7 +4411,7 @@
    for (AttributeType removeType : currentAttrTypes.values())
    {
      String schemaFile = removeType.getSchemaFile();
      String schemaFile = getSchemaFile(removeType);
      if ((schemaFile != null) &&
           ((schemaFile.equals(CONFIG_SCHEMA_ELEMENTS_FILE)) ||
            (schemaFile.equals(CORE_SCHEMA_ELEMENTS_FILE))) )
@@ -4471,7 +4472,7 @@
          // appear in the new config schema.
          ObjectClass newObjectClass = ObjectClassSyntax.decodeObjectClass(
              v.getValue(), newSchema, true);
          String schemaFile = newObjectClass.getSchemaFile();
          String schemaFile = getSchemaFile(newObjectClass);
          if ((schemaFile != null) &&
              (schemaFile.equals(CONFIG_SCHEMA_ELEMENTS_FILE)))
          {
@@ -4523,7 +4524,7 @@
    for (ObjectClass removeClass : currentObjectClasses.values())
    {
      String schemaFile = removeClass.getSchemaFile();
      String schemaFile = getSchemaFile(removeClass);
      if ((schemaFile != null) &&
          (schemaFile.equals(CONFIG_SCHEMA_ELEMENTS_FILE)))
      {
opendj3-server-dev/src/server/org/opends/server/core/SchemaConfigManager.java
@@ -45,6 +45,7 @@
import static org.opends.messages.ConfigMessages.*;
import static org.opends.server.config.ConfigConstants.*;
import static org.opends.server.schema.SchemaConstants.*;
import static org.opends.server.types.CommonSchemaElements.*;
import static org.opends.server.util.ServerConstants.*;
import static org.opends.server.util.StaticUtils.*;
@@ -754,9 +755,8 @@
          {
            syntaxDescription = LDAPSyntaxDescriptionSyntax.decodeLDAPSyntax(
                    v.getValue(),schema,false);
            syntaxDescription.setExtraProperty(
                    SCHEMA_PROPERTY_FILENAME, (String) null);
            syntaxDescription.setSchemaFile(schemaFile);
            setExtraProperty(syntaxDescription, SCHEMA_PROPERTY_FILENAME, null);
            setSchemaFile(syntaxDescription, schemaFile);
          }
          catch (DirectoryException de)
          {
@@ -841,8 +841,8 @@
          {
            attrType = AttributeTypeSyntax.decodeAttributeType(v.getValue(),
                                                          schema, false);
            attrType.setExtraProperty(SCHEMA_PROPERTY_FILENAME, (String) null);
            attrType.setSchemaFile(schemaFile);
            setExtraProperty(attrType, SCHEMA_PROPERTY_FILENAME, null);
            setSchemaFile(attrType, schemaFile);
          }
          catch (DirectoryException de)
          {
@@ -923,8 +923,8 @@
          {
            oc =
              ObjectClassSyntax.decodeObjectClass(v.getValue(), schema, false);
            oc.setExtraProperty(SCHEMA_PROPERTY_FILENAME, (String) null);
            oc.setSchemaFile(schemaFile);
            setExtraProperty(oc, SCHEMA_PROPERTY_FILENAME, null);
            setSchemaFile(oc, schemaFile);
          }
          catch (DirectoryException de)
          {
@@ -1008,7 +1008,7 @@
          {
            nf = NameFormSyntax.decodeNameForm(v.getValue(), schema, false);
            nf.getExtraProperties().remove(SCHEMA_PROPERTY_FILENAME);
            nf.setSchemaFile(schemaFile);
            setSchemaFile(nf, schemaFile);
          }
          catch (DirectoryException de)
          {
@@ -1090,7 +1090,7 @@
            dcr = DITContentRuleSyntax.decodeDITContentRule(
                v.getValue(), schema, false);
            dcr.getExtraProperties().remove(SCHEMA_PROPERTY_FILENAME);
            dcr.setSchemaFile(schemaFile);
            setSchemaFile(dcr, schemaFile);
          }
          catch (DirectoryException de)
          {
@@ -1173,7 +1173,7 @@
            dsr = DITStructureRuleSyntax.decodeDITStructureRule(
                v.getValue(), schema, false);
            dsr.getExtraProperties().remove(SCHEMA_PROPERTY_FILENAME);
            dsr.setSchemaFile(schemaFile);
            setSchemaFile(dsr, schemaFile);
          }
          catch (DirectoryException de)
          {
@@ -1256,7 +1256,7 @@
            mru = MatchingRuleUseSyntax.decodeMatchingRuleUse(
                            v.getValue(), schema, false);
            mru.getExtraProperties().remove(SCHEMA_PROPERTY_FILENAME);
            mru.setSchemaFile(schemaFile);
            setSchemaFile(mru, schemaFile);
          }
          catch (DirectoryException de)
          {
opendj3-server-dev/src/server/org/opends/server/types/AttributeType.java
@@ -31,7 +31,6 @@
import java.util.Map;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.schema.AttributeUsage;
import org.opends.server.api.ApproximateMatchingRule;
import org.opends.server.api.AttributeSyntax;
@@ -39,7 +38,6 @@
import org.opends.server.api.OrderingMatchingRule;
import org.opends.server.api.SubstringMatchingRule;
import org.opends.server.core.DirectoryServer;
import org.opends.server.schema.AttributeTypeSyntax;
import static org.forgerock.util.Reject.*;
import static org.opends.server.util.ServerConstants.*;
@@ -66,7 +64,7 @@
     mayInvoke=true)
public final class AttributeType
       extends CommonSchemaElements
       implements SchemaFileElement, Comparable<AttributeType>
       implements Comparable<AttributeType>
{
  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
@@ -404,43 +402,6 @@
    return definition;
  }
  /**
   * Retrieves the definition string used to create this attribute
   * type and including the X-SCHEMA-FILE extension.
   *
   * @return  The definition string used to create this attribute
   *          type including the X-SCHEMA-FILE extension.
   */
  public String getDefinitionWithFileName()
  {
    if (getSchemaFile() != null)
    {
      int pos = definition.lastIndexOf(')');
      String defStr = definition.substring(0, pos).trim() + " " +
                      SCHEMA_PROPERTY_FILENAME + " '" +
                      getSchemaFile() + "' )";
      return defStr;
    }
    else
      return definition;
  }
  /**
   * {@inheritDoc}
   */
  @Override
  public AttributeType recreateFromDefinition(Schema schema)
         throws DirectoryException
  {
    ByteString value  = ByteString.valueOf(definition);
    AttributeType at =
         AttributeTypeSyntax.decodeAttributeType(value, schema,
                                              false);
    at.setSchemaFile(getSchemaFile());
    at.mayHaveSubordinateTypes = mayHaveSubordinateTypes;
    return at;
  }
  /**
opendj3-server-dev/src/server/org/opends/server/types/CommonSchemaElements.java
@@ -71,7 +71,7 @@
     mayInstantiate=false,
     mayExtend=false,
     mayInvoke=true)
public abstract class CommonSchemaElements {
public abstract class CommonSchemaElements implements SchemaFileElement {
  // Indicates whether this definition is declared "obsolete".
  private final boolean isObsolete;
@@ -361,18 +361,31 @@
   * Retrieves the name of the schema file that contains the
   * definition for this schema definition.
   *
   * @param elem The element where to get the schema file from
   * @return The name of the schema file that contains the definition
   *         for this schema definition, or <code>null</code> if it
   *         is not known or if it is not stored in any schema file.
   */
  public final String getSchemaFile() {
  public static String getSchemaFile(SchemaFileElement elem)
  {
    return getSingleValueProperty(elem, SCHEMA_PROPERTY_FILENAME);
  }
    List<String> values = extraProperties
        .get(SCHEMA_PROPERTY_FILENAME);
  /**
   * Retrieves the name of a single value property for this schema element.
   *
   * @param elem The element where to get the single value property from
   * @param propertyName The name of the property to get
   * @return The single value for this property, or <code>null</code> if it
   *         is this property is not set.
   */
  public static String getSingleValueProperty(SchemaFileElement elem,
      String propertyName)
  {
    List<String> values = elem.getExtraProperties().get(propertyName);
    if (values != null && !values.isEmpty()) {
      return values.get(0);
    }
    return null;
  }
@@ -385,12 +398,13 @@
   * overwritten.  If the provided schema file value is {@code null},
   * then any existing schema file definition will be removed.
   *
   * @param elem The element where to set the schema file
   * @param  schemaFile  The name of the schema file that contains the
   *                     definition for this schema element.
   */
  public final void setSchemaFile(String schemaFile) {
    setExtraProperty(SCHEMA_PROPERTY_FILENAME, schemaFile);
  public static void setSchemaFile(SchemaFileElement elem, String schemaFile)
  {
    setExtraProperty(elem, SCHEMA_PROPERTY_FILENAME, schemaFile);
  }
@@ -421,34 +435,11 @@
  /**
   * Retrieves an iterable over the names of "extra" properties
   * associated with this schema definition.
   *
   * @return Returns an iterable over the names of "extra" properties
   *         associated with this schema definition.
   */
  public final Iterable<String> getExtraPropertyNames() {
    return extraProperties.keySet();
  }
  /**
   * Retrieves an iterable over the value(s) of the specified "extra"
   * property for this schema definition.
   *
   * @param name
   *          The name of the "extra" property for which to retrieve
   *          the value(s).
   * @return Returns an iterable over the value(s) of the specified
   *         "extra" property for this schema definition, or
   *         <code>null</code> if no such property is defined.
   */
  public final Iterable<String> getExtraProperty(String name) {
    return extraProperties.get(name);
  /** {@inheritDoc} */
  @Override
  public final Map<String, List<String>> getExtraProperties()
  {
    return extraProperties;
  }
@@ -459,26 +450,28 @@
   * will be overwritten.  If the value is {@code null}, then any
   * existing property with the given name will be removed.
   *
   * @param elem The element where to set the extra property
   * @param  name   The name for the "extra" property.  It must not be
   *                {@code null}.
   * @param  value  The value for the "extra" property.  If it is
   *                {@code null}, then any existing definition will be
   *                removed.
   */
  public final void setExtraProperty(String name, String value) {
  public static final void setExtraProperty(SchemaFileElement elem,
      String name, String value)
  {
    ifNull(name);
    if (value == null)
    {
      extraProperties.remove(name);
      elem.getExtraProperties().remove(name);
    }
    else
    {
      LinkedList<String> values = new LinkedList<String>();
      values.add(value);
      extraProperties.put(name, values);
      elem.getExtraProperties().put(name, values);
    }
  }
@@ -667,4 +660,25 @@
   *          The buffer to which the information should be appended.
   */
  protected abstract void toStringContent(StringBuilder buffer);
  /**
   * Retrieves the definition string used to create this attribute
   * type and including the X-SCHEMA-FILE extension.
   *
   * @param elem The element where to get definition from
   * @return  The definition string used to create this attribute
   *          type including the X-SCHEMA-FILE extension.
   */
  public static String getDefinitionWithFileName(SchemaFileElement elem)
  {
    final String schemaFile = getSchemaFile(elem);
    final String definition = elem.getDefinition();
    if (schemaFile != null)
    {
      int pos = definition.lastIndexOf(')');
      return definition.substring(0, pos).trim() + " "
          + SCHEMA_PROPERTY_FILENAME + " '" + schemaFile + "' )";
    }
    return definition;
  }
}
opendj3-server-dev/src/server/org/opends/server/types/DITContentRule.java
@@ -29,14 +29,11 @@
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ByteString;
import org.opends.server.schema.DITContentRuleSyntax;
import static org.forgerock.util.Reject.*;
import static org.opends.server.util.ServerConstants.*;
@@ -243,23 +240,6 @@
  /**
   * {@inheritDoc}
   */
  @Override
  public DITContentRule recreateFromDefinition(Schema schema)
         throws DirectoryException
  {
    ByteString value  = ByteString.valueOf(definition);
    DITContentRule dcr =
         DITContentRuleSyntax.decodeDITContentRule(value, schema,
                                                   false);
    dcr.setSchemaFile(getSchemaFile());
    return dcr;
  }
  /**
   * Retrieves the structural objectclass for this DIT content rule.
   *
   * @return  The structural objectclass for this DIT content rule.
@@ -327,44 +307,6 @@
  /**
   * Retrieves the name of the schema file that contains the
   * definition for this DIT content rule.
   *
   * @return  The name of the schema file that contains the definition
   *          for this DIT content rule, or {@code null} if it is not
   *          known or if it is not stored in any schema file.
   */
  @Override
  public String getSchemaFile()
  {
    List<String> values =
         extraProperties.get(SCHEMA_PROPERTY_FILENAME);
    if ((values == null) || values.isEmpty())
    {
      return null;
    }
    return values.get(0);
  }
  /**
   * Specifies the name of the schema file that contains the
   * definition for this DIT content rule.
   *
   * @param  schemaFile  The name of the schema file that contains the
   *                     definition for this DIT content rule.
   */
  @Override
  public void setSchemaFile(String schemaFile)
  {
    setExtraProperty(SCHEMA_PROPERTY_FILENAME, schemaFile);
  }
  /**
   * Retrieves the set of auxiliary objectclasses that may be used for
   * entries associated with this DIT content rule.
   *
@@ -494,6 +436,7 @@
   *          properties that may be associated with this DIT content
   *          rule and the value for that property.
   */
  @Override
  public Map<String,List<String>> getExtraProperties()
  {
    return extraProperties;
@@ -502,34 +445,6 @@
  /**
   * Specifies the provided "extra" property for this DIT content
   * rule.
   *
   * @param  name   The name for the "extra" property.  It must not be
   *                {@code null}.
   * @param  value  The value for the "extra" property, or
   *                {@code null} if the property is to be removed.
   */
  private void setExtraProperty(String name, String value)
  {
    ifNull(name);
    if (value == null)
    {
      extraProperties.remove(name);
    }
    else
    {
      LinkedList<String> values = new LinkedList<String>();
      values.add(value);
      extraProperties.put(name, values);
    }
  }
  /**
   * Indicates whether the provided object is equal to this DIT
   * content rule.  The object will be considered equal if it is a DIT
   * content rule for the same structural objectclass and the same
opendj3-server-dev/src/server/org/opends/server/types/DITStructureRule.java
@@ -29,14 +29,11 @@
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ByteString;
import org.opends.server.schema.DITStructureRuleSyntax;
import static org.forgerock.util.Reject.*;
import static org.opends.server.util.ServerConstants.*;
@@ -184,6 +181,7 @@
   * @return  The definition string used to create this DIT structure
   *          rule.
   */
  @Override
  public String getDefinition()
  {
    return definition;
@@ -192,22 +190,6 @@
  /**
   * {@inheritDoc}
   */
  public DITStructureRule recreateFromDefinition(Schema schema)
         throws DirectoryException
  {
    ByteString value  = ByteString.valueOf(definition);
    DITStructureRule dsr =
         DITStructureRuleSyntax.decodeDITStructureRule(value, schema,
                                                       false);
    dsr.setSchemaFile(getSchemaFile());
    return dsr;
  }
  /**
   * Retrieves the set of names that may be used to reference this DIT
   * structure rule.  The returned mapping will be between an all
   * lower-case form of the name and a name in the user-defined form
@@ -273,42 +255,6 @@
  /**
   * Retrieves the path to the schema file that contains the
   * definition for this DIT structure rule.
   *
   * @return  The path to the schema file that contains the definition
   *          for this DIT structure rule, or {@code null} if it
   *          is not known or if it is not stored in any schema file.
   */
  public String getSchemaFile()
  {
    List<String> values =
         extraProperties.get(SCHEMA_PROPERTY_FILENAME);
    if ((values == null) || values.isEmpty())
    {
      return null;
    }
    return values.get(0);
  }
  /**
   * Specifies the path to the schema file that contains the
   * definition for this DIT structure rule.
   *
   * @param  schemaFile  The path to the schema file that contains the
   *                     definition for this DIT structure rule.
   */
  public void setSchemaFile(String schemaFile)
  {
    setExtraProperty(SCHEMA_PROPERTY_FILENAME, schemaFile);
  }
  /**
   * Retrieves the description for this DIT structure rule.
   *
   * @return  The description for this DIT structure rule.
@@ -394,6 +340,7 @@
   *          properties that may be associated with this DIT
   *          structure rule and the value for that property.
   */
  @Override
  public Map<String,List<String>> getExtraProperties()
  {
    return extraProperties;
@@ -402,34 +349,6 @@
  /**
   * Specifies the provided "extra" property for this DIT structure
   * rule.
   *
   * @param  name   The name for the "extra" property.  It must not be
   *                {@code null}.
   * @param  value  The value for the "extra" property, or
   *                {@code null} if the property is to be removed.
   */
  private void setExtraProperty(String name, String value)
  {
    ifNull(name);
    if (value == null)
    {
      extraProperties.remove(name);
    }
    else
    {
      LinkedList<String> values = new LinkedList<String>();
      values.add(value);
      extraProperties.put(name, values);
    }
  }
  /**
   * Indicates whether the provided object is equal to this DIT
   * structure rule.  The object will be considered equal if it is a
   * DIT structure rule with the same OID as the current type.
@@ -439,6 +358,7 @@
   * @return  {@code true} if the provided object is equal to this
   *          attribute, or {@code false} if not.
   */
  @Override
  public boolean equals(Object o)
  {
    if (this == o)
@@ -462,6 +382,7 @@
   *
   * @return  The hash code for this DIT structure rule.
   */
  @Override
  public int hashCode()
  {
    return ruleID;
@@ -476,6 +397,7 @@
   * @return  The string representation of this attribute type in the
   *          form specified in RFC 2252.
   */
  @Override
  public String toString()
  {
    StringBuilder buffer = new StringBuilder();
opendj3-server-dev/src/server/org/opends/server/types/LDAPSyntaxDescription.java
@@ -28,16 +28,15 @@
package org.opends.server.types;
import org.forgerock.opendj.ldap.ByteString;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.opends.server.schema.LDAPSyntaxDescriptionSyntax;
import static org.opends.server.util.ServerConstants.*;
import static org.forgerock.util.Reject.*;
import static org.opends.server.util.ServerConstants.*;
@@ -145,6 +144,7 @@
   * @return  The definition string used to create this ldap syntax
     *            description.
   */
  @Override
  public String getDefinition()
  {
    return definition;
@@ -156,7 +156,7 @@
   * Retrieves the ldap syntax description syntax associated with
    * this ldap syntax.
   *
   * @return  The description syntax for this defition.
   * @return  The description syntax for this definition.
   */
  public LDAPSyntaxDescriptionSyntax getLdapSyntaxDescriptionSyntax()
  {
@@ -166,59 +166,6 @@
  /**
   * {@inheritDoc}
   */
  public LDAPSyntaxDescription recreateFromDefinition(Schema schema)
         throws DirectoryException
  {
    ByteString value  = ByteString.valueOf(definition);
    LDAPSyntaxDescription ls =
            LDAPSyntaxDescriptionSyntax.decodeLDAPSyntax(value,
            schema, false);
    ls.setSchemaFile(getSchemaFile());
    return ls;
  }
  /**
   * Retrieves the path to the schema file that contains the
   * definition for this ldap syntax description.
   *
   * @return  The path to the schema file that contains the
   *           definition for this ldap syntax description, or
   *           {@code null} if it is not known or if it is not stored
   *           in any schema file.
   */
  public String getSchemaFile()
  {
    List<String> values =
         extraProperties.get(SCHEMA_PROPERTY_FILENAME);
    if ((values == null) || values.isEmpty())
    {
      return null;
    }
    return values.get(0);
  }
  /**
   * Specifies the path to the schema file that contains the
   * definition for this ldap syntax description.
   *
   * @param  schemaFile  The path to the schema file that contains
   *                the definition for this ldap syntax description.
   */
  public void setSchemaFile(String schemaFile)
  {
    setExtraProperty(SCHEMA_PROPERTY_FILENAME, schemaFile);
  }
  /**
   * Retrieves the description for this ldap syntax description.
   *
   * @return  The description for this ldap syntax description, or
@@ -241,6 +188,7 @@
   *          properties that may be associated with this ldap syntax
   *          description and the value for that property.
   */
  @Override
  public Map<String,List<String>> getExtraProperties()
  {
    return extraProperties;
@@ -270,34 +218,6 @@
   * Specifies the provided "extra" property for this ldap syntax
   * description.
   *
   * @param  name   The name for the "extra" property.  It must not
   *                          be {@code null}.
   * @param  value  The value for the "extra" property, or
   *                {@code null} if the property is to be removed.
   */
  public void setExtraProperty(String name, String value)
  {
    ifNull(name);
    if (value == null)
    {
      extraProperties.remove(name);
    }
    else
    {
      LinkedList<String> values = new LinkedList<String>();
      values.add(value);
      extraProperties.put(name, values);
    }
  }
  /**
   * Specifies the provided "extra" property for this ldap syntax
   * description.
   *
   * @param  name    The name for the "extra" property.  It must not
   *                 be {@code null}.
   * @param  values  The set of value for the "extra" property, or
opendj3-server-dev/src/server/org/opends/server/types/MatchingRuleUse.java
@@ -29,15 +29,12 @@
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ByteString;
import org.opends.server.api.MatchingRule;
import org.opends.server.schema.MatchingRuleUseSyntax;
import static org.forgerock.util.Reject.*;
import static org.opends.server.util.ServerConstants.*;
@@ -184,6 +181,7 @@
   * @return  The definition string used to create this matching rule
   *          use.
   */
  @Override
  public String getDefinition()
  {
    return definition;
@@ -192,22 +190,6 @@
  /**
   * {@inheritDoc}
   */
  public MatchingRuleUse recreateFromDefinition(Schema schema)
         throws DirectoryException
  {
    ByteString value  = ByteString.valueOf(definition);
    MatchingRuleUse mru =
         MatchingRuleUseSyntax.decodeMatchingRuleUse(value, schema,
                                                     false);
    mru.setSchemaFile(getSchemaFile());
    return mru;
  }
  /**
   * Retrieves the matching rule for this matching rule use.
   *
   * @return  The matching rule for this matching rule use.
@@ -271,42 +253,6 @@
  /**
   * Retrieves the path to the schema file that contains the
   * definition for this matching rule use.
   *
   * @return  The path to the schema file that contains the definition
   *          for this matching rule use, or {@code null} if it is not
   *          known or if it is not stored in any schema file.
   */
  public String getSchemaFile()
  {
    List<String> values =
         extraProperties.get(SCHEMA_PROPERTY_FILENAME);
    if ((values == null) || values.isEmpty())
    {
      return null;
    }
    return values.get(0);
  }
  /**
   * Specifies the path to the schema file that contains the
   * definition for this matching rule use.
   *
   * @param  schemaFile  The path to the schema file that contains the
   *                     definition for this matching rule use.
   */
  public void setSchemaFile(String schemaFile)
  {
    setExtraProperty(SCHEMA_PROPERTY_FILENAME, schemaFile);
  }
  /**
   * Retrieves the description for this matching rule use.
   *
   * @return  The description for this matching rule use, or
@@ -373,6 +319,7 @@
   *          properties that may be associated with this matching
   *          rule use and the value for that property.
   */
  @Override
  public Map<String,List<String>> getExtraProperties()
  {
    return extraProperties;
@@ -381,34 +328,6 @@
  /**
   * Specifies the provided "extra" property for this matching rule
   * use.
   *
   * @param  name   The name for the "extra" property.  It must not be
   *                {@code null}.
   * @param  value  The value for the "extra" property, or
   *                {@code null} if the property is to be removed.
   */
  private void setExtraProperty(String name, String value)
  {
    ifNull(name);
    if (value == null)
    {
      extraProperties.remove(name);
    }
    else
    {
      LinkedList<String> values = new LinkedList<String>();
      values.add(value);
      extraProperties.put(name, values);
    }
  }
  /**
   * Indicates whether the provided object is equal to this matching
   * rule use.  The object will be considered equal if it is a
   * matching rule use with the same matching rule.
@@ -418,6 +337,7 @@
   * @return  {@code true} if the provided object is equal to this
   *          matching rule use, or {@code false} if not.
   */
  @Override
  public boolean equals(Object o)
  {
    if (this == o)
@@ -441,6 +361,7 @@
   *
   * @return  The hash code for this matching rule use.
   */
  @Override
  public int hashCode()
  {
    return matchingRule.hashCode();
@@ -455,6 +376,7 @@
   * @return  The string representation of this matching rule use in
   *          the form specified in RFC 2252.
   */
  @Override
  public String toString()
  {
    StringBuilder buffer = new StringBuilder();
opendj3-server-dev/src/server/org/opends/server/types/NameForm.java
@@ -29,14 +29,11 @@
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ByteString;
import org.opends.server.schema.NameFormSyntax;
import static org.forgerock.util.Reject.*;
import static org.opends.server.util.ServerConstants.*;
@@ -200,6 +197,7 @@
   *
   * @return  The definition string used to create this name form.
   */
  @Override
  public String getDefinition()
  {
    return definition;
@@ -208,20 +206,6 @@
  /**
   * {@inheritDoc}
   */
  public NameForm recreateFromDefinition(Schema schema)
         throws DirectoryException
  {
    ByteString value  = ByteString.valueOf(definition);
    NameForm nf = NameFormSyntax.decodeNameForm(value, schema, false);
    nf.setSchemaFile(getSchemaFile());
    return nf;
  }
  /**
   * Retrieves the set of names that may be used to reference this
   * name form.  The returned object will be a mapping between each
   * name in all lowercase characters and that name in a user-defined
@@ -313,42 +297,6 @@
  /**
   * Retrieves the path to the schema file that contains the
   * definition for this name form.
   *
   * @return  The path to the schema file that contains the definition
   *          for this name form, or {@code null} if it is not known
   *          or if it is not stored in any schema file.
   */
  public String getSchemaFile()
  {
    List<String> values =
         extraProperties.get(SCHEMA_PROPERTY_FILENAME);
    if ((values == null) || values.isEmpty())
    {
      return null;
    }
    return values.get(0);
  }
  /**
   * Specifies the path to the schema file that contains the
   * definition for this name form.
   *
   * @param  schemaFile  The path to the schema file that contains the
   *                     definition for this name form.
   */
  public void setSchemaFile(String schemaFile)
  {
    setExtraProperty(SCHEMA_PROPERTY_FILENAME, schemaFile);
  }
  /**
   * Retrieves the description for this name form.
   *
   * @return  The description for this name form, or {@code true} if
@@ -474,6 +422,7 @@
   *          properties that may be associated with this name form
   *          and the value for that property.
   */
  @Override
  public Map<String,List<String>> getExtraProperties()
  {
    return extraProperties;
@@ -482,33 +431,6 @@
  /**
   * Specifies the provided "extra" property for this name form.
   *
   * @param  name   The name for the "extra" property.  It must not be
   *                {@code null}.
   * @param  value  The value for the "extra" property, or
   *                {@code null} if the property is to be removed.
   */
  private void setExtraProperty(String name, String value)
  {
    ifNull(name);
    if (value == null)
    {
      extraProperties.remove(name);
    }
    else
    {
      LinkedList<String> values = new LinkedList<String>();
      values.add(value);
      extraProperties.put(name, values);
    }
  }
  /**
   * Indicates whether the provided object is equal to this name form.
   * The object will be considered equal if it is a name form with the
   * same OID as the current name form.
@@ -518,6 +440,7 @@
   * @return  {@code true} if the provided object is equal to this
   *          name form, or {@code true} if not.
   */
  @Override
  public boolean equals(Object o)
  {
    if (this == o)
@@ -541,6 +464,7 @@
   *
   * @return  The hash code for this name form.
   */
  @Override
  public int hashCode()
  {
    int oidLength = oid.length();
@@ -562,6 +486,7 @@
   * @return  The string representation of this name form in the form
   *          specified in RFC 2252.
   */
  @Override
  public String toString()
  {
    StringBuilder buffer = new StringBuilder();
opendj3-server-dev/src/server/org/opends/server/types/ObjectClass.java
@@ -36,9 +36,7 @@
import java.util.Set;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.schema.ObjectClassType;
import org.opends.server.schema.ObjectClassSyntax;
import static org.forgerock.util.Reject.*;
import static org.opends.server.util.ServerConstants.*;
@@ -65,7 +63,6 @@
     mayInvoke=true)
public final class ObjectClass
       extends CommonSchemaElements
       implements SchemaFileElement
{
  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
@@ -284,50 +281,11 @@
  /**
   * Retrieves the definition string used to create this objectclass
   * including the X-SCHEMA-FILE extension.
   *
   * @return  The definition string used to create this objectclass
   *          including the X-SCHEMA-FILE extension.
   */
  public String getDefinitionWithFileName()
  {
    if (getSchemaFile() != null)
    {
      int pos = definition.lastIndexOf(')');
      String defStr = definition.substring(0, pos).trim() + " " +
                      SCHEMA_PROPERTY_FILENAME + " '" +
                      getSchemaFile() + "' )";
      return defStr;
    }
    else
      return definition;
  }
  /**
   * {@inheritDoc}
   */
  @Override
  public ObjectClass recreateFromDefinition(Schema schema)
         throws DirectoryException
  {
    ByteString value  = ByteString.valueOf(definition);
    ObjectClass oc = ObjectClassSyntax.decodeObjectClass(value,
                                            schema, false);
    oc.setSchemaFile(getSchemaFile());
    return oc;
  }
  /**
   * Retrieves an unmodifiable view of the set of direct superior
   * classes for this objectclass.
   *
   * @return An unmodifiable view of the set of  direct superior
   *                classes for this objectlass,
   *                classes for this objectclass,
   */
  public Set<ObjectClass> getSuperiorClasses() {
    return superiorClasses;
opendj3-server-dev/src/server/org/opends/server/types/Schema.java
@@ -54,12 +54,19 @@
import org.opends.server.api.SubstringMatchingRule;
import org.opends.server.core.DirectoryServer;
import org.opends.server.core.SchemaConfigManager;
import org.opends.server.schema.AttributeTypeSyntax;
import org.opends.server.schema.DITContentRuleSyntax;
import org.opends.server.schema.DITStructureRuleSyntax;
import org.opends.server.schema.MatchingRuleUseSyntax;
import org.opends.server.schema.NameFormSyntax;
import org.opends.server.schema.ObjectClassSyntax;
import org.opends.server.schema.CaseIgnoreEqualityMatchingRule;
import org.opends.server.util.StaticUtils;
import static org.opends.messages.BackendMessages.*;
import static org.opends.messages.CoreMessages.*;
import static org.opends.server.config.ConfigConstants.*;
import static org.opends.server.types.CommonSchemaElements.*;
import static org.opends.server.util.ServerConstants.*;
import static org.opends.server.util.StaticUtils.*;
@@ -3232,7 +3239,7 @@
        if ((at.getSuperiorType() != null) &&
            at.getSuperiorType().equals(t))
        {
          AttributeType newAT = at.recreateFromDefinition(this);
          AttributeType newAT = recreateFromDefinition(at);
          deregisterAttributeType(at);
          registerAttributeType(newAT, true);
          rebuildDependentElements(at, depth+1);
@@ -3244,7 +3251,7 @@
        if (oc.getRequiredAttributes().contains(t) ||
            oc.getOptionalAttributes().contains(t))
        {
          ObjectClass newOC = oc.recreateFromDefinition(this);
          ObjectClass newOC = recreateFromDefinition(oc);
          deregisterObjectClass(oc);
          registerObjectClass(newOC, true);
          rebuildDependentElements(oc, depth+1);
@@ -3258,7 +3265,7 @@
          if (nf.getRequiredAttributes().contains(t) ||
              nf.getOptionalAttributes().contains(t))
          {
            NameForm newNF = nf.recreateFromDefinition(this);
            NameForm newNF = recreateFromDefinition(nf);
            deregisterNameForm(nf);
            registerNameForm(newNF, true);
            rebuildDependentElements(nf, depth+1);
@@ -3272,7 +3279,7 @@
            dcr.getOptionalAttributes().contains(t) ||
            dcr.getProhibitedAttributes().contains(t))
        {
          DITContentRule newDCR = dcr.recreateFromDefinition(this);
          DITContentRule newDCR = recreateFromDefinition(dcr);
          deregisterDITContentRule(dcr);
          registerDITContentRule(newDCR, true);
          rebuildDependentElements(dcr, depth+1);
@@ -3283,7 +3290,7 @@
      {
        if (mru.getAttributes().contains(t))
        {
          MatchingRuleUse newMRU = mru.recreateFromDefinition(this);
          MatchingRuleUse newMRU = recreateFromDefinition(mru);
          deregisterMatchingRuleUse(mru);
          registerMatchingRuleUse(newMRU, true);
          rebuildDependentElements(mru, depth+1);
@@ -3298,7 +3305,7 @@
      {
        if (oc.getSuperiorClasses().contains(c))
        {
          ObjectClass newOC = oc.recreateFromDefinition(this);
          ObjectClass newOC = recreateFromDefinition(oc);
          deregisterObjectClass(oc);
          registerObjectClass(newOC, true);
          rebuildDependentElements(oc, depth+1);
@@ -3312,7 +3319,7 @@
        {
          if (nf != null)
          {
            NameForm newNF = nf.recreateFromDefinition(this);
            NameForm newNF = recreateFromDefinition(nf);
            deregisterNameForm(nf);
            registerNameForm(newNF, true);
            rebuildDependentElements(nf, depth+1);
@@ -3325,7 +3332,7 @@
        if (dcr.getStructuralClass().equals(c) ||
            dcr.getAuxiliaryClasses().contains(c))
        {
          DITContentRule newDCR = dcr.recreateFromDefinition(this);
          DITContentRule newDCR = recreateFromDefinition(dcr);
          deregisterDITContentRule(dcr);
          registerDITContentRule(newDCR, true);
          rebuildDependentElements(dcr, depth+1);
@@ -3338,7 +3345,7 @@
      DITStructureRule dsr = ditStructureRulesByNameForm.get(n);
      if (dsr != null)
      {
        DITStructureRule newDSR = dsr.recreateFromDefinition(this);
        DITStructureRule newDSR = recreateFromDefinition(dsr);
        deregisterDITStructureRule(dsr);
        registerDITStructureRule(newDSR, true);
        rebuildDependentElements(dsr, depth+1);
@@ -3351,7 +3358,7 @@
      {
        if (dsr.getSuperiorRules().contains(d))
        {
          DITStructureRule newDSR = dsr.recreateFromDefinition(this);
          DITStructureRule newDSR = recreateFromDefinition(dsr);
          deregisterDITStructureRule(dsr);
          registerDITStructureRule(newDSR, true);
          rebuildDependentElements(dsr, depth+1);
@@ -3360,7 +3367,67 @@
    }
  }
  private AttributeType recreateFromDefinition(AttributeType attrType)
      throws DirectoryException
  {
    ByteString value = ByteString.valueOf(attrType.getDefinition());
    AttributeType copy =
        AttributeTypeSyntax.decodeAttributeType(value, this, false);
    setSchemaFile(copy, getSchemaFile(attrType));
    if (attrType.mayHaveSubordinateTypes())
    {
      copy.setMayHaveSubordinateTypes();
    }
    return copy;
  }
  private DITContentRule recreateFromDefinition(DITContentRule dcr)
      throws DirectoryException
  {
    ByteString value = ByteString.valueOf(dcr.getDefinition());
    DITContentRule copy =
        DITContentRuleSyntax.decodeDITContentRule(value, this, false);
    setSchemaFile(copy, getSchemaFile(dcr));
    return copy;
  }
  private DITStructureRule recreateFromDefinition(DITStructureRule dsr)
      throws DirectoryException
  {
    ByteString value = ByteString.valueOf(dsr.getDefinition());
    DITStructureRule copy =
        DITStructureRuleSyntax.decodeDITStructureRule(value, this, false);
    setSchemaFile(copy, getSchemaFile(dsr));
    return copy;
  }
  private MatchingRuleUse recreateFromDefinition(MatchingRuleUse mru)
      throws DirectoryException
  {
    ByteString value = ByteString.valueOf(mru.getDefinition());
    MatchingRuleUse copy =
        MatchingRuleUseSyntax.decodeMatchingRuleUse(value, this, false);
    setSchemaFile(copy, getSchemaFile(mru));
    return copy;
  }
  private NameForm recreateFromDefinition(NameForm nf)
      throws DirectoryException
  {
    ByteString value = ByteString.valueOf(nf.getDefinition());
    NameForm copy = NameFormSyntax.decodeNameForm(value, this, false);
    setSchemaFile(copy, getSchemaFile(nf));
    return copy;
  }
  private ObjectClass recreateFromDefinition(ObjectClass oc)
      throws DirectoryException
  {
    ByteString value = ByteString.valueOf(oc.getDefinition());
    ObjectClass copy = ObjectClassSyntax.decodeObjectClass(value, this, false);
    setSchemaFile(copy, getSchemaFile(oc));
    return copy;
  }
  /**
   * Creates a new <CODE>Schema</CODE> object that is a duplicate of
opendj3-server-dev/src/server/org/opends/server/types/SchemaFileElement.java
@@ -22,11 +22,12 @@
 *
 *
 *      Copyright 2008 Sun Microsystems, Inc.
 *      Portions copyright 2013 ForgeRock AS.
 *      Portions copyright 2013-2014 ForgeRock AS.
 */
package org.opends.server.types;
import java.util.List;
import java.util.Map;
/**
 * This interface defines a set of methods that must be provided by a
@@ -52,29 +53,18 @@
     mayInvoke=true)
public interface SchemaFileElement
{
  /**
   * Retrieves the name of the schema file in which this element is
   * defined.
   *
   * @return  The name of the schema file in which this element is
   *          defined, or {@code null} if it is not known or this
   *          element is not defined in any schema file.
   */
  public String getSchemaFile();
  /**
   * Specifies the name of the schema file in which this element is
   * defined.
   * Retrieves the "extra" properties for this schema definition.
   * <p>
   * FIXME Contrary to the SDK, this method returns a modifiable Map.
   *
   * @param  schemaFile  The name of the schema file in which this
   *                     element is defined, or {@code null} if it is
   *                     not defined in any schema file.
   * @return Returns a Map of the "extra" properties for this schema definition,
   *         where the key is the property name and the value is a List of
   *         Strings representing the property values.
   *         Single valued properties have a List with a single element inside.
   */
  public void setSchemaFile(String schemaFile);
  Map<String, List<String>> getExtraProperties();
  /**
   * Retrieves the definition string that is used to represent this
@@ -85,27 +75,4 @@
   */
  public String getDefinition();
  /**
   * Creates a new instance of this schema element based on the definition from
   * the schema file. The new instance should also be created with all
   * appropriate state information that may not be directly represented in the
   * schema definition (e.g., the name of the schema file containing the
   * definition). <BR>
   * <BR>
   * Whenever an existing schema file element is modified with the server
   * online, this method will be invoked to recreate any schema elements that
   * might have been dependent upon the modified element.
   *
   * @param schema
   *          The schema which should be used for resolving dependencies.
   * @return A new instance of this schema element based on the definition.
   * @throws DirectoryException
   *           If a problem occurs while attempting to create the new instance
   *           of this schema element.
   */
  public SchemaFileElement recreateFromDefinition(Schema schema)
         throws DirectoryException;
}
opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/types/TestCommonSchemaElements.java
@@ -41,6 +41,7 @@
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import static org.opends.server.types.CommonSchemaElements.*;
/**
@@ -452,42 +453,34 @@
  /**
   * Check that the
   * {@link CommonSchemaElements#getExtraProperty(String)} method
   * Check that the {@link CommonSchemaElements#getExtraProperties()} method
   * returns <code>null</code> when there is no property.
   *
   * @throws Exception
   *           If the test failed unexpectedly.
   */
  @Test
  public final void testGetExtraPropertyDefault() throws Exception {
    SchemaDefinitionBuilder builder = getBuilder("test", "1.2.3");
    CommonSchemaElements d = builder.getInstance();
    Assert.assertNull(d.getExtraProperty("test"));
    Assert.assertNull(d.getExtraProperties().get("test"));
  }
  /**
   * Check that the
   * {@link CommonSchemaElements#getExtraProperty(String)} method
   * Check that the {@link CommonSchemaElements#getExtraProperties()} method
   * returns values.
   *
   * @throws Exception
   *           If the test failed unexpectedly.
   */
  @Test
  public final void testGetExtraProperty() throws Exception {
  public final void testGetExtraProperties() throws Exception {
    SchemaDefinitionBuilder builder = getBuilder("test", "1.2.3");
    String[] expectedValues = new String[] { "one", "two" };
    builder.addExtraProperty("test", expectedValues);
    CommonSchemaElements d = builder.getInstance();
    Assert.assertNotNull(d.getExtraProperty("test"));
    int i = 0;
    for (String value : d.getExtraProperty("test")) {
      Assert.assertEquals(value, expectedValues[i]);
      i++;
    List<String> values = d.getExtraProperties().get("test");
    Assert.assertNotNull(values);
    for (int i = 0; i < values.size(); i++)
    {
      Assert.assertEquals(values.get(i), expectedValues[i]);
    }
  }
@@ -495,17 +488,13 @@
  /**
   * Check that the
   * {@link CommonSchemaElements#getExtraPropertyNames()} method.
   *
   * @throws Exception
   *           If the test failed unexpectedly.
   * {@link CommonSchemaElements#getExtraProperties()} method.
   */
  @Test
  public final void testGetExtraPropertyNames() throws Exception {
    SchemaDefinitionBuilder builder = getBuilder("test", "1.2.3");
    CommonSchemaElements d = builder.getInstance();
    Assert
        .assertFalse(d.getExtraPropertyNames().iterator().hasNext());
    Assert.assertFalse(d.getExtraProperties().keySet().iterator().hasNext());
  }
@@ -722,8 +711,7 @@
  @Test
  public final void testGetSchemaFileDefault() throws Exception {
    SchemaDefinitionBuilder builder = getBuilder(null, "1.2.3");
    CommonSchemaElements d = builder.getInstance();
    Assert.assertNull(d.getSchemaFile());
    Assert.assertNull(getSchemaFile(builder.getInstance()));
  }
@@ -740,8 +728,7 @@
    SchemaDefinitionBuilder builder = getBuilder(null, "1.2.3");
    builder.addExtraProperty(
        ServerConstants.SCHEMA_PROPERTY_FILENAME, "/foo/bar");
    CommonSchemaElements d = builder.getInstance();
    Assert.assertEquals(d.getSchemaFile(), "/foo/bar");
    Assert.assertEquals(getSchemaFile(builder.getInstance()), "/foo/bar");
  }