From efc0be2bc0b83ffb8fee4195cd04e41667d2523e Mon Sep 17 00:00:00 2001 From: slaws Date: Wed, 14 Apr 2010 13:53:18 +0000 Subject: simple sample to use as an example when working with students git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@933952 13f79535-47bb-0310-9956-ffa450edef68 --- .../slaws/bank-challenge/bank-contribution/pom.xml | 124 ++++++++++++++ .../src/main/java/bank/BankService.java | 40 +++++ .../src/main/java/bank/Statement.java | 143 ++++++++++++++++ .../src/main/java/bank/StockHolding.java | 58 +++++++ .../src/main/java/bank/StockQuote.java | 52 ++++++ .../src/main/java/bank/impl/BankServiceImpl.java | 180 +++++++++++++++++++++ .../src/main/resources/Bank.composite | 31 ++++ .../main/resources/META-INF/sca-contribution.xml | 23 +++ .../src/test/java/test/BankTestCase.java | 62 +++++++ sandbox/slaws/bank-challenge/pom.xml | 52 ++++++ 10 files changed, 765 insertions(+) create mode 100644 sandbox/slaws/bank-challenge/bank-contribution/pom.xml create mode 100644 sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/BankService.java create mode 100644 sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/Statement.java create mode 100644 sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/StockHolding.java create mode 100644 sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/StockQuote.java create mode 100644 sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/impl/BankServiceImpl.java create mode 100644 sandbox/slaws/bank-challenge/bank-contribution/src/main/resources/Bank.composite create mode 100644 sandbox/slaws/bank-challenge/bank-contribution/src/main/resources/META-INF/sca-contribution.xml create mode 100644 sandbox/slaws/bank-challenge/bank-contribution/src/test/java/test/BankTestCase.java create mode 100644 sandbox/slaws/bank-challenge/pom.xml (limited to 'sandbox/slaws') diff --git a/sandbox/slaws/bank-challenge/bank-contribution/pom.xml b/sandbox/slaws/bank-challenge/bank-contribution/pom.xml new file mode 100644 index 0000000000..a4bdc9a4f1 --- /dev/null +++ b/sandbox/slaws/bank-challenge/bank-contribution/pom.xml @@ -0,0 +1,124 @@ + + + + 4.0.0 + + org.apache.tuscany.sca + tuscany-sca + 2.0-SNAPSHOT + ../../pom.xml + + sandbox-bank-challenge + Apache Tuscany SCA Sandbox Bank Challenge + war + + + + + org.apache.tuscany.sca + tuscany-sca-api + 2.0-SNAPSHOT + + + + org.apache.tuscany.sca + tuscany-node-api + 2.0-SNAPSHOT + + + + org.apache.tuscany.sca + tuscany-node-impl + 2.0-SNAPSHOT + runtime + + + + org.apache.tuscany.sca + tuscany-implementation-java-runtime + 2.0-SNAPSHOT + runtime + + + + org.apache.tuscany.sca + tuscany-binding-ws-runtime-axis2 + 2.0-SNAPSHOT + runtime + + + + org.apache.axis2 + axis2-webapp + 1.5.1 + war + + + + junit + junit + 4.8.1 + test + + + + + + ${artifactId} + + + org.codehaus.mojo + build-helper-maven-plugin + 1.4 + + + add-source + generate-sources + + add-resource + + + + + src/wsimportout + + + src/wsgenout + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.2 + + + + calculator.CalculatorClient + + + + + + + diff --git a/sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/BankService.java b/sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/BankService.java new file mode 100644 index 0000000000..bc13dfd21d --- /dev/null +++ b/sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/BankService.java @@ -0,0 +1,40 @@ +/* + * 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; + +import java.util.List; + +import org.oasisopen.sca.annotation.Remotable; + +/** + * The Bank service interface. + */ +@Remotable +public interface BankService { + + String createAccount(String customerName); + + Statement getStatement(String accountID); + + void buyEquity(String accountID, String equityCode, int number); + void sellEquity(String accountID, String equityCode, int number); + + StockQuote getStockQuote(String accountID, String equityCode); + List getAllStockQuotes(String accountID); +} diff --git a/sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/Statement.java b/sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/Statement.java new file mode 100644 index 0000000000..97439736e1 --- /dev/null +++ b/sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/Statement.java @@ -0,0 +1,143 @@ +/* + * 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; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + + +/** + * A stock quote + */ +public class Statement implements Serializable { + + private String customerName; + private String accountID; + private long cashBalance; + private List stockHoldings; + private List transactions = new ArrayList(); + + public Statement(){ + if (this.stockHoldings == null){ + this.stockHoldings = new ArrayList(); + } + } + + public Statement(String customerName, String accountID, long cashBalance, List stockHoldings){ + this.customerName = customerName; + this.accountID = accountID; + this.cashBalance = cashBalance; + this.stockHoldings = stockHoldings; + + if (this.accountID == null){ + this.accountID = UUID.randomUUID().toString(); + } + + if (this.stockHoldings == null){ + this.stockHoldings = new ArrayList(); + } + } + + public String getCustomerName() { + return customerName; + } + + public String getAccountID() { + return accountID; + } + + public long getCashBalance() { + return cashBalance; + } + + public void creditCashBalance(long credit, String reason) { + this.cashBalance += credit; + transactions.add("credit " + credit + " : " + reason); + } + + public void debitCashBalance(long debit, String reason) { + this.cashBalance -= debit; + transactions.add("debit " + debit + " : " + reason); + } + + public List getStockHolding() { + return stockHoldings; + } + + public void creditStockHolding(StockHolding stock){ + stockHoldings.add(stock); + debitCashBalance(stock.getPrice() * stock.getNumberHeld(), + "bought " + stock.getNumberHeld() + " of " + stock.getStockCode() + " at " + stock.getPrice()); + } + + public void debitStockHolding(StockHolding stock){ + int numberToSell = stock.getNumberHeld(); + int numberSold = 0; + List toRemove = new ArrayList(); + + for (StockHolding stockHolding : stockHoldings){ + if (stockHolding.getStockCode().equals(stock.getStockCode())){ + if (stockHolding.getNumberHeld() > numberToSell){ + stockHolding.setNumberHeld(stockHolding.getNumberHeld() - numberToSell); + numberSold += numberToSell; + numberToSell = 0; + break; + } else { + numberSold += stockHolding.getNumberHeld(); + numberToSell -= stockHolding.getNumberHeld(); + stockHolding.setNumberHeld(0); + toRemove.add(stockHolding); + } + } + } + + stockHoldings.removeAll(toRemove); + + creditCashBalance(stock.getPrice() * numberSold, + "sold " + numberSold + " of " + stock.getStockCode() + " at " + stock.getPrice()); + } + + public List getTransactions() { + return transactions; + } + + @Override + public String toString() { + String returnString = + "customer name = " + customerName + + "\naccount Id = " + accountID + + "\nbalance = " + cashBalance + + "\nequities = \n"; + + for (StockHolding stock : stockHoldings){ + returnString += " stock " + stock.getStockCode() + " number held = " + stock.getNumberHeld() + "\n"; + } + + returnString += + "transactions = \n"; + + for(String transaction : transactions){ + returnString += " " + transaction + "\n"; + } + + return returnString; + } +} diff --git a/sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/StockHolding.java b/sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/StockHolding.java new file mode 100644 index 0000000000..8bd0afd2be --- /dev/null +++ b/sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/StockHolding.java @@ -0,0 +1,58 @@ +/* + * 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; + +import java.io.Serializable; + +/** + * A stock quote + */ +public class StockHolding implements Serializable { + + private String stockCode; + private int numberHeld; + private long price; + + public StockHolding(String stockCode, int numberHeld, long price){ + this.stockCode = stockCode; + this.numberHeld = numberHeld; + this.price = price; + } + + public String getStockCode() { + return stockCode; + } + + public int getNumberHeld() { + return numberHeld; + } + + public void setNumberHeld(int numberHeld) { + this.numberHeld = numberHeld; + } + + public long getPrice() { + return price; + } + + @Override + public String toString() { + return stockCode + " - number=" + numberHeld + " - price=" + price; + } +} diff --git a/sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/StockQuote.java b/sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/StockQuote.java new file mode 100644 index 0000000000..3bec8019b7 --- /dev/null +++ b/sandbox/slaws/bank-challenge/bank-contribution/src/main/java/bank/StockQuote.java @@ -0,0 +1,52 @@ +/* + * 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; + +import java.io.Serializable; + +/** + * A stock quote + */ +public class StockQuote implements Serializable { + + private String stockCode; + private long stockQuote; + + public StockQuote(String stockCode, long stockQuote){ + this.stockCode = stockCode; + this.stockQuote = stockQuote; + } + + public String getStockCode() { + return stockCode; + } + + public long getStockQuote() { + return stockQuote; + } + + public void setStockQuote(long stockQuote) { + this.stockQuote = stockQuote; + } + + @Override + public String toString() { + return stockCode + " - " + stockQuote; + } +} 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 stocks = new ArrayList(); + private List accounts = new ArrayList(); + + private Random generator = new Random(); + + private HashMap stockMap = new HashMap(); + private HashMap accountMap = new HashMap(); + + 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 getAllStockQuotes(String accountID) { + updateStockPrices(); + Statement statement = accountMap.get(accountID); + List 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); + } + } +} diff --git a/sandbox/slaws/bank-challenge/bank-contribution/src/main/resources/Bank.composite b/sandbox/slaws/bank-challenge/bank-contribution/src/main/resources/Bank.composite new file mode 100644 index 0000000000..60919c0bfe --- /dev/null +++ b/sandbox/slaws/bank-challenge/bank-contribution/src/main/resources/Bank.composite @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/sandbox/slaws/bank-challenge/bank-contribution/src/main/resources/META-INF/sca-contribution.xml b/sandbox/slaws/bank-challenge/bank-contribution/src/main/resources/META-INF/sca-contribution.xml new file mode 100644 index 0000000000..1bc342a9af --- /dev/null +++ b/sandbox/slaws/bank-challenge/bank-contribution/src/main/resources/META-INF/sca-contribution.xml @@ -0,0 +1,23 @@ + + + + + \ No newline at end of file diff --git a/sandbox/slaws/bank-challenge/bank-contribution/src/test/java/test/BankTestCase.java b/sandbox/slaws/bank-challenge/bank-contribution/src/test/java/test/BankTestCase.java new file mode 100644 index 0000000000..cbfa6f815f --- /dev/null +++ b/sandbox/slaws/bank-challenge/bank-contribution/src/test/java/test/BankTestCase.java @@ -0,0 +1,62 @@ +/* + * 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 test; + +import static org.junit.Assert.assertEquals; + +import org.apache.tuscany.sca.node.Node; +import org.apache.tuscany.sca.node.NodeFactory; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import bank.BankService; + +/** + * Test the Bank service component. + */ +public class BankTestCase{ + private static Node node; + private static BankService bankService; + + + @BeforeClass + public static void setUpBeforeClass() throws Exception { + node = NodeFactory.newInstance().createNode((String)null, new String[] {"target/classes"}).start(); + bankService = node.getService(BankService.class, "BankServiceComponent"); + } + + @AfterClass + public static void tearDownAfterClass() throws Exception { + node.stop(); + } + + @Test + public void testCalculator() throws Exception { + + String accountID = bankService.createAccount("SL"); + System.out.println("AccountID " + accountID + "\n"); + System.out.println("Statement\n" + bankService.getStatement(accountID)); + System.out.println("All stock quotes\n" + bankService.getAllStockQuotes(accountID) + "\n"); + bankService.buyEquity(accountID, "ABC", 10); + System.out.println("Statement\n" + bankService.getStatement(accountID)); + bankService.sellEquity(accountID, "ABC", 5); + System.out.println("Statement\n" + bankService.getStatement(accountID)); + } +} diff --git a/sandbox/slaws/bank-challenge/pom.xml b/sandbox/slaws/bank-challenge/pom.xml new file mode 100644 index 0000000000..ffe45c0d26 --- /dev/null +++ b/sandbox/slaws/bank-challenge/pom.xml @@ -0,0 +1,52 @@ + + + + 4.0.0 + + org.apache.tuscany.sca + tuscany-sca + 2.0-SNAPSHOT + ../pom.xml + + tuscany-bank-challenge + pom + Apache Tuscany SCA Bank Challenge + + + + apache.incubator + http://people.apache.org/repo/m2-incubating-repository + + + + + + default + + true + + + bank-contribution + client-sl-contribution + launcher + + + + -- cgit v1.2.3