/*
* 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
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
* 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
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. 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.
*/
package org.opends.server.tools.dsconfig;
import java.util.SortedSet;
import java.util.TreeSet;
import org.opends.server.admin.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 SortedSet<T> values;
private 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<T>(values);
this.originalValues = new TreeSet<T>(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<T>(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<T>(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<T>(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<T>(propertyDefinition, Type.REMOVE,
removedValues, originalValues);
}
/**
* Retuns 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();
}
}