001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.mq;
023:
024: import java.io.IOException;
025: import java.io.ObjectInput;
026: import java.io.ObjectOutput;
027: import java.io.Serializable;
028:
029: import javax.jms.Destination;
030:
031: /**
032: * This class implements javax.jms.Destination
033: *
034: * @author Norbert Lataille (Norbert.Lataille@m4x.org)
035: * @author Hiram Chirino (Cojonudo14@hotmail.com)
036: * @author David Maplesden (David.Maplesden@orion.co.nz)
037: * @author <a href="mailto:adrian@jboss.org">Adrian Brock</a>
038: * @version $Revision: 57198 $
039: */
040: public class SpyDestination implements Destination, Serializable {
041: // Constants -----------------------------------------------------
042:
043: /** The serialVersionUID */
044: static final long serialVersionUID = -451227938651163471L;
045:
046: /** Null object */
047: protected final static int NULL = 0;
048: /** An object */
049: protected final static int OBJECT = 1;
050: /** A queue */
051: protected final static int SPY_QUEUE = 2;
052: /** A topic */
053: protected final static int SPY_TOPIC = 3;
054: /** A temporary queue */
055: protected final static int SPY_TEMP_QUEUE = 4;
056: /** A temporary topic */
057: protected final static int SPY_TEMP_TOPIC = 5;
058:
059: // Attributes ----------------------------------------------------
060:
061: /** The name */
062: protected String name;
063:
064: /** The hash code */
065: protected int hash;
066:
067: // Static --------------------------------------------------------
068:
069: /**
070: * Write the destination
071: *
072: * @param out the output
073: * @param dest the destination
074: * @throws IOException for any error
075: */
076: public static void writeDest(ObjectOutput out, Destination dest)
077: throws IOException {
078: if (dest == null)
079: out.writeByte(NULL);
080: else if (dest instanceof SpyTemporaryQueue) {
081: out.writeByte(SPY_TEMP_QUEUE);
082: out.writeUTF(((SpyTemporaryQueue) dest).getName());
083: } else if (dest instanceof SpyTemporaryTopic) {
084: out.writeByte(SPY_TEMP_TOPIC);
085: out.writeUTF(((SpyTemporaryTopic) dest).getName());
086: } else if (dest instanceof SpyQueue) {
087: out.writeByte(SPY_QUEUE);
088: out.writeUTF(((SpyQueue) dest).getName());
089: } else if (dest instanceof SpyTopic) {
090: out.writeByte(SPY_TOPIC);
091: out.writeUTF(((SpyTopic) dest).getName());
092: DurableSubscriptionID id = ((SpyTopic) dest).durableSubscriptionID;
093: if (id == null) {
094: out.writeByte(NULL);
095: } else {
096: out.writeByte(OBJECT);
097: writeString(out, id.getClientID());
098: writeString(out, id.getSubscriptionName());
099: writeString(out, id.getSelector());
100: }
101: } else {
102: out.writeByte(OBJECT);
103: out.writeObject(dest);
104: }
105: }
106:
107: /**
108: * Read a destination
109: *
110: * @param in the input
111: * @return the destination
112: * @throws IOException for any error
113: */
114: public static Destination readDest(ObjectInput in)
115: throws IOException {
116: byte destType = in.readByte();
117: if (destType == NULL)
118: return null;
119: else if (destType == SPY_TEMP_QUEUE)
120: return new SpyTemporaryQueue(in.readUTF(), null);
121: else if (destType == SPY_TEMP_TOPIC)
122: return new SpyTemporaryTopic(in.readUTF(), null);
123: else if (destType == SPY_QUEUE)
124: return new SpyQueue(in.readUTF());
125: else if (destType == SPY_TOPIC) {
126: String name = in.readUTF();
127: destType = in.readByte();
128: if (destType == NULL)
129: return new SpyTopic(name);
130: else {
131: String clientId = readString(in);
132: String subName = readString(in);
133: String selector = readString(in);
134: return new SpyTopic(new SpyTopic(name), clientId,
135: subName, selector);
136: }
137: } else {
138: try {
139: return (Destination) in.readObject();
140: } catch (ClassNotFoundException e) {
141: throw new IOException(
142: "Class not found for unknown destination.");
143: }
144: }
145: }
146:
147: // Constructors --------------------------------------------------
148:
149: /**
150: * Create a new SpyDestination
151: *
152: * @param name the name
153: */
154: SpyDestination(String name) {
155: this .name = name;
156: hash = name.hashCode();
157: }
158:
159: // Public --------------------------------------------------------
160:
161: /**
162: * Gets the name of the destination.
163: *
164: * @return the name
165: */
166: public String getName() {
167: return name;
168: }
169:
170: // Object overrides ----------------------------------------------
171:
172: public int hashCode() {
173: return hash;
174: }
175:
176: // Package protected ---------------------------------------------
177:
178: // Protected -----------------------------------------------------
179:
180: // Private -------------------------------------------------------
181:
182: /**
183: * Write a string
184: *
185: * @param out the output
186: * @param s the string
187: * @throws IOException for any error
188: */
189: private static void writeString(ObjectOutput out, String s)
190: throws IOException {
191: if (s == null)
192: out.writeByte(NULL);
193: else {
194: out.writeByte(OBJECT);
195: //non-null
196: out.writeUTF(s);
197: }
198: }
199:
200: /**
201: * Read a string
202: *
203: * @param in the input
204: * @return the string
205: * @throws IOException for any error
206: */
207: private static String readString(ObjectInput in) throws IOException {
208: byte b = in.readByte();
209: if (b == NULL)
210: return null;
211: else
212: return in.readUTF();
213: }
214:
215: // Inner classes -------------------------------------------------
216: }
|