/*
 *
 * 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.qpid.server.protocol.v0_8;

import org.apache.qpid.QpidException;
import org.apache.qpid.framing.AMQMethodBody;
import org.apache.qpid.protocol.AMQMethodEvent;

/**
 * AMQNoMethodHandlerException represents the case where no method handler exists to handle an AQMP method.
 *
 * <p>
 * TODO  Not an AMQP exception as no status code.
 * <p>
 * TODO  Missing method handler. Unlikely to ever happen, and if it does its a coding error. Consider replacing with a
 *       Runtime.
 */
public class AMQNoMethodHandlerException extends QpidException
{
    public AMQNoMethodHandlerException(AMQMethodEvent<AMQMethodBody> evt)
    {
        super("AMQMethodEvent " + evt + " was not processed by any listener on Broker.");
    }
}
