/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.apache.distributedlog.io;

import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.CompositeByteBuf;
import io.netty.buffer.PooledByteBufAllocator;

/**
 * An identity compression codec implementation for {@link CompressionCodec}.
 */
public class IdentityCompressionCodec implements CompressionCodec {

    public static IdentityCompressionCodec of() {
        return INSTANCE;
    }

    private static final IdentityCompressionCodec INSTANCE = new IdentityCompressionCodec();

    @Override
    public ByteBuf compress(ByteBuf uncompressed, int headerLen) {
        checkNotNull(uncompressed);
        checkArgument(uncompressed.readableBytes() >= 0);
        if (headerLen == 0) {
            return uncompressed.retain();
        } else {
            CompositeByteBuf composited = PooledByteBufAllocator.DEFAULT.compositeBuffer(2);
            composited.addComponent(PooledByteBufAllocator.DEFAULT.buffer(headerLen, headerLen));
            composited.addComponent(uncompressed.retain());
            return composited;
        }
    }

    @Override
    public ByteBuf decompress(ByteBuf compressed, int decompressedSize) {
        checkNotNull(compressed);
        checkArgument(compressed.readableBytes() >= 0);
        checkArgument(decompressedSize >= 0);
        return compressed.retain();
    }
}
