package org.neo4j.smack.pipeline.http;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.neo4j.smack.gcfree.MutableString;
public class HttpHeaderContainer {
/**
* Garbage free container type for header values.
* Is not iterable (since that would mean we can't be
* garbage free), so instead to loop over, use a pattern like:
*
* MutableString current = values.get(0);
* for( int i=0, l=values.size() ; i<l ; current=values.get(++i)) {
*
* }
*/
class HttpHeaderValues {
private MutableString [] values = new MutableString [2];
private int numValues = 0;
public HttpHeaderValues() {
initializeValueStore(0, values.length);
}
public MutableString first()
{
if(numValues > 0) {
return values[0];
}
return null;
}
/**
* Copies the contents of value into a free slot.
* @param value
*/
public void add(MutableString value)
{
if(numValues == values.length) {
makeInternalValueStoreBigger();
}
values[numValues++].setTo(value);
}
public MutableString get(int i)
{
if(i < numValues) {
return values[i];
}
return null;
}
public int size() {
return numValues;
}
public void clear()
{
numValues = 0;
}
protected int currentCapacity() {
return values.length;
}
private void makeInternalValueStoreBigger()
{
int newStartIndex = values.length;
values = Arrays.copyOf(values, values.length * 2);
initializeValueStore(newStartIndex, values.length);
}
private void initializeValueStore(int newStartIndex, int length)
{
for(int i=newStartIndex;i<length;i++) {
values[i] = new MutableString(16);
}
}
}
private Map<HttpHeaderName, HttpHeaderValues> headers = new HashMap<HttpHeaderName, HttpHeaderValues>();
public MutableString getHeader(HttpHeaderName name)
{
if(headers.containsKey(name)) {
return headers.get(name).first();
} else {
return null;
}
}
public HttpHeaderValues getHeaders(HttpHeaderName name)
{
return headers.get(name);
}
public void addHeader(HttpHeaderName headerName, MutableString value)
{
if(!headers.containsKey(headerName)) {
headers.put(headerName, new HttpHeaderValues());
}
headers.get(headerName).add(value);
}
public void clear()
{
// TODO: This creates an iterator, refactor.
for(HttpHeaderValues v : headers.values()) {
v.clear();
}
}
public void removeHeader(HttpHeaderName name)
{
headers.get(name).clear();
}
}