/*
 *
 * 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.v1_0.type;

import org.apache.qpid.server.protocol.v1_0.type.transport.Error;

import java.util.Formatter;

public class AmqpErrorException extends Exception
{
    private final Error _error;


    public AmqpErrorException(final Error error)
    {
        _error = error;
    }

    public AmqpErrorException(ErrorCondition condition)
    {
        _error = new Error();
        _error.setCondition(condition);
    }

    public AmqpErrorException(ErrorCondition condition, String format, Object... args)
    {
        _error = new Error();
        _error.setCondition(condition);
        _error.setDescription((new Formatter()).format(format, args).toString());
    }

    public Error getError()
    {
        return _error;
    }
}
