/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.aries.jmx.blueprint;

import java.io.IOException;

import javax.management.openmbean.ArrayType;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeType;
import javax.management.openmbean.SimpleType;


public interface BlueprintMetadataMBean {

    /**
     * The object name for this MBean.
     */
    String OBJECTNAME = JmxConstants.ARIES_BLUEPRINT+":service=blueprintMetadata,version=1.0";
    
    
    ///////////////////////////////////////////////////////////////
    // Define <value>'s CompositeType
    ///////////////////////////////////////////////////////////////
    
    /**
     * The key STRING_VALUE, used in {@link #STRING_VALUE_ITEM}.
     */
    String          STRING_VALUE            = "StringValue";
    
    /**
     * The item containing the un-converted string representation of the value.
     * The key is {@link #STRING_VALUE}, and the type is {@link SimpleType#STRING}.
     */
    Item            STRING_VALUE_ITEM       = new Item(
                                                    STRING_VALUE, 
                                                    "The un-converted string representation of a value", 
                                                    SimpleType.STRING);
    
    /**
     * The key TYPE, used in {@link #TYPE_ITEM}.
     */
    String          TYPE                    = "Type";
    
    /**
     * The item containing the name of the type to which the value should be converted.
     * The key is {@link #TYPE}, and the type is {@link SimpleType#STRING}.
     */
    Item            TYPE_ITEM               = new Item(
                                                    TYPE, 
                                                    "The type of a value", 
                                                    SimpleType.STRING);
    
    /**
     * The name of CompositeType for ValueMetadata objects, used in {@link #VALUE_METADATA_TYPE}.
     */
    String          VALUE_METADATA          = "ValueMetadata";
    
    
    /**
     * The CompositeType encapsulates ValueMetadata objects. It contains the following items:
     * <ul>
     * <li>{@link #STRING_VALUE}</li>
     * <li>{@link #TYPE}</li>
     * </ul>
     */
    CompositeType   VALUE_METADATA_TYPE     = Item.compositeType(
                                                    VALUE_METADATA, 
                                                    "This type encapsulates ValueMetadata objects", 
                                                    STRING_VALUE_ITEM, 
                                                    TYPE_ITEM);                  
    
    ///////////////////////////////////////////////////////////////
    // Define <null>'s CompositeType
    ///////////////////////////////////////////////////////////////  
    
    /**
     * The key PLACEHOLDER, used in {@link #PLACEHOLDER_ITEM}.
     */ 
    String          PLACEHOLDER             = "Placeholder";
    
    /**
     * The item is a placeholder in the null metadata type.
     * The key is {@link #PLACEHOLDER}, and the type is {@link SimpleType#STRING}.
     */
    Item            PLACEHOLDER_ITEM        = new Item(
                                                    PLACEHOLDER, 
                                                    "This is a placeholder", 
                                                    SimpleType.VOID);
    
    /**
     * The name of CompositeType for NullMetadata objects, used in {@link #NULL_METADATA_TYPE}.
     */
    String          NULL_METADATA          = "NullMetadata";
    
    /**
     * The CompositeType for NullMetadata objects. A composite type requires at least one item, so we add a placeholder item.
     */
    CompositeType   NULL_METADATA_TYPE      = Item.compositeType(
                                                    NULL_METADATA, 
                                                    "This type encapsulates NullMetadata objects", 
                                                    PLACEHOLDER_ITEM);
    
    ///////////////////////////////////////////////////////////////
    // Define <ref>'s CompositeType
    ///////////////////////////////////////////////////////////////      
    
    /**
     * The key COMPONENT_ID, used in {@link #COMPONENT_ID_ITEM}.
     */
    String          COMPONENT_ID            = "ComponentId";
    
    /**
     * The item containing the component id to which the "ref" associates.
     * The key is {@link #COMPONENT_ID}, and the type is {@link SimpleType#STRING}.
     */
    Item            COMPONENT_ID_ITEM       = new Item(
                                                    COMPONENT_ID,
                                                    "The component id",
                                                    SimpleType.STRING);
    /**
     * The name of CompositeType for RefMetadata objects, used in {@link #REF_METADATA_TYPE}.
     */
    String          REF_METADATA          = "RefMetadata";
    
    /**
     * The CompositeType for a RefMetadata object. It contains the following items:
     * <ul>
     * <li>{@link #COMPONENT_ID}</li>
     * </ul>
     */
    CompositeType   REF_METADATA_TYPE       = Item.compositeType(
                                                    REF_METADATA, 
                                                    "This type encapsulates RefMetadata objects", 
                                                    COMPONENT_ID_ITEM);

    ///////////////////////////////////////////////////////////////
    // Define <idref>'s CompositeType
    // COMPONENT_ID_ITEM defined in <ref>'s definition
    ///////////////////////////////////////////////////////////////  
    /**
     * The name of CompositeType for IdRefMetadata objects, used in {@link #ID_REF_METADATA_TYPE}.
     */
    String          ID_REF_METADATA          = "IdRefMetadata";
    
    /**
     * The CompositeType for an IdRefMetadata object. It contains the following items:
     * <ul>
     * <li>{@link #COMPONENT_ID}</li>
     * </ul>
     */
    CompositeType   ID_REF_METADATA_TYPE    = Item.compositeType(
                                                    ID_REF_METADATA, 
                                                    "This type encapsulates IdRefMetadata objects", 
                                                    COMPONENT_ID_ITEM);
    
    ///////////////////////////////////////////////////////////////
    // Define <entry>'s CompositeType, 
    // used by MapMetadata, PropsMetadata, and Service properties
    ///////////////////////////////////////////////////////////////    
    
    /**
     * The key KEY, used in {@link #KEY_ITEM}.
     */    
    String          KEY                     = "Key";
    
    /**
     * The item containing the key of an entry.
     * The key is {@link #KEY}, and the type is {@link SimpleType#STRING}.
     */
    Item            KEY_ITEM                = new Item(
                                                    KEY,
                                                    "The key of an entry",
                                                    JmxConstants.BYTE_ARRAY_TYPE);
    
    /**
    * The key VALUE, used in {@link #VALUE_ITEM}.
    */
    String          VALUE                   = "Value";
       
    /**
    * The item containing a value and this will be used by 
    * BeanArgument, BeanProperty, MapEntry and CollectionMetadata.
    * The key is {@link #VALUE}, and the type is {@link JmxConstants#BYTE_ARRAY_TYPE}.
    */
    Item            VALUE_ITEM              = new Item(
                                                   VALUE, 
                                                   "A value", 
                                                   JmxConstants.BYTE_ARRAY_TYPE);  

    /**
     * The name of CompositeType for MapEntry objects, used in {@link #MAP_ENTRY_TYPE}.
     */
    String          MAP_ENTRY          = "MapEntry";
    
    /**
     * The CompositeType for a MapEntry object. It contains the following items:
     * <ul>
     * <li>{@link #KEY}</li>
     * <li>{@link #VALUE}</li>
     * </ul>
     */
    CompositeType   MAP_ENTRY_TYPE          = Item.compositeType(
                                                   MAP_ENTRY, 
                                                   "This type encapsulates MapEntry objects",
                                                   KEY_ITEM,
                                                   VALUE_ITEM);
    
    ///////////////////////////////////////////////////////////////
    // Define <map>'s CompositeType
    ///////////////////////////////////////////////////////////////
    
    /**
     * The key ENTRIES, used in {@link #ENTRIES_ITEM}.
     */
    String          ENTRIES                 = "Entries";
    
    /**
     * The item containing an array of entries
     * The key is {@link #ENTRIES}, and the type is {@link ArrayType}.
     */
    Item            ENTRIES_ITEM            = new Item(
                                                    ENTRIES,
                                                    "An array of entries",
                                                    Item.arrayType(1, MAP_ENTRY_TYPE));
    
    /**
     * The key KEY_TYPE, used in {@link #KEY_TYPE_ITEM}.
     */
    String          KEY_TYPE                = "KeyType";
    
    /**
     * The item containing the key type of the entries.
     * The key is {@link #KEY_TYPE}, and the type is {@link SimpleType#STRING}.
     */
    Item            KEY_TYPE_ITEM           = new Item(
                                                    KEY_TYPE,
                                                    "The key type of the entries",
                                                    SimpleType.STRING);
    
    /**
     * The key VALUE_TYPE, used in {@link #VALUE_TYPE_ITEM}.
     */
    String          VALUE_TYPE              = "ValueType";
    
    /**
     * The item containing the value type that the value should be
     * The key is {@link #VALUE_TYPE}, and the type is {@link SimpleType#STRING}.
     */
    Item            VALUE_TYPE_ITEM         = new Item(
                                                    VALUE_TYPE, 
                                                    "The value type", 
                                                    SimpleType.STRING);
    
    /**
     * The name of CompositeType for MapMetadata objects, used in {@link #MAP_METADATA_TYPE}.
     */
    String          MAP_METADATA          = "MapMetadata";
    
    /**
     * The CompositeType for a MapMetadata object. It contains the following items:
     * <ul>
     * <li>{@link #ENTRIES}</li>
     * <li>{@link #KEY_TYPE}</li>
     * <li>{@link #VALUE_TYPE}</li>
     * </ul>
     */
    CompositeType   MAP_METADATA_TYPE       = Item.compositeType(
                                                    MAP_METADATA, 
                                                    "This type encapsulates MapMetadata objects",
                                                    ENTRIES_ITEM,
                                                    KEY_TYPE_ITEM,
                                                    VALUE_TYPE_ITEM);
    
    ///////////////////////////////////////////////////////////////
    // Define <props>'s CompositeType
    // ENTRIES_ITEM defined in <map>'s definition
    ///////////////////////////////////////////////////////////////

    /**
     * The name of CompositeType for PropsMetadata objects, used in {@link #PROPS_METADATA_TYPE}.
     */
    String          PROPS_METADATA          = "PropsMetadata";    
    
    /**
     * The CompositeType for a PropsMetadata object. It contains the following items:
     * <ul>
     * <li>{@link #ENTRIES}</li>
     * </ul>
     */
    CompositeType   PROPS_METADATA_TYPE     = Item.compositeType(
                                                    PROPS_METADATA, 
                                                    "This type encapsulates PropsMetadata objects",
                                                    ENTRIES_ITEM);
    
    ///////////////////////////////////////////////////////////////
    // Define <collection>'s CompositeType
    // VALUE_TYPE_ITEM defined in <map>'s definition
    ///////////////////////////////////////////////////////////////   
    
    /**
     * The key COLLECTION_CLASS, used in {@link #KEY_TYPE_ITEM}.
     */
    String          COLLECTION_CLASS        = "CollectionClass";    
    
    /**
     * The item containing the type of this collection
     * The key is {@link #COLLECTION_CLASS}, and the type is {@link SimpleType#STRING}.
     */
    Item            COLLECTION_CLASS_ITEM   = new Item(
                                                    COLLECTION_CLASS,
                                                    "The type of this collection",
                                                    SimpleType.STRING);
    
    /**
     * The key VALUES, used in {@link #VALUES_ITEM}.
     */
    String          VALUES                  = "Values";
    
    /**
     * The item containing all the values
     * The key is {@link #VALUES}, and the type is {@link ArrayType}.
     */
    Item            VALUES_ITEM             = new Item(
                                                    VALUES,
                                                    "All the values",
                                                    Item.arrayType(2, SimpleType.BYTE));
    

    /**
     * The name of CompositeType for CollectionMetadata objects, used in {@link #COLLECTION_METADATA_TYPE}.
     */
    String          COLLECTION_METADATA          = "CollectionMetadata";    
    
    /**
     * The CompositeType for a CollectionMetadata object. It contains the following items:
     * <ul>
     * <li>{@link #COLLECTION_CLASS}</li>
     * <li>{@link #VALUES}</li>
     * <li>{@link #VALUE_TYPE}</li>
     * </ul>
     */
    CompositeType   COLLECTION_METADATA_TYPE= Item.compositeType(
                                                    COLLECTION_METADATA, 
                                                    "This type encapsulates CollectionMetadata objects",
                                                    COLLECTION_CLASS_ITEM,
                                                    VALUES_ITEM,
                                                    VALUE_TYPE_ITEM);
   
    ///////////////////////////////////////////////////////////////
    // Define <argument>'s CompositeType
    // VALUE_TYPE_ITEM defined in <map>'s definition
    ///////////////////////////////////////////////////////////////
    
    /**
     * The key INDEX, used in {@link #INDEX_ITEM}.
     */
    String          INDEX                   = "Index";
    
    /**
     * The item containing the zero-based index into the parameter list of
     * the factory method or constructor to be invoked for this argument.
     * The key is {@link #INDEX}, and the type is {@link SimpleType#INTEGER}.
     */
    Item            INDEX_ITEM              = new Item(
                                                    INDEX, 
                                                    "The zero-based index", 
                                                    SimpleType.INTEGER);

    /**
     * The name of CompositeType for BeanArgument objects, used in {@link #BEAN_ARGUMENT_TYPE}.
     */
    String          BEAN_ARGUMENT               = "BeanArgument";    

    
    /**
     * The CompositeType for a Argument object. It contains the following items:
     * <ul>
     * <li>{@link #INDEX}</li>
     * <li>{@link #VALUE_TYPE}</li>
     * <li>{@link #VALUE}</li>
     * </ul>
     */
    CompositeType   BEAN_ARGUMENT_TYPE          = Item.compositeType(
                                                    BEAN_ARGUMENT,
                                                    "This type encapsulates BeanArgument objects",
                                                    INDEX_ITEM,
                                                    VALUE_TYPE_ITEM,
                                                    VALUE_ITEM);
       
    ///////////////////////////////////////////////////////////////
    // Define <property>'s CompositeType
    ///////////////////////////////////////////////////////////////
    
    /**
     * The key NAME, used in {@link #NAME_ITEM}.
     */
    String          NAME                    = "Name";
    
    /**
     * The item containing the name of the property to be injected.
     * The key is {@link #NAME}, and the type is {@link SimpleType#STRING}.
     */
    Item            NAME_ITEM               = new Item(
                                                    NAME,
                                                    "The name of the property",
                                                    SimpleType.STRING);
    
    /**
     * The name of CompositeType for BeanProperty objects, used in {@link #BEAN_PROPERTY_TYPE}.
     */
    String          BEAN_PROPERTY               = "BeanProperty";    
    
    /**
     * The CompositeType for property type. It contains the following items:
     * <ul>
     * <li>{@link #NAME}</li>
     * <li>{@link #VALUE}</li>
     * </ul>
     */
    CompositeType   BEAN_PROPERTY_TYPE           = Item.compositeType(
                                                    BEAN_PROPERTY, 
                                                    "This type encapsulates BeanProperty objects",
                                                    NAME_ITEM,
                                                    VALUE_ITEM);
        
    ///////////////////////////////////////////////////////////////
    // Define Component's CompositeType
    // <bean>, <service> & Service Reference's CompositeType will 
    // extend this.
    ///////////////////////////////////////////////////////////////
    
    /**
     * The key ID, used in {@link #ID_ITEM}.
     */
    String          ID                    = "Id";

    /**
     * The item containing the component id of a component. 
     * The key is {@link #ID}, and the type is {@link SimpleType#STRING}.
     */
    Item            ID_ITEM       = new Item(
                                                    ID,
                                                    "The id of the component",
                                                    SimpleType.STRING);
    /**
     * The key ACTIVATION, used in {@link #ACTIVATION_ITEM}.
     */
    String          ACTIVATION              = "Activation";
    
    /**
     * The item containing the activation strategy for a component. 
     * The key is {@link #ACTIVATION}, and the type is {@link SimpleType#INTEGER}.
     */
    Item            ACTIVATION_ITEM         = new Item(
                                                    ACTIVATION,
                                                    "The activation strategy for a component",
                                                    SimpleType.INTEGER);
    
    /**
     * The key DEPENDS_ON, used in {@link #DEPENDS_ON_ITEM}.
     */
    String          DEPENDS_ON              = "DependsOn";
    
    /**
     * The item containing the ids of any components listed in a <code>depends-on</code> attribute for the component. 
     * The key is {@link #DEPENDS_ON}, and the type is {@link JmxConstants#STRING_ARRAY_TYPE}.
     */
    Item            DEPENDS_ON_ITEM         = new Item(
                                                    DEPENDS_ON,
                                                    "The ids of any components listed in a depends-on attribute",
                                                    JmxConstants.STRING_ARRAY_TYPE);
    
    /**
     * The name of CompositeType for ComponentMetadata objects, used in {@link #COMPONENT_METADATA_TYPE}.
     */
    String          COMPONENT_METADATA               = "ComponentMetadata";    
    
    /**
     * The CompositeType for a ComponentMetadata object, it contains 
     * the following items:
     * <ul>
     * <li>{@link #ID}</li>
     * <li>{@link #ACTIVATION}</li>
     * <li>{@link #DEPENDS_ON}</li>
     * </ul>
     */
    CompositeType   COMPONENT_METADATA_TYPE     = Item.compositeType(
                                                    COMPONENT_METADATA,
                                                    "This type encapsulates ComponentMetadata objects",
                                                    ID_ITEM,
                                                    ACTIVATION_ITEM,
                                                    DEPENDS_ON_ITEM);
                            
    ///////////////////////////////////////////////////////////////
    // Define <bean>'s CompositeType
    ///////////////////////////////////////////////////////////////
    
    /**
     * The key CLASS_NAME, used in {@link #CLASS_NAME_ITEM}.
     */
    String          CLASS_NAME              = "ClassName";
    
    /**
     * The item containing the name of the class specified for the bean. 
     * The key is {@link #CLASS_NAME}, and the type is {@link SimpleType#STRING}.
     */
    Item            CLASS_NAME_ITEM         = new Item(
                                                    CLASS_NAME,
                                                    "The name of the class specified for the bean",
                                                    SimpleType.STRING
                                                    );
    
    /**
     * The key INIT_METHOD, used in {@link #INIT_METHOD_ITEM}.
     */
    String          INIT_METHOD             = "InitMethod";
    
    /**
     * The item containing the name of the init method specified for the bean.
     * The key is {@link #INIT_METHOD}, and the type is {@link SimpleType#STRING}.
     */
    Item            INIT_METHOD_ITEM        = new Item(
                                                    INIT_METHOD, 
                                                    "The name of the init method specified for the bean", 
                                                    SimpleType.STRING);
    
    /**
     * The key DESTROY_METHOD, used in {@link #DESTROY_METHOD_ITEM}.
     */
    String          DESTROY_METHOD          = "DestroyMethod";
    
    /**
     * The item containing the name of the destroy method specified for the bean.
     * The key is {@link #DESTROY_METHOD}, and the type is {@link SimpleType#STRING}.
     */
    Item            DESTROY_METHOD_ITEM     = new Item(
                                                    DESTROY_METHOD, 
                                                    "The name of the destroy method specified for the bean", 
                                                    SimpleType.STRING);

    /**
     * The key FACTORY_METHOD, used in {@link #FACTORY_METHOD_ITEM}.
     */
    String          FACTORY_METHOD          = "FactoryMethod";
    
    /**
     * The item containing the name of the factory method specified for the bean.
     * The key is {@link #FACTORY_METHOD}, and the type is {@link SimpleType#STRING}.
     */
    Item            FACTORY_METHOD_ITEM     = new Item(
                                                    FACTORY_METHOD, 
                                                    "The name of the factory method specified for the bean", 
                                                    SimpleType.STRING);
    
    /**
     * The key FACTORY_COMPONENT, used in {@link #FACTORY_COMPONENT_ITEM}.
     */
    String          FACTORY_COMPONENT       = "FactoryComponent";
    
    /**
     * The item containing the id of the factory component on which to invoke the factory method for the bean.
     * The key is {@link #FACTORY_COMPONENT}, and the type is {@link JmxConstants#BYTE_ARRAY_TYPE}.
     */
    Item            FACTORY_COMPONENT_ITEM  = new Item(
                                                    FACTORY_COMPONENT, 
                                                    "The factory component on which to invoke the factory method for the bean", 
                                                    JmxConstants.BYTE_ARRAY_TYPE);
    
    /**
     * The key SCOPE, used in {@link #SCOPE_ITEM}.
     */
    String          SCOPE                   = "Scope";
    
    /**
     * The item containing the scope for the bean.
     * The key is {@link #SCOPE}, and the type is {@link SimpleType#STRING}.
     */
    Item            SCOPE_ITEM              = new Item(
                                                    SCOPE, 
                                                    "The scope for the bean", 
                                                    SimpleType.STRING);

    /**
     * The key ARGUMENT, used in {@link #ARGUMENTS_ITEM}.
     */
    String          ARGUMENTS                   = "Arguments";
        
    /**
     * The item containing the bean argument for the bean's compositeType.
     * The key is {@link #ARGUMENTS}, and the type is {@link #BEAN_ARGUMENT_TYPE}.
     */
    Item           ARGUMENTS_ITEM     = new Item(
                                                    ARGUMENTS, 
                                                    "The bean argument", 
                                                    Item.arrayType(1, BEAN_ARGUMENT_TYPE));
    
    /**
     * The key PROPERTY, used in {@link #PROPERTIES_ITEM}.
     */
    String          PROPERTIES         = "Properties";
        
    /**
     * The item containing the bean property for the bean's compositeType.
     * The key is {@link #PROPERTIES}, and the type is {@link #BEAN_PROPERTY_TYPE}.
     */
    Item            PROPERTIES_ITEM    = new Item(
                                                    PROPERTIES, 
                                                    "The bean property", 
                                                    Item.arrayType(1, BEAN_PROPERTY_TYPE));
    
    /**
     * The name of CompositeType for BeanMetadata objects, used in {@link #BEAN_METADATA_TYPE}.
     */
    String          BEAN_METADATA               = "BeanMetadata";    
    
    /**
     * The CompositeType for a BeanMetadata object, it extends {@link #COMPONENT_METADATA_TYPE} 
     * and adds the following items:
     * <ul>
     * <li>{@link #CLASS_NAME}</li>
     * <li>{@link #INIT_METHOD}</li>
     * <li>{@link #DESTROY_METHOD}</li>
     * <li>{@link #FACTORY_METHOD}</li>
     * <li>{@link #FACTORY_COMPONENT}</li>
     * <li>{@link #SCOPE}</li>
     * <li>{@link #ARGUMENTS}</li>
     * <li>{@link #PROPERTIES}</li>
     * </ul>
     */
    CompositeType   BEAN_METADATA_TYPE      = Item.extend(
                                                    COMPONENT_METADATA_TYPE, 
                                                    BEAN_METADATA, 
                                                    "This type encapsulates BeanMetadata objects",
                                                    CLASS_NAME_ITEM,
                                                    INIT_METHOD_ITEM,
                                                    DESTROY_METHOD_ITEM, 
                                                    FACTORY_METHOD_ITEM,
                                                    FACTORY_COMPONENT_ITEM,
                                                    SCOPE_ITEM,
                                                    ARGUMENTS_ITEM,
                                                    PROPERTIES_ITEM);

    ///////////////////////////////////////////////////////////////
    // Define <registration-listener>'s CompositeType
    ///////////////////////////////////////////////////////////////
    
    /**
     * The key LISTENER_COMPONENT, used in {@link #LISTENER_COMPONENT_ITEM}.
     */
    String          LISTENER_COMPONENT      = "ListenerComponent";
    
    /**
     * The item containing the listener component.
     * The key is {@link #LISTENER_COMPONENT}, and the type is {@link JmxConstants#BYTE_ARRAY_TYPE}.
     */
    Item            LISTENER_COMPONENT_ITEM = new Item(
                                                    LISTENER_COMPONENT, 
                                                    "The listener component", 
                                                    JmxConstants.BYTE_ARRAY_TYPE);
    
    /**
     * The key REGISTRATION_METHOD, used in {@link #REGISTRATION_METHOD_ITEM}.
     */
    String          REGISTRATION_METHOD     = "RegistrationMethod";
    
    /**
     * The item containing the name of the registration method.
     * The key is {@link #REGISTRATION_METHOD}, and the type is {@link SimpleType#STRING}.
     */
    Item            REGISTRATION_METHOD_ITEM    = new Item(
                                                    REGISTRATION_METHOD, 
                                                    "The name of the registration method", 
                                                    SimpleType.STRING);
    
    /**
     * The key UNREGISTRATION_METHOD, used in {@link #UNREGISTRATION_METHOD_ITEM}.
     */
    String          UNREGISTRATION_METHOD       = "UnregistrationMethod";
    
    /**
     * The item containing the name of the unregistration method.
     * The key is {@link #UNREGISTRATION_METHOD}, and the type is {@link SimpleType#STRING}.
     */
    Item            UNREGISTRATION_METHOD_ITEM  = new Item(
                                                    UNREGISTRATION_METHOD, 
                                                    "The name of the unregistration method", 
                                                    SimpleType.STRING);
    
    /**
     * The name of CompositeType for RegistrationListener objects, used in {@link #REGISTRATION_LISTENER_TYPE}.
     */
    String          REGISTRATION_LISTENER               = "RegistrationListener";    
    
    /**
     * The CompositeType for a registration listener, and it contains the following items:
     * <ul>
     * <li>{@link #LISTENER_COMPONENT}</li>
     * <li>{@link #REGISTRATION_METHOD}</li>
     * <li>{@link #UNREGISTRATION_METHOD}</li>
     * </ul>
     */
    CompositeType   REGISTRATION_LISTENER_TYPE  = Item.compositeType(
                                                    REGISTRATION_LISTENER, 
                                                    "This type encapsulates RegistrationListener objects",
                                                    LISTENER_COMPONENT_ITEM,
                                                    REGISTRATION_METHOD_ITEM,
                                                    UNREGISTRATION_METHOD_ITEM);
    
    
    ///////////////////////////////////////////////////////////////
    // Define <service>'s CompositeType
    ///////////////////////////////////////////////////////////////
    
    /**
     * The key INTERFACES, used in {@link #INTERFACES_ITEM}.
     */
    String          INTERFACES              = "Interfaces";
    
    /**
     * The item containing the type names of the interfaces that the service should be advertised as supporting.
     * The key is {@link #INTERFACES}, and the type is {@link JmxConstants#STRING_ARRAY_TYPE}.
     */
    Item            INTERFACES_ITEM         = new Item(
                                                    INTERFACES, 
                                                    "The type names of the interfaces", 
                                                    JmxConstants.STRING_ARRAY_TYPE);
    /**
     * The key AUTO_EXPORT, used in {@link #AUTO_EXPORT_ITEM}.
     */
    String          AUTO_EXPORT             = "AutoExport";
    
    /**
     * The item containing the auto-export mode for the service.
     * The key is {@link #AUTO_EXPORT}, and the type is {@link SimpleType#INTEGER}.
     */
    //TODO describe integer
    Item            AUTO_EXPORT_ITEM        = new Item(
                                                    AUTO_EXPORT, 
                                                    "The auto-export mode for the service", 
                                                    SimpleType.INTEGER);

    /**
     * The key RANKING, used in {@link #RANKING_ITEM}.
     */
    String          RANKING                 = "Ranking";
    
    /**
     * The item containing the ranking value to use when advertising the service.
     * The key is {@link #RANKING}, and the type is {@link SimpleType#INTEGER}.
     */
    Item            RANKING_ITEM            = new Item(
                                                    RANKING, 
                                                    "The ranking value when advertising the service", 
                                                    SimpleType.INTEGER);

    /**
     * The key SERVICE_COMPONENT, used in {@link #SERVICE_COMPONENT_ITEM}.
     */
    String          SERVICE_COMPONENT       = "ServiceComponent";
    
    /**
     * The item containing the id of the component to be exported as a service.
     * The key is {@link #SERVICE_COMPONENT}, and the type is {@link JmxConstants#BYTE_ARRAY_TYPE}.
     */
    Item            SERVICE_COMPONENT_ITEM  = new Item(
                                                    SERVICE_COMPONENT, 
                                                    "The component to be exported as a service", 
                                                    JmxConstants.BYTE_ARRAY_TYPE);
    
    /**
     * The key SERVICE_PROPERTIES, used in {@link #SERVICE_PROPERTIES_ITEM}.
     */
    String          SERVICE_PROPERTIES      = "ServiceProperties";
    
    /**
     * The item containing the user declared properties to be advertised with the service.
     * The key is {@link #SERVICE_COMPONENT}, and the type is {@link SimpleType#STRING}.
     */
    Item            SERVICE_PROPERTIES_ITEM = new Item(
                                                    SERVICE_PROPERTIES,
                                                    "The user declared properties to be advertised with the service",
                                                    Item.arrayType(1, MAP_ENTRY_TYPE));
    
    /**
     * The key REGISTRATION_LISTENERS, used in {@link #REGISTRATION_LISTENERS_ITEM}.
     */
    String          REGISTRATION_LISTENERS  = "RegistrationListeners";
    
    /**
     * The item containing all the registration listeners.
     * The key is {@link #REGISTRATION_LISTENERS}, and the type is {@link ArrayType}.
     */
    Item            REGISTRATION_LISTENERS_ITEM = new Item(
                                                    REGISTRATION_LISTENERS,
                                                    "All the registration listeners",
                                                    Item.arrayType(1, REGISTRATION_LISTENER_TYPE));
    
    /**
     * The name of CompositeType for ServiceMetadata objects, used in {@link #SERVICE_METADATA_TYPE}.
     */
    String          SERVICE_METADATA               = "ServiceMetadata";    
    
    /**
     * The CompositeType for a ServiceMetadata object, it extends {@link #COMPONENT_METADATA_TYPE}
     * and adds the following items:
     * <ul>
     * <li>{@link #INTERFACES}</li>
     * <li>{@link #AUTO_EXPORT}</li>
     * <li>{@link #RANKING}</li>
     * <li>{@link #SERVICE_COMPONENT}</li>
     * <li>{@link #SERVICE_PROPERTIES}</li>
     * <li>{@link #REGISTRATION_LISTENERS}</li>
     * </ul>
     */
    CompositeType   SERVICE_METADATA_TYPE   = Item.extend(
                                                    COMPONENT_METADATA_TYPE, 
                                                    SERVICE_METADATA, 
                                                    "This type encapsulates ServiceMetadata objects",
                                                    INTERFACES_ITEM,
                                                    AUTO_EXPORT_ITEM,
                                                    RANKING_ITEM,
                                                    SERVICE_COMPONENT_ITEM,
                                                    SERVICE_PROPERTIES_ITEM,
                                                    REGISTRATION_LISTENERS_ITEM);

    ///////////////////////////////////////////////////////////////
    // Define <reference-listener>'s CompositeType
    // LISTENER_COMPONENT_ITEM defined in the <registration-listener>
    ///////////////////////////////////////////////////////////////
    
    /**
     * The key BIND_METHOD, used in {@link #BIND_METHOD_ITEM}.
     */
    String          BIND_METHOD                 = "BindMethod";
    
    /**
     * The item containing the name of the bind method.
     * The key is {@link #BIND_METHOD}, and the type is {@link SimpleType#STRING}.
     */
    Item            BIND_METHOD_ITEM            = new Item(
                                                    BIND_METHOD, 
                                                    "The name of the bind method", 
                                                    SimpleType.STRING);
    
    /**
     * The key UNBIND_METHOD, used in {@link #UNBIND_METHOD_ITEM}.
     */
    String          UNBIND_METHOD               = "UnbindMethod";
    
    /**
     * The item containing the name of the unbind method.
     * The key is {@link #UNBIND_METHOD}, and the type is {@link SimpleType#STRING}.
     */
    Item            UNBIND_METHOD_ITEM          = new Item(
                                                    UNBIND_METHOD, 
                                                    "The name of the unbind method", 
                                                    SimpleType.STRING);
    
    /**
     * The name of CompositeType for ReferenceListener objects, used in {@link #REFERENCE_LISTENER_TYPE}.
     */
    String          REFERENCE_LISTENER               = "ReferenceListener"; 
    
    /**
     * The CompositeType for a reference listener, and it contains the following items:
     * <ul>
     * <li>{@link #LISTENER_COMPONENT}</li>
     * <li>{@link #BIND_METHOD}</li>
     * <li>{@link #UNBIND_METHOD}</li>
     * </ul>
     */
    CompositeType   REFERENCE_LISTENER_TYPE  = Item.compositeType(
                                                    REFERENCE_LISTENER, 
                                                    "This type encapsulates ReferenceListener objects",
                                                    LISTENER_COMPONENT_ITEM,
                                                    BIND_METHOD_ITEM,
                                                    UNBIND_METHOD_ITEM);
    
    
    ///////////////////////////////////////////////////////////////
    // Define Service Reference's CompositeType, 
    // <reference> & <reference-list> will extend this
    ///////////////////////////////////////////////////////////////
    
    /**
     * The key AVAILABILITY, used in {@link #AVAILABILITY_ITEM}.
     */
    String          AVAILABILITY            = "Availability";
    
    /**
     * The item specify whether or not a matching service is required at all times.
     * The key is {@link #AVAILABILITY}, and the type is {@link SimpleType#INTEGER}.
     * 
     */
    //TODO add description for each int
    Item            AVAILABILITY_ITEM       = new Item(
                                                    AVAILABILITY, 
                                                    "To specify whether or not a matching service is required at all times", 
                                                    SimpleType.INTEGER);
    
    /**
     * The key INTERFACE, used in {@link #INTERFACE_ITEM}.
     */
    String          INTERFACE               = "Interface";
    
    /**
     * The item containing the name of the interface type that a matching service must support.
     * The key is {@link #INTERFACE}, and the type is {@link SimpleType#STRING}.
     */
    Item            INTERFACE_ITEM          = new Item(
                                                    INTERFACE, 
                                                    "the name of the interface type", 
                                                    SimpleType.STRING);
    
    /**
     * The key COMPONENT_NAME, used in {@link #COMPONENT_NAME_ITEM}.
     */
    String          COMPONENT_NAME          = "ComponentName";
    
    /**
     * The item containing the value of the <code>component-name</code> attribute of the service reference.
     * The key is {@link #INTERFACE}, and the type is {@link SimpleType#STRING}.
     */
    Item            COMPONENT_NAME_ITEM     = new Item(
                                                    COMPONENT_NAME, 
                                                    "The value of the component-name attribute of the service reference", 
                                                    SimpleType.STRING);
    /**
     * The key FILTER, used in {@link #FILTER_ITEM}.
     */
    String          FILTER                  = "Filter";
    
    /**
     * The item containing the filter expression that a matching service must match.
     * The key is {@link #FILTER}, and the type is {@link SimpleType#STRING}.
     */
    Item            FILTER_ITEM             = new Item(
                                                    FILTER, 
                                                    "The filter expression that a matching service must match", 
                                                    SimpleType.STRING);
    
    /**
     * The key REFERENCE_LISTENERS, used in {@link #REFERENCE_LISTENERS_ITEM}.
     */
    String          REFERENCE_LISTENERS     = "ReferenceListeners";
    
    /**
     * The item containing all the reference listeners.
     * The key is {@link #REFERENCE_LISTENERS}, and the type is {@link ArrayType}.
     */
    Item            REFERENCE_LISTENERS_ITEM= new Item(
                                                    REFERENCE_LISTENERS,
                                                    "All the reference listeners",
                                                    Item.arrayType(1, REFERENCE_LISTENER_TYPE));
    
    /**
     * The name of CompositeType for ServiceReferenceMetadata objects, used in {@link #SERVICE_REFERENCE_METADATA_TYPE}.
     */
    String          SERVICE_REFERENCE_METADATA               = "ServiceReferenceMetadata"; 
    
    /**
     * The CompositeType for a ServiceReferenceMetadata object, it extends 
     * {@link #COMPONENT_METADATA_TYPE} and adds the following items:
     * <ul>
     * <li>{@link #AVAILABILITY}</li>
     * <li>{@link #INTERFACE}</li>
     * <li>{@link #COMPONENT_NAME}</li>
     * <li>{@link #FILTER}</li>
     * <li>{@link #REFERENCE_LISTENERS}</li>
     * </ul>
     */
    CompositeType   SERVICE_REFERENCE_METADATA_TYPE  = Item.extend(
                                                    COMPONENT_METADATA_TYPE, 
                                                    SERVICE_REFERENCE_METADATA, 
                                                    "This type encapsulates ServiceReferenceMetadata objects",
                                                    AVAILABILITY_ITEM,
                                                    INTERFACE_ITEM,
                                                    COMPONENT_NAME_ITEM,
                                                    FILTER_ITEM,
                                                    REFERENCE_LISTENERS_ITEM);
    
    ///////////////////////////////////////////////////////////////
    // Define <reference>'s CompositeType
    ///////////////////////////////////////////////////////////////
    
    /**
     * The key TIME_OUT, used in {@link #TIMEOUT_ITEM}.
     */
    String          TIMEOUT                = "TimeOut";
    
    /**
     * The item containing the timeout for service invocations when a backing service is is unavailable.
     * The key is {@link #TIMEOUT}, and the type is {@link SimpleType#LONG}.
     */
    Item            TIMEOUT_ITEM           = new Item(
                                                    TIMEOUT, 
                                                    "The timeout for service invocations when a backing service is is unavailable", 
                                                    SimpleType.LONG);
    
    /**
     * The name of CompositeType for ReferenceMetadata objects, used in {@link #REFERENCE_METADATA_TYPE}.
     */
    String          REFERENCE_METADATA        = "ReferenceMetadata"; 
    
    /**
     * The CompositeType for a ReferenceMetadata object, it extends 
     * {@link #SERVICE_REFERENCE_METADATA_TYPE} and adds the following items:
     * <ul>
     * <li>{@link #TIMEOUT}</li>
     * </ul>
     */
    CompositeType   REFERENCE_METADATA_TYPE = Item.extend(
                                                    SERVICE_REFERENCE_METADATA_TYPE, 
                                                    REFERENCE_METADATA, 
                                                    "This type encapsulates ReferenceMetadata objects",
                                                    TIMEOUT_ITEM);
    
    ///////////////////////////////////////////////////////////////
    // Define <reference-list>'s CompositeType
    ///////////////////////////////////////////////////////////////
    
    /**
     * The key MEMBER_TYPE, used in {@link #MEMBER_TYPE_ITEM}.
     */
    String          MEMBER_TYPE             = "MemberType";
    
    /**
     * The item specify whether the List will contain service object proxies or ServiceReference objects.
     * The key is {@link #MEMBER_TYPE}, and the type is {@link SimpleType#INTEGER}.
     */
    Item            MEMBER_TYPE_ITEM        = new Item(
                                                    MEMBER_TYPE, 
                                                    "To specify whether the List will contain service object proxies or ServiceReference objects", 
                                                    SimpleType.INTEGER);
    
    /**
     * The name of CompositeType for ReferenceListMetadata objects, used in {@link #REFERENCE_LIST_METADATA_TYPE}.
     */
    String          REFERENCE_LIST_METADATA        = "ReferenceListMetadata"; 
    
    /**
     * The CompositeType for a ReferenceListMetadata object, it extends 
     * {@link #SERVICE_REFERENCE_METADATA_TYPE} and adds the following items:
     * <ul>
     * <li>{@link #MEMBER_TYPE}</li>
     * </ul>
     */
    CompositeType   REFERENCE_LIST_METADATA_TYPE = Item.extend(
                                                    SERVICE_REFERENCE_METADATA_TYPE, 
                                                    REFERENCE_LIST_METADATA, 
                                                    "This type encapsulates ReferenceListMetadata objects",
                                                    MEMBER_TYPE_ITEM);


    /**
     * Returns the list of component id.
     * 
     * @param containerServiceId The blueprint container service id
     * @return the array of component id
     * @throws IOException if the operation fails
     */
    String[] getComponentIds(long containerServiceId) throws IOException;
    
    /**
     * Returns all component ids of the specified component type
     * 
     * @param containerServiceId The blueprint container service id
     * @param type The string used to specify the type of component
     * @return the array of component id
     * @throws IOException if the operation fails
     */
    String[] getComponentIdsByType(long containerServiceId, String type) throws IOException;
    
    /**
     * Returns the ComponentMetadata according to the its component id.
     * The returned Composite Data's type is actually one of {@link #BEAN_METADATA_TYPE}, 
     * {@link #SERVICE_METADATA_TYPE}, {@link #REFERENCE_METADATA_TYPE}, REFERENCE_LIST_METADATA_TYPE.
     * 
     * @param containerServiceId The blueprint container service id
     * @param componentId The component id
     * @return the ComponentMetadata
     * @throws IOException if the operation fails
     */
    CompositeData getComponentMetadata(long containerServiceId, String componentId) throws IOException;
        
    /**
     * Returns all the blueprint containers' service IDs, which successfully
     * created from blueprint bundles.
     * 
     * @return the list of all the service IDs of the blueprint containers created by current extender 
     * @throws IOException if the operation fails
     */
    long[] getBlueprintContainerServiceIds() throws IOException;
    
    /**
     * Returns the blueprint container's service id if the bundle specified 
     * by the bundle id is a blueprint bundle.
     * 
     * @param bundleId The bundle id of a blueprint bundle
     * @return the blueprint container's service id, or null if the blueprint bundle initialed failed.
     * @throws IOException if the operation fails
     * @throws IllegalArgumentException if the bundle is not a blueprint bundle
     */
    long getBlueprintContainerServiceId(long bundleId) throws IOException;
}
