com.money.manager.ex.datalayer.StockRepository.java Source code

Java tutorial

Introduction

Here is the source code for com.money.manager.ex.datalayer.StockRepository.java

Source

/*
 * Copyright (C) 2012-2016 The Android Money Manager Ex Project Team
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 3
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.money.manager.ex.datalayer;

import android.content.Context;
import android.database.Cursor;

import com.money.manager.ex.Constants;
import com.money.manager.ex.database.DatasetType;
import com.money.manager.ex.database.WhereStatementGenerator;
import com.money.manager.ex.domainmodel.Stock;
import com.money.manager.ex.utils.MmxDatabaseUtils;

import org.apache.commons.lang3.ArrayUtils;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;

import info.javaperformance.money.Money;

/**
 * Data repository for Stock entities.
 */
public class StockRepository extends RepositoryBase<Stock> {

    @Inject
    public StockRepository(Context context) {
        super(context, "stock_v1", DatasetType.TABLE, "stock");

    }

    //    @Override
    public String[] getAllColumns() {
        String[] idColumn = new String[] { "STOCKID AS _id" };

        return ArrayUtils.addAll(idColumn, tableColumns());
    }

    public boolean delete(int id) {
        int result = super.delete(StockFields.STOCKID + "=?", new String[] { Integer.toString(id) });
        return result > 0;
    }

    public String[] tableColumns() {
        Field[] fields = StockFields.class.getFields();
        String[] names = new String[fields.length];

        for (int i = 0; i < fields.length; i++) {
            names[i] = fields[i].getName();
        }

        return names;
    }

    public Stock load(int id) {
        if (id == Constants.NOT_SET)
            return null;

        return first(Stock.class, null, StockFields.STOCKID + "=?", new String[] { Integer.toString(id) }, null);
    }

    /**
     * Load multiple items by id.
     * @param ids Array of ids to load.
     * @return List of stocks.
     */
    public List<Stock> load(Integer[] ids) {
        if (ids.length == 0)
            return null;

        MmxDatabaseUtils dbUtils = new MmxDatabaseUtils(getContext());
        String placeHolders = dbUtils.makePlaceholders(ids.length);
        String[] idParams = new String[ids.length];

        for (int i = 0; i < ids.length; i++) {
            idParams[i] = Integer.toString(ids[i]);
        }

        Cursor c = openCursor(null, StockFields.STOCKID + " IN (" + placeHolders + ")", idParams, null);
        if (c == null)
            return null;

        List<Stock> result = getEntities(c);

        return result;
    }

    public List<Stock> loadForSymbols(String[] symbols) {
        if (symbols.length == 0)
            return null;

        MmxDatabaseUtils dbUtils = new MmxDatabaseUtils(getContext());
        String placeHolders = dbUtils.makePlaceholders(symbols.length);

        Cursor c = openCursor(null, StockFields.SYMBOL + " IN (" + placeHolders + ")", symbols, null);
        if (c == null)
            return null;

        List<Stock> result = getEntities(c);

        return result;
    }

    /**
     * Retrieves all record ids which refer the given symbol.
     * @return array of ids of records which contain the symbol.
     */
    public int[] findIdsBySymbol(String symbol) {
        int[] result;

        Cursor cursor = getContext().getContentResolver().query(this.getUri(), new String[] { StockFields.STOCKID },
                StockFields.SYMBOL + "=?", new String[] { symbol }, null);
        if (cursor == null)
            return null;

        int records = cursor.getCount();
        result = new int[records];

        for (int i = 0; i < records; i++) {
            cursor.moveToNext();
            result[i] = cursor.getInt(cursor.getColumnIndex(StockFields.STOCKID));
        }
        cursor.close();

        return result;
    }

    public boolean insert(Stock stock) {
        return insert(stock.contentValues) > 0;
    }

    public boolean save(Stock stock) {
        int id = stock.getId();

        WhereStatementGenerator generator = new WhereStatementGenerator();
        String where = generator.getStatement(StockFields.STOCKID, "=", id);

        return update(stock, where);
    }

    /**
     * Update price for all the records with this symbol.
     * @param symbol Stock symbol
     * @param price Stock price
     */
    public void updateCurrentPrice(String symbol, Money price) {
        int[] ids = findIdsBySymbol(symbol);

        // recalculate value

        for (int id : ids) {
            Stock stock = load(id);
            stock.setCurrentPrice(price);
            // recalculate & assign the value
            Money value = stock.getValue();

            save(stock);
        }
    }

    private List<Stock> getEntities(Cursor c) {
        List<Stock> result = new ArrayList<>();
        while (c.moveToNext()) {
            result.add(Stock.from(c));
        }
        c.close();

        return result;
    }
}