001: /*
002: *
003: *
004: * Copyright 1990-2007 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.midp.links;
028:
029: /**
030: * Encapsulates some data to be sent between Isolates through a Link.
031: */
032: public class LinkMessage {
033:
034: // IMPL_NOTE: force classloading of byte[] so that
035: // KNI_FindClass() will always find it.
036: static {
037: try {
038: Class.forName("[B");
039: } catch (ClassNotFoundException ignore) {
040: }
041: }
042:
043: Object contents;
044:
045: // used only for data (byte-array) messages, otherwise zeroes
046: int offset; // = 0
047: int length; // = 0
048:
049: /**
050: * Constructs a LinkMessage with the given contents, length, and offset
051: * values. Called only by the static factory methods.
052: */
053: private LinkMessage(Object newContents, int newOffset, int newLength) {
054: contents = newContents;
055: offset = newOffset;
056: length = newLength;
057: }
058:
059: /**
060: * Constructs an empty LinkMessage. This is used only by Link.receive().
061: */
062: LinkMessage() {
063: this (null, 0, 0);
064: }
065:
066: /**
067: * Queries whether the LinkMessage contains data, that is, a byte array.
068: */
069: public boolean containsData() {
070: return contents instanceof byte[];
071: }
072:
073: /**
074: * Queries whether the LinkMessage contains a Link.
075: */
076: public boolean containsLink() {
077: return contents instanceof Link;
078: }
079:
080: /**
081: * Queries whether the LinkMessage contains a String.
082: */
083: public boolean containsString() {
084: return contents instanceof String;
085: }
086:
087: /**
088: * Returns the contents of the LinkMessage as an Object. The caller must
089: * test the reference returned using <code>instanceof</code> and cast it
090: * appropriately.
091: */
092: public Object extract() {
093: return contents;
094: }
095:
096: /**
097: * Returns the contents of the LinkMessage if it contains a byte array. If
098: * the message does not contain a byte array, throws IllegalStateException.
099: */
100: public byte[] extractData() {
101: if (!(contents instanceof byte[])) {
102: throw new IllegalStateException();
103: }
104:
105: byte[] data = (byte[]) contents;
106:
107: if (offset == 0 && length == data.length) {
108: return data;
109: }
110:
111: // need to copy the subrange
112:
113: byte[] newData = new byte[length];
114: System.arraycopy(data, offset, newData, 0, length);
115: return newData;
116: }
117:
118: /**
119: * Returns the contents of the LinkMessage if it contains is a Link. If
120: * the message does not contain a Link, throws IllegalStateException.
121: */
122: public Link extractLink() {
123: if (contents instanceof Link) {
124: return (Link) contents;
125: } else {
126: throw new IllegalStateException();
127: }
128: }
129:
130: /**
131: * Returns the contents of the LinkMessage if it contains is a String. If
132: * the message does not contain a String, throws IllegalStateException.
133: */
134: public String extractString() {
135: if (contents instanceof String) {
136: return (String) contents;
137: } else {
138: throw new IllegalStateException();
139: }
140: }
141:
142: public static LinkMessage newDataMessage(byte[] data) {
143: return new LinkMessage(data, 0, data.length);
144: }
145:
146: public static LinkMessage newDataMessage(byte[] data, int offset,
147: int length) {
148: if (offset < 0 || offset > data.length || length < 0
149: || offset + length < 0 || offset + length > data.length) {
150: throw new IndexOutOfBoundsException();
151: }
152:
153: return new LinkMessage(data, offset, length);
154: }
155:
156: public static LinkMessage newLinkMessage(Link link) {
157: return new LinkMessage(link, 0, 0);
158: }
159:
160: public static LinkMessage newStringMessage(String string) {
161: return new LinkMessage(string, 0, 0);
162: }
163:
164: }
|