package org.dodgybits.shuffle.android.core.model.persistence.selector; import java.util.ArrayList; import java.util.List; import org.dodgybits.shuffle.android.core.model.Id; import org.dodgybits.shuffle.android.core.util.StringUtils; import android.util.Log; import org.dodgybits.shuffle.android.preference.model.ListPreferenceSettings; public abstract class AbstractEntitySelector implements EntitySelector { private static final String cTag = "AbstractEntitySelector"; protected Flag mActive; protected Flag mDeleted; protected String mSortOrder; @Override public Flag getActive() { return mActive; } @Override public Flag getDeleted() { return mDeleted; } @Override public final String getSortOrder() { return mSortOrder; } @Override public String getSelection(android.content.Context context) { List<String> expressions = getSelectionExpressions(context); String selection = StringUtils.join(expressions, " AND "); Log.d(cTag, selection); return selection; } protected List<String> getSelectionExpressions(android.content.Context context) { List<String> expressions = new ArrayList<String>(); return expressions; } protected void addFlagExpression(List<String> expressions, String field, Flag flag) { if (flag != Flag.ignored) { String expression = field + "=" + (flag == Flag.yes ? "1" : "0"); expressions.add(expression); } } protected void addListExpression(List<String> expressions, String field, List<Id> ids) { if (ids != null) { expressions.add(idListSelection(ids, field)); } } private String idListSelection(List<Id> ids, String idName) { StringBuilder result = new StringBuilder(); if (ids.size() > 0) { result.append(idName) .append(" in (") .append(StringUtils.repeat(ids.size(), "?", ",")) .append(')'); } else { result.append(idName) .append(" is null"); } return result.toString(); } protected void addIdListArgs(List<String> args, List<Id> ids) { if (ids != null && ids.size() > 0) { for(Id id : ids) { args.add(String.valueOf(id.getId())); } } } public abstract static class AbstractBuilder<E extends AbstractEntitySelector> implements EntitySelector.Builder<E> { protected E mResult; @Override public Flag getDeleted() { return mResult.getDeleted(); } @Override public Flag getActive() { return mResult.getActive(); } @Override public String getSortOrder() { return mResult.getSortOrder(); } @Override public AbstractBuilder<E> setSortOrder(String value) { mResult.mSortOrder = value; return this; } @Override public AbstractBuilder<E> setActive(Flag value) { mResult.mActive = value; return this; } @Override public AbstractBuilder<E> setDeleted(Flag value) { mResult.mDeleted = value; return this; } @Override public E build() { if (mResult == null) { throw new IllegalStateException( "build() has already been called on this Builder."); } E returnMe = mResult; mResult = null; Log.d(cTag,returnMe.toString()); return returnMe; } @Override public AbstractBuilder<E> mergeFrom(E selector) { setActive(selector.mActive); setDeleted(selector.mDeleted); setSortOrder(selector.mSortOrder); return this; } public AbstractBuilder<E> applyListPreferences(android.content.Context context, ListPreferenceSettings settings) { setActive(settings.getActive(context)); setDeleted(settings.getDeleted(context)); return this; } } }