/*
* 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();
}
}