From 1e1e41595d5ba1fdfbe2de3fd05a41a27fe6684b Mon Sep 17 00:00:00 2001 From: iMoHax Date: Tue, 30 Sep 2014 15:29:04 +0400 Subject: [PATCH] - extract abstract classes - move simple implementation to ru.trader.store.simple package --- client/src/main/java/ru/trader/World.java | 4 +- .../java/ru/trader/model/ModelFabrica.java | 7 +- core/src/main/java/ru/trader/core/Group.java | 24 +-- core/src/main/java/ru/trader/core/Item.java | 33 +-- .../main/java/ru/trader/core/ItemStat.java | 194 +++++++----------- core/src/main/java/ru/trader/core/Offer.java | 98 +++------ core/src/main/java/ru/trader/core/Vendor.java | 64 ++---- .../store/{ => simple}/MarketDocHandler.java | 9 +- .../{ => simple}/MarketStreamWriter.java | 2 +- .../ru/trader/store/simple/SimpleGroup.java | 24 +++ .../ru/trader/store/simple/SimpleItem.java | 33 +++ .../trader/store/simple/SimpleItemStat.java | 138 +++++++++++++ .../{core => store/simple}/SimpleMarket.java | 26 ++- .../ru/trader/store/simple/SimpleOffer.java | 55 +++++ .../{core => store/simple}/SimpleVendor.java | 54 ++++- .../ru/trader/store/{ => simple}/Store.java | 2 +- .../java/ru/trader/core/ItemStatTest.java | 49 ----- .../ru/trader/core/MarketAnalyzerTest.java | 36 ++-- .../ru/trader/core/MarketAnalyzerTest2.java | 2 +- .../test/java/ru/trader/core/MarketTest1.java | 44 ++-- .../test/java/ru/trader/core/VendorTest.java | 11 +- .../test/java/ru/trader/core/VendorTest2.java | 25 ++- .../java/ru/trader/graph/PathRouteTest.java | 105 +++++----- .../java/ru/trader/graph/RouteGraphTest.java | 28 +-- .../ru/trader/graph/RouteSearcherTest.java | 2 +- .../test/java/ru/trader/store/LoadTest.java | 1 + .../ru/trader/store/simple/ItemStatTest.java | 51 +++++ .../java/ru/trader/store/XSSFImporter.java | 8 +- 28 files changed, 658 insertions(+), 471 deletions(-) rename core/src/main/java/ru/trader/store/{ => simple}/MarketDocHandler.java (96%) rename core/src/main/java/ru/trader/store/{ => simple}/MarketStreamWriter.java (99%) create mode 100644 core/src/main/java/ru/trader/store/simple/SimpleGroup.java create mode 100644 core/src/main/java/ru/trader/store/simple/SimpleItem.java create mode 100644 core/src/main/java/ru/trader/store/simple/SimpleItemStat.java rename core/src/main/java/ru/trader/{core => store/simple}/SimpleMarket.java (82%) create mode 100644 core/src/main/java/ru/trader/store/simple/SimpleOffer.java rename core/src/main/java/ru/trader/{core => store/simple}/SimpleVendor.java (73%) rename core/src/main/java/ru/trader/store/{ => simple}/Store.java (98%) delete mode 100644 core/src/test/java/ru/trader/core/ItemStatTest.java create mode 100644 core/src/test/java/ru/trader/store/simple/ItemStatTest.java diff --git a/client/src/main/java/ru/trader/World.java b/client/src/main/java/ru/trader/World.java index abf0031..805e2ce 100644 --- a/client/src/main/java/ru/trader/World.java +++ b/client/src/main/java/ru/trader/World.java @@ -3,9 +3,9 @@ package ru.trader; import org.xml.sax.SAXException; import ru.trader.core.Market; import ru.trader.core.MarketAnalyzer; -import ru.trader.core.SimpleMarket; +import ru.trader.store.simple.SimpleMarket; import ru.trader.model.ModelFabrica; -import ru.trader.store.Store; +import ru.trader.store.simple.Store; import ru.trader.store.XSSFImporter; import javax.xml.parsers.ParserConfigurationException; diff --git a/client/src/main/java/ru/trader/model/ModelFabrica.java b/client/src/main/java/ru/trader/model/ModelFabrica.java index 088e0e2..c8b3946 100644 --- a/client/src/main/java/ru/trader/model/ModelFabrica.java +++ b/client/src/main/java/ru/trader/model/ModelFabrica.java @@ -1,6 +1,9 @@ package ru.trader.model; import ru.trader.core.*; +import ru.trader.store.simple.SimpleItem; +import ru.trader.store.simple.SimpleOffer; +import ru.trader.store.simple.SimpleVendor; import java.lang.ref.WeakReference; import java.util.HashMap; @@ -14,7 +17,7 @@ public class ModelFabrica { private static final HashMap> stats = new HashMap<>(); public static ItemModel buildItemModel(String name, MarketModel market){ - return getModel(new Item(name), market); + return getModel(new SimpleItem(name), market); } public static VendorModel buildModel(String name, MarketModel market){ @@ -22,7 +25,7 @@ public class ModelFabrica { } public static OfferModel buildModel(OFFER_TYPE type, ItemModel item, double price, MarketModel market) { - return getModel(new Offer(type, item.getItem(), price), market); + return getModel(new SimpleOffer(type, item.getItem(), price), market); } public static ItemDescModel buildModel(ItemModel item, ItemStat sell, ItemStat buy, MarketModel market) { diff --git a/core/src/main/java/ru/trader/core/Group.java b/core/src/main/java/ru/trader/core/Group.java index 1298cd9..9d79d5b 100644 --- a/core/src/main/java/ru/trader/core/Group.java +++ b/core/src/main/java/ru/trader/core/Group.java @@ -1,31 +1,19 @@ package ru.trader.core; -public class Group { - private final String name; - private final GROUP_TYPE type; - - public Group(String name, GROUP_TYPE type) { - this.name = name; - this.type = type; - } - - public String getName() { - return name; - } +public abstract class Group { + public abstract String getName(); + public abstract GROUP_TYPE getType(); public boolean isMarket(){ - return GROUP_TYPE.MARKET.equals(type); + return GROUP_TYPE.MARKET.equals(getType()); } public boolean isShip(){ - return GROUP_TYPE.SHIP.equals(type); + return GROUP_TYPE.SHIP.equals(getType()); } public boolean isOutfit(){ - return GROUP_TYPE.OUTFIT.equals(type); + return GROUP_TYPE.OUTFIT.equals(getType()); } - public GROUP_TYPE getType() { - return type; - } } diff --git a/core/src/main/java/ru/trader/core/Item.java b/core/src/main/java/ru/trader/core/Item.java index bc2cbc7..ca8d979 100644 --- a/core/src/main/java/ru/trader/core/Item.java +++ b/core/src/main/java/ru/trader/core/Item.java @@ -4,39 +4,26 @@ import org.jetbrains.annotations.NotNull; import java.util.Objects; -public class Item implements Comparable{ - private String name; - private Group group; +public abstract class Item implements Comparable { - public Item(String name) { - setName(name); - } + public abstract String getName(); + protected abstract void setName(String name); - public void setName(String name) { - this.name = name; - } - - public String getName() { - return name; - } + public abstract Group getGroup(); + public abstract void setGroup(Group group); @Override - public String toString() { + public String toString(){ return getName(); } @Override - public int compareTo(@NotNull Item other) { + public int compareTo(@NotNull Item other){ Objects.requireNonNull(other, "Not compare with null"); if (this == other) return 0; - return name != null ? other.name != null ? name.compareTo(other.name) : -1 : 0; + String name = getName(); + String otherName = other.getName(); + return name != null ? otherName != null ? name.compareTo(otherName) : -1 : 0; } - public Group getGroup() { - return group; - } - - public void setGroup(Group group) { - this.group = group; - } } diff --git a/core/src/main/java/ru/trader/core/ItemStat.java b/core/src/main/java/ru/trader/core/ItemStat.java index 12f5031..2f8c980 100644 --- a/core/src/main/java/ru/trader/core/ItemStat.java +++ b/core/src/main/java/ru/trader/core/ItemStat.java @@ -1,116 +1,53 @@ package ru.trader.core; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.util.ArrayList; +import java.util.Collection; +import java.util.NavigableSet; -import java.util.*; -import java.util.concurrent.ConcurrentSkipListSet; +public abstract class ItemStat { -public class ItemStat { - private final static Logger LOG = LoggerFactory.getLogger(ItemStat.class); + protected abstract void update(Offer offer, double price); - private final Item item; - private final OFFER_TYPE type; - private final NavigableSet offers; - private volatile double sum; - private volatile double avg; + public abstract OFFER_TYPE getType(); + public abstract Item getItem(); - public ItemStat(Item item, OFFER_TYPE offerType) { - this.offers = new ConcurrentSkipListSet<>(); - this.item = item; - this.type = offerType; - this.sum = 0; - this.avg = Double.NaN; + public abstract double getAvg(); + + public abstract Offer getBest(); + + public abstract int getOffersCount(); + + public abstract NavigableSet getOffers(); + + public abstract Offer getMin(); + + public abstract Offer getMax(); + + public abstract boolean isEmpty(); + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ItemStat)) return false; + + ItemStat itemStat = (ItemStat) o; + return getType() == itemStat.getType() && getItem().equals(itemStat.getItem()); } - synchronized void put(Offer offer){ - LOG.trace("Put offer {} to item stat {}", offer, this); - assert offer.hasType(type) && offer.hasItem(item); - if (offers.add(offer)){ - double price = offer.getPrice(); - sum += price; - avg = sum / offers.size(); - LOG.trace("After this = {}", this); - } - } - - synchronized void remove(Offer offer){ - LOG.trace("Remove offer {} from item stat {}", offer, this); - assert offer.hasType(type) && offer.hasItem(item); - if (offers.remove(offer)){ - if (offers.size()>0){ - double price = offer.getPrice(); - sum -= price; - avg = sum / offers.size(); - } else { - sum = 0; avg = Double.NaN; - } - LOG.trace("After this = {}", this); - } - } - - synchronized void update(Offer offer, double price){ - LOG.trace("Update offer {} from item stat {}", offer, this); - assert offer.hasType(type) && offer.hasItem(item) && offers.contains(offer); - double oldPrice = offer.getPrice(); - offers.remove(offer); - offer.setPrice(price); - offers.add(offer); - sum += price - oldPrice; - avg = sum / offers.size(); - LOG.trace("After update this = {}", this); - } - - public OFFER_TYPE getType(){ - return type; - } - - public Item getItem() { - return item; - } - - public synchronized double getAvg(){ - return avg; - } - - public synchronized Offer getBest() { - if (offers.isEmpty()) return getFake(); - return type.getOrder() > 0 ? offers.first() : offers.last(); - } - - public synchronized int getOffersCount(){ - return offers.size(); - } - - public synchronized NavigableSet getOffers() { - return Collections.unmodifiableNavigableSet(offers); - } - - public synchronized Offer getMin() { - if (offers.isEmpty()) return getFake(); - return offers.first(); - } - - public synchronized Offer getMax() { - if (offers.isEmpty()) return getFake(); - return offers.last(); - } - - public synchronized boolean isEmpty(){ - return offers.isEmpty(); + @Override + public int hashCode() { + int result = getItem().hashCode(); + result = 31 * result + getType().hashCode(); + return result; } @Override public String toString() { final StringBuilder sb = new StringBuilder("{"); - sb.append(item); - sb.append(", ").append(type); - if (LOG.isTraceEnabled()){ - sb.append(", count=").append(offers.size()); - sb.append(", sum=").append(sum); - } - sb.append(", avg=").append(avg); + sb.append(getItem()); + sb.append(", ").append(getType()); + sb.append(", avg=").append(getAvg()); sb.append(", best=").append(getBest()); sb.append(", min=").append(getMin()); sb.append(", max=").append(getMax()); @@ -119,18 +56,17 @@ public class ItemStat { return sb.toString(); } - - private Offer getFake() { + protected Offer getFake() { return new Offer() { @Override public Item getItem() { - return item; + return getItem(); } @Override public OFFER_TYPE getType() { - return type; + return getType(); } @Override @@ -154,12 +90,12 @@ public class ItemStat { } @Override - void setPrice(double price) { + protected void setPrice(double price) { throw new UnsupportedOperationException("Is fake offer, change unsupported"); } @Override - void setVendor(Vendor vendor) { + protected void setVendor(Vendor vendor) { throw new UnsupportedOperationException("Is fake offer, change unsupported"); } }; @@ -206,23 +142,35 @@ public class ItemStat { public void setName(String name) { throw new UnsupportedOperationException("Is fake vendor, change unsupported"); } + + @Override + public double getX() { + return 0; + } + + @Override + public void setX(double x) { + throw new UnsupportedOperationException("Is fake vendor, change unsupported"); + } + + @Override + public double getY() { + return 0; + } + + @Override + public void setY(double y) { + throw new UnsupportedOperationException("Is fake vendor, change unsupported"); + } + + @Override + public double getZ() { + return 0; + } + + @Override + public void setZ(double z) { + throw new UnsupportedOperationException("Is fake vendor, change unsupported"); + } }; - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof ItemStat)) return false; - - ItemStat itemStat = (ItemStat) o; - - return type == itemStat.type && item.equals(itemStat.item); - - } - - @Override - public int hashCode() { - int result = item.hashCode(); - result = 31 * result + type.hashCode(); - return result; - } } diff --git a/core/src/main/java/ru/trader/core/Offer.java b/core/src/main/java/ru/trader/core/Offer.java index 6649bcb..7be37e0 100644 --- a/core/src/main/java/ru/trader/core/Offer.java +++ b/core/src/main/java/ru/trader/core/Offer.java @@ -6,102 +6,70 @@ import org.slf4j.LoggerFactory; import java.util.Objects; -public class Offer implements Comparable{ +public abstract class Offer implements Comparable { private final static Logger LOG = LoggerFactory.getLogger(Offer.class); - private Vendor vendor; - private final Item item; - private final OFFER_TYPE type; - private volatile double price; + public abstract Item getItem(); - Offer(){ - item = null; - type = null; - } + public abstract OFFER_TYPE getType(); - public Offer(OFFER_TYPE type, Item item, double price) { - this.item = item; - this.type = type; - setPrice(price); - } + public abstract double getPrice(); + protected abstract void setPrice(double price); - public Item getItem() { - return item; - } - - public OFFER_TYPE getType() { - return type; - } - - public double getPrice() { - return price; - } - - void setPrice(double price) { - this.price = price; - } - - public Vendor getVendor() { - return vendor; - } - - void setVendor(Vendor vendor) { - LOG.trace("Set vendor {} to item {}", vendor, this); - this.vendor = vendor; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("{"); - sb.append("").append(vendor); - sb.append(", ").append(item); - sb.append(", ").append(type); - if (LOG.isTraceEnabled()){ - sb.append(", ").append(price); - } else { - sb.append(", ").append(getPrice()); - } - sb.append('}'); - return sb.toString(); - } + public abstract Vendor getVendor(); + protected abstract void setVendor(Vendor vendor); public boolean hasType(OFFER_TYPE offerType) { - return this.type.equals(offerType); + return getType().equals(offerType); } public boolean hasItem(Item item) { - return this.item.equals(item); + return getItem().equals(item); } public boolean equalsPrice(Offer offer){ - return equalsType(offer) && price==offer.price; + return equalsType(offer) && getPrice() == offer.getPrice(); } public boolean equalsType(Offer offer){ - return offer!=null && - type.equals(offer.type) && - item.equals(offer.item); + return offer != null && + getType().equals(offer.getType()) && + getItem().equals(offer.getItem()); } @Override public int compareTo(@NotNull Offer other) { Objects.requireNonNull(other, "Not compare with null"); if (this == other) return 0; - int cmp = type.compareTo(other.type); + int cmp = getType().compareTo(other.getType()); if (cmp!=0) return cmp; - cmp = Double.compare(price, other.price); + cmp = Double.compare(getPrice(), other.getPrice()); if (cmp!=0) return cmp; - cmp = vendor.compareTo(other.vendor); + cmp = getVendor().compareTo(other.getVendor()); if (cmp!=0) return cmp; - return item.compareTo(other.item); + return getItem().compareTo(other.getItem()); } public String toVString(){ - return String.format("%s (%.0f)", getVendor().getName(), price); + return String.format("%s (%.0f)", getVendor().getName(), getPrice()); } public String toIString(){ - return String.format("%s (%.0f)", item.getName(), price); + return String.format("%s (%.0f)", getItem().getName(), getPrice()); } + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("{"); + sb.append("").append(getVendor()); + sb.append(", ").append(getItem()); + sb.append(", ").append(getType()); + if (LOG.isTraceEnabled()){ + sb.append(", ").append(getPrice()); + } else { + sb.append(", ").append(getPrice()); + } + sb.append('}'); + return sb.toString(); + } } diff --git a/core/src/main/java/ru/trader/core/Vendor.java b/core/src/main/java/ru/trader/core/Vendor.java index 5dbf858..2bd6861 100644 --- a/core/src/main/java/ru/trader/core/Vendor.java +++ b/core/src/main/java/ru/trader/core/Vendor.java @@ -14,10 +14,18 @@ import java.util.stream.Collectors; public abstract class Vendor implements Comparable, Connectable { private final static Logger LOG = LoggerFactory.getLogger(Vendor.class); - private String name; - private double x; - private double y; - private double z; + public abstract String getName(); + public abstract void setName(String name); + + public abstract double getX(); + public abstract void setX(double x); + + public abstract double getY(); + public abstract void setY(double y); + + public abstract double getZ(); + public abstract void setZ(double z); + protected abstract Collection getOffers(); protected abstract Collection getItems(OFFER_TYPE offerType); @@ -26,13 +34,6 @@ public abstract class Vendor implements Comparable, Connectable protected abstract void addOffer(Offer offer); protected abstract void removeOffer(Offer offer); - protected Vendor() { - } - - protected Vendor(String name) { - this.name = name; - } - protected Collection getOffers(OFFER_TYPE offerType){ List offers = getOffers() .stream() @@ -74,7 +75,6 @@ public abstract class Vendor implements Comparable, Connectable LOG.trace("Add offer {} to vendor {}", offer, this); offer.setVendor(this); addOffer(offer); - } public final void remove(Offer offer){ @@ -83,7 +83,6 @@ public abstract class Vendor implements Comparable, Connectable removeOffer(offer); } - public final Collection getSellItems() { return getItems(OFFER_TYPE.SELL); } @@ -92,14 +91,6 @@ public abstract class Vendor implements Comparable, Connectable return getItems(OFFER_TYPE.BUY); } - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - @Override public String toString() { return getName(); @@ -109,12 +100,14 @@ public abstract class Vendor implements Comparable, Connectable public int compareTo(@NotNull Vendor other) { Objects.requireNonNull(other, "Not compare with null"); if (this == other) return 0; - return name != null ? other.name != null ? name.compareTo(other.name) : -1 : 0; + String name = getName(); + String otherName = other.getName(); + return name != null ? otherName != null ? name.compareTo(otherName) : -1 : 0; } @Override public double getDistance(Vendor other){ - return getDistance(other.x, other.y, other.z); + return getDistance(other.getX(), other.getY(), other.getZ()); } @Override @@ -123,31 +116,8 @@ public abstract class Vendor implements Comparable, Connectable } public double getDistance(double x, double y, double z){ - return Math.sqrt(Math.pow(x - this.x, 2) + Math.pow(y-this.y, 2) + Math.pow(z - this.z, 2)); + return Math.sqrt(Math.pow(x - getX(), 2) + Math.pow(y - getY(), 2) + Math.pow(z - getZ(), 2)); } - public double getX() { - return x; - } - - public void setX(double x) { - this.x = x; - } - - public double getY() { - return y; - } - - public void setY(double y) { - this.y = y; - } - - public double getZ() { - return z; - } - - public void setZ(double z) { - this.z = z; - } } diff --git a/core/src/main/java/ru/trader/store/MarketDocHandler.java b/core/src/main/java/ru/trader/store/simple/MarketDocHandler.java similarity index 96% rename from core/src/main/java/ru/trader/store/MarketDocHandler.java rename to core/src/main/java/ru/trader/store/simple/MarketDocHandler.java index 0bd13c7..6fcf982 100644 --- a/core/src/main/java/ru/trader/store/MarketDocHandler.java +++ b/core/src/main/java/ru/trader/store/simple/MarketDocHandler.java @@ -1,4 +1,4 @@ -package ru.trader.store; +package ru.trader.store.simple; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -9,7 +9,6 @@ import org.xml.sax.helpers.DefaultHandler; import ru.trader.core.*; import java.util.HashMap; -import java.util.OptionalLong; public class MarketDocHandler extends DefaultHandler { private final static Logger LOG = LoggerFactory.getLogger(MarketDocHandler.class); @@ -104,7 +103,7 @@ public class MarketDocHandler extends DefaultHandler { } protected void onOffer(OFFER_TYPE offerType, Item item, double price){ - Offer offer = new Offer(offerType, item, price); + Offer offer = new SimpleOffer(offerType, item, price); curVendor.add(offer); } @@ -116,14 +115,14 @@ public class MarketDocHandler extends DefaultHandler { } protected void onItem(String name, String id) { - Item item = new Item(name); + Item item = new SimpleItem(name); item.setGroup(curGroup); world.add(item); items.put(id, item); } protected void onGroup(String name, GROUP_TYPE type) { - curGroup = new Group(name, type); + curGroup = new SimpleGroup(name, type); } public Market getWorld(){ diff --git a/core/src/main/java/ru/trader/store/MarketStreamWriter.java b/core/src/main/java/ru/trader/store/simple/MarketStreamWriter.java similarity index 99% rename from core/src/main/java/ru/trader/store/MarketStreamWriter.java rename to core/src/main/java/ru/trader/store/simple/MarketStreamWriter.java index 4863d7c..2b18188 100644 --- a/core/src/main/java/ru/trader/store/MarketStreamWriter.java +++ b/core/src/main/java/ru/trader/store/simple/MarketStreamWriter.java @@ -1,4 +1,4 @@ -package ru.trader.store; +package ru.trader.store.simple; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/core/src/main/java/ru/trader/store/simple/SimpleGroup.java b/core/src/main/java/ru/trader/store/simple/SimpleGroup.java new file mode 100644 index 0000000..374ab54 --- /dev/null +++ b/core/src/main/java/ru/trader/store/simple/SimpleGroup.java @@ -0,0 +1,24 @@ +package ru.trader.store.simple; + +import ru.trader.core.GROUP_TYPE; +import ru.trader.core.Group; + +public class SimpleGroup extends Group { + private final String name; + private final GROUP_TYPE type; + + public SimpleGroup(String name, GROUP_TYPE type) { + this.name = name; + this.type = type; + } + + @Override + public String getName() { + return name; + } + + @Override + public GROUP_TYPE getType() { + return type; + } +} diff --git a/core/src/main/java/ru/trader/store/simple/SimpleItem.java b/core/src/main/java/ru/trader/store/simple/SimpleItem.java new file mode 100644 index 0000000..f1075df --- /dev/null +++ b/core/src/main/java/ru/trader/store/simple/SimpleItem.java @@ -0,0 +1,33 @@ +package ru.trader.store.simple; + +import ru.trader.core.Group; +import ru.trader.core.Item; + +public class SimpleItem extends Item { + private String name; + private Group group; + + public SimpleItem(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } + + @Override + protected void setName(String name) { + this.name = name; + } + + @Override + public Group getGroup() { + return group; + } + + @Override + public void setGroup(Group group) { + this.group = group; + } +} diff --git a/core/src/main/java/ru/trader/store/simple/SimpleItemStat.java b/core/src/main/java/ru/trader/store/simple/SimpleItemStat.java new file mode 100644 index 0000000..1ecbfca --- /dev/null +++ b/core/src/main/java/ru/trader/store/simple/SimpleItemStat.java @@ -0,0 +1,138 @@ +package ru.trader.store.simple; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.trader.core.Item; +import ru.trader.core.ItemStat; +import ru.trader.core.OFFER_TYPE; +import ru.trader.core.Offer; + +import java.util.*; +import java.util.concurrent.ConcurrentSkipListSet; + +public class SimpleItemStat extends ItemStat { + private final static Logger LOG = LoggerFactory.getLogger(SimpleItemStat.class); + + private final Item item; + private final OFFER_TYPE type; + private final NavigableSet offers; + private volatile double sum; + private volatile double avg; + + + public SimpleItemStat(Item item, OFFER_TYPE offerType) { + this.offers = new ConcurrentSkipListSet<>(); + this.item = item; + this.type = offerType; + this.sum = 0; + this.avg = Double.NaN; + } + + synchronized void put(Offer offer){ + LOG.trace("Put offer {} to item stat {}", offer, this); + assert offer.hasType(type) && offer.hasItem(item); + if (offers.add(offer)){ + double price = offer.getPrice(); + sum += price; + avg = sum / offers.size(); + LOG.trace("After this = {}", this); + } + } + + synchronized void remove(Offer offer){ + LOG.trace("Remove offer {} from item stat {}", offer, this); + assert offer.hasType(type) && offer.hasItem(item); + if (offers.remove(offer)){ + if (offers.size()>0){ + double price = offer.getPrice(); + sum -= price; + avg = sum / offers.size(); + } else { + sum = 0; avg = Double.NaN; + } + LOG.trace("After this = {}", this); + } + } + + @Override + protected synchronized void update(Offer offer, double price){ + LOG.trace("Update offer {} from item stat {}", offer, this); + assert offer.hasType(type) && offer.hasItem(item) && offers.contains(offer); + double oldPrice = offer.getPrice(); + offers.remove(offer); + ((SimpleOffer)offer).setPrice(price); + offers.add(offer); + sum += price - oldPrice; + avg = sum / offers.size(); + LOG.trace("After update this = {}", this); + } + + @Override + public OFFER_TYPE getType(){ + return type; + } + + @Override + public Item getItem() { + return item; + } + + @Override + public synchronized double getAvg(){ + return avg; + } + + @Override + public synchronized Offer getBest() { + if (offers.isEmpty()) return getFake(); + return type.getOrder() > 0 ? offers.first() : offers.last(); + } + + @Override + public synchronized int getOffersCount(){ + return offers.size(); + } + + @Override + public synchronized NavigableSet getOffers() { + return Collections.unmodifiableNavigableSet(offers); + } + + @Override + public synchronized Offer getMin() { + if (offers.isEmpty()) return getFake(); + return offers.first(); + } + + @Override + public synchronized Offer getMax() { + if (offers.isEmpty()) return getFake(); + return offers.last(); + } + + @Override + public synchronized boolean isEmpty(){ + return offers.isEmpty(); + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("{"); + sb.append(getItem()); + sb.append(", ").append(getType()); + if (SimpleItemStat.LOG.isTraceEnabled()){ + sb.append(", count=").append(offers.size()); + sb.append(", sum=").append(sum); + } + sb.append(", avg=").append(getAvg()); + sb.append(", best=").append(getBest()); + sb.append(", min=").append(getMin()); + sb.append(", max=").append(getMax()); + + sb.append("}"); + return sb.toString(); + } + + + +} diff --git a/core/src/main/java/ru/trader/core/SimpleMarket.java b/core/src/main/java/ru/trader/store/simple/SimpleMarket.java similarity index 82% rename from core/src/main/java/ru/trader/core/SimpleMarket.java rename to core/src/main/java/ru/trader/store/simple/SimpleMarket.java index eedc990..9af5095 100644 --- a/core/src/main/java/ru/trader/core/SimpleMarket.java +++ b/core/src/main/java/ru/trader/store/simple/SimpleMarket.java @@ -1,4 +1,6 @@ -package ru.trader.core; +package ru.trader.store.simple; + +import ru.trader.core.*; import java.util.*; import java.util.stream.Collectors; @@ -8,8 +10,8 @@ public class SimpleMarket extends MarketSupport { protected List items; //caching - private final Map sellItems = new HashMap<>(); - private final Map buyItems = new HashMap<>(); + private final Map sellItems = new HashMap<>(); + private final Map buyItems = new HashMap<>(); public SimpleMarket() { init(); @@ -20,7 +22,7 @@ public class SimpleMarket extends MarketSupport { items = new ArrayList<>(); } - private Map getItemCache(OFFER_TYPE offerType){ + private Map getItemCache(OFFER_TYPE offerType){ switch (offerType) { case SELL: return sellItems; case BUY: return buyItems; @@ -29,23 +31,19 @@ public class SimpleMarket extends MarketSupport { } } - private void put(Map cache, Offer offer){ + private void put(Map cache, Offer offer){ Item item = offer.getItem(); - ItemStat entry = cache.get(item); + SimpleItemStat entry = cache.get(item); if (entry==null){ - entry = newItemStat(item, offer.getType()); + entry = new SimpleItemStat(item, offer.getType()); cache.put(item, entry); } entry.put(offer); } - protected ItemStat newItemStat(Item item, OFFER_TYPE offerType){ - return new ItemStat(item, offerType); - } - - private void remove(Map cache, Offer offer){ + private void remove(Map cache, Offer offer){ Item item = offer.getItem(); - ItemStat entry = cache.get(item); + SimpleItemStat entry = cache.get(item); if (entry!=null){ entry.remove(offer); if (entry.getOffersCount()==0) @@ -114,7 +112,7 @@ public class SimpleMarket extends MarketSupport { @Override public ItemStat getStat(OFFER_TYPE offerType, Item item) { ItemStat entry = getItemCache(offerType).get(item); - return entry!=null ? entry : newItemStat(item, offerType); + return entry != null ? entry : new SimpleItemStat(item, offerType); } @Override diff --git a/core/src/main/java/ru/trader/store/simple/SimpleOffer.java b/core/src/main/java/ru/trader/store/simple/SimpleOffer.java new file mode 100644 index 0000000..3b174eb --- /dev/null +++ b/core/src/main/java/ru/trader/store/simple/SimpleOffer.java @@ -0,0 +1,55 @@ +package ru.trader.store.simple; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.trader.core.Item; +import ru.trader.core.OFFER_TYPE; +import ru.trader.core.Offer; +import ru.trader.core.Vendor; + +public class SimpleOffer extends Offer { + private final static Logger LOG = LoggerFactory.getLogger(SimpleOffer.class); + + private Vendor vendor; + private final Item item; + private final OFFER_TYPE type; + private volatile double price; + + public SimpleOffer(OFFER_TYPE type, Item item, double price) { + this.item = item; + this.type = type; + setPrice(price); + } + + @Override + public Item getItem() { + return item; + } + + @Override + public OFFER_TYPE getType() { + return type; + } + + @Override + public double getPrice() { + return price; + } + + @Override + protected void setPrice(double price) { + this.price = price; + } + + @Override + public Vendor getVendor() { + return vendor; + } + + @Override + protected void setVendor(Vendor vendor) { + LOG.trace("Set vendor {} to item {}", vendor, this); + this.vendor = vendor; + } + +} diff --git a/core/src/main/java/ru/trader/core/SimpleVendor.java b/core/src/main/java/ru/trader/store/simple/SimpleVendor.java similarity index 73% rename from core/src/main/java/ru/trader/core/SimpleVendor.java rename to core/src/main/java/ru/trader/store/simple/SimpleVendor.java index 6f0a279..d926d47 100644 --- a/core/src/main/java/ru/trader/core/SimpleVendor.java +++ b/core/src/main/java/ru/trader/store/simple/SimpleVendor.java @@ -1,20 +1,28 @@ -package ru.trader.core; +package ru.trader.store.simple; + +import ru.trader.core.Item; +import ru.trader.core.OFFER_TYPE; +import ru.trader.core.Offer; +import ru.trader.core.Vendor; import java.util.*; import java.util.concurrent.ConcurrentHashMap; public class SimpleVendor extends Vendor { + private String name; + private double x; + private double y; + private double z; protected Map sell; protected Map buy; public SimpleVendor() { - super(); initOffers(); } public SimpleVendor(String name) { - super(name); + this.name = name; initOffers(); } @@ -23,6 +31,46 @@ public class SimpleVendor extends Vendor { buy = new ConcurrentHashMap<>(20, 0.9f, 2); } + @Override + public String getName() { + return name; + } + + @Override + public void setName(String name) { + this.name = name; + } + + @Override + public double getX() { + return x; + } + + @Override + public void setX(double x) { + this.x = x; + } + + @Override + public double getY() { + return y; + } + + @Override + public void setY(double y) { + this.y = y; + } + + @Override + public double getZ() { + return z; + } + + @Override + public void setZ(double z) { + this.z = z; + } + @Override protected Collection getOffers(OFFER_TYPE offerType) { switch (offerType) { diff --git a/core/src/main/java/ru/trader/store/Store.java b/core/src/main/java/ru/trader/store/simple/Store.java similarity index 98% rename from core/src/main/java/ru/trader/store/Store.java rename to core/src/main/java/ru/trader/store/simple/Store.java index 583b457..ab5e992 100644 --- a/core/src/main/java/ru/trader/store/Store.java +++ b/core/src/main/java/ru/trader/store/simple/Store.java @@ -1,4 +1,4 @@ -package ru.trader.store; +package ru.trader.store.simple; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/core/src/test/java/ru/trader/core/ItemStatTest.java b/core/src/test/java/ru/trader/core/ItemStatTest.java deleted file mode 100644 index e9b363f..0000000 --- a/core/src/test/java/ru/trader/core/ItemStatTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package ru.trader.core; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -public class ItemStatTest extends Assert { - private final static Logger LOG = LoggerFactory.getLogger(ItemStatTest.class); - - private final static Item ITEM1 = new Item("Item1"); - - - private ItemStat itemSellStat = new ItemStat(ITEM1, OFFER_TYPE.SELL); - private ItemStat itemBuyStat = new ItemStat(ITEM1, OFFER_TYPE.BUY); - - @Before - public void fill(){ - itemSellStat.put(new Offer(OFFER_TYPE.SELL, ITEM1, 10)); - itemSellStat.put(new Offer(OFFER_TYPE.SELL, ITEM1, 20)); - itemSellStat.put(new Offer(OFFER_TYPE.SELL, ITEM1, 30)); - itemSellStat.put(new Offer(OFFER_TYPE.SELL, ITEM1, 40)); - - itemBuyStat.put(new Offer(OFFER_TYPE.BUY, ITEM1, 100)); - itemBuyStat.put(new Offer(OFFER_TYPE.BUY, ITEM1, 200)); - itemBuyStat.put(new Offer(OFFER_TYPE.BUY, ITEM1, 300)); - itemBuyStat.put(new Offer(OFFER_TYPE.BUY, ITEM1, 400)); - - } - - - @Test - public void testSell(){ - LOG.info("Start sell test"); - assertEquals(itemSellStat.getAvg(), (10+20+30+40)/4, 0); - assertEquals(itemSellStat.getBest().getPrice(), 10d, 0); - } - - @Test - public void testBuy(){ - LOG.info("Start buy test"); - assertEquals(itemBuyStat.getAvg(), (100+200+300+400)/4, 0); - assertEquals(itemBuyStat.getBest().getPrice(), 400d, 0); - } - - -} diff --git a/core/src/test/java/ru/trader/core/MarketAnalyzerTest.java b/core/src/test/java/ru/trader/core/MarketAnalyzerTest.java index 4888d84..e3d2eea 100644 --- a/core/src/test/java/ru/trader/core/MarketAnalyzerTest.java +++ b/core/src/test/java/ru/trader/core/MarketAnalyzerTest.java @@ -8,6 +8,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.trader.TestUtil; import ru.trader.graph.Path; +import ru.trader.store.simple.SimpleItem; +import ru.trader.store.simple.SimpleMarket; +import ru.trader.store.simple.SimpleOffer; +import ru.trader.store.simple.SimpleVendor; import java.util.Collection; @@ -26,9 +30,9 @@ public class MarketAnalyzerTest extends Assert { private static Vendor v9; private static Vendor v10; private static Vendor v11; - private static Item ITEM1 = new Item("ITEM1"); - private static Item ITEM2 = new Item("ITEM2"); - private static Item ITEM3 = new Item("ITEM3"); + private static Item ITEM1 = new SimpleItem("ITEM1"); + private static Item ITEM2 = new SimpleItem("ITEM2"); + private static Item ITEM3 = new SimpleItem("ITEM3"); @Before public void setUp() throws Exception { @@ -69,19 +73,19 @@ public class MarketAnalyzerTest extends Assert { market.add(v10); market.add(v11); - market.add(v6, new Offer(OFFER_TYPE.SELL, ITEM1, 100)); - market.add(v7, new Offer(OFFER_TYPE.SELL, ITEM1, 100)); - market.add(v9, new Offer(OFFER_TYPE.SELL, ITEM1, 100)); - market.add(v10, new Offer(OFFER_TYPE.SELL, ITEM1, 100)); - market.add(v6, new Offer(OFFER_TYPE.BUY, ITEM1, 50)); - market.add(v7, new Offer(OFFER_TYPE.BUY, ITEM1, 120)); - market.add(v9, new Offer(OFFER_TYPE.BUY, ITEM1, 200)); - market.add(v10, new Offer(OFFER_TYPE.BUY, ITEM1, 150)); - market.add(v9, new Offer(OFFER_TYPE.SELL, ITEM2, 100)); - market.add(v6, new Offer(OFFER_TYPE.BUY, ITEM2, 140)); - market.add(v7, new Offer(OFFER_TYPE.SELL, ITEM3, 154)); - market.add(v10, new Offer(OFFER_TYPE.BUY, ITEM3, 140)); - market.add(v11, new Offer(OFFER_TYPE.BUY, ITEM3, 500)); + market.add(v6, new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 100)); + market.add(v7, new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 100)); + market.add(v9, new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 100)); + market.add(v10, new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 100)); + market.add(v6, new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 50)); + market.add(v7, new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 120)); + market.add(v9, new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 200)); + market.add(v10, new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 150)); + market.add(v9, new SimpleOffer(OFFER_TYPE.SELL, ITEM2, 100)); + market.add(v6, new SimpleOffer(OFFER_TYPE.BUY, ITEM2, 140)); + market.add(v7, new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 154)); + market.add(v10, new SimpleOffer(OFFER_TYPE.BUY, ITEM3, 140)); + market.add(v11, new SimpleOffer(OFFER_TYPE.BUY, ITEM3, 500)); } diff --git a/core/src/test/java/ru/trader/core/MarketAnalyzerTest2.java b/core/src/test/java/ru/trader/core/MarketAnalyzerTest2.java index 8437869..ecee148 100644 --- a/core/src/test/java/ru/trader/core/MarketAnalyzerTest2.java +++ b/core/src/test/java/ru/trader/core/MarketAnalyzerTest2.java @@ -5,7 +5,7 @@ import org.junit.Before; import org.junit.Test; import ru.trader.TestUtil; import ru.trader.graph.PathRoute; -import ru.trader.store.Store; +import ru.trader.store.simple.Store; import java.io.InputStream; import java.util.Collection; import java.util.Optional; diff --git a/core/src/test/java/ru/trader/core/MarketTest1.java b/core/src/test/java/ru/trader/core/MarketTest1.java index e64e386..8942634 100644 --- a/core/src/test/java/ru/trader/core/MarketTest1.java +++ b/core/src/test/java/ru/trader/core/MarketTest1.java @@ -5,22 +5,26 @@ import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import ru.trader.store.simple.SimpleItem; +import ru.trader.store.simple.SimpleMarket; +import ru.trader.store.simple.SimpleOffer; +import ru.trader.store.simple.SimpleVendor; public class MarketTest1 extends Assert { private final static Logger LOG = LoggerFactory.getLogger(MarketTest1.class); - private final static Item ITEM1 = new Item("Item1"); - private final static Item ITEM2 = new Item("Item2"); - private final static Item ITEM3 = new Item("Item3"); + private final static Item ITEM1 = new SimpleItem("Item1"); + private final static Item ITEM2 = new SimpleItem("Item2"); + private final static Item ITEM3 = new SimpleItem("Item3"); - private final static Offer bestSellOffer1 = new Offer(OFFER_TYPE.SELL,ITEM1,10); - private final static Offer bestSellOffer2 = new Offer(OFFER_TYPE.SELL,ITEM2,15); - private final static Offer bestSellOffer3 = new Offer(OFFER_TYPE.SELL,ITEM3,20); + private final static Offer bestSellOffer1 = new SimpleOffer(OFFER_TYPE.SELL,ITEM1,10); + private final static Offer bestSellOffer2 = new SimpleOffer(OFFER_TYPE.SELL,ITEM2,15); + private final static Offer bestSellOffer3 = new SimpleOffer(OFFER_TYPE.SELL,ITEM3,20); - private final static Offer bestBuyOffer1 = new Offer(OFFER_TYPE.BUY,ITEM1,100); - private final static Offer bestBuyOffer2 = new Offer(OFFER_TYPE.BUY,ITEM2,200); - private final static Offer bestBuyOffer3 = new Offer(OFFER_TYPE.BUY,ITEM3,100); - private final static Offer bestBuyOffer4 = new Offer(OFFER_TYPE.BUY,ITEM2,150); + private final static Offer bestBuyOffer1 = new SimpleOffer(OFFER_TYPE.BUY,ITEM1,100); + private final static Offer bestBuyOffer2 = new SimpleOffer(OFFER_TYPE.BUY,ITEM2,200); + private final static Offer bestBuyOffer3 = new SimpleOffer(OFFER_TYPE.BUY,ITEM3,100); + private final static Offer bestBuyOffer4 = new SimpleOffer(OFFER_TYPE.BUY,ITEM2,150); private final static Vendor sellVendor1 = new SimpleVendor(); @@ -37,22 +41,22 @@ public class MarketTest1 extends Assert { @Before public void fillMarket(){ sellVendor1.add(bestSellOffer1); - sellVendor1.add(new Offer(OFFER_TYPE.SELL,ITEM2,100)); - sellVendor2.add(new Offer(OFFER_TYPE.SELL,ITEM3,200)); + sellVendor1.add(new SimpleOffer(OFFER_TYPE.SELL,ITEM2,100)); + sellVendor2.add(new SimpleOffer(OFFER_TYPE.SELL,ITEM3,200)); sellVendor2.add(bestSellOffer2); - sellVendor3.add(new Offer(OFFER_TYPE.SELL,ITEM1,300)); - sellVendor3.add(new Offer(OFFER_TYPE.SELL,ITEM2,300)); + sellVendor3.add(new SimpleOffer(OFFER_TYPE.SELL,ITEM1,300)); + sellVendor3.add(new SimpleOffer(OFFER_TYPE.SELL,ITEM2,300)); sellVendor3.add(bestSellOffer3); - sellVendor4.add(new Offer(OFFER_TYPE.SELL,ITEM2,150)); + sellVendor4.add(new SimpleOffer(OFFER_TYPE.SELL,ITEM2,150)); - buyVendor1.add(new Offer(OFFER_TYPE.BUY,ITEM2,50)); + buyVendor1.add(new SimpleOffer(OFFER_TYPE.BUY,ITEM2,50)); buyVendor1.add(bestBuyOffer1); - buyVendor2.add(new Offer(OFFER_TYPE.BUY,ITEM1,40)); + buyVendor2.add(new SimpleOffer(OFFER_TYPE.BUY,ITEM1,40)); buyVendor2.add(bestBuyOffer2); - buyVendor2.add(new Offer(OFFER_TYPE.BUY,ITEM3,50)); + buyVendor2.add(new SimpleOffer(OFFER_TYPE.BUY,ITEM3,50)); buyVendor3.add(bestBuyOffer3); - buyVendor3.add(new Offer(OFFER_TYPE.BUY,ITEM2,20)); - buyVendor4.add(new Offer(OFFER_TYPE.BUY,ITEM1,80)); + buyVendor3.add(new SimpleOffer(OFFER_TYPE.BUY,ITEM2,20)); + buyVendor4.add(new SimpleOffer(OFFER_TYPE.BUY,ITEM1,80)); buyVendor4.add(bestBuyOffer4); market = new SimpleMarket(); diff --git a/core/src/test/java/ru/trader/core/VendorTest.java b/core/src/test/java/ru/trader/core/VendorTest.java index 44b9c04..9c3cbed 100644 --- a/core/src/test/java/ru/trader/core/VendorTest.java +++ b/core/src/test/java/ru/trader/core/VendorTest.java @@ -5,15 +5,18 @@ import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import ru.trader.store.simple.SimpleItem; +import ru.trader.store.simple.SimpleOffer; +import ru.trader.store.simple.SimpleVendor; public class VendorTest extends Assert { private final static Logger LOG = LoggerFactory.getLogger(VendorTest.class); - private final static Item ITEM1 = new Item("Item1"); - private final static Item ITEM2 = new Item("Item2"); - private final static Offer SELL_OFFER = new Offer(OFFER_TYPE.SELL, ITEM1, 10); - private final static Offer BUY_OFFER = new Offer(OFFER_TYPE.BUY, ITEM1, 10); + private final static Item ITEM1 = new SimpleItem("Item1"); + private final static Item ITEM2 = new SimpleItem("Item2"); + private final static Offer SELL_OFFER = new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 10); + private final static Offer BUY_OFFER = new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 10); private Vendor sellVendor; private Vendor buyVendor; diff --git a/core/src/test/java/ru/trader/core/VendorTest2.java b/core/src/test/java/ru/trader/core/VendorTest2.java index 01c83ff..3e0e98d 100644 --- a/core/src/test/java/ru/trader/core/VendorTest2.java +++ b/core/src/test/java/ru/trader/core/VendorTest2.java @@ -6,24 +6,27 @@ import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.trader.TestUtil; +import ru.trader.store.simple.SimpleItem; +import ru.trader.store.simple.SimpleOffer; +import ru.trader.store.simple.SimpleVendor; import java.util.Collection; public class VendorTest2 extends Assert { private final static Logger LOG = LoggerFactory.getLogger(VendorTest2.class); - private final static Item ITEM1 = new Item("Item1"); - private final static Item ITEM2 = new Item("Item2"); - private final static Item ITEM3 = new Item("Item3"); - private final static Offer SELL_OFFER1 = new Offer(OFFER_TYPE.SELL, ITEM1, 10); - private final static Offer SELL_OFFER2 = new Offer(OFFER_TYPE.SELL, ITEM2, 10); - private final static Offer SELL_OFFER3 = new Offer(OFFER_TYPE.SELL, ITEM3, 10); - private final static Offer DUBLE_SELL_OFFER1 = new Offer(OFFER_TYPE.SELL, ITEM1, 100); + private final static Item ITEM1 = new SimpleItem("Item1"); + private final static Item ITEM2 = new SimpleItem("Item2"); + private final static Item ITEM3 = new SimpleItem("Item3"); + private final static Offer SELL_OFFER1 = new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 10); + private final static Offer SELL_OFFER2 = new SimpleOffer(OFFER_TYPE.SELL, ITEM2, 10); + private final static Offer SELL_OFFER3 = new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 10); + private final static Offer DUBLE_SELL_OFFER1 = new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 100); - private final static Offer BUY_OFFER1 = new Offer(OFFER_TYPE.BUY, ITEM1, 100); - private final static Offer BUY_OFFER2 = new Offer(OFFER_TYPE.BUY, ITEM2, 10); - private final static Offer BUY_OFFER3 = new Offer(OFFER_TYPE.BUY, ITEM3, 10); - private final static Offer DUBLE_BUY_OFFER1 = new Offer(OFFER_TYPE.BUY, ITEM1, 10); + private final static Offer BUY_OFFER1 = new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 100); + private final static Offer BUY_OFFER2 = new SimpleOffer(OFFER_TYPE.BUY, ITEM2, 10); + private final static Offer BUY_OFFER3 = new SimpleOffer(OFFER_TYPE.BUY, ITEM3, 10); + private final static Offer DUBLE_BUY_OFFER1 = new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 10); private Vendor sellVendor; diff --git a/core/src/test/java/ru/trader/graph/PathRouteTest.java b/core/src/test/java/ru/trader/graph/PathRouteTest.java index 27f5e71..7fdda14 100644 --- a/core/src/test/java/ru/trader/graph/PathRouteTest.java +++ b/core/src/test/java/ru/trader/graph/PathRouteTest.java @@ -6,15 +6,18 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.trader.TestUtil; import ru.trader.core.*; +import ru.trader.store.simple.SimpleItem; +import ru.trader.store.simple.SimpleOffer; +import ru.trader.store.simple.SimpleVendor; import java.util.Collection; public class PathRouteTest extends Assert { private final static Logger LOG = LoggerFactory.getLogger(PathRouteTest.class); - private final static Item ITEM1 = new Item("ITEM1"); - private final static Item ITEM2 = new Item("ITEM2"); - private final static Item ITEM3 = new Item("ITEM3"); + private final static Item ITEM1 = new SimpleItem("ITEM1"); + private final static Item ITEM2 = new SimpleItem("ITEM2"); + private final static Item ITEM3 = new SimpleItem("ITEM3"); private static Vendor v1; private static Vendor v2; private static Vendor v3; @@ -26,12 +29,12 @@ public class PathRouteTest extends Assert { v1 = new SimpleVendor("v1"); v2 = new SimpleVendor("v2"); - v1.add(new Offer(OFFER_TYPE.SELL, ITEM1, 100)); - v1.add(new Offer(OFFER_TYPE.SELL, ITEM2, 200)); - v1.add(new Offer(OFFER_TYPE.SELL, ITEM3, 300)); - v2.add(new Offer(OFFER_TYPE.BUY, ITEM1, 300)); - v2.add(new Offer(OFFER_TYPE.BUY, ITEM2, 350)); - v2.add(new Offer(OFFER_TYPE.BUY, ITEM3, 400)); + v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 100)); + v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM2, 200)); + v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 300)); + v2.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 300)); + v2.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM2, 350)); + v2.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM3, 400)); PathRoute res = new PathRoute(new Vertex<>(v1)); res = (PathRoute) res.connectTo(new Vertex<>(v2), false); @@ -67,12 +70,12 @@ public class PathRouteTest extends Assert { v2 = new SimpleVendor("v2"); v3 = new SimpleVendor("v3"); - v1.add(new Offer(OFFER_TYPE.SELL, ITEM1, 100)); - v1.add(new Offer(OFFER_TYPE.SELL, ITEM3, 300)); - v2.add(new Offer(OFFER_TYPE.SELL, ITEM2, 200)); - v3.add(new Offer(OFFER_TYPE.BUY, ITEM1, 300)); - v3.add(new Offer(OFFER_TYPE.BUY, ITEM2, 350)); - v3.add(new Offer(OFFER_TYPE.BUY, ITEM3, 400)); + v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 100)); + v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 300)); + v2.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM2, 200)); + v3.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 300)); + v3.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM2, 350)); + v3.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM3, 400)); PathRoute res = new PathRoute(new Vertex<>(v1)); res = (PathRoute) res.connectTo(new Vertex<>(v2), false); @@ -115,16 +118,16 @@ public class PathRouteTest extends Assert { v3 = new SimpleVendor("v3"); v4 = new SimpleVendor("v4"); - v1.add(new Offer(OFFER_TYPE.SELL, ITEM1, 100)); - v1.add(new Offer(OFFER_TYPE.SELL, ITEM2, 200)); - v1.add(new Offer(OFFER_TYPE.SELL, ITEM3, 300)); - v2.add(new Offer(OFFER_TYPE.SELL, ITEM1, 150)); - v2.add(new Offer(OFFER_TYPE.SELL, ITEM3, 320)); - v3.add(new Offer(OFFER_TYPE.SELL, ITEM3, 390)); + v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 100)); + v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM2, 200)); + v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 300)); + v2.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 150)); + v2.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 320)); + v3.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 390)); - v2.add(new Offer(OFFER_TYPE.BUY, ITEM2, 225)); - v3.add(new Offer(OFFER_TYPE.BUY, ITEM1, 200)); - v4.add(new Offer(OFFER_TYPE.BUY, ITEM3, 450)); + v2.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM2, 225)); + v3.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 200)); + v4.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM3, 450)); PathRoute res = new PathRoute(new Vertex<>(v1)); res = (PathRoute) res.connectTo(new Vertex<>(v2), false); @@ -179,16 +182,16 @@ public class PathRouteTest extends Assert { v4 = new SimpleVendor("v4"); v5 = new SimpleVendor("v5"); - v1.add(new Offer(OFFER_TYPE.SELL, ITEM1, 410)); - v1.add(new Offer(OFFER_TYPE.SELL, ITEM2, 200)); - v1.add(new Offer(OFFER_TYPE.SELL, ITEM3, 300)); - v2.add(new Offer(OFFER_TYPE.SELL, ITEM2, 270)); - v4.add(new Offer(OFFER_TYPE.SELL, ITEM1, 300)); + v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 410)); + v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM2, 200)); + v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 300)); + v2.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM2, 270)); + v4.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 300)); - v2.add(new Offer(OFFER_TYPE.BUY, ITEM1, 470)); - v3.add(new Offer(OFFER_TYPE.BUY, ITEM2, 300)); - v4.add(new Offer(OFFER_TYPE.BUY, ITEM3, 370)); - v5.add(new Offer(OFFER_TYPE.BUY, ITEM1, 400)); + v2.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 470)); + v3.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM2, 300)); + v4.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM3, 370)); + v5.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 400)); PathRoute res = new PathRoute(new Vertex<>(v1)); res = (PathRoute) res.connectTo(new Vertex<>(v2), false); @@ -251,16 +254,16 @@ public class PathRouteTest extends Assert { v3 = new SimpleVendor("v3"); v4 = new SimpleVendor("v4"); - v1.add(new Offer(OFFER_TYPE.SELL, ITEM1, 100)); - v1.add(new Offer(OFFER_TYPE.SELL, ITEM2, 200)); - v1.add(new Offer(OFFER_TYPE.SELL, ITEM3, 300)); - v2.add(new Offer(OFFER_TYPE.SELL, ITEM1, 150)); - v2.add(new Offer(OFFER_TYPE.SELL, ITEM3, 320)); - v3.add(new Offer(OFFER_TYPE.SELL, ITEM3, 390)); + v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 100)); + v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM2, 200)); + v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 300)); + v2.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 150)); + v2.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 320)); + v3.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 390)); - v2.add(new Offer(OFFER_TYPE.BUY, ITEM2, 225)); - v3.add(new Offer(OFFER_TYPE.BUY, ITEM1, 200)); - v4.add(new Offer(OFFER_TYPE.BUY, ITEM3, 450)); + v2.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM2, 225)); + v3.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 200)); + v4.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM3, 450)); PathRoute res = new PathRoute(new Vertex<>(v1)); res = (PathRoute) res.connectTo(new Vertex<>(v2), false); @@ -314,13 +317,13 @@ public class PathRouteTest extends Assert { v1 = new SimpleVendor("v1"); v2 = new SimpleVendor("v2"); - v1.add(new Offer(OFFER_TYPE.SELL, ITEM1, 100)); - v1.add(new Offer(OFFER_TYPE.SELL, ITEM2, 200)); - v1.add(new Offer(OFFER_TYPE.SELL, ITEM3, 300)); - v2.add(new Offer(OFFER_TYPE.SELL, ITEM1, 150)); - v2.add(new Offer(OFFER_TYPE.SELL, ITEM3, 320)); + v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 100)); + v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM2, 200)); + v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 300)); + v2.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 150)); + v2.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 320)); - v2.add(new Offer(OFFER_TYPE.BUY, ITEM2, 225)); + v2.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM2, 225)); PathRoute res = new PathRoute(new Vertex<>(v1)); res = (PathRoute) res.connectTo(new Vertex<>(v2), false); @@ -334,10 +337,10 @@ public class PathRouteTest extends Assert { v3 = new SimpleVendor("v3"); v4 = new SimpleVendor("v4"); - v3.add(new Offer(OFFER_TYPE.SELL, ITEM3, 390)); + v3.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 390)); - v3.add(new Offer(OFFER_TYPE.BUY, ITEM1, 200)); - v4.add(new Offer(OFFER_TYPE.BUY, ITEM3, 450)); + v3.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 200)); + v4.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM3, 450)); PathRoute res = new PathRoute(new Vertex<>(v2)); res = (PathRoute) res.connectTo(new Vertex<>(v3), false); diff --git a/core/src/test/java/ru/trader/graph/RouteGraphTest.java b/core/src/test/java/ru/trader/graph/RouteGraphTest.java index 3b07a41..513b61b 100644 --- a/core/src/test/java/ru/trader/graph/RouteGraphTest.java +++ b/core/src/test/java/ru/trader/graph/RouteGraphTest.java @@ -5,15 +5,19 @@ import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.trader.core.*; +import ru.trader.store.simple.SimpleItem; +import ru.trader.store.simple.SimpleMarket; +import ru.trader.store.simple.SimpleOffer; +import ru.trader.store.simple.SimpleVendor; import java.util.ArrayList; public class RouteGraphTest extends Assert { private final static Logger LOG = LoggerFactory.getLogger(RouteGraphTest.class); private final static Market market = new SimpleMarket(); - private final static Item ITEM1 = new Item("ITEM1"); - private final static Item ITEM2 = new Item("ITEM2"); - private final static Item ITEM3 = new Item("ITEM3"); + private final static Item ITEM1 = new SimpleItem("ITEM1"); + private final static Item ITEM2 = new SimpleItem("ITEM2"); + private final static Item ITEM3 = new SimpleItem("ITEM3"); private static Vendor v1; private static Vendor v2; private static Vendor v3; @@ -25,16 +29,16 @@ public class RouteGraphTest extends Assert { v3 = new SimpleVendor("v3"); v4 = new SimpleVendor("v4"); - v1.add(new Offer(OFFER_TYPE.SELL, ITEM1, 100)); - v1.add(new Offer(OFFER_TYPE.SELL, ITEM2, 200)); - v1.add(new Offer(OFFER_TYPE.SELL, ITEM3, 300)); - v2.add(new Offer(OFFER_TYPE.SELL, ITEM1, 150)); - v2.add(new Offer(OFFER_TYPE.SELL, ITEM3, 320)); - v3.add(new Offer(OFFER_TYPE.SELL, ITEM3, 390)); + v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 100)); + v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM2, 200)); + v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 300)); + v2.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 150)); + v2.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 320)); + v3.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 390)); - v2.add(new Offer(OFFER_TYPE.BUY, ITEM2, 225)); - v3.add(new Offer(OFFER_TYPE.BUY, ITEM1, 200)); - v4.add(new Offer(OFFER_TYPE.BUY, ITEM3, 450)); + v2.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM2, 225)); + v3.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 200)); + v4.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM3, 450)); market.add(v1);market.add(v2);market.add(v3);market.add(v4); } diff --git a/core/src/test/java/ru/trader/graph/RouteSearcherTest.java b/core/src/test/java/ru/trader/graph/RouteSearcherTest.java index c8ec271..0bcc13e 100644 --- a/core/src/test/java/ru/trader/graph/RouteSearcherTest.java +++ b/core/src/test/java/ru/trader/graph/RouteSearcherTest.java @@ -5,7 +5,7 @@ import org.junit.Before; import org.junit.Test; import ru.trader.core.Market; import ru.trader.core.Vendor; -import ru.trader.store.Store; +import ru.trader.store.simple.Store; import java.io.InputStream; import java.util.List; diff --git a/core/src/test/java/ru/trader/store/LoadTest.java b/core/src/test/java/ru/trader/store/LoadTest.java index c337d81..c480dfa 100644 --- a/core/src/test/java/ru/trader/store/LoadTest.java +++ b/core/src/test/java/ru/trader/store/LoadTest.java @@ -6,6 +6,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xml.sax.SAXException; import ru.trader.core.Market; +import ru.trader.store.simple.Store; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; diff --git a/core/src/test/java/ru/trader/store/simple/ItemStatTest.java b/core/src/test/java/ru/trader/store/simple/ItemStatTest.java new file mode 100644 index 0000000..9538bc8 --- /dev/null +++ b/core/src/test/java/ru/trader/store/simple/ItemStatTest.java @@ -0,0 +1,51 @@ +package ru.trader.store.simple; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.trader.core.Item; +import ru.trader.core.OFFER_TYPE; + + +public class ItemStatTest extends Assert { + private final static Logger LOG = LoggerFactory.getLogger(ItemStatTest.class); + + private final static Item ITEM1 = new SimpleItem("Item1"); + + + private SimpleItemStat itemSellStat = new SimpleItemStat(ITEM1, OFFER_TYPE.SELL); + private SimpleItemStat itemBuyStat = new SimpleItemStat(ITEM1, OFFER_TYPE.BUY); + + @Before + public void fill(){ + itemSellStat.put(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 10)); + itemSellStat.put(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 20)); + itemSellStat.put(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 30)); + itemSellStat.put(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 40)); + + itemBuyStat.put(new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 100)); + itemBuyStat.put(new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 200)); + itemBuyStat.put(new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 300)); + itemBuyStat.put(new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 400)); + + } + + + @Test + public void testSell(){ + LOG.info("Start sell test"); + assertEquals(itemSellStat.getAvg(), (10+20+30+40)/4, 0); + assertEquals(itemSellStat.getBest().getPrice(), 10d, 0); + } + + @Test + public void testBuy(){ + LOG.info("Start buy test"); + assertEquals(itemBuyStat.getAvg(), (100+200+300+400)/4, 0); + assertEquals(itemBuyStat.getBest().getPrice(), 400d, 0); + } + + +} diff --git a/utils/src/main/java/ru/trader/store/XSSFImporter.java b/utils/src/main/java/ru/trader/store/XSSFImporter.java index 6c294d1..2b25608 100644 --- a/utils/src/main/java/ru/trader/store/XSSFImporter.java +++ b/utils/src/main/java/ru/trader/store/XSSFImporter.java @@ -15,6 +15,10 @@ import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; import ru.trader.core.*; +import ru.trader.store.simple.SimpleItem; +import ru.trader.store.simple.SimpleMarket; +import ru.trader.store.simple.SimpleOffer; +import ru.trader.store.simple.SimpleVendor; import java.io.File; import java.io.IOException; @@ -105,11 +109,11 @@ public class XSSFImporter { } else if (cell.row>2){ if (cell.column == 1){ LOG.trace("create item"); - item = new Item(formattedValue); + item = new SimpleItem(formattedValue); market.add(item); } else { LOG.trace("add offer"); - Offer offer = new Offer(cell.column % 2 == 0? OFFER_TYPE.BUY : OFFER_TYPE.SELL, item, Double.valueOf(formattedValue)); + Offer offer = new SimpleOffer(cell.column % 2 == 0? OFFER_TYPE.BUY : OFFER_TYPE.SELL, item, Double.valueOf(formattedValue)); vendors.get(cell.column/2 -1).add(offer); } }