/*
* 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-2010 Sun Microsystems, Inc.
*/
package org.opends.server.tools.dsconfig;
import static org.opends.messages.DSConfigMessages.*;
import org.opends.messages.Message;
import org.opends.server.admin.AbstractManagedObjectDefinition;
import org.opends.server.admin.DefaultBehaviorException;
import org.opends.server.admin.IllegalPropertyValueException;
import org.opends.server.admin.IllegalPropertyValueStringException;
import org.opends.server.admin.ManagedObjectDefinition;
import org.opends.server.admin.PropertyDefinition;
import org.opends.server.admin.PropertyDefinitionUsageBuilder;
import org.opends.server.admin.PropertyException;
import org.opends.server.admin.PropertyIsMandatoryException;
import org.opends.server.admin.PropertyIsReadOnlyException;
import org.opends.server.admin.PropertyIsSingleValuedException;
import org.opends.server.admin.RelationDefinition;
import org.opends.server.admin.client.IllegalManagedObjectNameException;
import org.opends.server.admin.client.ManagedObjectDecodingException;
import org.opends.server.admin.client.MissingMandatoryPropertiesException;
import org.opends.server.admin.client.OperationRejectedException;
import org.opends.server.util.args.Argument;
import org.opends.server.util.args.ArgumentException;
import org.opends.server.util.cli.CLIException;
import org.opends.server.util.cli.ConsoleApplication;
import org.opends.server.util.table.TableBuilder;
import org.opends.server.util.table.TextTablePrinter;
/**
* A utility class for converting various admin exception types into
* argument exceptions.
*/
public final class ArgumentExceptionFactory {
/**
* Creates a CLI exception from an illegal managed object name
* exception.
*
* @param e
* The illegal managed object name exception.
* @param d
* The managed object definition.
* @return Returns a CLI exception.
*/
public static CLIException adaptIllegalManagedObjectNameException(
IllegalManagedObjectNameException e,
AbstractManagedObjectDefinition<?, ?> d) {
String illegalName = e.getIllegalName();
PropertyDefinition<?> pd = e.getNamingPropertyDefinition();
if (illegalName.length() == 0) {
Message message =
ERR_DSCFG_ERROR_ILLEGAL_NAME_EMPTY.get(d.getUserFriendlyPluralName());
return new CLIException(message);
} else if (illegalName.trim().length() == 0) {
Message message =
ERR_DSCFG_ERROR_ILLEGAL_NAME_BLANK.get(d.getUserFriendlyPluralName());
return new CLIException(message);
} else if (pd != null) {
try {
pd.decodeValue(illegalName);
} catch (IllegalPropertyValueStringException e1) {
PropertyDefinitionUsageBuilder b = new PropertyDefinitionUsageBuilder(
true);
Message syntax = b.getUsage(pd);
Message message = ERR_DSCFG_ERROR_ILLEGAL_NAME_SYNTAX.get(
illegalName, d.getUserFriendlyName(), syntax);
return new CLIException(message);
}
}
Message message = ERR_DSCFG_ERROR_ILLEGAL_NAME_UNKNOWN.get(
illegalName, d.getUserFriendlyName());
return new CLIException(message);
}
/**
* Creates an argument exception from a property exception.
*
* @param e
* The property exception.
* @param d
* The managed object definition.
* @return Returns an argument exception.
*/
public static ArgumentException adaptPropertyException(PropertyException e,
AbstractManagedObjectDefinition<?, ?> d) {
if (e instanceof IllegalPropertyValueException) {
IllegalPropertyValueException pe = (IllegalPropertyValueException) e;
return adapt(d, pe);
} else if (e instanceof IllegalPropertyValueStringException) {
IllegalPropertyValueStringException pe =
(IllegalPropertyValueStringException) e;
return adapt(d, pe);
} else if (e instanceof PropertyIsMandatoryException) {
PropertyIsMandatoryException pe = (PropertyIsMandatoryException) e;
return adapt(d, pe);
} else if (e instanceof PropertyIsSingleValuedException) {
PropertyIsSingleValuedException pe = (PropertyIsSingleValuedException) e;
return adapt(d, pe);
} else if (e instanceof PropertyIsReadOnlyException) {
PropertyIsReadOnlyException pe = (PropertyIsReadOnlyException) e;
return adapt(d, pe);
} else if (e instanceof DefaultBehaviorException) {
DefaultBehaviorException pe = (DefaultBehaviorException) e;
return adapt(d, pe);
} else {
Message message = ERR_DSCFG_ERROR_PROPERTY_UNKNOWN_ERROR.
get(d.getUserFriendlyName(), e.getPropertyDefinition().getName(),
e.getMessage());
return new ArgumentException(message);
}
}
/**
* Displays a table listing reasons why a managed object could not
* be decoded successfully.
*
* @param app
* The console application.
* @param e
* The managed object decoding exception.
*/
public static void displayManagedObjectDecodingException(
ConsoleApplication app, ManagedObjectDecodingException e) {
AbstractManagedObjectDefinition<?, ?> d = e.getPartialManagedObject()
.getManagedObjectDefinition();
Message ufn = d.getUserFriendlyName();
Message msg;
if (e.getCauses().size() == 1) {
msg = ERR_GET_HEADING_MODE_SINGLE.get(ufn);
} else {
msg = ERR_GET_HEADING_MODE_PLURAL.get(ufn);
}
app.println(msg);
app.println();
TableBuilder builder = new TableBuilder();
for (PropertyException pe : e.getCauses()) {
ArgumentException ae = adaptPropertyException(pe, d);
builder.startRow();
builder.appendCell("*");
builder.appendCell(ae.getMessage());
}
TextTablePrinter printer = new TextTablePrinter(app.getErrorStream());
printer.setDisplayHeadings(false);
printer.setColumnWidth(1, 0);
printer.setIndentWidth(4);
builder.print(printer);
}
/**
* Displays a table listing missing mandatory properties.
*
* @param app
* The console application.
* @param e
* The missing mandatory property exception.
*/
public static void displayMissingMandatoryPropertyException(
ConsoleApplication app, MissingMandatoryPropertiesException e) {
Message ufn = e.getUserFriendlyName();
Message msg;
if (e.isCreate()) {
if (e.getCauses().size() == 1) {
msg = ERR_CREATE_HEADING_MMPE_SINGLE.get(ufn);
} else {
msg = ERR_CREATE_HEADING_MMPE_PLURAL.get(ufn);
}
} else {
if (e.getCauses().size() == 1) {
msg = ERR_MODIFY_HEADING_MMPE_SINGLE.get(ufn);
} else {
msg = ERR_MODIFY_HEADING_MMPE_PLURAL.get(ufn);
}
}
app.println(msg);
app.println();
TableBuilder builder = new TableBuilder();
builder.addSortKey(0);
builder.appendHeading(INFO_DSCFG_HEADING_PROPERTY_NAME.get());
builder.appendHeading(INFO_DSCFG_HEADING_PROPERTY_SYNTAX.get());
PropertyDefinitionUsageBuilder b = new PropertyDefinitionUsageBuilder(true);
for (PropertyIsMandatoryException pe : e.getCauses()) {
PropertyDefinition<?> pd = pe.getPropertyDefinition();
builder.startRow();
builder.appendCell(pd.getName());
builder.appendCell(b.getUsage(pd));
}
TextTablePrinter printer = new TextTablePrinter(app.getErrorStream());
printer.setDisplayHeadings(true);
printer.setColumnWidth(1, 0);
printer.setIndentWidth(4);
builder.print(printer);
}
/**
* Displays a table listing the reasons why an operation was
* rejected.
*
* @param app
* The console application.
* @param e
* The operation rejected exception.
*/
public static void displayOperationRejectedException(ConsoleApplication app,
OperationRejectedException e) {
Message ufn = e.getUserFriendlyName();
Message msg;
switch (e.getOperationType()) {
case CREATE:
if (e.getMessages().size() == 1) {
msg = ERR_DSCFG_ERROR_CREATE_ORE_SINGLE.get(ufn);
} else {
msg = ERR_DSCFG_ERROR_CREATE_ORE_PLURAL.get(ufn);
}
break;
case DELETE:
if (e.getMessages().size() == 1) {
msg = ERR_DSCFG_ERROR_DELETE_ORE_SINGLE.get(ufn);
} else {
msg = ERR_DSCFG_ERROR_DELETE_ORE_PLURAL.get(ufn);
}
break;
default:
if (e.getMessages().size() == 1) {
msg = ERR_DSCFG_ERROR_MODIFY_ORE_SINGLE.get(ufn);
} else {
msg = ERR_DSCFG_ERROR_MODIFY_ORE_PLURAL.get(ufn);
}
break;
}
app.println(msg);
app.println();
TableBuilder builder = new TableBuilder();
for (Message reason : e.getMessages()) {
builder.startRow();
builder.appendCell("*");
builder.appendCell(reason);
}
TextTablePrinter printer = new TextTablePrinter(app.getErrorStream());
printer.setDisplayHeadings(false);
printer.setColumnWidth(1, 0);
printer.setIndentWidth(4);
builder.print(printer);
}
/**
* Creates an argument exception which should be used when a
* property modification argument is incompatible with a previous
* modification argument.
*
* @param arg
* The incompatible argument.
* @return Returns an argument exception.
*/
public static ArgumentException incompatiblePropertyModification(String arg) {
Message msg = ERR_DSCFG_ERROR_INCOMPATIBLE_PROPERTY_MOD.get(arg);
return new ArgumentException(msg);
}
/**
* Creates an argument exception which should be used when the
* client has not specified a bind password.
*
* @param bindDN
* The name of the user requiring a password.
* @return Returns an argument exception.
*/
public static ArgumentException missingBindPassword(String bindDN) {
Message msg = ERR_DSCFG_ERROR_NO_PASSWORD.get(bindDN);
return new ArgumentException(msg);
}
/**
* Creates an argument exception which should be used when an
* argument, which is mandatory when the application is
* non-interactive, has not been specified.
*
* @param arg
* The missing argument.
* @return Returns an argument exception.
*/
public static ArgumentException missingMandatoryNonInteractiveArgument(
Argument arg) {
Message msg = ERR_DSCFG_ERROR_MISSING_NON_INTERACTIVE_ARG.get(
arg.getLongIdentifier());
return new ArgumentException(msg);
}
/**
* Creates an argument exception which should be used when a
* property value argument is invalid because it does not a property
* name.
*
* @param arg
* The argument having the missing property name.
* @return Returns an argument exception.
*/
public static ArgumentException missingNameInPropertyArgument(String arg) {
Message msg = ERR_DSCFG_ERROR_NO_NAME_IN_PROPERTY_VALUE.get(arg);
return new ArgumentException(msg);
}
/**
* Creates an argument exception which should be used when a
* property modification argument is invalid because it does not a
* property name.
*
* @param arg
* The argument having the missing property name.
* @return Returns an argument exception.
*/
public static ArgumentException missingNameInPropertyModification(
String arg) {
Message msg = ERR_DSCFG_ERROR_NO_NAME_IN_PROPERTY_MOD.get(arg);
return new ArgumentException(msg);
}
/**
* Creates an argument exception which should be used when a
* property value argument is invalid because it does not contain a
* separator between the property name and its value.
*
* @param arg
* The argument having a missing separator.
* @return Returns an argument exception.
*/
public static ArgumentException missingSeparatorInPropertyArgument(
String arg) {
Message msg = ERR_DSCFG_ERROR_NO_SEPARATOR_IN_PROPERTY_VALUE.get(arg);
return new ArgumentException(msg);
}
/**
* Creates an argument exception which should be used when a
* property modification argument is invalid because it does not
* contain a separator between the property name and its value.
*
* @param arg
* The argument having a missing separator.
* @return Returns an argument exception.
*/
public static ArgumentException missingSeparatorInPropertyModification(
String arg) {
Message msg = ERR_DSCFG_ERROR_NO_SEPARATOR_IN_PROPERTY_MOD.get(arg);
return new ArgumentException(msg);
}
/**
* Creates an argument exception which should be used when a
* property value argument is invalid because it does not a property
* value.
*
* @param arg
* The argument having the missing property value.
* @return Returns an argument exception.
*/
public static ArgumentException missingValueInPropertyArgument(String arg) {
Message msg = ERR_DSCFG_ERROR_NO_VALUE_IN_PROPERTY_VALUE.get(arg);
return new ArgumentException(msg);
}
/**
* Creates an argument exception which should be used when a
* property modification argument is invalid because it does not a
* property value.
*
* @param arg
* The argument having the missing property value.
* @return Returns an argument exception.
*/
public static ArgumentException missingValueInPropertyModification(
String arg) {
Message msg = ERR_DSCFG_ERROR_NO_NAME_IN_PROPERTY_MOD.get(arg);
return new ArgumentException(msg);
}
/**
* Creates an argument exception which should be used when the
* connection parameters could not be read from the standard input.
*
* @param cause
* The reason why the connection parameters could not be
* read.
* @return Returns an argument exception.
*/
public static ArgumentException unableToReadConnectionParameters(
Exception cause) {
Message message = ERR_DSCFG_ERROR_CANNOT_READ_CONNECTION_PARAMETERS
.get(cause.getMessage());
return new ArgumentException(message, cause);
}
/**
* Creates an argument exception which should be used when the bind
* password could not be read from the standard input because the
* application is non-interactive.
*
* @return Returns an argument exception.
*/
public static ArgumentException unableToReadBindPasswordInteractively() {
Message message = ERR_DSCFG_ERROR_BIND_PASSWORD_NONINTERACTIVE.get();
return new ArgumentException(message);
}
/**
* Creates an argument exception which should be used when an
* attempt is made to reset a mandatory property that does not have
* any default values.
*
* @param d
* The managed object definition.
* @param name
* The name of the mandatory property.
* @param setOption
* The name of the option which should be used to set the
* property's values.
* @return Returns an argument exception.
*/
public static ArgumentException unableToResetMandatoryProperty(
AbstractManagedObjectDefinition<?, ?> d, String name, String setOption) {
Message message = ERR_DSCFG_ERROR_UNABLE_TO_RESET_MANDATORY_PROPERTY.get(
d.getUserFriendlyPluralName(), name, setOption);
return new ArgumentException(message);
}
/**
* Creates an argument exception which should be used when an
* attempt is made to reset a property with a value.
*
* @param name
* The name of the mandatory property.
* @param resetOption
* The name of the option which should be used to reset the
* property's values.
* @return Returns an argument exception.
*/
public static ArgumentException unableToResetPropertyWithValue(String name,
String resetOption) {
Message message = ERR_DSCFG_ERROR_UNABLE_TO_RESET_PROPERTY_WITH_VALUE.get(
resetOption, name, resetOption);
return new ArgumentException(message);
}
/**
* Creates an argument exception which should be used when an
* attempt is made to set the naming property for a managed object
* during creation.
*
* @param d
* The managed object definition.
* @param pd
* The naming property definition.
* @return Returns an argument exception.
*/
public static ArgumentException unableToSetNamingProperty(
AbstractManagedObjectDefinition<?, ?> d, PropertyDefinition<?> pd) {
Message message = ERR_DSCFG_ERROR_UNABLE_TO_SET_NAMING_PROPERTY.get(
pd.getName(), d.getUserFriendlyName());
return new ArgumentException(message);
}
/**
* Creates an argument exception which should be used when a
* component category argument is not recognized.
*
* @param categoryName
* The unrecognized component category.
* @return Returns an argument exception.
*/
public static ArgumentException unknownCategory(String categoryName) {
Message msg = ERR_DSCFG_ERROR_CATEGORY_UNRECOGNIZED.get(categoryName);
return new ArgumentException(msg);
}
/**
* Creates an argument exception which should be used when a
* property name is not recognized.
*
* @param d
* The managed object definition.
* @param name
* The unrecognized property name.
* @return Returns an argument exception.
*/
public static ArgumentException unknownProperty(
AbstractManagedObjectDefinition<?, ?> d, String name) {
Message message = ERR_DSCFG_ERROR_PROPERTY_UNRECOGNIZED.get(
name, d.getUserFriendlyPluralName());
return new ArgumentException(message);
}
/**
* Creates an argument exception which should be used when a
* property name is not recognized.
*
* @param name
* The unrecognized property name.
* @return Returns an argument exception.
*/
public static ArgumentException unknownProperty(String name) {
Message message = ERR_DSCFG_ERROR_PROPERTY_UNRECOGNIZED_NO_DEFN.get(name);
return new ArgumentException(message);
}
/**
* Creates an argument exception which should be used when a
* sub-type argument in a create-xxx sub-command is not recognized.
*
* @param r
* The relation definition.
* @param typeName
* The unrecognized property sub-type.
* @param typeUsage
* A usage string describing the allowed sub-types.
* @return Returns an argument exception.
*/
public static ArgumentException unknownSubType(RelationDefinition<?, ?> r,
String typeName, String typeUsage) {
Message msg = ERR_DSCFG_ERROR_SUB_TYPE_UNRECOGNIZED.get(
typeName, r.getUserFriendlyName(), typeUsage);
return new ArgumentException(msg);
}
/**
* Creates an argument exception which should be used when a managed
* object type argument is not associated with a category.
*
* @param categoryName
* The component category.
* @param typeName
* The unrecognized component type.
* @return Returns an argument exception.
*/
public static ArgumentException unknownTypeForCategory(String typeName,
String categoryName) {
Message msg =
ERR_DSCFG_ERROR_CATEGORY_TYPE_UNRECOGNIZED.get(typeName, categoryName);
return new ArgumentException(msg);
}
/**
* Creates an argument exception which should be used when a multi-valued
* property does not contain a given value.
*
* @param value
* The property value.
* @param propertyName
* The property name.
* @return Returns an argument exception.
*/
public static ArgumentException unknownValueForMultiValuedProperty(
String value, String propertyName) {
Message msg = ERR_DSCFG_ERROR_VALUE_DOES_NOT_EXIST.get(
value, propertyName);
return new ArgumentException(msg);
}
/**
* Creates an argument exception which should be used when a child
* component does not exist.
*
* @param componentName
* The component name.
* @return Returns an argument exception.
*/
public static ArgumentException unknownValueForChildComponent(
String componentName) {
Message msg = ERR_DSCFG_ERROR_FINDER_NO_CHILDREN.get(
componentName);
return new ArgumentException(msg);
}
/**
* Creates a CLI exception which should be used when a managed
* object is retrieved but does not have the correct type
* appropriate for the associated sub-command.
*
* @param r
* The relation definition.
* @param d
* The definition of the managed object that was retrieved.
*
* @param subcommandName the sub-command name.
* @return Returns a CLI exception.
*/
public static CLIException wrongManagedObjectType(RelationDefinition<?, ?> r,
ManagedObjectDefinition<?, ?> d, String subcommandName) {
Message msg = ERR_DSCFG_ERROR_TYPE_UNRECOGNIZED_FOR_SUBCOMMAND.get(
d.getUserFriendlyName(), subcommandName);
return new CLIException(msg);
}
/**
* Creates an argument exception from a default behavior exception.
*
* @param d
* The managed object definition.
* @param e
* The default behavior exception.
* @return Returns an argument exception.
*/
private static ArgumentException adapt(
AbstractManagedObjectDefinition<?, ?> d, DefaultBehaviorException e) {
Message message = ERR_DSCFG_ERROR_PROPERTY_DEFAULT_BEHAVIOR.
get(d.getUserFriendlyName(), e.getPropertyDefinition().getName(),
e.getMessage());
return new ArgumentException(message);
}
/**
* Creates an argument exception from an illegal property value
* exception.
*
* @param d
* The managed object definition.
* @param e
* The illegal property value exception.
* @return Returns an argument exception.
*/
private static ArgumentException adapt(
AbstractManagedObjectDefinition<?, ?> d,
IllegalPropertyValueException e) {
PropertyDefinitionUsageBuilder b = new PropertyDefinitionUsageBuilder(true);
Message syntax = b.getUsage(e.getPropertyDefinition());
if (syntax.length() > 20) {
// syntax =
// INFO_DSCFG_DESCRIPTION_PROPERTY_SYNTAX_HELP.get();
}
Message message = ERR_DSCFG_ERROR_PROPERTY_INVALID_VALUE.
get(String.valueOf(e.getIllegalValue()), d.getUserFriendlyName(),
e.getPropertyDefinition().getName(), syntax);
return new ArgumentException(message);
}
/**
* Creates an argument exception from an illegal property string
* value exception.
*
* @param d
* The managed object definition.
* @param e
* The illegal property string value exception.
* @return Returns an argument exception.
*/
private static ArgumentException adapt(
AbstractManagedObjectDefinition<?, ?> d,
IllegalPropertyValueStringException e) {
PropertyDefinitionUsageBuilder b = new PropertyDefinitionUsageBuilder(true);
Message syntax = b.getUsage(e.getPropertyDefinition());
if (syntax.length() > 20) {
// syntax =
// INFO_DSCFG_DESCRIPTION_PROPERTY_SYNTAX_HELP.get();
}
Message message = ERR_DSCFG_ERROR_PROPERTY_INVALID_VALUE.
get(String.valueOf(e.getIllegalValueString()), d.getUserFriendlyName(),
e.getPropertyDefinition().getName(), syntax);
return new ArgumentException(message);
}
/**
* Creates an argument exception from a property is mandatory
* exception.
*
* @param d
* The managed object definition.
* @param e
* The property is mandatory exception.
* @return Returns an argument exception.
*/
private static ArgumentException adapt(
AbstractManagedObjectDefinition<?, ?> d,
PropertyIsMandatoryException e) {
Message message = ERR_DSCFG_ERROR_PROPERTY_MANDATORY.get(
d.getUserFriendlyName(), e.getPropertyDefinition().getName());
return new ArgumentException(message);
}
/**
* Creates an argument exception from a property is read-only
* exception.
*
* @param d
* The managed object definition.
* @param e
* The property is read-only exception.
* @return Returns an argument exception.
*/
private static ArgumentException adapt(
AbstractManagedObjectDefinition<?, ?> d,
PropertyIsReadOnlyException e) {
Message message = ERR_DSCFG_ERROR_PROPERTY_READ_ONLY.get(
d.getUserFriendlyName(), e.getPropertyDefinition().getName());
return new ArgumentException(message);
}
/**
* Creates an argument exception from a property is single-valued
* exception.
*
* @param d
* The managed object definition.
* @param e
* The property is single-valued exception.
* @return Returns an argument exception.
*/
private static ArgumentException adapt(
AbstractManagedObjectDefinition<?, ?> d,
PropertyIsSingleValuedException e) {
Message message = ERR_DSCFG_ERROR_PROPERTY_SINGLE_VALUED.get(
d.getUserFriendlyName(), e.getPropertyDefinition().getName());
return new ArgumentException(message);
}
// Prevent instantiation.
private ArgumentExceptionFactory() {
// No implementation required.
}
}