com.linkedin.proxy.netty.RocksdbQueryDecoder.java Source code

Java tutorial

Introduction

Here is the source code for com.linkedin.proxy.netty.RocksdbQueryDecoder.java

Source

/**
 * Copyright 2014 LinkedIn Corp. 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.
 */
package com.linkedin.proxy.netty;

import java.util.List;

import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageDecoder;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpMethod;

import org.apache.log4j.Logger;

import com.linkedin.proxy.query.Query;
import com.linkedin.proxy.query.Query.QueryType;

public class RocksdbQueryDecoder extends MessageToMessageDecoder<FullHttpRequest> {
    private static final Logger _LOG = Logger.getLogger(RocksdbQueryDecoder.class);

    @Override
    protected void decode(ChannelHandlerContext ctx, FullHttpRequest msg, List<Object> out) throws Exception {
        /*
         * Expected inputs:
         * PUT /dbName/key <value in content>
         * GET /dbName/key
         * DELETE /dbName/key
         */

        Query result = new Query();

        try {
            HttpMethod met = msg.getMethod();
            String uri = msg.getUri();
            int s = 0;
            int e = uri.length();
            if (uri.charAt(0) == '/')
                s = 1;
            if (uri.charAt(e - 1) == '/')
                e--;

            String parts[] = uri.substring(s, e).split("/");

            result.setDbName(parts[0]);
            _LOG.debug("DbName: " + parts[0]);
            result.setKey(parts[1]);
            _LOG.debug("Key: " + parts[1]);

            if (met.equals(HttpMethod.PUT)) {
                /*
                 * If HttpRequest method is PUT, I interpret it as a WRITE query.
                 * Query instance's value is set as the value in the HttpRequest.
                 */
                byte[] tempData = new byte[msg.content().readableBytes()];
                msg.content().readBytes(tempData);
                result.setValue(tempData);
                _LOG.debug("Value size: " + tempData.length);

                result.setType(QueryType.WRITE);
            } else if (met.equals(HttpMethod.GET)) {
                /*
                 * If HttpRequest method is GET, I interpret it as a READ query.
                 * Once the query is processed, the result value (if any) is written to MysqlQuery.value.
                 */
                result.setType(QueryType.READ);
            } else if (met.equals(HttpMethod.DELETE)) {
                /*
                 * If HttpRequest method is DELETE, I interpret it as a DELETE query.
                 */
                result.setType(QueryType.DELETE);
            } else {
                result.setType(QueryType.INVALID);
                _LOG.error("Unhandled HttpMethod: " + met);
                _LOG.error("Type=" + QueryType.INVALID);
            }

            _LOG.debug("Type: " + result.getType());
        } catch (Exception e) {
            _LOG.error("Exception occured during HttpRequest processing", e);
            result.setType(QueryType.INVALID);
            _LOG.error("Type=" + QueryType.INVALID);
        }

        out.add(result);
    }
}