Archived
0

- extract abstract classes

- move simple implementation to ru.trader.store.simple package
This commit is contained in:
iMoHax
2014-09-30 15:29:04 +04:00
parent 402351da6f
commit 1e1e41595d
28 changed files with 658 additions and 471 deletions

View File

@@ -3,9 +3,9 @@ package ru.trader;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import ru.trader.core.Market; import ru.trader.core.Market;
import ru.trader.core.MarketAnalyzer; import ru.trader.core.MarketAnalyzer;
import ru.trader.core.SimpleMarket; import ru.trader.store.simple.SimpleMarket;
import ru.trader.model.ModelFabrica; import ru.trader.model.ModelFabrica;
import ru.trader.store.Store; import ru.trader.store.simple.Store;
import ru.trader.store.XSSFImporter; import ru.trader.store.XSSFImporter;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;

View File

@@ -1,6 +1,9 @@
package ru.trader.model; package ru.trader.model;
import ru.trader.core.*; 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.lang.ref.WeakReference;
import java.util.HashMap; import java.util.HashMap;
@@ -14,7 +17,7 @@ public class ModelFabrica {
private static final HashMap<ItemStat, WeakReference<ItemStatModel>> stats = new HashMap<>(); private static final HashMap<ItemStat, WeakReference<ItemStatModel>> stats = new HashMap<>();
public static ItemModel buildItemModel(String name, MarketModel market){ 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){ 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) { 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) { public static ItemDescModel buildModel(ItemModel item, ItemStat sell, ItemStat buy, MarketModel market) {

View File

@@ -1,31 +1,19 @@
package ru.trader.core; package ru.trader.core;
public class Group { public abstract class Group {
private final String name; public abstract String getName();
private final GROUP_TYPE type; public abstract GROUP_TYPE getType();
public Group(String name, GROUP_TYPE type) {
this.name = name;
this.type = type;
}
public String getName() {
return name;
}
public boolean isMarket(){ public boolean isMarket(){
return GROUP_TYPE.MARKET.equals(type); return GROUP_TYPE.MARKET.equals(getType());
} }
public boolean isShip(){ public boolean isShip(){
return GROUP_TYPE.SHIP.equals(type); return GROUP_TYPE.SHIP.equals(getType());
} }
public boolean isOutfit(){ public boolean isOutfit(){
return GROUP_TYPE.OUTFIT.equals(type); return GROUP_TYPE.OUTFIT.equals(getType());
} }
public GROUP_TYPE getType() {
return type;
}
} }

View File

@@ -4,21 +4,13 @@ import org.jetbrains.annotations.NotNull;
import java.util.Objects; import java.util.Objects;
public class Item implements Comparable<Item>{ public abstract class Item implements Comparable<Item> {
private String name;
private Group group;
public Item(String name) { public abstract String getName();
setName(name); protected abstract void setName(String name);
}
public void setName(String name) { public abstract Group getGroup();
this.name = name; public abstract void setGroup(Group group);
}
public String getName() {
return name;
}
@Override @Override
public String toString(){ public String toString(){
@@ -29,14 +21,9 @@ public class Item implements Comparable<Item>{
public int compareTo(@NotNull Item other){ public int compareTo(@NotNull Item other){
Objects.requireNonNull(other, "Not compare with null"); Objects.requireNonNull(other, "Not compare with null");
if (this == other) return 0; 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;
}
} }

View File

@@ -1,116 +1,53 @@
package ru.trader.core; package ru.trader.core;
import org.slf4j.Logger; import java.util.ArrayList;
import org.slf4j.LoggerFactory; import java.util.Collection;
import java.util.NavigableSet;
import java.util.*; public abstract class ItemStat {
import java.util.concurrent.ConcurrentSkipListSet;
public class ItemStat { protected abstract void update(Offer offer, double price);
private final static Logger LOG = LoggerFactory.getLogger(ItemStat.class);
private final Item item; public abstract OFFER_TYPE getType();
private final OFFER_TYPE type;
private final NavigableSet<Offer> offers;
private volatile double sum;
private volatile double avg;
public abstract Item getItem();
public ItemStat(Item item, OFFER_TYPE offerType) { public abstract double getAvg();
this.offers = new ConcurrentSkipListSet<>();
this.item = item; public abstract Offer getBest();
this.type = offerType;
this.sum = 0; public abstract int getOffersCount();
this.avg = Double.NaN;
public abstract NavigableSet<Offer> 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){ @Override
LOG.trace("Put offer {} to item stat {}", offer, this); public int hashCode() {
assert offer.hasType(type) && offer.hasItem(item); int result = getItem().hashCode();
if (offers.add(offer)){ result = 31 * result + getType().hashCode();
double price = offer.getPrice(); return result;
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<Offer> 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 @Override
public String toString() { public String toString() {
final StringBuilder sb = new StringBuilder("{"); final StringBuilder sb = new StringBuilder("{");
sb.append(item); sb.append(getItem());
sb.append(", ").append(type); sb.append(", ").append(getType());
if (LOG.isTraceEnabled()){ sb.append(", avg=").append(getAvg());
sb.append(", count=").append(offers.size());
sb.append(", sum=").append(sum);
}
sb.append(", avg=").append(avg);
sb.append(", best=").append(getBest()); sb.append(", best=").append(getBest());
sb.append(", min=").append(getMin()); sb.append(", min=").append(getMin());
sb.append(", max=").append(getMax()); sb.append(", max=").append(getMax());
@@ -119,18 +56,17 @@ public class ItemStat {
return sb.toString(); return sb.toString();
} }
protected Offer getFake() {
private Offer getFake() {
return new Offer() { return new Offer() {
@Override @Override
public Item getItem() { public Item getItem() {
return item; return getItem();
} }
@Override @Override
public OFFER_TYPE getType() { public OFFER_TYPE getType() {
return type; return getType();
} }
@Override @Override
@@ -154,12 +90,12 @@ public class ItemStat {
} }
@Override @Override
void setPrice(double price) { protected void setPrice(double price) {
throw new UnsupportedOperationException("Is fake offer, change unsupported"); throw new UnsupportedOperationException("Is fake offer, change unsupported");
} }
@Override @Override
void setVendor(Vendor vendor) { protected void setVendor(Vendor vendor) {
throw new UnsupportedOperationException("Is fake offer, change unsupported"); throw new UnsupportedOperationException("Is fake offer, change unsupported");
} }
}; };
@@ -206,23 +142,35 @@ public class ItemStat {
public void setName(String name) { public void setName(String name) {
throw new UnsupportedOperationException("Is fake vendor, change unsupported"); 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;
}
} }

View File

@@ -6,102 +6,70 @@ import org.slf4j.LoggerFactory;
import java.util.Objects; import java.util.Objects;
public class Offer implements Comparable<Offer>{ public abstract class Offer implements Comparable<Offer> {
private final static Logger LOG = LoggerFactory.getLogger(Offer.class); private final static Logger LOG = LoggerFactory.getLogger(Offer.class);
private Vendor vendor; public abstract Item getItem();
private final Item item;
private final OFFER_TYPE type;
private volatile double price;
Offer(){ public abstract OFFER_TYPE getType();
item = null;
type = null;
}
public Offer(OFFER_TYPE type, Item item, double price) { public abstract double getPrice();
this.item = item; protected abstract void setPrice(double price);
this.type = type;
setPrice(price);
}
public Item getItem() { public abstract Vendor getVendor();
return item; protected abstract void setVendor(Vendor vendor);
}
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 boolean hasType(OFFER_TYPE offerType) { public boolean hasType(OFFER_TYPE offerType) {
return this.type.equals(offerType); return getType().equals(offerType);
} }
public boolean hasItem(Item item) { public boolean hasItem(Item item) {
return this.item.equals(item); return getItem().equals(item);
} }
public boolean equalsPrice(Offer offer){ public boolean equalsPrice(Offer offer){
return equalsType(offer) && price==offer.price; return equalsType(offer) && getPrice() == offer.getPrice();
} }
public boolean equalsType(Offer offer){ public boolean equalsType(Offer offer){
return offer != null && return offer != null &&
type.equals(offer.type) && getType().equals(offer.getType()) &&
item.equals(offer.item); getItem().equals(offer.getItem());
} }
@Override @Override
public int compareTo(@NotNull Offer other) { public int compareTo(@NotNull Offer other) {
Objects.requireNonNull(other, "Not compare with null"); Objects.requireNonNull(other, "Not compare with null");
if (this == other) return 0; if (this == other) return 0;
int cmp = type.compareTo(other.type); int cmp = getType().compareTo(other.getType());
if (cmp!=0) return cmp; if (cmp!=0) return cmp;
cmp = Double.compare(price, other.price); cmp = Double.compare(getPrice(), other.getPrice());
if (cmp!=0) return cmp; if (cmp!=0) return cmp;
cmp = vendor.compareTo(other.vendor); cmp = getVendor().compareTo(other.getVendor());
if (cmp!=0) return cmp; if (cmp!=0) return cmp;
return item.compareTo(other.item); return getItem().compareTo(other.getItem());
} }
public String toVString(){ public String toVString(){
return String.format("%s (%.0f)", getVendor().getName(), price); return String.format("%s (%.0f)", getVendor().getName(), getPrice());
} }
public String toIString(){ 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();
}
} }

View File

@@ -14,10 +14,18 @@ import java.util.stream.Collectors;
public abstract class Vendor implements Comparable<Vendor>, Connectable<Vendor> { public abstract class Vendor implements Comparable<Vendor>, Connectable<Vendor> {
private final static Logger LOG = LoggerFactory.getLogger(Vendor.class); private final static Logger LOG = LoggerFactory.getLogger(Vendor.class);
private String name; public abstract String getName();
private double x; public abstract void setName(String name);
private double y;
private double z; 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<Offer> getOffers(); protected abstract Collection<Offer> getOffers();
protected abstract Collection<Item> getItems(OFFER_TYPE offerType); protected abstract Collection<Item> getItems(OFFER_TYPE offerType);
@@ -26,13 +34,6 @@ public abstract class Vendor implements Comparable<Vendor>, Connectable<Vendor>
protected abstract void addOffer(Offer offer); protected abstract void addOffer(Offer offer);
protected abstract void removeOffer(Offer offer); protected abstract void removeOffer(Offer offer);
protected Vendor() {
}
protected Vendor(String name) {
this.name = name;
}
protected Collection<Offer> getOffers(OFFER_TYPE offerType){ protected Collection<Offer> getOffers(OFFER_TYPE offerType){
List<Offer> offers = getOffers() List<Offer> offers = getOffers()
.stream() .stream()
@@ -74,7 +75,6 @@ public abstract class Vendor implements Comparable<Vendor>, Connectable<Vendor>
LOG.trace("Add offer {} to vendor {}", offer, this); LOG.trace("Add offer {} to vendor {}", offer, this);
offer.setVendor(this); offer.setVendor(this);
addOffer(offer); addOffer(offer);
} }
public final void remove(Offer offer){ public final void remove(Offer offer){
@@ -83,7 +83,6 @@ public abstract class Vendor implements Comparable<Vendor>, Connectable<Vendor>
removeOffer(offer); removeOffer(offer);
} }
public final Collection<Item> getSellItems() { public final Collection<Item> getSellItems() {
return getItems(OFFER_TYPE.SELL); return getItems(OFFER_TYPE.SELL);
} }
@@ -92,14 +91,6 @@ public abstract class Vendor implements Comparable<Vendor>, Connectable<Vendor>
return getItems(OFFER_TYPE.BUY); return getItems(OFFER_TYPE.BUY);
} }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override @Override
public String toString() { public String toString() {
return getName(); return getName();
@@ -109,12 +100,14 @@ public abstract class Vendor implements Comparable<Vendor>, Connectable<Vendor>
public int compareTo(@NotNull Vendor other) { public int compareTo(@NotNull Vendor other) {
Objects.requireNonNull(other, "Not compare with null"); Objects.requireNonNull(other, "Not compare with null");
if (this == other) return 0; 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 @Override
public double getDistance(Vendor other){ public double getDistance(Vendor other){
return getDistance(other.x, other.y, other.z); return getDistance(other.getX(), other.getY(), other.getZ());
} }
@Override @Override
@@ -123,31 +116,8 @@ public abstract class Vendor implements Comparable<Vendor>, Connectable<Vendor>
} }
public double getDistance(double x, double y, double z){ 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;
}
} }

View File

@@ -1,4 +1,4 @@
package ru.trader.store; package ru.trader.store.simple;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -9,7 +9,6 @@ import org.xml.sax.helpers.DefaultHandler;
import ru.trader.core.*; import ru.trader.core.*;
import java.util.HashMap; import java.util.HashMap;
import java.util.OptionalLong;
public class MarketDocHandler extends DefaultHandler { public class MarketDocHandler extends DefaultHandler {
private final static Logger LOG = LoggerFactory.getLogger(MarketDocHandler.class); 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){ 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); curVendor.add(offer);
} }
@@ -116,14 +115,14 @@ public class MarketDocHandler extends DefaultHandler {
} }
protected void onItem(String name, String id) { protected void onItem(String name, String id) {
Item item = new Item(name); Item item = new SimpleItem(name);
item.setGroup(curGroup); item.setGroup(curGroup);
world.add(item); world.add(item);
items.put(id, item); items.put(id, item);
} }
protected void onGroup(String name, GROUP_TYPE type) { protected void onGroup(String name, GROUP_TYPE type) {
curGroup = new Group(name, type); curGroup = new SimpleGroup(name, type);
} }
public Market getWorld(){ public Market getWorld(){

View File

@@ -1,4 +1,4 @@
package ru.trader.store; package ru.trader.store.simple;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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<Offer> 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<Offer> 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();
}
}

View File

@@ -1,4 +1,6 @@
package ru.trader.core; package ru.trader.store.simple;
import ru.trader.core.*;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -8,8 +10,8 @@ public class SimpleMarket extends MarketSupport {
protected List<Item> items; protected List<Item> items;
//caching //caching
private final Map<Item,ItemStat> sellItems = new HashMap<>(); private final Map<Item,SimpleItemStat> sellItems = new HashMap<>();
private final Map<Item,ItemStat> buyItems = new HashMap<>(); private final Map<Item,SimpleItemStat> buyItems = new HashMap<>();
public SimpleMarket() { public SimpleMarket() {
init(); init();
@@ -20,7 +22,7 @@ public class SimpleMarket extends MarketSupport {
items = new ArrayList<>(); items = new ArrayList<>();
} }
private Map<Item,ItemStat> getItemCache(OFFER_TYPE offerType){ private Map<Item,SimpleItemStat> getItemCache(OFFER_TYPE offerType){
switch (offerType) { switch (offerType) {
case SELL: return sellItems; case SELL: return sellItems;
case BUY: return buyItems; case BUY: return buyItems;
@@ -29,23 +31,19 @@ public class SimpleMarket extends MarketSupport {
} }
} }
private void put(Map<Item, ItemStat> cache, Offer offer){ private void put(Map<Item, SimpleItemStat> cache, Offer offer){
Item item = offer.getItem(); Item item = offer.getItem();
ItemStat entry = cache.get(item); SimpleItemStat entry = cache.get(item);
if (entry==null){ if (entry==null){
entry = newItemStat(item, offer.getType()); entry = new SimpleItemStat(item, offer.getType());
cache.put(item, entry); cache.put(item, entry);
} }
entry.put(offer); entry.put(offer);
} }
protected ItemStat newItemStat(Item item, OFFER_TYPE offerType){ private void remove(Map<Item, SimpleItemStat> cache, Offer offer){
return new ItemStat(item, offerType);
}
private void remove(Map<Item, ItemStat> cache, Offer offer){
Item item = offer.getItem(); Item item = offer.getItem();
ItemStat entry = cache.get(item); SimpleItemStat entry = cache.get(item);
if (entry!=null){ if (entry!=null){
entry.remove(offer); entry.remove(offer);
if (entry.getOffersCount()==0) if (entry.getOffersCount()==0)
@@ -114,7 +112,7 @@ public class SimpleMarket extends MarketSupport {
@Override @Override
public ItemStat getStat(OFFER_TYPE offerType, Item item) { public ItemStat getStat(OFFER_TYPE offerType, Item item) {
ItemStat entry = getItemCache(offerType).get(item); ItemStat entry = getItemCache(offerType).get(item);
return entry!=null ? entry : newItemStat(item, offerType); return entry != null ? entry : new SimpleItemStat(item, offerType);
} }
@Override @Override

View File

@@ -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;
}
}

View File

@@ -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.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
public class SimpleVendor extends Vendor { public class SimpleVendor extends Vendor {
private String name;
private double x;
private double y;
private double z;
protected Map<Item, Offer> sell; protected Map<Item, Offer> sell;
protected Map<Item, Offer> buy; protected Map<Item, Offer> buy;
public SimpleVendor() { public SimpleVendor() {
super();
initOffers(); initOffers();
} }
public SimpleVendor(String name) { public SimpleVendor(String name) {
super(name); this.name = name;
initOffers(); initOffers();
} }
@@ -23,6 +31,46 @@ public class SimpleVendor extends Vendor {
buy = new ConcurrentHashMap<>(20, 0.9f, 2); 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 @Override
protected Collection<Offer> getOffers(OFFER_TYPE offerType) { protected Collection<Offer> getOffers(OFFER_TYPE offerType) {
switch (offerType) { switch (offerType) {

View File

@@ -1,4 +1,4 @@
package ru.trader.store; package ru.trader.store.simple;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@@ -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);
}
}

View File

@@ -8,6 +8,10 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import ru.trader.TestUtil; import ru.trader.TestUtil;
import ru.trader.graph.Path; 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; import java.util.Collection;
@@ -26,9 +30,9 @@ public class MarketAnalyzerTest extends Assert {
private static Vendor v9; private static Vendor v9;
private static Vendor v10; private static Vendor v10;
private static Vendor v11; private static Vendor v11;
private static Item ITEM1 = new Item("ITEM1"); private static Item ITEM1 = new SimpleItem("ITEM1");
private static Item ITEM2 = new Item("ITEM2"); private static Item ITEM2 = new SimpleItem("ITEM2");
private static Item ITEM3 = new Item("ITEM3"); private static Item ITEM3 = new SimpleItem("ITEM3");
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
@@ -69,19 +73,19 @@ public class MarketAnalyzerTest extends Assert {
market.add(v10); market.add(v10);
market.add(v11); market.add(v11);
market.add(v6, new Offer(OFFER_TYPE.SELL, ITEM1, 100)); market.add(v6, new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 100));
market.add(v7, new Offer(OFFER_TYPE.SELL, ITEM1, 100)); market.add(v7, new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 100));
market.add(v9, new Offer(OFFER_TYPE.SELL, ITEM1, 100)); market.add(v9, new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 100));
market.add(v10, new Offer(OFFER_TYPE.SELL, ITEM1, 100)); market.add(v10, new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 100));
market.add(v6, new Offer(OFFER_TYPE.BUY, ITEM1, 50)); market.add(v6, new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 50));
market.add(v7, new Offer(OFFER_TYPE.BUY, ITEM1, 120)); market.add(v7, new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 120));
market.add(v9, new Offer(OFFER_TYPE.BUY, ITEM1, 200)); market.add(v9, new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 200));
market.add(v10, new Offer(OFFER_TYPE.BUY, ITEM1, 150)); market.add(v10, new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 150));
market.add(v9, new Offer(OFFER_TYPE.SELL, ITEM2, 100)); market.add(v9, new SimpleOffer(OFFER_TYPE.SELL, ITEM2, 100));
market.add(v6, new Offer(OFFER_TYPE.BUY, ITEM2, 140)); market.add(v6, new SimpleOffer(OFFER_TYPE.BUY, ITEM2, 140));
market.add(v7, new Offer(OFFER_TYPE.SELL, ITEM3, 154)); market.add(v7, new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 154));
market.add(v10, new Offer(OFFER_TYPE.BUY, ITEM3, 140)); market.add(v10, new SimpleOffer(OFFER_TYPE.BUY, ITEM3, 140));
market.add(v11, new Offer(OFFER_TYPE.BUY, ITEM3, 500)); market.add(v11, new SimpleOffer(OFFER_TYPE.BUY, ITEM3, 500));
} }

View File

@@ -5,7 +5,7 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import ru.trader.TestUtil; import ru.trader.TestUtil;
import ru.trader.graph.PathRoute; import ru.trader.graph.PathRoute;
import ru.trader.store.Store; import ru.trader.store.simple.Store;
import java.io.InputStream; import java.io.InputStream;
import java.util.Collection; import java.util.Collection;
import java.util.Optional; import java.util.Optional;

View File

@@ -5,22 +5,26 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; 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 { public class MarketTest1 extends Assert {
private final static Logger LOG = LoggerFactory.getLogger(MarketTest1.class); private final static Logger LOG = LoggerFactory.getLogger(MarketTest1.class);
private final static Item ITEM1 = new Item("Item1"); private final static Item ITEM1 = new SimpleItem("Item1");
private final static Item ITEM2 = new Item("Item2"); private final static Item ITEM2 = new SimpleItem("Item2");
private final static Item ITEM3 = new Item("Item3"); private final static Item ITEM3 = new SimpleItem("Item3");
private final static Offer bestSellOffer1 = new Offer(OFFER_TYPE.SELL,ITEM1,10); private final static Offer bestSellOffer1 = new SimpleOffer(OFFER_TYPE.SELL,ITEM1,10);
private final static Offer bestSellOffer2 = new Offer(OFFER_TYPE.SELL,ITEM2,15); private final static Offer bestSellOffer2 = new SimpleOffer(OFFER_TYPE.SELL,ITEM2,15);
private final static Offer bestSellOffer3 = new Offer(OFFER_TYPE.SELL,ITEM3,20); 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 bestBuyOffer1 = new SimpleOffer(OFFER_TYPE.BUY,ITEM1,100);
private final static Offer bestBuyOffer2 = new Offer(OFFER_TYPE.BUY,ITEM2,200); private final static Offer bestBuyOffer2 = new SimpleOffer(OFFER_TYPE.BUY,ITEM2,200);
private final static Offer bestBuyOffer3 = new Offer(OFFER_TYPE.BUY,ITEM3,100); private final static Offer bestBuyOffer3 = new SimpleOffer(OFFER_TYPE.BUY,ITEM3,100);
private final static Offer bestBuyOffer4 = new Offer(OFFER_TYPE.BUY,ITEM2,150); private final static Offer bestBuyOffer4 = new SimpleOffer(OFFER_TYPE.BUY,ITEM2,150);
private final static Vendor sellVendor1 = new SimpleVendor(); private final static Vendor sellVendor1 = new SimpleVendor();
@@ -37,22 +41,22 @@ public class MarketTest1 extends Assert {
@Before @Before
public void fillMarket(){ public void fillMarket(){
sellVendor1.add(bestSellOffer1); sellVendor1.add(bestSellOffer1);
sellVendor1.add(new Offer(OFFER_TYPE.SELL,ITEM2,100)); sellVendor1.add(new SimpleOffer(OFFER_TYPE.SELL,ITEM2,100));
sellVendor2.add(new Offer(OFFER_TYPE.SELL,ITEM3,200)); sellVendor2.add(new SimpleOffer(OFFER_TYPE.SELL,ITEM3,200));
sellVendor2.add(bestSellOffer2); sellVendor2.add(bestSellOffer2);
sellVendor3.add(new Offer(OFFER_TYPE.SELL,ITEM1,300)); sellVendor3.add(new SimpleOffer(OFFER_TYPE.SELL,ITEM1,300));
sellVendor3.add(new Offer(OFFER_TYPE.SELL,ITEM2,300)); sellVendor3.add(new SimpleOffer(OFFER_TYPE.SELL,ITEM2,300));
sellVendor3.add(bestSellOffer3); 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); 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(bestBuyOffer2);
buyVendor2.add(new Offer(OFFER_TYPE.BUY,ITEM3,50)); buyVendor2.add(new SimpleOffer(OFFER_TYPE.BUY,ITEM3,50));
buyVendor3.add(bestBuyOffer3); buyVendor3.add(bestBuyOffer3);
buyVendor3.add(new Offer(OFFER_TYPE.BUY,ITEM2,20)); buyVendor3.add(new SimpleOffer(OFFER_TYPE.BUY,ITEM2,20));
buyVendor4.add(new Offer(OFFER_TYPE.BUY,ITEM1,80)); buyVendor4.add(new SimpleOffer(OFFER_TYPE.BUY,ITEM1,80));
buyVendor4.add(bestBuyOffer4); buyVendor4.add(bestBuyOffer4);
market = new SimpleMarket(); market = new SimpleMarket();

View File

@@ -5,15 +5,18 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; 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 { public class VendorTest extends Assert {
private final static Logger LOG = LoggerFactory.getLogger(VendorTest.class); private final static Logger LOG = LoggerFactory.getLogger(VendorTest.class);
private final static Item ITEM1 = new Item("Item1"); private final static Item ITEM1 = new SimpleItem("Item1");
private final static Item ITEM2 = new Item("Item2"); private final static Item ITEM2 = new SimpleItem("Item2");
private final static Offer SELL_OFFER = new Offer(OFFER_TYPE.SELL, ITEM1, 10); private final static Offer SELL_OFFER = new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 10);
private final static Offer BUY_OFFER = new Offer(OFFER_TYPE.BUY, ITEM1, 10); private final static Offer BUY_OFFER = new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 10);
private Vendor sellVendor; private Vendor sellVendor;
private Vendor buyVendor; private Vendor buyVendor;

View File

@@ -6,24 +6,27 @@ import org.junit.Test;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import ru.trader.TestUtil; 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; import java.util.Collection;
public class VendorTest2 extends Assert { public class VendorTest2 extends Assert {
private final static Logger LOG = LoggerFactory.getLogger(VendorTest2.class); private final static Logger LOG = LoggerFactory.getLogger(VendorTest2.class);
private final static Item ITEM1 = new Item("Item1"); private final static Item ITEM1 = new SimpleItem("Item1");
private final static Item ITEM2 = new Item("Item2"); private final static Item ITEM2 = new SimpleItem("Item2");
private final static Item ITEM3 = new Item("Item3"); private final static Item ITEM3 = new SimpleItem("Item3");
private final static Offer SELL_OFFER1 = new Offer(OFFER_TYPE.SELL, ITEM1, 10); private final static Offer SELL_OFFER1 = new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 10);
private final static Offer SELL_OFFER2 = new Offer(OFFER_TYPE.SELL, ITEM2, 10); private final static Offer SELL_OFFER2 = new SimpleOffer(OFFER_TYPE.SELL, ITEM2, 10);
private final static Offer SELL_OFFER3 = new Offer(OFFER_TYPE.SELL, ITEM3, 10); private final static Offer SELL_OFFER3 = new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 10);
private final static Offer DUBLE_SELL_OFFER1 = new Offer(OFFER_TYPE.SELL, ITEM1, 100); 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_OFFER1 = new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 100);
private final static Offer BUY_OFFER2 = new Offer(OFFER_TYPE.BUY, ITEM2, 10); private final static Offer BUY_OFFER2 = new SimpleOffer(OFFER_TYPE.BUY, ITEM2, 10);
private final static Offer BUY_OFFER3 = new Offer(OFFER_TYPE.BUY, ITEM3, 10); private final static Offer BUY_OFFER3 = new SimpleOffer(OFFER_TYPE.BUY, ITEM3, 10);
private final static Offer DUBLE_BUY_OFFER1 = new Offer(OFFER_TYPE.BUY, ITEM1, 10); private final static Offer DUBLE_BUY_OFFER1 = new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 10);
private Vendor sellVendor; private Vendor sellVendor;

View File

@@ -6,15 +6,18 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import ru.trader.TestUtil; import ru.trader.TestUtil;
import ru.trader.core.*; 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; import java.util.Collection;
public class PathRouteTest extends Assert { public class PathRouteTest extends Assert {
private final static Logger LOG = LoggerFactory.getLogger(PathRouteTest.class); private final static Logger LOG = LoggerFactory.getLogger(PathRouteTest.class);
private final static Item ITEM1 = new Item("ITEM1"); private final static Item ITEM1 = new SimpleItem("ITEM1");
private final static Item ITEM2 = new Item("ITEM2"); private final static Item ITEM2 = new SimpleItem("ITEM2");
private final static Item ITEM3 = new Item("ITEM3"); private final static Item ITEM3 = new SimpleItem("ITEM3");
private static Vendor v1; private static Vendor v1;
private static Vendor v2; private static Vendor v2;
private static Vendor v3; private static Vendor v3;
@@ -26,12 +29,12 @@ public class PathRouteTest extends Assert {
v1 = new SimpleVendor("v1"); v1 = new SimpleVendor("v1");
v2 = new SimpleVendor("v2"); v2 = new SimpleVendor("v2");
v1.add(new Offer(OFFER_TYPE.SELL, ITEM1, 100)); v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 100));
v1.add(new Offer(OFFER_TYPE.SELL, ITEM2, 200)); v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM2, 200));
v1.add(new Offer(OFFER_TYPE.SELL, ITEM3, 300)); v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 300));
v2.add(new Offer(OFFER_TYPE.BUY, ITEM1, 300)); v2.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 300));
v2.add(new Offer(OFFER_TYPE.BUY, ITEM2, 350)); v2.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM2, 350));
v2.add(new Offer(OFFER_TYPE.BUY, ITEM3, 400)); v2.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM3, 400));
PathRoute res = new PathRoute(new Vertex<>(v1)); PathRoute res = new PathRoute(new Vertex<>(v1));
res = (PathRoute) res.connectTo(new Vertex<>(v2), false); res = (PathRoute) res.connectTo(new Vertex<>(v2), false);
@@ -67,12 +70,12 @@ public class PathRouteTest extends Assert {
v2 = new SimpleVendor("v2"); v2 = new SimpleVendor("v2");
v3 = new SimpleVendor("v3"); v3 = new SimpleVendor("v3");
v1.add(new Offer(OFFER_TYPE.SELL, ITEM1, 100)); v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 100));
v1.add(new Offer(OFFER_TYPE.SELL, ITEM3, 300)); v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 300));
v2.add(new Offer(OFFER_TYPE.SELL, ITEM2, 200)); v2.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM2, 200));
v3.add(new Offer(OFFER_TYPE.BUY, ITEM1, 300)); v3.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 300));
v3.add(new Offer(OFFER_TYPE.BUY, ITEM2, 350)); v3.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM2, 350));
v3.add(new Offer(OFFER_TYPE.BUY, ITEM3, 400)); v3.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM3, 400));
PathRoute res = new PathRoute(new Vertex<>(v1)); PathRoute res = new PathRoute(new Vertex<>(v1));
res = (PathRoute) res.connectTo(new Vertex<>(v2), false); res = (PathRoute) res.connectTo(new Vertex<>(v2), false);
@@ -115,16 +118,16 @@ public class PathRouteTest extends Assert {
v3 = new SimpleVendor("v3"); v3 = new SimpleVendor("v3");
v4 = new SimpleVendor("v4"); v4 = new SimpleVendor("v4");
v1.add(new Offer(OFFER_TYPE.SELL, ITEM1, 100)); v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 100));
v1.add(new Offer(OFFER_TYPE.SELL, ITEM2, 200)); v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM2, 200));
v1.add(new Offer(OFFER_TYPE.SELL, ITEM3, 300)); v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 300));
v2.add(new Offer(OFFER_TYPE.SELL, ITEM1, 150)); v2.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 150));
v2.add(new Offer(OFFER_TYPE.SELL, ITEM3, 320)); v2.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 320));
v3.add(new Offer(OFFER_TYPE.SELL, ITEM3, 390)); v3.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 390));
v2.add(new Offer(OFFER_TYPE.BUY, ITEM2, 225)); v2.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM2, 225));
v3.add(new Offer(OFFER_TYPE.BUY, ITEM1, 200)); v3.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 200));
v4.add(new Offer(OFFER_TYPE.BUY, ITEM3, 450)); v4.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM3, 450));
PathRoute res = new PathRoute(new Vertex<>(v1)); PathRoute res = new PathRoute(new Vertex<>(v1));
res = (PathRoute) res.connectTo(new Vertex<>(v2), false); res = (PathRoute) res.connectTo(new Vertex<>(v2), false);
@@ -179,16 +182,16 @@ public class PathRouteTest extends Assert {
v4 = new SimpleVendor("v4"); v4 = new SimpleVendor("v4");
v5 = new SimpleVendor("v5"); v5 = new SimpleVendor("v5");
v1.add(new Offer(OFFER_TYPE.SELL, ITEM1, 410)); v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 410));
v1.add(new Offer(OFFER_TYPE.SELL, ITEM2, 200)); v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM2, 200));
v1.add(new Offer(OFFER_TYPE.SELL, ITEM3, 300)); v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 300));
v2.add(new Offer(OFFER_TYPE.SELL, ITEM2, 270)); v2.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM2, 270));
v4.add(new Offer(OFFER_TYPE.SELL, ITEM1, 300)); v4.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 300));
v2.add(new Offer(OFFER_TYPE.BUY, ITEM1, 470)); v2.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 470));
v3.add(new Offer(OFFER_TYPE.BUY, ITEM2, 300)); v3.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM2, 300));
v4.add(new Offer(OFFER_TYPE.BUY, ITEM3, 370)); v4.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM3, 370));
v5.add(new Offer(OFFER_TYPE.BUY, ITEM1, 400)); v5.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 400));
PathRoute res = new PathRoute(new Vertex<>(v1)); PathRoute res = new PathRoute(new Vertex<>(v1));
res = (PathRoute) res.connectTo(new Vertex<>(v2), false); res = (PathRoute) res.connectTo(new Vertex<>(v2), false);
@@ -251,16 +254,16 @@ public class PathRouteTest extends Assert {
v3 = new SimpleVendor("v3"); v3 = new SimpleVendor("v3");
v4 = new SimpleVendor("v4"); v4 = new SimpleVendor("v4");
v1.add(new Offer(OFFER_TYPE.SELL, ITEM1, 100)); v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 100));
v1.add(new Offer(OFFER_TYPE.SELL, ITEM2, 200)); v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM2, 200));
v1.add(new Offer(OFFER_TYPE.SELL, ITEM3, 300)); v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 300));
v2.add(new Offer(OFFER_TYPE.SELL, ITEM1, 150)); v2.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 150));
v2.add(new Offer(OFFER_TYPE.SELL, ITEM3, 320)); v2.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 320));
v3.add(new Offer(OFFER_TYPE.SELL, ITEM3, 390)); v3.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 390));
v2.add(new Offer(OFFER_TYPE.BUY, ITEM2, 225)); v2.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM2, 225));
v3.add(new Offer(OFFER_TYPE.BUY, ITEM1, 200)); v3.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 200));
v4.add(new Offer(OFFER_TYPE.BUY, ITEM3, 450)); v4.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM3, 450));
PathRoute res = new PathRoute(new Vertex<>(v1)); PathRoute res = new PathRoute(new Vertex<>(v1));
res = (PathRoute) res.connectTo(new Vertex<>(v2), false); res = (PathRoute) res.connectTo(new Vertex<>(v2), false);
@@ -314,13 +317,13 @@ public class PathRouteTest extends Assert {
v1 = new SimpleVendor("v1"); v1 = new SimpleVendor("v1");
v2 = new SimpleVendor("v2"); v2 = new SimpleVendor("v2");
v1.add(new Offer(OFFER_TYPE.SELL, ITEM1, 100)); v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 100));
v1.add(new Offer(OFFER_TYPE.SELL, ITEM2, 200)); v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM2, 200));
v1.add(new Offer(OFFER_TYPE.SELL, ITEM3, 300)); v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 300));
v2.add(new Offer(OFFER_TYPE.SELL, ITEM1, 150)); v2.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 150));
v2.add(new Offer(OFFER_TYPE.SELL, ITEM3, 320)); 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)); PathRoute res = new PathRoute(new Vertex<>(v1));
res = (PathRoute) res.connectTo(new Vertex<>(v2), false); res = (PathRoute) res.connectTo(new Vertex<>(v2), false);
@@ -334,10 +337,10 @@ public class PathRouteTest extends Assert {
v3 = new SimpleVendor("v3"); v3 = new SimpleVendor("v3");
v4 = new SimpleVendor("v4"); 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)); v3.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 200));
v4.add(new Offer(OFFER_TYPE.BUY, ITEM3, 450)); v4.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM3, 450));
PathRoute res = new PathRoute(new Vertex<>(v2)); PathRoute res = new PathRoute(new Vertex<>(v2));
res = (PathRoute) res.connectTo(new Vertex<>(v3), false); res = (PathRoute) res.connectTo(new Vertex<>(v3), false);

View File

@@ -5,15 +5,19 @@ import org.junit.Test;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import ru.trader.core.*; 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; import java.util.ArrayList;
public class RouteGraphTest extends Assert { public class RouteGraphTest extends Assert {
private final static Logger LOG = LoggerFactory.getLogger(RouteGraphTest.class); private final static Logger LOG = LoggerFactory.getLogger(RouteGraphTest.class);
private final static Market market = new SimpleMarket(); private final static Market market = new SimpleMarket();
private final static Item ITEM1 = new Item("ITEM1"); private final static Item ITEM1 = new SimpleItem("ITEM1");
private final static Item ITEM2 = new Item("ITEM2"); private final static Item ITEM2 = new SimpleItem("ITEM2");
private final static Item ITEM3 = new Item("ITEM3"); private final static Item ITEM3 = new SimpleItem("ITEM3");
private static Vendor v1; private static Vendor v1;
private static Vendor v2; private static Vendor v2;
private static Vendor v3; private static Vendor v3;
@@ -25,16 +29,16 @@ public class RouteGraphTest extends Assert {
v3 = new SimpleVendor("v3"); v3 = new SimpleVendor("v3");
v4 = new SimpleVendor("v4"); v4 = new SimpleVendor("v4");
v1.add(new Offer(OFFER_TYPE.SELL, ITEM1, 100)); v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 100));
v1.add(new Offer(OFFER_TYPE.SELL, ITEM2, 200)); v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM2, 200));
v1.add(new Offer(OFFER_TYPE.SELL, ITEM3, 300)); v1.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 300));
v2.add(new Offer(OFFER_TYPE.SELL, ITEM1, 150)); v2.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM1, 150));
v2.add(new Offer(OFFER_TYPE.SELL, ITEM3, 320)); v2.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 320));
v3.add(new Offer(OFFER_TYPE.SELL, ITEM3, 390)); v3.add(new SimpleOffer(OFFER_TYPE.SELL, ITEM3, 390));
v2.add(new Offer(OFFER_TYPE.BUY, ITEM2, 225)); v2.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM2, 225));
v3.add(new Offer(OFFER_TYPE.BUY, ITEM1, 200)); v3.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM1, 200));
v4.add(new Offer(OFFER_TYPE.BUY, ITEM3, 450)); v4.add(new SimpleOffer(OFFER_TYPE.BUY, ITEM3, 450));
market.add(v1);market.add(v2);market.add(v3);market.add(v4); market.add(v1);market.add(v2);market.add(v3);market.add(v4);
} }

View File

@@ -5,7 +5,7 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import ru.trader.core.Market; import ru.trader.core.Market;
import ru.trader.core.Vendor; import ru.trader.core.Vendor;
import ru.trader.store.Store; import ru.trader.store.simple.Store;
import java.io.InputStream; import java.io.InputStream;
import java.util.List; import java.util.List;

View File

@@ -6,6 +6,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import ru.trader.core.Market; import ru.trader.core.Market;
import ru.trader.store.simple.Store;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException; import java.io.IOException;

View File

@@ -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);
}
}

View File

@@ -15,6 +15,10 @@ import org.xml.sax.SAXException;
import org.xml.sax.XMLReader; import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory; import org.xml.sax.helpers.XMLReaderFactory;
import ru.trader.core.*; 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.File;
import java.io.IOException; import java.io.IOException;
@@ -105,11 +109,11 @@ public class XSSFImporter {
} else if (cell.row>2){ } else if (cell.row>2){
if (cell.column == 1){ if (cell.column == 1){
LOG.trace("create item"); LOG.trace("create item");
item = new Item(formattedValue); item = new SimpleItem(formattedValue);
market.add(item); market.add(item);
} else { } else {
LOG.trace("add offer"); 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); vendors.get(cell.column/2 -1).add(offer);
} }
} }