/**
 * Copyright (c) 2012, The University of Southampton and the individual contributors.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 *   * 	Redistributions of source code must retain the above copyright notice,
 * 	this list of conditions and the following disclaimer.
 *
 *   *	Redistributions in binary form must reproduce the above copyright notice,
 * 	this list of conditions and the following disclaimer in the documentation
 * 	and/or other materials provided with the distribution.
 *
 *   *	Neither the name of the University of Southampton nor the names of its
 * 	contributors may be used to endorse or promote products derived from this
 * 	software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
/**
 * Autogenerated by Thrift Compiler (0.7.0)
 *
 * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 */
package net.lag.kestrel.thrift;

import java.nio.ByteBuffer;
import java.util.BitSet;
import java.util.Collections;
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang.builder.HashCodeBuilder;

@SuppressWarnings({ "javadoc", "unused", "serial" })
public class Item implements org.apache.thrift7.TBase<Item, Item._Fields>, java.io.Serializable, Cloneable {
	private static final org.apache.thrift7.protocol.TStruct STRUCT_DESC = new org.apache.thrift7.protocol.TStruct("Item");

	private static final org.apache.thrift7.protocol.TField DATA_FIELD_DESC = new org.apache.thrift7.protocol.TField(
			"data", org.apache.thrift7.protocol.TType.STRING, (short) 1);
	private static final org.apache.thrift7.protocol.TField ID_FIELD_DESC = new org.apache.thrift7.protocol.TField("id",
			org.apache.thrift7.protocol.TType.I64, (short) 2);

	private ByteBuffer data; // required
	private long id; // required

	/**
	 * The set of fields this struct contains, along with convenience methods
	 * for finding and manipulating them.
	 */
	public enum _Fields implements org.apache.thrift7.TFieldIdEnum {
		DATA((short) 1, "data"),
		ID((short) 2, "id");

		private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();

		static {
			for (final _Fields field : EnumSet.allOf(_Fields.class)) {
				byName.put(field.getFieldName(), field);
			}
		}

		/**
		 * Find the _Fields constant that matches fieldId, or null if its not
		 * found.
		 */
		public static _Fields findByThriftId(int fieldId) {
			switch (fieldId) {
			case 1: // DATA
				return DATA;
			case 2: // ID
				return ID;
			default:
				return null;
			}
		}

		/**
		 * Find the _Fields constant that matches fieldId, throwing an exception
		 * if it is not found.
		 */
		public static _Fields findByThriftIdOrThrow(int fieldId) {
			final _Fields fields = findByThriftId(fieldId);
			if (fields == null)
				throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!");
			return fields;
		}

		/**
		 * Find the _Fields constant that matches name, or null if its not
		 * found.
		 */
		public static _Fields findByName(String name) {
			return byName.get(name);
		}

		private final short _thriftId;
		private final String _fieldName;

		_Fields(short thriftId, String fieldName) {
			_thriftId = thriftId;
			_fieldName = fieldName;
		}

		@Override
		public short getThriftFieldId() {
			return _thriftId;
		}

		@Override
		public String getFieldName() {
			return _fieldName;
		}
	}

	// isset id assignments
	private static final int __ID_ISSET_ID = 0;
	private BitSet __isset_bit_vector = new BitSet(1);

	public static final Map<_Fields, org.apache.thrift7.meta_data.FieldMetaData> metaDataMap;
	static {
		final Map<_Fields, org.apache.thrift7.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift7.meta_data.FieldMetaData>(
				_Fields.class);
		tmpMap.put(_Fields.DATA, new org.apache.thrift7.meta_data.FieldMetaData("data",
				org.apache.thrift7.TFieldRequirementType.DEFAULT,
				new org.apache.thrift7.meta_data.FieldValueMetaData(org.apache.thrift7.protocol.TType.STRING, true)));
		tmpMap.put(_Fields.ID, new org.apache.thrift7.meta_data.FieldMetaData("id",
				org.apache.thrift7.TFieldRequirementType.DEFAULT,
				new org.apache.thrift7.meta_data.FieldValueMetaData(org.apache.thrift7.protocol.TType.I64)));
		metaDataMap = Collections.unmodifiableMap(tmpMap);
		org.apache.thrift7.meta_data.FieldMetaData.addStructMetaDataMap(Item.class, metaDataMap);
	}

	public Item() {
	}

	public Item(
			ByteBuffer data,
			long id)
	{
		this();
		this.data = data;
		this.id = id;
		set_id_isSet(true);
	}

	/**
	 * Performs a deep copy on <i>other</i>.
	 */
	public Item(Item other) {
		__isset_bit_vector.clear();
		__isset_bit_vector.or(other.__isset_bit_vector);
		if (other.is_set_data()) {
			this.data = org.apache.thrift7.TBaseHelper.copyBinary(other.data);
			;
		}
		this.id = other.id;
	}

	@Override
	public Item deepCopy() {
		return new Item(this);
	}

	@Override
	public void clear() {
		this.data = null;
		set_id_isSet(false);
		this.id = 0;
	}

	public byte[] get_data() {
		set_data(org.apache.thrift7.TBaseHelper.rightSize(data));
		return data == null ? null : data.array();
	}

	public ByteBuffer buffer_for_data() {
		return data;
	}

	public void set_data(byte[] data) {
		set_data(data == null ? (ByteBuffer) null : ByteBuffer.wrap(data));
	}

	public void set_data(ByteBuffer data) {
		this.data = data;
	}

	public void unset_data() {
		this.data = null;
	}

	/**
	 * Returns true if field data is set (has been assigned a value) and false
	 * otherwise
	 */
	public boolean is_set_data() {
		return this.data != null;
	}

	public void set_data_isSet(boolean value) {
		if (!value) {
			this.data = null;
		}
	}

	public long get_id() {
		return this.id;
	}

	public void set_id(long id) {
		this.id = id;
		set_id_isSet(true);
	}

	public void unset_id() {
		__isset_bit_vector.clear(__ID_ISSET_ID);
	}

	/**
	 * Returns true if field id is set (has been assigned a value) and false
	 * otherwise
	 */
	public boolean is_set_id() {
		return __isset_bit_vector.get(__ID_ISSET_ID);
	}

	public void set_id_isSet(boolean value) {
		__isset_bit_vector.set(__ID_ISSET_ID, value);
	}

	@Override
	public void setFieldValue(_Fields field, Object value) {
		switch (field) {
		case DATA:
			if (value == null) {
				unset_data();
			} else {
				set_data((ByteBuffer) value);
			}
			break;

		case ID:
			if (value == null) {
				unset_id();
			} else {
				set_id((Long) value);
			}
			break;

		}
	}

	@Override
	public Object getFieldValue(_Fields field) {
		switch (field) {
		case DATA:
			return get_data();

		case ID:
			return Long.valueOf(get_id());

		}
		throw new IllegalStateException();
	}

	/**
	 * Returns true if field corresponding to fieldID is set (has been assigned
	 * a value) and false otherwise
	 */
	@Override
	public boolean isSet(_Fields field) {
		if (field == null) {
			throw new IllegalArgumentException();
		}

		switch (field) {
		case DATA:
			return is_set_data();
		case ID:
			return is_set_id();
		}
		throw new IllegalStateException();
	}

	@Override
	public boolean equals(Object that) {
		if (that == null)
			return false;
		if (that instanceof Item)
			return this.equals((Item) that);
		return false;
	}

	public boolean equals(Item that) {
		if (that == null)
			return false;

		final boolean this_present_data = true && this.is_set_data();
		final boolean that_present_data = true && that.is_set_data();
		if (this_present_data || that_present_data) {
			if (!(this_present_data && that_present_data))
				return false;
			if (!this.data.equals(that.data))
				return false;
		}

		final boolean this_present_id = true;
		final boolean that_present_id = true;
		if (this_present_id || that_present_id) {
			if (!(this_present_id && that_present_id))
				return false;
			if (this.id != that.id)
				return false;
		}

		return true;
	}

	@Override
	public int hashCode() {
		final HashCodeBuilder builder = new HashCodeBuilder();

		final boolean present_data = true && (is_set_data());
		builder.append(present_data);
		if (present_data)
			builder.append(data);

		final boolean present_id = true;
		builder.append(present_id);
		if (present_id)
			builder.append(id);

		return builder.toHashCode();
	}

	@Override
	public int compareTo(Item other) {
		if (!getClass().equals(other.getClass())) {
			return getClass().getName().compareTo(other.getClass().getName());
		}

		int lastComparison = 0;
		final Item typedOther = other;

		lastComparison = Boolean.valueOf(is_set_data()).compareTo(typedOther.is_set_data());
		if (lastComparison != 0) {
			return lastComparison;
		}
		if (is_set_data()) {
			lastComparison = org.apache.thrift7.TBaseHelper.compareTo(this.data, typedOther.data);
			if (lastComparison != 0) {
				return lastComparison;
			}
		}
		lastComparison = Boolean.valueOf(is_set_id()).compareTo(typedOther.is_set_id());
		if (lastComparison != 0) {
			return lastComparison;
		}
		if (is_set_id()) {
			lastComparison = org.apache.thrift7.TBaseHelper.compareTo(this.id, typedOther.id);
			if (lastComparison != 0) {
				return lastComparison;
			}
		}
		return 0;
	}

	@Override
	public _Fields fieldForId(int fieldId) {
		return _Fields.findByThriftId(fieldId);
	}

	@Override
	public void read(org.apache.thrift7.protocol.TProtocol iprot) throws org.apache.thrift7.TException {
		org.apache.thrift7.protocol.TField field;
		iprot.readStructBegin();
		while (true)
		{
			field = iprot.readFieldBegin();
			if (field.type == org.apache.thrift7.protocol.TType.STOP) {
				break;
			}
			switch (field.id) {
			case 1: // DATA
				if (field.type == org.apache.thrift7.protocol.TType.STRING) {
					this.data = iprot.readBinary();
				} else {
					org.apache.thrift7.protocol.TProtocolUtil.skip(iprot, field.type);
				}
				break;
			case 2: // ID
				if (field.type == org.apache.thrift7.protocol.TType.I64) {
					this.id = iprot.readI64();
					set_id_isSet(true);
				} else {
					org.apache.thrift7.protocol.TProtocolUtil.skip(iprot, field.type);
				}
				break;
			default:
				org.apache.thrift7.protocol.TProtocolUtil.skip(iprot, field.type);
			}
			iprot.readFieldEnd();
		}
		iprot.readStructEnd();
		validate();
	}

	@Override
	public void write(org.apache.thrift7.protocol.TProtocol oprot) throws org.apache.thrift7.TException {
		validate();

		oprot.writeStructBegin(STRUCT_DESC);
		if (this.data != null) {
			oprot.writeFieldBegin(DATA_FIELD_DESC);
			oprot.writeBinary(this.data);
			oprot.writeFieldEnd();
		}
		oprot.writeFieldBegin(ID_FIELD_DESC);
		oprot.writeI64(this.id);
		oprot.writeFieldEnd();
		oprot.writeFieldStop();
		oprot.writeStructEnd();
	}

	@Override
	public String toString() {
		final StringBuilder sb = new StringBuilder("Item(");
		boolean first = true;

		sb.append("data:");
		if (this.data == null) {
			sb.append("null");
		} else {
			org.apache.thrift7.TBaseHelper.toString(this.data, sb);
		}
		first = false;
		if (!first)
			sb.append(", ");
		sb.append("id:");
		sb.append(this.id);
		first = false;
		sb.append(")");
		return sb.toString();
	}

	public void validate() throws org.apache.thrift7.TException {
		// check for required fields
	}

	private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
		try {
			write(new org.apache.thrift7.protocol.TCompactProtocol(new org.apache.thrift7.transport.TIOStreamTransport(
					out)));
		} catch (final org.apache.thrift7.TException te) {
			throw new java.io.IOException(te);
		}
	}

	private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
		try {
			// it doesn't seem like you should have to do this, but java
			// serialization is wacky, and doesn't call the default constructor.
			__isset_bit_vector = new BitSet(1);
			read(new org.apache.thrift7.protocol.TCompactProtocol(new org.apache.thrift7.transport.TIOStreamTransport(in)));
		} catch (final org.apache.thrift7.TException te) {
			throw new java.io.IOException(te);
		}
	}

}
