#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.AMQMethodBodyInstanceFactory;
import org.apache.qpid.framing.AMQFrameDecodingException;
import org.apache.qpid.framing.AMQMethodBody;
import org.apache.qpid.framing.MethodRegistry;
import org.apache.qpid.framing.ProtocolVersion;


import org.apache.log4j.Logger;
import org.apache.mina.common.ByteBuffer;

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

#set( $specificModel = $model.asSingleVersionModel() )	
	
	
	
	private final AMQMethodBodyInstanceFactory[][] _factories = new AMQMethodBodyInstanceFactory[$specificModel.getMaximumClassId()+1][];

	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.

        _factories[$amqpClass.getClassId()] = new AMQMethodBodyInstanceFactory[$amqpClass.getMaximumMethodId()+1];
		
#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(_log,
                "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(_log,
                    "Class " + classId + " unknown in AMQP version $version.getMajor()-$version.getMinor()"
                     + " (while trying to decode class " + classId + " method " + methodId + ".");

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

            }
        }


        if (bodyFactory == null)
        {
            throw new AMQFrameDecodingException(_log,
                "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;	
	}
	
    
}
