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

Java tutorial

Introduction

Here is the source code for com.linkedin.proxy.netty.MysqlQueryDecoder.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 com.linkedin.proxy.query.MysqlQuery;
import com.linkedin.proxy.query.Query.QueryType;

import org.apache.log4j.Logger;

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;

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

    @Override
    protected void decode(ChannelHandlerContext ctx, FullHttpRequest msg, List<Object> out) throws Exception {
        MysqlQuery result = new MysqlQuery();

        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]);
            result.setTableName(parts[1]);
            result.setKeyColName(parts[2]);
            result.setValueColName(parts[3]);

            if (met.equals(HttpMethod.PUT)) {
                /*
                 * If HttpRequest method is PUT, I interpret it as a WRITE query.
                 * MysqlQuery instance's value is set as the value in the HttpRequest.
                 */
                result.setKey(parts[4]);

                byte[] tempData = new byte[msg.content().readableBytes()];
                msg.content().readBytes(tempData);
                result.setValue(tempData);

                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.setKey(parts[4]);
                result.setType(QueryType.READ);
            } else if (met.equals(HttpMethod.DELETE)) {
                /*
                 * If HttpRequest method is DELETE, I interpret it as a DELETE query.
                 */
                result.setKey(parts[4]);
                result.setType(QueryType.DELETE);
            } else if (met.equals(HttpMethod.POST)) {
                /*
                 * If HttpRequest method is POST, I interpret it as a CREATE TABLE query.
                 * I store size of the value column in MysqlQuery.Value.
                 * I store byte array of the string representation.
                 */
                result.setValue(parts[4].getBytes());
                result.setType(QueryType.CREATE);
            } else {
                result.setType(QueryType.INVALID);
                _LOG.error("Unhandled HttpMethod: " + met);
                _LOG.error("Type=" + QueryType.INVALID);
            }
        } catch (Exception e) {
            _LOG.error("Exception occured during HttpRequest processing", e);
            result.setType(QueryType.INVALID);
            _LOG.error("Type=" + QueryType.INVALID);
        }

        out.add(result);
    }
}