1 /***
2 *
3 * Copyright 2004 Hiram Chirino
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
6 * use this file except in compliance with the License. You may obtain a copy of
7 * the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14 * License for the specific language governing permissions and limitations under
15 * the License.
16 */
17 package org.activeio.packet;
18
19 import java.io.DataOutput;
20 import java.io.IOException;
21 import java.io.OutputStream;
22
23 import org.activeio.Packet;
24
25 /***
26 * Provides a Packet implementation that is directly backed by a <code>byte[0]</code>.
27 *
28 * @version $Revision$
29 */
30 final public class EmptyPacket implements Packet {
31
32 static final public EmptyPacket EMPTY_PACKET = new EmptyPacket();
33 static final byte EMPTY_BYTE_ARRAY[] = new byte[]{};
34 static final ByteSequence EMPTY_BYTE_SEQUENCE = new ByteSequence(EMPTY_BYTE_ARRAY,0,0);
35
36 private EmptyPacket() {
37 }
38
39 public void writeTo(OutputStream out) throws IOException {
40 }
41 public void writeTo(DataOutput out) throws IOException {
42 }
43
44 public int position() {
45 return 0;
46 }
47
48 public void position(int position) {
49 }
50
51 public int limit() {
52 return 0;
53 }
54
55 public void limit(int limit) {
56 }
57
58 public void flip() {
59 }
60
61 public int remaining() {
62 return 0;
63 }
64
65 public void rewind() {
66 }
67
68 public boolean hasRemaining() {
69 return false;
70 }
71
72 public void clear() {
73 }
74
75 public int capacity() {
76 return 0;
77 }
78
79 public Packet slice() {
80 return this;
81 }
82
83 public Packet duplicate() {
84 return this;
85 }
86
87 public Object duplicate(ClassLoader cl) throws IOException {
88 try {
89 Class clazz = cl.loadClass(EmptyPacket.class.getName());
90 return clazz.getField("EMPTY_PACKET").get(null);
91 } catch (Throwable e) {
92 throw (IOException)new IOException("Could not duplicate packet in a different classloader: "+e).initCause(e);
93 }
94 }
95
96 /***
97 * @see org.activeio.Packet#read()
98 */
99 public int read() {
100 return -1;
101 }
102
103 /***
104 * @see org.activeio.Packet#read(byte[], int, int)
105 */
106 public int read(byte[] data, int offset, int length) {
107 return -1;
108 }
109
110 /***
111 * @see org.activeio.Packet#write(int)
112 */
113 public boolean write(int data) {
114 return false;
115 }
116
117 /***
118 * @see org.activeio.Packet#write(byte[], int, int)
119 */
120 public int write(byte[] data, int offset, int length) {
121 return -1;
122 }
123
124 public ByteSequence asByteSequence() {
125 return EMPTY_BYTE_SEQUENCE;
126 }
127
128 public byte[] sliceAsBytes() {
129 return EMPTY_BYTE_ARRAY;
130 }
131
132 /***
133 * @param dest
134 * @return the number of bytes read into the dest.
135 */
136 public int read(Packet dest) {
137 return -1;
138 }
139
140 public String toString() {
141 return "{position="+position()+",limit="+limit()+",capacity="+capacity()+"}";
142 }
143
144 public Object narrow(Class target) {
145 if( target.isAssignableFrom(getClass()) ) {
146 return this;
147 }
148 return null;
149 }
150
151 public void dispose() {
152 }
153
154 }