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

public final class MessagePublishInfo
{
    private AMQShortString _exchange;
    private boolean _immediate;
    private boolean _mandatory;
    private AMQShortString _routingKey;

    public MessagePublishInfo()
    {
    }

    public MessagePublishInfo(AMQShortString exchange, boolean immediate, boolean mandatory,
                              AMQShortString routingKey)
    {
        _exchange = exchange;
        _immediate = immediate;
        _mandatory = mandatory;
        _routingKey = routingKey;
    }

    public AMQShortString getExchange()
    {
        return _exchange;
    }

    public void setExchange(AMQShortString exchange)
    {
        _exchange = exchange;
    }

    public boolean isImmediate()
    {
        return _immediate;
    }

    public void setImmediate(boolean immediate)
    {
        _immediate = immediate;
    }

    public boolean isMandatory()
    {
        return _mandatory;
    }

    public void setMandatory(boolean mandatory)
    {
        _mandatory = mandatory;
    }

    public AMQShortString getRoutingKey()
    {
        return _routingKey;
    }

    public void setRoutingKey(AMQShortString routingKey)
    {
        _routingKey = routingKey;
    }

}
