#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 java.io.IOException;

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

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(MarkableDataInput in, long size)
        throws AMQFrameDecodingException, IOException;

    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();
}
