#set( $filename = "MethodRegistry.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:
 #foreach( $supportedVersion in $model.VersionSet )
 *   $supportedVersion.getMajor()-$supportedVersion.getMinor()
 #end
 */
 
package org.apache.qpid.framing;

import org.apache.mina.common.ByteBuffer;

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

import java.util.Map;
import java.util.HashMap;


public abstract class MethodRegistry
{
    private static final Map<ProtocolVersion, MethodRegistry> _registries =
            new HashMap<ProtocolVersion, MethodRegistry>();

#foreach( $supportedVersion in $model.VersionSet )

#set( $verName = "_$supportedVersion.getMajor()_$supportedVersion.getMinor()" )
#set( $regPackage = "org.apache.qpid.framing.amqp$verName" )
	public static final MethodRegistry registry_$supportedVersion.getMajor()_$supportedVersion.getMinor() = 
	    new ${regPackage}.MethodRegistry${verName}();
	
#end
 			
			
    public abstract AMQMethodBody convertToBody(ByteBuffer in, long size)
        throws AMQFrameDecodingException;

    public abstract int getMaxClassId();

    public abstract int getMaxMethodId(int classId);

    
    protected MethodRegistry(ProtocolVersion pv)
    {
        _registries.put(pv, this);
    }

    public static MethodRegistry getMethodRegistry(ProtocolVersion pv)
    {
        return _registries.get(pv);
    }

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

#foreach( $amqpMethodVersions in $amqpClass.getMethods() )
#if( $amqpMethodVersions.isVersionInterfaceConsistent() )
#set( $amqpMethod = $amqpMethodVersions.asSingleVersionMethod($amqpMethodVersions.getVersionSet().first()) )

#set( $amqpMethodNameFirstChar = $amqpMethod.getName().substring(0,1) )
#set( $amqpMethodNameFirstCharU = $amqpMethodNameFirstChar.toUpperCase() )
#set( $amqpMethodNameUpperCamel = "$amqpMethodNameFirstCharU$amqpMethod.getName().substring(1)" )
    public abstract ${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                            
	                        );


#end
#end
#end


	public abstract ProtocolVersionMethodConverter getProtocolVersionMethodConverter();
	
}