StringCollectionLens.java
- package net.zer0bandwidth.android.lib.database.sqlitehouse.refractor;
- import android.content.ContentValues;
- import android.database.Cursor;
- import android.os.Bundle;
- import android.text.TextUtils;
- import net.zer0bandwidth.android.lib.database.SQLiteSyntax;
- import java.util.Collection;
- import java.util.Collections;
- import static net.zer0bandwidth.android.lib.database.SQLiteSyntax.SQLITE_NULL;
- /**
- * Provides a canonical implementation of a {@link Lens} which can marshal a
- * collection of strings to/from a single column in a database row.
- * @since zer0bandwidth-net/android 0.1.5 (#42)
- */
- public abstract class StringCollectionLens<C extends Collection<String>>
- extends Lens<C>
- implements Refractor<C>
- {
- /**
- * Implementation classes must provide a concrete override of this method to
- * declare the delimiter that is used/sought between items in the serialized
- * list.
- * @return the delimiter in the serialized list
- */
- protected abstract String getDelimiter() ;
- /**
- * Implementation classes must provide a concrete override of this method to
- * generate instances of the collection class which contains the list items.
- * @return a collection capable of storing the list items
- */
- protected abstract C getCollectionInstance() ;
- /**
- * Serializes the list as a string, using the delimiter provided by
- * {@link #getDelimiter()}.
- * @param asValues a collection of string values
- * @return a serialization of the list
- */
- public String toStringValue( C asValues )
- {
- return ( asValues == null ? null :
- TextUtils.join( this.getDelimiter(), asValues ) ) ;
- }
- @Override
- public String getSQLiteDataType()
- { return SQLiteSyntax.SQLITE_TYPE_TEXT ; }
- @Override
- public String toSQLiteString( C o )
- {
- return ( o == null ? SQLITE_NULL :
- String.format( "'%s'", this.toStringValue(o) ) ) ;
- }
- @Override
- public StringCollectionLens<C> addToContentValues(
- ContentValues vals, String sKey, C val )
- {
- vals.put( sKey, this.toStringValue(val) ) ;
- return this ;
- }
- /**
- * Adds the collection of strings to a {@link Bundle} as a string array.
- *
- * This will <i>always</i> be rendered in the bundle as a string array,
- * regardless of the algorithm that would marshal the collection to/from a
- * database as a string serialization.
- *
- * @since zer0bandwidth-net/android 0.1.7 (#50)
- */
- @Override
- public StringCollectionLens<C> addToBundle(
- Bundle bndl, String sKey, C val )
- {
- bndl.putStringArray( sKey, val.toArray( new String[val.size()] ) ) ;
- return this ;
- }
- @Override
- public C fromCursor( Cursor crs, String sKey )
- {
- String sValues = crs.getString( crs.getColumnIndex( sKey ) ) ;
- if( sValues == null ) return null ;
- C asValues = this.getCollectionInstance() ;
- Collections.addAll( asValues, sValues.split( this.getDelimiter() ) ) ;
- return asValues ;
- }
- /**
- * Fetches a collection of strings from a {@link Bundle} as a string array.
- *
- * This will <i>always</i> be rendered in the bundle as a string array,
- * regardless of the algorithm that would marshal the collection to/from a
- * database as a string serialization.
- *
- * @since zer0bandwidth-net/android 0.1.7 (#50)
- */
- @Override
- public C fromBundle( Bundle bndl, String sKey )
- {
- String[] asBundled = bndl.getStringArray( sKey ) ;
- if( asBundled == null || asBundled.length == 0 ) return null ;
- C asValues = this.getCollectionInstance() ;
- Collections.addAll( asValues, asBundled ) ;
- return asValues ;
- }
- }