/*
 * Copyright 2016-present Open Networking Laboratory
 *
 * 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.
 */
package org.onosproject.lisp.msg.protocols;

import io.netty.buffer.ByteBuf;

import static org.onosproject.lisp.msg.protocols.DefaultLispMapReply.ReplyReader;
import static org.onosproject.lisp.msg.protocols.DefaultLispMapNotify.NotifyReader;
import static org.onosproject.lisp.msg.protocols.DefaultLispMapRegister.RegisterReader;
import static org.onosproject.lisp.msg.protocols.DefaultLispMapRequest.RequestReader;
import static org.onosproject.lisp.msg.protocols.DefaultLispEncapsulatedControl.EcmReader;

/**
 * A factory class which helps to instantiate LISP reader class.
 */
public final class LispMessageReaderFactory {
    private static final int TYPE_SHIFT_BIT = 4;

    private LispMessageReaderFactory() {}

    /**
     * Obtains corresponding LISP message reader.
     *
     * @param buffer netty byte buffer
     * @return LISP message reader
     */
    public static LispMessageReader getReader(ByteBuf buffer) {
        LispMessageReader reader;

        LispType type = LispType.valueOf(
                (short) (buffer.getUnsignedByte(0) >> TYPE_SHIFT_BIT));

        switch (type) {
            case LISP_MAP_REQUEST:
                reader = new RequestReader();
                break;
            case LISP_MAP_REPLY:
                reader = new ReplyReader();
                break;
            case LISP_MAP_REGISTER:
                reader = new RegisterReader();
                break;
            case LISP_MAP_NOTIFY:
                reader = new NotifyReader();
                break;
            case LISP_ENCAPSULATED_CONTROL:
                reader = new EcmReader();
                break;
            case UNKNOWN:
                throw new IllegalArgumentException("Unknown message type: "
                                                           + type);
            default:
                throw new IllegalArgumentException("Undefined message type: "
                                                           + type);
        }
        return reader;
    }
}

@@ -687,16 +687,52 @@
 ByteBuf;
+%0Aimport org.onlab.util.ByteOperator;
 %0A%0Aimport
@@ -1155,16 +1155,194 @@
 mReader;
+%0Aimport static org.onosproject.lisp.msg.protocols.DefaultLispInfoRequest.InfoRequestReader;%0Aimport static org.onosproject.lisp.msg.protocols.DefaultLispInfoReply.InfoReplyReader;
 %0A%0A/**%0A *
@@ -1502,16 +1502,67 @@
 BIT = 4;
+%0A    private static final int INFO_REPLY_INDEX = 3;
 %0A%0A    pr
@@ -2327,16 +2327,16 @@
 NOTIFY:%0A
-
         
@@ -2387,32 +2387,403 @@
          break;%0A
+            case LISP_INFO:%0A                boolean isInfoReply = ByteOperator.getBit(%0A                        (byte) buffer.getUnsignedByte(0), INFO_REPLY_INDEX);%0A                if (isInfoReply) %7B%0A                    reader = new InfoReplyReader();%0A                %7D else %7B%0A                    reader = new InfoRequestReader();%0A                %7D%0A                break;%0A
             case

Enable to handle LISP Info (request, reply) messages by LISPMessageReaderFactory