private List<RequestOfferMatch> cloneMatchList(List<RequestOfferMatch> origList) { List<RequestOfferMatch> copy = new ArrayList<RequestOfferMatch>(); for (RequestOfferMatch match : origList) { copy.add(match.clone()); } return copy; }
private RequestOfferMatch checkForMatchingOffers(PriceRequest req) { RequestOfferMatch match = null; List<PriceOffer> matchingOffers = market.getOffersFromPrice(req.getPrice()); if (matchingOffers.isEmpty()) { return null; } else { int amountToFill = req.getAmount(); int totalMatchedAmount = 0; match = new RequestOfferMatch(); // The first match will be the best price match.setPrice(matchingOffers.get(0).getPrice()); match.setRequestList(new ArrayList<PriceRequest>()); match.setOfferList(new ArrayList<PriceOffer>()); ListIterator<PriceOffer> iter = matchingOffers.listIterator(); while (amountToFill > 0 && iter.hasNext()) { PriceOffer offer = iter.next(); if (offer.getAmount() >= amountToFill) { PriceOffer matchedOffer = offer.clone(); matchedOffer.setAmount(amountToFill); offer.setAmount(offer.getAmount() - amountToFill); if (offer.getAmount() == 0) { market.removeOffer(offer); } match.getOfferList().add(matchedOffer); if (match.getRequestList().isEmpty()) { match.getRequestList().add(req.clone()); } else { PriceRequest matchedRequest = match.getRequestList().get(0); matchedRequest.setAmount(matchedRequest.getAmount() + amountToFill); } market.removeRequest(req); totalMatchedAmount += amountToFill; amountToFill = 0; } else { PriceOffer matchedOffer = offer.clone(); match.getOfferList().add(matchedOffer); PriceRequest matchedRequest; if (match.getRequestList().isEmpty()) { matchedRequest = req.clone(); matchedRequest.setAmount(0); match.getRequestList().add(matchedRequest); } else { matchedRequest = match.getRequestList().get(0); } int matchedAmount = offer.getAmount(); matchedRequest.setAmount(matchedRequest.getAmount() + matchedAmount); amountToFill -= matchedAmount; totalMatchedAmount += matchedAmount; req.setAmount(amountToFill); iter.remove(); market.removeOffer(offer); } } match.setMatchedAmount(totalMatchedAmount); match.setMatchTime(new Date()); matchList.push(match); return match.clone(); } }