/*
 * Licensed to Elastic Search and Shay Banon under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. Elastic Search licenses this
 * file to you 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.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.elasticsearch.http.netty;

import org.elasticsearch.http.HttpRequest;
import org.elasticsearch.rest.support.AbstractRestRequest;
import org.elasticsearch.rest.support.RestUtils;
import org.jboss.netty.handler.codec.http.HttpHeaders;
import org.jboss.netty.handler.codec.http.HttpMethod;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author kimchy (shay.banon)
 */
public class NettyHttpRequest extends AbstractRestRequest implements HttpRequest {

    private final org.jboss.netty.handler.codec.http.HttpRequest request;

    private final Map<String, String> params;

    private final String path;

    private byte[] data;

    public NettyHttpRequest(org.jboss.netty.handler.codec.http.HttpRequest request) {
        this.request = request;
        this.params = new HashMap<String, String>();

        String uri = request.getUri();
        int pathEndPos = uri.indexOf('?');
        if (pathEndPos < 0) {
            this.path = uri;
        } else {
            this.path = uri.substring(0, pathEndPos);
            RestUtils.decodeQueryString(uri, pathEndPos + 1, params);
        }
    }

    @Override public Method method() {
        HttpMethod httpMethod = request.getMethod();
        if (httpMethod == HttpMethod.GET)
            return Method.GET;

        if (httpMethod == HttpMethod.POST)
            return Method.POST;

        if (httpMethod == HttpMethod.PUT)
            return Method.PUT;

        if (httpMethod == HttpMethod.DELETE)
            return Method.DELETE;

        return Method.GET;
    }

    @Override public String uri() {
        return request.getUri();
    }

    @Override public String path() {
        return path;
    }

    @Override public Map<String, String> params() {
        return params;
    }

    @Override public boolean hasContent() {
        return request.getContent().readableBytes() > 0;
    }

    @Override public byte[] contentAsBytes() {
        if (this.data != null) {
            return this.data;
        }
        data = new byte[request.getContent().readableBytes()];
        request.getContent().getBytes(request.getContent().readerIndex(), data);
        return data;
    }

    @Override public String contentAsString() {
        return request.getContent().toString("UTF-8");
    }

    @Override public Set<String> headerNames() {
        return request.getHeaderNames();
    }

    @Override public String header(String name) {
        return request.getHeader(name);
    }

    @Override public List<String> headers(String name) {
        return request.getHeaders(name);
    }

    @Override public String cookie() {
        return request.getHeader(HttpHeaders.Names.COOKIE);
    }

    @Override public boolean hasParam(String key) {
        return params.containsKey(key);
    }

    @Override public String param(String key) {
        return params.get(key);
    }
}

@@ -1102,16 +1102,49 @@
 ethod;%0A%0A
+import java.nio.charset.Charset;%0A
 import j
@@ -3048,32 +3048,93 @@
 rn data;%0A    %7D%0A%0A
+    private static Charset UTF8 = Charset.forName(%22UTF-8%22);%0A%0A
     @Override pu
@@ -3210,23 +3210,20 @@
 oString(
-%22
 UTF
--8%22
+8
 );%0A    %7D

remove using deprecated method