Skip to content
This repository has been archived by the owner on Dec 14, 2021. It is now read-only.

Commit

Permalink
Added the Portfolio listeners for the query side to the code base
Browse files Browse the repository at this point in the history
  • Loading branch information
jettro committed Nov 15, 2011
1 parent 63aac8b commit 2803017
Show file tree
Hide file tree
Showing 9 changed files with 493 additions and 11 deletions.
Expand Up @@ -43,23 +43,23 @@ public String getIdentifier() {
return identifier; return identifier;
} }


void setIdentifier(String identifier) { public void setIdentifier(String identifier) {
this.identifier = identifier; this.identifier = identifier;
} }


public String getCompanyIdentifier() { public String getCompanyIdentifier() {
return companyIdentifier; return companyIdentifier;
} }


void setCompanyIdentifier(String companyIdentifier) { public void setCompanyIdentifier(String companyIdentifier) {
this.companyIdentifier = companyIdentifier; this.companyIdentifier = companyIdentifier;
} }


public String getCompanyName() { public String getCompanyName() {
return companyName; return companyName;
} }


void setCompanyName(String companyName) { public void setCompanyName(String companyName) {
this.companyName = companyName; this.companyName = companyName;
} }


Expand Down
@@ -0,0 +1,58 @@
/*
* Copyright (c) 2011. Gridshore
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.axonframework.samples.trader.app.query.portfolio;

/**
* @author Jettro Coenradie
*/
public class ItemEntry {
private String identifier;
private String companyIdentifier;
private String companyName;
private int amount;

public int getAmount() {
return amount;
}

public void setAmount(int amount) {
this.amount = amount;
}

public String getCompanyIdentifier() {
return companyIdentifier;
}

public void setCompanyIdentifier(String companyIdentifier) {
this.companyIdentifier = companyIdentifier;
}

public String getCompanyName() {
return companyName;
}

public void setCompanyName(String companyName) {
this.companyName = companyName;
}

public String getIdentifier() {
return identifier;
}

public void setIdentifier(String identifier) {
this.identifier = identifier;
}
}
Expand Up @@ -17,6 +17,9 @@


import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;


import java.util.HashMap;
import java.util.Map;

/** /**
* @author Jettro Coenradie * @author Jettro Coenradie
*/ */
Expand All @@ -27,6 +30,39 @@ public class PortfolioEntry {
private long amountOfMoney; private long amountOfMoney;
private long reservedAmountOfMoney; private long reservedAmountOfMoney;


private Map<String, ItemEntry> itemsInPossession = new HashMap<String, ItemEntry>();
private Map<String, ItemEntry> itemsReserved = new HashMap<String, ItemEntry>();

/*-------------------------------------------------------------------------------------------*/
/* utility functions */
/*-------------------------------------------------------------------------------------------*/
public ItemEntry findReservedItemByIdentifier(String identifier) {
return itemsReserved.get(identifier);
}

public ItemEntry findItemInPossession(String identifier) {
return itemsInPossession.get(identifier);
}

public void addReservedItem(ItemEntry itemEntry) {
handleAdd(itemsReserved, itemEntry);
}

public void addItemInPossession(ItemEntry itemEntry) {
handleAdd(itemsInPossession, itemEntry);
}

public void removeReservedItem(String itemIdentifier, int amount) {
handleRemoveItem(itemsReserved, itemIdentifier, amount);
}

public void removeItemsInPossession(String itemIdentifier, int amount) {
handleRemoveItem(itemsInPossession, itemIdentifier, amount);
}

/*-------------------------------------------------------------------------------------------*/
/* Getters and setters */
/*-------------------------------------------------------------------------------------------*/
public String getUserIdentifier() { public String getUserIdentifier() {
return userIdentifier; return userIdentifier;
} }
Expand Down Expand Up @@ -58,4 +94,42 @@ public long getReservedAmountOfMoney() {
public void setReservedAmountOfMoney(long reservedAmountOfMoney) { public void setReservedAmountOfMoney(long reservedAmountOfMoney) {
this.reservedAmountOfMoney = reservedAmountOfMoney; this.reservedAmountOfMoney = reservedAmountOfMoney;
} }

public Map<String, ItemEntry> getItemsInPossession() {
return itemsInPossession;
}

public void setItemsInPossession(Map<String, ItemEntry> itemsInPossession) {
this.itemsInPossession = itemsInPossession;
}

public Map<String, ItemEntry> getItemsReserved() {
return itemsReserved;
}

public void setItemsReserved(Map<String, ItemEntry> itemsReserved) {
this.itemsReserved = itemsReserved;
}

/*-------------------------------------------------------------------------------------------*/
/* Private helper methods */
/*-------------------------------------------------------------------------------------------*/
private void handleAdd(Map<String, ItemEntry> items, ItemEntry itemEntry) {
if (items.containsKey(itemEntry.getIdentifier())) {
ItemEntry foundEntry = items.get(itemEntry.getIdentifier());
foundEntry.setAmount(foundEntry.getAmount() + itemEntry.getAmount());
} else {
items.put(itemEntry.getIdentifier(), itemEntry);
}
}

private void handleRemoveItem(Map<String, ItemEntry> items, String itemIdentifier, int amount) {
if (items.containsKey(itemIdentifier)) {
ItemEntry foundEntry = items.get(itemIdentifier);
foundEntry.setAmount(foundEntry.getAmount() - amount);
if (foundEntry.getAmount() <= 0) {
items.remove(foundEntry.getIdentifier());
}
}
}
} }
@@ -0,0 +1,104 @@
/*
* Copyright (c) 2011. Gridshore
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.axonframework.samples.trader.app.query.portfolio;

import org.axonframework.eventhandling.annotation.EventHandler;
import org.axonframework.samples.trader.app.api.portfolio.item.ItemReservationCancelledForPortfolioEvent;
import org.axonframework.samples.trader.app.api.portfolio.item.ItemReservationConfirmedForPortfolioEvent;
import org.axonframework.samples.trader.app.api.portfolio.item.ItemsAddedToPortfolioEvent;
import org.axonframework.samples.trader.app.api.portfolio.item.ItemsReservedEvent;
import org.axonframework.samples.trader.app.query.orderbook.OrderBookEntry;
import org.axonframework.samples.trader.app.query.orderbook.repositories.OrderBookQueryRepository;
import org.axonframework.samples.trader.app.query.portfolio.repositories.PortfolioQueryRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
* @author Jettro Coenradie
*/
@Component
public class PortfolioItemEventListener {
private final static Logger logger = LoggerFactory.getLogger(PortfolioItemEventListener.class);
private PortfolioQueryRepository portfolioRepository;
private OrderBookQueryRepository orderBookQueryRepository;

@EventHandler
public void handleEvent(ItemsAddedToPortfolioEvent event) {
logger.debug("Handle ItemsAddedToPortfolioEvent for orderbook with identifier {}", event.getItemIdentifier());
ItemEntry itemEntry = createItemEntry(event.getItemIdentifier().asString(), event.getAmountOfItemsAdded());

PortfolioEntry portfolioEntry = portfolioRepository.findOne(event.getPortfolioIdentifier().asString());
portfolioEntry.addItemInPossession(itemEntry);

portfolioRepository.save(portfolioEntry);
}

@EventHandler
public void handleEvent(ItemReservationCancelledForPortfolioEvent event) {
logger.debug("Handle ItemReservationCancelledForPortfolioEvent for orderbook with identifier {}", event.getItemIdentifier());
ItemEntry itemEntry = createItemEntry(event.getItemIdentifier().asString(), event.getAmountOfCancelledItems());

PortfolioEntry portfolioEntry = portfolioRepository.findOne(event.getPortfolioIdentifier().asString());
portfolioEntry.removeReservedItem(event.getItemIdentifier().asString(), event.getAmountOfCancelledItems());
portfolioEntry.addItemInPossession(itemEntry);

portfolioRepository.save(portfolioEntry);
}

@EventHandler
public void handleEvent(ItemReservationConfirmedForPortfolioEvent event) {
logger.debug("Handle ItemReservationConfirmedForPortfolioEvent for orderbook with identifier {}", event.getItemIdentifier());
PortfolioEntry portfolioEntry = portfolioRepository.findOne(event.getPortfolioIdentifier().asString());
portfolioEntry.removeReservedItem(event.getItemIdentifier().asString(), event.getAmountOfConfirmedItems());

portfolioRepository.save(portfolioEntry);
}

@EventHandler
public void handleEvent(ItemsReservedEvent event) {
logger.debug("Handle ItemsReservedEvent for orderbook with identifier {}", event.getItemIdentifier());
ItemEntry itemEntry = createItemEntry(event.getItemIdentifier().asString(), event.getAmountOfItemsReserved());

PortfolioEntry portfolioEntry = portfolioRepository.findOne(event.getPortfolioIdentifier().asString());
portfolioEntry.addReservedItem(itemEntry);

portfolioRepository.save(portfolioEntry);
}

private ItemEntry createItemEntry(String identifier, int amount) {
OrderBookEntry orderBookEntry = orderBookQueryRepository.findOne(identifier);
ItemEntry itemEntry = new ItemEntry();
itemEntry.setIdentifier(identifier);
itemEntry.setCompanyIdentifier(orderBookEntry.getCompanyIdentifier());
itemEntry.setCompanyName(orderBookEntry.getCompanyName());
itemEntry.setAmount(amount);
return itemEntry;
}

@SuppressWarnings("SpringJavaAutowiringInspection")
@Autowired
public void setPortfolioRepository(PortfolioQueryRepository portfolioRepository) {
this.portfolioRepository = portfolioRepository;
}

@SuppressWarnings("SpringJavaAutowiringInspection")
@Autowired
public void setOrderBookQueryRepository(OrderBookQueryRepository orderBookQueryRepository) {
this.orderBookQueryRepository = orderBookQueryRepository;
}
}
Expand Up @@ -17,9 +17,7 @@


import org.axonframework.eventhandling.annotation.EventHandler; import org.axonframework.eventhandling.annotation.EventHandler;
import org.axonframework.samples.trader.app.api.portfolio.PortfolioCreatedEvent; import org.axonframework.samples.trader.app.api.portfolio.PortfolioCreatedEvent;
import org.axonframework.samples.trader.app.api.portfolio.money.MoneyDepositedToPortfolioEvent; import org.axonframework.samples.trader.app.api.portfolio.money.*;
import org.axonframework.samples.trader.app.api.portfolio.money.MoneyReservedFromPortfolioEvent;
import org.axonframework.samples.trader.app.api.portfolio.money.MoneyWithdrawnFromPortfolioEvent;
import org.axonframework.samples.trader.app.query.portfolio.repositories.PortfolioQueryRepository; import org.axonframework.samples.trader.app.query.portfolio.repositories.PortfolioQueryRepository;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
Expand All @@ -30,8 +28,8 @@
* @author Jettro Coenradie * @author Jettro Coenradie
*/ */
@Component @Component
public class PortfolioListener { public class PortfolioMoneyEventListener {
private final static Logger logger = LoggerFactory.getLogger(PortfolioListener.class); private final static Logger logger = LoggerFactory.getLogger(PortfolioMoneyEventListener.class);


private PortfolioQueryRepository portfolioRepository; private PortfolioQueryRepository portfolioRepository;


Expand Down Expand Up @@ -67,11 +65,32 @@ public void handleEvent(MoneyWithdrawnFromPortfolioEvent event) {
public void handleEvent(MoneyReservedFromPortfolioEvent event) { public void handleEvent(MoneyReservedFromPortfolioEvent event) {
PortfolioEntry portfolioEntry = portfolioRepository.findOne(event.getPortfolioIdentifier().asString()); PortfolioEntry portfolioEntry = portfolioRepository.findOne(event.getPortfolioIdentifier().asString());
portfolioEntry.setReservedAmountOfMoney(portfolioEntry.getReservedAmountOfMoney() + event.getAmountToReserve()); portfolioEntry.setReservedAmountOfMoney(portfolioEntry.getReservedAmountOfMoney() + event.getAmountToReserve());
portfolioEntry.setAmountOfMoney(portfolioEntry.getAmountOfMoney() - event.getAmountToReserve());
portfolioRepository.save(portfolioEntry); portfolioRepository.save(portfolioEntry);
} }


@EventHandler
public void handleEvent(MoneyReservationCancelledFromPortfolioEvent event) {
PortfolioEntry portfolioEntry = portfolioRepository.findOne(event.getPortfolioIdentifier().asString());
portfolioEntry.setReservedAmountOfMoney(portfolioEntry.getReservedAmountOfMoney() - event.getAmountOfMoneyToCancel());
portfolioRepository.save(portfolioEntry);
}

@EventHandler
public void handleEvent(MoneyReservationConfirmedFromPortfolioEvent event) {
PortfolioEntry portfolioEntry = portfolioRepository.findOne(event.getPortfolioIdentifier().asString());
long reservedAmountOfMoney = portfolioEntry.getReservedAmountOfMoney();
long amountOfMoneyConfirmed = event.getAmountOfMoneyConfirmedInCents();
if (amountOfMoneyConfirmed < reservedAmountOfMoney) {
portfolioEntry.setReservedAmountOfMoney(reservedAmountOfMoney - amountOfMoneyConfirmed);
} else {
portfolioEntry.setReservedAmountOfMoney(0);
}

portfolioEntry.setAmountOfMoney(portfolioEntry.getAmountOfMoney() - amountOfMoneyConfirmed);
portfolioRepository.save(portfolioEntry);
}


@SuppressWarnings("SpringJavaAutowiringInspection")
@Autowired @Autowired
public void setPortfolioRepository(PortfolioQueryRepository portfolioRepository) { public void setPortfolioRepository(PortfolioQueryRepository portfolioRepository) {
this.portfolioRepository = portfolioRepository; this.portfolioRepository = portfolioRepository;
Expand Down

0 comments on commit 2803017

Please sign in to comment.