blob: a83f481ca4073b2d2df2285b792baf9c555215fd [file] [log] [blame]
/*
* 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.protonj2.types.messaging;
import org.apache.qpid.protonj2.types.Symbol;
import org.apache.qpid.protonj2.types.UnsignedInteger;
import org.apache.qpid.protonj2.types.UnsignedLong;
public final class Header implements Section<Header> {
public static final UnsignedLong DESCRIPTOR_CODE = UnsignedLong.valueOf(0x0000000000000070L);
public static final Symbol DESCRIPTOR_SYMBOL = Symbol.valueOf("amqp:header:list");
public static final boolean DEFAULT_DURABILITY = false;
public static final byte DEFAULT_PRIORITY = 4;
public static final long DEFAULT_TIME_TO_LIVE = UnsignedInteger.MAX_VALUE.longValue();
public static final boolean DEFAULT_FIRST_ACQUIRER = false;
public static final long DEFAULT_DELIVERY_COUNT = 0;
private static final long UINT_MAX = 0xFFFFFFFFL;
private static int DURABLE = 1;
private static int PRIORITY = 2;
private static int TIME_TO_LIVE = 4;
private static int FIRST_ACQUIRER = 8;
private static int DELIVERY_COUNT = 16;
private int modified = 0;
private boolean durable = DEFAULT_DURABILITY;
private byte priority = DEFAULT_PRIORITY;
private long timeToLive = DEFAULT_TIME_TO_LIVE;
private boolean firstAcquirer = DEFAULT_FIRST_ACQUIRER;
private long deliveryCount = DEFAULT_DELIVERY_COUNT;
public Header() {
}
public Header(Header other) {
this.durable = other.durable;
this.priority = other.priority;
this.timeToLive = other.timeToLive;
this.firstAcquirer = other.firstAcquirer;
this.deliveryCount = other.deliveryCount;
}
public Header copy() {
return new Header(this);
}
@Override
public Header getValue() {
return this;
}
//----- Query the state of the Header object -----------------------------//
public boolean isEmpty() {
return modified == 0;
}
public int getElementCount() {
return 32 - Integer.numberOfLeadingZeros(modified);
}
public boolean hasDurable() {
return (modified & DURABLE) == DURABLE;
}
public boolean hasPriority() {
return (modified & PRIORITY) == PRIORITY;
}
public boolean hasTimeToLive() {
return (modified & TIME_TO_LIVE) == TIME_TO_LIVE;
}
public boolean hasFirstAcquirer() {
return (modified & FIRST_ACQUIRER) == FIRST_ACQUIRER;
}
public boolean hasDeliveryCount() {
return (modified & DELIVERY_COUNT) == DELIVERY_COUNT;
}
//----- Access the AMQP Header object ------------------------------------//
public boolean isDurable() {
return durable;
}
public Header setDurable(boolean value) {
if (value) {
modified |= DURABLE;
} else {
modified &= ~DURABLE;
}
durable = value;
return this;
}
public Header clearDurable() {
modified &= ~DURABLE;
durable = DEFAULT_DURABILITY;
return this;
}
public byte getPriority() {
return priority;
}
public Header setPriority(byte value) {
if (value == DEFAULT_PRIORITY) {
modified &= ~PRIORITY;
} else {
modified |= PRIORITY;
}
priority = value;
return this;
}
public Header clearPriority() {
modified &= ~PRIORITY;
priority = DEFAULT_PRIORITY;
return this;
}
public long getTimeToLive() {
return timeToLive;
}
public Header setTimeToLive(int value) {
return setTimeToLive(Integer.toUnsignedLong(value));
}
public Header setTimeToLive(long value) {
if (value < 0 || value > UINT_MAX) {
throw new IllegalArgumentException("TTL value given is out of range: " + value);
} else {
modified |= TIME_TO_LIVE;
}
timeToLive = value;
return this;
}
public Header clearTimeToLive() {
modified &= ~TIME_TO_LIVE;
timeToLive = DEFAULT_TIME_TO_LIVE;
return this;
}
public boolean isFirstAcquirer() {
return firstAcquirer;
}
public Header setFirstAcquirer(boolean value) {
if (value) {
modified |= FIRST_ACQUIRER;
} else {
modified &= ~FIRST_ACQUIRER;
}
firstAcquirer = value;
return this;
}
public Header clearFirstAcquirer() {
modified &= ~FIRST_ACQUIRER;
firstAcquirer = DEFAULT_FIRST_ACQUIRER;
return this;
}
public long getDeliveryCount() {
return deliveryCount;
}
public Header setDeliveryCount(int value) {
return setDeliveryCount(Integer.toUnsignedLong(value));
}
public Header setDeliveryCount(long value) {
if (value < 0 || value > UINT_MAX) {
throw new IllegalArgumentException("Delivery Count value given is out of range: " + value);
} else if (value == 0) {
modified &= ~DELIVERY_COUNT;
} else {
modified |= DELIVERY_COUNT;
}
deliveryCount = value;
return this;
}
public Header clearDeliveryCount() {
modified &= ~DELIVERY_COUNT;
deliveryCount = DEFAULT_DELIVERY_COUNT;
return this;
}
public Header reset() {
modified = 0;
durable = DEFAULT_DURABILITY;
priority = DEFAULT_PRIORITY;
timeToLive = DEFAULT_TIME_TO_LIVE;
firstAcquirer = DEFAULT_FIRST_ACQUIRER;
deliveryCount = DEFAULT_DELIVERY_COUNT;
return this;
}
@Override
public String toString() {
return "Header{ " +
"durable=" + (hasDurable() ? durable : "null") +
", priority=" + (hasPriority() ? priority : "null") +
", ttl=" + (hasTimeToLive() ? timeToLive : "null") +
", firstAcquirer=" + (hasFirstAcquirer() ? firstAcquirer : "null") +
", deliveryCount=" + (hasDeliveryCount() ? deliveryCount : "null") +
" }";
}
@Override
public SectionType getType() {
return SectionType.Header;
}
}