/*
 * Copyright 2015 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.onlab.util;

import org.jboss.netty.buffer.ChannelBuffer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * HexDump class an utility to dump buffer in hex format.
 */
public final class HexDump {
    protected static final Logger log = LoggerFactory.getLogger(HexDump.class);

    private HexDump() {
    }

    /**
     * Dump the buffer content in hex format.
     *
     * @param buff buffer content to dump in hex format
     */
    public static void dump(ChannelBuffer buff) {
        buff.markReaderIndex();
        try {
            do {
                StringBuilder sb = new StringBuilder();
                for (int k = 0; (k < 16) && (buff.readableBytes() != 0); ++k) {
                    if (0 == k % 4) {
                        sb.append(String.format(" ")); // blank after 4 bytes
                    }
                    sb.append(String.format("%02X ", buff.readByte()));
                }
                log.debug(sb.toString());
            } while (buff.readableBytes() != 0);
        } catch (Exception e) {
            log.error("[HexDump] Invalid buffer: " + e.toString());
        }
        buff.resetReaderIndex();
    }
}
