com.subgraph.vega.internal.model.requests.HttpMessageCloner.java Source code

Java tutorial

Introduction

Here is the source code for com.subgraph.vega.internal.model.requests.HttpMessageCloner.java

Source

/*******************************************************************************
 * 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.model.requests;

import java.io.IOException;

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpMessage;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicHttpRequest;
import org.apache.http.util.EntityUtils;

import com.db4o.ObjectContainer;

public class HttpMessageCloner {

    private final ObjectContainer database;

    HttpMessageCloner(ObjectContainer database) {
        this.database = database;
    }

    HttpRequest copyRequest(HttpRequest request) {
        if (request instanceof HttpEntityEnclosingRequest) {
            return copyEntityEnclosingRequest((HttpEntityEnclosingRequest) request);
        } else {
            return copyBasicRequest(request);
        }
    }

    HttpResponse copyResponse(HttpResponse response) {
        final HttpEntity e = copyEntity(response.getEntity());
        final RequestLogResponse r = new RequestLogResponse(database, response.getStatusLine(),
                entityToDatabaseId(e));
        copyHeaders(response, r);
        return r;
    }

    private HttpRequest copyEntityEnclosingRequest(HttpEntityEnclosingRequest request) {
        final HttpEntity e = copyEntity(request.getEntity());
        final RequestLogEntityEnclosingRequest r = new RequestLogEntityEnclosingRequest(database,
                request.getRequestLine(), entityToDatabaseId(e));
        copyHeaders(request, r);
        return r;
    }

    private HttpRequest copyBasicRequest(HttpRequest request) {
        if (request == null) {
            return null;
        }
        final HttpRequest r = new BasicHttpRequest(request.getRequestLine());
        copyHeaders(request, r);
        return r;
    }

    private static void copyHeaders(HttpMessage from, HttpMessage to) {
        for (Header h : from.getAllHeaders()) {
            to.addHeader(new BasicHeader(h.getName(), h.getValue()));
        }
    }

    private long entityToDatabaseId(HttpEntity entity) {
        if (entity == null) {
            return 0;
        }
        database.ext().store(entity);
        return database.ext().getID(entity);
    }

    private HttpEntity copyEntity(HttpEntity entity) {
        try {
            if (entity == null) {
                return null;
            }
            final byte[] content = EntityUtils.toByteArray(entity);
            return new RequestLogEntity(content, entity.getContentType(), entity.getContentEncoding());
        } catch (IOException e) {
            return null;
        }
    }
}