/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt * or http://forgerock.org/license/CDDLv1.0.html. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at legal-notices/CDDLv1_0.txt. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2008 Sun Microsystems, Inc. * Portions Copyright 2014-2015 ForgeRock AS */ package org.forgerock.opendj.config.dsconfig; import java.util.SortedSet; import java.util.TreeSet; import org.forgerock.opendj.config.PropertyDefinition; /** * This class is a data structure that can be used as an interface between PropertyValueEditor and the different * handlers that call it. Since PropertyValueEditor is not aware of the different options used by the handlers it cannot * directly construct a CommandBuilder, but PropertyValueEditor knows about the different changes (set, reset, delete) * that can be performed against the ManagedObject and these changes can be used to generate a CommandBuilder. * * @param <T> * The type of the underlying property associated with the modification. */ final class PropertyEditorModification<T> { /** * The enumeration that describes the different types of modifications that we can have. */ enum Type { /** The user chose to set values. */ SET, /** The user chose to reset values. */ RESET, /** The user chose to add values. */ ADD, /** The user chose to delete values. */ REMOVE } private PropertyDefinition<T> propertyDefinition; private Type type; private final SortedSet<T> values; private final SortedSet<T> originalValues; /** * The private constructor of the PropertyEditorModification. * * @param propertyDefinition * the property definition associated with the modification. * @param type * the type of the modification. * @param values * the values associated with the modifications. * @param originalValues * the original values of the property we are modifying. */ private PropertyEditorModification(PropertyDefinition<T> propertyDefinition, Type type, SortedSet<T> values, SortedSet<T> originalValues) { this.propertyDefinition = propertyDefinition; this.type = type; this.values = new TreeSet<>(values); this.originalValues = new TreeSet<>(originalValues); } /** * Creates a reset modification. * * @param <T> * The type of the underlying property. * @param propertyDefinition * the property that is modified. * @param originalValues * the original values of the property. * @return a reset modification for a given property. */ static <T> PropertyEditorModification<T> createResetModification(PropertyDefinition<T> propertyDefinition, SortedSet<T> originalValues) { return new PropertyEditorModification<>(propertyDefinition, Type.RESET, new TreeSet<T>(propertyDefinition), originalValues); } /** * Creates an add modification. * * @param <T> * The type of the underlying property. * @param propertyDefinition * the property that is modified. * @param addedValues * the values that are added in this modification. * @param originalValues * the original values of the property. * @return a reset modification for a given property. */ static <T> PropertyEditorModification<T> createAddModification(PropertyDefinition<T> propertyDefinition, SortedSet<T> addedValues, SortedSet<T> originalValues) { return new PropertyEditorModification<>(propertyDefinition, Type.ADD, addedValues, originalValues); } /** * Creates a set modification. * * @param <T> * The type of the underlying property. * @param propertyDefinition * the property that is modified. * @param newValues * the new values for the property. * @param originalValues * the original values of the property. * @return a reset modification for a given property. */ static <T> PropertyEditorModification<T> createSetModification(PropertyDefinition<T> propertyDefinition, SortedSet<T> newValues, SortedSet<T> originalValues) { return new PropertyEditorModification<>(propertyDefinition, Type.SET, newValues, originalValues); } /** * Creates a remove modification. * * @param <T> * The type of the underlying property. * @param propertyDefinition * the property that is modified. * @param removedValues * the values that are removed in this modification. * @param originalValues * the original values of the property. * @return a reset modification for a given property. */ static <T> PropertyEditorModification<T> createRemoveModification(PropertyDefinition<T> propertyDefinition, SortedSet<T> removedValues, SortedSet<T> originalValues) { return new PropertyEditorModification<>(propertyDefinition, Type.REMOVE, removedValues, originalValues); } /** * Returns the property definition associated with this modification. * * @return the property definition associated with this modification. */ PropertyDefinition<T> getPropertyDefinition() { return propertyDefinition; } /** * Returns the type of the modification. * * @return the type of the modification. */ Type getType() { return type; } /** * Returns the specific values associated with the modification. * * @return the specific values associated with the modification. */ SortedSet<T> getModificationValues() { return values; } /** * Returns the original values associated with the property. * * @return the original values associated with the property. */ SortedSet<T> getOriginalValues() { return originalValues; } /** {@inheritDoc} */ @Override public String toString() { return "Property name: " + getPropertyDefinition() + "\nMod type: " + getType() + "\nMod values: " + getModificationValues() + "\nOriginal values: " + getOriginalValues(); } }