/*
* Copyright (C) 2014 University of Washington
*
* Originally developed by Dobility, Inc. (as part of SurveyCTO)
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.odk.collect.android.external.handler;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import org.javarosa.core.model.condition.EvaluationContext;
import org.javarosa.xpath.expr.XPathFuncExpr;
import org.odk.collect.android.external.ExternalDataManager;
import org.odk.collect.android.external.ExternalDataUtil;
import org.odk.collect.android.external.ExternalSQLiteOpenHelper;
import java.util.Vector;
/**
* Author: Meletis Margaritis
* Date: 25/04/13
* Time: 13:50
*/
public class ExternalDataHandlerPull extends ExternalDataHandlerBase {
public static final String HANDLER_NAME = "pulldata";
public ExternalDataHandlerPull(ExternalDataManager externalDataManager) {
super(externalDataManager);
}
@Override
public String getName() {
return HANDLER_NAME;
}
@Override
public Vector getPrototypes() {
return new Vector();
}
@Override
public boolean rawArgs() {
return true;
}
@Override
public boolean realTime() {
return false;
}
@Override
public Object eval(Object[] args, EvaluationContext ec) {
if (args.length != 4) {
Log.e(ExternalDataUtil.LOGGER_NAME, "4 arguments are needed to evaluate the " + HANDLER_NAME + " function");
return "";
}
String dataSetName = XPathFuncExpr.toString(args[0]);
String queriedColumn = XPathFuncExpr.toString(args[1]);
String referenceColumn = XPathFuncExpr.toString(args[2]);
String referenceValue = XPathFuncExpr.toString(args[3]);
// SCTO-545
dataSetName = normalize(dataSetName);
Cursor c = null;
try {
ExternalSQLiteOpenHelper sqLiteOpenHelper = getExternalDataManager().getDatabase(dataSetName, false);
if (sqLiteOpenHelper == null) {
return "";
}
SQLiteDatabase db = sqLiteOpenHelper.getReadableDatabase();
String[] columns = {ExternalDataUtil.toSafeColumnName(queriedColumn)};
String selection = ExternalDataUtil.toSafeColumnName(referenceColumn) + "=?";
String[] selectionArgs = {referenceValue};
c = db.query(ExternalDataUtil.EXTERNAL_DATA_TABLE_NAME, columns, selection, selectionArgs, null, null, null);
if (c.getCount() > 0) {
c.moveToFirst();
return ExternalDataUtil.nullSafe(c.getString(0));
} else {
Log.e(ExternalDataUtil.LOGGER_NAME, "Could not find a value in " + queriedColumn + " where the column " + referenceColumn + " has the value " + referenceValue);
return "";
}
} catch (Exception e) {
Log.e(ExternalDataUtil.LOGGER_NAME, e.getMessage());
return "";
} finally {
if (c != null) {
c.close();
}
}
}
}