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 "name" for representation of datatype. */ @AccessorAttrs(dbDataType="TEXT") public class EnumNameAccessor<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 EnumNameAccessor<T>(clazz); } private Class<T> enumType; private EnumNameAccessor(Class<T> enumType) { super(); this.enumType = enumType; } @Override public T readFromStream(DataInputStream in) throws IOException { String name = (in.readBoolean()) ? in.readUTF() : null; try { return (name != null) ? Enum.valueOf(enumType, name) : null; } catch (IllegalArgumentException e) { } return null; } @Override public void writeToStream(DataOutputStream out, T value) throws IOException { out.writeBoolean(value != null); if (value != null) { out.writeUTF(value.name()); } } @Override public T readFromParcel(Parcel p) { String name = (p.readByte() != 0) ? p.readString() : null; try { return (name != null) ? Enum.valueOf(enumType, name) : null; } catch (IllegalArgumentException e) { } return null; } @Override public void writeToParcel(Parcel p, T value) { p.writeByte(value != null ? (byte)1 : 0); if (value != null) { p.writeString(value.name()); } } @Override public T readFromCursor(Cursor c, int idx) { if (!c.isNull(idx)) { String name = c.getString(idx); try { return (name != null) ? Enum.valueOf(enumType, name) : null; } catch (IllegalArgumentException e) { } } return null; } @Override public void putToContentValues(ContentValues values, String columnName, T value) { values.put(columnName, (value != null) ? value.name() : null); } @Override public String stringValue(T value) { return (value != null) ? value.name() : null; } }