/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 2008-2018 Oracle and/or its affiliates. All rights reserved.
 *
 * The contents of this file are subject to the terms of either the GNU
 * General Public License Version 2 only ("GPL") or the Common Development
 * and Distribution License("CDDL") (collectively, the "License").  You
 * may not use this file except in compliance with the License.  You can
 * obtain a copy of the License at
 * https://oss.oracle.com/licenses/CDDL+GPL-1.1
 * or LICENSE.txt.  See the License for the specific
 * language governing permissions and limitations under the License.
 *
 * When distributing the software, include this License Header Notice in each
 * file and include the License file at LICENSE.txt.
 *
 * GPL Classpath Exception:
 * Oracle designates this particular file as subject to the "Classpath"
 * exception as provided by Oracle in the GPL Version 2 section of the License
 * file that accompanied this code.
 *
 * Modifications:
 * If applicable, add the following below the License Header, with the fields
 * enclosed by brackets [] replaced by your own identifying information:
 * "Portions Copyright [year] [name of copyright owner]"
 *
 * Contributor(s):
 * If you wish your version of this file to be governed by only the CDDL or
 * only the GPL Version 2, indicate your decision by adding "[Contributor]
 * elects to include this software in this distribution under the [CDDL or GPL
 * Version 2] license."  If you don't indicate a single choice of license, a
 * recipient has the option to distribute your version of this file under
 * either the CDDL, the GPL Version 2 or to extend the choice of license to
 * its licensees as provided above.  However, if you add GPL Version 2 code
 * and therefore, elected the GPL Version 2 license, then the option applies
 * only if the new code is made subject to such option by the copyright
 * holder.
 */

package org.glassfish.gmbal.impl;

import java.io.InvalidObjectException;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.UndeclaredThrowableException;
import java.util.List;
import java.util.Set;
import javax.management.AttributeNotFoundException;
import javax.management.JMException;
import javax.management.MBeanException;
import javax.management.ObjectName;
import javax.management.openmbean.OpenType;
import org.glassfish.gmbal.GmbalException;
import org.glassfish.gmbal.impl.AttributeDescriptor.AttributeType;
import org.glassfish.gmbal.typelib.EvaluatedClassDeclaration;
import org.glassfish.gmbal.typelib.EvaluatedDeclaration;
import org.glassfish.gmbal.typelib.EvaluatedFieldDeclaration;
import org.glassfish.gmbal.typelib.EvaluatedMethodDeclaration;
import org.glassfish.gmbal.typelib.EvaluatedType;
import org.glassfish.pfl.basic.logex.Chain;
import org.glassfish.pfl.basic.logex.ExceptionWrapper;
import org.glassfish.pfl.basic.logex.Log;
import org.glassfish.pfl.basic.logex.LogLevel;
import org.glassfish.pfl.basic.logex.Message;
import org.glassfish.pfl.basic.logex.WrapperGenerator;

/** Exception wrapper class.  The logex WrapperGenerator uses this interface
 * to generate an implementation which returns the appropriate exception, and
 * generates a log report when the method is called.  This is used for all
 * implementation classes in this package.
 *
 * The exception IDs are allocated in blocks of EXCEPTIONS_PER_CLASS, which is
 * a lot more than is needed, but we have 32 bits for IDs, and multiples of
 * a suitably chosen EXCEPTIONS_PER_CLASS (like 100 here) are easy to read in
 * error messages.
 *
 * @author ken
 */
@ExceptionWrapper( idPrefix="GMBAL",
    resourceBundle = "org.glassfish.gmbal.logex.LogStrings" )
public interface Exceptions {
    static final Exceptions self = WrapperGenerator.makeWrapper(
        Exceptions.class ) ;

    // Allow 100 exceptions per class
    static final int EXCEPTIONS_PER_CLASS = 100 ;

// AMXImpl
    static final int AMX_IMPL_START = 1 ;


    @Message( "Exception in getMeta" ) 
    @Log( id = AMX_IMPL_START + 0 )
    GmbalException excForGetMeta( @Chain MBeanException ex ) ;

// AttributeDescriptor
    static final int ATTRIBUTE_DESCRIPTOR_START = AMX_IMPL_START + 
        EXCEPTIONS_PER_CLASS ;

    @Message( "Required type is {0}" )
    @Log( id=ATTRIBUTE_DESCRIPTOR_START + 0 )
    GmbalException excForCheckType( AttributeType at ) ;

    @Message( "methodName and id must not both be null" )
    @Log( id=ATTRIBUTE_DESCRIPTOR_START + 1 )
    IllegalArgumentException excForMakeFromInherited( ) ;

    @Message( "{0} is not a valid attribute method" )
    @Log( id=ATTRIBUTE_DESCRIPTOR_START + 2 )
    IllegalArgumentException excForMakeFromAnnotated( EvaluatedDeclaration m ) ;

    @Message( "Unknown EvaluatedDeclaration type {0}")
    @Log( id=ATTRIBUTE_DESCRIPTOR_START + 4 )
    IllegalArgumentException unknownDeclarationType( EvaluatedDeclaration decl ) ;

    @Message( "Attribute id {0} in method {1} in class {2} is illegal becase "
        + "it is a reserved Attribute id for AMX" )
    @Log( id=ATTRIBUTE_DESCRIPTOR_START + 5 )
    IllegalArgumentException duplicateAMXFieldName(String actualId,
        String methodName, String className );

// DescriptorIntrospector
    static final int DESCRIPTOR_INTROSPECTOR_START =
        ATTRIBUTE_DESCRIPTOR_START + EXCEPTIONS_PER_CLASS ;

    @Message( "@DescriptorFields must contain '=' : {0}" )
    @Log( id=DESCRIPTOR_INTROSPECTOR_START + 0 )
    IllegalArgumentException excForAddDescriptorFieldsToMap( String field ) ;

    @Log( id=DESCRIPTOR_INTROSPECTOR_START + 1 )
    @Message( "Exception in addAnnotationFieldsToMap")
    UndeclaredThrowableException excForAddAnnotationFieldsToMap(
        @Chain Exception ex ) ;

    @Message( "Inconcistent values for descriptor field {0} from annotations: {1} :: {2}" )
    @Log( id=DESCRIPTOR_INTROSPECTOR_START + 2 )
    IllegalArgumentException excForAddToMap( String name, Object value, Object oldValue ) ;

    @Message( "Illegal type for annotation element using @DescriptorKey: {0}" )
    @Log( id=DESCRIPTOR_INTROSPECTOR_START + 3 )
    IllegalArgumentException excForAnnotationToField( String name ) ;

// ImmutableDescriptor
    static final int IMMUTABLE_DESCRIPTOR_START =
        DESCRIPTOR_INTROSPECTOR_START + EXCEPTIONS_PER_CLASS ;

    @Message( "Null Map" )
    @Log( id=IMMUTABLE_DESCRIPTOR_START + 0 )
    IllegalArgumentException nullMap() ;

    @Message( "Empty or null field name" )
    @Log( id=IMMUTABLE_DESCRIPTOR_START + 1 )
    IllegalArgumentException badFieldName() ;

    @Message( "Duplicate field name: {0}" )
    @Log( id=IMMUTABLE_DESCRIPTOR_START + 2 )
    IllegalArgumentException duplicateFieldName( String name ) ;

    @Message( "Bad names or values" )
    @Log( id=IMMUTABLE_DESCRIPTOR_START + 3 )
    InvalidObjectException excForReadResolveImmutableDescriptor() ;

    @Message( "Null array parameter")
    @Log( id=IMMUTABLE_DESCRIPTOR_START + 4 )
    IllegalArgumentException nullArrayParameter() ;

    @Message( "Different size arrays")
    @Log( id=IMMUTABLE_DESCRIPTOR_START + 5 )
    IllegalArgumentException differentSizeArrays() ;

    @Message( "Null fields parameter")
    @Log( id=IMMUTABLE_DESCRIPTOR_START + 6 )
    IllegalArgumentException nullFieldsParameter() ;

    @Message( "Missing = character: {0}")
    @Log( id=IMMUTABLE_DESCRIPTOR_START + 7 )
    IllegalArgumentException badFieldFormat( String field ) ;

    @Message( "Inconsistent values for descriptor field {0}: {1} :: {2}" )
    @Log( id=IMMUTABLE_DESCRIPTOR_START + 8 )
    IllegalArgumentException excForUnion( String name, Object oldValue, Object value ) ;

    @Message( "Null argument" )
    @Log( id=IMMUTABLE_DESCRIPTOR_START + 9 )
    IllegalArgumentException nullArgument() ;

    @Message( "Descriptor is read-only" )
    @Log( id=IMMUTABLE_DESCRIPTOR_START + 10 )
    UnsupportedOperationException unsupportedOperation() ;

// MBeanImpl
    static final int MBEAN_IMPL_START =
        IMMUTABLE_DESCRIPTOR_START + EXCEPTIONS_PER_CLASS ;

    @Message( "Cannot set parent to {0}: this node already has a parent" )
    @Log( id=MBEAN_IMPL_START + 0 )
    IllegalArgumentException nodeAlreadyHasParent( MBeanImpl entity ) ;

    @Message( "Parent object {0} only allows subtypes {1}: "
        + " cannot add child {2} of type {3}" )
    @Log( id=MBEAN_IMPL_START + 1 )
    public IllegalArgumentException invalidSubtypeOfParent(ObjectName oname,
	Set<String> subTypes, ObjectName objectName, String type);

    @Message( "Parent object {0} cannot contain more than one object" +
        " of type {1}: cannot add child {2}")
    @Log( id=MBEAN_IMPL_START + 2 )
    public IllegalArgumentException childMustBeSingleton(ObjectName pname, String ctype,
	ObjectName cname);

    @Message( "tried to register MBean {0} that is already registered" )
    @Log( id = MBEAN_IMPL_START + 3 )
    void registerMBeanRegistered(ObjectName oname);

    @Message( "tried to unregister MBean {0} that is not registered" )
    @Log( id = MBEAN_IMPL_START + 4 )
    void unregisterMBeanNotRegistered(ObjectName oname);

    // @StackTrace
    @Message( "registering MBean {0}")
    @Log( id = MBEAN_IMPL_START + 5, level=LogLevel.INFO )
    public void registeringMBean(ObjectName oname);

    // XXX Do we want to support StackTrace annotation?
    // @StackTrace
    @Message( "unregistering MBean {0}")
    @Log( id = MBEAN_IMPL_START + 6, level=LogLevel.INFO )
    public void unregisteringMBean(ObjectName oname);

    @Message( "Got an unexpected exception from method {0}" ) 
    @Log( id = MBEAN_IMPL_START + 7 ) 
    public void unexpectedException( String method, @Chain Throwable exc ) ;

// MBeanSkeleton
    static final int MBEAN_SKELETON_START =
        MBEAN_IMPL_START + EXCEPTIONS_PER_CLASS ;

    @Message( "At least one of getter and setter must not be null")
    @Log( id=MBEAN_SKELETON_START + 0 )
    IllegalArgumentException notBothNull() ;

    @Message( "Getter and setter type must match")
    @Log( id=MBEAN_SKELETON_START + 1 )
    IllegalArgumentException typesMustMatch() ;

    @Message( "Methods {0} and {1} are both annotated "
        + "with @ObjectNameKey in class {2}")
    @Log( id=MBEAN_SKELETON_START + 2 )
    IllegalArgumentException duplicateObjectNameKeyAttributes(
        EvaluatedMethodDeclaration first, EvaluatedMethodDeclaration second,
        String className ) ;

    @Message( "ParameterNams annotation must have the same number "
        + "of arguments as the length of the method parameter list" )
    @Log( id=MBEAN_SKELETON_START + 3 )
    IllegalArgumentException parameterNamesLengthBad() ;

    @Message( "Could not find attribute {0}" )
    @Log( id=MBEAN_SKELETON_START + 4 )
    AttributeNotFoundException couldNotFindAttribute( String name ) ;

    @Message( "Could not find writable attribute {0}" )
    @Log( id=MBEAN_SKELETON_START + 5 )
    AttributeNotFoundException couldNotFindWritableAttribute( String name ) ;

    @Message( "Could not find operation named {0}" )
    @Log( id=MBEAN_SKELETON_START + 6 )
    IllegalArgumentException couldNotFindOperation( String name ) ;

    @Message( "Could not find operation named {0} with signature {1}" )
    @Log( id=MBEAN_SKELETON_START + 7 )
    IllegalArgumentException couldNotFindOperationAndSignature( String name,
        List<String> signature) ;

    @Message( "Name of this ManagedObject")
    String nameOfManagedObject() ;

    @Message( "Error in setting attribute {0}" )
    @Log( id=MBEAN_SKELETON_START + 8 )
    void attributeSettingError( @Chain Exception ex, String name ) ;

    @Message( "Error in getting attribute {0}" )
    @Log( id=MBEAN_SKELETON_START + 9 )
    void attributeGettingError( @Chain Exception ex, String name ) ;

    @Message( "OpenDataException trying to create "
        + "OpenMBEanParameterInfoSupport for parameter {0} on method {1}" )
    @Log( id = MBEAN_SKELETON_START + 10 )
    IllegalStateException excInOpenParameterInfo(
        @Chain IllegalArgumentException exc,
        String paramName, EvaluatedMethodDeclaration meth ) ;

    @Message( "Exception on invoking annotation method {0}")
    @Log( id = MBEAN_SKELETON_START + 11, level=LogLevel.SEVERE )
    public RuntimeException annotationMethodException(Method m,
        @Chain Exception exc);

// MBeanTree
    static final int MBEAN_TREE_START =
        MBEAN_SKELETON_START + EXCEPTIONS_PER_CLASS ;

    @Message( "Root has already been set: cannot set it again" )
    @Log( id=MBEAN_TREE_START + 0 )
    IllegalStateException rootAlreadySet() ;

    @Message( "Could not construct ObjectName for root" )
    @Log( id=MBEAN_TREE_START + 1 )
    IllegalArgumentException noRootObjectName( @Chain Exception ex ) ;

    @Message( "Could not register root with ObjectName {0}" )
    @Log( id=MBEAN_TREE_START + 2 )
    IllegalArgumentException rootRegisterFail(
        @Chain Exception ex, ObjectName rootName);

    @Message( "Root has not been set" )
    @Log( id=MBEAN_TREE_START + 3 )
    IllegalStateException rootNotSet() ;

    @Message( "rootParentName {0} is invalid: missing type or name" )
    @Log( id=MBEAN_TREE_START + 4 )
    GmbalException invalidRootParentName( ObjectName oname ) ;

    @Message( "Entity {0} is not part of this EntityTree" )
    @Log( id=MBEAN_TREE_START + 5 )
    IllegalArgumentException notPartOfThisTree( MBeanImpl mbi ) ;

    @Message( "Parent cannot be null" )
    @Log( id=MBEAN_TREE_START + 6 )
    IllegalArgumentException parentCannotBeNull() ;

    @Message( "Parent object {0} not found" )
    @Log( id=MBEAN_TREE_START + 7 )
    IllegalArgumentException parentNotFound( Object parent ) ;

    @Message( "Object {0} is already registered as {1}")
    @Log( id=MBEAN_TREE_START + 8 )
    IllegalArgumentException objectAlreadyRegistered( Object obj, MBeanImpl oldMbi ) ;

    @Message( "Should not happen" )
    @Log( id=MBEAN_TREE_START + 9, level=LogLevel.FINE )
    void shouldNotHappen( @Chain Exception ex ) ;

    @Message( "Object {0} not found")
    @Log( id=MBEAN_TREE_START + 10 )
    IllegalArgumentException objectNotFound( Object obj ) ;

    @Message( "The ObjectName of the root parent MUST contain pp key")
    @Log( id=MBEAN_TREE_START + 11 )
    IllegalArgumentException ppNullInRootParent() ;

    @Message( "The ObjectName of the root parent MUST contain pp key")
    @Log( id=MBEAN_TREE_START + 12 )
    IllegalArgumentException typeNullInRootParent() ;

    @Message( "A MalformedObjectNameException occured on {0}" )
    @Log( id=MBEAN_TREE_START + 13 )
    IllegalArgumentException malformedObjectName( @Chain Exception exc,
        String str ) ;

// ManagedObjectManagerImpl
    static final int MANAGED_OBJECT_MANAGER_IMPL_START =
        MBEAN_TREE_START + EXCEPTIONS_PER_CLASS ;

    @Message( "obj argument is a String: {0} : was a call to "
        + "registerAtRoot intended here?" )
    @Log( id=MANAGED_OBJECT_MANAGER_IMPL_START + 0 )
    IllegalArgumentException objStringWrongRegisterCall( String str ) ;

    @Message( "Exception in register" )
    @Log( id=MANAGED_OBJECT_MANAGER_IMPL_START + 1 )
    IllegalArgumentException exceptionInRegister( @Chain Exception ex ) ;

    @Message( "Exception in unregister" )
    @Log( id=MANAGED_OBJECT_MANAGER_IMPL_START + 2 )
    IllegalArgumentException exceptionInUnregister( @Chain Exception ex ) ;

    @Message( "Cannot add annotation to element {0}: "
        + "an Annotation of type {1} is already present")
    @Log( id=MANAGED_OBJECT_MANAGER_IMPL_START + 3 )
    IllegalArgumentException duplicateAnnotation( AnnotatedElement element,
        String name ) ;

    @Message( "Class {0} contains both the InheritedAttribute and "
        + "the InheritedAttributes annotations" )
    @Log( id=MANAGED_OBJECT_MANAGER_IMPL_START + 4 )
    IllegalArgumentException badInheritedAttributeAnnotation(
        EvaluatedClassDeclaration cls ) ;

    @Message( "Field {0} must be final and have an immutable type "
        + "to be used as an attribute" )
    @Log( id=MANAGED_OBJECT_MANAGER_IMPL_START + 5 )
    IllegalArgumentException illegalAttributeField(
        EvaluatedFieldDeclaration cls ) ;

    @Message( "No description available!" )
    String noDescriptionAvailable() ;

    @Message( "Method {0} cannot be called before a successful createRoot call")
    @Log( id=MANAGED_OBJECT_MANAGER_IMPL_START + 6 )
    IllegalStateException createRootNotCalled( String methodName ) ;

    @Message( "Method {0} cannot be called after a successful createRoot call")
    @Log( id=MANAGED_OBJECT_MANAGER_IMPL_START + 7 )
    IllegalStateException createRootCalled( String methodName ) ;

    @Message( "Could not construct MBean {0}")
    @Log( id=MANAGED_OBJECT_MANAGER_IMPL_START + 8 )
    public IllegalArgumentException errorInConstructingMBean(String objName,
        @Chain JMException exc);

    @Message( "Attempt made to register non-singleton object of type {1}"
        + " without a name as a child of {0}" )
    @Log( id=MANAGED_OBJECT_MANAGER_IMPL_START + 9 )
    public IllegalArgumentException nonSingletonRequiresName(
        MBeanImpl parentEntity, String type);

    @Message( "Attempt made to register singleton object of type {1}"
        + " with name {2} as a child of {0}")
    @Log( id=MANAGED_OBJECT_MANAGER_IMPL_START + 10 )
    public IllegalArgumentException singletonCannotSpecifyName(
        MBeanImpl parentEntity, String type, String name);

    @Message( "No {0} annotation found on {1}" )
    @Log( id=MANAGED_OBJECT_MANAGER_IMPL_START + 11 )
    public IllegalArgumentException noAnnotationFound(String name, String cls );

    @Message( "Cannot add null annotation to {0}" )
    @Log( id=MANAGED_OBJECT_MANAGER_IMPL_START + 12 )
    public IllegalArgumentException cannotAddNullAnnotation(AnnotatedElement element);

    @Message( "ManagedObject annotation not found on class {0}")
    @Log( id=MANAGED_OBJECT_MANAGER_IMPL_START + 13 )
    public IllegalArgumentException managedObjectAnnotationNotFound(String cname);

    @Message( "Cannot call getAnnotations on {0}")
    @Log( id=MANAGED_OBJECT_MANAGER_IMPL_START + 14 )
    public IllegalArgumentException annotationsNotSupported(AnnotatedElement elem);

// TypeConverterImpl
    static final int TYPE_CONVERTER_IMPL_START =
        MANAGED_OBJECT_MANAGER_IMPL_START + EXCEPTIONS_PER_CLASS ;

    @Message( "Unsupported OpenType {0}")
    @Log( id=TYPE_CONVERTER_IMPL_START + 0 )
    IllegalArgumentException unsupportedOpenType( OpenType ot ) ;

    @Message( "{0} cannot be converted into a Java class")
    @Log( id=TYPE_CONVERTER_IMPL_START + 1 )
    IllegalArgumentException cannotConvertToJavaType( EvaluatedType type ) ;

    @Message( "Management entity {0} is not an ObjectName")
    @Log( id=TYPE_CONVERTER_IMPL_START + 2 )
    IllegalArgumentException entityNotObjectName( Object entity ) ;

    @Message( "Arrays of arrays not supported")
    @Log( id=TYPE_CONVERTER_IMPL_START + 3 )
    IllegalArgumentException noArrayOfArray( @Chain Exception exc ) ;

    @Message( "{0} is not a String" )
    @Log( id=TYPE_CONVERTER_IMPL_START + 4 )
    IllegalArgumentException notAString( Object obj ) ;

    @Message( "There is no <init>(String) constructor "
        + "available to convert a String into a {0}")
    @Log( id=TYPE_CONVERTER_IMPL_START + 5 )
    UnsupportedOperationException noStringConstructor( Class cls ) ;

    @Message( "Error in converting from String to {0}" )
    @Log( id=TYPE_CONVERTER_IMPL_START + 6 )
    IllegalArgumentException stringConversionError( Class cls, @Chain
        Exception exc ) ;

    @Message( "Exception in makeCompositeType")
    @Log( id=TYPE_CONVERTER_IMPL_START + 7 )
    IllegalArgumentException exceptionInMakeCompositeType( @Chain Exception exc ) ;

    @Message( "Exception in handleManagedData")
    @Log( id=TYPE_CONVERTER_IMPL_START + 8 )
    IllegalArgumentException exceptionInHandleManagedData( @Chain Exception exc ) ;

    @Message( "Remove is not supported")
    @Log( id=TYPE_CONVERTER_IMPL_START + 9 )
    UnsupportedOperationException removeNotSupported( ) ;

    @Message( "Recursive types are not supported: type is {0}")
    @Log( id=TYPE_CONVERTER_IMPL_START + 10 )
    UnsupportedOperationException recursiveTypesNotSupported( EvaluatedType et ) ;

    @Message( "OpenType exception in ArrayType construction caused by {0}")
    @Log( id=TYPE_CONVERTER_IMPL_START + 11 )
    IllegalArgumentException openTypeInArrayTypeException( OpenType ot,
        @Chain Exception exc ) ;

    @Message( "Exception in makeMapTabularType")
    @Log( id=TYPE_CONVERTER_IMPL_START + 12 )
    IllegalArgumentException exceptionInMakeMapTabularType(
        @Chain Exception exc ) ;

    @Message( "row type for {0}")
    String rowTypeDescription( String mapType ) ;

    @Message( "Key of map {0}")
    String keyFieldDescription( String mapType ) ;

    @Message( "Value of map {0}")
    String valueFieldDescription( String mapType ) ;

    @Message( "Table:{0}")
    String tableName( String mapType ) ;

    @Message( "Table for map {0}")
    String tableDescription( String mapType ) ;

    @Message( "Exception in makeMapTabularData:toManagedEntity")
    @Log( id=TYPE_CONVERTER_IMPL_START + 13 )
    IllegalArgumentException excInMakeMapTabularDataToManagedEntity(
        @Chain Exception exc ) ;

    @Message( "{0} must have at least 1 type argument")
    @Log( id=TYPE_CONVERTER_IMPL_START + 14 )
    IllegalArgumentException paramTypeNeedsArgument( ParameterizedType type ) ;

    @Message( "Converting from OpenType {0} to Java type {1} is not supported")
    @Log( id=TYPE_CONVERTER_IMPL_START + 15 )
    UnsupportedOperationException openToJavaNotSupported( OpenType otype, 
        EvaluatedType javaType ) ;

    @Message( "iterator() method not found in subclass of Iterable {0}") 
    @Log( id=TYPE_CONVERTER_IMPL_START + 16 ) 
    IllegalStateException iteratorNotFound( EvaluatedClassDeclaration cls ) ;

    @Message( "next() method not found in type {0}") 
    @Log( id=TYPE_CONVERTER_IMPL_START + 17 )
    IllegalStateException nextNotFound( EvaluatedClassDeclaration cls ) ;

    @Message( "Could not set field {1} in CompositeData for type {0}")
    @Log( id=TYPE_CONVERTER_IMPL_START + 18, level=LogLevel.FINE )
    public void errorInConstructingOpenData(String name, String id,
        @Chain JMException ex);

    @Message( "No <init>(String) constructor available for class {0}")
    @Log( id=TYPE_CONVERTER_IMPL_START + 19, level=LogLevel.FINE )
    void noStringConstructorAvailable( @Chain Exception exc, String name);

// JMXRegistrationManager start
    static final int JMX_REGISTRATION_MANAGER_START =
        TYPE_CONVERTER_IMPL_START + EXCEPTIONS_PER_CLASS ;

    @Message( "JMX exception on registration of MBean {0}" )
    @Log( id=JMX_REGISTRATION_MANAGER_START + 0 )
    void deferredRegistrationException( @Chain JMException exc,
        MBeanImpl mbean ) ;
}
