001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.activemq.command;
018
019 /**
020 * @openwire:marshaller code="110"
021 *
022 */
023 public class MessageId implements DataStructure, Comparable<MessageId> {
024
025 public static final byte DATA_STRUCTURE_TYPE = CommandTypes.MESSAGE_ID;
026
027 protected ProducerId producerId;
028 protected long producerSequenceId;
029 protected long brokerSequenceId;
030
031 private transient String key;
032 private transient int hashCode;
033
034 public MessageId() {
035 this.producerId = new ProducerId();
036 }
037
038 public MessageId(ProducerInfo producerInfo, long producerSequenceId) {
039 this.producerId = producerInfo.getProducerId();
040 this.producerSequenceId = producerSequenceId;
041 }
042
043 public MessageId(String messageKey) {
044 setValue(messageKey);
045 }
046
047 public MessageId(String producerId, long producerSequenceId) {
048 this(new ProducerId(producerId), producerSequenceId);
049 }
050
051 public MessageId(ProducerId producerId, long producerSequenceId) {
052 this.producerId = producerId;
053 this.producerSequenceId = producerSequenceId;
054 }
055
056 /**
057 * Sets the value as a String
058 */
059 public void setValue(String messageKey) {
060 key = messageKey;
061 // Parse off the sequenceId
062 int p = messageKey.lastIndexOf(":");
063 if (p >= 0) {
064 producerSequenceId = Long.parseLong(messageKey.substring(p + 1));
065 messageKey = messageKey.substring(0, p);
066 }
067 producerId = new ProducerId(messageKey);
068 }
069
070 /**
071 * Sets the transient text view of the message which will be ignored if the
072 * message is marshaled on a transport; so is only for in-JVM changes to
073 * accommodate foreign JMS message IDs
074 */
075 public void setTextView(String key) {
076 this.key = key;
077 }
078
079 public byte getDataStructureType() {
080 return DATA_STRUCTURE_TYPE;
081 }
082
083 public boolean equals(Object o) {
084 if (this == o) {
085 return true;
086 }
087 if (o == null || o.getClass() != getClass()) {
088 return false;
089 }
090
091 MessageId id = (MessageId)o;
092 return producerSequenceId == id.producerSequenceId && producerId.equals(id.producerId);
093 }
094
095 public int hashCode() {
096 if (hashCode == 0) {
097 hashCode = producerId.hashCode() ^ (int)producerSequenceId;
098 }
099 return hashCode;
100 }
101
102 public String toString() {
103 if (key == null) {
104 key = producerId.toString() + ":" + producerSequenceId;
105 }
106 return key;
107 }
108
109 /**
110 * @openwire:property version=1 cache=true
111 */
112 public ProducerId getProducerId() {
113 return producerId;
114 }
115
116 public void setProducerId(ProducerId producerId) {
117 this.producerId = producerId;
118 }
119
120 /**
121 * @openwire:property version=1
122 */
123 public long getProducerSequenceId() {
124 return producerSequenceId;
125 }
126
127 public void setProducerSequenceId(long producerSequenceId) {
128 this.producerSequenceId = producerSequenceId;
129 }
130
131 /**
132 * @openwire:property version=1
133 */
134 public long getBrokerSequenceId() {
135 return brokerSequenceId;
136 }
137
138 public void setBrokerSequenceId(long brokerSequenceId) {
139 this.brokerSequenceId = brokerSequenceId;
140 }
141
142 public boolean isMarshallAware() {
143 return false;
144 }
145
146 public MessageId copy() {
147 MessageId copy = new MessageId(producerId, producerSequenceId);
148 copy.key = key;
149 copy.brokerSequenceId = brokerSequenceId;
150 return copy;
151 }
152
153 /**
154 * @param o
155 * @return
156 * @see java.lang.Comparable#compareTo(java.lang.Object)
157 */
158 public int compareTo(MessageId other) {
159 int result = -1;
160 if (other != null) {
161 result = this.toString().compareTo(other.toString());
162 }
163 return result;
164 }
165 }