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    }