diff options
Diffstat (limited to 'sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/impl/BankServiceImpl.java')
-rw-r--r-- | sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/impl/BankServiceImpl.java | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/impl/BankServiceImpl.java b/sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/impl/BankServiceImpl.java new file mode 100644 index 0000000000..9b49f39ef1 --- /dev/null +++ b/sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/impl/BankServiceImpl.java @@ -0,0 +1,180 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 bank.impl; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Random; + +import org.oasisopen.sca.annotation.Scope; +import org.oasisopen.sca.annotation.Service; + +import bank.BankService; +import bank.Statement; +import bank.StockHolding; +import bank.StockQuote; + +/** + * An implementation of the Bank service. + */ +@Service(BankService.class) +@Scope("COMPOSITE") +public class BankServiceImpl implements BankService { + + protected int initialCredit = 1000; + protected int overdrawnCost = 1; + protected int statementCost = 1; + protected int stockQuoteCost = 1; + protected int stockTransactionCost = 1; + + private List<StockQuote> stocks = new ArrayList<StockQuote>(); + private List<Statement> accounts = new ArrayList<Statement>(); + + private Random generator = new Random(); + + private HashMap<String, StockQuote> stockMap = new HashMap<String, StockQuote>(); + private HashMap<String, Statement> accountMap = new HashMap<String, Statement>(); + + public BankServiceImpl(){ + + // TODO - Data to come from composite file + // initial stocks + stocks.add(new StockQuote("ABC", 100)); + stocks.add(new StockQuote("DEF", 123)); + stocks.add(new StockQuote("GHI", 543)); + + // initial users + accounts.add(new Statement("SL", null, 0, null)); + accounts.add(new Statement("AE", null, 0, null)); + accounts.add(new Statement("KG", null, 0, null)); + + // create map for easy access + + for (StockQuote stock : stocks){ + stockMap.put(stock.getStockCode(), stock); + } + } + + // public interface + + public String createAccount(String customerName) { + for (Statement statement : accounts){ + if (statement.getCustomerName().equals(customerName)){ + accountMap.put(statement.getAccountID(), statement); + statement.getTransactions().add("account created"); + statement.creditCashBalance(initialCredit, "starting balance"); + return statement.getAccountID(); + } + } + return "Customer Name Not Found"; + } + + public Statement getStatement(String accountID) { + Statement statement = accountMap.get(accountID); + + if(statement != null){ + statement.debitCashBalance(statementCost, "retrieved statement"); + if (statement.getCashBalance() < 0){ + statement.debitCashBalance(overdrawnCost, "account overdrawn"); + } + } + return statement; + } + + public void buyEquity(String accountID, String equityCode, int number) { + updateStockPrices(); + StockQuote stock = stockMap.get(equityCode); + + if (stock == null){ + return; + } + + long cost = stock.getStockQuote() * number; + Statement statement = accountMap.get(accountID); + + if(statement != null){ + if (statement.getCashBalance() > cost){ + StockHolding stockHolding = new StockHolding(equityCode, number, stock.getStockQuote()); + statement.creditStockHolding(stockHolding); + statement.debitCashBalance(stockTransactionCost, "stock transaction (buy) " + equityCode); + + } + } + } + + public void sellEquity(String accountID, String equityCode, int number) { + updateStockPrices(); + StockQuote stock = stockMap.get(equityCode); + + if (stock == null){ + return; + } + + Statement statement = accountMap.get(accountID); + + if(statement != null){ + StockHolding stockHolding = new StockHolding(equityCode, number, stock.getStockQuote()); + statement.debitStockHolding(stockHolding); + statement.debitCashBalance(stockTransactionCost, "stock transaction (sell) " + equityCode); + } + } + + public StockQuote getStockQuote(String accountID, String equityCode) { + updateStockPrices(); + Statement statement = accountMap.get(accountID); + StockQuote stockQuote = null; + + if(statement != null){ + statement.debitCashBalance(stockQuoteCost, "stock quote"); + if (statement.getCashBalance() < 0){ + statement.debitCashBalance(overdrawnCost, "account overdrawn"); + } + stockQuote = stockMap.get(equityCode); + } + + return stockQuote; + } + + public List<StockQuote> getAllStockQuotes(String accountID) { + updateStockPrices(); + Statement statement = accountMap.get(accountID); + List<StockQuote> stockQuote = null; + + if(statement != null){ + statement.debitCashBalance(stockQuoteCost * stocks.size(), "stock quote"); + if (statement.getCashBalance() < 0){ + statement.debitCashBalance(overdrawnCost, "account overdrawn"); + } + stockQuote = stocks; + } + + return stockQuote; + } + + // private functions + + private void updateStockPrices(){ + for (StockQuote stock : stocks){ + long stockQuote = stock.getStockQuote(); + stockQuote += (generator.nextInt(10) - 5); + stock.setStockQuote(stockQuote); + } + } +} |