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

Commit

Permalink
Initial part in showing the dashboard for a user
Browse files Browse the repository at this point in the history
  • Loading branch information
jettro committed Nov 11, 2011
1 parent 36ecb6c commit 883f119
Show file tree
Hide file tree
Showing 30 changed files with 473 additions and 60 deletions.
6 changes: 6 additions & 0 deletions app/pom.xml
Expand Up @@ -119,6 +119,12 @@
<version>1.8.5</version> <version>1.8.5</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.1</version>
<scope>test</scope>
</dependency>


</dependencies> </dependencies>


Expand Down
@@ -0,0 +1,46 @@
/*
* 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.command.trading;

import org.axonframework.commandhandling.CommandBus;
import org.axonframework.eventhandling.annotation.EventHandler;
import org.axonframework.samples.trader.app.api.portfolio.CreatePortfolioCommand;
import org.axonframework.samples.trader.app.api.user.UserCreatedEvent;
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 PortfolioManagementUserListener {
private final static Logger logger = LoggerFactory.getLogger(PortfolioManagementUserListener.class);
private CommandBus commandBus;

@EventHandler
public void createNewPortfolioWhenUserIsCreated(UserCreatedEvent event) {
logger.debug("About to dispatch a new command to create a Portfolio for the new user {}", event.getUserIdentifier());
CreatePortfolioCommand command = new CreatePortfolioCommand(event.getUserIdentifier());
commandBus.dispatch(command);
}

@Autowired
public void setCommandBus(CommandBus commandBus) {
this.commandBus = commandBus;
}
}
Expand Up @@ -23,7 +23,7 @@
import org.axonframework.samples.trader.app.api.user.AuthenticateUserCommand; import org.axonframework.samples.trader.app.api.user.AuthenticateUserCommand;
import org.axonframework.samples.trader.app.api.user.CreateUserCommand; import org.axonframework.samples.trader.app.api.user.CreateUserCommand;
import org.axonframework.samples.trader.app.api.user.UserAccount; import org.axonframework.samples.trader.app.api.user.UserAccount;
import org.axonframework.samples.trader.app.query.user.repositories.UserRepository; import org.axonframework.samples.trader.app.query.user.repositories.UserQueryRepository;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
Expand All @@ -35,7 +35,7 @@
public class UserCommandHandler { public class UserCommandHandler {
private Repository<User> repository; private Repository<User> repository;


private UserRepository userQueryRepository; private UserQueryRepository userQueryRepository;


@CommandHandler @CommandHandler
public AggregateIdentifier handleCreateUser(CreateUserCommand command) { public AggregateIdentifier handleCreateUser(CreateUserCommand command) {
Expand Down Expand Up @@ -68,7 +68,7 @@ public void setRepository(Repository<User> userRepository) {
} }


@Autowired @Autowired
public void setUserRepository(UserRepository userRepository) { public void setUserRepository(UserQueryRepository userRepository) {
this.userQueryRepository = userRepository; this.userQueryRepository = userRepository;
} }
} }
Expand Up @@ -17,7 +17,7 @@


import org.axonframework.eventhandling.annotation.EventHandler; import org.axonframework.eventhandling.annotation.EventHandler;
import org.axonframework.samples.trader.app.api.company.CompanyCreatedEvent; import org.axonframework.samples.trader.app.api.company.CompanyCreatedEvent;
import org.axonframework.samples.trader.app.query.company.repositories.CompanyRepository; import org.axonframework.samples.trader.app.query.company.repositories.CompanyQueryRepository;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;


Expand All @@ -27,7 +27,7 @@
@Component @Component
public class CompanyListener { public class CompanyListener {


private CompanyRepository companyRepository; private CompanyQueryRepository companyRepository;


@EventHandler @EventHandler
public void handleCompanyCreatedEvent(CompanyCreatedEvent event) { public void handleCompanyCreatedEvent(CompanyCreatedEvent event) {
Expand All @@ -42,7 +42,7 @@ public void handleCompanyCreatedEvent(CompanyCreatedEvent event) {
} }


@Autowired @Autowired
public void setCompanyRepository(CompanyRepository companyRepository) { public void setCompanyRepository(CompanyQueryRepository companyRepository) {
this.companyRepository = companyRepository; this.companyRepository = companyRepository;
} }
} }
Expand Up @@ -21,6 +21,6 @@
/** /**
* @author Jettro Coenradie * @author Jettro Coenradie
*/ */
public interface CompanyRepository extends PagingAndSortingRepository<CompanyEntry, String> { public interface CompanyQueryRepository extends PagingAndSortingRepository<CompanyEntry, String> {


} }
Expand Up @@ -19,10 +19,10 @@
import org.axonframework.eventhandling.annotation.EventHandler; import org.axonframework.eventhandling.annotation.EventHandler;
import org.axonframework.samples.trader.app.api.order.*; import org.axonframework.samples.trader.app.api.order.*;
import org.axonframework.samples.trader.app.query.company.CompanyEntry; import org.axonframework.samples.trader.app.query.company.CompanyEntry;
import org.axonframework.samples.trader.app.query.company.repositories.CompanyRepository; import org.axonframework.samples.trader.app.query.company.repositories.CompanyQueryRepository;
import org.axonframework.samples.trader.app.query.orderbook.repositories.OrderBookRepository; import org.axonframework.samples.trader.app.query.orderbook.repositories.OrderBookQueryRepository;
import org.axonframework.samples.trader.app.query.tradeexecuted.TradeExecutedEntry; import org.axonframework.samples.trader.app.query.tradeexecuted.TradeExecutedEntry;
import org.axonframework.samples.trader.app.query.tradeexecuted.repositories.TradeExecutedRepository; import org.axonframework.samples.trader.app.query.tradeexecuted.repositories.TradeExecutedQueryRepository;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;


Expand All @@ -34,9 +34,9 @@ public class OrderBookListener {
private static final String BUY = "Buy"; private static final String BUY = "Buy";
private static final String SELL = "Sell"; private static final String SELL = "Sell";


private OrderBookRepository orderBookRepository; private OrderBookQueryRepository orderBookRepository;
private CompanyRepository companyRepository; private CompanyQueryRepository companyRepository;
private TradeExecutedRepository tradeExecutedRepository; private TradeExecutedQueryRepository tradeExecutedRepository;




@EventHandler @EventHandler
Expand Down Expand Up @@ -117,17 +117,17 @@ private OrderEntry createPlacedOrder(AbstractOrderPlacedEvent event, String type
} }


@Autowired @Autowired
public void setOrderBookRepository(OrderBookRepository orderBookRepository) { public void setOrderBookRepository(OrderBookQueryRepository orderBookRepository) {
this.orderBookRepository = orderBookRepository; this.orderBookRepository = orderBookRepository;
} }


@Autowired @Autowired
public void setCompanyRepository(CompanyRepository companyRepository) { public void setCompanyRepository(CompanyQueryRepository companyRepository) {
this.companyRepository = companyRepository; this.companyRepository = companyRepository;
} }


@Autowired @Autowired
public void setTradeExecutedRepository(TradeExecutedRepository tradeExecutedRepository) { public void setTradeExecutedRepository(TradeExecutedQueryRepository tradeExecutedRepository) {
this.tradeExecutedRepository = tradeExecutedRepository; this.tradeExecutedRepository = tradeExecutedRepository;
} }
} }
Expand Up @@ -23,6 +23,6 @@
/** /**
* @author Jettro Coenradie * @author Jettro Coenradie
*/ */
public interface OrderBookRepository extends PagingAndSortingRepository<OrderBookEntry, String> { public interface OrderBookQueryRepository extends PagingAndSortingRepository<OrderBookEntry, String> {
List<OrderBookEntry> findByCompanyIdentifier(String companyIdentifier); List<OrderBookEntry> findByCompanyIdentifier(String companyIdentifier);
} }
@@ -0,0 +1,61 @@
/*
* 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.springframework.data.annotation.Id;

/**
* @author Jettro Coenradie
*/
public class PortfolioEntry {
@Id
private String identifier;
private String userIdentifier;
private long amountOfMoney;
private long reservedAmountOfMoney;

public String getUserIdentifier() {
return userIdentifier;
}

public void setUserIdentifier(String userIdentifier) {
this.userIdentifier = userIdentifier;
}

public long getAmountOfMoney() {
return amountOfMoney;
}

public void setAmountOfMoney(long amountOfMoney) {
this.amountOfMoney = amountOfMoney;
}

public String getIdentifier() {
return identifier;
}

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

public long getReservedAmountOfMoney() {
return reservedAmountOfMoney;
}

public void setReservedAmountOfMoney(long reservedAmountOfMoney) {
this.reservedAmountOfMoney = reservedAmountOfMoney;
}
}
@@ -0,0 +1,79 @@
/*
* 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.PortfolioCreatedEvent;
import org.axonframework.samples.trader.app.api.portfolio.money.MoneyAddedToPortfolioEvent;
import org.axonframework.samples.trader.app.api.portfolio.money.MoneyReservedFromPortfolioEvent;
import org.axonframework.samples.trader.app.api.portfolio.money.PaymentMadeFromPortfolioEvent;
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 PortfolioListener {
private final static Logger logger = LoggerFactory.getLogger(PortfolioListener.class);

private PortfolioQueryRepository portfolioRepository;

@EventHandler
public void handleEvent(PortfolioCreatedEvent event) {
logger.debug("About to handle the PortfolioCreatedEvent for user with identifier {}",
event.getUserIdentifier().asString());

PortfolioEntry portfolioEntry = new PortfolioEntry();
portfolioEntry.setIdentifier(event.getPortfolioIdentifier().asString());
portfolioEntry.setUserIdentifier(event.getUserIdentifier().asString());
portfolioEntry.setAmountOfMoney(0);
portfolioEntry.setReservedAmountOfMoney(0);

portfolioRepository.save(portfolioEntry);
}

@EventHandler
public void handleEvent(MoneyAddedToPortfolioEvent event) {
PortfolioEntry portfolioEntry = portfolioRepository.findOne(event.getPortfolioIdentifier().asString());
portfolioEntry.setAmountOfMoney(portfolioEntry.getAmountOfMoney() + event.getMoneyAddedInCents());
portfolioRepository.save(portfolioEntry);
}

@EventHandler
public void handleEvent(PaymentMadeFromPortfolioEvent event) {
PortfolioEntry portfolioEntry = portfolioRepository.findOne(event.getPortfolioIdentifier().asString());
portfolioEntry.setAmountOfMoney(portfolioEntry.getAmountOfMoney() - event.getAmountPaidInCents());
portfolioRepository.save(portfolioEntry);
}

@EventHandler
public void handleEvent(MoneyReservedFromPortfolioEvent event) {
PortfolioEntry portfolioEntry = portfolioRepository.findOne(event.getPortfolioIdentifier().asString());
portfolioEntry.setReservedAmountOfMoney(portfolioEntry.getReservedAmountOfMoney() + event.getAmountToReserve());
portfolioEntry.setAmountOfMoney(portfolioEntry.getAmountOfMoney() - event.getAmountToReserve());
portfolioRepository.save(portfolioEntry);
}


@Autowired
public void setPortfolioRepository(PortfolioQueryRepository portfolioRepository) {
this.portfolioRepository = portfolioRepository;
}
}
@@ -0,0 +1,26 @@
/*
* 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.repositories;

import org.axonframework.samples.trader.app.query.portfolio.PortfolioEntry;
import org.springframework.data.repository.PagingAndSortingRepository;

/**
* @author Jettro Coenradie
*/
public interface PortfolioQueryRepository extends PagingAndSortingRepository<PortfolioEntry, String> {
PortfolioEntry findByUserIdentifier(String userIdentifier);
}
Expand Up @@ -23,6 +23,6 @@
/** /**
* @author Jettro Coenradie * @author Jettro Coenradie
*/ */
public interface TradeExecutedRepository extends PagingAndSortingRepository<TradeExecutedEntry, String> { public interface TradeExecutedQueryRepository extends PagingAndSortingRepository<TradeExecutedEntry, String> {
List<TradeExecutedEntry> findByOrderBookIdentifier(String orderBookIdentifier); List<TradeExecutedEntry> findByOrderBookIdentifier(String orderBookIdentifier);
} }
Expand Up @@ -17,7 +17,7 @@


import org.axonframework.eventhandling.annotation.EventHandler; import org.axonframework.eventhandling.annotation.EventHandler;
import org.axonframework.samples.trader.app.api.user.UserCreatedEvent; import org.axonframework.samples.trader.app.api.user.UserCreatedEvent;
import org.axonframework.samples.trader.app.query.user.repositories.UserRepository; import org.axonframework.samples.trader.app.query.user.repositories.UserQueryRepository;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;


Expand All @@ -26,7 +26,7 @@
*/ */
@Component @Component
public class UserListener { public class UserListener {
private UserRepository userRepository; private UserQueryRepository userRepository;


@EventHandler @EventHandler
public void handleUserCreated(UserCreatedEvent event) { public void handleUserCreated(UserCreatedEvent event) {
Expand All @@ -40,7 +40,7 @@ public void handleUserCreated(UserCreatedEvent event) {
} }


@Autowired @Autowired
public void setUserRepository(UserRepository userRepository) { public void setUserRepository(UserQueryRepository userRepository) {
this.userRepository = userRepository; this.userRepository = userRepository;
} }
} }
Expand Up @@ -21,6 +21,6 @@
/** /**
* @author Jettro Coenradie * @author Jettro Coenradie
*/ */
public interface UserRepository extends PagingAndSortingRepository<UserEntry, String> { public interface UserQueryRepository extends PagingAndSortingRepository<UserEntry, String> {
UserEntry findByUsername(String username); UserEntry findByUsername(String username);
} }

0 comments on commit 883f119

Please sign in to comment.