/* * 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 org.apache.openjpa.trader.service; import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; import java.util.Random; import org.apache.openjpa.trader.domain.Ask; import org.apache.openjpa.trader.domain.Bid; import org.apache.openjpa.trader.domain.LogStatement; import org.apache.openjpa.trader.domain.Match; import org.apache.openjpa.trader.domain.Sector; import org.apache.openjpa.trader.domain.Stock; import org.apache.openjpa.trader.domain.Tradable; import org.apache.openjpa.trader.domain.Trade; import org.apache.openjpa.trader.domain.Trader; public class MockTradingService implements TradingService { List<Ask> _asks = new ArrayList<Ask>(); List<Bid> _bids = new ArrayList<Bid>(); List<Trade> _trades = new ArrayList<Trade>(); List<Stock> _stocks = new ArrayList<Stock>(); List<Trader> _traders = new ArrayList<Trader>(); List<LogStatement> _logs = new ArrayList<LogStatement>(); int counter = 0; private static Random rng = new Random(System.currentTimeMillis()); public MockTradingService() { Sector[] sectors = Sector.values(); for (int i = 0; i < 10; i++) { Stock stock = new Stock("Stock-"+i, "Company-"+i, sectors[rng.nextInt(sectors.length)], 10*rng.nextDouble()); _stocks.add(stock); } } @Override public Ask ask(Trader trader, Stock stock, int volume, double price) { Ask ask = new Ask(trader, stock, price, volume); _asks.add(ask); log("Added " + ask + " " + counter++); return ask; } @Override public Bid bid(Trader trader, Stock stock, int volume, double price) { Bid bid = new Bid(trader, stock, price, volume); _bids.add(bid); log("Added new " + bid + " " + counter++); return bid; } @Override public List<LogStatement> getLog() { int from = Math.max(_logs.size()-5, 0); List<LogStatement> result = new ArrayList<LogStatement>(); for (int i = from; i < _logs.size(); i++) result.add(_logs.get(i)); return result; } @Override public Stock getStock(String symbol) { for (Stock s : _stocks) { if (s.getSymbol().equals(symbol)) return s; } log("No Stock " + symbol); return null; } @Override public List<Stock> getStocks() { for (Stock s : _stocks) { double delta = 10*(2*rng.nextDouble()-1)/100; s.setMarketPrice(s.getMarketPrice() + s.getMarketPrice()*delta); } return _stocks; } @Override public List<Trade> getTrades(Timestamp from, Timestamp to) { return null; } @Override public List<Trade> getTrades(Trader trader, Boolean boughtOrsold, Timestamp from, Timestamp to) { return null; } @Override public Trader login(String trader) { for (Trader t : _traders) { if (t.getName().equals(trader)) return t; } Trader t = new Trader(trader); _traders.add(t); return t; } @Override public List<Match> matchAsk(Ask ask) { List<Match> result = new ArrayList<Match>(); for (Bid bid : _bids) { if (matches(ask, bid)) { result.add(new Match(ask, bid)); } } return result; } @Override public List<Match> matchBid(Bid bid) { List<Match> result = new ArrayList<Match>(); for (Ask ask : _asks) { if (matches(ask, bid)) { result.add(new Match(ask, bid)); } } return result; } public Tradable refresh(Tradable t) { return t; } @Override public Trade trade(Match match) { Trade trade = new Trade(match.getAsk(), match.getBid()); return trade; } private boolean matches(Ask ask, Bid bid) { return ((bid.getStock().getSymbol().equals(ask.getStock().getSymbol())) && (!bid.getBuyer().equals(ask.getSeller())) && (bid.getPrice() >= ask.getPrice()) && (bid.getVolume()) <= ask.getVolume()); } private void log(String s) { _logs.add(new LogStatement("INFO", "Context", "Thread", "Channel", s)); System.err.println("server log:" + s ); } @Override public Tradable withdraw(Tradable t) { // t.expire(); return t; } @Override public void close() { } public String getServiceURI() { return "Mock"; } }