/*
* 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.
* Portions copyright 2011 ForgeRock AS
*/
package org.opends.messages;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.HashMap;
import java.util.Map;
/**
* Base class for all Message descriptor classes.
*/
@org.opends.server.types.PublicAPI(
stability=org.opends.server.types.StabilityLevel.UNCOMMITTED,
mayInstantiate=false,
mayExtend=false,
mayInvoke=true)
public abstract class MessageDescriptor {
/**
* ID for messages that don't have a real ID.
*/
public static final int NULL_ID = -1;
/**
* The maximum number of arguments that can be handled by
* a specific subclass. If you define more subclasses be
* sure to increment this number appropriately.
*/
static public final int DESCRIPTOR_MAX_ARG_HANDLER = 11;
/**
* The base name of the specific argument handling subclasses
* defined below. The class names consist of the base name
* followed by a number indicating the number of arguments
* that they handle when creating messages or the letter "N"
* meaning any number of arguments.
*/
public static final String DESCRIPTOR_CLASS_BASE_NAME = "Arg";
/**
* Subclass for creating messages with no arguments.
*/
@org.opends.server.types.PublicAPI(
stability=org.opends.server.types.StabilityLevel.UNCOMMITTED,
mayInstantiate=true,
mayExtend=false,
mayInvoke=true)
static public final class Arg0 extends MessageDescriptor {
/**
* Cached copy of the message created by this descriptor. We can
* get away with this for the zero argument message because it is
* immutable.
*/
private Message message;
private boolean requiresFormat;
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param category of created messages
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg0(String rbBase, String key, Category category,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, category, severity, ordinal, classLoader);
message = new Message(this);
requiresFormat = containsArgumentLiterals(getFormatString());
}
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param mask to apply to the USER_DEFINED category
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg0(String rbBase, String key, int mask,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, mask, severity, ordinal, classLoader);
message = new Message(this);
requiresFormat = containsArgumentLiterals(getFormatString());
}
/**
* Creates a message.
* @return Message object
*/
public Message get() {
return message;
}
/**
* {@inheritDoc}
*/
boolean requiresFormatter() {
return requiresFormat;
}
}
/**
* Subclass for creating messages with one argument.
* @param <T1> The type of the first message argument.
*/
@org.opends.server.types.PublicAPI(
stability=org.opends.server.types.StabilityLevel.UNCOMMITTED,
mayInstantiate=true,
mayExtend=false,
mayInvoke=true)
static public final class Arg1<T1> extends MessageDescriptor {
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param category of created messages
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg1(String rbBase, String key, Category category,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, category, severity, ordinal, classLoader);
}
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param mask to apply to the USER_DEFINED category
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg1(String rbBase, String key, int mask,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, mask, severity, ordinal, classLoader);
}
/**
* Creates a message with arguments that will replace format
* specifiers in the assocated format string when the message
* is rendered to string representation.
* @return Message object
* @param a1 message argument
*/
public Message get(T1 a1) {
return new Message(this, a1);
}
/**
* {@inheritDoc}
*/
boolean requiresFormatter() {
return true;
}
}
/**
* Subclass for creating messages with two arguments.
* @param <T1> The type of the first message argument.
* @param <T2> The type of the second message argument.
*/
@org.opends.server.types.PublicAPI(
stability=org.opends.server.types.StabilityLevel.UNCOMMITTED,
mayInstantiate=true,
mayExtend=false,
mayInvoke=true)
static public final class Arg2<T1, T2> extends MessageDescriptor {
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param category of created messages
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg2(String rbBase, String key, Category category,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, category, severity, ordinal, classLoader);
}
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param mask to apply to the USER_DEFINED category
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg2(String rbBase, String key, int mask,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, mask, severity, ordinal, classLoader);
}
/**
* Creates a message with arguments that will replace format
* specifiers in the assocated format string when the message
* is rendered to string representation.
* @return Message object
* @param a1 message argument
* @param a2 message argument
*/
public Message get(T1 a1, T2 a2) {
return new Message(this, a1, a2);
}
/**
* {@inheritDoc}
*/
boolean requiresFormatter() {
return true;
}
}
/**
* Subclass for creating messages with three arguments.
* @param <T1> The type of the first message argument.
* @param <T2> The type of the second message argument.
* @param <T3> The type of the third message argument.
*/
@org.opends.server.types.PublicAPI(
stability=org.opends.server.types.StabilityLevel.UNCOMMITTED,
mayInstantiate=true,
mayExtend=false,
mayInvoke=true)
static public final class Arg3<T1, T2, T3> extends MessageDescriptor {
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param category of created messages
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg3(String rbBase, String key, Category category,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, category, severity, ordinal, classLoader);
}
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param mask to apply to the USER_DEFINED category
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg3(String rbBase, String key, int mask,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, mask, severity, ordinal, classLoader);
}
/**
* Creates a message with arguments that will replace format
* specifiers in the assocated format string when the message
* is rendered to string representation.
* @return Message object
* @param a1 message argument
* @param a2 message argument
* @param a3 message argument
*/
public Message get(T1 a1, T2 a2, T3 a3) {
return new Message(this, a1, a2, a3);
}
/**
* {@inheritDoc}
*/
boolean requiresFormatter() {
return true;
}
}
/**
* Subclass for creating messages with four arguments.
* @param <T1> The type of the first message argument.
* @param <T2> The type of the second message argument.
* @param <T3> The type of the third message argument.
* @param <T4> The type of the fourth message argument.
*/
@org.opends.server.types.PublicAPI(
stability=org.opends.server.types.StabilityLevel.UNCOMMITTED,
mayInstantiate=true,
mayExtend=false,
mayInvoke=true)
static public final class Arg4<T1, T2, T3, T4> extends MessageDescriptor {
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param category of created messages
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg4(String rbBase, String key, Category category,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, category, severity, ordinal, classLoader);
}
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param mask to apply to the USER_DEFINED category
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg4(String rbBase, String key, int mask,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, mask, severity, ordinal, classLoader);
}
/**
* Creates a message with arguments that will replace format
* specifiers in the assocated format string when the message
* is rendered to string representation.
* @return Message object
* @param a1 message argument
* @param a2 message argument
* @param a3 message argument
* @param a4 message argument
*/
public Message get(T1 a1, T2 a2, T3 a3, T4 a4) {
return new Message(this, a1, a2, a3, a4);
}
/**
* {@inheritDoc}
*/
boolean requiresFormatter() {
return true;
}
}
/**
* Subclass for creating messages with five arguments.
* @param <T1> The type of the first message argument.
* @param <T2> The type of the second message argument.
* @param <T3> The type of the third message argument.
* @param <T4> The type of the fourth message argument.
* @param <T5> The type of the fifth message argument.
*/
@org.opends.server.types.PublicAPI(
stability=org.opends.server.types.StabilityLevel.UNCOMMITTED,
mayInstantiate=true,
mayExtend=false,
mayInvoke=true)
static public final class Arg5<T1, T2, T3, T4, T5> extends MessageDescriptor {
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param category of created messages
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg5(String rbBase, String key, Category category,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, category, severity, ordinal, classLoader);
}
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param mask to apply to the USER_DEFINED category
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg5(String rbBase, String key, int mask,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, mask, severity, ordinal, classLoader);
}
/**
* Creates a message with arguments that will replace format
* specifiers in the assocated format string when the message
* is rendered to string representation.
* @return Message object
* @param a1 message argument
* @param a2 message argument
* @param a3 message argument
* @param a4 message argument
* @param a5 message argument
*/
public Message get(T1 a1, T2 a2, T3 a3, T4 a4, T5 a5) {
return new Message(this, a1, a2, a3, a4, a5);
}
/**
* {@inheritDoc}
*/
boolean requiresFormatter() {
return true;
}
}
/**
* Subclass for creating messages with six arguments.
* @param <T1> The type of the first message argument.
* @param <T2> The type of the second message argument.
* @param <T3> The type of the third message argument.
* @param <T4> The type of the fourth message argument.
* @param <T5> The type of the fifth message argument.
* @param <T6> The type of the sixth message argument.
*/
@org.opends.server.types.PublicAPI(
stability=org.opends.server.types.StabilityLevel.UNCOMMITTED,
mayInstantiate=true,
mayExtend=false,
mayInvoke=true)
static public final class Arg6<T1, T2, T3, T4, T5, T6> extends
MessageDescriptor {
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param category of created messages
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg6(String rbBase, String key, Category category,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, category, severity, ordinal, classLoader);
}
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param mask to apply to the USER_DEFINED category
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg6(String rbBase, String key, int mask,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, mask, severity, ordinal, classLoader);
}
/**
* Creates a message with arguments that will replace format
* specifiers in the assocated format string when the message
* is rendered to string representation.
* @return Message object
* @param a1 message argument
* @param a2 message argument
* @param a3 message argument
* @param a4 message argument
* @param a5 message argument
* @param a6 message argument
*/
public Message get(T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6) {
return new Message(this, a1, a2, a3, a4, a5, a6);
}
/**
* {@inheritDoc}
*/
boolean requiresFormatter() {
return true;
}
}
/**
* Subclass for creating messages with seven arguments.
* @param <T1> The type of the first message argument.
* @param <T2> The type of the second message argument.
* @param <T3> The type of the third message argument.
* @param <T4> The type of the fourth message argument.
* @param <T5> The type of the fifth message argument.
* @param <T6> The type of the sixth message argument.
* @param <T7> The type of the seventh message argument.
*/
@org.opends.server.types.PublicAPI(
stability=org.opends.server.types.StabilityLevel.UNCOMMITTED,
mayInstantiate=true,
mayExtend=false,
mayInvoke=true)
static public final class Arg7<T1, T2, T3, T4, T5, T6, T7>
extends MessageDescriptor
{
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param category of created messages
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg7(String rbBase, String key, Category category,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, category, severity, ordinal, classLoader);
}
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param mask to apply to the USER_DEFINED category
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg7(String rbBase, String key, int mask,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, mask, severity, ordinal, classLoader);
}
/**
* Creates a message with arguments that will replace format
* specifiers in the assocated format string when the message
* is rendered to string representation.
* @return Message object
* @param a1 message argument
* @param a2 message argument
* @param a3 message argument
* @param a4 message argument
* @param a5 message argument
* @param a6 message argument
* @param a7 message argument
*/
public Message get(T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7) {
return new Message(this, a1, a2, a3, a4, a5, a6, a7);
}
/**
* {@inheritDoc}
*/
boolean requiresFormatter() {
return true;
}
}
/**
* Subclass for creating messages with eight arguments.
* @param <T1> The type of the first message argument.
* @param <T2> The type of the second message argument.
* @param <T3> The type of the third message argument.
* @param <T4> The type of the fourth message argument.
* @param <T5> The type of the fifth message argument.
* @param <T6> The type of the sixth message argument.
* @param <T7> The type of the seventh message argument.
* @param <T8> The type of the eighth message argument.
*/
@org.opends.server.types.PublicAPI(
stability=org.opends.server.types.StabilityLevel.UNCOMMITTED,
mayInstantiate=true,
mayExtend=false,
mayInvoke=true)
static public final class Arg8<T1, T2, T3, T4, T5, T6, T7, T8>
extends MessageDescriptor
{
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param category of created messages
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg8(String rbBase, String key, Category category,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, category, severity, ordinal, classLoader);
}
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param mask to apply to the USER_DEFINED category
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg8(String rbBase, String key, int mask,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, mask, severity, ordinal, classLoader);
}
/**
* Creates a message with arguments that will replace format
* specifiers in the assocated format string when the message
* is rendered to string representation.
* @return Message object
* @param a1 message argument
* @param a2 message argument
* @param a3 message argument
* @param a4 message argument
* @param a5 message argument
* @param a6 message argument
* @param a7 message argument
* @param a8 message argument
*/
public Message get(T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6,
T7 a7, T8 a8) {
return new Message(this, a1, a2, a3, a4, a5, a6, a7, a8);
}
/**
* {@inheritDoc}
*/
boolean requiresFormatter() {
return true;
}
}
/**
* Subclass for creating messages with nine arguments.
* @param <T1> The type of the first message argument.
* @param <T2> The type of the second message argument.
* @param <T3> The type of the third message argument.
* @param <T4> The type of the fourth message argument.
* @param <T5> The type of the fifth message argument.
* @param <T6> The type of the sixth message argument.
* @param <T7> The type of the seventh message argument.
* @param <T8> The type of the eighth message argument.
* @param <T9> The type of the ninth message argument.
*/
@org.opends.server.types.PublicAPI(
stability=org.opends.server.types.StabilityLevel.UNCOMMITTED,
mayInstantiate=true,
mayExtend=false,
mayInvoke=true)
static public final class Arg9<T1, T2, T3, T4, T5, T6, T7, T8, T9>
extends MessageDescriptor {
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param category of created messages
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg9(String rbBase, String key, Category category,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, category, severity, ordinal, classLoader);
}
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param mask to apply to the USER_DEFINED category
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg9(String rbBase, String key, int mask,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, mask, severity, ordinal, classLoader);
}
/**
* Creates a message with arguments that will replace format
* specifiers in the assocated format string when the message
* is rendered to string representation.
* @return Message object
* @param a1 message argument
* @param a2 message argument
* @param a3 message argument
* @param a4 message argument
* @param a5 message argument
* @param a6 message argument
* @param a7 message argument
* @param a8 message argument
* @param a9 message argument
*/
public Message get(T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6,
T7 a7, T8 a8, T9 a9) {
return new Message(this, a1, a2, a3, a4, a5, a6, a7, a8, a9);
}
/**
* {@inheritDoc}
*/
boolean requiresFormatter() {
return true;
}
}
/**
* Subclass for creating messages with ten arguments.
* @param <T1> The type of the first message argument.
* @param <T2> The type of the second message argument.
* @param <T3> The type of the third message argument.
* @param <T4> The type of the fourth message argument.
* @param <T5> The type of the fifth message argument.
* @param <T6> The type of the sixth message argument.
* @param <T7> The type of the seventh message argument.
* @param <T8> The type of the eighth message argument.
* @param <T9> The type of the ninth message argument.
* @param <T10> The type of the tenth message argument.
*/
@org.opends.server.types.PublicAPI(
stability=org.opends.server.types.StabilityLevel.UNCOMMITTED,
mayInstantiate=true,
mayExtend=false,
mayInvoke=true)
static public final class Arg10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>
extends MessageDescriptor {
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param category of created messages
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg10(String rbBase, String key, Category category,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, category, severity, ordinal, classLoader);
}
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param mask to apply to the USER_DEFINED category
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg10(String rbBase, String key, int mask,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, mask, severity, ordinal, classLoader);
}
/**
* Creates a message with arguments that will replace format
* specifiers in the assocated format string when the message
* is rendered to string representation.
* @return Message object
* @param a1 message argument
* @param a2 message argument
* @param a3 message argument
* @param a4 message argument
* @param a5 message argument
* @param a6 message argument
* @param a7 message argument
* @param a8 message argument
* @param a9 message argument
* @param a10 message argument
*/
public Message get(T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6,
T7 a7, T8 a8, T9 a9, T10 a10) {
return new Message(this, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
}
/**
* {@inheritDoc}
*/
boolean requiresFormatter() {
return true;
}
}
/**
* Subclass for creating messages with eleven arguments.
* @param <T1> The type of the first message argument.
* @param <T2> The type of the second message argument.
* @param <T3> The type of the third message argument.
* @param <T4> The type of the fourth message argument.
* @param <T5> The type of the fifth message argument.
* @param <T6> The type of the sixth message argument.
* @param <T7> The type of the seventh message argument.
* @param <T8> The type of the eighth message argument.
* @param <T9> The type of the ninth message argument.
* @param <T10> The type of the tenth message argument.
* @param <T11> The type of the eleventh message argument.
*/
@org.opends.server.types.PublicAPI(
stability=org.opends.server.types.StabilityLevel.UNCOMMITTED,
mayInstantiate=true,
mayExtend=false,
mayInvoke=true)
static public final class Arg11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>
extends MessageDescriptor
{
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param category of created messages
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg11(String rbBase, String key, Category category,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, category, severity, ordinal, classLoader);
}
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param mask to apply to the USER_DEFINED category
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public Arg11(String rbBase, String key, int mask,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, mask, severity, ordinal, classLoader);
}
/**
* Creates a message with arguments that will replace format
* specifiers in the assocated format string when the message
* is rendered to string representation.
* @return Message object
* @param a1 message argument
* @param a2 message argument
* @param a3 message argument
* @param a4 message argument
* @param a5 message argument
* @param a6 message argument
* @param a7 message argument
* @param a8 message argument
* @param a9 message argument
* @param a10 message argument
* @param a11 message argument
*/
public Message get(T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6,
T7 a7, T8 a8, T9 a9, T10 a10, T11 a11) {
return new Message(this, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
}
/**
* {@inheritDoc}
*/
boolean requiresFormatter() {
return true;
}
}
/**
* Subclass for creating messages with an any number of arguments.
* In general this class should be used when a message needs to be
* defined with more arguments that can be handled with the current
* number of subclasses
*/
@org.opends.server.types.PublicAPI(
stability=org.opends.server.types.StabilityLevel.UNCOMMITTED,
mayInstantiate=true,
mayExtend=false,
mayInvoke=true)
static public final class ArgN extends MessageDescriptor {
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param category of created messages
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public ArgN(String rbBase, String key, Category category,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, category, severity, ordinal, classLoader);
}
/**
* Creates a parameterized instance.
* @param rbBase base of the backing resource bundle
* @param key for accessing the format string from the resource bundle
* @param mask to apply to the USER_DEFINED category
* @param severity of created messages
* @param ordinal of created messages
* @param classLoader the class loader to be used to get the ResourceBundle
*/
public ArgN(String rbBase, String key, int mask,
Severity severity, int ordinal, ClassLoader classLoader) {
super(rbBase, key, mask, severity, ordinal, classLoader);
}
/**
* Creates a message with arguments that will replace format
* specifiers in the assocated format string when the message
* is rendered to string representation.
* @return Message object
* @param args message arguments
*/
public Message get(Object... args) {
return new Message(this, args);
}
/**
* {@inheritDoc}
*/
boolean requiresFormatter() {
return true;
}
}
/**
* A descriptor for creating a raw message from a <code>String</code>.
* In general this descriptor should NOT be used internally. OpenDS
* plugins may want to use the mechanism to create messages without
* storing their strings in resource bundles.
*/
@org.opends.server.types.PublicAPI(
stability=org.opends.server.types.StabilityLevel.PRIVATE
)
static final class Raw extends MessageDescriptor {
private String formatString;
private boolean requiresFormatter;
/**
* Creates a parameterized instance.
* @param formatString for created messages
* @param category for created messages
* @param severity for created messages
*/
Raw(CharSequence formatString, Category category,
Severity severity) {
super(null, null, category, severity, null, null);
this.formatString = formatString != null ? formatString.toString() : "";
this.requiresFormatter = this.formatString.matches(".*%.*");
}
/**
* Creates a message with arguments that will replace format
* specifiers in the assocated format string when the message
* is rendered to string representation.
* @return Message object
* @param args message arguments
*/
public Message get(Object... args) {
return new Message(this, args);
}
/**
* Overridden in order to bypass the resource bundle
* plumbing and return the format string directly.
* @param locale ignored
* @return format string
*/
@Override
String getFormatString(Locale locale) {
return this.formatString;
}
/**
* {@inheritDoc}
*/
boolean requiresFormatter() {
return this.requiresFormatter;
}
}
/** String for accessing backing resource bundle. */
private final String rbBase;
/** Used for accessing format string from the resource bundle. */
private final String key;
/** Category for messages created by this descriptor. */
private final Category category;
/**
* Custom mask associated with messages created by this
* descriptor. The value of this variable might be null
* to indicate that the mask should come from
* <code>category</code>.
*/
private final Integer mask;
/**
* The severity associated with messages created by this
* descriptor.
*/
private final Severity severity;
/**
* The value that makes a message unique among other messages
* having the same severity and category. May be null for
* raw messages.
*/
private final Integer ordinal;
/**
* The class loader to be used to retrieve the ResourceBundle. If null
* the default class loader will be used.
*/
private final ClassLoader classLoader;
private final Map<Locale,String> formatStrMap = new HashMap<Locale,String>();
/**
* Obtains the category of this descriptor. Guaranteed not to be null.
* @return Category of this message
*/
public final Category getCategory() {
return this.category;
}
/**
* Obtains the severity of this descriptor. Gauranteed not to be null.
* @return Category of this message
*/
public final Severity getSeverity() {
return this.severity;
}
/**
* Obtains the ordinal value for this message which makes messages
* unique among messages defined with the same category and severity.
* @return int ordinal value
*/
public final int getOrdinal() {
if (this.ordinal == null)
return 0;
else
return this.ordinal;
}
/**
* Returns the ID unique to all OpenDS messages.
* @return unique ID
*/
public final int getId() {
if (this.ordinal == null) { // ordinal may be null for raw messages
return NULL_ID;
} else {
return this.ordinal | this.category.getMask() | this.severity.getMask();
}
}
/**
* Obtains the mask of this descriptor. The mask will either be
* the mask of the associated <code>Category</code> or the mask
* explicitly set in the constructor.
* @return Integer mask value
*/
public final int getMask() {
if (this.mask != null) {
return this.mask;
} else {
return this.category.getMask();
}
}
/**
* Returns the key for accessing the message template in a resource bundle.
* May be null for raw messages.
* @return key of this message
*/
public final String getKey() {
return this.key;
}
/**
* Obtains the resource bundle base string used to access the
* resource bundle containing created message's format string.
* May be null for raw messages.
* @return string base
*/
public final String getBase() {
return this.rbBase;
}
/**
* Indicates whether or not this descriptor format string should
* be processed by Formatter during string rendering.
* @return boolean where true means Formatter should be used; false otherwise
* @see java.util.Formatter
*/
abstract boolean requiresFormatter();
/**
* Obtains the format string for constructing the string
* value of this message according to the default
* locale.
* @return format string
*/
final String getFormatString() {
return getFormatString(Locale.getDefault());
}
/**
* Obtains the format string for constructing the string
* value of this message according to the requested
* locale.
* @param locale for the returned format string
* @return format string
*/
String getFormatString(Locale locale) {
String fmtStr = formatStrMap.get(locale);
if (fmtStr == null) {
ResourceBundle bundle = getBundle(locale);
fmtStr = bundle.getString(this.key);
formatStrMap.put(locale, fmtStr);
}
return fmtStr;
}
/**
* Indicates whether or not formatting should be applied
* to the given format string. Note that a format string
* might have literal specifiers (%% or %n for example) that
* require formatting but are not replaced by arguments.
* @param s candiate for formatting
* @return boolean where true indicates that the format
* string requires formatting
*/
protected final boolean containsArgumentLiterals(String s) {
return s.matches(".*%[n|%].*"); // match Formatter literals
}
private ResourceBundle getBundle(Locale locale) {
if (locale == null) locale = Locale.getDefault();
if (classLoader == null)
{
return ResourceBundle.getBundle(this.rbBase, locale);
}
else
{
return ResourceBundle.getBundle(this.rbBase, locale, classLoader);
}
}
/**
* Creates a parameterized message descriptor.
* @param rbBase string for accessing the underlying message bundle
* @param key for accessing the format string from the message bundle
* @param category of any created message
* @param severity of any created message
* @param ordinal of any created message
* @param classLoader the class loader to be used to get the ResourceBundle
*/
private MessageDescriptor(String rbBase, String key, Category category,
Severity severity, Integer ordinal,
ClassLoader classLoader) {
if (category == null) {
throw new NullPointerException("Null Category value for message " +
"descriptor with key " + key);
}
if (severity == null) {
throw new NullPointerException("Null Severity value for message " +
"descriptor with key " + key);
}
this.rbBase = rbBase;
this.key = key;
this.category = category;
this.severity = severity;
this.ordinal = ordinal;
this.classLoader = classLoader;
this.mask = null;
}
/**
* Creates a parameterized message descriptor. Messages created by
* this descriptor will have a category of <code>Category.USER_DEFINED</code>
* and have a custom mask indicated by <code>mask</code>.
* @param rbBase string for accessing the underlying message bundle
* @param key for accessing the format string from the message bundle
* @param mask custom mask
* @param severity of any created message
* @param ordinal of any created message
* @param classLoader the class loader to be used to get the ResourceBundle
*/
private MessageDescriptor(String rbBase, String key, int mask,
Severity severity, Integer ordinal,
ClassLoader classLoader) {
if (severity == null) {
throw new NullPointerException("Null Severity value for message " +
"descriptor with key " + key);
}
this.rbBase = rbBase;
this.key = key;
this.category = Category.USER_DEFINED;
this.severity = severity;
this.ordinal = ordinal;
this.classLoader = classLoader;
this.mask = mask;
}
}