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

package io.netty.handler.codec.http.multipart;

import io.netty.buffer.ByteBufHolder;
import io.netty.util.ReferenceCounted;
import java.io.InputStream;
import java.io.File;
import io.netty.buffer.ByteBuf;
import java.io.IOException;
import java.nio.charset.Charset;
import io.netty.handler.codec.http.HttpConstants;

public class MixedAttribute extends AbstractMixedHttpData<Attribute> implements Attribute
{
    public MixedAttribute(final String name, final long limitSize) {
        this(name, limitSize, HttpConstants.DEFAULT_CHARSET);
    }
    
    public MixedAttribute(final String name, final long definedSize, final long limitSize) {
        this(name, definedSize, limitSize, HttpConstants.DEFAULT_CHARSET);
    }
    
    public MixedAttribute(final String name, final long limitSize, final Charset charset) {
        this(name, limitSize, charset, DiskAttribute.baseDirectory, DiskAttribute.deleteOnExitTemporaryFile);
    }
    
    public MixedAttribute(final String name, final long limitSize, final Charset charset, final String baseDir, final boolean deleteOnExit) {
        this(name, 0L, limitSize, charset, baseDir, deleteOnExit);
    }
    
    public MixedAttribute(final String name, final long definedSize, final long limitSize, final Charset charset) {
        this(name, definedSize, limitSize, charset, DiskAttribute.baseDirectory, DiskAttribute.deleteOnExitTemporaryFile);
    }
    
    public MixedAttribute(final String name, final long definedSize, final long limitSize, final Charset charset, final String baseDir, final boolean deleteOnExit) {
        super(limitSize, baseDir, deleteOnExit, new MemoryAttribute(name, definedSize, charset));
    }
    
    public MixedAttribute(final String name, final String value, final long limitSize) {
        this(name, value, limitSize, HttpConstants.DEFAULT_CHARSET, DiskAttribute.baseDirectory, DiskFileUpload.deleteOnExitTemporaryFile);
    }
    
    public MixedAttribute(final String name, final String value, final long limitSize, final Charset charset) {
        this(name, value, limitSize, charset, DiskAttribute.baseDirectory, DiskFileUpload.deleteOnExitTemporaryFile);
    }
    
    private static Attribute makeInitialAttributeFromValue(final String name, final String value, final long limitSize, final Charset charset, final String baseDir, final boolean deleteOnExit) {
        if (value.length() > limitSize) {
            try {
                return new DiskAttribute(name, value, charset, baseDir, deleteOnExit);
            }
            catch (final IOException e) {
                try {
                    return new MemoryAttribute(name, value, charset);
                }
                catch (final IOException ignore) {
                    throw new IllegalArgumentException(e);
                }
            }
        }
        try {
            return new MemoryAttribute(name, value, charset);
        }
        catch (final IOException e) {
            throw new IllegalArgumentException(e);
        }
    }
    
    public MixedAttribute(final String name, final String value, final long limitSize, final Charset charset, final String baseDir, final boolean deleteOnExit) {
        super(limitSize, baseDir, deleteOnExit, makeInitialAttributeFromValue(name, value, limitSize, charset, baseDir, deleteOnExit));
    }
    
    @Override
    public String getValue() throws IOException {
        return ((Attribute)this.wrapped).getValue();
    }
    
    @Override
    public void setValue(final String value) throws IOException {
        ((Attribute)this.wrapped).setValue(value);
    }
    
    @Override
    Attribute makeDiskData() {
        final DiskAttribute diskAttribute = new DiskAttribute(this.getName(), this.definedLength(), this.baseDir, this.deleteOnExit);
        diskAttribute.setMaxSize(this.getMaxSize());
        return diskAttribute;
    }
    
    @Override
    public Attribute copy() {
        return super.copy();
    }
    
    @Override
    public Attribute duplicate() {
        return super.duplicate();
    }
    
    @Override
    public Attribute replace(final ByteBuf content) {
        return super.replace(content);
    }
    
    @Override
    public Attribute retain() {
        return super.retain();
    }
    
    @Override
    public Attribute retain(final int increment) {
        return super.retain(increment);
    }
    
    @Override
    public Attribute retainedDuplicate() {
        return super.retainedDuplicate();
    }
    
    @Override
    public Attribute touch() {
        return super.touch();
    }
    
    @Override
    public Attribute touch(final Object hint) {
        return super.touch(hint);
    }
}
