Code formating
This commit is contained in:
		
							
								
								
									
										184
									
								
								event-sourcing/etc/event-sourcing.urm.puml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										184
									
								
								event-sourcing/etc/event-sourcing.urm.puml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,184 @@ | ||||
| @startuml | ||||
| package com.iluwatar.event.sourcing.journal { | ||||
|   class JsonFileJournal { | ||||
|     - aFile : File | ||||
|     - events : List<String> | ||||
|     - index : int | ||||
|     + JsonFileJournal() | ||||
|     + readNext() : DomainEvent | ||||
|     + reset() | ||||
|     + write(domainEvent : DomainEvent) | ||||
|   } | ||||
| } | ||||
| package com.iluwatar.event.sourcing.processor { | ||||
|   class DomainEventProcessor { | ||||
|     - precessorJournal : ProcessorJournal | ||||
|     + DomainEventProcessor() | ||||
|     + process(domainEvent : DomainEvent) | ||||
|     + recover() | ||||
|     + setPrecessorJournal(precessorJournal : ProcessorJournal) | ||||
|   } | ||||
| } | ||||
| package com.iluwatar.event.sourcing.service { | ||||
|   class AccountService { | ||||
|     - eventProcessor : EventProcessor | ||||
|     + AccountService(eventProcessor : EventProcessor) | ||||
|     + createAccount(accountNo : int, owner : String) | ||||
|   } | ||||
|   class MoneyTransactionService { | ||||
|     - eventProcessor : EventProcessor | ||||
|     + MoneyTransactionService(eventProcessor : EventProcessor) | ||||
|     + depositMoney(accountNo : int, money : BigDecimal) | ||||
|     + transferMoney(accountNoFrom : int, accountNoTo : int, money : BigDecimal) | ||||
|     + withdrawalMoney(accountNo : int, money : BigDecimal) | ||||
|   } | ||||
|   class SequenceIdGenerator { | ||||
|     - sequenceId : long {static} | ||||
|     + SequenceIdGenerator() | ||||
|     + nextSequenceId() : long {static} | ||||
|   } | ||||
| } | ||||
| package com.iluwatar.event.sourcing.event { | ||||
|   class AccountCreateEvent { | ||||
|     - accountNo : int | ||||
|     - owner : String | ||||
|     + AccountCreateEvent(sequenceId : long, createdTime : long, accountNo : int, owner : String) | ||||
|     + getAccountNo() : int | ||||
|     + getOwner() : String | ||||
|     + process() | ||||
|   } | ||||
|   class MoneyDepositEvent { | ||||
|     - accountNo : int | ||||
|     - money : BigDecimal | ||||
|     + MoneyDepositEvent(sequenceId : long, createdTime : long, accountNo : int, money : BigDecimal) | ||||
|     + getAccountNo() : int | ||||
|     + getMoney() : BigDecimal | ||||
|     + process() | ||||
|   } | ||||
|   class MoneyTransferEvent { | ||||
|     - accountNoFrom : int | ||||
|     - accountNoTo : int | ||||
|     - money : BigDecimal | ||||
|     + MoneyTransferEvent(sequenceId : long, createdTime : long, money : BigDecimal, accountNoFrom : int, accountNoTo : int) | ||||
|     + getAccountNoFrom() : int | ||||
|     + getAccountNoTo() : int | ||||
|     + getMoney() : BigDecimal | ||||
|     + process() | ||||
|   } | ||||
|   class MoneyWithdrawalEvent { | ||||
|     - accountNo : int | ||||
|     - money : BigDecimal | ||||
|     + MoneyWithdrawalEvent(sequenceId : long, createdTime : long, accountNo : int, money : BigDecimal) | ||||
|     + getAccountNo() : int | ||||
|     + getMoney() : BigDecimal | ||||
|     + process() | ||||
|   } | ||||
| } | ||||
| package com.iluwatar.event.sourcing.gateway { | ||||
|   class AccountCreateContractSender { | ||||
|     + AccountCreateContractSender() | ||||
|     + sendContractInfo(account : Account) | ||||
|   } | ||||
|   class Gateways { | ||||
|     - accountCreateContractSender : AccountCreateContractSender {static} | ||||
|     - transactionLogger : TransactionLogger {static} | ||||
|     + Gateways() | ||||
|     + getAccountCreateContractSender() : AccountCreateContractSender {static} | ||||
|     + getTransactionLogger() : TransactionLogger {static} | ||||
|   } | ||||
|   class TransactionLogger { | ||||
|     + TransactionLogger() | ||||
|     + log(transaction : Transaction) | ||||
|   } | ||||
| } | ||||
| package com.iluwatar.event.sourcing.app { | ||||
|   class App { | ||||
|     + App() | ||||
|     + main(args : String[]) {static} | ||||
|   } | ||||
| } | ||||
| package com.iluwatar.event.sourcing.state { | ||||
|   class AccountAggregate { | ||||
|     - accounts : Map<Integer, Account> {static} | ||||
|     + AccountAggregate() | ||||
|     + getAccount(accountNo : int) : Account {static} | ||||
|     + putAccount(account : Account) {static} | ||||
|     + resetState() {static} | ||||
|   } | ||||
| } | ||||
| package com.iluwatar.event.sourcing.domain { | ||||
|   class Account { | ||||
|     - accountNo : int | ||||
|     - money : BigDecimal | ||||
|     - owner : String | ||||
|     - transactions : List<Transaction> | ||||
|     + Account(accountNo : int, owner : String) | ||||
|     + copy() : Account | ||||
|     - depositMoney(money : BigDecimal) : Transaction | ||||
|     + getAccountNo() : int | ||||
|     + getMoney() : BigDecimal | ||||
|     + getOwner() : String | ||||
|     + getTransactions() : List<Transaction> | ||||
|     - handleDeposit(money : BigDecimal, realTime : boolean) | ||||
|     + handleEvent(accountCreateEvent : AccountCreateEvent) | ||||
|     + handleEvent(moneyDepositEvent : MoneyDepositEvent) | ||||
|     + handleEvent(moneyWithdrawalEvent : MoneyWithdrawalEvent) | ||||
|     + handleTransferFromEvent(moneyTransferEvent : MoneyTransferEvent) | ||||
|     + handleTransferToEvent(moneyTransferEvent : MoneyTransferEvent) | ||||
|     - handleWithdrawal(money : BigDecimal, realTime : boolean) | ||||
|     + setMoney(money : BigDecimal) | ||||
|     + setTransactions(transactions : List<Transaction>) | ||||
|     + toString() : String | ||||
|     - withdrawMoney(money : BigDecimal) : Transaction | ||||
|   } | ||||
|   class Transaction { | ||||
|     - accountNo : int | ||||
|     - lastBalance : BigDecimal | ||||
|     - moneyIn : BigDecimal | ||||
|     - moneyOut : BigDecimal | ||||
|     + Transaction(accountNo : int, moneyIn : BigDecimal, moneyOut : BigDecimal, lastBalance : BigDecimal) | ||||
|     + getAccountNo() : int | ||||
|     + getLastBalance() : BigDecimal | ||||
|     + getMoneyIn() : BigDecimal | ||||
|     + getMoneyOut() : BigDecimal | ||||
|     + toString() : String | ||||
|   } | ||||
| } | ||||
| package com.iluwatar.event.sourcing.api { | ||||
|   abstract class DomainEvent { | ||||
|     - createdTime : long | ||||
|     - eventClassName : String | ||||
|     - realTime : boolean | ||||
|     - sequenceId : long | ||||
|     + DomainEvent(sequenceId : long, createdTime : long, eventClassName : String) | ||||
|     + getCreatedTime() : long | ||||
|     + getEventClassName() : String | ||||
|     + getSequenceId() : long | ||||
|     + isRealTime() : boolean | ||||
|     + process() {abstract} | ||||
|     + setRealTime(realTime : boolean) | ||||
|   } | ||||
|   interface EventProcessor { | ||||
|     + process(DomainEvent) {abstract} | ||||
|     + recover() {abstract} | ||||
|     + setPrecessorJournal(ProcessorJournal) {abstract} | ||||
|   } | ||||
|   interface ProcessorJournal { | ||||
|     + readNext() : DomainEvent {abstract} | ||||
|     + reset() {abstract} | ||||
|     + write(DomainEvent) {abstract} | ||||
|   } | ||||
| } | ||||
| Gateways -->  "-accountCreateContractSender" AccountCreateContractSender | ||||
| DomainEventProcessor -->  "-precessorJournal" ProcessorJournal | ||||
| Account -->  "-transactions" Transaction | ||||
| Gateways -->  "-transactionLogger" TransactionLogger | ||||
| AccountService -->  "-eventProcessor" EventProcessor | ||||
| MoneyTransactionService -->  "-eventProcessor" EventProcessor | ||||
| AccountCreateEvent --|> DomainEvent  | ||||
| MoneyDepositEvent --|> DomainEvent  | ||||
| MoneyTransferEvent --|> DomainEvent  | ||||
| MoneyWithdrawalEvent --|> DomainEvent  | ||||
| JsonFileJournal ..|> ProcessorJournal  | ||||
| DomainEventProcessor ..|> EventProcessor  | ||||
| @enduml | ||||
| @@ -1,3 +1,25 @@ | ||||
| /** | ||||
|  * The MIT License | ||||
|  * Copyright (c) 2014 Ilkka Seppälä | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| package com.iluwatar.event.sourcing.api; | ||||
|  | ||||
| import java.io.Serializable; | ||||
| @@ -6,36 +28,72 @@ import java.io.Serializable; | ||||
|  * Created by serdarh on 06.08.2017. | ||||
|  */ | ||||
| public abstract class DomainEvent implements Serializable { | ||||
|     private final long sequenceId; | ||||
|     private final long createdTime; | ||||
|     private boolean realTime = true; | ||||
|     private final String eventClassName; | ||||
|  | ||||
|     public DomainEvent(long sequenceId, long createdTime, String eventClassName) { | ||||
|         this.sequenceId = sequenceId; | ||||
|         this.createdTime = createdTime; | ||||
|         this.eventClassName = eventClassName; | ||||
|     } | ||||
|   private final long sequenceId; | ||||
|   private final long createdTime; | ||||
|   private final String eventClassName; | ||||
|   private boolean realTime = true; | ||||
|  | ||||
|     public long getSequenceId() { | ||||
|         return sequenceId; | ||||
|     } | ||||
|   /** | ||||
|    * Instantiates a new Domain event. | ||||
|    * | ||||
|    * @param sequenceId the sequence id | ||||
|    * @param createdTime the created time | ||||
|    * @param eventClassName the event class name | ||||
|    */ | ||||
|   public DomainEvent(long sequenceId, long createdTime, String eventClassName) { | ||||
|     this.sequenceId = sequenceId; | ||||
|     this.createdTime = createdTime; | ||||
|     this.eventClassName = eventClassName; | ||||
|   } | ||||
|  | ||||
|     public long getCreatedTime() { | ||||
|         return createdTime; | ||||
|     } | ||||
|   /** | ||||
|    * Gets sequence id. | ||||
|    * | ||||
|    * @return the sequence id | ||||
|    */ | ||||
|   public long getSequenceId() { | ||||
|     return sequenceId; | ||||
|   } | ||||
|  | ||||
|     public boolean isRealTime() { | ||||
|         return realTime; | ||||
|     } | ||||
|   /** | ||||
|    * Gets created time. | ||||
|    * | ||||
|    * @return the created time | ||||
|    */ | ||||
|   public long getCreatedTime() { | ||||
|     return createdTime; | ||||
|   } | ||||
|  | ||||
|     public void setRealTime(boolean realTime) { | ||||
|         this.realTime = realTime; | ||||
|     } | ||||
|   /** | ||||
|    * Is real time boolean. | ||||
|    * | ||||
|    * @return the boolean | ||||
|    */ | ||||
|   public boolean isRealTime() { | ||||
|     return realTime; | ||||
|   } | ||||
|  | ||||
|     public abstract void process(); | ||||
|   /** | ||||
|    * Sets real time. | ||||
|    * | ||||
|    * @param realTime the real time | ||||
|    */ | ||||
|   public void setRealTime(boolean realTime) { | ||||
|     this.realTime = realTime; | ||||
|   } | ||||
|  | ||||
|     public String getEventClassName() { | ||||
|         return eventClassName; | ||||
|     } | ||||
|   /** | ||||
|    * Process. | ||||
|    */ | ||||
|   public abstract void process(); | ||||
|  | ||||
|   /** | ||||
|    * Gets event class name. | ||||
|    * | ||||
|    * @return the event class name | ||||
|    */ | ||||
|   public String getEventClassName() { | ||||
|     return eventClassName; | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,10 +1,48 @@ | ||||
| /** | ||||
|  * The MIT License | ||||
|  * Copyright (c) 2014 Ilkka Seppälä | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| package com.iluwatar.event.sourcing.api; | ||||
|  | ||||
| /** | ||||
|  * Created by serdarh on 06.08.2017. | ||||
|  */ | ||||
| public interface EventProcessor { | ||||
|     void process(DomainEvent domainEvent); | ||||
|     void setPrecessorJournal(ProcessorJournal precessorJournal); | ||||
|     void recover(); | ||||
|  | ||||
|   /** | ||||
|    * Process. | ||||
|    * | ||||
|    * @param domainEvent the domain event | ||||
|    */ | ||||
|   void process(DomainEvent domainEvent); | ||||
|  | ||||
|   /** | ||||
|    * Sets precessor journal. | ||||
|    * | ||||
|    * @param precessorJournal the precessor journal | ||||
|    */ | ||||
|   void setPrecessorJournal(ProcessorJournal precessorJournal); | ||||
|  | ||||
|   /** | ||||
|    * Recover. | ||||
|    */ | ||||
|   void recover(); | ||||
| } | ||||
|   | ||||
| @@ -1,10 +1,48 @@ | ||||
| /** | ||||
|  * The MIT License | ||||
|  * Copyright (c) 2014 Ilkka Seppälä | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| package com.iluwatar.event.sourcing.api; | ||||
|  | ||||
| /** | ||||
|  * Created by serdarh on 06.08.2017. | ||||
|  */ | ||||
| public interface ProcessorJournal { | ||||
|     void write(DomainEvent domainEvent); | ||||
|     void reset(); | ||||
|     DomainEvent readNext(); | ||||
|  | ||||
|   /** | ||||
|    * Write. | ||||
|    * | ||||
|    * @param domainEvent the domain event | ||||
|    */ | ||||
|   void write(DomainEvent domainEvent); | ||||
|  | ||||
|   /** | ||||
|    * Reset. | ||||
|    */ | ||||
|   void reset(); | ||||
|  | ||||
|   /** | ||||
|    * Read next domain event. | ||||
|    * | ||||
|    * @return the domain event | ||||
|    */ | ||||
|   DomainEvent readNext(); | ||||
| } | ||||
|   | ||||
| @@ -1,3 +1,25 @@ | ||||
| /** | ||||
|  * The MIT License | ||||
|  * Copyright (c) 2014 Ilkka Seppälä | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| package com.iluwatar.event.sourcing.app; | ||||
|  | ||||
| import com.iluwatar.event.sourcing.journal.JsonFileJournal; | ||||
| @@ -5,7 +27,6 @@ import com.iluwatar.event.sourcing.processor.DomainEventProcessor; | ||||
| import com.iluwatar.event.sourcing.service.AccountService; | ||||
| import com.iluwatar.event.sourcing.service.MoneyTransactionService; | ||||
| import com.iluwatar.event.sourcing.state.AccountAggregate; | ||||
|  | ||||
| import java.math.BigDecimal; | ||||
|  | ||||
| /** | ||||
| @@ -13,46 +34,52 @@ import java.math.BigDecimal; | ||||
|  */ | ||||
| public class App { | ||||
|  | ||||
|     public static void main(String[] args) { | ||||
|         System.out.println("Running the system first time............"); | ||||
|   /** | ||||
|    * The entry point of application. | ||||
|    * | ||||
|    * @param args the input arguments | ||||
|    */ | ||||
|   public static void main(String[] args) { | ||||
|     System.out.println("Running the system first time............"); | ||||
|  | ||||
|         DomainEventProcessor domainEventProcessor = new DomainEventProcessor(); | ||||
|         JsonFileJournal jsonFileJournal = new JsonFileJournal(); | ||||
|         jsonFileJournal.reset(); | ||||
|         domainEventProcessor.setPrecessorJournal(jsonFileJournal); | ||||
|     DomainEventProcessor domainEventProcessor = new DomainEventProcessor(); | ||||
|     JsonFileJournal jsonFileJournal = new JsonFileJournal(); | ||||
|     jsonFileJournal.reset(); | ||||
|     domainEventProcessor.setPrecessorJournal(jsonFileJournal); | ||||
|  | ||||
|         System.out.println("Creating th accounts............"); | ||||
|     System.out.println("Creating th accounts............"); | ||||
|  | ||||
|         AccountService accountService = new AccountService(domainEventProcessor); | ||||
|         MoneyTransactionService moneyTransactionService = new MoneyTransactionService(domainEventProcessor); | ||||
|         accountService.createAccount(1,"Daenerys Targaryen"); | ||||
|         accountService.createAccount(2,"Jon Snow"); | ||||
|     AccountService accountService = new AccountService(domainEventProcessor); | ||||
|     MoneyTransactionService moneyTransactionService = new MoneyTransactionService( | ||||
|         domainEventProcessor); | ||||
|     accountService.createAccount(1, "Daenerys Targaryen"); | ||||
|     accountService.createAccount(2, "Jon Snow"); | ||||
|  | ||||
|         System.out.println("Do some money operations............"); | ||||
|     System.out.println("Do some money operations............"); | ||||
|  | ||||
|         moneyTransactionService.depositMoney(1,new BigDecimal("100000")); | ||||
|         moneyTransactionService.depositMoney(2,new BigDecimal("10")); | ||||
|     moneyTransactionService.depositMoney(1, new BigDecimal("100000")); | ||||
|     moneyTransactionService.depositMoney(2, new BigDecimal("100")); | ||||
|  | ||||
|         moneyTransactionService.transferMoney(1,2,new BigDecimal("10000")); | ||||
|         moneyTransactionService.withdrawalMoney(2, new BigDecimal("1000")); | ||||
|     moneyTransactionService.transferMoney(1, 2, new BigDecimal("10000")); | ||||
|     moneyTransactionService.withdrawalMoney(2, new BigDecimal("1000")); | ||||
|  | ||||
|         System.out.println("...............State:............"); | ||||
|         System.out.println(AccountAggregate.getAccount(1)); | ||||
|         System.out.println(AccountAggregate.getAccount(2)); | ||||
|     System.out.println("...............State:............"); | ||||
|     System.out.println(AccountAggregate.getAccount(1)); | ||||
|     System.out.println(AccountAggregate.getAccount(2)); | ||||
|  | ||||
|         System.out.println("At that point system goes down state in memory cleared............"); | ||||
|     System.out.println("At that point system goes down state in memory cleared............"); | ||||
|  | ||||
|         AccountAggregate.resetState(); | ||||
|     AccountAggregate.resetState(); | ||||
|  | ||||
|         System.out.println("Recover the syste by the events in journal file............"); | ||||
|     System.out.println("Recover the syste by the events in journal file............"); | ||||
|  | ||||
|         domainEventProcessor = new DomainEventProcessor(); | ||||
|         jsonFileJournal = new JsonFileJournal(); | ||||
|         domainEventProcessor.setPrecessorJournal(jsonFileJournal); | ||||
|         domainEventProcessor.recover(); | ||||
|     domainEventProcessor = new DomainEventProcessor(); | ||||
|     jsonFileJournal = new JsonFileJournal(); | ||||
|     domainEventProcessor.setPrecessorJournal(jsonFileJournal); | ||||
|     domainEventProcessor.recover(); | ||||
|  | ||||
|         System.out.println("...............State Recovered:............"); | ||||
|         System.out.println(AccountAggregate.getAccount(1)); | ||||
|         System.out.println(AccountAggregate.getAccount(2)); | ||||
|     } | ||||
|     System.out.println("...............State Recovered:............"); | ||||
|     System.out.println(AccountAggregate.getAccount(1)); | ||||
|     System.out.println(AccountAggregate.getAccount(2)); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,3 +1,25 @@ | ||||
| /** | ||||
|  * The MIT License | ||||
|  * Copyright (c) 2014 Ilkka Seppälä | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| package com.iluwatar.event.sourcing.domain; | ||||
|  | ||||
| import com.iluwatar.event.sourcing.event.AccountCreateEvent; | ||||
| @@ -6,7 +28,6 @@ import com.iluwatar.event.sourcing.event.MoneyTransferEvent; | ||||
| import com.iluwatar.event.sourcing.event.MoneyWithdrawalEvent; | ||||
| import com.iluwatar.event.sourcing.gateway.Gateways; | ||||
| import com.iluwatar.event.sourcing.state.AccountAggregate; | ||||
|  | ||||
| import java.math.BigDecimal; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| @@ -15,116 +36,184 @@ import java.util.List; | ||||
|  * Created by serdarh on 06.08.2017. | ||||
|  */ | ||||
| public class Account { | ||||
|     private final int accountNo; | ||||
|     private final String owner; | ||||
|     private BigDecimal money; | ||||
|     private List<Transaction> transactions; | ||||
|  | ||||
|     public Account(int accountNo, String owner) { | ||||
|         this.accountNo = accountNo; | ||||
|         this.owner = owner; | ||||
|         money = BigDecimal.ZERO; | ||||
|         transactions = new ArrayList<>(); | ||||
|   private final int accountNo; | ||||
|   private final String owner; | ||||
|   private BigDecimal money; | ||||
|   private List<Transaction> transactions; | ||||
|  | ||||
|   /** | ||||
|    * Instantiates a new Account. | ||||
|    * | ||||
|    * @param accountNo the account no | ||||
|    * @param owner the owner | ||||
|    */ | ||||
|   public Account(int accountNo, String owner) { | ||||
|     this.accountNo = accountNo; | ||||
|     this.owner = owner; | ||||
|     money = BigDecimal.ZERO; | ||||
|     transactions = new ArrayList<>(); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Gets account no. | ||||
|    * | ||||
|    * @return the account no | ||||
|    */ | ||||
|   public int getAccountNo() { | ||||
|     return accountNo; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Gets owner. | ||||
|    * | ||||
|    * @return the owner | ||||
|    */ | ||||
|   public String getOwner() { | ||||
|     return owner; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Gets money. | ||||
|    * | ||||
|    * @return the money | ||||
|    */ | ||||
|   public BigDecimal getMoney() { | ||||
|     return money; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Sets money. | ||||
|    * | ||||
|    * @param money the money | ||||
|    */ | ||||
|   public void setMoney(BigDecimal money) { | ||||
|     this.money = money; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Gets transactions. | ||||
|    * | ||||
|    * @return the transactions | ||||
|    */ | ||||
|   public List<Transaction> getTransactions() { | ||||
|     return transactions; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Sets transactions. | ||||
|    * | ||||
|    * @param transactions the transactions | ||||
|    */ | ||||
|   public void setTransactions(List<Transaction> transactions) { | ||||
|     this.transactions = transactions; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Copy account. | ||||
|    * | ||||
|    * @return the account | ||||
|    */ | ||||
|   public Account copy() { | ||||
|     Account account = new Account(accountNo, owner); | ||||
|     account.setMoney(money); | ||||
|     account.setTransactions(transactions); | ||||
|     return account; | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public String toString() { | ||||
|     return "Account{" | ||||
|         + "accountNo=" + accountNo | ||||
|         + ", owner='" + owner + '\'' | ||||
|         + ", money=" + money | ||||
|         + ", transactions=" + transactions | ||||
|         + '}'; | ||||
|   } | ||||
|  | ||||
|   private Transaction depositMoney(BigDecimal money) { | ||||
|     this.money = this.money.add(money); | ||||
|     Transaction transaction = new Transaction(accountNo, money, BigDecimal.ZERO, this.money); | ||||
|     transactions.add(transaction); | ||||
|     return transaction; | ||||
|   } | ||||
|  | ||||
|   private Transaction withdrawMoney(BigDecimal money) { | ||||
|     this.money = this.money.subtract(money); | ||||
|     Transaction transaction = new Transaction(accountNo, BigDecimal.ZERO, money, this.money); | ||||
|     transactions.add(transaction); | ||||
|     return transaction; | ||||
|   } | ||||
|  | ||||
|   private void handleDeposit(BigDecimal money, boolean realTime) { | ||||
|     Transaction transaction = depositMoney(money); | ||||
|     AccountAggregate.putAccount(this); | ||||
|     if (realTime) { | ||||
|       Gateways.getTransactionLogger().log(transaction); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   private void handleWithdrawal(BigDecimal money, boolean realTime) { | ||||
|     if (this.money.compareTo(money) == -1) { | ||||
|       throw new RuntimeException("Insufficient Account Balance"); | ||||
|     } | ||||
|  | ||||
|     public int getAccountNo() { | ||||
|         return accountNo; | ||||
|     Transaction transaction = withdrawMoney(money); | ||||
|     AccountAggregate.putAccount(this); | ||||
|     if (realTime) { | ||||
|       Gateways.getTransactionLogger().log(transaction); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|     public String getOwner() { | ||||
|         return owner; | ||||
|   /** | ||||
|    * Handle event. | ||||
|    * | ||||
|    * @param moneyDepositEvent the money deposit event | ||||
|    */ | ||||
|   public void handleEvent(MoneyDepositEvent moneyDepositEvent) { | ||||
|     handleDeposit(moneyDepositEvent.getMoney(), moneyDepositEvent.isRealTime()); | ||||
|   } | ||||
|  | ||||
|  | ||||
|   /** | ||||
|    * Handle event. | ||||
|    * | ||||
|    * @param moneyWithdrawalEvent the money withdrawal event | ||||
|    */ | ||||
|   public void handleEvent(MoneyWithdrawalEvent moneyWithdrawalEvent) { | ||||
|     handleWithdrawal(moneyWithdrawalEvent.getMoney(), moneyWithdrawalEvent.isRealTime()); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Handle event. | ||||
|    * | ||||
|    * @param accountCreateEvent the account create event | ||||
|    */ | ||||
|   public void handleEvent(AccountCreateEvent accountCreateEvent) { | ||||
|     AccountAggregate.putAccount(this); | ||||
|     // check if this event is replicated from journal before calling an external gateway function | ||||
|     if (accountCreateEvent.isRealTime()) { | ||||
|       Gateways.getAccountCreateContractSender().sendContractInfo(this); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|     public BigDecimal getMoney() { | ||||
|         return money; | ||||
|     } | ||||
|   /** | ||||
|    * Handle transfer from event. | ||||
|    * | ||||
|    * @param moneyTransferEvent the money transfer event | ||||
|    */ | ||||
|   public void handleTransferFromEvent(MoneyTransferEvent moneyTransferEvent) { | ||||
|     handleWithdrawal(moneyTransferEvent.getMoney(), moneyTransferEvent.isRealTime()); | ||||
|   } | ||||
|  | ||||
|     public List<Transaction> getTransactions() { | ||||
|         return transactions; | ||||
|     } | ||||
|  | ||||
|     public void setMoney(BigDecimal money) { | ||||
|         this.money = money; | ||||
|     } | ||||
|  | ||||
|     public void setTransactions(List<Transaction> transactions) { | ||||
|         this.transactions = transactions; | ||||
|     } | ||||
|  | ||||
|     public Account copy() { | ||||
|         Account account = new Account(accountNo, owner); | ||||
|         account.setMoney(money); | ||||
|         account.setTransactions(transactions); | ||||
|         return account; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public String toString() { | ||||
|         return "Account{" + | ||||
|                 "accountNo=" + accountNo + | ||||
|                 ", owner='" + owner + '\'' + | ||||
|                 ", money=" + money + | ||||
|                 ", transactions=" + transactions + | ||||
|                 '}'; | ||||
|     } | ||||
|  | ||||
|     private Transaction depositMoney(BigDecimal money) { | ||||
|         this.money = this.money.add(money); | ||||
|         Transaction transaction = new Transaction(accountNo,money,BigDecimal.ZERO,this.money); | ||||
|         transactions.add(transaction); | ||||
|         return transaction; | ||||
|     } | ||||
|  | ||||
|     private Transaction withdrawMoney(BigDecimal money) { | ||||
|         this.money = this.money.subtract(money); | ||||
|         Transaction transaction = new Transaction(accountNo,BigDecimal.ZERO,money,this.money); | ||||
|         transactions.add(transaction); | ||||
|         return transaction; | ||||
|     } | ||||
|  | ||||
|     private void handleDeposit(BigDecimal money,boolean realTime) { | ||||
|         Transaction transaction = depositMoney(money); | ||||
|         AccountAggregate.putAccount(this); | ||||
|         if(realTime) { | ||||
|             Gateways.getTransactionLogger().log(transaction); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void handleWithdrawal(BigDecimal money, boolean realTime) { | ||||
|         if(this.money.compareTo(money)==-1){ | ||||
|             throw new RuntimeException("Insufficient Account Balance"); | ||||
|         } | ||||
|  | ||||
|         Transaction transaction = withdrawMoney(money); | ||||
|         AccountAggregate.putAccount(this); | ||||
|         if(realTime) { | ||||
|             Gateways.getTransactionLogger().log(transaction); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void handleEvent(MoneyDepositEvent moneyDepositEvent) { | ||||
|         handleDeposit(moneyDepositEvent.getMoney(),moneyDepositEvent.isRealTime()); | ||||
|     } | ||||
|   /** | ||||
|    * Handle transfer to event. | ||||
|    * | ||||
|    * @param moneyTransferEvent the money transfer event | ||||
|    */ | ||||
|   public void handleTransferToEvent(MoneyTransferEvent moneyTransferEvent) { | ||||
|     handleDeposit(moneyTransferEvent.getMoney(), moneyTransferEvent.isRealTime()); | ||||
|   } | ||||
|  | ||||
|  | ||||
|     public void handleEvent(MoneyWithdrawalEvent moneyWithdrawalEvent) { | ||||
|         handleWithdrawal(moneyWithdrawalEvent.getMoney(),moneyWithdrawalEvent.isRealTime()); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     public void handleTransferFromEvent(MoneyTransferEvent moneyTransferEvent) { | ||||
|         handleWithdrawal(moneyTransferEvent.getMoney(),moneyTransferEvent.isRealTime()); | ||||
|     } | ||||
|  | ||||
|     public void handleTransferToEvent(MoneyTransferEvent moneyTransferEvent) { | ||||
|         handleDeposit(moneyTransferEvent.getMoney(),moneyTransferEvent.isRealTime()); | ||||
|     } | ||||
|  | ||||
|     public void handleEvent(AccountCreateEvent accountCreateEvent) { | ||||
|         AccountAggregate.putAccount(this); | ||||
|         // check if this event is replicated from journal before calling an external gateway function | ||||
|         if(accountCreateEvent.isRealTime()) { | ||||
|             Gateways.getAccountCreateContractSender().sendContractInfo(this); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,3 +1,25 @@ | ||||
| /** | ||||
|  * The MIT License | ||||
|  * Copyright (c) 2014 Ilkka Seppälä | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| package com.iluwatar.event.sourcing.domain; | ||||
|  | ||||
| import java.math.BigDecimal; | ||||
| @@ -6,41 +28,71 @@ import java.math.BigDecimal; | ||||
|  * Created by serdarh on 06.08.2017. | ||||
|  */ | ||||
| public class Transaction { | ||||
|     private final int accountNo; | ||||
|     private final BigDecimal moneyIn; | ||||
|     private final BigDecimal moneyOut; | ||||
|     private final BigDecimal lastBalance; | ||||
|  | ||||
|     public Transaction(int accountNo, BigDecimal moneyIn, BigDecimal moneyOut, BigDecimal lastBalance) { | ||||
|         this.accountNo = accountNo; | ||||
|         this.moneyIn = moneyIn; | ||||
|         this.moneyOut = moneyOut; | ||||
|         this.lastBalance = lastBalance; | ||||
|     } | ||||
|   private final int accountNo; | ||||
|   private final BigDecimal moneyIn; | ||||
|   private final BigDecimal moneyOut; | ||||
|   private final BigDecimal lastBalance; | ||||
|  | ||||
|     public int getAccountNo() { | ||||
|         return accountNo; | ||||
|     } | ||||
|   /** | ||||
|    * Instantiates a new Transaction. | ||||
|    * | ||||
|    * @param accountNo the account no | ||||
|    * @param moneyIn the money in | ||||
|    * @param moneyOut the money out | ||||
|    * @param lastBalance the last balance | ||||
|    */ | ||||
|   public Transaction(int accountNo, BigDecimal moneyIn, BigDecimal moneyOut, | ||||
|       BigDecimal lastBalance) { | ||||
|     this.accountNo = accountNo; | ||||
|     this.moneyIn = moneyIn; | ||||
|     this.moneyOut = moneyOut; | ||||
|     this.lastBalance = lastBalance; | ||||
|   } | ||||
|  | ||||
|     public BigDecimal getMoneyIn() { | ||||
|         return moneyIn; | ||||
|     } | ||||
|   /** | ||||
|    * Gets account no. | ||||
|    * | ||||
|    * @return the account no | ||||
|    */ | ||||
|   public int getAccountNo() { | ||||
|     return accountNo; | ||||
|   } | ||||
|  | ||||
|     public BigDecimal getMoneyOut() { | ||||
|         return moneyOut; | ||||
|     } | ||||
|   /** | ||||
|    * Gets money in. | ||||
|    * | ||||
|    * @return the money in | ||||
|    */ | ||||
|   public BigDecimal getMoneyIn() { | ||||
|     return moneyIn; | ||||
|   } | ||||
|  | ||||
|     public BigDecimal getLastBalance() { | ||||
|         return lastBalance; | ||||
|     } | ||||
|   /** | ||||
|    * Gets money out. | ||||
|    * | ||||
|    * @return the money out | ||||
|    */ | ||||
|   public BigDecimal getMoneyOut() { | ||||
|     return moneyOut; | ||||
|   } | ||||
|  | ||||
|     @Override | ||||
|     public String toString() { | ||||
|         return "Transaction{" + | ||||
|                 "accountNo=" + accountNo + | ||||
|                 ", moneyIn=" + moneyIn + | ||||
|                 ", moneyOut=" + moneyOut + | ||||
|                 ", lastBalance=" + lastBalance + | ||||
|                 '}'; | ||||
|     } | ||||
|   /** | ||||
|    * Gets last balance. | ||||
|    * | ||||
|    * @return the last balance | ||||
|    */ | ||||
|   public BigDecimal getLastBalance() { | ||||
|     return lastBalance; | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public String toString() { | ||||
|     return "Transaction{" | ||||
|         + "accountNo=" + accountNo | ||||
|         + ", moneyIn=" + moneyIn | ||||
|         + ", moneyOut=" + moneyOut | ||||
|         + ", lastBalance=" + lastBalance | ||||
|         + '}'; | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,3 +1,25 @@ | ||||
| /** | ||||
|  * The MIT License | ||||
|  * Copyright (c) 2014 Ilkka Seppälä | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| package com.iluwatar.event.sourcing.event; | ||||
|  | ||||
| import com.iluwatar.event.sourcing.api.DomainEvent; | ||||
| @@ -8,30 +30,49 @@ import com.iluwatar.event.sourcing.state.AccountAggregate; | ||||
|  * Created by serdarh on 06.08.2017. | ||||
|  */ | ||||
| public class AccountCreateEvent extends DomainEvent { | ||||
|     private final int accountNo; | ||||
|     private final String owner; | ||||
|  | ||||
|     public AccountCreateEvent(long sequenceId, long createdTime, int accountNo, String owner) { | ||||
|         super(sequenceId, createdTime, "AccountCreateEvent"); | ||||
|         this.accountNo = accountNo; | ||||
|         this.owner = owner; | ||||
|     } | ||||
|   private final int accountNo; | ||||
|   private final String owner; | ||||
|  | ||||
|     public int getAccountNo() { | ||||
|         return accountNo; | ||||
|     } | ||||
|   /** | ||||
|    * Instantiates a new Account create event. | ||||
|    * | ||||
|    * @param sequenceId the sequence id | ||||
|    * @param createdTime the created time | ||||
|    * @param accountNo the account no | ||||
|    * @param owner the owner | ||||
|    */ | ||||
|   public AccountCreateEvent(long sequenceId, long createdTime, int accountNo, String owner) { | ||||
|     super(sequenceId, createdTime, "AccountCreateEvent"); | ||||
|     this.accountNo = accountNo; | ||||
|     this.owner = owner; | ||||
|   } | ||||
|  | ||||
|     public String getOwner() { | ||||
|         return owner; | ||||
|     } | ||||
|   /** | ||||
|    * Gets account no. | ||||
|    * | ||||
|    * @return the account no | ||||
|    */ | ||||
|   public int getAccountNo() { | ||||
|     return accountNo; | ||||
|   } | ||||
|  | ||||
|     @Override | ||||
|     public void process() { | ||||
|         Account account = AccountAggregate.getAccount(accountNo); | ||||
|         if(account!=null){ | ||||
|             throw new RuntimeException("Account already exists"); | ||||
|         } | ||||
|         account = new Account(accountNo,owner); | ||||
|         account.handleEvent(this); | ||||
|   /** | ||||
|    * Gets owner. | ||||
|    * | ||||
|    * @return the owner | ||||
|    */ | ||||
|   public String getOwner() { | ||||
|     return owner; | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void process() { | ||||
|     Account account = AccountAggregate.getAccount(accountNo); | ||||
|     if (account != null) { | ||||
|       throw new RuntimeException("Account already exists"); | ||||
|     } | ||||
|     account = new Account(accountNo, owner); | ||||
|     account.handleEvent(this); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,38 +1,78 @@ | ||||
| /** | ||||
|  * The MIT License | ||||
|  * Copyright (c) 2014 Ilkka Seppälä | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| package com.iluwatar.event.sourcing.event; | ||||
|  | ||||
| import com.iluwatar.event.sourcing.api.DomainEvent; | ||||
| import com.iluwatar.event.sourcing.domain.Account; | ||||
| import com.iluwatar.event.sourcing.state.AccountAggregate; | ||||
|  | ||||
| import java.math.BigDecimal; | ||||
|  | ||||
| /** | ||||
|  * Created by serdarh on 06.08.2017. | ||||
|  */ | ||||
| public class MoneyDepositEvent extends DomainEvent { | ||||
|     private BigDecimal money; | ||||
|     private int accountNo; | ||||
|  | ||||
|     public MoneyDepositEvent(long sequenceId, long createdTime, int accountNo,BigDecimal money) { | ||||
|         super(sequenceId, createdTime, "MoneyDepositEvent"); | ||||
|         this.money = money; | ||||
|         this.accountNo = accountNo; | ||||
|     } | ||||
|   private BigDecimal money; | ||||
|   private int accountNo; | ||||
|  | ||||
|     public BigDecimal getMoney() { | ||||
|         return money; | ||||
|     } | ||||
|   /** | ||||
|    * Instantiates a new Money deposit event. | ||||
|    * | ||||
|    * @param sequenceId the sequence id | ||||
|    * @param createdTime the created time | ||||
|    * @param accountNo the account no | ||||
|    * @param money the money | ||||
|    */ | ||||
|   public MoneyDepositEvent(long sequenceId, long createdTime, int accountNo, BigDecimal money) { | ||||
|     super(sequenceId, createdTime, "MoneyDepositEvent"); | ||||
|     this.money = money; | ||||
|     this.accountNo = accountNo; | ||||
|   } | ||||
|  | ||||
|     public int getAccountNo() { | ||||
|         return accountNo; | ||||
|     } | ||||
|   /** | ||||
|    * Gets money. | ||||
|    * | ||||
|    * @return the money | ||||
|    */ | ||||
|   public BigDecimal getMoney() { | ||||
|     return money; | ||||
|   } | ||||
|  | ||||
|     @Override | ||||
|     public void process() { | ||||
|         Account account = AccountAggregate.getAccount(accountNo); | ||||
|         if(account==null){ | ||||
|             throw new RuntimeException("Account not found"); | ||||
|         } | ||||
|         account.handleEvent(this); | ||||
|   /** | ||||
|    * Gets account no. | ||||
|    * | ||||
|    * @return the account no | ||||
|    */ | ||||
|   public int getAccountNo() { | ||||
|     return accountNo; | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void process() { | ||||
|     Account account = AccountAggregate.getAccount(accountNo); | ||||
|     if (account == null) { | ||||
|       throw new RuntimeException("Account not found"); | ||||
|     } | ||||
|     account.handleEvent(this); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,50 +1,97 @@ | ||||
| /** | ||||
|  * The MIT License | ||||
|  * Copyright (c) 2014 Ilkka Seppälä | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| package com.iluwatar.event.sourcing.event; | ||||
|  | ||||
| import com.iluwatar.event.sourcing.api.DomainEvent; | ||||
| import com.iluwatar.event.sourcing.domain.Account; | ||||
| import com.iluwatar.event.sourcing.state.AccountAggregate; | ||||
|  | ||||
| import java.math.BigDecimal; | ||||
|  | ||||
| /** | ||||
|  * Created by serdarh on 06.08.2017. | ||||
|  */ | ||||
| public class MoneyTransferEvent extends DomainEvent { | ||||
|     private BigDecimal money; | ||||
|     private int accountNoFrom; | ||||
|     private int accountNoTo; | ||||
|  | ||||
|     public MoneyTransferEvent(long sequenceId, long createdTime, BigDecimal money, int accountNoFrom, int accountNoTo) { | ||||
|         super(sequenceId, createdTime, "MoneyTransferEvent"); | ||||
|         this.money = money; | ||||
|         this.accountNoFrom = accountNoFrom; | ||||
|         this.accountNoTo = accountNoTo; | ||||
|   private BigDecimal money; | ||||
|   private int accountNoFrom; | ||||
|   private int accountNoTo; | ||||
|  | ||||
|   /** | ||||
|    * Instantiates a new Money transfer event. | ||||
|    * | ||||
|    * @param sequenceId the sequence id | ||||
|    * @param createdTime the created time | ||||
|    * @param money the money | ||||
|    * @param accountNoFrom the account no from | ||||
|    * @param accountNoTo the account no to | ||||
|    */ | ||||
|   public MoneyTransferEvent(long sequenceId, long createdTime, BigDecimal money, int accountNoFrom, | ||||
|       int accountNoTo) { | ||||
|     super(sequenceId, createdTime, "MoneyTransferEvent"); | ||||
|     this.money = money; | ||||
|     this.accountNoFrom = accountNoFrom; | ||||
|     this.accountNoTo = accountNoTo; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Gets money. | ||||
|    * | ||||
|    * @return the money | ||||
|    */ | ||||
|   public BigDecimal getMoney() { | ||||
|     return money; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Gets account no from. | ||||
|    * | ||||
|    * @return the account no from | ||||
|    */ | ||||
|   public int getAccountNoFrom() { | ||||
|     return accountNoFrom; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Gets account no to. | ||||
|    * | ||||
|    * @return the account no to | ||||
|    */ | ||||
|   public int getAccountNoTo() { | ||||
|     return accountNoTo; | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void process() { | ||||
|     Account accountFrom = AccountAggregate.getAccount(accountNoFrom); | ||||
|     if (accountFrom == null) { | ||||
|       throw new RuntimeException("Account not found " + accountNoFrom); | ||||
|     } | ||||
|     Account accountTo = AccountAggregate.getAccount(accountNoTo); | ||||
|     if (accountTo == null) { | ||||
|       throw new RuntimeException("Account not found" + accountTo); | ||||
|     } | ||||
|  | ||||
|     public BigDecimal getMoney() { | ||||
|         return money; | ||||
|     } | ||||
|  | ||||
|     public int getAccountNoFrom() { | ||||
|         return accountNoFrom; | ||||
|     } | ||||
|  | ||||
|     public int getAccountNoTo() { | ||||
|         return accountNoTo; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void process() { | ||||
|         Account accountFrom = AccountAggregate.getAccount(accountNoFrom); | ||||
|         if(accountFrom==null){ | ||||
|             throw new RuntimeException("Account not found "+accountNoFrom); | ||||
|         } | ||||
|         Account accountTo = AccountAggregate.getAccount(accountNoTo); | ||||
|         if(accountTo==null){ | ||||
|             throw new RuntimeException("Account not found"+ accountTo); | ||||
|         } | ||||
|  | ||||
|         accountFrom.handleTransferFromEvent(this); | ||||
|         accountTo.handleTransferToEvent(this); | ||||
|     } | ||||
|     accountFrom.handleTransferFromEvent(this); | ||||
|     accountTo.handleTransferToEvent(this); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,38 +1,78 @@ | ||||
| /** | ||||
|  * The MIT License | ||||
|  * Copyright (c) 2014 Ilkka Seppälä | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| package com.iluwatar.event.sourcing.event; | ||||
|  | ||||
| import com.iluwatar.event.sourcing.api.DomainEvent; | ||||
| import com.iluwatar.event.sourcing.domain.Account; | ||||
| import com.iluwatar.event.sourcing.state.AccountAggregate; | ||||
|  | ||||
| import java.math.BigDecimal; | ||||
|  | ||||
| /** | ||||
|  * Created by serdarh on 06.08.2017. | ||||
|  */ | ||||
| public class MoneyWithdrawalEvent extends DomainEvent { | ||||
|     private BigDecimal money; | ||||
|     private int accountNo; | ||||
|  | ||||
|     public MoneyWithdrawalEvent(long sequenceId, long createdTime, int accountNo,BigDecimal money) { | ||||
|         super(sequenceId, createdTime, "MoneyWithdrawalEvent"); | ||||
|         this.money = money; | ||||
|         this.accountNo = accountNo; | ||||
|     } | ||||
|   private BigDecimal money; | ||||
|   private int accountNo; | ||||
|  | ||||
|     public BigDecimal getMoney() { | ||||
|         return money; | ||||
|     } | ||||
|   /** | ||||
|    * Instantiates a new Money withdrawal event. | ||||
|    * | ||||
|    * @param sequenceId the sequence id | ||||
|    * @param createdTime the created time | ||||
|    * @param accountNo the account no | ||||
|    * @param money the money | ||||
|    */ | ||||
|   public MoneyWithdrawalEvent(long sequenceId, long createdTime, int accountNo, BigDecimal money) { | ||||
|     super(sequenceId, createdTime, "MoneyWithdrawalEvent"); | ||||
|     this.money = money; | ||||
|     this.accountNo = accountNo; | ||||
|   } | ||||
|  | ||||
|     public int getAccountNo() { | ||||
|         return accountNo; | ||||
|     } | ||||
|   /** | ||||
|    * Gets money. | ||||
|    * | ||||
|    * @return the money | ||||
|    */ | ||||
|   public BigDecimal getMoney() { | ||||
|     return money; | ||||
|   } | ||||
|  | ||||
|     @Override | ||||
|     public void process() { | ||||
|         Account account = AccountAggregate.getAccount(accountNo); | ||||
|         if(account==null){ | ||||
|             throw new RuntimeException("Account not found"); | ||||
|         } | ||||
|         account.handleEvent(this); | ||||
|   /** | ||||
|    * Gets account no. | ||||
|    * | ||||
|    * @return the account no | ||||
|    */ | ||||
|   public int getAccountNo() { | ||||
|     return accountNo; | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void process() { | ||||
|     Account account = AccountAggregate.getAccount(accountNo); | ||||
|     if (account == null) { | ||||
|       throw new RuntimeException("Account not found"); | ||||
|     } | ||||
|     account.handleEvent(this); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,3 +1,25 @@ | ||||
| /** | ||||
|  * The MIT License | ||||
|  * Copyright (c) 2014 Ilkka Seppälä | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| package com.iluwatar.event.sourcing.gateway; | ||||
|  | ||||
| import com.iluwatar.event.sourcing.domain.Account; | ||||
| @@ -6,7 +28,13 @@ import com.iluwatar.event.sourcing.domain.Account; | ||||
|  * Created by serdarh on 06.08.2017. | ||||
|  */ | ||||
| public class AccountCreateContractSender { | ||||
|     public void sendContractInfo(Account account){ | ||||
|         // an example imaginary funciton which sends account info to some external end point | ||||
|     } | ||||
|  | ||||
|   /** | ||||
|    * Send contract info. | ||||
|    * | ||||
|    * @param account the account | ||||
|    */ | ||||
|   public void sendContractInfo(Account account) { | ||||
|     // an example imaginary funciton which sends account info to some external end point | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,17 +1,50 @@ | ||||
| /** | ||||
|  * The MIT License | ||||
|  * Copyright (c) 2014 Ilkka Seppälä | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| package com.iluwatar.event.sourcing.gateway; | ||||
|  | ||||
| /** | ||||
|  * Created by serdarh on 06.08.2017. | ||||
|  */ | ||||
| public class Gateways { | ||||
|     private static AccountCreateContractSender accountCreateContractSender = new AccountCreateContractSender(); | ||||
|     private static TransactionLogger transactionLogger = new TransactionLogger(); | ||||
|  | ||||
|     public static AccountCreateContractSender getAccountCreateContractSender() { | ||||
|         return accountCreateContractSender; | ||||
|     } | ||||
|   private static AccountCreateContractSender accountCreateContractSender = new AccountCreateContractSender(); | ||||
|   private static TransactionLogger transactionLogger = new TransactionLogger(); | ||||
|  | ||||
|     public static TransactionLogger getTransactionLogger() { | ||||
|         return transactionLogger; | ||||
|     } | ||||
|   /** | ||||
|    * Gets account create contract sender. | ||||
|    * | ||||
|    * @return the account create contract sender | ||||
|    */ | ||||
|   public static AccountCreateContractSender getAccountCreateContractSender() { | ||||
|     return accountCreateContractSender; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Gets transaction logger. | ||||
|    * | ||||
|    * @return the transaction logger | ||||
|    */ | ||||
|   public static TransactionLogger getTransactionLogger() { | ||||
|     return transactionLogger; | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,3 +1,25 @@ | ||||
| /** | ||||
|  * The MIT License | ||||
|  * Copyright (c) 2014 Ilkka Seppälä | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| package com.iluwatar.event.sourcing.gateway; | ||||
|  | ||||
| import com.iluwatar.event.sourcing.domain.Transaction; | ||||
| @@ -6,7 +28,13 @@ import com.iluwatar.event.sourcing.domain.Transaction; | ||||
|  * Created by serdarh on 06.08.2017. | ||||
|  */ | ||||
| public class TransactionLogger { | ||||
|     public void log(Transaction transaction) { | ||||
|         // example imaginary function that logs the transaction to somewhere | ||||
|     } | ||||
|  | ||||
|   /** | ||||
|    * Log. | ||||
|    * | ||||
|    * @param transaction the transaction | ||||
|    */ | ||||
|   public void log(Transaction transaction) { | ||||
|     // example imaginary function that logs the transaction to somewhere | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,3 +1,25 @@ | ||||
| /** | ||||
|  * The MIT License | ||||
|  * Copyright (c) 2014 Ilkka Seppälä | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| package com.iluwatar.event.sourcing.journal; | ||||
|  | ||||
| import com.google.gson.Gson; | ||||
| @@ -9,91 +31,104 @@ import com.iluwatar.event.sourcing.event.AccountCreateEvent; | ||||
| import com.iluwatar.event.sourcing.event.MoneyDepositEvent; | ||||
| import com.iluwatar.event.sourcing.event.MoneyTransferEvent; | ||||
| import com.iluwatar.event.sourcing.event.MoneyWithdrawalEvent; | ||||
|  | ||||
| import java.io.*; | ||||
| import java.io.BufferedReader; | ||||
| import java.io.BufferedWriter; | ||||
| import java.io.File; | ||||
| import java.io.FileInputStream; | ||||
| import java.io.FileOutputStream; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStreamReader; | ||||
| import java.io.OutputStreamWriter; | ||||
| import java.io.Writer; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * Created by serdarh on 06.08.2017. | ||||
|  */ | ||||
| public class JsonFileJournal implements ProcessorJournal{ | ||||
| public class JsonFileJournal implements ProcessorJournal { | ||||
|  | ||||
|     private File aFile; | ||||
|     private List<String> events = new ArrayList<>(); | ||||
|     private int index = 0; | ||||
|     public JsonFileJournal() { | ||||
|         aFile = new File("Journal.json"); | ||||
|         if(aFile.exists()) { | ||||
|             try (BufferedReader input = new BufferedReader(new InputStreamReader(new FileInputStream(aFile), "UTF-8"))) { | ||||
|                 String line; | ||||
|                 while ((line = input.readLine()) != null) { | ||||
|                     events.add(line); | ||||
|                 } | ||||
|             } catch (IOException e) { | ||||
|                 throw new RuntimeException(e); | ||||
|             } | ||||
|         }else{ | ||||
|             reset(); | ||||
|   private File aFile; | ||||
|   private List<String> events = new ArrayList<>(); | ||||
|   private int index = 0; | ||||
|  | ||||
|   /** | ||||
|    * Instantiates a new Json file journal. | ||||
|    */ | ||||
|   public JsonFileJournal() { | ||||
|     aFile = new File("Journal.json"); | ||||
|     if (aFile.exists()) { | ||||
|       try (BufferedReader input = new BufferedReader( | ||||
|           new InputStreamReader(new FileInputStream(aFile), "UTF-8"))) { | ||||
|         String line; | ||||
|         while ((line = input.readLine()) != null) { | ||||
|           events.add(line); | ||||
|         } | ||||
|       } catch (IOException e) { | ||||
|         throw new RuntimeException(e); | ||||
|       } | ||||
|     } else { | ||||
|       reset(); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void write(DomainEvent domainEvent) { | ||||
|     Gson gson = new Gson(); | ||||
|     JsonElement jsonElement; | ||||
|     if (domainEvent instanceof AccountCreateEvent) { | ||||
|       jsonElement = gson.toJsonTree(domainEvent, AccountCreateEvent.class); | ||||
|     } else if (domainEvent instanceof MoneyDepositEvent) { | ||||
|       jsonElement = gson.toJsonTree(domainEvent, MoneyDepositEvent.class); | ||||
|     } else if (domainEvent instanceof MoneyWithdrawalEvent) { | ||||
|       jsonElement = gson.toJsonTree(domainEvent, MoneyWithdrawalEvent.class); | ||||
|     } else if (domainEvent instanceof MoneyTransferEvent) { | ||||
|       jsonElement = gson.toJsonTree(domainEvent, MoneyTransferEvent.class); | ||||
|     } else { | ||||
|       throw new RuntimeException("Journal Event not recegnized"); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void write(DomainEvent domainEvent) { | ||||
|         Gson gson = new Gson(); | ||||
|         JsonElement jsonElement; | ||||
|         if(domainEvent instanceof AccountCreateEvent) { | ||||
|             jsonElement = gson.toJsonTree(domainEvent, AccountCreateEvent.class); | ||||
|         }else if(domainEvent instanceof MoneyDepositEvent) { | ||||
|             jsonElement = gson.toJsonTree(domainEvent, MoneyDepositEvent.class); | ||||
|         }else if(domainEvent instanceof MoneyWithdrawalEvent) { | ||||
|             jsonElement = gson.toJsonTree(domainEvent, MoneyWithdrawalEvent.class); | ||||
|         }else if(domainEvent instanceof MoneyTransferEvent) { | ||||
|             jsonElement = gson.toJsonTree(domainEvent, MoneyTransferEvent.class); | ||||
|         }else{ | ||||
|             throw new RuntimeException("Journal Event not recegnized"); | ||||
|         } | ||||
|     try (Writer output = new BufferedWriter( | ||||
|         new OutputStreamWriter(new FileOutputStream(aFile, true), "UTF-8"))) { | ||||
|       String eventString = jsonElement.toString(); | ||||
|       output.write(eventString + "\r\n"); | ||||
|     } catch (IOException e) { | ||||
|       throw new RuntimeException(e); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|         try (Writer output = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(aFile, true), "UTF-8"))) { | ||||
|             String eventString = jsonElement.toString(); | ||||
|             output.write(eventString +"\r\n"); | ||||
|         } catch (IOException e) { | ||||
|             throw new RuntimeException(e); | ||||
|         } | ||||
|   @Override | ||||
|   public void reset() { | ||||
|     aFile.delete(); | ||||
|   } | ||||
|  | ||||
|  | ||||
|   @Override | ||||
|   public DomainEvent readNext() { | ||||
|     if (index >= events.size()) { | ||||
|       return null; | ||||
|     } | ||||
|     String event = events.get(index); | ||||
|     index++; | ||||
|  | ||||
|     JsonParser parser = new JsonParser(); | ||||
|     JsonElement jsonElement = parser.parse(event); | ||||
|     String eventClassName = jsonElement.getAsJsonObject().get("eventClassName").getAsString(); | ||||
|     Gson gson = new Gson(); | ||||
|     DomainEvent domainEvent; | ||||
|     if (eventClassName.equals("AccountCreateEvent")) { | ||||
|       domainEvent = gson.fromJson(jsonElement, AccountCreateEvent.class); | ||||
|     } else if (eventClassName.equals("MoneyDepositEvent")) { | ||||
|       domainEvent = gson.fromJson(jsonElement, MoneyDepositEvent.class); | ||||
|     } else if (eventClassName.equals("MoneyTransferEvent")) { | ||||
|       domainEvent = gson.fromJson(jsonElement, MoneyTransferEvent.class); | ||||
|     } else if (eventClassName.equals("MoneyWithdrawalEvent")) { | ||||
|       domainEvent = gson.fromJson(jsonElement, MoneyWithdrawalEvent.class); | ||||
|     } else { | ||||
|       throw new RuntimeException("Journal Event not recegnized"); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void reset() { | ||||
|             aFile.delete(); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     @Override | ||||
|     public DomainEvent readNext() { | ||||
|         if(index>=events.size()){ | ||||
|             return null; | ||||
|         } | ||||
|         String event = events.get(index); | ||||
|         index++; | ||||
|  | ||||
|         JsonParser parser = new JsonParser(); | ||||
|         JsonElement jsonElement = parser.parse(event); | ||||
|         String eventClassName = jsonElement.getAsJsonObject().get("eventClassName").getAsString(); | ||||
|         Gson gson = new Gson(); | ||||
|         DomainEvent domainEvent; | ||||
|         if(eventClassName.equals("AccountCreateEvent")) { | ||||
|             domainEvent = gson.fromJson(jsonElement, AccountCreateEvent.class); | ||||
|         }else if(eventClassName.equals("MoneyDepositEvent")) { | ||||
|             domainEvent = gson.fromJson(jsonElement, MoneyDepositEvent.class); | ||||
|         }else if(eventClassName.equals("MoneyTransferEvent")) { | ||||
|             domainEvent = gson.fromJson(jsonElement, MoneyTransferEvent.class); | ||||
|         }else if(eventClassName.equals("MoneyWithdrawalEvent")) { | ||||
|             domainEvent = gson.fromJson(jsonElement, MoneyWithdrawalEvent.class); | ||||
|         }else{ | ||||
|             throw new RuntimeException("Journal Event not recegnized"); | ||||
|         } | ||||
|  | ||||
|         domainEvent.setRealTime(false); | ||||
|         return domainEvent; | ||||
|     } | ||||
|     domainEvent.setRealTime(false); | ||||
|     return domainEvent; | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,3 +1,25 @@ | ||||
| /** | ||||
|  * The MIT License | ||||
|  * Copyright (c) 2014 Ilkka Seppälä | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| package com.iluwatar.event.sourcing.processor; | ||||
|  | ||||
| import com.iluwatar.event.sourcing.api.DomainEvent; | ||||
| @@ -9,29 +31,29 @@ import com.iluwatar.event.sourcing.api.ProcessorJournal; | ||||
|  */ | ||||
| public class DomainEventProcessor implements EventProcessor { | ||||
|  | ||||
|     private ProcessorJournal precessorJournal; | ||||
|   private ProcessorJournal precessorJournal; | ||||
|  | ||||
|     @Override | ||||
|     public void process(DomainEvent domainEvent) { | ||||
|             domainEvent.process(); | ||||
|             precessorJournal.write(domainEvent); | ||||
|     } | ||||
|   @Override | ||||
|   public void process(DomainEvent domainEvent) { | ||||
|     domainEvent.process(); | ||||
|     precessorJournal.write(domainEvent); | ||||
|   } | ||||
|  | ||||
|     @Override | ||||
|     public void setPrecessorJournal(ProcessorJournal precessorJournal) { | ||||
|         this.precessorJournal = precessorJournal; | ||||
|     } | ||||
|   @Override | ||||
|   public void setPrecessorJournal(ProcessorJournal precessorJournal) { | ||||
|     this.precessorJournal = precessorJournal; | ||||
|   } | ||||
|  | ||||
|     @Override | ||||
|     public void recover() { | ||||
|         DomainEvent domainEvent; | ||||
|         while(true) { | ||||
|             domainEvent = precessorJournal.readNext(); | ||||
|             if(domainEvent==null){ | ||||
|                 break; | ||||
|             }else{ | ||||
|                 domainEvent.process(); | ||||
|             } | ||||
|         } | ||||
|   @Override | ||||
|   public void recover() { | ||||
|     DomainEvent domainEvent; | ||||
|     while (true) { | ||||
|       domainEvent = precessorJournal.readNext(); | ||||
|       if (domainEvent == null) { | ||||
|         break; | ||||
|       } else { | ||||
|         domainEvent.process(); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,22 +1,56 @@ | ||||
| /** | ||||
|  * The MIT License | ||||
|  * Copyright (c) 2014 Ilkka Seppälä | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| package com.iluwatar.event.sourcing.service; | ||||
|  | ||||
| import com.iluwatar.event.sourcing.api.EventProcessor; | ||||
| import com.iluwatar.event.sourcing.event.AccountCreateEvent; | ||||
|  | ||||
| import java.util.Date; | ||||
|  | ||||
| /** | ||||
|  * Created by serdarh on 06.08.2017. | ||||
|  */ | ||||
| public class AccountService { | ||||
|     private EventProcessor eventProcessor; | ||||
|  | ||||
|     public AccountService(EventProcessor eventProcessor) { | ||||
|         this.eventProcessor = eventProcessor; | ||||
|     } | ||||
|   private EventProcessor eventProcessor; | ||||
|  | ||||
|     public void createAccount(int accountNo, String owner){ | ||||
|         AccountCreateEvent accountCreateEvent = new AccountCreateEvent(SequenceIdGenerator.nextSequenceId(), new Date().getTime(),accountNo,owner); | ||||
|         eventProcessor.process(accountCreateEvent); | ||||
|     } | ||||
|   /** | ||||
|    * Instantiates a new Account service. | ||||
|    * | ||||
|    * @param eventProcessor the event processor | ||||
|    */ | ||||
|   public AccountService(EventProcessor eventProcessor) { | ||||
|     this.eventProcessor = eventProcessor; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Create account. | ||||
|    * | ||||
|    * @param accountNo the account no | ||||
|    * @param owner the owner | ||||
|    */ | ||||
|   public void createAccount(int accountNo, String owner) { | ||||
|     AccountCreateEvent accountCreateEvent = new AccountCreateEvent( | ||||
|         SequenceIdGenerator.nextSequenceId(), new Date().getTime(), accountNo, owner); | ||||
|     eventProcessor.process(accountCreateEvent); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,10 +1,31 @@ | ||||
| /** | ||||
|  * The MIT License | ||||
|  * Copyright (c) 2014 Ilkka Seppälä | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| package com.iluwatar.event.sourcing.service; | ||||
|  | ||||
| import com.iluwatar.event.sourcing.api.EventProcessor; | ||||
| import com.iluwatar.event.sourcing.event.MoneyDepositEvent; | ||||
| import com.iluwatar.event.sourcing.event.MoneyTransferEvent; | ||||
| import com.iluwatar.event.sourcing.event.MoneyWithdrawalEvent; | ||||
|  | ||||
| import java.math.BigDecimal; | ||||
| import java.util.Date; | ||||
|  | ||||
| @@ -12,24 +33,53 @@ import java.util.Date; | ||||
|  * Created by serdarh on 06.08.2017. | ||||
|  */ | ||||
| public class MoneyTransactionService { | ||||
|     private EventProcessor eventProcessor; | ||||
|  | ||||
|     public MoneyTransactionService(EventProcessor eventProcessor) { | ||||
|         this.eventProcessor = eventProcessor; | ||||
|     } | ||||
|   private EventProcessor eventProcessor; | ||||
|  | ||||
|     public void depositMoney(int accountNo, BigDecimal money){ | ||||
|         MoneyDepositEvent moneyDepositEvent = new MoneyDepositEvent(SequenceIdGenerator.nextSequenceId(), new Date().getTime(), accountNo, money); | ||||
|         eventProcessor.process(moneyDepositEvent); | ||||
|     } | ||||
|   /** | ||||
|    * Instantiates a new Money transaction service. | ||||
|    * | ||||
|    * @param eventProcessor the event processor | ||||
|    */ | ||||
|   public MoneyTransactionService(EventProcessor eventProcessor) { | ||||
|     this.eventProcessor = eventProcessor; | ||||
|   } | ||||
|  | ||||
|     public void withdrawalMoney(int accountNo, BigDecimal money){ | ||||
|         MoneyWithdrawalEvent moneyWithdrawalEvent = new MoneyWithdrawalEvent(SequenceIdGenerator.nextSequenceId(), new Date().getTime(), accountNo, money); | ||||
|         eventProcessor.process(moneyWithdrawalEvent); | ||||
|     } | ||||
|   /** | ||||
|    * Deposit money. | ||||
|    * | ||||
|    * @param accountNo the account no | ||||
|    * @param money the money | ||||
|    */ | ||||
|   public void depositMoney(int accountNo, BigDecimal money) { | ||||
|     MoneyDepositEvent moneyDepositEvent = new MoneyDepositEvent( | ||||
|         SequenceIdGenerator.nextSequenceId(), new Date().getTime(), accountNo, money); | ||||
|     eventProcessor.process(moneyDepositEvent); | ||||
|   } | ||||
|  | ||||
|     public void transferMoney(int accountNoFrom, int accountNoTo, BigDecimal money){ | ||||
|         MoneyTransferEvent moneyTransferEvent = new MoneyTransferEvent(SequenceIdGenerator.nextSequenceId(), new Date().getTime(), money, accountNoFrom, accountNoTo); | ||||
|         eventProcessor.process(moneyTransferEvent); | ||||
|     } | ||||
|   /** | ||||
|    * Withdrawal money. | ||||
|    * | ||||
|    * @param accountNo the account no | ||||
|    * @param money the money | ||||
|    */ | ||||
|   public void withdrawalMoney(int accountNo, BigDecimal money) { | ||||
|     MoneyWithdrawalEvent moneyWithdrawalEvent = new MoneyWithdrawalEvent( | ||||
|         SequenceIdGenerator.nextSequenceId(), new Date().getTime(), accountNo, money); | ||||
|     eventProcessor.process(moneyWithdrawalEvent); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Transfer money. | ||||
|    * | ||||
|    * @param accountNoFrom the account no from | ||||
|    * @param accountNoTo the account no to | ||||
|    * @param money the money | ||||
|    */ | ||||
|   public void transferMoney(int accountNoFrom, int accountNoTo, BigDecimal money) { | ||||
|     MoneyTransferEvent moneyTransferEvent = new MoneyTransferEvent( | ||||
|         SequenceIdGenerator.nextSequenceId(), new Date().getTime(), money, accountNoFrom, | ||||
|         accountNoTo); | ||||
|     eventProcessor.process(moneyTransferEvent); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,14 +1,42 @@ | ||||
| /** | ||||
|  * The MIT License | ||||
|  * Copyright (c) 2014 Ilkka Seppälä | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| package com.iluwatar.event.sourcing.service; | ||||
|  | ||||
| /** | ||||
|  * Created by serdarh on 06.08.2017. | ||||
|  */ | ||||
| public class SequenceIdGenerator { | ||||
|     private static long sequenceId = 0L; | ||||
|  | ||||
|     public static long nextSequenceId(){ | ||||
|         sequenceId++; | ||||
|         return sequenceId; | ||||
|     } | ||||
|   private static long sequenceId = 0L; | ||||
|  | ||||
|   /** | ||||
|    * Next sequence id long. | ||||
|    * | ||||
|    * @return the long | ||||
|    */ | ||||
|   public static long nextSequenceId() { | ||||
|     sequenceId++; | ||||
|     return sequenceId; | ||||
|   } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -1,7 +1,28 @@ | ||||
| /** | ||||
|  * The MIT License | ||||
|  * Copyright (c) 2014 Ilkka Seppälä | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
| package com.iluwatar.event.sourcing.state; | ||||
|  | ||||
| import com.iluwatar.event.sourcing.domain.Account; | ||||
|  | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
|  | ||||
| @@ -9,21 +30,36 @@ import java.util.Map; | ||||
|  * Created by serdarh on 06.08.2017. | ||||
|  */ | ||||
| public class AccountAggregate { | ||||
|     private static Map<Integer,Account> accounts = new HashMap<>(); | ||||
|  | ||||
|     public static void putAccount(Account account){ | ||||
|         accounts.put(account.getAccountNo(), account); | ||||
|     } | ||||
|   private static Map<Integer, Account> accounts = new HashMap<>(); | ||||
|  | ||||
|     public static Account getAccount(int accountNo){ | ||||
|         Account account = accounts.get(accountNo); | ||||
|         if(account == null){ | ||||
|             return null; | ||||
|         } | ||||
|         return account.copy(); | ||||
|     } | ||||
|   /** | ||||
|    * Put account. | ||||
|    * | ||||
|    * @param account the account | ||||
|    */ | ||||
|   public static void putAccount(Account account) { | ||||
|     accounts.put(account.getAccountNo(), account); | ||||
|   } | ||||
|  | ||||
|     public static void resetState(){ | ||||
|         accounts = new HashMap<>(); | ||||
|   /** | ||||
|    * Gets account. | ||||
|    * | ||||
|    * @param accountNo the account no | ||||
|    * @return the account | ||||
|    */ | ||||
|   public static Account getAccount(int accountNo) { | ||||
|     Account account = accounts.get(accountNo); | ||||
|     if (account == null) { | ||||
|       return null; | ||||
|     } | ||||
|     return account.copy(); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Reset state. | ||||
|    */ | ||||
|   public static void resetState() { | ||||
|     accounts = new HashMap<>(); | ||||
|   } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user