001    /** 
002     * 
003     * Copyright 2004 Protique Ltd
004     * 
005     * Licensed under the Apache License, Version 2.0 (the "License"); 
006     * you may not use this file except in compliance with the License. 
007     * You may obtain a copy of the License at 
008     * 
009     * http://www.apache.org/licenses/LICENSE-2.0
010     * 
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS, 
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
014     * See the License for the specific language governing permissions and 
015     * limitations under the License. 
016     * 
017     **/
018    
019    package org.activemq.io.util;
020    
021    /**
022     * Simple holder for a an array of Bytes - used instead of a ByteBuffer to avoid unecessary System.array() copies
023     * 
024     * @version $Revision: 1.1.1.1 $
025     */
026    public class ByteArray {
027        private byte[] buf;
028        private int offset;
029        private int length;
030    
031        /**
032         * Construct an empty ByteArray
033         */
034        public ByteArray() {
035        }
036    
037        /**
038         * Create a byte array
039         * 
040         * @param buf
041         */
042        public ByteArray(byte[] buf) {
043            this(buf, 0, buf.length);
044        }
045    
046        /**
047         * Create a ByteArray
048         * 
049         * @param buf
050         * @param offset
051         * @param length
052         */
053        public ByteArray(byte[] buf, int offset, int length) {
054            this.buf = buf;
055            this.offset = offset;
056            this.length = length;
057        }
058    
059        /**
060         * clear the values held by this ByteArray
061         */
062        public void clear() {
063            buf = null;
064            offset = 0;
065            length = 0;
066        }
067    
068        /**
069         * reset values
070         * 
071         * @param buf
072         */
073        public void reset(byte[] buf) {
074            if (buf != null) {
075                reset(buf, 0, buf.length);
076            }
077            else {
078                clear();
079            }
080        }
081    
082        /**
083         * reset values
084         * 
085         * @param buf
086         * @param offset
087         * @param length
088         */
089        public void reset(byte[] buf, int offset, int length) {
090            this.buf = buf;
091            this.offset = offset;
092            this.length = length;
093        }
094    
095        /**
096         * @return Returns the buf.
097         */
098        public byte[] getBuf() {
099            return buf;
100        }
101    
102        /**
103         * @param buf The buf to set.
104         */
105        public void setBuf(byte[] buf) {
106            this.buf = buf;
107        }
108    
109        /**
110         * @return Returns the length.
111         */
112        public int getLength() {
113            return length;
114        }
115    
116        /**
117         * @param length The length to set.
118         */
119        public void setLength(int length) {
120            this.length = length;
121        }
122    
123        /**
124         * @return Returns the offset.
125         */
126        public int getOffset() {
127            return offset;
128        }
129    
130        /**
131         * @param offset The offset to set.
132         */
133        public void setOffset(int offset) {
134            this.offset = offset;
135        }
136        
137        /**
138         * return the byte at the position
139         * @param position
140         * @return
141         */
142        public byte get(int position){
143            return buf[offset + position];
144        }
145    
146        /**
147         * make a copy
148         * 
149         * @return a copy of it's self
150         */
151        public ByteArray copy() {
152            ByteArray result = new ByteArray();
153            if (buf != null) {
154                byte[] data = new byte[length];
155                System.arraycopy(buf, offset, data, 0, length);
156                result.reset(data);
157            }
158            return result;
159        }
160    }