/* OrpheusMS: MapleStory Private Server based on OdinMS Copyright (C) 2012 Aaron Weiss <aaron@deviant-core.net> Patrick Huy <patrick.huy@frz.cc> Matthias Butz <matze@odinms.de> Jan Christian Meyer <vimes@odinms.de> This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package client; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import server.MapleStocks; import tools.DatabaseConnection; import tools.MapleLogger; import tools.Output; import tools.Pair; /** * @author Aaron Weiss */ public class MapleStockPortfolio { private int cid = 0; private ArrayList<Pair<String, Integer>> portfolio; private ArrayList<Pair<String, Integer>> newlyAdded; public MapleStockPortfolio() { this(0, new ArrayList<Pair<String, Integer>>()); } public MapleStockPortfolio(int cid) { this(cid, new ArrayList<Pair<String, Integer>>()); } public MapleStockPortfolio(ArrayList<Pair<String, Integer>> portfolio) { this(0, portfolio); } public MapleStockPortfolio(int cid, ArrayList<Pair<String, Integer>> portfolio) { this.cid = cid; this.portfolio = portfolio; this.newlyAdded = new ArrayList<Pair<String, Integer>>(); } public boolean add(Pair<String, Integer> shares) { Output.print("add() called"); if (!this.hasStock(MapleStocks.getInstance().getStock(shares.getLeft()))) { portfolio.add(shares); newlyAdded.add(shares); return true; } return false; } public boolean update(Pair<String, Integer> shares) { Output.print("update() called"); for (Pair<String, Integer> pair : portfolio) { if (pair.getLeft() == shares.getLeft()) { pair.update(pair.getLeft(), pair.getRight() + shares.getRight()); return true; } } return false; } public boolean remove(MapleStock ms) { return this.remove(ms, 1); } public boolean remove(MapleStock ms, int quantity) { for (Pair<String, Integer> pair : portfolio) { if (pair.getLeft() == ms.getTicker()) { if (pair.getRight() > quantity) { return this.update(new Pair<String, Integer>(pair.getLeft(), -quantity)); } else if (pair.getRight() == quantity) { portfolio.remove(pair); return true; } } } return false; } public boolean hasStock(MapleStock ms) { return (this.hasStock(ms, 1)); } public boolean hasStock(MapleStock ms, int quantity) { int amount = 0; for (Pair<String, Integer> pair : portfolio) { if (pair.getLeft().equalsIgnoreCase(ms.getTicker())) { amount += pair.getRight(); } if (amount >= quantity) { Output.print("hasStock(" + ms.getTicker() + ", " + quantity + ") called; returning " + (amount >= quantity)); return true; } } Output.print("hasStock(" + ms.getTicker() + ", " + quantity + ") called; returning " + (amount >= quantity)); return (amount >= quantity); } public boolean isEmpty() { return portfolio.isEmpty(); } public void save() { for (Pair<String, Integer> pair : portfolio) { try { Connection con = (Connection) DatabaseConnection.getConnection(); PreparedStatement ps; if (newlyAdded.contains(pair)) { ps = con.prepareStatement("INSERT INTO maplestocks_data (`cid`, `stockid`, `shares`) VALUES (?, ?, ?)"); ps.setInt(1, cid); ps.setInt(2, MapleStocks.getInstance().idOf(pair.getLeft())); ps.setInt(3, pair.getRight()); Output.print(ps.toString()); ps.executeUpdate(); } else { ps = con.prepareStatement("UPDATE maplestocks_data SET shares = ? WHERE cid = ? AND stockid = ?"); ps.setInt(1, pair.getRight()); ps.setInt(2, cid); ps.setInt(3, MapleStocks.getInstance().idOf(pair.getLeft())); Output.print(ps.toString()); ps.executeUpdate(); } } catch (SQLException e) { Output.print("Something went wrong while saving a MapleStockPortfolio."); MapleLogger.print(MapleLogger.EXCEPTION_CAUGHT, e); } } } public static MapleStockPortfolio load(int cid) { MapleStockPortfolio ret = new MapleStockPortfolio(cid); try { Connection con = (Connection) DatabaseConnection.getConnection(); PreparedStatement ps = con.prepareStatement("SELECT * FROM maplestocks_data WHERE cid = ?"); ps.setInt(1, cid); ResultSet rs = ps.executeQuery(); while (rs.next()) { ret.add(new Pair<String ,Integer>(MapleStocks.getInstance().tickerOf(rs.getInt("stockid")), rs.getInt("shares"))); } } catch (SQLException e) { Output.print("Failed to load MapleStockPortfolio " + cid + "."); MapleLogger.print(MapleLogger.EXCEPTION_CAUGHT, e); } return ret; } @SuppressWarnings("unchecked") public Pair<String, Integer>[] toArray() { return (Pair<String, Integer>[]) (portfolio.toArray()); } public ArrayList<Pair<String, Integer>> toArrayList() { return portfolio; } }