#set( $filename = "amqp_$version.getMajor()_$version.getMinor()/MethodRegistry_${version.getMajor()}_${version.getMinor()}.java")
/*
 *
 * 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.
 *
 */

/*
 * This file is auto-generated by $generator - do not modify.
 * Supported AMQP version:
 *   $version.getMajor()-$version.getMinor()
 */
 
package org.apache.qpid.framing.amqp_${version.getMajor()}_${version.getMinor()};

import org.apache.qpid.framing.*;
import org.apache.qpid.protocol.AMQConstant;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.apache.mina.common.ByteBuffer;

import org.apache.qpid.framing.abstraction.ProtocolVersionMethodConverter;


public class MethodRegistry_$version.getMajor()_$version.getMinor() extends MethodRegistry
{
	
    private static final Logger _log = LoggerFactory.getLogger(MethodRegistry.class);

	private ProtocolVersionMethodConverter _protocolVersionConverter = new MethodConverter_$version.getMajor()_$version.getMinor()();
	
#set( $specificModel = $model.asSingleVersionModel() )	
	
	
#set( $maxClassId = $specificModel.getMaximumClassId()+1 )	
	private final AMQMethodBodyInstanceFactory[][] _factories = new AMQMethodBodyInstanceFactory[$maxClassId][];

	public MethodRegistry_$version.getMajor()_$version.getMinor()()
	{
	    this(new ProtocolVersion((byte)$version.getMajor(),(byte)$version.getMinor()));
    }
	
	public MethodRegistry_$version.getMajor()_$version.getMinor()(ProtocolVersion pv)
	{
        super(pv);	
#foreach( $amqpClass in $specificModel.getClassList() )
#set( $amqpClassNameFirstChar = $amqpClass.getName().substring(0,1) )
#set( $amqpClassNameFirstCharU = $amqpClassNameFirstChar.toUpperCase() )
#set( $amqpClassNameUpperCamel = "$amqpClassNameFirstCharU$amqpClass.getName().substring(1)" )



		// Register method body instance factories for the $amqpClassNameUpperCamel class.

#set( $maxMethodId = $amqpClass.getMaximumMethodId()+1 )		
        _factories[$amqpClass.getClassId()] = new AMQMethodBodyInstanceFactory[$maxMethodId];
		
#foreach( $amqpMethod in $amqpClass.getMethodList() )
#set( $amqpMethodNameFirstChar = $amqpMethod.getName().substring(0,1) )
#set( $amqpMethodNameFirstCharU = $amqpMethodNameFirstChar.toUpperCase() )
#set( $amqpMethodNameUpperCamel = "$amqpMethodNameFirstCharU$amqpMethod.getName().substring(1)" )
        _factories[$amqpClass.getClassId()][$amqpMethod.getMethodId()] = ${amqpClassNameUpperCamel}${amqpMethodNameUpperCamel}BodyImpl.getFactory(); 
#end		
		
#end
		
		
	}


    public AMQMethodBody convertToBody(ByteBuffer in, long size)
        throws AMQFrameDecodingException
    {
	    int classId = in.getUnsignedShort();
		int methodId = in.getUnsignedShort();
	
        AMQMethodBodyInstanceFactory bodyFactory;
        try
        {
            bodyFactory = _factories[classId][methodId];
        }
        catch(NullPointerException e)
        {
            throw new AMQFrameDecodingException(AMQConstant.COMMAND_INVALID,
                "Class " + classId + " unknown in AMQP version $version.getMajor()-$version.getMinor()"
                 + " (while trying to decode class " + classId + " method " + methodId + ".");
        }
        catch(IndexOutOfBoundsException e)
        {
            if(classId >= _factories.length)
            {
                throw new AMQFrameDecodingException(AMQConstant.COMMAND_INVALID,
                    "Class " + classId + " unknown in AMQP version $version.getMajor()-$version.getMinor()"
                     + " (while trying to decode class " + classId + " method " + methodId + ".");

            }
            else
            {
                throw new AMQFrameDecodingException(AMQConstant.COMMAND_INVALID,
                    "Method " + methodId + " unknown in AMQP version $version.getMajor()-$version.getMinor()"
                     + " (while trying to decode class " + classId + " method " + methodId + ".");

            }
        }


        if (bodyFactory == null)
        {
            throw new AMQFrameDecodingException(AMQConstant.COMMAND_INVALID,
                "Method " + methodId + " unknown in AMQP version $version.getMajor()-$version.getMinor()"
                 + " (while trying to decode class " + classId + " method " + methodId + ".");
        }


        return bodyFactory.newInstance(in, size);


    }


    public int getMaxClassId()
	{
	    return $specificModel.getMaximumClassId();
	}
    
    public int getMaxMethodId(int classId)
	{
        return _factories[classId].length - 1;	
	}
	


#foreach( $amqpClass in $specificModel.getClassList() )
#set( $amqpClassNameFirstChar = $amqpClass.getName().substring(0,1) )
#set( $amqpClassNameFirstCharU = $amqpClassNameFirstChar.toUpperCase() )
#set( $amqpClassNameUpperCamel = "$amqpClassNameFirstCharU$amqpClass.getName().substring(1)" )

		
#foreach( $amqpMethod in $amqpClass.getMethodList() )
#set( $amqpMethodNameFirstChar = $amqpMethod.getName().substring(0,1) )
#set( $amqpMethodNameFirstCharU = $amqpMethodNameFirstChar.toUpperCase() )
#set( $amqpMethodNameUpperCamel = "$amqpMethodNameFirstCharU$amqpMethod.getName().substring(1)" )
    public ${amqpClassNameUpperCamel}${amqpMethodNameUpperCamel}Body create${amqpClassNameUpperCamel}${amqpMethodNameUpperCamel}Body(	
#foreach( $field in $amqpMethod.FieldList )
#if( $velocityCount == $amqpMethod.getFieldList().size() )
                                final $field.NativeType $field.Name
#else
                                final $field.NativeType $field.Name,
#end
#end                            
	                        )
    {
	    return new ${amqpClassNameUpperCamel}${amqpMethodNameUpperCamel}BodyImpl(
#foreach( $field in $amqpMethod.FieldList )
#if( $velocityCount == $amqpMethod.getFieldList().size() )
                                $field.Name
#else
                                $field.Name,
#end
#end                            
		                    );
    }
    
#end		
		
#end
		
	
    public ProtocolVersionMethodConverter getProtocolVersionMethodConverter()
    {
        return _protocolVersionConverter;
    }	

    
}
