001: /*
002: * %W% %E%
003: *
004: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package com.sun.jump.message;
028:
029: import java.io.IOException;
030: import com.sun.jump.os.JUMPOSInterface;
031:
032: /**
033: * <code>JUMPMessage</code> encapsulates the message header (envelope
034: * information) and the message payload. The message payload is an array
035: * of bytes.
036: *
037: * The message is composed at a data offset determined by the OS. (obtained
038: * from <code>JUMPMessageQueueInterface.getDataOffset()</code>)
039: * <p>
040: * The message header consists of the following information
041: * <ul>
042: * <li>Message ID - A unique identifier for the message</li>
043: * <li>Response Message ID - The message ID for which the message is a
044: * response. {@link #isResponseMessage()} indicates if a message is
045: * a response or not</li>
046: * <li>Sender - The sender of the message. If there are any responses to
047: * be sent, the sender's outhoing queue is used to send it.
048: * The sender is {@link com.sun.jump.message.JUMPMessagable}</li>
049: * <li>Message Type - An arbitrary string that identifies the message. This
050: * is typically used to tag or classify the message</li>
051: * </ul>
052: * <p>
053: *
054: * Instances of <Code>JUMPMessage</code> are manufactured from factories
055: * conforming to {@link com.sun.jump.message.JUMPMessagingService}
056: *
057: */
058: public abstract class JUMPMessage {
059: protected int messageDataOffset;
060: protected int messageMarkOffset;
061: protected int messageUserDataOffset;
062: protected byte[] messageDataBytes;
063: protected int MESSAGE_DATA_OFFSET = JUMPOSInterface.getInstance()
064: .getQueueInterface().getDataOffset();
065:
066: protected JUMPMessagable sender;
067: protected String type;
068: protected String returnType;
069: protected int id;
070: protected int responseId = -1;
071:
072: /**
073: * Creates a new instance of JUMPMessage when
074: * deserializing an incoming message
075: */
076: protected JUMPMessage(byte[] data) {
077: this .messageDataBytes = data;
078: this .messageDataOffset = MESSAGE_DATA_OFFSET;
079: readHeader();
080: }
081:
082: protected JUMPMessage() {
083: }
084:
085: /**
086: * Get sender of this message in a form that allows the caller
087: * to send a response
088: */
089: public JUMPMessageResponseSender getSender() {
090: return this .getMessageSender();
091: }
092:
093: public String getReturnType() {
094: return this .returnType;
095: }
096:
097: /**
098: * Returns the message type.
099: */
100: public String getType() {
101: return this .type;
102: }
103:
104: /**
105: * Returns the message id
106: */
107: public int getId() {
108: return this .id;
109: }
110:
111: /**
112: * Returns the response message id. The value makes sense only if
113: * {@link #isResponseMessage()} return true.
114: */
115: public int getResponseId() {
116: return this .responseId;
117: }
118:
119: /**
120: * Return payload data offset
121: */
122: public int getPayloadDataOffset() {
123: return messageDataOffset;
124: }
125:
126: /**
127: * Return payload
128: * (to be read at offset <code>getPayloadDataOffset()</code>)
129: */
130: public byte[] getPayload() {
131: return messageDataBytes;
132: }
133:
134: /**
135: * Return payload (to be read at offset
136: * <code>JUMPMessageQueueInterface.getDataOffset()</code>)
137: */
138: public byte[] getMessageData() {
139: return messageDataBytes;
140: }
141:
142: /**
143: * Indicates if this message is a response to a <code>JUMPMessage</code>
144: *
145: * @see #getResponseId
146: */
147: public boolean isResponseMessage() {
148: return this .responseId >= 0;
149: }
150:
151: private void readHeader() {
152: JUMPMessageReader r = new JUMPMessageReader(this ,
153: MESSAGE_DATA_OFFSET);
154: this .id = r.getInt();
155: this .responseId = r.getInt();
156: readMessageSender(r.getInt());
157: this .returnType = r.getUTF();
158: this .type = r.getUTF();
159: // Update the offsets to point past the header
160: this .messageDataOffset = r.messageDataOffset;
161: this .messageUserDataOffset = messageDataOffset;
162: this .messageMarkOffset = messageDataOffset;
163: // User data follows
164: }
165:
166: public void reset() {
167: messageDataOffset = messageMarkOffset;
168: }
169:
170: protected abstract void readMessageSender(int id);
171:
172: protected abstract JUMPMessageResponseSender getMessageSender();
173: }
|