Package com.linkedin.databus2.core.container.request

Source Code of com.linkedin.databus2.core.container.request.CommandsRegistry

package com.linkedin.databus2.core.container.request;
/*
*
* Copyright 2013 LinkedIn Corp. All rights reserved
*
* 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.  See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/


import java.nio.ByteOrder;
import java.util.HashMap;
import java.util.Map;

import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.SimpleChannelHandler;

import com.linkedin.databus2.core.container.request.BinaryCommandParser;
import com.linkedin.databus2.core.container.request.BinaryCommandParserFactory;
import com.linkedin.databus2.core.container.request.ProcessorRegistrationConflictException;
import com.linkedin.databus2.core.container.request.RequestExecutionHandlerFactory;

/**
* A registry that manages all factories needed to process commands through HTTP and TCP interfaces.
*
* <p>The implementation is not thread-safe though the factories are. All commands should be
* registered before starting any kind of processing.
*
* @author cbotev
*
*/
public class CommandsRegistry
{
  private final Map<Byte,BinaryCommandParserFactory> _binaryParsers;
  private final Map<Byte,RequestExecutionHandlerFactory> _tcpExecHandlers;
  private final Map<String, RequestExecutionHandlerFactory> _httpExecHandlers;

  public CommandsRegistry()
  {
    _binaryParsers = new HashMap<Byte, BinaryCommandParserFactory>();
    _tcpExecHandlers = new HashMap<Byte, RequestExecutionHandlerFactory>();
    _httpExecHandlers = new HashMap<String, RequestExecutionHandlerFactory>();
  }

  /**
   * Registers a new command
   * @param name                    the HTTP name of the command (null for no HTTP interface)
   * @param opcode                  the TCP opcode (null for no TCP inteface)
   * @param binaryParserFactory     the factory for binary parsers for this command to be used
   *                                by the TCP interface (can be null if opcode is null)
   * @param execHandlerFactory      the factory for ChannelHandlers to be used for executing
   *                                commands of the specified type. The factory will be used for
   *                                both HTTP and TCP commands if those interfaces are enabled.
   *                                Must not be null.
   * @throws ProcessorRegistrationConflictException
   */
  public void registerCommand(String name, Byte opcode,
                              BinaryCommandParserFactory binaryParserFactory,
                              RequestExecutionHandlerFactory execHandlerFactory)
         throws ProcessorRegistrationConflictException
  {
    if (null != opcode)
    {
      if (_binaryParsers.containsKey(opcode)) throw new ProcessorRegistrationConflictException(name);
      _binaryParsers.put(opcode, binaryParserFactory);
      _tcpExecHandlers.put(opcode, execHandlerFactory);
    }

    if (null != name)
    {
      _httpExecHandlers.put(name, execHandlerFactory);
    }
  }

  /**
   * Creates a binary parser for a TCP command
   * @param opcode          the TCP command opcode
   * @return the parser or null if no such command has been registered.
   */
  public BinaryCommandParser createParser(byte opcode, Channel channel, ByteOrder byteOrder)
  {
    BinaryCommandParserFactory factory = _binaryParsers.get(opcode);
    return (null != factory) ? factory.createParser(channel, byteOrder) : null;
  }

  /**
   * Creates an execution handler for a TCP command
   * @param opcode          the TCP command opcode
   * @return the execution handler or null if no such command has been registered.
   */
  public SimpleChannelHandler createExecHandler(byte opcode, Channel channel)
  {
    RequestExecutionHandlerFactory factory = _tcpExecHandlers.get(opcode);
    return (null != factory) ? factory.createHandler(channel) : null;
  }

  /**
   * Creates an execution handler for an HTTP command
   * @param name
   * @return the execution handler or null if no such command has been registered.
   */
  public SimpleChannelHandler createExecHandler(String name, Channel channel)
  {
    RequestExecutionHandlerFactory factory = _httpExecHandlers.get(name);
    return (null != factory) ? factory.createHandler(channel) : null;
  }

}
TOP

Related Classes of com.linkedin.databus2.core.container.request.CommandsRegistry

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.