package net.cattaka.util.cathandsgendroid.accessor; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import net.cattaka.util.cathandsgendroid.annotation.AccessorAttrs; import android.content.ContentValues; import android.database.Cursor; import android.os.Parcel; /** * The accessor for Enum. This uses "order" for representation of datatype. */ @AccessorAttrs(dbDataType="INTEGER") public class EnumOrderAccessor<T extends Enum<T>> implements IAccessor<T> { /** * Create the accessor for enum. * * @param child accessor for inherited datatype. * @return created accessor */ public static <T extends Enum<T>> IAccessor<T> createAccessor(Class<T> clazz) { return new EnumOrderAccessor<T>(clazz); } private Class<T> enumType; private EnumOrderAccessor(Class<T> enumType) { super(); this.enumType = enumType; } @Override public T readFromStream(DataInputStream in) throws IOException { int order = (in.readBoolean()) ? in.readInt() : -1; T[] values = enumType.getEnumConstants(); if (0 <= order && order <= values.length) { return values[order]; } return null; } @Override public void writeToStream(DataOutputStream out, T value) throws IOException { out.writeBoolean(value != null); if (value != null) { out.writeInt(value.ordinal()); } } @Override public T readFromParcel(Parcel p) { int order = (p.readByte() != 0) ? p.readInt() : -1; T[] values = enumType.getEnumConstants(); if (0 <= order && order <= values.length) { return values[order]; } return null; } @Override public void writeToParcel(Parcel p, T value) { p.writeByte(value != null ? (byte)1 : 0); if (value != null) { p.writeInt(value.ordinal()); } } @Override public T readFromCursor(Cursor c, int idx) { if (!c.isNull(idx)) { int order = c.getInt(idx); T[] values = enumType.getEnumConstants(); if (0 <= order && order <= values.length) { return values[order]; } } return null; } @Override public void putToContentValues(ContentValues values, String columnName, T value) { values.put(columnName, (value != null) ? value.ordinal() : null); } @Override public String stringValue(T value) { return (value != null) ? String.valueOf(value.ordinal()) : null; } }