edu.mit.media.funf.probe.builtin.DatedContentProviderProbe.java Source code

Java tutorial

Introduction

Here is the source code for edu.mit.media.funf.probe.builtin.DatedContentProviderProbe.java

Source

/**
 * 
 * Funf: Open Sensing Framework
 * Copyright (C) 2010-2011 Nadav Aharony, Wei Pan, Alex Pentland.
 * Acknowledgments: Alan Gardner
 * Contact: nadav@media.mit.edu
 * 
 * This file is part of Funf.
 * 
 * Funf is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3 of
 * the License, or (at your option) any later version.
 * 
 * Funf is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with Funf. If not, see <http://www.gnu.org/licenses/>.
 * 
 */
package edu.mit.media.funf.probe.builtin;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import android.database.Cursor;
import android.net.Uri;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

import edu.mit.media.funf.config.Configurable;
import edu.mit.media.funf.probe.Probe.ContinuableProbe;
import edu.mit.media.funf.time.DecimalTimeUnit;

public abstract class DatedContentProviderProbe extends ContentProviderProbe implements ContinuableProbe {

    @Configurable
    protected BigDecimal afterDate = null;

    private BigDecimal latestTimestamp = null;

    @Override
    protected Cursor getCursor(String[] projection) {
        String dateColumn = getDateColumnName();
        // Used the code below when we specified projection exactly
        List<String> projectionList = Arrays.asList(projection);
        if (!Arrays.asList(projection).contains(dateColumn)) {
            projectionList = new ArrayList<String>(projectionList);
            projectionList.add(dateColumn);
            projection = new String[projectionList.size()];
            projectionList.toArray(projection);
        }
        String dateFilter = null;
        String[] dateFilterParams = null;
        if (afterDate != null || latestTimestamp != null) {
            dateFilter = dateColumn + " > ?";
            BigDecimal startingDate = afterDate == null ? latestTimestamp
                    : afterDate.max(latestTimestamp == null ? BigDecimal.ZERO : latestTimestamp);
            dateFilterParams = new String[] {
                    String.valueOf(getDateColumnTimeUnit().convert(startingDate, DecimalTimeUnit.SECONDS)) };
        }
        return getContext().getContentResolver().query(getContentProviderUri(), projection, // TODO: different platforms have different fields supported for content providers, need to resolve this
                dateFilter, dateFilterParams, dateColumn + " DESC");
    }

    protected abstract Uri getContentProviderUri();

    protected abstract String getDateColumnName();

    protected DecimalTimeUnit getDateColumnTimeUnit() {
        return DecimalTimeUnit.MILLISECONDS;
    }

    @Override
    protected void sendData(JsonObject data) {
        super.sendData(data);
        latestTimestamp = getTimestamp(data);
    }

    @Override
    protected BigDecimal getTimestamp(JsonObject data) {
        return getDateColumnTimeUnit().toSeconds(data.get(getDateColumnName()).getAsLong());
    }

    @Override
    public JsonElement getCheckpoint() {
        return getGson().toJsonTree(latestTimestamp);
    }

    @Override
    public void setCheckpoint(JsonElement checkpoint) {
        latestTimestamp = checkpoint == null ? null : checkpoint.getAsBigDecimal();
    }

}