* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/**
* Capacitor
- *
+ *
* Storage mechanism for read data, specifically designed for InputStreams.
- *
- * The Standard BufferedInputStream requires a limit to be set for buffered reading, which is
+ *
+ * The Standard BufferedInputStream requires a limit to be set for buffered reading, which is
* impractical for reading SOAP headers, which can be quite large.
* @author Jonathan
*
private ArrayList<ByteBuffer> bbs = new ArrayList<>();
private ByteBuffer curr = null;
private int idx;
-
+
// Maintain a private RingBuffer for Memory, for efficiency
private static ByteBuffer[] ring = new ByteBuffer[16];
private static int start, end;
-
-
+
+
public void put(byte b) {
if (curr == null || curr.remaining()==0) { // ensure we have a "curr" buffer ready for data
curr = ringGet();
bbs.add(curr);
}
- curr.put(b);
+ curr.put(b);
}
public int read() {
- if (curr!=null) {
+ if (curr!=null) {
if (curr.remaining()>0) { // have a buffer, use it!
return curr.get();
} else if (idx<bbs.size()){ // Buffer not enough, get next one from array
} // if no curr buffer, treat as end of stream
return -1;
}
-
+
/**
* read into an array like Streams
- *
+ *
* @param array
* @param offset
* @param length
/**
* Put an array of data into Capacitor
- *
+ *
* @param array
* @param offset
* @param length
curr = ringGet();
bbs.add(curr);
}
-
+
int len;
while (length>0) {
if ((len=curr.remaining())>length) {
}
}
}
-
+
/**
* Move state from Storage mode into Read mode, changing all internal buffers to read mode, etc
*/
idx=1;
}
}
-
+
/**
* reuse all the buffers
*/
bbs.clear();
curr = null;
}
-
+
/**
* Declare amount of data available to be read at once.
- *
+ *
* @return
*/
public int available() {
}
return count;
}
-
+
/**
* Returns how many are left that were not skipped
* @param n
n=0;
} else {
curr.position(curr.limit());
-
+
skipped-=skip;
if (idx<bbs.size()) {
curr=bbs.get(idx++);
}
/*
- * Ring Functions. Reuse allocated memory
+ * Ring Functions. Reuse allocated memory
*/
private ByteBuffer ringGet() {
ByteBuffer bb = null;
}
return bb;
}
-
+
private void ringPut(ByteBuffer bb) {
synchronized(ring) {
ring[end]=bb; // if null or not, BB will just be Garbage collected