diff --git a/client/src/main/java/ru/trader/model/StationModel.java b/client/src/main/java/ru/trader/model/StationModel.java index e2b2d29..b98020d 100644 --- a/client/src/main/java/ru/trader/model/StationModel.java +++ b/client/src/main/java/ru/trader/model/StationModel.java @@ -131,14 +131,22 @@ public class StationModel { return market.getModeler().get(station.getPlace()); } - public List getSells() { + public List getAllSells() { return station.getAllSellOffers().stream().map(this::asModel).collect(Collectors.toList()); } - public List getBuys() { + public List getSells() { + return station.getSellOffers().map(this::asModel).collect(Collectors.toList()); + } + + public List getAllBuys() { return station.getAllBuyOffers().stream().map(this::asModel).collect(Collectors.toList()); } + public List getBuys() { + return station.getBuyOffers().map(this::asModel).collect(Collectors.toList()); + } + public OfferModel add(OFFER_TYPE type, ItemModel item, double price, long count){ OfferModel offer = asModel(station.addOffer(type, ModelFabric.get(item), price, count), item); LOG.info("Add offer {} to station {}", offer, station); diff --git a/client/src/main/java/ru/trader/model/support/StationUpdater.java b/client/src/main/java/ru/trader/model/support/StationUpdater.java index ca42a33..e828c44 100644 --- a/client/src/main/java/ru/trader/model/support/StationUpdater.java +++ b/client/src/main/java/ru/trader/model/support/StationUpdater.java @@ -72,8 +72,8 @@ public class StationUpdater { for (SERVICE_TYPE service : station.getServices()) { serviceProperty(service).set(true); } - station.getSells().forEach(this::fillOffer); - station.getBuys().forEach(this::fillOffer); + station.getAllSells().forEach(this::fillOffer); + station.getAllBuys().forEach(this::fillOffer); } else { name.setValue(""); type.setValue(null); diff --git a/core/src/main/java/ru/trader/analysis/MarketUtils.java b/core/src/main/java/ru/trader/analysis/MarketUtils.java index 2e07ef0..c4baacd 100644 --- a/core/src/main/java/ru/trader/analysis/MarketUtils.java +++ b/core/src/main/java/ru/trader/analysis/MarketUtils.java @@ -2,14 +2,10 @@ package ru.trader.analysis; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import ru.trader.core.Offer; -import ru.trader.core.Order; -import ru.trader.core.SERVICE_TYPE; -import ru.trader.core.Vendor; +import ru.trader.core.*; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; +import java.util.*; +import java.util.stream.Stream; public class MarketUtils { private final static Logger LOG = LoggerFactory.getLogger(MarketUtils.class); @@ -48,7 +44,8 @@ public class MarketUtils { LOG.trace("Get orders from {}, to {}", seller, buyer); List orders = new ArrayList<>(); if (seller.isTransit() || buyer.isTransit()) return orders; - for (Offer sell : seller.getAllSellOffers()) { + for (Iterator iterator = seller.getSellOffers().iterator(); iterator.hasNext(); ) { + Offer sell = iterator.next(); Offer buy = buyer.getBuy(sell.getItem()); if (buy != null) { Order order = new Order(sell, buy, 1); @@ -60,6 +57,26 @@ public class MarketUtils { return orders; } + public static boolean isIncorrect(Offer offer){ + return offer != null && isIncorrect(offer.getVendor(), offer.isIllegal(), offer.getType()); + } + + public static boolean isIncorrect(Vendor vendor, Item item, OFFER_TYPE type){ + return isIncorrect(vendor, item.isIllegal(vendor), type); + } + + public static boolean isIncorrect(Vendor vendor, boolean isIllegal, OFFER_TYPE type){ + if (type == OFFER_TYPE.SELL){ + return isIllegal || !vendor.has(SERVICE_TYPE.MARKET); + } else { + return isIllegal ? !vendor.has(SERVICE_TYPE.BLACK_MARKET) : !vendor.has(SERVICE_TYPE.MARKET); + } + } + + public static Stream getOffers(Collection offers){ + return offers.stream().filter(o -> !isIncorrect(o)); + } + public static boolean hasMarket(Vendor vendor) { return vendor.has(SERVICE_TYPE.MARKET) || vendor.has(SERVICE_TYPE.BLACK_MARKET); } diff --git a/core/src/main/java/ru/trader/analysis/RouteFiller.java b/core/src/main/java/ru/trader/analysis/RouteFiller.java index d7a5edc..c4725a3 100644 --- a/core/src/main/java/ru/trader/analysis/RouteFiller.java +++ b/core/src/main/java/ru/trader/analysis/RouteFiller.java @@ -49,7 +49,8 @@ public class RouteFiller { LOG.trace("Fill orders for {}", seller); final int nextIndex = i+1; Collection vendors = route.getVendors(nextIndex); - for (Offer sell : seller.getAllSellOffers()) { + for (Iterator iterator = seller.getSellOffers().iterator(); iterator.hasNext(); ) { + Offer sell = iterator.next(); for (Vendor buyer : vendors) { Offer buy = buyer.getBuy(sell.getItem()); if (buy != null) { diff --git a/core/src/main/java/ru/trader/core/MarketAnalyzer.java b/core/src/main/java/ru/trader/core/MarketAnalyzer.java index de6885c..963870e 100644 --- a/core/src/main/java/ru/trader/core/MarketAnalyzer.java +++ b/core/src/main/java/ru/trader/core/MarketAnalyzer.java @@ -111,7 +111,8 @@ public class MarketAnalyzer { callback.start(sellers.size()); for (Vendor vendor : sellers) { if (callback.isCancel()) break; - for (Offer sell : vendor.getAllSellOffers()) { + for (Iterator iterator = vendor.getSellOffers().iterator(); iterator.hasNext(); ) { + Offer sell = iterator.next(); if (callback.isCancel()) break; LOG.trace("Sell offer {}", sell); if (sell.getCount() == 0) continue; @@ -148,7 +149,8 @@ public class MarketAnalyzer { callback.start(sellers.size()); for (Vendor seller : sellers) { if (callback.isCancel()) break; - for (Offer sell : seller.getAllSellOffers()) { + for (Iterator iterator = seller.getSellOffers().iterator(); iterator.hasNext(); ) { + Offer sell = iterator.next(); if (callback.isCancel()) break; if (sell.getCount() == 0) continue; long count = Order.getMaxCount(sell, profile.getBalance(), profile.getShip().getCargo()); @@ -157,7 +159,7 @@ public class MarketAnalyzer { for (Vendor buyer : buyers) { if (callback.isCancel()) break; Offer buy = buyer.getBuy(sell.getItem()); - if (buy != null){ + if (buy != null) { Order order = new Order(sell, buy, count); LOG.trace("Buy offer {} profit = {}", buy, order.getProfit()); if (order.getProfit() < lowProfit) { diff --git a/core/src/main/java/ru/trader/core/Vendor.java b/core/src/main/java/ru/trader/core/Vendor.java index b6d9642..09fc207 100644 --- a/core/src/main/java/ru/trader/core/Vendor.java +++ b/core/src/main/java/ru/trader/core/Vendor.java @@ -1,10 +1,12 @@ package ru.trader.core; +import ru.trader.analysis.MarketUtils; import ru.trader.analysis.graph.Connectable; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Collection; +import java.util.stream.Stream; public interface Vendor extends Connectable { @@ -55,24 +57,34 @@ public interface Vendor extends Connectable { return get(OFFER_TYPE.SELL); } + default Stream getSellOffers(){ + return MarketUtils.getOffers(getAllSellOffers()); + } + default Collection getAllBuyOffers(){ return get(OFFER_TYPE.BUY); } + default Stream getBuyOffers(){ + return MarketUtils.getOffers(getAllBuyOffers()); + } + default Offer getSell(Item item){ - return get(OFFER_TYPE.SELL, item); + Offer offer = get(OFFER_TYPE.SELL, item); + return MarketUtils.isIncorrect(offer) ? null : offer; } default Offer getBuy(Item item){ - return get(OFFER_TYPE.BUY, item); + Offer offer = get(OFFER_TYPE.BUY, item); + return MarketUtils.isIncorrect(offer) ? null : offer; } default boolean hasSell(Item item){ - return has(OFFER_TYPE.SELL, item); + return has(OFFER_TYPE.SELL, item) && !MarketUtils.isIncorrect(this, item, OFFER_TYPE.SELL); } default boolean hasBuy(Item item){ - return has(OFFER_TYPE.BUY, item); + return has(OFFER_TYPE.BUY, item) && !MarketUtils.isIncorrect(this, item, OFFER_TYPE.BUY); } diff --git a/core/src/test/java/ru/trader/analysis/RouteFillerTest.java b/core/src/test/java/ru/trader/analysis/RouteFillerTest.java index a99b733..a9277f6 100644 --- a/core/src/test/java/ru/trader/analysis/RouteFillerTest.java +++ b/core/src/test/java/ru/trader/analysis/RouteFillerTest.java @@ -46,6 +46,8 @@ public class RouteFillerTest extends Assert { ITEM3 = market.addItem("ITEM3", null); v1 = market.addPlace("p1",0,0,0).addVendor("v1"); v2 = market.addPlace("p2",0,0,0).addVendor("v2"); + v1.add(SERVICE_TYPE.MARKET); + v2.add(SERVICE_TYPE.MARKET); v1.addOffer(OFFER_TYPE.SELL, ITEM1, 100, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM2, 200, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, -1); @@ -88,6 +90,9 @@ public class RouteFillerTest extends Assert { v1 = market.addPlace("p1",0,0,0).addVendor("v1"); v2 = market.addPlace("p2",0,0,0).addVendor("v2"); v3 = market.addPlace("p3",0,0,0).addVendor("v3"); + v1.add(SERVICE_TYPE.MARKET); + v2.add(SERVICE_TYPE.MARKET); + v3.add(SERVICE_TYPE.MARKET); v1.addOffer(OFFER_TYPE.SELL, ITEM1, 100, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, -1); v2.addOffer(OFFER_TYPE.SELL, ITEM2, 200, -1); @@ -134,6 +139,10 @@ public class RouteFillerTest extends Assert { v2 = market.addPlace("p2",0,0,0).addVendor("v2"); v3 = market.addPlace("p3",0,0,0).addVendor("v3"); v4 = market.addPlace("p4",0,0,0).addVendor("v4"); + v1.add(SERVICE_TYPE.MARKET); + v2.add(SERVICE_TYPE.MARKET); + v3.add(SERVICE_TYPE.MARKET); + v4.add(SERVICE_TYPE.MARKET); v1.addOffer(OFFER_TYPE.SELL, ITEM1, 100, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM2, 200, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, -1); @@ -216,6 +225,11 @@ public class RouteFillerTest extends Assert { v3 = market.addPlace("p3",0,0,0).addVendor("v3"); v4 = market.addPlace("p4",0,0,0).addVendor("v4"); v5 = market.addPlace("p5",0,0,0).addVendor("v5"); + v1.add(SERVICE_TYPE.MARKET); + v2.add(SERVICE_TYPE.MARKET); + v3.add(SERVICE_TYPE.MARKET); + v4.add(SERVICE_TYPE.MARKET); + v5.add(SERVICE_TYPE.MARKET); v1.addOffer(OFFER_TYPE.SELL, ITEM1, 410, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM2, 200, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, -1); @@ -277,6 +291,10 @@ public class RouteFillerTest extends Assert { v2 = market.addPlace("p2",0,0,0).addVendor("v2"); v3 = market.addPlace("p3",0,0,0).addVendor("v3"); v4 = market.addPlace("p4",0,0,0).addVendor("v4"); + v1.add(SERVICE_TYPE.MARKET); + v2.add(SERVICE_TYPE.MARKET); + v3.add(SERVICE_TYPE.MARKET); + v4.add(SERVICE_TYPE.MARKET); v1.addOffer(OFFER_TYPE.SELL, ITEM1, 100, 5); v1.addOffer(OFFER_TYPE.SELL, ITEM2, 200, 5); v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, 5); @@ -363,6 +381,8 @@ public class RouteFillerTest extends Assert { ITEM4 = market.addItem("ITEM4", null); v1 = market.addPlace("p1",0,0,0).addVendor("v1"); v2 = market.addPlace("p2",0,1,0).addVendor("v2"); + v1.add(SERVICE_TYPE.MARKET); + v2.add(SERVICE_TYPE.MARKET); v1.addOffer(OFFER_TYPE.SELL, ITEM1, 100, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM2, 200, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, -1); @@ -382,6 +402,8 @@ public class RouteFillerTest extends Assert { LOG.info("Init test 6B"); v3 = market.addPlace("p3",0,1,1).addVendor("v3"); v4 = market.addPlace("p4",1,1,1).addVendor("v4"); + v3.add(SERVICE_TYPE.MARKET); + v4.add(SERVICE_TYPE.MARKET); v3.addOffer(OFFER_TYPE.SELL, ITEM3, 390, -1); @@ -523,6 +545,10 @@ public class RouteFillerTest extends Assert { v2 = market.addPlace("p2",0,0,0).addVendor("v2"); v3 = market.addPlace("p3",0,0,0).addVendor("v3"); v4 = market.addPlace("p4",0,0,0).addVendor("v4"); + v1.add(SERVICE_TYPE.MARKET); + v2.add(SERVICE_TYPE.MARKET); + v3.add(SERVICE_TYPE.MARKET); + v4.add(SERVICE_TYPE.MARKET); v1.addOffer(OFFER_TYPE.SELL, ITEM1, 100, 5); v1.addOffer(OFFER_TYPE.SELL, ITEM2, 200, 5); v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, 5); @@ -591,6 +617,10 @@ public class RouteFillerTest extends Assert { v2 = market.addPlace("p2",0,0,0).addVendor("v2"); v3 = market.addPlace("p3",0,0,0).addVendor("v3"); v4 = market.addPlace("p4",0,0,0).addVendor("v4"); + v1.add(SERVICE_TYPE.MARKET); + v2.add(SERVICE_TYPE.MARKET); + v3.add(SERVICE_TYPE.MARKET); + v4.add(SERVICE_TYPE.MARKET); v1.addOffer(OFFER_TYPE.SELL, ITEM1, 100, 5); v1.addOffer(OFFER_TYPE.SELL, ITEM2, 200, 5); v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, 5); diff --git a/core/src/test/java/ru/trader/core/VendorTest.java b/core/src/test/java/ru/trader/core/VendorTest.java index 9c54d5f..0d98ec5 100644 --- a/core/src/test/java/ru/trader/core/VendorTest.java +++ b/core/src/test/java/ru/trader/core/VendorTest.java @@ -25,8 +25,10 @@ public class VendorTest extends Assert { public void fillVendor(){ sellVendor = new SimpleVendor(); sellVendor.add(SELL_OFFER); + sellVendor.add(SERVICE_TYPE.MARKET); buyVendor = new SimpleVendor(); buyVendor.add(BUY_OFFER); + buyVendor.add(SERVICE_TYPE.MARKET); } @Test diff --git a/core/src/test/java/ru/trader/core/VendorTest2.java b/core/src/test/java/ru/trader/core/VendorTest2.java index 2fcf409..baedcfa 100644 --- a/core/src/test/java/ru/trader/core/VendorTest2.java +++ b/core/src/test/java/ru/trader/core/VendorTest2.java @@ -39,12 +39,14 @@ public class VendorTest2 extends Assert { sellVendor.add(SELL_OFFER2); sellVendor.add(SELL_OFFER3); sellVendor.add(DUBLE_SELL_OFFER1); + sellVendor.add(SERVICE_TYPE.MARKET); buyVendor = new SimpleVendor(); buyVendor.add(BUY_OFFER1); buyVendor.add(BUY_OFFER2); buyVendor.add(BUY_OFFER3); buyVendor.add(DUBLE_BUY_OFFER1); + buyVendor.add(SERVICE_TYPE.MARKET); } @Test