Skip to content

Commit f3df443

Browse files
committed
Added trading logic
1 parent 951c0db commit f3df443

File tree

8 files changed

+174
-0
lines changed

8 files changed

+174
-0
lines changed

src/main/java/com/redislabs/demos/redisbank/Utilities.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,28 @@ private static final void appendDigits(StringBuilder builder, SecureRandom rando
4848

4949
}
5050

51+
public static final String generatePortfolioIdFrom(String userName) {
52+
if (StringUtils.isEmpty(userName)) {
53+
throw new IllegalArgumentException("Parameter userName should have a value");
54+
}
55+
56+
try {
57+
// Set the seed of the pseudo random generator to the username,
58+
// so we always get the same sequence for the same username
59+
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
60+
random.setSeed(userName.getBytes("UTF-8"));
61+
62+
StringBuilder builder = new StringBuilder();
63+
builder.append("NL");
64+
appendDigits(builder, random, 2);
65+
builder.append("RBINV");
66+
appendDigits(builder, random, 5);
67+
68+
return builder.toString();
69+
} catch (Exception e) {
70+
throw new RuntimeException(e);
71+
}
72+
73+
}
74+
5175
}

src/main/java/com/redislabs/demos/redisbank/investments/StockPortfolio.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,7 @@ public class StockPortfolio {
1818
@Id
1919
private Long id;
2020
private HashMap<Stock, Double> stocks = new HashMap<>();
21+
private String portfolioId;
22+
private String portfolioHolderName;
2123

2224
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.redislabs.demos.redisbank.investments;
2+
3+
import java.io.UnsupportedEncodingException;
4+
import java.security.NoSuchAlgorithmException;
5+
import java.security.SecureRandom;
6+
import java.text.DateFormat;
7+
import java.text.NumberFormat;
8+
import java.text.SimpleDateFormat;
9+
import java.util.ArrayList;
10+
import java.util.Date;
11+
import java.util.List;
12+
13+
import com.redislabs.demos.redisbank.SerializationUtil;
14+
import com.redislabs.demos.redisbank.Utilities;
15+
16+
public class StockPortfolioGenerator {
17+
18+
private List<Stock> stocks = new ArrayList<>();
19+
private final StockPortfolio spf;
20+
private final SecureRandom random;
21+
private final DateFormat df = new SimpleDateFormat("yyyy.MM.dd 'at' HH:mm:ss");
22+
private final NumberFormat nf = NumberFormat.getCurrencyInstance();
23+
private final TradeRepository tr;
24+
private final StockPortfolioRepository spr;
25+
26+
public StockPortfolioGenerator(TradeRepository tr, StockPortfolioRepository spr)
27+
throws NoSuchAlgorithmException, UnsupportedEncodingException {
28+
this.random = SecureRandom.getInstance("SHA1PRNG");
29+
this.random.setSeed("lars".getBytes("UTF-8")); // Prime the RNG so it always generates the same pseudorandom set
30+
this.stocks = SerializationUtil.loadObjectList(Stock.class, "/stocks.csv");
31+
this.spf = generatePortfolioFor("lars");
32+
this.tr = tr;
33+
this.spr = spr;
34+
generateTrades(this.spf);
35+
}
36+
37+
private StockPortfolio generatePortfolioFor(String userName) {
38+
39+
StockPortfolio spf = new StockPortfolio();
40+
41+
for (Stock stock : stocks) {
42+
spf.getStocks().put(stock, 100.0);
43+
}
44+
45+
spf.setPortfolioHolderName("userName");
46+
spf.setPortfolioId(Utilities.generatePortfolioIdFrom(userName));
47+
spr.save(spf);
48+
return spf;
49+
}
50+
51+
private void generateTrades(StockPortfolio spf) {
52+
for (Stock stock : spf.getStocks().keySet()) {
53+
Double amountLeft = spf.getStocks().get(stock).doubleValue();
54+
int amountToSell = this.random.nextInt(10);
55+
Trade trade = new Trade();
56+
trade.setAmount(amountToSell);
57+
trade.setCreatedDate(df.format(new Date()));
58+
trade.setFromPortfolio(Utilities.generatePortfolioIdFrom(spf.getPortfolioHolderName()));
59+
trade.setFromPortfolioName(spf.getPortfolioHolderName());
60+
trade.setStock(stock);
61+
tr.save(trade);
62+
amountLeft = amountLeft - amountToSell;
63+
spf.getStocks().put(stock, amountLeft);
64+
}
65+
spr.save(spf);
66+
}
67+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.redislabs.demos.redisbank.investments;
2+
3+
import org.springframework.data.repository.CrudRepository;
4+
5+
public interface StockPortfolioRepository extends CrudRepository<StockPortfolio, String> {
6+
7+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.redislabs.demos.redisbank.investments;
2+
3+
import org.springframework.data.annotation.Id;
4+
import org.springframework.data.redis.core.RedisHash;
5+
6+
import lombok.AllArgsConstructor;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
10+
@Data
11+
@NoArgsConstructor
12+
@AllArgsConstructor
13+
@RedisHash
14+
public class Trade {
15+
16+
@Id
17+
private Long id;
18+
private Stock stock;
19+
private int amount;
20+
private String fromPortfolio;
21+
private String fromPortfolioName;
22+
private String toPortfolio;
23+
private String toPortfolioName;
24+
private String createdDate;
25+
private String settledDate;
26+
private String settledBy;
27+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.redislabs.demos.redisbank.investments;
2+
3+
import java.text.DateFormat;
4+
import java.text.SimpleDateFormat;
5+
import java.util.Date;
6+
import java.util.Optional;
7+
8+
public class TradeController {
9+
10+
private final DateFormat df = new SimpleDateFormat("yyyy.MM.dd 'at' HH:mm:ss");
11+
private final TradeRepository tr;
12+
13+
public TradeController(TradeRepository tr) {
14+
this.tr = tr;
15+
}
16+
17+
public void settleTrade(String tradeId) {
18+
Optional<Trade> tradeMaybe = tr.findById(tradeId);
19+
20+
if (tradeMaybe.isPresent()) {
21+
Trade trade = tradeMaybe.get();
22+
trade.setSettledBy("Trading desk");
23+
trade.setSettledDate(df.format(new Date()));
24+
tr.save(trade);
25+
}else{
26+
// Trade not found
27+
}
28+
29+
}
30+
31+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.redislabs.demos.redisbank.investments;
2+
3+
import org.springframework.data.repository.CrudRepository;
4+
5+
public interface TradeRepository extends CrudRepository<Trade, String>{
6+
7+
}

src/main/resources/stocks.csv

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
id,name
2+
1,BMW
3+
2,Philips
4+
3,Redis Labs
5+
4,VMware
6+
5,Pivotal
7+
6,Dell
8+
7,Aegon
9+
8,ASML

0 commit comments

Comments
 (0)