1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.james.mime4j.util;
21
22
23
24
25
26 public final class ByteArrayBuffer implements ByteSequence {
27
28 private byte[] buffer;
29 private int len;
30
31 public ByteArrayBuffer(int capacity) {
32 super();
33 if (capacity < 0) {
34 throw new IllegalArgumentException("Buffer capacity may not be negative");
35 }
36 this.buffer = new byte[capacity];
37 }
38
39 public ByteArrayBuffer(byte[] bytes, boolean dontCopy) {
40 this(bytes, bytes.length, dontCopy);
41 }
42
43 public ByteArrayBuffer(byte[] bytes, int len, boolean dontCopy) {
44 if (bytes == null)
45 throw new IllegalArgumentException();
46 if (len < 0 || len > bytes.length)
47 throw new IllegalArgumentException();
48
49 if (dontCopy) {
50 this.buffer = bytes;
51 } else {
52 this.buffer = new byte[len];
53 System.arraycopy(bytes, 0, this.buffer, 0, len);
54 }
55
56 this.len = len;
57 }
58
59 private void expand(int newlen) {
60 byte newbuffer[] = new byte[Math.max(this.buffer.length << 1, newlen)];
61 System.arraycopy(this.buffer, 0, newbuffer, 0, this.len);
62 this.buffer = newbuffer;
63 }
64
65 public void append(final byte[] b, int off, int len) {
66 if (b == null) {
67 return;
68 }
69 if ((off < 0) || (off > b.length) || (len < 0) ||
70 ((off + len) < 0) || ((off + len) > b.length)) {
71 throw new IndexOutOfBoundsException();
72 }
73 if (len == 0) {
74 return;
75 }
76 int newlen = this.len + len;
77 if (newlen > this.buffer.length) {
78 expand(newlen);
79 }
80 System.arraycopy(b, off, this.buffer, this.len, len);
81 this.len = newlen;
82 }
83
84 public void append(int b) {
85 int newlen = this.len + 1;
86 if (newlen > this.buffer.length) {
87 expand(newlen);
88 }
89 this.buffer[this.len] = (byte)b;
90 this.len = newlen;
91 }
92
93 public void clear() {
94 this.len = 0;
95 }
96
97 public byte[] toByteArray() {
98 byte[] b = new byte[this.len];
99 if (this.len > 0) {
100 System.arraycopy(this.buffer, 0, b, 0, this.len);
101 }
102 return b;
103 }
104
105 public byte byteAt(int i) {
106 if (i < 0 || i >= this.len)
107 throw new IndexOutOfBoundsException();
108
109 return this.buffer[i];
110 }
111
112 public int capacity() {
113 return this.buffer.length;
114 }
115
116 public int length() {
117 return this.len;
118 }
119
120 public byte[] buffer() {
121 return this.buffer;
122 }
123
124 public int indexOf(byte b) {
125 return indexOf(b, 0, this.len);
126 }
127
128 public int indexOf(byte b, int beginIndex, int endIndex) {
129 if (beginIndex < 0) {
130 beginIndex = 0;
131 }
132 if (endIndex > this.len) {
133 endIndex = this.len;
134 }
135 if (beginIndex > endIndex) {
136 return -1;
137 }
138 for (int i = beginIndex; i < endIndex; i++) {
139 if (this.buffer[i] == b) {
140 return i;
141 }
142 }
143 return -1;
144 }
145
146 public void setLength(int len) {
147 if (len < 0 || len > this.buffer.length) {
148 throw new IndexOutOfBoundsException();
149 }
150 this.len = len;
151 }
152
153 public boolean isEmpty() {
154 return this.len == 0;
155 }
156
157 public boolean isFull() {
158 return this.len == this.buffer.length;
159 }
160
161 @Override
162 public String toString() {
163 return new String(toByteArray());
164 }
165
166 }