/******************************************************************************* * Copyright (c) 2011 Subgraph. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Subgraph - initial API and implementation ******************************************************************************/ package com.subgraph.vega.internal.http.requests; import java.util.ArrayList; import java.util.Iterator; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.ProtocolVersion; import org.apache.http.params.HttpParams; import org.apache.http.protocol.HTTP; import com.subgraph.vega.api.http.requests.IHttpHeaderBuilder; import com.subgraph.vega.api.http.requests.IHttpMessageBuilder; public class HttpMessageBuilder implements IHttpMessageBuilder { private HttpParams params; private ProtocolVersion protocolVersion; private final ArrayList<HttpHeaderBuilder> headerList = new ArrayList<HttpHeaderBuilder>(); private HttpEntity entity; @Override public void clear() { params = null; protocolVersion = null; headerList.clear(); entity = null; } @Override public void setParams(HttpParams params) { this.params = params; } @Override public HttpParams getParams() { return params; } @Override public void setProtocolVersion(ProtocolVersion protocolVersion) { this.protocolVersion = protocolVersion; } @Override public ProtocolVersion getProtocolVersion() { return protocolVersion; } @Override public void setHeaders(Header[] headers) { headerList.clear(); for (Header h: headers) { headerList.add(new HttpHeaderBuilder(h)); } } @Override public HttpHeaderBuilder addHeader(String name, String value) { HttpHeaderBuilder header = new HttpHeaderBuilder(name, value); headerList.add(header); return header; } @Override public HttpHeaderBuilder setHeader(String name, String value) { for (int i = 0; i < headerList.size(); i++) { HttpHeaderBuilder h = headerList.get(i); if (name.equalsIgnoreCase(h.getName())) { h.setName(name); h.setValue(value); return h; } } return addHeader(name, value); } @Override public void removeHeader(IHttpHeaderBuilder header) { headerList.remove(header); } @Override public void removeHeaders(final String name) { for (Iterator<HttpHeaderBuilder> i = headerList.iterator(); i.hasNext(); ) { IHttpHeaderBuilder header = i.next(); if (name.equalsIgnoreCase(header.getName())) { i.remove(); } } } @Override public void clearHeaders() { headerList.clear(); } @Override public void swapHeader(int idx1, int idx2) { if (idx1 < headerList.size() && idx2 < headerList.size() && idx1 != idx2) { HttpHeaderBuilder tmp = headerList.set(idx1, headerList.get(idx2)); headerList.set(idx2, tmp); } } @Override public int getHeaderIdxOf(IHttpHeaderBuilder header) { return headerList.indexOf(header); } @Override public int getHeaderCnt() { return headerList.size(); } @Override public IHttpHeaderBuilder getHeader(int idx) { return headerList.get(idx); } @Override public IHttpHeaderBuilder[] getHeaders() { return headerList.toArray(new HttpHeaderBuilder[headerList.size()]); } @Override public void setEntity(HttpEntity entity) { this.entity = entity; setHeadersEntity(); } @Override public HttpEntity getEntity() { return entity; } protected void setHeadersEntity() { if (entity != null) { if (entity.isChunked() || entity.getContentLength() < 0) { setHeader(HTTP.TRANSFER_ENCODING, HTTP.CHUNK_CODING); removeHeaders(HTTP.CONTENT_LEN); } else { setHeader(HTTP.CONTENT_LEN, Long.toString(entity.getContentLength())); removeHeaders(HTTP.TRANSFER_ENCODING); } if (entity.getContentType() != null) { final Header h = entity.getContentType(); setHeader(h.getName(), h.getValue()); } if (entity.getContentEncoding() != null) { final Header h = entity.getContentEncoding(); setHeader(h.getName(), h.getValue()); } } else { removeHeaders(HTTP.CONTENT_LEN); removeHeaders(HTTP.TRANSFER_ENCODING); } } }