/*
 * Copyright 2012 The Netty Project
 *
 * The Netty Project 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 io.netty.handler.codec.http.multipart;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelException;
import io.netty.handler.codec.http.HttpConstants;

import java.io.IOException;
import java.nio.charset.Charset;

import static io.netty.buffer.Unpooled.wrappedBuffer;

Disk implementation of Attributes
/** * Disk implementation of Attributes */
public class DiskAttribute extends AbstractDiskHttpData implements Attribute { public static String baseDirectory; public static boolean deleteOnExitTemporaryFile = true; public static final String prefix = "Attr_"; public static final String postfix = ".att";
Constructor used for huge Attribute
/** * Constructor used for huge Attribute */
public DiskAttribute(String name) { this(name, HttpConstants.DEFAULT_CHARSET); } public DiskAttribute(String name, long definedSize) { this(name, definedSize, HttpConstants.DEFAULT_CHARSET); } public DiskAttribute(String name, Charset charset) { super(name, charset, 0); } public DiskAttribute(String name, long definedSize, Charset charset) { super(name, charset, definedSize); } public DiskAttribute(String name, String value) throws IOException { this(name, value, HttpConstants.DEFAULT_CHARSET); } public DiskAttribute(String name, String value, Charset charset) throws IOException { super(name, charset, 0); // Attribute have no default size setValue(value); } @Override public HttpDataType getHttpDataType() { return HttpDataType.Attribute; } @Override public String getValue() throws IOException { byte [] bytes = get(); return new String(bytes, getCharset()); } @Override public void setValue(String value) throws IOException { if (value == null) { throw new NullPointerException("value"); } byte [] bytes = value.getBytes(getCharset()); checkSize(bytes.length); ByteBuf buffer = wrappedBuffer(bytes); if (definedSize > 0) { definedSize = buffer.readableBytes(); } setContent(buffer); } @Override public void addContent(ByteBuf buffer, boolean last) throws IOException { final long newDefinedSize = size + buffer.readableBytes(); checkSize(newDefinedSize); if (definedSize > 0 && definedSize < newDefinedSize) { definedSize = newDefinedSize; } super.addContent(buffer, last); } @Override public int hashCode() { return getName().hashCode(); } @Override public boolean equals(Object o) { if (!(o instanceof Attribute)) { return false; } Attribute attribute = (Attribute) o; return getName().equalsIgnoreCase(attribute.getName()); } @Override public int compareTo(InterfaceHttpData o) { if (!(o instanceof Attribute)) { throw new ClassCastException("Cannot compare " + getHttpDataType() + " with " + o.getHttpDataType()); } return compareTo((Attribute) o); } public int compareTo(Attribute o) { return getName().compareToIgnoreCase(o.getName()); } @Override public String toString() { try { return getName() + '=' + getValue(); } catch (IOException e) { return getName() + '=' + e; } } @Override protected boolean deleteOnExit() { return deleteOnExitTemporaryFile; } @Override protected String getBaseDirectory() { return baseDirectory; } @Override protected String getDiskFilename() { return getName() + postfix; } @Override protected String getPostfix() { return postfix; } @Override protected String getPrefix() { return prefix; } @Override public Attribute copy() { final ByteBuf content = content(); return replace(content != null ? content.copy() : null); } @Override public Attribute duplicate() { final ByteBuf content = content(); return replace(content != null ? content.duplicate() : null); } @Override public Attribute retainedDuplicate() { ByteBuf content = content(); if (content != null) { content = content.retainedDuplicate(); boolean success = false; try { Attribute duplicate = replace(content); success = true; return duplicate; } finally { if (!success) { content.release(); } } } else { return replace(null); } } @Override public Attribute replace(ByteBuf content) { DiskAttribute attr = new DiskAttribute(getName()); attr.setCharset(getCharset()); if (content != null) { try { attr.setContent(content); } catch (IOException e) { throw new ChannelException(e); } } return attr; } @Override public Attribute retain(int increment) { super.retain(increment); return this; } @Override public Attribute retain() { super.retain(); return this; } @Override public Attribute touch() { super.touch(); return this; } @Override public Attribute touch(Object hint) { super.touch(hint); return this; } }