// 
// Decompiled by Procyon v0.6.0
// 

package io.netty.handler.codec.http;

import io.netty.util.ReferenceCounted;
import io.netty.buffer.ByteBufHolder;
import java.util.Iterator;
import java.util.Map;
import io.netty.util.internal.StringUtil;
import io.netty.util.internal.ObjectUtil;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;

public class DefaultLastHttpContent extends DefaultHttpContent implements LastHttpContent
{
    private final HttpHeaders trailingHeaders;
    
    public DefaultLastHttpContent() {
        this(Unpooled.buffer(0));
    }
    
    public DefaultLastHttpContent(final ByteBuf content) {
        this(content, DefaultHttpHeadersFactory.trailersFactory());
    }
    
    @Deprecated
    public DefaultLastHttpContent(final ByteBuf content, final boolean validateHeaders) {
        this(content, DefaultHttpHeadersFactory.trailersFactory().withValidation(validateHeaders));
    }
    
    public DefaultLastHttpContent(final ByteBuf content, final HttpHeadersFactory trailersFactory) {
        super(content);
        this.trailingHeaders = trailersFactory.newHeaders();
    }
    
    public DefaultLastHttpContent(final ByteBuf content, final HttpHeaders trailingHeaders) {
        super(content);
        this.trailingHeaders = ObjectUtil.checkNotNull(trailingHeaders, "trailingHeaders");
    }
    
    @Override
    public LastHttpContent copy() {
        return this.replace(this.content().copy());
    }
    
    @Override
    public LastHttpContent duplicate() {
        return this.replace(this.content().duplicate());
    }
    
    @Override
    public LastHttpContent retainedDuplicate() {
        return this.replace(this.content().retainedDuplicate());
    }
    
    @Override
    public LastHttpContent replace(final ByteBuf content) {
        return new DefaultLastHttpContent(content, this.trailingHeaders().copy());
    }
    
    @Override
    public LastHttpContent retain(final int increment) {
        super.retain(increment);
        return this;
    }
    
    @Override
    public LastHttpContent retain() {
        super.retain();
        return this;
    }
    
    @Override
    public LastHttpContent touch() {
        super.touch();
        return this;
    }
    
    @Override
    public LastHttpContent touch(final Object hint) {
        super.touch(hint);
        return this;
    }
    
    @Override
    public HttpHeaders trailingHeaders() {
        return this.trailingHeaders;
    }
    
    @Override
    public String toString() {
        final StringBuilder buf = new StringBuilder(super.toString());
        buf.append(StringUtil.NEWLINE);
        this.appendHeaders(buf);
        buf.setLength();
        return buf.toString();
    }
    
    private void appendHeaders(final StringBuilder buf) {
        for (final Map.Entry<String, String> e : this.trailingHeaders()) {
            buf.append(e.getKey());
            buf.append(": ");
            buf.append(e.getValue());
            buf.append(StringUtil.NEWLINE);
        }
    }
}
