From efa949b25f472d7e4c39733678d8f0e5229f8201 Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Thu, 26 Dec 2013 15:31:32 +0000
Subject: [PATCH] Checkpoint commit for OPENDJ-1235 : Migrate configuration framework

---
 opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/client/spi/PropertySet.java |  531 ++++++++++++++++++++++++++--------------------------------
 1 files changed, 242 insertions(+), 289 deletions(-)

diff --git a/opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/client/spi/PropertySet.java b/opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/client/spi/PropertySet.java
index 42185e8..7795959 100644
--- a/opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/client/spi/PropertySet.java
+++ b/opendj-sdk/opendj-admin/src/main/java/org/opends/server/admin/client/spi/PropertySet.java
@@ -26,8 +26,6 @@
 
 package org.opends.server.admin.client.spi;
 
-
-
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -41,330 +39,285 @@
 import org.opends.server.admin.PropertyIsSingleValuedException;
 import org.opends.server.admin.PropertyOption;
 
-
-
 /**
- * A set of properties. Instances of this class can be used as the
- * core of a managed object implementation.
+ * A set of properties. Instances of this class can be used as the core of a
+ * managed object implementation.
  */
 public final class PropertySet {
 
-  /**
-   * Internal property implementation.
-   *
-   * @param <T>
-   *          The type of the property.
-   */
-  private static final class MyProperty<T> implements Property<T> {
+    /**
+     * Internal property implementation.
+     *
+     * @param <T>
+     *            The type of the property.
+     */
+    private static final class MyProperty<T> implements Property<T> {
 
-    // The active set of values.
-    private final SortedSet<T> activeValues;
+        // The active set of values.
+        private final SortedSet<T> activeValues;
 
-    // The definition associated with this property.
-    private final PropertyDefinition<T> d;
+        // The definition associated with this property.
+        private final PropertyDefinition<T> d;
 
-    // The default set of values (read-only).
-    private final SortedSet<T> defaultValues;
+        // The default set of values (read-only).
+        private final SortedSet<T> defaultValues;
 
-    // The pending set of values.
-    private final SortedSet<T> pendingValues;
+        // The pending set of values.
+        private final SortedSet<T> pendingValues;
 
+        /**
+         * Create a property with the provided sets of pre-validated default and
+         * active values.
+         *
+         * @param pd
+         *            The property definition.
+         * @param defaultValues
+         *            The set of default values for the property.
+         * @param activeValues
+         *            The set of active values for the property.
+         */
+        public MyProperty(PropertyDefinition<T> pd, Collection<T> defaultValues, Collection<T> activeValues) {
+            this.d = pd;
 
+            SortedSet<T> sortedDefaultValues = new TreeSet<T>(pd);
+            sortedDefaultValues.addAll(defaultValues);
+            this.defaultValues = Collections.unmodifiableSortedSet(sortedDefaultValues);
+
+            this.activeValues = new TreeSet<T>(pd);
+            this.activeValues.addAll(activeValues);
+
+            // Initially the pending values is the same as the active
+            // values.
+            this.pendingValues = new TreeSet<T>(this.activeValues);
+        }
+
+        /**
+         * Makes the pending values active.
+         */
+        public void commit() {
+            activeValues.clear();
+            activeValues.addAll(pendingValues);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public SortedSet<T> getActiveValues() {
+            return Collections.unmodifiableSortedSet(activeValues);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public SortedSet<T> getDefaultValues() {
+            return defaultValues;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public SortedSet<T> getEffectiveValues() {
+            SortedSet<T> values = getPendingValues();
+
+            if (values.isEmpty()) {
+                values = getDefaultValues();
+            }
+
+            return values;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public SortedSet<T> getPendingValues() {
+            return Collections.unmodifiableSortedSet(pendingValues);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public PropertyDefinition<T> getPropertyDefinition() {
+            return d;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean isEmpty() {
+            return pendingValues.isEmpty();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean isModified() {
+            if (activeValues.size() == pendingValues.size() && activeValues.containsAll(pendingValues)) {
+                return false;
+            }
+            return true;
+        }
+
+        /**
+         * Replace all pending values of this property with the provided values.
+         *
+         * @param c
+         *            The new set of pending property values.
+         */
+        public void setPendingValues(Collection<T> c) {
+            pendingValues.clear();
+            pendingValues.addAll(c);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public String toString() {
+            return getEffectiveValues().toString();
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public boolean wasEmpty() {
+            return activeValues.isEmpty();
+        }
+    }
+
+    // The properties.
+    private final Map<PropertyDefinition<?>, MyProperty<?>> properties;
 
     /**
-     * Create a property with the provided sets of pre-validated
-     * default and active values.
+     * Creates a new empty property set.
+     */
+    public PropertySet() {
+        this.properties = new HashMap<PropertyDefinition<?>, MyProperty<?>>();
+    }
+
+    /**
+     * Creates a property with the provided sets of pre-validated default and
+     * active values.
      *
+     * @param <T>
+     *            The type of the property.
      * @param pd
-     *          The property definition.
+     *            The property definition.
      * @param defaultValues
-     *          The set of default values for the property.
+     *            The set of default values for the property.
      * @param activeValues
-     *          The set of active values for the property.
+     *            The set of active values for the property.
      */
-    public MyProperty(PropertyDefinition<T> pd, Collection<T> defaultValues,
-        Collection<T> activeValues) {
-      this.d = pd;
-
-      SortedSet<T> sortedDefaultValues = new TreeSet<T>(pd);
-      sortedDefaultValues.addAll(defaultValues);
-      this.defaultValues = Collections
-          .unmodifiableSortedSet(sortedDefaultValues);
-
-      this.activeValues = new TreeSet<T>(pd);
-      this.activeValues.addAll(activeValues);
-
-      // Initially the pending values is the same as the active
-      // values.
-      this.pendingValues = new TreeSet<T>(this.activeValues);
+    public <T> void addProperty(PropertyDefinition<T> pd, Collection<T> defaultValues, Collection<T> activeValues) {
+        MyProperty<T> p = new MyProperty<T>(pd, defaultValues, activeValues);
+        properties.put(pd, p);
     }
 
-
-
     /**
-     * Makes the pending values active.
-     */
-    public void commit() {
-      activeValues.clear();
-      activeValues.addAll(pendingValues);
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public SortedSet<T> getActiveValues() {
-      return Collections.unmodifiableSortedSet(activeValues);
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public SortedSet<T> getDefaultValues() {
-      return defaultValues;
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public SortedSet<T> getEffectiveValues() {
-      SortedSet<T> values = getPendingValues();
-
-      if (values.isEmpty()) {
-        values = getDefaultValues();
-      }
-
-      return values;
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public SortedSet<T> getPendingValues() {
-      return Collections.unmodifiableSortedSet(pendingValues);
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public PropertyDefinition<T> getPropertyDefinition() {
-      return d;
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean isEmpty() {
-      return pendingValues.isEmpty();
-    }
-
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean isModified() {
-      if (activeValues.size() == pendingValues.size()
-          && activeValues.containsAll(pendingValues)) {
-        return false;
-      }
-      return true;
-    }
-
-
-
-    /**
-     * Replace all pending values of this property with the provided
-     * values.
+     * Get the property associated with the specified property definition.
      *
-     * @param c
-     *          The new set of pending property values.
+     * @param <T>
+     *            The underlying type of the property.
+     * @param d
+     *            The Property definition.
+     * @return Returns the property associated with the specified property
+     *         definition.
+     * @throws IllegalArgumentException
+     *             If this property provider does not recognise the requested
+     *             property definition.
      */
-    public void setPendingValues(Collection<T> c) {
-      pendingValues.clear();
-      pendingValues.addAll(c);
+    @SuppressWarnings("unchecked")
+    public <T> Property<T> getProperty(PropertyDefinition<T> d) {
+        if (!properties.containsKey(d)) {
+            throw new IllegalArgumentException("Unknown property " + d.getName());
+        }
+
+        return (Property<T>) properties.get(d);
     }
 
-
-
     /**
      * {@inheritDoc}
      */
     @Override
     public String toString() {
-      return getEffectiveValues().toString();
+        StringBuilder builder = new StringBuilder();
+        builder.append('{');
+        for (Map.Entry<PropertyDefinition<?>, MyProperty<?>> entry : properties.entrySet()) {
+            builder.append(entry.getKey().getName());
+            builder.append('=');
+            builder.append(entry.getValue().toString());
+            builder.append(' ');
+        }
+        builder.append('}');
+        return builder.toString();
     }
 
-
-
     /**
-     * {@inheritDoc}
+     * Makes all pending values active.
      */
-    public boolean wasEmpty() {
-      return activeValues.isEmpty();
-    }
-  }
-
-  // The properties.
-  private final Map<PropertyDefinition<?>, MyProperty<?>> properties;
-
-
-
-  /**
-   * Creates a new empty property set.
-   */
-  public PropertySet() {
-    this.properties = new HashMap<PropertyDefinition<?>, MyProperty<?>>();
-  }
-
-
-
-  /**
-   * Creates a property with the provided sets of pre-validated
-   * default and active values.
-   *
-   * @param <T>
-   *          The type of the property.
-   * @param pd
-   *          The property definition.
-   * @param defaultValues
-   *          The set of default values for the property.
-   * @param activeValues
-   *          The set of active values for the property.
-   */
-  public <T> void addProperty(PropertyDefinition<T> pd,
-      Collection<T> defaultValues, Collection<T> activeValues) {
-    MyProperty<T> p = new MyProperty<T>(pd, defaultValues, activeValues);
-    properties.put(pd, p);
-  }
-
-
-
-  /**
-   * Get the property associated with the specified property
-   * definition.
-   *
-   * @param <T>
-   *          The underlying type of the property.
-   * @param d
-   *          The Property definition.
-   * @return Returns the property associated with the specified
-   *         property definition.
-   * @throws IllegalArgumentException
-   *           If this property provider does not recognise the
-   *           requested property definition.
-   */
-  @SuppressWarnings("unchecked")
-  public <T> Property<T> getProperty(PropertyDefinition<T> d)
-      throws IllegalArgumentException {
-    if (!properties.containsKey(d)) {
-      throw new IllegalArgumentException("Unknown property " + d.getName());
+    void commit() {
+        for (MyProperty<?> p : properties.values()) {
+            p.commit();
+        }
     }
 
-    return (Property<T>) properties.get(d);
-  }
+    /**
+     * Set a new pending values for the specified property.
+     * <p>
+     * See the class description for more information regarding pending values.
+     *
+     * @param <T>
+     *            The type of the property to be modified.
+     * @param d
+     *            The property to be modified.
+     * @param values
+     *            A non-<code>null</code> set of new pending values for the
+     *            property (an empty set indicates that the property should be
+     *            reset to its default behavior). The set will not be referenced
+     *            by this managed object.
+     * @throws IllegalPropertyValueException
+     *             If a new pending value is deemed to be invalid according to
+     *             the property definition.
+     * @throws PropertyIsSingleValuedException
+     *             If an attempt was made to add multiple pending values to a
+     *             single-valued property.
+     * @throws PropertyIsMandatoryException
+     *             If an attempt was made to remove a mandatory property.
+     * @throws IllegalArgumentException
+     *             If the specified property definition is not associated with
+     *             this managed object.
+     */
+    <T> void setPropertyValues(PropertyDefinition<T> d, Collection<T> values) {
+        MyProperty<T> property = (MyProperty<T>) getProperty(d);
 
+        if (values.size() > 1 && !d.hasOption(PropertyOption.MULTI_VALUED)) {
+            throw new PropertyIsSingleValuedException(d);
+        }
 
+        if (values.isEmpty() && d.hasOption(PropertyOption.MANDATORY)) {
+            // But only if there are no default values.
+            if (property.getDefaultValues().isEmpty()) {
+                throw new PropertyIsMandatoryException(d);
+            }
+        }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public String toString() {
-    StringBuilder builder = new StringBuilder();
-    builder.append('{');
-    for (Map.Entry<PropertyDefinition<?>, MyProperty<?>> entry : properties
-        .entrySet()) {
-      builder.append(entry.getKey().getName());
-      builder.append('=');
-      builder.append(entry.getValue().toString());
-      builder.append(' ');
+        // Validate each value.
+        for (T e : values) {
+            if (e == null) {
+                throw new NullPointerException();
+            }
+
+            d.validateValue(e);
+        }
+
+        // Update the property.
+        property.setPendingValues(values);
     }
-    builder.append('}');
-    return builder.toString();
-  }
-
-
-
-
-
-
-  /**
-   * Makes all pending values active.
-   */
-  void commit() {
-    for (MyProperty<?> p : properties.values()) {
-      p.commit();
-    }
-  }
-
-
-
-  /**
-   * Set a new pending values for the specified property.
-   * <p>
-   * See the class description for more information regarding pending
-   * values.
-   *
-   * @param <T>
-   *          The type of the property to be modified.
-   * @param d
-   *          The property to be modified.
-   * @param values
-   *          A non-<code>null</code> set of new pending values for
-   *          the property (an empty set indicates that the property
-   *          should be reset to its default behavior). The set will
-   *          not be referenced by this managed object.
-   * @throws IllegalPropertyValueException
-   *           If a new pending value is deemed to be invalid
-   *           according to the property definition.
-   * @throws PropertyIsSingleValuedException
-   *           If an attempt was made to add multiple pending values
-   *           to a single-valued property.
-   * @throws PropertyIsMandatoryException
-   *           If an attempt was made to remove a mandatory property.
-   * @throws IllegalArgumentException
-   *           If the specified property definition is not associated
-   *           with this managed object.
-   */
-  <T> void setPropertyValues(PropertyDefinition<T> d,
-      Collection<T> values) throws IllegalPropertyValueException,
-      PropertyIsSingleValuedException, PropertyIsMandatoryException,
-      IllegalArgumentException {
-    MyProperty<T> property = (MyProperty<T>) getProperty(d);
-
-    if (values.size() > 1 && !d.hasOption(PropertyOption.MULTI_VALUED)) {
-      throw new PropertyIsSingleValuedException(d);
-    }
-
-    if (values.isEmpty() && d.hasOption(PropertyOption.MANDATORY)) {
-      // But only if there are no default values.
-      if (property.getDefaultValues().isEmpty()) {
-        throw new PropertyIsMandatoryException(d);
-      }
-    }
-
-    // Validate each value.
-    for (T e : values) {
-      if (e == null) {
-        throw new NullPointerException();
-      }
-
-      d.validateValue(e);
-    }
-
-    // Update the property.
-    property.setPendingValues(values);
-  }
 }

--
Gitblit v1.10.0