From 163627ab46ffe28d702ce14ddbacc6e061e803be Mon Sep 17 00:00:00 2001 From: Anant Akash Date: Fri, 28 Mar 2025 14:35:22 +0530 Subject: [PATCH 01/19] Splitwise Implementation --- SplitWiseImpl/.gitignore | 1 + .../src/com/application/Application.java | 67 +++++++++++++ .../src/com/dataStore/UserDataStore.java | 56 +++++++++++ .../src/com/dataStore/UserDetails.java | 54 +++++++++++ .../UserPairOwedAmountDataStore.java | 83 ++++++++++++++++ .../src/com/enums/InputValidationResult.java | 7 ++ .../src/com/enums/SplitStrategyType.java | 7 ++ .../EqualDivisionSplitStrategy.java | 89 +++++++++++++++++ .../EqualStrategyInutGenerator.java | 17 ++++ .../EqualStrategySplitInput.java | 23 +++++ .../ExactDivisionSplitStrategy.java | 95 +++++++++++++++++++ .../ExactStartegyInputGenerator.java | 34 +++++++ .../ExactStrategySplitInput.java | 31 ++++++ .../src/com/factory/DataStoreFactory.java | 30 ++++++ .../src/com/factory/StrategyListFactory.java | 55 +++++++++++ .../src/com/interfaces/IApplication.java | 16 ++++ .../src/com/interfaces/IDataStoreFactory.java | 7 ++ .../src/com/interfaces/IInputReader.java | 7 ++ .../src/com/interfaces/ISplitInput.java | 7 ++ .../src/com/interfaces/ISplitStrategy.java | 10 ++ .../interfaces/IStrategyInputGenerator.java | 7 ++ .../src/com/interfaces/IStrategyList.java | 9 ++ .../com/interfaces/IStrategyListFactory.java | 7 ++ SplitWiseImpl/src/com/interfaces/IUser.java | 9 ++ .../src/com/interfaces/IUserDataStore.java | 13 +++ .../IUserPairOwedAmountDataStore.java | 13 +++ .../src/com/ioParser/InputReader.java | 73 ++++++++++++++ .../PercentDivisionInputGenerator.java | 34 +++++++ .../PercentDivisionSplitInput.java | 27 ++++++ .../PercentDivisionSplitStrategy.java | 89 +++++++++++++++++ .../src/com/splitObjects/SplitInput.java | 48 ++++++++++ .../src/com/splitObjects/SplitResult.java | 36 +++++++ .../splitObjects/StrategyInputGenerator.java | 19 ++++ SplitWiseImpl/src/module-info.java | 8 ++ 34 files changed, 1088 insertions(+) create mode 100644 SplitWiseImpl/.gitignore create mode 100644 SplitWiseImpl/src/com/application/Application.java create mode 100644 SplitWiseImpl/src/com/dataStore/UserDataStore.java create mode 100644 SplitWiseImpl/src/com/dataStore/UserDetails.java create mode 100644 SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java create mode 100644 SplitWiseImpl/src/com/enums/InputValidationResult.java create mode 100644 SplitWiseImpl/src/com/enums/SplitStrategyType.java create mode 100644 SplitWiseImpl/src/com/equalDivisionStrategy/EqualDivisionSplitStrategy.java create mode 100644 SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategyInutGenerator.java create mode 100644 SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategySplitInput.java create mode 100644 SplitWiseImpl/src/com/exactDivisionStrategy/ExactDivisionSplitStrategy.java create mode 100644 SplitWiseImpl/src/com/exactDivisionStrategy/ExactStartegyInputGenerator.java create mode 100644 SplitWiseImpl/src/com/exactDivisionStrategy/ExactStrategySplitInput.java create mode 100644 SplitWiseImpl/src/com/factory/DataStoreFactory.java create mode 100644 SplitWiseImpl/src/com/factory/StrategyListFactory.java create mode 100644 SplitWiseImpl/src/com/interfaces/IApplication.java create mode 100644 SplitWiseImpl/src/com/interfaces/IDataStoreFactory.java create mode 100644 SplitWiseImpl/src/com/interfaces/IInputReader.java create mode 100644 SplitWiseImpl/src/com/interfaces/ISplitInput.java create mode 100644 SplitWiseImpl/src/com/interfaces/ISplitStrategy.java create mode 100644 SplitWiseImpl/src/com/interfaces/IStrategyInputGenerator.java create mode 100644 SplitWiseImpl/src/com/interfaces/IStrategyList.java create mode 100644 SplitWiseImpl/src/com/interfaces/IStrategyListFactory.java create mode 100644 SplitWiseImpl/src/com/interfaces/IUser.java create mode 100644 SplitWiseImpl/src/com/interfaces/IUserDataStore.java create mode 100644 SplitWiseImpl/src/com/interfaces/IUserPairOwedAmountDataStore.java create mode 100644 SplitWiseImpl/src/com/ioParser/InputReader.java create mode 100644 SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionInputGenerator.java create mode 100644 SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitInput.java create mode 100644 SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitStrategy.java create mode 100644 SplitWiseImpl/src/com/splitObjects/SplitInput.java create mode 100644 SplitWiseImpl/src/com/splitObjects/SplitResult.java create mode 100644 SplitWiseImpl/src/com/splitObjects/StrategyInputGenerator.java create mode 100644 SplitWiseImpl/src/module-info.java diff --git a/SplitWiseImpl/.gitignore b/SplitWiseImpl/.gitignore new file mode 100644 index 00000000..ae3c1726 --- /dev/null +++ b/SplitWiseImpl/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/SplitWiseImpl/src/com/application/Application.java b/SplitWiseImpl/src/com/application/Application.java new file mode 100644 index 00000000..b174ce32 --- /dev/null +++ b/SplitWiseImpl/src/com/application/Application.java @@ -0,0 +1,67 @@ +package com.application; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import com.enums.SplitStrategyType; +import com.interfaces.IApplication; +import com.interfaces.IDataStoreFactory; +import com.interfaces.IInputReader; +import com.interfaces.ISplitInput; +import com.interfaces.IStrategyList; +import com.interfaces.IStrategyListFactory; +import com.interfaces.IUserDataStore; +import com.interfaces.IUserPairOwedAmountDataStore; +import com.splitObjects.SplitResult; + +public class Application implements IApplication { + + private IUserPairOwedAmountDataStore userPairOwedAmountDataStore; + + private IStrategyList strategyList; + + private IInputReader inputReader; + + + + Application(IDataStoreFactory dataStoreFactory, IStrategyListFactory strategyListFactory, List strategiesPresnt, IInputReader inputReader) { + + this.userPairOwedAmountDataStore = dataStoreFactory.getUserPairOwedAmountDataStore(); + + this.strategyList = strategyListFactory.getStrategyList(strategiesPresnt); + + this.inputReader = inputReader; + } + + @Override + public boolean addExpense(List expenseInput) { + ISplitInput splitInput = this.inputReader.parseInput(expenseInput); + + if (splitInput == null) { + return false; + } + + SplitResult splitResult = this.strategyList.getSplitStrategies().get(splitInput.getSplitInputType()).getFinalSplit(splitInput); + + return this.userPairOwedAmountDataStore.updateAmountForEntries(splitResult); + } + + @Override + public SplitResult getBalanceForUser(String userId) { + + return this.getBalanceForUser(userId); + } + + @Override + public SplitResult getAllBalances() { + // TODO Auto-generated method stub + return this.userPairOwedAmountDataStore.getBalancesForAllUsers(); + } + + @Override + public List getStrategiesName() { + return new ArrayList(this.strategyList.getSplitStrategies().keySet()); + } + +} diff --git a/SplitWiseImpl/src/com/dataStore/UserDataStore.java b/SplitWiseImpl/src/com/dataStore/UserDataStore.java new file mode 100644 index 00000000..56a3753f --- /dev/null +++ b/SplitWiseImpl/src/com/dataStore/UserDataStore.java @@ -0,0 +1,56 @@ +package com.dataStore; + +import java.util.HashMap; + +import com.interfaces.IUserDataStore; + +public class UserDataStore implements IUserDataStore { + HashMap userDetailMap = new HashMap(); + @Override + public UserDetails getUserDetails(String userId) { + // TODO Auto-generated method stub + return this.userDetailMap.get(userId); + } + + @Override + public boolean addNewUser(UserDetails userDetails) { + if (userDetails != null && userDetails.getUserId() != null && !userDetails.getUserId().equals("")) { + this.userDetailMap.put(userDetails.getUserId(), userDetails); + + return true; + } + + return false; + } + + @Override + public boolean deleteUser(String userId) { + if (userId != null && !userId.equals("")) { + this.userDetailMap.remove(userId); + + return true; + } + return false; + } + + @Override + public boolean updateUserDetails(String userId, UserDetails userDetails) { + if (userId != null && !userId.equals("") && userDetails != null) { + if (userDetails.getName() != null) { + this.userDetailMap.get(userId).setName(userDetails.getName()); + } + + if (userDetails.getEmail() != null) { + this.userDetailMap.get(userId).setEmail(userDetails.getEmail()); + } + + if (userDetails.getPhoneNumber() != null) { + this.userDetailMap.get(userId).setPhoneNumber(userDetails.getPhoneNumber()); + } + + return true; + } + return false; + } + +} diff --git a/SplitWiseImpl/src/com/dataStore/UserDetails.java b/SplitWiseImpl/src/com/dataStore/UserDetails.java new file mode 100644 index 00000000..8336fbf8 --- /dev/null +++ b/SplitWiseImpl/src/com/dataStore/UserDetails.java @@ -0,0 +1,54 @@ +package com.dataStore; + +public class UserDetails { + + String userId; + String name; + + String email; + + String phoneNumber; + + public UserDetails(String userId, String name, String email, String phoneNumber) { + super(); + this.userId = userId; + this.name = name; + this.email = email; + this.phoneNumber = phoneNumber; + } + + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + +} diff --git a/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java b/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java new file mode 100644 index 00000000..9e00493a --- /dev/null +++ b/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java @@ -0,0 +1,83 @@ +package com.dataStore; + +import java.util.HashMap; +import java.util.Iterator; + +import com.interfaces.IUserPairOwedAmountDataStore; +import com.splitObjects.SplitResult; + +public class UserPairOwedAmountDataStore implements IUserPairOwedAmountDataStore { + private HashMap> owedByMap = new HashMap>(); + private HashMap> owesToMap = new HashMap>(); + + + @Override + public boolean updateAmount(String userId1, String userId2, double amount) { + double amountOwed = amount; + if (this.owedByMap.containsKey(userId2) && this.owedByMap.get(userId2).containsKey(userId1)) { + amountOwed = amount - owedByMap.get(userId2).get(userId1); + + if (amountOwed > 0) { + this.owedByMap.get(userId2).put(userId1, amountOwed); + + this.owesToMap.get(userId1).put(userId2, amountOwed); + + return true; + } + + this.owedByMap.get(userId2).remove(userId1); + this.owesToMap.get(userId1).remove(userId2); + } + + + + if (!this.owedByMap.containsKey(userId1)) { + this.owedByMap.put(userId1, new HashMap()); + } + + this.owedByMap.get(userId1).put(userId2, amountOwed); + + if (!owesToMap.containsKey(userId2)) { + this.owesToMap.put(userId2, new HashMap()); + } + + this.owesToMap.get(userId2).put(userId1, amountOwed); + + return true; + } + + @Override + public SplitResult getBalancesForUser(String userId) { + SplitResult result = new SplitResult(); + + result.getOwedBy().put(userId, this.owedByMap.get(userId)); + + result.getOwedTo().put(userId, this.owesToMap.get(userId)); + + return result; + } + + @Override + public SplitResult getBalancesForAllUsers() { + return new SplitResult(owedByMap, owedByMap, null, null); + } + + @Override + public boolean updateAmountForEntries(SplitResult splitResult) { + Iterator it = splitResult.getOwedBy().keySet().iterator(); + while (it.hasNext()) { + String next = it.next(); + + Iterator it1 = splitResult.getOwedBy().get(next).keySet().iterator(); + + while (it1.hasNext()) { + String next1 = it1.next(); + + this.updateAmount(next, next1, splitResult.getOwedBy().get(next).get(next1)); + } + } + + return true; + } + +} diff --git a/SplitWiseImpl/src/com/enums/InputValidationResult.java b/SplitWiseImpl/src/com/enums/InputValidationResult.java new file mode 100644 index 00000000..00e1d133 --- /dev/null +++ b/SplitWiseImpl/src/com/enums/InputValidationResult.java @@ -0,0 +1,7 @@ +package com.enums; + +public enum InputValidationResult { + VALID, + WRONG_INPUT_FORMAT, + SUM_NOT_EQUAL_TO_TOTAL_PAID +} diff --git a/SplitWiseImpl/src/com/enums/SplitStrategyType.java b/SplitWiseImpl/src/com/enums/SplitStrategyType.java new file mode 100644 index 00000000..2792c3f4 --- /dev/null +++ b/SplitWiseImpl/src/com/enums/SplitStrategyType.java @@ -0,0 +1,7 @@ +package com.enums; + +public enum SplitStrategyType { + EXACT, + EQUAL, + PERCENT +} diff --git a/SplitWiseImpl/src/com/equalDivisionStrategy/EqualDivisionSplitStrategy.java b/SplitWiseImpl/src/com/equalDivisionStrategy/EqualDivisionSplitStrategy.java new file mode 100644 index 00000000..8748a769 --- /dev/null +++ b/SplitWiseImpl/src/com/equalDivisionStrategy/EqualDivisionSplitStrategy.java @@ -0,0 +1,89 @@ +package com.equalDivisionStrategy; + +import java.util.HashMap; +import java.util.ListIterator; + +import com.enums.InputValidationResult; +import com.enums.SplitStrategyType; +import com.interfaces.ISplitInput; +import com.interfaces.ISplitStrategy; +import com.splitObjects.SplitResult; + +public class EqualDivisionSplitStrategy implements ISplitStrategy { + + + public EqualDivisionSplitStrategy() { + // TODO Auto-generated constructor stub + } + + @Override + public SplitResult getFinalSplit(ISplitInput splitInput) { + + if (this.verifyInput(splitInput) != InputValidationResult.VALID) { + return null; + } + + EqualStrategySplitInput input; + + input = (EqualStrategySplitInput) splitInput; + + + HashMap> owedByMap = new HashMap>(); + HashMap> owedToMap = new HashMap>(); + HashMap owedMap = new HashMap(); + HashMap owesMap = new HashMap(); + + double amountPerPerson = input.getPaidAmount() / input.getParticipants().size(); + + owedByMap.put(input.getPaidBy(), new HashMap()); + + + ListIterator it = input.getParticipants().listIterator(); + + while (it.hasNext()) { + String next = it.next(); + + if (owedByMap.containsKey(next)) { + continue; + } + + owedByMap.get(input.getPaidBy()).put(next, amountPerPerson); + + if (!owedToMap.containsKey(next)) { + owedToMap.put(next, new HashMap()); + } + + owedToMap.get(next).put(input.getPaidBy(), amountPerPerson); + + owesMap.put(next, amountPerPerson); + + } + + owedMap.put(input.getPaidBy(), amountPerPerson * input.getParticipants().size()); + + return new SplitResult(owedByMap, owedToMap, owedMap, owesMap); + + } + + @Override + public InputValidationResult verifyInput(ISplitInput splitInput) { + try { + EqualStrategySplitInput input; + + input = (EqualStrategySplitInput) splitInput; + + return input != null ? InputValidationResult.VALID : InputValidationResult.WRONG_INPUT_FORMAT; + } catch (Exception e) { + return InputValidationResult.WRONG_INPUT_FORMAT; + } + } + + @Override + public SplitStrategyType getSpliStrategyType() { + // TODO Auto-generated method stub + return SplitStrategyType.EQUAL; + } + + + +} diff --git a/SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategyInutGenerator.java b/SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategyInutGenerator.java new file mode 100644 index 00000000..914a2fc3 --- /dev/null +++ b/SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategyInutGenerator.java @@ -0,0 +1,17 @@ +package com.equalDivisionStrategy; + +import java.util.List; + +import com.interfaces.ISplitInput; +import com.splitObjects.SplitInput; +import com.splitObjects.StrategyInputGenerator; + +public class EqualStrategyInutGenerator extends StrategyInputGenerator { + + @Override + public EqualStrategySplitInput generateSplitInput(ISplitInput baseInput, List input, int lastVisitedIndex) { + SplitInput baseInput2 = super.generateSplitInput(baseInput, input, lastVisitedIndex); + + return new EqualStrategySplitInput(baseInput2.getPaidBy(), baseInput2.getParticipants(), baseInput2.getPaidAmount()); + } +} diff --git a/SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategySplitInput.java b/SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategySplitInput.java new file mode 100644 index 00000000..85b961e2 --- /dev/null +++ b/SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategySplitInput.java @@ -0,0 +1,23 @@ +package com.equalDivisionStrategy; + +import java.util.List; + +import com.enums.SplitStrategyType; +import com.splitObjects.SplitInput; + +public class EqualStrategySplitInput extends SplitInput { + + public EqualStrategySplitInput(String paidBy, List participants, double paidAmount) { + super(paidBy, participants, paidAmount); + } + + @Override + public SplitStrategyType getSplitInputType() { + + // TODO Auto-generated method stub + return SplitStrategyType.EQUAL; + } + + + +} diff --git a/SplitWiseImpl/src/com/exactDivisionStrategy/ExactDivisionSplitStrategy.java b/SplitWiseImpl/src/com/exactDivisionStrategy/ExactDivisionSplitStrategy.java new file mode 100644 index 00000000..fa8d8a7b --- /dev/null +++ b/SplitWiseImpl/src/com/exactDivisionStrategy/ExactDivisionSplitStrategy.java @@ -0,0 +1,95 @@ +package com.exactDivisionStrategy; + +import java.util.HashMap; +import java.util.Iterator; + +import com.enums.InputValidationResult; +import com.enums.SplitStrategyType; +import com.interfaces.ISplitInput; +import com.interfaces.ISplitStrategy; +import com.splitObjects.SplitResult; + +public class ExactDivisionSplitStrategy implements ISplitStrategy { + + @Override + public InputValidationResult verifyInput(ISplitInput splitInput) { + ExactStrategySplitInput input; + + try { + input = (ExactStrategySplitInput) splitInput; + + double sum = 0.0; + + Iterator it = input.getExactAmountOwedMap().keySet().iterator(); + + while (it.hasNext()) { + sum += input.getExactAmountOwedMap().get(it.next()); + } + + double diff = sum - input.getPaidAmount(); + + if (diff < 0) { + diff *= -1.0; + } + + if (diff > 0.01) { + return InputValidationResult.SUM_NOT_EQUAL_TO_TOTAL_PAID; + } + + return InputValidationResult.VALID; + } catch (Exception e) { + return InputValidationResult.WRONG_INPUT_FORMAT; + } + } + + @Override + public SplitResult getFinalSplit(ISplitInput splitInput) { + if (this.verifyInput(splitInput) != InputValidationResult.VALID) { + return null; + } + + ExactStrategySplitInput input = (ExactStrategySplitInput) splitInput; + + HashMap> owedByMap = new HashMap>(); + HashMap> owedToMap = new HashMap>(); + HashMap owedMap = new HashMap(); + HashMap owesMap = new HashMap(); + + owedByMap.put(input.getPaidBy(), new HashMap()); + + Iterator it = input.getExactAmountOwedMap().keySet().iterator(); + + double sum = 0.0; + + while (it.hasNext()) { + String next = it.next(); + + if (owedByMap.containsKey(next)) { + continue; + } + + owedByMap.get(input.getPaidBy()).put(next, input.getExactAmountOwedMap().get(next)); + + if (!owedToMap.containsKey(next)) { + owedToMap.put(next, new HashMap()); + } + + owedToMap.get(next).put(input.getPaidBy(), input.getExactAmountOwedMap().get(next)); + + owesMap.put(next, input.getExactAmountOwedMap().get(next)); + + sum += input.getExactAmountOwedMap().get(next); + } + + owedMap.put(input.getPaidBy(), sum); + + return new SplitResult(owedByMap, owedToMap, owedMap, owesMap); + } + + @Override + public SplitStrategyType getSpliStrategyType() { + // TODO Auto-generated method stub + return SplitStrategyType.EXACT; + } + +} diff --git a/SplitWiseImpl/src/com/exactDivisionStrategy/ExactStartegyInputGenerator.java b/SplitWiseImpl/src/com/exactDivisionStrategy/ExactStartegyInputGenerator.java new file mode 100644 index 00000000..a4bb846a --- /dev/null +++ b/SplitWiseImpl/src/com/exactDivisionStrategy/ExactStartegyInputGenerator.java @@ -0,0 +1,34 @@ +package com.exactDivisionStrategy; + +import java.util.HashMap; +import java.util.List; +import com.interfaces.ISplitInput; +import com.splitObjects.SplitInput; +import com.splitObjects.StrategyInputGenerator; + +public class ExactStartegyInputGenerator extends StrategyInputGenerator { + @Override + public ExactStrategySplitInput generateSplitInput(ISplitInput baseInput, List input, int lastVisitedIndex) { + SplitInput baseInput2 = super.generateSplitInput(baseInput, input, lastVisitedIndex); + + int i = lastVisitedIndex; + i++; + HashMap amountOwedMap = new HashMap(); + + int count = 0; + + while (count < baseInput2.getParticipants().size()) { + + if (i < input.size()) { + amountOwedMap.put(baseInput2.getParticipants().get(count), Double.parseDouble(input.get(i))); + i++; + } else { + amountOwedMap.put(baseInput2.getParticipants().get(count), 0.0); + } + + count++; + } + return new ExactStrategySplitInput(baseInput2.getPaidBy(), baseInput2.getParticipants(), baseInput2.getPaidAmount(), amountOwedMap); + + } +} diff --git a/SplitWiseImpl/src/com/exactDivisionStrategy/ExactStrategySplitInput.java b/SplitWiseImpl/src/com/exactDivisionStrategy/ExactStrategySplitInput.java new file mode 100644 index 00000000..52c63972 --- /dev/null +++ b/SplitWiseImpl/src/com/exactDivisionStrategy/ExactStrategySplitInput.java @@ -0,0 +1,31 @@ +package com.exactDivisionStrategy; + +import java.util.HashMap; +import java.util.List; + +import com.enums.SplitStrategyType; +import com.splitObjects.SplitInput; + +public class ExactStrategySplitInput extends SplitInput { + + private HashMap exactAmountOwedMap; + + public ExactStrategySplitInput(String paidBy, List participants, double paidAmount, + HashMap exactAmountOwedMap) { + super(paidBy, participants, paidAmount); + this.exactAmountOwedMap = exactAmountOwedMap; + } + + public HashMap getExactAmountOwedMap() { + return exactAmountOwedMap; + } + + @Override + public SplitStrategyType getSplitInputType() { + + // TODO Auto-generated method stub + return SplitStrategyType.EXACT; + } + + +} diff --git a/SplitWiseImpl/src/com/factory/DataStoreFactory.java b/SplitWiseImpl/src/com/factory/DataStoreFactory.java new file mode 100644 index 00000000..83c62fb6 --- /dev/null +++ b/SplitWiseImpl/src/com/factory/DataStoreFactory.java @@ -0,0 +1,30 @@ +package com.factory; + +import com.dataStore.UserDataStore; +import com.dataStore.UserPairOwedAmountDataStore; +import com.interfaces.IDataStoreFactory; +import com.interfaces.IUserDataStore; +import com.interfaces.IUserPairOwedAmountDataStore; + +public class DataStoreFactory implements IDataStoreFactory { + private IUserDataStore userDataStore; + + private IUserPairOwedAmountDataStore userPairOwedAmountDataStore; + @Override + public IUserDataStore getUserDataStore() { + if (userDataStore == null) { + this.userDataStore = new UserDataStore(); + } + return this.userDataStore; + } + + @Override + public IUserPairOwedAmountDataStore getUserPairOwedAmountDataStore() { + if (userPairOwedAmountDataStore == null) { + this.userPairOwedAmountDataStore = new UserPairOwedAmountDataStore(); + } + + return this.userPairOwedAmountDataStore; + } + +} diff --git a/SplitWiseImpl/src/com/factory/StrategyListFactory.java b/SplitWiseImpl/src/com/factory/StrategyListFactory.java new file mode 100644 index 00000000..b3bcaddc --- /dev/null +++ b/SplitWiseImpl/src/com/factory/StrategyListFactory.java @@ -0,0 +1,55 @@ +package com.factory; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import com.enums.SplitStrategyType; +import com.equalDivisionStrategy.EqualDivisionSplitStrategy; +import com.exactDivisionStrategy.ExactDivisionSplitStrategy; +import com.interfaces.ISplitStrategy; +import com.interfaces.IStrategyList; +import com.interfaces.IStrategyListFactory; +import com.percentDivisionStrategy.PercentDivisionSplitStrategy; + +public class StrategyListFactory implements IStrategyListFactory { + + public StrategyListFactory() { + this.strategyMap.put(SplitStrategyType.EXACT, new ExactDivisionSplitStrategy()); + this.strategyMap.put(SplitStrategyType.EQUAL, new EqualDivisionSplitStrategy()); + this.strategyMap.put(SplitStrategyType.PERCENT, new PercentDivisionSplitStrategy()); + } + + + + private HashMap strategyMap = new HashMap(); + + + + @Override + public IStrategyList getStrategyList(List strategiesPresent) { + Map result = new LinkedHashMap(); + + Iterator it = strategiesPresent.listIterator(); + + while (it.hasNext()) { + SplitStrategyType next = SplitStrategyType.valueOf(it.next()); + + if (this.strategyMap.containsKey(next)) { + result.put(next, this.strategyMap.get(next)); + } + } + + return new IStrategyList() { + + @Override + public Map getSplitStrategies() { + // TODO Auto-generated method stub + return result; + } + }; + } + +} diff --git a/SplitWiseImpl/src/com/interfaces/IApplication.java b/SplitWiseImpl/src/com/interfaces/IApplication.java new file mode 100644 index 00000000..9474cd80 --- /dev/null +++ b/SplitWiseImpl/src/com/interfaces/IApplication.java @@ -0,0 +1,16 @@ +package com.interfaces; + +import java.util.List; + +import com.enums.SplitStrategyType; +import com.splitObjects.SplitResult; + +public interface IApplication { + boolean addExpense(List expenseInput); + + SplitResult getBalanceForUser(String userId); + + SplitResult getAllBalances(); + + List getStrategiesName(); +} diff --git a/SplitWiseImpl/src/com/interfaces/IDataStoreFactory.java b/SplitWiseImpl/src/com/interfaces/IDataStoreFactory.java new file mode 100644 index 00000000..324faf72 --- /dev/null +++ b/SplitWiseImpl/src/com/interfaces/IDataStoreFactory.java @@ -0,0 +1,7 @@ +package com.interfaces; + +public interface IDataStoreFactory { + IUserDataStore getUserDataStore(); + + IUserPairOwedAmountDataStore getUserPairOwedAmountDataStore(); +} diff --git a/SplitWiseImpl/src/com/interfaces/IInputReader.java b/SplitWiseImpl/src/com/interfaces/IInputReader.java new file mode 100644 index 00000000..b49eb1fc --- /dev/null +++ b/SplitWiseImpl/src/com/interfaces/IInputReader.java @@ -0,0 +1,7 @@ +package com.interfaces; + +import java.util.List; + +public interface IInputReader { + ISplitInput parseInput(List input); +} diff --git a/SplitWiseImpl/src/com/interfaces/ISplitInput.java b/SplitWiseImpl/src/com/interfaces/ISplitInput.java new file mode 100644 index 00000000..5429949b --- /dev/null +++ b/SplitWiseImpl/src/com/interfaces/ISplitInput.java @@ -0,0 +1,7 @@ +package com.interfaces; + +import com.enums.SplitStrategyType; + +public interface ISplitInput { + SplitStrategyType getSplitInputType(); +} diff --git a/SplitWiseImpl/src/com/interfaces/ISplitStrategy.java b/SplitWiseImpl/src/com/interfaces/ISplitStrategy.java new file mode 100644 index 00000000..418b1b3b --- /dev/null +++ b/SplitWiseImpl/src/com/interfaces/ISplitStrategy.java @@ -0,0 +1,10 @@ +package com.interfaces; +import com.enums.InputValidationResult; +import com.enums.SplitStrategyType; +import com.splitObjects.SplitResult; + +public interface ISplitStrategy { + InputValidationResult verifyInput(ISplitInput splitInput); + SplitResult getFinalSplit(ISplitInput splitInput); + SplitStrategyType getSpliStrategyType(); +} diff --git a/SplitWiseImpl/src/com/interfaces/IStrategyInputGenerator.java b/SplitWiseImpl/src/com/interfaces/IStrategyInputGenerator.java new file mode 100644 index 00000000..e85bd127 --- /dev/null +++ b/SplitWiseImpl/src/com/interfaces/IStrategyInputGenerator.java @@ -0,0 +1,7 @@ +package com.interfaces; + +import java.util.List; + +public interface IStrategyInputGenerator { + ISplitInput generateSplitInput(ISplitInput baseInput, List input, int lastVisitedIndex); +} diff --git a/SplitWiseImpl/src/com/interfaces/IStrategyList.java b/SplitWiseImpl/src/com/interfaces/IStrategyList.java new file mode 100644 index 00000000..0db80a36 --- /dev/null +++ b/SplitWiseImpl/src/com/interfaces/IStrategyList.java @@ -0,0 +1,9 @@ +package com.interfaces; + +import java.util.Map; + +import com.enums.SplitStrategyType; + +public interface IStrategyList { + Map getSplitStrategies(); +} diff --git a/SplitWiseImpl/src/com/interfaces/IStrategyListFactory.java b/SplitWiseImpl/src/com/interfaces/IStrategyListFactory.java new file mode 100644 index 00000000..c5bcd10e --- /dev/null +++ b/SplitWiseImpl/src/com/interfaces/IStrategyListFactory.java @@ -0,0 +1,7 @@ +package com.interfaces; + +import java.util.List; + +public interface IStrategyListFactory { + IStrategyList getStrategyList(List strategiesPresent); +} diff --git a/SplitWiseImpl/src/com/interfaces/IUser.java b/SplitWiseImpl/src/com/interfaces/IUser.java new file mode 100644 index 00000000..eb8dc6ba --- /dev/null +++ b/SplitWiseImpl/src/com/interfaces/IUser.java @@ -0,0 +1,9 @@ +package com.interfaces; + +import com.dataStore.UserDetails; + +public interface IUser { + UserDetails getUserDetails(String userId); + + boolean updateUserDetails(String userId, UserDetails userDetails); +} diff --git a/SplitWiseImpl/src/com/interfaces/IUserDataStore.java b/SplitWiseImpl/src/com/interfaces/IUserDataStore.java new file mode 100644 index 00000000..857526c1 --- /dev/null +++ b/SplitWiseImpl/src/com/interfaces/IUserDataStore.java @@ -0,0 +1,13 @@ +package com.interfaces; + +import com.dataStore.UserDetails; + +public interface IUserDataStore { + UserDetails getUserDetails(String userId); + + boolean addNewUser(UserDetails userDetails); + + boolean deleteUser(String userId); + + boolean updateUserDetails(String userId, UserDetails userDetails); +} diff --git a/SplitWiseImpl/src/com/interfaces/IUserPairOwedAmountDataStore.java b/SplitWiseImpl/src/com/interfaces/IUserPairOwedAmountDataStore.java new file mode 100644 index 00000000..744d4050 --- /dev/null +++ b/SplitWiseImpl/src/com/interfaces/IUserPairOwedAmountDataStore.java @@ -0,0 +1,13 @@ +package com.interfaces; + +import com.splitObjects.SplitResult; + +public interface IUserPairOwedAmountDataStore { + boolean updateAmount(String userId1, String userId2, double amount); + + SplitResult getBalancesForUser(String userId); + + SplitResult getBalancesForAllUsers(); + + boolean updateAmountForEntries(SplitResult splitResult); +} diff --git a/SplitWiseImpl/src/com/ioParser/InputReader.java b/SplitWiseImpl/src/com/ioParser/InputReader.java new file mode 100644 index 00000000..c0e79eb1 --- /dev/null +++ b/SplitWiseImpl/src/com/ioParser/InputReader.java @@ -0,0 +1,73 @@ +package com.ioParser; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import com.enums.SplitStrategyType; +import com.equalDivisionStrategy.EqualStrategyInutGenerator; +import com.exactDivisionStrategy.ExactStartegyInputGenerator; +import com.interfaces.IInputReader; +import com.interfaces.ISplitInput; +import com.interfaces.IStrategyInputGenerator; +import com.percentDivisionStrategy.PercentDivisionInputGenerator; +import com.splitObjects.SplitInput; + +public class InputReader implements IInputReader { + + + HashMap strategyInputGeneratorMap; + + public InputReader() { + this.strategyInputGeneratorMap = new HashMap(); + + this.strategyInputGeneratorMap.put(SplitStrategyType.EQUAL, new EqualStrategyInutGenerator()); + + this.strategyInputGeneratorMap.put(SplitStrategyType.EXACT, new ExactStartegyInputGenerator()); + + this.strategyInputGeneratorMap.put(SplitStrategyType.PERCENT, new PercentDivisionInputGenerator()); + } + + @Override + public ISplitInput parseInput(List input) { + + if (input.size() < 6) { + return null; + } + + + + try { + String userId = input.get(0); + + double amount = Double.parseDouble(input.get(1)); + + int noOfParticipants = Integer.parseInt(input.get(2)); + + List participantList = new ArrayList(); + + int i = 3; + + while (i < 3 + noOfParticipants) { + participantList.add(input.get(i)); + i++; + } + + SplitStrategyType splitStrategyType = SplitStrategyType.valueOf(input.get(i)); + + + return this.strategyInputGeneratorMap.get(splitStrategyType).generateSplitInput(new SplitInput(userId, participantList, amount) { + + @Override + public SplitStrategyType getSplitInputType() { + // TODO Auto-generated method stub + return splitStrategyType; + } + }, input, i); + + } catch (Exception e) { + return null; + } + } + +} diff --git a/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionInputGenerator.java b/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionInputGenerator.java new file mode 100644 index 00000000..1a37b460 --- /dev/null +++ b/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionInputGenerator.java @@ -0,0 +1,34 @@ +package com.percentDivisionStrategy; + +import java.util.HashMap; +import java.util.List; +import com.interfaces.ISplitInput; +import com.splitObjects.SplitInput; +import com.splitObjects.StrategyInputGenerator; + +public class PercentDivisionInputGenerator extends StrategyInputGenerator { + @Override + public PercentDivisionSplitInput generateSplitInput(ISplitInput baseInput, List input, int lastVisitedIndex) { + SplitInput baseInput2 = super.generateSplitInput(baseInput, input, lastVisitedIndex); + + int i = lastVisitedIndex; + i++; + HashMap percentOwedMap = new HashMap(); + + int count = 0; + + while (count < baseInput2.getParticipants().size()) { + + if (i < input.size()) { + percentOwedMap.put(baseInput2.getParticipants().get(count), Double.parseDouble(input.get(i))); + i++; + } else { + percentOwedMap.put(baseInput2.getParticipants().get(count), 0.0); + } + + count++; + } + return new PercentDivisionSplitInput(baseInput2.getPaidBy(), baseInput2.getParticipants(), baseInput2.getPaidAmount(), percentOwedMap); + + } +} diff --git a/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitInput.java b/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitInput.java new file mode 100644 index 00000000..b4bfd845 --- /dev/null +++ b/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitInput.java @@ -0,0 +1,27 @@ +package com.percentDivisionStrategy; + +import java.util.HashMap; +import java.util.List; + +import com.enums.SplitStrategyType; +import com.splitObjects.SplitInput; + +public class PercentDivisionSplitInput extends SplitInput { + private HashMap percentOwedMap; + + public PercentDivisionSplitInput(String paidBy, List participants, double paidAmount, + HashMap percentOwedMap) { + super(paidBy, participants, paidAmount); + this.percentOwedMap = percentOwedMap; + } + + public HashMap getPercentOwedMap() { + return percentOwedMap; + } + + @Override + public SplitStrategyType getSplitInputType() { + + return SplitStrategyType.PERCENT; + } +} diff --git a/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitStrategy.java b/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitStrategy.java new file mode 100644 index 00000000..edcd1476 --- /dev/null +++ b/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitStrategy.java @@ -0,0 +1,89 @@ +package com.percentDivisionStrategy; + +import java.util.HashMap; +import java.util.Iterator; + +import com.enums.InputValidationResult; +import com.enums.SplitStrategyType; +import com.interfaces.ISplitInput; +import com.interfaces.ISplitStrategy; +import com.splitObjects.SplitResult; + +public class PercentDivisionSplitStrategy implements ISplitStrategy { + static public double PERCENTAGE_100 = 100.0; + + @Override + public InputValidationResult verifyInput(ISplitInput splitInput) { + try { + PercentDivisionSplitInput input = (PercentDivisionSplitInput) splitInput; + + Iterator it = input.getPercentOwedMap().keySet().iterator(); + double sum = 0.0; + while (it.hasNext()) { + sum += input.getPercentOwedMap().get(it.next()); + } + + if (sum != PercentDivisionSplitStrategy.PERCENTAGE_100) { + return InputValidationResult.SUM_NOT_EQUAL_TO_TOTAL_PAID; + } + + return InputValidationResult.VALID; + } catch (Exception e) { + return InputValidationResult.WRONG_INPUT_FORMAT; + } + } + + @Override + public SplitResult getFinalSplit(ISplitInput splitInput) { + if (this.verifyInput(splitInput) != InputValidationResult.VALID) { + return null; + } + + PercentDivisionSplitInput input = (PercentDivisionSplitInput) splitInput; + + HashMap> owedByMap = new HashMap>(); + HashMap> owedToMap = new HashMap>(); + HashMap owedMap = new HashMap(); + HashMap owesMap = new HashMap(); + + owedByMap.put(input.getPaidBy(), new HashMap()); + + Iterator it = input.getPercentOwedMap().keySet().iterator(); + + double sum = 0.0; + + while (it.hasNext()) { + String next = it.next(); + + if (owedByMap.containsKey(next)) { + continue; + } + + double amountOwed = (input.getPercentOwedMap().get(next) * input.getPaidAmount()) / 100.0; + + owedByMap.get(input.getPaidBy()).put(next, amountOwed); + + if (!owedToMap.containsKey(next)) { + owedToMap.put(next, new HashMap()); + } + + + owedToMap.get(next).put(input.getPaidBy(), input.getPercentOwedMap().get(next)); + + owesMap.put(next, amountOwed); + + sum += amountOwed; + } + + owedMap.put(input.getPaidBy(), sum); + + return new SplitResult(owedByMap, owedToMap, owedMap, owesMap); + } + + @Override + public SplitStrategyType getSpliStrategyType() { + // TODO Auto-generated method stub + return SplitStrategyType.PERCENT; + } + +} diff --git a/SplitWiseImpl/src/com/splitObjects/SplitInput.java b/SplitWiseImpl/src/com/splitObjects/SplitInput.java new file mode 100644 index 00000000..9b0c4e97 --- /dev/null +++ b/SplitWiseImpl/src/com/splitObjects/SplitInput.java @@ -0,0 +1,48 @@ +package com.splitObjects; + +import java.util.List; + +import com.interfaces.ISplitInput; + +public abstract class SplitInput implements ISplitInput { + public SplitInput(String paidBy, List participants, double paidAmount) { + super(); + this.paidBy = paidBy; + this.participants = participants; + this.paidAmount = paidAmount; + } + + private String paidBy; + + private List participants; + + private double paidAmount; + + + + public String getPaidBy() { + return paidBy; + } + + public double getPaidAmount() { + return paidAmount; + } + + public void setPaidAmount(double paidAmount) { + this.paidAmount = paidAmount; + } + + public void setPaidBy(String paidBy) { + this.paidBy = paidBy; + } + + public List getParticipants() { + return participants; + } + + public void setParticipants(List participants) { + this.participants = participants; + } + + +} diff --git a/SplitWiseImpl/src/com/splitObjects/SplitResult.java b/SplitWiseImpl/src/com/splitObjects/SplitResult.java new file mode 100644 index 00000000..b68ae4ee --- /dev/null +++ b/SplitWiseImpl/src/com/splitObjects/SplitResult.java @@ -0,0 +1,36 @@ +package com.splitObjects; + +import java.util.HashMap; + +public class SplitResult { + HashMap> owedBy; + HashMap> owedTo; + HashMap owedMap; + HashMap owesMap; + + + + public SplitResult() { + super(); + this.owedBy = new HashMap>(); + this.owedTo = new HashMap>(); + this.owedMap = new HashMap(); + this.owesMap = new HashMap(); + } + + public SplitResult(HashMap> owedBy, HashMap> owedTo, + HashMap owedMap, HashMap owesMap) { + super(); + this.owedBy = owedBy; + this.owedTo = owedTo; + this.owedMap = owedMap; + this.owesMap = owesMap; + } + + public HashMap> getOwedBy() { + return owedBy; + } + public HashMap> getOwedTo() { + return owedTo; + } +} diff --git a/SplitWiseImpl/src/com/splitObjects/StrategyInputGenerator.java b/SplitWiseImpl/src/com/splitObjects/StrategyInputGenerator.java new file mode 100644 index 00000000..7c17ae4c --- /dev/null +++ b/SplitWiseImpl/src/com/splitObjects/StrategyInputGenerator.java @@ -0,0 +1,19 @@ +package com.splitObjects; + +import java.util.List; + +import com.interfaces.ISplitInput; +import com.interfaces.IStrategyInputGenerator; + +public abstract class StrategyInputGenerator implements IStrategyInputGenerator { + + @Override + public SplitInput generateSplitInput(ISplitInput baseInput, List input, int lastVisitedIndex) { + try { + return (SplitInput) baseInput; + } catch (Exception e) { + return null; + } + } + +} diff --git a/SplitWiseImpl/src/module-info.java b/SplitWiseImpl/src/module-info.java new file mode 100644 index 00000000..7839cd4b --- /dev/null +++ b/SplitWiseImpl/src/module-info.java @@ -0,0 +1,8 @@ +/** + * + */ +/** + * + */ +module SplitwiseImpl { +} \ No newline at end of file From dc3b40c0096f967827d3d93edf517544652bdb84 Mon Sep 17 00:00:00 2001 From: Anant Akash Date: Fri, 28 Mar 2025 15:04:01 +0530 Subject: [PATCH 02/19] Remove warnings --- SplitWiseImpl/src/com/application/Application.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/SplitWiseImpl/src/com/application/Application.java b/SplitWiseImpl/src/com/application/Application.java index b174ce32..c8b11e23 100644 --- a/SplitWiseImpl/src/com/application/Application.java +++ b/SplitWiseImpl/src/com/application/Application.java @@ -1,7 +1,6 @@ package com.application; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import com.enums.SplitStrategyType; @@ -11,7 +10,6 @@ import com.interfaces.ISplitInput; import com.interfaces.IStrategyList; import com.interfaces.IStrategyListFactory; -import com.interfaces.IUserDataStore; import com.interfaces.IUserPairOwedAmountDataStore; import com.splitObjects.SplitResult; From 5787076cb3e8166c6e220adc4fcfe7d3dd637cc6 Mon Sep 17 00:00:00 2001 From: Anant Akash Date: Fri, 28 Mar 2025 17:16:37 +0530 Subject: [PATCH 03/19] Refactor --- SplitWiseImpl/src/com/application/Application.java | 12 ++++++------ SplitWiseImpl/src/com/dataStore/UserDataStore.java | 3 ++- .../com/dataStore/UserPairOwedAmountDataStore.java | 4 ++-- .../{ => dataStore}/interfaces/IUserDataStore.java | 4 ++-- .../interfaces/IUserPairOwedAmountDataStore.java | 4 ++-- .../src/com/factory/DataStoreFactory.java | 6 +++--- .../src/com/factory/StrategyListFactory.java | 10 +++++----- .../com/factory/interfaces/IDataStoreFactory.java | 10 ++++++++++ .../interfaces/IStrategyListFactory.java | 4 +++- SplitWiseImpl/src/com/interfaces/IApplication.java | 2 +- .../src/com/interfaces/IDataStoreFactory.java | 7 ------- .../src/com/interfaces/IStrategyList.java | 1 + SplitWiseImpl/src/com/ioParser/InputReader.java | 14 +++++++------- .../src/com/ioParser/ResultFormatter.java | 5 +++++ .../{ => ioParser}/interfaces/IInputReader.java | 4 +++- .../com/ioParser/interfaces/IResultFormatter.java | 9 +++++++++ .../EqualDivisionSplitStrategy.java | 8 ++++---- .../EqualStrategyInutGenerator.java | 8 ++++---- .../EqualStrategySplitInput.java | 4 ++-- .../ExactDivisionSplitStrategy.java | 8 ++++---- .../ExactStartegyInputGenerator.java | 9 +++++---- .../ExactStrategySplitInput.java | 4 ++-- .../{ => strategies}/interfaces/ISplitInput.java | 2 +- .../interfaces/ISplitStrategy.java | 4 ++-- .../interfaces/IStrategyInputGenerator.java | 2 +- .../PercentDivisionInputGenerator.java | 9 +++++---- .../PercentDivisionSplitInput.java | 4 ++-- .../PercentDivisionSplitStrategy.java | 8 ++++---- .../{ => strategies}/splitObjects/SplitInput.java | 4 ++-- .../{ => strategies}/splitObjects/SplitResult.java | 2 +- .../splitObjects/StrategyInputGenerator.java | 6 +++--- .../src/com/{dataStore => user}/UserDetails.java | 2 +- .../src/com/{ => user}/interfaces/IUser.java | 4 ++-- 33 files changed, 106 insertions(+), 81 deletions(-) rename SplitWiseImpl/src/com/{ => dataStore}/interfaces/IUserDataStore.java (79%) rename SplitWiseImpl/src/com/{ => dataStore}/interfaces/IUserPairOwedAmountDataStore.java (76%) create mode 100644 SplitWiseImpl/src/com/factory/interfaces/IDataStoreFactory.java rename SplitWiseImpl/src/com/{ => factory}/interfaces/IStrategyListFactory.java (65%) delete mode 100644 SplitWiseImpl/src/com/interfaces/IDataStoreFactory.java create mode 100644 SplitWiseImpl/src/com/ioParser/ResultFormatter.java rename SplitWiseImpl/src/com/{ => ioParser}/interfaces/IInputReader.java (56%) create mode 100644 SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java rename SplitWiseImpl/src/com/{ => strategies}/equalDivisionStrategy/EqualDivisionSplitStrategy.java (92%) rename SplitWiseImpl/src/com/{ => strategies}/equalDivisionStrategy/EqualStrategyInutGenerator.java (69%) rename SplitWiseImpl/src/com/{ => strategies}/equalDivisionStrategy/EqualStrategySplitInput.java (81%) rename SplitWiseImpl/src/com/{ => strategies}/exactDivisionStrategy/ExactDivisionSplitStrategy.java (92%) rename SplitWiseImpl/src/com/{ => strategies}/exactDivisionStrategy/ExactStartegyInputGenerator.java (82%) rename SplitWiseImpl/src/com/{ => strategies}/exactDivisionStrategy/ExactStrategySplitInput.java (87%) rename SplitWiseImpl/src/com/{ => strategies}/interfaces/ISplitInput.java (76%) rename SplitWiseImpl/src/com/{ => strategies}/interfaces/ISplitStrategy.java (76%) rename SplitWiseImpl/src/com/{ => strategies}/interfaces/IStrategyInputGenerator.java (82%) rename SplitWiseImpl/src/com/{ => strategies}/percentDivisionStrategy/PercentDivisionInputGenerator.java (82%) rename SplitWiseImpl/src/com/{ => strategies}/percentDivisionStrategy/PercentDivisionSplitInput.java (86%) rename SplitWiseImpl/src/com/{ => strategies}/percentDivisionStrategy/PercentDivisionSplitStrategy.java (92%) rename SplitWiseImpl/src/com/{ => strategies}/splitObjects/SplitInput.java (90%) rename SplitWiseImpl/src/com/{ => strategies}/splitObjects/SplitResult.java (96%) rename SplitWiseImpl/src/com/{ => strategies}/splitObjects/StrategyInputGenerator.java (69%) rename SplitWiseImpl/src/com/{dataStore => user}/UserDetails.java (97%) rename SplitWiseImpl/src/com/{ => user}/interfaces/IUser.java (71%) diff --git a/SplitWiseImpl/src/com/application/Application.java b/SplitWiseImpl/src/com/application/Application.java index c8b11e23..2670030c 100644 --- a/SplitWiseImpl/src/com/application/Application.java +++ b/SplitWiseImpl/src/com/application/Application.java @@ -3,15 +3,15 @@ import java.util.ArrayList; import java.util.List; +import com.dataStore.interfaces.IUserPairOwedAmountDataStore; import com.enums.SplitStrategyType; +import com.factory.interfaces.IDataStoreFactory; +import com.factory.interfaces.IStrategyListFactory; import com.interfaces.IApplication; -import com.interfaces.IDataStoreFactory; -import com.interfaces.IInputReader; -import com.interfaces.ISplitInput; import com.interfaces.IStrategyList; -import com.interfaces.IStrategyListFactory; -import com.interfaces.IUserPairOwedAmountDataStore; -import com.splitObjects.SplitResult; +import com.ioParser.interfaces.IInputReader; +import com.strategies.interfaces.ISplitInput; +import com.strategies.splitObjects.SplitResult; public class Application implements IApplication { diff --git a/SplitWiseImpl/src/com/dataStore/UserDataStore.java b/SplitWiseImpl/src/com/dataStore/UserDataStore.java index 56a3753f..3a820b8a 100644 --- a/SplitWiseImpl/src/com/dataStore/UserDataStore.java +++ b/SplitWiseImpl/src/com/dataStore/UserDataStore.java @@ -2,7 +2,8 @@ import java.util.HashMap; -import com.interfaces.IUserDataStore; +import com.dataStore.interfaces.IUserDataStore; +import com.user.UserDetails; public class UserDataStore implements IUserDataStore { HashMap userDetailMap = new HashMap(); diff --git a/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java b/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java index 9e00493a..5b9b9c2c 100644 --- a/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java +++ b/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java @@ -3,8 +3,8 @@ import java.util.HashMap; import java.util.Iterator; -import com.interfaces.IUserPairOwedAmountDataStore; -import com.splitObjects.SplitResult; +import com.dataStore.interfaces.IUserPairOwedAmountDataStore; +import com.strategies.splitObjects.SplitResult; public class UserPairOwedAmountDataStore implements IUserPairOwedAmountDataStore { private HashMap> owedByMap = new HashMap>(); diff --git a/SplitWiseImpl/src/com/interfaces/IUserDataStore.java b/SplitWiseImpl/src/com/dataStore/interfaces/IUserDataStore.java similarity index 79% rename from SplitWiseImpl/src/com/interfaces/IUserDataStore.java rename to SplitWiseImpl/src/com/dataStore/interfaces/IUserDataStore.java index 857526c1..841b642b 100644 --- a/SplitWiseImpl/src/com/interfaces/IUserDataStore.java +++ b/SplitWiseImpl/src/com/dataStore/interfaces/IUserDataStore.java @@ -1,6 +1,6 @@ -package com.interfaces; +package com.dataStore.interfaces; -import com.dataStore.UserDetails; +import com.user.UserDetails; public interface IUserDataStore { UserDetails getUserDetails(String userId); diff --git a/SplitWiseImpl/src/com/interfaces/IUserPairOwedAmountDataStore.java b/SplitWiseImpl/src/com/dataStore/interfaces/IUserPairOwedAmountDataStore.java similarity index 76% rename from SplitWiseImpl/src/com/interfaces/IUserPairOwedAmountDataStore.java rename to SplitWiseImpl/src/com/dataStore/interfaces/IUserPairOwedAmountDataStore.java index 744d4050..5ed1cfb4 100644 --- a/SplitWiseImpl/src/com/interfaces/IUserPairOwedAmountDataStore.java +++ b/SplitWiseImpl/src/com/dataStore/interfaces/IUserPairOwedAmountDataStore.java @@ -1,6 +1,6 @@ -package com.interfaces; +package com.dataStore.interfaces; -import com.splitObjects.SplitResult; +import com.strategies.splitObjects.SplitResult; public interface IUserPairOwedAmountDataStore { boolean updateAmount(String userId1, String userId2, double amount); diff --git a/SplitWiseImpl/src/com/factory/DataStoreFactory.java b/SplitWiseImpl/src/com/factory/DataStoreFactory.java index 83c62fb6..cca361b7 100644 --- a/SplitWiseImpl/src/com/factory/DataStoreFactory.java +++ b/SplitWiseImpl/src/com/factory/DataStoreFactory.java @@ -2,9 +2,9 @@ import com.dataStore.UserDataStore; import com.dataStore.UserPairOwedAmountDataStore; -import com.interfaces.IDataStoreFactory; -import com.interfaces.IUserDataStore; -import com.interfaces.IUserPairOwedAmountDataStore; +import com.dataStore.interfaces.IUserDataStore; +import com.dataStore.interfaces.IUserPairOwedAmountDataStore; +import com.factory.interfaces.IDataStoreFactory; public class DataStoreFactory implements IDataStoreFactory { private IUserDataStore userDataStore; diff --git a/SplitWiseImpl/src/com/factory/StrategyListFactory.java b/SplitWiseImpl/src/com/factory/StrategyListFactory.java index b3bcaddc..b967bed9 100644 --- a/SplitWiseImpl/src/com/factory/StrategyListFactory.java +++ b/SplitWiseImpl/src/com/factory/StrategyListFactory.java @@ -7,12 +7,12 @@ import java.util.Map; import com.enums.SplitStrategyType; -import com.equalDivisionStrategy.EqualDivisionSplitStrategy; -import com.exactDivisionStrategy.ExactDivisionSplitStrategy; -import com.interfaces.ISplitStrategy; +import com.factory.interfaces.IStrategyListFactory; import com.interfaces.IStrategyList; -import com.interfaces.IStrategyListFactory; -import com.percentDivisionStrategy.PercentDivisionSplitStrategy; +import com.strategies.equalDivisionStrategy.EqualDivisionSplitStrategy; +import com.strategies.exactDivisionStrategy.ExactDivisionSplitStrategy; +import com.strategies.interfaces.ISplitStrategy; +import com.strategies.percentDivisionStrategy.PercentDivisionSplitStrategy; public class StrategyListFactory implements IStrategyListFactory { diff --git a/SplitWiseImpl/src/com/factory/interfaces/IDataStoreFactory.java b/SplitWiseImpl/src/com/factory/interfaces/IDataStoreFactory.java new file mode 100644 index 00000000..5a11a930 --- /dev/null +++ b/SplitWiseImpl/src/com/factory/interfaces/IDataStoreFactory.java @@ -0,0 +1,10 @@ +package com.factory.interfaces; + +import com.dataStore.interfaces.IUserDataStore; +import com.dataStore.interfaces.IUserPairOwedAmountDataStore; + +public interface IDataStoreFactory { + IUserDataStore getUserDataStore(); + + IUserPairOwedAmountDataStore getUserPairOwedAmountDataStore(); +} diff --git a/SplitWiseImpl/src/com/interfaces/IStrategyListFactory.java b/SplitWiseImpl/src/com/factory/interfaces/IStrategyListFactory.java similarity index 65% rename from SplitWiseImpl/src/com/interfaces/IStrategyListFactory.java rename to SplitWiseImpl/src/com/factory/interfaces/IStrategyListFactory.java index c5bcd10e..3c348508 100644 --- a/SplitWiseImpl/src/com/interfaces/IStrategyListFactory.java +++ b/SplitWiseImpl/src/com/factory/interfaces/IStrategyListFactory.java @@ -1,7 +1,9 @@ -package com.interfaces; +package com.factory.interfaces; import java.util.List; +import com.interfaces.IStrategyList; + public interface IStrategyListFactory { IStrategyList getStrategyList(List strategiesPresent); } diff --git a/SplitWiseImpl/src/com/interfaces/IApplication.java b/SplitWiseImpl/src/com/interfaces/IApplication.java index 9474cd80..450f5ed2 100644 --- a/SplitWiseImpl/src/com/interfaces/IApplication.java +++ b/SplitWiseImpl/src/com/interfaces/IApplication.java @@ -3,7 +3,7 @@ import java.util.List; import com.enums.SplitStrategyType; -import com.splitObjects.SplitResult; +import com.strategies.splitObjects.SplitResult; public interface IApplication { boolean addExpense(List expenseInput); diff --git a/SplitWiseImpl/src/com/interfaces/IDataStoreFactory.java b/SplitWiseImpl/src/com/interfaces/IDataStoreFactory.java deleted file mode 100644 index 324faf72..00000000 --- a/SplitWiseImpl/src/com/interfaces/IDataStoreFactory.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.interfaces; - -public interface IDataStoreFactory { - IUserDataStore getUserDataStore(); - - IUserPairOwedAmountDataStore getUserPairOwedAmountDataStore(); -} diff --git a/SplitWiseImpl/src/com/interfaces/IStrategyList.java b/SplitWiseImpl/src/com/interfaces/IStrategyList.java index 0db80a36..63732755 100644 --- a/SplitWiseImpl/src/com/interfaces/IStrategyList.java +++ b/SplitWiseImpl/src/com/interfaces/IStrategyList.java @@ -3,6 +3,7 @@ import java.util.Map; import com.enums.SplitStrategyType; +import com.strategies.interfaces.ISplitStrategy; public interface IStrategyList { Map getSplitStrategies(); diff --git a/SplitWiseImpl/src/com/ioParser/InputReader.java b/SplitWiseImpl/src/com/ioParser/InputReader.java index c0e79eb1..ced2628e 100644 --- a/SplitWiseImpl/src/com/ioParser/InputReader.java +++ b/SplitWiseImpl/src/com/ioParser/InputReader.java @@ -5,13 +5,13 @@ import java.util.List; import com.enums.SplitStrategyType; -import com.equalDivisionStrategy.EqualStrategyInutGenerator; -import com.exactDivisionStrategy.ExactStartegyInputGenerator; -import com.interfaces.IInputReader; -import com.interfaces.ISplitInput; -import com.interfaces.IStrategyInputGenerator; -import com.percentDivisionStrategy.PercentDivisionInputGenerator; -import com.splitObjects.SplitInput; +import com.ioParser.interfaces.IInputReader; +import com.strategies.equalDivisionStrategy.EqualStrategyInutGenerator; +import com.strategies.exactDivisionStrategy.ExactStartegyInputGenerator; +import com.strategies.interfaces.ISplitInput; +import com.strategies.interfaces.IStrategyInputGenerator; +import com.strategies.percentDivisionStrategy.PercentDivisionInputGenerator; +import com.strategies.splitObjects.SplitInput; public class InputReader implements IInputReader { diff --git a/SplitWiseImpl/src/com/ioParser/ResultFormatter.java b/SplitWiseImpl/src/com/ioParser/ResultFormatter.java new file mode 100644 index 00000000..a62392df --- /dev/null +++ b/SplitWiseImpl/src/com/ioParser/ResultFormatter.java @@ -0,0 +1,5 @@ +package com.ioParser; + +public class ResultFormatter { + +} diff --git a/SplitWiseImpl/src/com/interfaces/IInputReader.java b/SplitWiseImpl/src/com/ioParser/interfaces/IInputReader.java similarity index 56% rename from SplitWiseImpl/src/com/interfaces/IInputReader.java rename to SplitWiseImpl/src/com/ioParser/interfaces/IInputReader.java index b49eb1fc..f42a53ed 100644 --- a/SplitWiseImpl/src/com/interfaces/IInputReader.java +++ b/SplitWiseImpl/src/com/ioParser/interfaces/IInputReader.java @@ -1,7 +1,9 @@ -package com.interfaces; +package com.ioParser.interfaces; import java.util.List; +import com.strategies.interfaces.ISplitInput; + public interface IInputReader { ISplitInput parseInput(List input); } diff --git a/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java b/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java new file mode 100644 index 00000000..445f40d0 --- /dev/null +++ b/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java @@ -0,0 +1,9 @@ +package com.ioParser.interfaces; + +import java.util.List; + +import com.strategies.splitObjects.SplitResult; + +public interface IResultFormatter { + List getFormattedResult(SplitResult splitResult); +} diff --git a/SplitWiseImpl/src/com/equalDivisionStrategy/EqualDivisionSplitStrategy.java b/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualDivisionSplitStrategy.java similarity index 92% rename from SplitWiseImpl/src/com/equalDivisionStrategy/EqualDivisionSplitStrategy.java rename to SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualDivisionSplitStrategy.java index 8748a769..7d1c52e8 100644 --- a/SplitWiseImpl/src/com/equalDivisionStrategy/EqualDivisionSplitStrategy.java +++ b/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualDivisionSplitStrategy.java @@ -1,13 +1,13 @@ -package com.equalDivisionStrategy; +package com.strategies.equalDivisionStrategy; import java.util.HashMap; import java.util.ListIterator; import com.enums.InputValidationResult; import com.enums.SplitStrategyType; -import com.interfaces.ISplitInput; -import com.interfaces.ISplitStrategy; -import com.splitObjects.SplitResult; +import com.strategies.interfaces.ISplitInput; +import com.strategies.interfaces.ISplitStrategy; +import com.strategies.splitObjects.SplitResult; public class EqualDivisionSplitStrategy implements ISplitStrategy { diff --git a/SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategyInutGenerator.java b/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategyInutGenerator.java similarity index 69% rename from SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategyInutGenerator.java rename to SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategyInutGenerator.java index 914a2fc3..f8a1ebf2 100644 --- a/SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategyInutGenerator.java +++ b/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategyInutGenerator.java @@ -1,10 +1,10 @@ -package com.equalDivisionStrategy; +package com.strategies.equalDivisionStrategy; import java.util.List; -import com.interfaces.ISplitInput; -import com.splitObjects.SplitInput; -import com.splitObjects.StrategyInputGenerator; +import com.strategies.interfaces.ISplitInput; +import com.strategies.splitObjects.SplitInput; +import com.strategies.splitObjects.StrategyInputGenerator; public class EqualStrategyInutGenerator extends StrategyInputGenerator { diff --git a/SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategySplitInput.java b/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategySplitInput.java similarity index 81% rename from SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategySplitInput.java rename to SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategySplitInput.java index 85b961e2..e5718798 100644 --- a/SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategySplitInput.java +++ b/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategySplitInput.java @@ -1,9 +1,9 @@ -package com.equalDivisionStrategy; +package com.strategies.equalDivisionStrategy; import java.util.List; import com.enums.SplitStrategyType; -import com.splitObjects.SplitInput; +import com.strategies.splitObjects.SplitInput; public class EqualStrategySplitInput extends SplitInput { diff --git a/SplitWiseImpl/src/com/exactDivisionStrategy/ExactDivisionSplitStrategy.java b/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactDivisionSplitStrategy.java similarity index 92% rename from SplitWiseImpl/src/com/exactDivisionStrategy/ExactDivisionSplitStrategy.java rename to SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactDivisionSplitStrategy.java index fa8d8a7b..17617c2a 100644 --- a/SplitWiseImpl/src/com/exactDivisionStrategy/ExactDivisionSplitStrategy.java +++ b/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactDivisionSplitStrategy.java @@ -1,13 +1,13 @@ -package com.exactDivisionStrategy; +package com.strategies.exactDivisionStrategy; import java.util.HashMap; import java.util.Iterator; import com.enums.InputValidationResult; import com.enums.SplitStrategyType; -import com.interfaces.ISplitInput; -import com.interfaces.ISplitStrategy; -import com.splitObjects.SplitResult; +import com.strategies.interfaces.ISplitInput; +import com.strategies.interfaces.ISplitStrategy; +import com.strategies.splitObjects.SplitResult; public class ExactDivisionSplitStrategy implements ISplitStrategy { diff --git a/SplitWiseImpl/src/com/exactDivisionStrategy/ExactStartegyInputGenerator.java b/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStartegyInputGenerator.java similarity index 82% rename from SplitWiseImpl/src/com/exactDivisionStrategy/ExactStartegyInputGenerator.java rename to SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStartegyInputGenerator.java index a4bb846a..7568f3d9 100644 --- a/SplitWiseImpl/src/com/exactDivisionStrategy/ExactStartegyInputGenerator.java +++ b/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStartegyInputGenerator.java @@ -1,10 +1,11 @@ -package com.exactDivisionStrategy; +package com.strategies.exactDivisionStrategy; import java.util.HashMap; import java.util.List; -import com.interfaces.ISplitInput; -import com.splitObjects.SplitInput; -import com.splitObjects.StrategyInputGenerator; + +import com.strategies.interfaces.ISplitInput; +import com.strategies.splitObjects.SplitInput; +import com.strategies.splitObjects.StrategyInputGenerator; public class ExactStartegyInputGenerator extends StrategyInputGenerator { @Override diff --git a/SplitWiseImpl/src/com/exactDivisionStrategy/ExactStrategySplitInput.java b/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStrategySplitInput.java similarity index 87% rename from SplitWiseImpl/src/com/exactDivisionStrategy/ExactStrategySplitInput.java rename to SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStrategySplitInput.java index 52c63972..fa24ad75 100644 --- a/SplitWiseImpl/src/com/exactDivisionStrategy/ExactStrategySplitInput.java +++ b/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStrategySplitInput.java @@ -1,10 +1,10 @@ -package com.exactDivisionStrategy; +package com.strategies.exactDivisionStrategy; import java.util.HashMap; import java.util.List; import com.enums.SplitStrategyType; -import com.splitObjects.SplitInput; +import com.strategies.splitObjects.SplitInput; public class ExactStrategySplitInput extends SplitInput { diff --git a/SplitWiseImpl/src/com/interfaces/ISplitInput.java b/SplitWiseImpl/src/com/strategies/interfaces/ISplitInput.java similarity index 76% rename from SplitWiseImpl/src/com/interfaces/ISplitInput.java rename to SplitWiseImpl/src/com/strategies/interfaces/ISplitInput.java index 5429949b..44c6aeb9 100644 --- a/SplitWiseImpl/src/com/interfaces/ISplitInput.java +++ b/SplitWiseImpl/src/com/strategies/interfaces/ISplitInput.java @@ -1,4 +1,4 @@ -package com.interfaces; +package com.strategies.interfaces; import com.enums.SplitStrategyType; diff --git a/SplitWiseImpl/src/com/interfaces/ISplitStrategy.java b/SplitWiseImpl/src/com/strategies/interfaces/ISplitStrategy.java similarity index 76% rename from SplitWiseImpl/src/com/interfaces/ISplitStrategy.java rename to SplitWiseImpl/src/com/strategies/interfaces/ISplitStrategy.java index 418b1b3b..bb39a85e 100644 --- a/SplitWiseImpl/src/com/interfaces/ISplitStrategy.java +++ b/SplitWiseImpl/src/com/strategies/interfaces/ISplitStrategy.java @@ -1,7 +1,7 @@ -package com.interfaces; +package com.strategies.interfaces; import com.enums.InputValidationResult; import com.enums.SplitStrategyType; -import com.splitObjects.SplitResult; +import com.strategies.splitObjects.SplitResult; public interface ISplitStrategy { InputValidationResult verifyInput(ISplitInput splitInput); diff --git a/SplitWiseImpl/src/com/interfaces/IStrategyInputGenerator.java b/SplitWiseImpl/src/com/strategies/interfaces/IStrategyInputGenerator.java similarity index 82% rename from SplitWiseImpl/src/com/interfaces/IStrategyInputGenerator.java rename to SplitWiseImpl/src/com/strategies/interfaces/IStrategyInputGenerator.java index e85bd127..fdcbe004 100644 --- a/SplitWiseImpl/src/com/interfaces/IStrategyInputGenerator.java +++ b/SplitWiseImpl/src/com/strategies/interfaces/IStrategyInputGenerator.java @@ -1,4 +1,4 @@ -package com.interfaces; +package com.strategies.interfaces; import java.util.List; diff --git a/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionInputGenerator.java b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionInputGenerator.java similarity index 82% rename from SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionInputGenerator.java rename to SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionInputGenerator.java index 1a37b460..b21c319d 100644 --- a/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionInputGenerator.java +++ b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionInputGenerator.java @@ -1,10 +1,11 @@ -package com.percentDivisionStrategy; +package com.strategies.percentDivisionStrategy; import java.util.HashMap; import java.util.List; -import com.interfaces.ISplitInput; -import com.splitObjects.SplitInput; -import com.splitObjects.StrategyInputGenerator; + +import com.strategies.interfaces.ISplitInput; +import com.strategies.splitObjects.SplitInput; +import com.strategies.splitObjects.StrategyInputGenerator; public class PercentDivisionInputGenerator extends StrategyInputGenerator { @Override diff --git a/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitInput.java b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitInput.java similarity index 86% rename from SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitInput.java rename to SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitInput.java index b4bfd845..78ebabfe 100644 --- a/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitInput.java +++ b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitInput.java @@ -1,10 +1,10 @@ -package com.percentDivisionStrategy; +package com.strategies.percentDivisionStrategy; import java.util.HashMap; import java.util.List; import com.enums.SplitStrategyType; -import com.splitObjects.SplitInput; +import com.strategies.splitObjects.SplitInput; public class PercentDivisionSplitInput extends SplitInput { private HashMap percentOwedMap; diff --git a/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitStrategy.java b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java similarity index 92% rename from SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitStrategy.java rename to SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java index edcd1476..0b80018c 100644 --- a/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitStrategy.java +++ b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java @@ -1,13 +1,13 @@ -package com.percentDivisionStrategy; +package com.strategies.percentDivisionStrategy; import java.util.HashMap; import java.util.Iterator; import com.enums.InputValidationResult; import com.enums.SplitStrategyType; -import com.interfaces.ISplitInput; -import com.interfaces.ISplitStrategy; -import com.splitObjects.SplitResult; +import com.strategies.interfaces.ISplitInput; +import com.strategies.interfaces.ISplitStrategy; +import com.strategies.splitObjects.SplitResult; public class PercentDivisionSplitStrategy implements ISplitStrategy { static public double PERCENTAGE_100 = 100.0; diff --git a/SplitWiseImpl/src/com/splitObjects/SplitInput.java b/SplitWiseImpl/src/com/strategies/splitObjects/SplitInput.java similarity index 90% rename from SplitWiseImpl/src/com/splitObjects/SplitInput.java rename to SplitWiseImpl/src/com/strategies/splitObjects/SplitInput.java index 9b0c4e97..3b80fde1 100644 --- a/SplitWiseImpl/src/com/splitObjects/SplitInput.java +++ b/SplitWiseImpl/src/com/strategies/splitObjects/SplitInput.java @@ -1,8 +1,8 @@ -package com.splitObjects; +package com.strategies.splitObjects; import java.util.List; -import com.interfaces.ISplitInput; +import com.strategies.interfaces.ISplitInput; public abstract class SplitInput implements ISplitInput { public SplitInput(String paidBy, List participants, double paidAmount) { diff --git a/SplitWiseImpl/src/com/splitObjects/SplitResult.java b/SplitWiseImpl/src/com/strategies/splitObjects/SplitResult.java similarity index 96% rename from SplitWiseImpl/src/com/splitObjects/SplitResult.java rename to SplitWiseImpl/src/com/strategies/splitObjects/SplitResult.java index b68ae4ee..c8df1520 100644 --- a/SplitWiseImpl/src/com/splitObjects/SplitResult.java +++ b/SplitWiseImpl/src/com/strategies/splitObjects/SplitResult.java @@ -1,4 +1,4 @@ -package com.splitObjects; +package com.strategies.splitObjects; import java.util.HashMap; diff --git a/SplitWiseImpl/src/com/splitObjects/StrategyInputGenerator.java b/SplitWiseImpl/src/com/strategies/splitObjects/StrategyInputGenerator.java similarity index 69% rename from SplitWiseImpl/src/com/splitObjects/StrategyInputGenerator.java rename to SplitWiseImpl/src/com/strategies/splitObjects/StrategyInputGenerator.java index 7c17ae4c..77ef0df5 100644 --- a/SplitWiseImpl/src/com/splitObjects/StrategyInputGenerator.java +++ b/SplitWiseImpl/src/com/strategies/splitObjects/StrategyInputGenerator.java @@ -1,9 +1,9 @@ -package com.splitObjects; +package com.strategies.splitObjects; import java.util.List; -import com.interfaces.ISplitInput; -import com.interfaces.IStrategyInputGenerator; +import com.strategies.interfaces.ISplitInput; +import com.strategies.interfaces.IStrategyInputGenerator; public abstract class StrategyInputGenerator implements IStrategyInputGenerator { diff --git a/SplitWiseImpl/src/com/dataStore/UserDetails.java b/SplitWiseImpl/src/com/user/UserDetails.java similarity index 97% rename from SplitWiseImpl/src/com/dataStore/UserDetails.java rename to SplitWiseImpl/src/com/user/UserDetails.java index 8336fbf8..289050a5 100644 --- a/SplitWiseImpl/src/com/dataStore/UserDetails.java +++ b/SplitWiseImpl/src/com/user/UserDetails.java @@ -1,4 +1,4 @@ -package com.dataStore; +package com.user; public class UserDetails { diff --git a/SplitWiseImpl/src/com/interfaces/IUser.java b/SplitWiseImpl/src/com/user/interfaces/IUser.java similarity index 71% rename from SplitWiseImpl/src/com/interfaces/IUser.java rename to SplitWiseImpl/src/com/user/interfaces/IUser.java index eb8dc6ba..9f615f7f 100644 --- a/SplitWiseImpl/src/com/interfaces/IUser.java +++ b/SplitWiseImpl/src/com/user/interfaces/IUser.java @@ -1,6 +1,6 @@ -package com.interfaces; +package com.user.interfaces; -import com.dataStore.UserDetails; +import com.user.UserDetails; public interface IUser { UserDetails getUserDetails(String userId); From 43cae821f35f1d2be8ebe1b870b1d99f78f3dc80 Mon Sep 17 00:00:00 2001 From: Anant Akash Date: Fri, 28 Mar 2025 18:05:50 +0530 Subject: [PATCH 04/19] Add Javadocs --- .../src/com/application/Application.java | 40 +++++++++++++ .../src/com/dataStore/UserDataStore.java | 31 ++++++++++ .../UserPairOwedAmountDataStore.java | 33 +++++++++++ .../dataStore/interfaces/IUserDataStore.java | 29 ++++++++++ .../IUserPairOwedAmountDataStore.java | 30 ++++++++++ .../src/com/enums/InputValidationResult.java | 9 +++ .../src/com/enums/SplitStrategyType.java | 10 ++++ .../src/com/factory/DataStoreFactory.java | 18 ++++++ .../src/com/factory/StrategyListFactory.java | 14 +++++ .../factory/interfaces/IDataStoreFactory.java | 15 +++++ .../interfaces/IStrategyListFactory.java | 11 ++++ .../src/com/interfaces/IApplication.java | 27 +++++++++ .../src/com/interfaces/IStrategyList.java | 10 ++++ .../src/com/ioParser/InputReader.java | 14 +++++ .../src/com/ioParser/ResultFormatter.java | 13 ++++- .../com/ioParser/interfaces/IInputReader.java | 11 ++++ .../ioParser/interfaces/IResultFormatter.java | 11 ++++ .../EqualDivisionSplitStrategy.java | 24 ++++++++ .../EqualStrategyInutGenerator.java | 12 ++++ .../EqualStrategySplitInput.java | 16 ++++++ .../ExactDivisionSplitStrategy.java | 21 +++++++ .../ExactStartegyInputGenerator.java | 13 +++++ .../ExactStrategySplitInput.java | 23 ++++++++ .../strategies/interfaces/ISplitInput.java | 10 ++++ .../strategies/interfaces/ISplitStrategy.java | 24 ++++++++ .../interfaces/IStrategyInputGenerator.java | 13 +++++ .../PercentDivisionInputGenerator.java | 13 +++++ .../PercentDivisionSplitInput.java | 24 ++++++++ .../PercentDivisionSplitStrategy.java | 23 ++++++++ .../strategies/splitObjects/SplitInput.java | 45 +++++++++++++++ .../strategies/splitObjects/SplitResult.java | 34 +++++++++++ .../splitObjects/StrategyInputGenerator.java | 12 ++++ SplitWiseImpl/src/com/user/UserDetails.java | 57 +++++++++++++++++++ .../src/com/user/interfaces/IUser.java | 18 ++++++ 34 files changed, 707 insertions(+), 1 deletion(-) diff --git a/SplitWiseImpl/src/com/application/Application.java b/SplitWiseImpl/src/com/application/Application.java index 2670030c..3c661412 100644 --- a/SplitWiseImpl/src/com/application/Application.java +++ b/SplitWiseImpl/src/com/application/Application.java @@ -13,16 +13,30 @@ import com.strategies.interfaces.ISplitInput; import com.strategies.splitObjects.SplitResult; +/** + * The Class Application. + */ public class Application implements IApplication { + /** The user pair owed amount data store. */ private IUserPairOwedAmountDataStore userPairOwedAmountDataStore; + /** The strategy list. */ private IStrategyList strategyList; + /** The input reader. */ private IInputReader inputReader; + /** + * Instantiates a new application. + * + * @param dataStoreFactory the data store factory + * @param strategyListFactory the strategy list factory + * @param strategiesPresnt the strategies presnt + * @param inputReader the input reader + */ Application(IDataStoreFactory dataStoreFactory, IStrategyListFactory strategyListFactory, List strategiesPresnt, IInputReader inputReader) { this.userPairOwedAmountDataStore = dataStoreFactory.getUserPairOwedAmountDataStore(); @@ -32,7 +46,16 @@ public class Application implements IApplication { this.inputReader = inputReader; } + /** + * Adds the expense. + * + * @param expenseInput the expense input + * @return true, if successful + */ @Override + /** + * + */ public boolean addExpense(List expenseInput) { ISplitInput splitInput = this.inputReader.parseInput(expenseInput); @@ -45,18 +68,35 @@ public boolean addExpense(List expenseInput) { return this.userPairOwedAmountDataStore.updateAmountForEntries(splitResult); } + + /** + * Gets the balance for user. + * + * @param userId the user id + * @return the balance for user + */ @Override public SplitResult getBalanceForUser(String userId) { return this.getBalanceForUser(userId); } + /** + * Gets the all balances. + * + * @return the all balances + */ @Override public SplitResult getAllBalances() { // TODO Auto-generated method stub return this.userPairOwedAmountDataStore.getBalancesForAllUsers(); } + /** + * Gets the strategies name. + * + * @return the strategies name + */ @Override public List getStrategiesName() { return new ArrayList(this.strategyList.getSplitStrategies().keySet()); diff --git a/SplitWiseImpl/src/com/dataStore/UserDataStore.java b/SplitWiseImpl/src/com/dataStore/UserDataStore.java index 3a820b8a..31aa14a6 100644 --- a/SplitWiseImpl/src/com/dataStore/UserDataStore.java +++ b/SplitWiseImpl/src/com/dataStore/UserDataStore.java @@ -5,14 +5,32 @@ import com.dataStore.interfaces.IUserDataStore; import com.user.UserDetails; +/** + * The Class UserDataStore. + */ public class UserDataStore implements IUserDataStore { + + /** The user detail map. */ HashMap userDetailMap = new HashMap(); + + /** + * Gets the user details. + * + * @param userId the user id + * @return the user details + */ @Override public UserDetails getUserDetails(String userId) { // TODO Auto-generated method stub return this.userDetailMap.get(userId); } + /** + * Adds the new user. + * + * @param userDetails the user details + * @return true, if successful + */ @Override public boolean addNewUser(UserDetails userDetails) { if (userDetails != null && userDetails.getUserId() != null && !userDetails.getUserId().equals("")) { @@ -24,6 +42,12 @@ public boolean addNewUser(UserDetails userDetails) { return false; } + /** + * Delete user. + * + * @param userId the user id + * @return true, if successful + */ @Override public boolean deleteUser(String userId) { if (userId != null && !userId.equals("")) { @@ -34,6 +58,13 @@ public boolean deleteUser(String userId) { return false; } + /** + * Update user details. + * + * @param userId the user id + * @param userDetails the user details + * @return true, if successful + */ @Override public boolean updateUserDetails(String userId, UserDetails userDetails) { if (userId != null && !userId.equals("") && userDetails != null) { diff --git a/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java b/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java index 5b9b9c2c..2025855b 100644 --- a/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java +++ b/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java @@ -6,11 +6,27 @@ import com.dataStore.interfaces.IUserPairOwedAmountDataStore; import com.strategies.splitObjects.SplitResult; +// TODO: Auto-generated Javadoc +/** + * The Class UserPairOwedAmountDataStore. + */ public class UserPairOwedAmountDataStore implements IUserPairOwedAmountDataStore { + + /** The owed by map. */ private HashMap> owedByMap = new HashMap>(); + + /** The owes to map. */ private HashMap> owesToMap = new HashMap>(); + /** + * Update amount. + * + * @param userId1 the user id 1 + * @param userId2 the user id 2 + * @param amount the amount + * @return true, if successful + */ @Override public boolean updateAmount(String userId1, String userId2, double amount) { double amountOwed = amount; @@ -46,6 +62,12 @@ public boolean updateAmount(String userId1, String userId2, double amount) { return true; } + /** + * Gets the balances for user. + * + * @param userId the user id + * @return the balances for user + */ @Override public SplitResult getBalancesForUser(String userId) { SplitResult result = new SplitResult(); @@ -57,11 +79,22 @@ public SplitResult getBalancesForUser(String userId) { return result; } + /** + * Gets the balances for all users. + * + * @return the balances for all users + */ @Override public SplitResult getBalancesForAllUsers() { return new SplitResult(owedByMap, owedByMap, null, null); } + /** + * Update amount for entries. + * + * @param splitResult the split result + * @return true, if successful + */ @Override public boolean updateAmountForEntries(SplitResult splitResult) { Iterator it = splitResult.getOwedBy().keySet().iterator(); diff --git a/SplitWiseImpl/src/com/dataStore/interfaces/IUserDataStore.java b/SplitWiseImpl/src/com/dataStore/interfaces/IUserDataStore.java index 841b642b..95e135d5 100644 --- a/SplitWiseImpl/src/com/dataStore/interfaces/IUserDataStore.java +++ b/SplitWiseImpl/src/com/dataStore/interfaces/IUserDataStore.java @@ -2,12 +2,41 @@ import com.user.UserDetails; +/** + * The Interface IUserDataStore. + */ public interface IUserDataStore { + + /** + * Gets the user details. + * + * @param userId the user id + * @return the user details + */ UserDetails getUserDetails(String userId); + /** + * Adds the new user. + * + * @param userDetails the user details + * @return true, if successful + */ boolean addNewUser(UserDetails userDetails); + /** + * Delete user. + * + * @param userId the user id + * @return true, if successful + */ boolean deleteUser(String userId); + /** + * Update user details. + * + * @param userId the user id + * @param userDetails the user details + * @return true, if successful + */ boolean updateUserDetails(String userId, UserDetails userDetails); } diff --git a/SplitWiseImpl/src/com/dataStore/interfaces/IUserPairOwedAmountDataStore.java b/SplitWiseImpl/src/com/dataStore/interfaces/IUserPairOwedAmountDataStore.java index 5ed1cfb4..cf880e71 100644 --- a/SplitWiseImpl/src/com/dataStore/interfaces/IUserPairOwedAmountDataStore.java +++ b/SplitWiseImpl/src/com/dataStore/interfaces/IUserPairOwedAmountDataStore.java @@ -2,12 +2,42 @@ import com.strategies.splitObjects.SplitResult; +// TODO: Auto-generated Javadoc +/** + * The Interface IUserPairOwedAmountDataStore. + */ public interface IUserPairOwedAmountDataStore { + + /** + * Update amount. + * + * @param userId1 the user id 1 + * @param userId2 the user id 2 + * @param amount the amount + * @return true, if successful + */ boolean updateAmount(String userId1, String userId2, double amount); + /** + * Gets the balances for user. + * + * @param userId the user id + * @return the balances for user + */ SplitResult getBalancesForUser(String userId); + /** + * Gets the balances for all users. + * + * @return the balances for all users + */ SplitResult getBalancesForAllUsers(); + /** + * Update amount for entries. + * + * @param splitResult the split result + * @return true, if successful + */ boolean updateAmountForEntries(SplitResult splitResult); } diff --git a/SplitWiseImpl/src/com/enums/InputValidationResult.java b/SplitWiseImpl/src/com/enums/InputValidationResult.java index 00e1d133..cb5ba789 100644 --- a/SplitWiseImpl/src/com/enums/InputValidationResult.java +++ b/SplitWiseImpl/src/com/enums/InputValidationResult.java @@ -1,7 +1,16 @@ package com.enums; +/** + * The Enum InputValidationResult. + */ public enum InputValidationResult { + + /** The valid. */ VALID, + + /** The wrong input format. */ WRONG_INPUT_FORMAT, + + /** The sum not equal to total paid. */ SUM_NOT_EQUAL_TO_TOTAL_PAID } diff --git a/SplitWiseImpl/src/com/enums/SplitStrategyType.java b/SplitWiseImpl/src/com/enums/SplitStrategyType.java index 2792c3f4..167fafc7 100644 --- a/SplitWiseImpl/src/com/enums/SplitStrategyType.java +++ b/SplitWiseImpl/src/com/enums/SplitStrategyType.java @@ -1,7 +1,17 @@ package com.enums; +// TODO: Auto-generated Javadoc +/** + * The Enum SplitStrategyType. + */ public enum SplitStrategyType { + + /** The exact. */ EXACT, + + /** The equal. */ EQUAL, + + /** The percent. */ PERCENT } diff --git a/SplitWiseImpl/src/com/factory/DataStoreFactory.java b/SplitWiseImpl/src/com/factory/DataStoreFactory.java index cca361b7..fd4eed93 100644 --- a/SplitWiseImpl/src/com/factory/DataStoreFactory.java +++ b/SplitWiseImpl/src/com/factory/DataStoreFactory.java @@ -6,10 +6,23 @@ import com.dataStore.interfaces.IUserPairOwedAmountDataStore; import com.factory.interfaces.IDataStoreFactory; +// TODO: Auto-generated Javadoc +/** + * A factory for creating DataStore objects. + */ public class DataStoreFactory implements IDataStoreFactory { + + /** The user data store. */ private IUserDataStore userDataStore; + /** The user pair owed amount data store. */ private IUserPairOwedAmountDataStore userPairOwedAmountDataStore; + + /** + * Gets the user data store. + * + * @return the user data store + */ @Override public IUserDataStore getUserDataStore() { if (userDataStore == null) { @@ -18,6 +31,11 @@ public IUserDataStore getUserDataStore() { return this.userDataStore; } + /** + * Gets the user pair owed amount data store. + * + * @return the user pair owed amount data store + */ @Override public IUserPairOwedAmountDataStore getUserPairOwedAmountDataStore() { if (userPairOwedAmountDataStore == null) { diff --git a/SplitWiseImpl/src/com/factory/StrategyListFactory.java b/SplitWiseImpl/src/com/factory/StrategyListFactory.java index b967bed9..d8a3d371 100644 --- a/SplitWiseImpl/src/com/factory/StrategyListFactory.java +++ b/SplitWiseImpl/src/com/factory/StrategyListFactory.java @@ -14,8 +14,15 @@ import com.strategies.interfaces.ISplitStrategy; import com.strategies.percentDivisionStrategy.PercentDivisionSplitStrategy; +// TODO: Auto-generated Javadoc +/** + * A factory for creating StrategyList objects. + */ public class StrategyListFactory implements IStrategyListFactory { + /** + * Instantiates a new strategy list factory. + */ public StrategyListFactory() { this.strategyMap.put(SplitStrategyType.EXACT, new ExactDivisionSplitStrategy()); this.strategyMap.put(SplitStrategyType.EQUAL, new EqualDivisionSplitStrategy()); @@ -24,10 +31,17 @@ public StrategyListFactory() { + /** The strategy map. */ private HashMap strategyMap = new HashMap(); + /** + * Gets the strategy list. + * + * @param strategiesPresent the strategies present + * @return the strategy list + */ @Override public IStrategyList getStrategyList(List strategiesPresent) { Map result = new LinkedHashMap(); diff --git a/SplitWiseImpl/src/com/factory/interfaces/IDataStoreFactory.java b/SplitWiseImpl/src/com/factory/interfaces/IDataStoreFactory.java index 5a11a930..c45880de 100644 --- a/SplitWiseImpl/src/com/factory/interfaces/IDataStoreFactory.java +++ b/SplitWiseImpl/src/com/factory/interfaces/IDataStoreFactory.java @@ -3,8 +3,23 @@ import com.dataStore.interfaces.IUserDataStore; import com.dataStore.interfaces.IUserPairOwedAmountDataStore; +// TODO: Auto-generated Javadoc +/** + * A factory for creating IDataStore objects. + */ public interface IDataStoreFactory { + + /** + * Gets the user data store. + * + * @return the user data store + */ IUserDataStore getUserDataStore(); + /** + * Gets the user pair owed amount data store. + * + * @return the user pair owed amount data store + */ IUserPairOwedAmountDataStore getUserPairOwedAmountDataStore(); } diff --git a/SplitWiseImpl/src/com/factory/interfaces/IStrategyListFactory.java b/SplitWiseImpl/src/com/factory/interfaces/IStrategyListFactory.java index 3c348508..881ab263 100644 --- a/SplitWiseImpl/src/com/factory/interfaces/IStrategyListFactory.java +++ b/SplitWiseImpl/src/com/factory/interfaces/IStrategyListFactory.java @@ -4,6 +4,17 @@ import com.interfaces.IStrategyList; +// TODO: Auto-generated Javadoc +/** + * A factory for creating IStrategyList objects. + */ public interface IStrategyListFactory { + + /** + * Gets the strategy list. + * + * @param strategiesPresent the strategies present + * @return the strategy list + */ IStrategyList getStrategyList(List strategiesPresent); } diff --git a/SplitWiseImpl/src/com/interfaces/IApplication.java b/SplitWiseImpl/src/com/interfaces/IApplication.java index 450f5ed2..ad833397 100644 --- a/SplitWiseImpl/src/com/interfaces/IApplication.java +++ b/SplitWiseImpl/src/com/interfaces/IApplication.java @@ -5,12 +5,39 @@ import com.enums.SplitStrategyType; import com.strategies.splitObjects.SplitResult; +// TODO: Auto-generated Javadoc +/** + * The Interface IApplication. + */ public interface IApplication { + + /** + * Adds the expense. + * + * @param expenseInput the expense input + * @return true, if successful + */ boolean addExpense(List expenseInput); + /** + * Gets the balance for user. + * + * @param userId the user id + * @return the balance for user + */ SplitResult getBalanceForUser(String userId); + /** + * Gets the all balances. + * + * @return the all balances + */ SplitResult getAllBalances(); + /** + * Gets the strategies name. + * + * @return the strategies name + */ List getStrategiesName(); } diff --git a/SplitWiseImpl/src/com/interfaces/IStrategyList.java b/SplitWiseImpl/src/com/interfaces/IStrategyList.java index 63732755..1566f137 100644 --- a/SplitWiseImpl/src/com/interfaces/IStrategyList.java +++ b/SplitWiseImpl/src/com/interfaces/IStrategyList.java @@ -5,6 +5,16 @@ import com.enums.SplitStrategyType; import com.strategies.interfaces.ISplitStrategy; +// TODO: Auto-generated Javadoc +/** + * The Interface IStrategyList. + */ public interface IStrategyList { + + /** + * Gets the split strategies. + * + * @return the split strategies + */ Map getSplitStrategies(); } diff --git a/SplitWiseImpl/src/com/ioParser/InputReader.java b/SplitWiseImpl/src/com/ioParser/InputReader.java index ced2628e..32977f24 100644 --- a/SplitWiseImpl/src/com/ioParser/InputReader.java +++ b/SplitWiseImpl/src/com/ioParser/InputReader.java @@ -13,11 +13,19 @@ import com.strategies.percentDivisionStrategy.PercentDivisionInputGenerator; import com.strategies.splitObjects.SplitInput; +// TODO: Auto-generated Javadoc +/** + * The Class InputReader. + */ public class InputReader implements IInputReader { + /** The strategy input generator map. */ HashMap strategyInputGeneratorMap; + /** + * Instantiates a new input reader. + */ public InputReader() { this.strategyInputGeneratorMap = new HashMap(); @@ -28,6 +36,12 @@ public InputReader() { this.strategyInputGeneratorMap.put(SplitStrategyType.PERCENT, new PercentDivisionInputGenerator()); } + /** + * Parses the input. + * + * @param input the input + * @return the i split input + */ @Override public ISplitInput parseInput(List input) { diff --git a/SplitWiseImpl/src/com/ioParser/ResultFormatter.java b/SplitWiseImpl/src/com/ioParser/ResultFormatter.java index a62392df..6da78bdd 100644 --- a/SplitWiseImpl/src/com/ioParser/ResultFormatter.java +++ b/SplitWiseImpl/src/com/ioParser/ResultFormatter.java @@ -1,5 +1,16 @@ package com.ioParser; -public class ResultFormatter { +import java.util.List; + +import com.ioParser.interfaces.IResultFormatter; +import com.strategies.splitObjects.SplitResult; + +public class ResultFormatter implements IResultFormatter{ + + @Override + public List getFormattedResult(SplitResult splitResult) { + return null; + + } } diff --git a/SplitWiseImpl/src/com/ioParser/interfaces/IInputReader.java b/SplitWiseImpl/src/com/ioParser/interfaces/IInputReader.java index f42a53ed..a3c06539 100644 --- a/SplitWiseImpl/src/com/ioParser/interfaces/IInputReader.java +++ b/SplitWiseImpl/src/com/ioParser/interfaces/IInputReader.java @@ -4,6 +4,17 @@ import com.strategies.interfaces.ISplitInput; +// TODO: Auto-generated Javadoc +/** + * The Interface IInputReader. + */ public interface IInputReader { + + /** + * Parses the input. + * + * @param input the input + * @return the i split input + */ ISplitInput parseInput(List input); } diff --git a/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java b/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java index 445f40d0..1616bbbf 100644 --- a/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java +++ b/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java @@ -4,6 +4,17 @@ import com.strategies.splitObjects.SplitResult; +// TODO: Auto-generated Javadoc +/** + * The Interface IResultFormatter. + */ public interface IResultFormatter { + + /** + * Gets the formatted result. + * + * @param splitResult the split result + * @return the formatted result + */ List getFormattedResult(SplitResult splitResult); } diff --git a/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualDivisionSplitStrategy.java b/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualDivisionSplitStrategy.java index 7d1c52e8..8a4b36a9 100644 --- a/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualDivisionSplitStrategy.java +++ b/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualDivisionSplitStrategy.java @@ -9,13 +9,26 @@ import com.strategies.interfaces.ISplitStrategy; import com.strategies.splitObjects.SplitResult; +// TODO: Auto-generated Javadoc +/** + * The Class EqualDivisionSplitStrategy. + */ public class EqualDivisionSplitStrategy implements ISplitStrategy { + /** + * Instantiates a new equal division split strategy. + */ public EqualDivisionSplitStrategy() { // TODO Auto-generated constructor stub } + /** + * Gets the final split. + * + * @param splitInput the split input + * @return the final split + */ @Override public SplitResult getFinalSplit(ISplitInput splitInput) { @@ -65,6 +78,12 @@ public SplitResult getFinalSplit(ISplitInput splitInput) { } + /** + * Verify input. + * + * @param splitInput the split input + * @return the input validation result + */ @Override public InputValidationResult verifyInput(ISplitInput splitInput) { try { @@ -78,6 +97,11 @@ public InputValidationResult verifyInput(ISplitInput splitInput) { } } + /** + * Gets the spli strategy type. + * + * @return the spli strategy type + */ @Override public SplitStrategyType getSpliStrategyType() { // TODO Auto-generated method stub diff --git a/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategyInutGenerator.java b/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategyInutGenerator.java index f8a1ebf2..6674c7bf 100644 --- a/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategyInutGenerator.java +++ b/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategyInutGenerator.java @@ -6,8 +6,20 @@ import com.strategies.splitObjects.SplitInput; import com.strategies.splitObjects.StrategyInputGenerator; +// TODO: Auto-generated Javadoc +/** + * The Class EqualStrategyInutGenerator. + */ public class EqualStrategyInutGenerator extends StrategyInputGenerator { + /** + * Generate split input. + * + * @param baseInput the base input + * @param input the input + * @param lastVisitedIndex the last visited index + * @return the equal strategy split input + */ @Override public EqualStrategySplitInput generateSplitInput(ISplitInput baseInput, List input, int lastVisitedIndex) { SplitInput baseInput2 = super.generateSplitInput(baseInput, input, lastVisitedIndex); diff --git a/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategySplitInput.java b/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategySplitInput.java index e5718798..ddfe2086 100644 --- a/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategySplitInput.java +++ b/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategySplitInput.java @@ -5,12 +5,28 @@ import com.enums.SplitStrategyType; import com.strategies.splitObjects.SplitInput; +// TODO: Auto-generated Javadoc +/** + * The Class EqualStrategySplitInput. + */ public class EqualStrategySplitInput extends SplitInput { + /** + * Instantiates a new equal strategy split input. + * + * @param paidBy the paid by + * @param participants the participants + * @param paidAmount the paid amount + */ public EqualStrategySplitInput(String paidBy, List participants, double paidAmount) { super(paidBy, participants, paidAmount); } + /** + * Gets the split input type. + * + * @return the split input type + */ @Override public SplitStrategyType getSplitInputType() { diff --git a/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactDivisionSplitStrategy.java b/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactDivisionSplitStrategy.java index 17617c2a..a09a031b 100644 --- a/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactDivisionSplitStrategy.java +++ b/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactDivisionSplitStrategy.java @@ -9,8 +9,18 @@ import com.strategies.interfaces.ISplitStrategy; import com.strategies.splitObjects.SplitResult; +// TODO: Auto-generated Javadoc +/** + * The Class ExactDivisionSplitStrategy. + */ public class ExactDivisionSplitStrategy implements ISplitStrategy { + /** + * Verify input. + * + * @param splitInput the split input + * @return the input validation result + */ @Override public InputValidationResult verifyInput(ISplitInput splitInput) { ExactStrategySplitInput input; @@ -42,6 +52,12 @@ public InputValidationResult verifyInput(ISplitInput splitInput) { } } + /** + * Gets the final split. + * + * @param splitInput the split input + * @return the final split + */ @Override public SplitResult getFinalSplit(ISplitInput splitInput) { if (this.verifyInput(splitInput) != InputValidationResult.VALID) { @@ -86,6 +102,11 @@ public SplitResult getFinalSplit(ISplitInput splitInput) { return new SplitResult(owedByMap, owedToMap, owedMap, owesMap); } + /** + * Gets the spli strategy type. + * + * @return the spli strategy type + */ @Override public SplitStrategyType getSpliStrategyType() { // TODO Auto-generated method stub diff --git a/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStartegyInputGenerator.java b/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStartegyInputGenerator.java index 7568f3d9..1594c959 100644 --- a/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStartegyInputGenerator.java +++ b/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStartegyInputGenerator.java @@ -7,7 +7,20 @@ import com.strategies.splitObjects.SplitInput; import com.strategies.splitObjects.StrategyInputGenerator; +// TODO: Auto-generated Javadoc +/** + * The Class ExactStartegyInputGenerator. + */ public class ExactStartegyInputGenerator extends StrategyInputGenerator { + + /** + * Generate split input. + * + * @param baseInput the base input + * @param input the input + * @param lastVisitedIndex the last visited index + * @return the exact strategy split input + */ @Override public ExactStrategySplitInput generateSplitInput(ISplitInput baseInput, List input, int lastVisitedIndex) { SplitInput baseInput2 = super.generateSplitInput(baseInput, input, lastVisitedIndex); diff --git a/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStrategySplitInput.java b/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStrategySplitInput.java index fa24ad75..76aa142b 100644 --- a/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStrategySplitInput.java +++ b/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStrategySplitInput.java @@ -6,20 +6,43 @@ import com.enums.SplitStrategyType; import com.strategies.splitObjects.SplitInput; +// TODO: Auto-generated Javadoc +/** + * The Class ExactStrategySplitInput. + */ public class ExactStrategySplitInput extends SplitInput { + /** The exact amount owed map. */ private HashMap exactAmountOwedMap; + /** + * Instantiates a new exact strategy split input. + * + * @param paidBy the paid by + * @param participants the participants + * @param paidAmount the paid amount + * @param exactAmountOwedMap the exact amount owed map + */ public ExactStrategySplitInput(String paidBy, List participants, double paidAmount, HashMap exactAmountOwedMap) { super(paidBy, participants, paidAmount); this.exactAmountOwedMap = exactAmountOwedMap; } + /** + * Gets the exact amount owed map. + * + * @return the exact amount owed map + */ public HashMap getExactAmountOwedMap() { return exactAmountOwedMap; } + /** + * Gets the split input type. + * + * @return the split input type + */ @Override public SplitStrategyType getSplitInputType() { diff --git a/SplitWiseImpl/src/com/strategies/interfaces/ISplitInput.java b/SplitWiseImpl/src/com/strategies/interfaces/ISplitInput.java index 44c6aeb9..ce90af09 100644 --- a/SplitWiseImpl/src/com/strategies/interfaces/ISplitInput.java +++ b/SplitWiseImpl/src/com/strategies/interfaces/ISplitInput.java @@ -2,6 +2,16 @@ import com.enums.SplitStrategyType; +// TODO: Auto-generated Javadoc +/** + * The Interface ISplitInput. + */ public interface ISplitInput { + + /** + * Gets the split input type. + * + * @return the split input type + */ SplitStrategyType getSplitInputType(); } diff --git a/SplitWiseImpl/src/com/strategies/interfaces/ISplitStrategy.java b/SplitWiseImpl/src/com/strategies/interfaces/ISplitStrategy.java index bb39a85e..1b7e26a6 100644 --- a/SplitWiseImpl/src/com/strategies/interfaces/ISplitStrategy.java +++ b/SplitWiseImpl/src/com/strategies/interfaces/ISplitStrategy.java @@ -3,8 +3,32 @@ import com.enums.SplitStrategyType; import com.strategies.splitObjects.SplitResult; +// TODO: Auto-generated Javadoc +/** + * The Interface ISplitStrategy. + */ public interface ISplitStrategy { + + /** + * Verify input. + * + * @param splitInput the split input + * @return the input validation result + */ InputValidationResult verifyInput(ISplitInput splitInput); + + /** + * Gets the final split. + * + * @param splitInput the split input + * @return the final split + */ SplitResult getFinalSplit(ISplitInput splitInput); + + /** + * Gets the spli strategy type. + * + * @return the spli strategy type + */ SplitStrategyType getSpliStrategyType(); } diff --git a/SplitWiseImpl/src/com/strategies/interfaces/IStrategyInputGenerator.java b/SplitWiseImpl/src/com/strategies/interfaces/IStrategyInputGenerator.java index fdcbe004..619130f2 100644 --- a/SplitWiseImpl/src/com/strategies/interfaces/IStrategyInputGenerator.java +++ b/SplitWiseImpl/src/com/strategies/interfaces/IStrategyInputGenerator.java @@ -2,6 +2,19 @@ import java.util.List; +// TODO: Auto-generated Javadoc +/** + * The Interface IStrategyInputGenerator. + */ public interface IStrategyInputGenerator { + + /** + * Generate split input. + * + * @param baseInput the base input + * @param input the input + * @param lastVisitedIndex the last visited index + * @return the i split input + */ ISplitInput generateSplitInput(ISplitInput baseInput, List input, int lastVisitedIndex); } diff --git a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionInputGenerator.java b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionInputGenerator.java index b21c319d..2fa35d3f 100644 --- a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionInputGenerator.java +++ b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionInputGenerator.java @@ -7,7 +7,20 @@ import com.strategies.splitObjects.SplitInput; import com.strategies.splitObjects.StrategyInputGenerator; +// TODO: Auto-generated Javadoc +/** + * The Class PercentDivisionInputGenerator. + */ public class PercentDivisionInputGenerator extends StrategyInputGenerator { + + /** + * Generate split input. + * + * @param baseInput the base input + * @param input the input + * @param lastVisitedIndex the last visited index + * @return the percent division split input + */ @Override public PercentDivisionSplitInput generateSplitInput(ISplitInput baseInput, List input, int lastVisitedIndex) { SplitInput baseInput2 = super.generateSplitInput(baseInput, input, lastVisitedIndex); diff --git a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitInput.java b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitInput.java index 78ebabfe..7077aa2a 100644 --- a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitInput.java +++ b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitInput.java @@ -6,19 +6,43 @@ import com.enums.SplitStrategyType; import com.strategies.splitObjects.SplitInput; +// TODO: Auto-generated Javadoc +/** + * The Class PercentDivisionSplitInput. + */ public class PercentDivisionSplitInput extends SplitInput { + + /** The percent owed map. */ private HashMap percentOwedMap; + /** + * Instantiates a new percent division split input. + * + * @param paidBy the paid by + * @param participants the participants + * @param paidAmount the paid amount + * @param percentOwedMap the percent owed map + */ public PercentDivisionSplitInput(String paidBy, List participants, double paidAmount, HashMap percentOwedMap) { super(paidBy, participants, paidAmount); this.percentOwedMap = percentOwedMap; } + /** + * Gets the percent owed map. + * + * @return the percent owed map + */ public HashMap getPercentOwedMap() { return percentOwedMap; } + /** + * Gets the split input type. + * + * @return the split input type + */ @Override public SplitStrategyType getSplitInputType() { diff --git a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java index 0b80018c..913eece1 100644 --- a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java +++ b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java @@ -9,9 +9,21 @@ import com.strategies.interfaces.ISplitStrategy; import com.strategies.splitObjects.SplitResult; +// TODO: Auto-generated Javadoc +/** + * The Class PercentDivisionSplitStrategy. + */ public class PercentDivisionSplitStrategy implements ISplitStrategy { + + /** The percentage 100. */ static public double PERCENTAGE_100 = 100.0; + /** + * Verify input. + * + * @param splitInput the split input + * @return the input validation result + */ @Override public InputValidationResult verifyInput(ISplitInput splitInput) { try { @@ -33,6 +45,12 @@ public InputValidationResult verifyInput(ISplitInput splitInput) { } } + /** + * Gets the final split. + * + * @param splitInput the split input + * @return the final split + */ @Override public SplitResult getFinalSplit(ISplitInput splitInput) { if (this.verifyInput(splitInput) != InputValidationResult.VALID) { @@ -80,6 +98,11 @@ public SplitResult getFinalSplit(ISplitInput splitInput) { return new SplitResult(owedByMap, owedToMap, owedMap, owesMap); } + /** + * Gets the spli strategy type. + * + * @return the spli strategy type + */ @Override public SplitStrategyType getSpliStrategyType() { // TODO Auto-generated method stub diff --git a/SplitWiseImpl/src/com/strategies/splitObjects/SplitInput.java b/SplitWiseImpl/src/com/strategies/splitObjects/SplitInput.java index 3b80fde1..296f4031 100644 --- a/SplitWiseImpl/src/com/strategies/splitObjects/SplitInput.java +++ b/SplitWiseImpl/src/com/strategies/splitObjects/SplitInput.java @@ -4,7 +4,19 @@ import com.strategies.interfaces.ISplitInput; +// TODO: Auto-generated Javadoc +/** + * The Class SplitInput. + */ public abstract class SplitInput implements ISplitInput { + + /** + * Instantiates a new split input. + * + * @param paidBy the paid by + * @param participants the participants + * @param paidAmount the paid amount + */ public SplitInput(String paidBy, List participants, double paidAmount) { super(); this.paidBy = paidBy; @@ -12,34 +24,67 @@ public SplitInput(String paidBy, List participants, double paidAmount) { this.paidAmount = paidAmount; } + /** The paid by. */ private String paidBy; + /** The participants. */ private List participants; + /** The paid amount. */ private double paidAmount; + /** + * Gets the paid by. + * + * @return the paid by + */ public String getPaidBy() { return paidBy; } + /** + * Gets the paid amount. + * + * @return the paid amount + */ public double getPaidAmount() { return paidAmount; } + /** + * Sets the paid amount. + * + * @param paidAmount the new paid amount + */ public void setPaidAmount(double paidAmount) { this.paidAmount = paidAmount; } + /** + * Sets the paid by. + * + * @param paidBy the new paid by + */ public void setPaidBy(String paidBy) { this.paidBy = paidBy; } + /** + * Gets the participants. + * + * @return the participants + */ public List getParticipants() { return participants; } + /** + * Sets the participants. + * + * @param participants the new participants + */ public void setParticipants(List participants) { this.participants = participants; } diff --git a/SplitWiseImpl/src/com/strategies/splitObjects/SplitResult.java b/SplitWiseImpl/src/com/strategies/splitObjects/SplitResult.java index c8df1520..f8c94064 100644 --- a/SplitWiseImpl/src/com/strategies/splitObjects/SplitResult.java +++ b/SplitWiseImpl/src/com/strategies/splitObjects/SplitResult.java @@ -2,14 +2,29 @@ import java.util.HashMap; +// TODO: Auto-generated Javadoc +/** + * The Class SplitResult. + */ public class SplitResult { + + /** The owed by. */ HashMap> owedBy; + + /** The owed to. */ HashMap> owedTo; + + /** The owed map. */ HashMap owedMap; + + /** The owes map. */ HashMap owesMap; + /** + * Instantiates a new split result. + */ public SplitResult() { super(); this.owedBy = new HashMap>(); @@ -18,6 +33,14 @@ public SplitResult() { this.owesMap = new HashMap(); } + /** + * Instantiates a new split result. + * + * @param owedBy the owed by + * @param owedTo the owed to + * @param owedMap the owed map + * @param owesMap the owes map + */ public SplitResult(HashMap> owedBy, HashMap> owedTo, HashMap owedMap, HashMap owesMap) { super(); @@ -27,9 +50,20 @@ public SplitResult(HashMap> owedBy, HashMap> getOwedBy() { return owedBy; } + + /** + * Gets the owed to. + * + * @return the owed to + */ public HashMap> getOwedTo() { return owedTo; } diff --git a/SplitWiseImpl/src/com/strategies/splitObjects/StrategyInputGenerator.java b/SplitWiseImpl/src/com/strategies/splitObjects/StrategyInputGenerator.java index 77ef0df5..c36aadc0 100644 --- a/SplitWiseImpl/src/com/strategies/splitObjects/StrategyInputGenerator.java +++ b/SplitWiseImpl/src/com/strategies/splitObjects/StrategyInputGenerator.java @@ -5,8 +5,20 @@ import com.strategies.interfaces.ISplitInput; import com.strategies.interfaces.IStrategyInputGenerator; +// TODO: Auto-generated Javadoc +/** + * The Class StrategyInputGenerator. + */ public abstract class StrategyInputGenerator implements IStrategyInputGenerator { + /** + * Generate split input. + * + * @param baseInput the base input + * @param input the input + * @param lastVisitedIndex the last visited index + * @return the split input + */ @Override public SplitInput generateSplitInput(ISplitInput baseInput, List input, int lastVisitedIndex) { try { diff --git a/SplitWiseImpl/src/com/user/UserDetails.java b/SplitWiseImpl/src/com/user/UserDetails.java index 289050a5..1622a8ea 100644 --- a/SplitWiseImpl/src/com/user/UserDetails.java +++ b/SplitWiseImpl/src/com/user/UserDetails.java @@ -1,14 +1,31 @@ package com.user; +// TODO: Auto-generated Javadoc +/** + * The Class UserDetails. + */ public class UserDetails { + /** The user id. */ String userId; + + /** The name. */ String name; + /** The email. */ String email; + /** The phone number. */ String phoneNumber; + /** + * Instantiates a new user details. + * + * @param userId the user id + * @param name the name + * @param email the email + * @param phoneNumber the phone number + */ public UserDetails(String userId, String name, String email, String phoneNumber) { super(); this.userId = userId; @@ -18,34 +35,74 @@ public UserDetails(String userId, String name, String email, String phoneNumber) } + /** + * Gets the user id. + * + * @return the user id + */ public String getUserId() { return userId; } + /** + * Sets the user id. + * + * @param userId the new user id + */ public void setUserId(String userId) { this.userId = userId; } + /** + * Gets the name. + * + * @return the name + */ public String getName() { return name; } + /** + * Sets the name. + * + * @param name the new name + */ public void setName(String name) { this.name = name; } + /** + * Gets the email. + * + * @return the email + */ public String getEmail() { return email; } + /** + * Sets the email. + * + * @param email the new email + */ public void setEmail(String email) { this.email = email; } + /** + * Gets the phone number. + * + * @return the phone number + */ public String getPhoneNumber() { return phoneNumber; } + /** + * Sets the phone number. + * + * @param phoneNumber the new phone number + */ public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } diff --git a/SplitWiseImpl/src/com/user/interfaces/IUser.java b/SplitWiseImpl/src/com/user/interfaces/IUser.java index 9f615f7f..cc7d1c8a 100644 --- a/SplitWiseImpl/src/com/user/interfaces/IUser.java +++ b/SplitWiseImpl/src/com/user/interfaces/IUser.java @@ -2,8 +2,26 @@ import com.user.UserDetails; +// TODO: Auto-generated Javadoc +/** + * The Interface IUser. + */ public interface IUser { + + /** + * Gets the user details. + * + * @param userId the user id + * @return the user details + */ UserDetails getUserDetails(String userId); + /** + * Update user details. + * + * @param userId the user id + * @param userDetails the user details + * @return true, if successful + */ boolean updateUserDetails(String userId, UserDetails userDetails); } From 76dc795fb353d58f268c26f765129f5eb1f79eef Mon Sep 17 00:00:00 2001 From: Anant Akash Date: Sat, 29 Mar 2025 00:50:39 +0530 Subject: [PATCH 05/19] Adding new changes --- .../com/application/ApplicationInterface.java | 74 +++++++++++++++++++ SplitWiseImpl/src/com/enums/InputCommand.java | 6 ++ .../com/interfaces/IApplicationInterface.java | 9 +++ SplitWiseImpl/src/com/user/User.java | 46 ++++++++++++ .../src/com/user/interfaces/IUser.java | 4 +- 5 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 SplitWiseImpl/src/com/application/ApplicationInterface.java create mode 100644 SplitWiseImpl/src/com/enums/InputCommand.java create mode 100644 SplitWiseImpl/src/com/interfaces/IApplicationInterface.java create mode 100644 SplitWiseImpl/src/com/user/User.java diff --git a/SplitWiseImpl/src/com/application/ApplicationInterface.java b/SplitWiseImpl/src/com/application/ApplicationInterface.java new file mode 100644 index 00000000..8b3961c9 --- /dev/null +++ b/SplitWiseImpl/src/com/application/ApplicationInterface.java @@ -0,0 +1,74 @@ +package com.application; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import com.dataStore.interfaces.IUserDataStore; +import com.enums.InputCommand; +import com.factory.interfaces.IDataStoreFactory; +import com.factory.interfaces.IStrategyListFactory; +import com.interfaces.IApplication; +import com.interfaces.IApplicationInterface; +import com.ioParser.interfaces.IInputReader; +import com.ioParser.interfaces.IResultFormatter; +import com.strategies.splitObjects.SplitResult; + +public class ApplicationInterface implements IApplicationInterface { + + private IApplication application; + + private IUserDataStore userDataStore; + + private IDataStoreFactory dataStoreFactory; + + private IStrategyListFactory strategyListFactory; + + private IResultFormatter resultFormatter; + private IInputReader inputReader; + @Override + public void instantiateApplication() { + this.application = new Application(dataStoreFactory, strategyListFactory, null, inputReader); + + this.userDataStore = this.dataStoreFactory.getUserDataStore(); + } + + @Override + public List runInputString(String input) { + String[] inputArr = input.split(" "); + + List inputList = new ArrayList(); + + int i = 1; + + while (i < inputArr.length) { + inputList.add(inputArr[i]); + + i++; + } + + if (InputCommand.EXPENSE == InputCommand.valueOf(inputArr[0])) { + this.application.addExpense(inputList); + + return Arrays.asList("No Expenses"); + } + + if (InputCommand.SHOW == InputCommand.valueOf(inputArr[0])) { + SplitResult splitResult; + if (inputList.size() == 0) { + splitResult = this.application.getAllBalances(); + } else { + splitResult = this.application.getBalanceForUser(inputList.get(0)); + } + + return this.resultFormatter.getFormattedResult(splitResult); + + } + + return new ArrayList(); + + } + + + +} diff --git a/SplitWiseImpl/src/com/enums/InputCommand.java b/SplitWiseImpl/src/com/enums/InputCommand.java new file mode 100644 index 00000000..d58df98b --- /dev/null +++ b/SplitWiseImpl/src/com/enums/InputCommand.java @@ -0,0 +1,6 @@ +package com.enums; + +public enum InputCommand { + EXPENSE, + SHOW +} diff --git a/SplitWiseImpl/src/com/interfaces/IApplicationInterface.java b/SplitWiseImpl/src/com/interfaces/IApplicationInterface.java new file mode 100644 index 00000000..88c25165 --- /dev/null +++ b/SplitWiseImpl/src/com/interfaces/IApplicationInterface.java @@ -0,0 +1,9 @@ +package com.interfaces; + +import java.util.List; + +public interface IApplicationInterface { + void instantiateApplication(); + + List runInputString(String input); +} diff --git a/SplitWiseImpl/src/com/user/User.java b/SplitWiseImpl/src/com/user/User.java new file mode 100644 index 00000000..1dcd9348 --- /dev/null +++ b/SplitWiseImpl/src/com/user/User.java @@ -0,0 +1,46 @@ +package com.user; + +import com.dataStore.interfaces.IUserDataStore; +import com.user.interfaces.IUser; + +public class User implements IUser{ + private UserDetails userDetails; + + private String userId; + + private IUserDataStore userDataStore; + + + public User(String userId, IUserDataStore userDataStore) { + super(); + this.userId = userId; + this.userDataStore = userDataStore; + } + + @Override + public UserDetails getUserDetails() { + if (this.userDetails != null) { + return this.userDetails; + } + + this.userDetails = this.userDataStore.getUserDetails(this.userId); + + return this.userDetails; + } + + @Override + public boolean updateUserDetails(UserDetails userDetails) { + boolean result = this.userDataStore.updateUserDetails(this.userId, userDetails); + + if (!result) { + return false; + } + + this.userDetails = this.userDataStore.getUserDetails(this.userId); + + return true; + + } + + +} diff --git a/SplitWiseImpl/src/com/user/interfaces/IUser.java b/SplitWiseImpl/src/com/user/interfaces/IUser.java index cc7d1c8a..68232f54 100644 --- a/SplitWiseImpl/src/com/user/interfaces/IUser.java +++ b/SplitWiseImpl/src/com/user/interfaces/IUser.java @@ -14,7 +14,7 @@ public interface IUser { * @param userId the user id * @return the user details */ - UserDetails getUserDetails(String userId); + UserDetails getUserDetails(); /** * Update user details. @@ -23,5 +23,5 @@ public interface IUser { * @param userDetails the user details * @return true, if successful */ - boolean updateUserDetails(String userId, UserDetails userDetails); + boolean updateUserDetails(UserDetails userDetails); } From 3bfb8fdbba38c11f7f44862260c5338ddff6f8e6 Mon Sep 17 00:00:00 2001 From: Anant Akash Date: Thu, 3 Apr 2025 16:58:57 +0530 Subject: [PATCH 06/19] Adding new changes --- .../src/com/application/Application.java | 14 ++-- .../com/application/ApplicationInterface.java | 31 ++++++-- .../UserPairOwedAmountDataStore.java | 22 +++++- .../src/com/factory/StrategyListFactory.java | 1 + .../src/com/interfaces/IApplication.java | 3 +- .../com/interfaces/IApplicationInterface.java | 4 + .../src/com/ioParser/ResultFormatter.java | 74 ++++++++++++++++++- .../ioParser/interfaces/IResultFormatter.java | 3 +- SplitWiseImpl/src/com/main/Main.java | 52 +++++++++++++ .../PercentDivisionSplitStrategy.java | 2 +- 10 files changed, 181 insertions(+), 25 deletions(-) create mode 100644 SplitWiseImpl/src/com/main/Main.java diff --git a/SplitWiseImpl/src/com/application/Application.java b/SplitWiseImpl/src/com/application/Application.java index 3c661412..30ab147a 100644 --- a/SplitWiseImpl/src/com/application/Application.java +++ b/SplitWiseImpl/src/com/application/Application.java @@ -9,7 +9,6 @@ import com.factory.interfaces.IStrategyListFactory; import com.interfaces.IApplication; import com.interfaces.IStrategyList; -import com.ioParser.interfaces.IInputReader; import com.strategies.interfaces.ISplitInput; import com.strategies.splitObjects.SplitResult; @@ -24,8 +23,6 @@ public class Application implements IApplication { /** The strategy list. */ private IStrategyList strategyList; - /** The input reader. */ - private IInputReader inputReader; @@ -37,13 +34,11 @@ public class Application implements IApplication { * @param strategiesPresnt the strategies presnt * @param inputReader the input reader */ - Application(IDataStoreFactory dataStoreFactory, IStrategyListFactory strategyListFactory, List strategiesPresnt, IInputReader inputReader) { + Application(IDataStoreFactory dataStoreFactory, IStrategyListFactory strategyListFactory, List strategiesPresnt) { this.userPairOwedAmountDataStore = dataStoreFactory.getUserPairOwedAmountDataStore(); this.strategyList = strategyListFactory.getStrategyList(strategiesPresnt); - - this.inputReader = inputReader; } /** @@ -56,8 +51,7 @@ public class Application implements IApplication { /** * */ - public boolean addExpense(List expenseInput) { - ISplitInput splitInput = this.inputReader.parseInput(expenseInput); + public boolean addExpense(ISplitInput splitInput) { if (splitInput == null) { return false; @@ -65,6 +59,8 @@ public boolean addExpense(List expenseInput) { SplitResult splitResult = this.strategyList.getSplitStrategies().get(splitInput.getSplitInputType()).getFinalSplit(splitInput); + // System.out.println("result " + splitResult.getOwedBy() + " " + splitResult.getOwedTo()); + return this.userPairOwedAmountDataStore.updateAmountForEntries(splitResult); } @@ -78,7 +74,7 @@ public boolean addExpense(List expenseInput) { @Override public SplitResult getBalanceForUser(String userId) { - return this.getBalanceForUser(userId); + return this.userPairOwedAmountDataStore.getBalancesForUser(userId); } /** diff --git a/SplitWiseImpl/src/com/application/ApplicationInterface.java b/SplitWiseImpl/src/com/application/ApplicationInterface.java index 8b3961c9..62d3acc7 100644 --- a/SplitWiseImpl/src/com/application/ApplicationInterface.java +++ b/SplitWiseImpl/src/com/application/ApplicationInterface.java @@ -4,8 +4,8 @@ import java.util.Arrays; import java.util.List; -import com.dataStore.interfaces.IUserDataStore; import com.enums.InputCommand; +import com.enums.SplitStrategyType; import com.factory.interfaces.IDataStoreFactory; import com.factory.interfaces.IStrategyListFactory; import com.interfaces.IApplication; @@ -13,12 +13,12 @@ import com.ioParser.interfaces.IInputReader; import com.ioParser.interfaces.IResultFormatter; import com.strategies.splitObjects.SplitResult; +import com.user.UserDetails; public class ApplicationInterface implements IApplicationInterface { private IApplication application; - private IUserDataStore userDataStore; private IDataStoreFactory dataStoreFactory; @@ -26,11 +26,21 @@ public class ApplicationInterface implements IApplicationInterface { private IResultFormatter resultFormatter; private IInputReader inputReader; + + + public ApplicationInterface(IDataStoreFactory dataStoreFactory, IStrategyListFactory strategyListFactory, + IResultFormatter resultFormatter, IInputReader inputReader) { + super(); + this.dataStoreFactory = dataStoreFactory; + this.strategyListFactory = strategyListFactory; + this.resultFormatter = resultFormatter; + this.inputReader = inputReader; + } + @Override public void instantiateApplication() { - this.application = new Application(dataStoreFactory, strategyListFactory, null, inputReader); + this.application = new Application(dataStoreFactory, strategyListFactory, Arrays.asList((String) SplitStrategyType.EQUAL.name(),(String) SplitStrategyType.EXACT.name(), (String)SplitStrategyType.PERCENT.name())); - this.userDataStore = this.dataStoreFactory.getUserDataStore(); } @Override @@ -48,9 +58,9 @@ public List runInputString(String input) { } if (InputCommand.EXPENSE == InputCommand.valueOf(inputArr[0])) { - this.application.addExpense(inputList); + this.application.addExpense(this.inputReader.parseInput(inputList)); - return Arrays.asList("No Expenses"); + return Arrays.asList(); } if (InputCommand.SHOW == InputCommand.valueOf(inputArr[0])) { @@ -61,13 +71,20 @@ public List runInputString(String input) { splitResult = this.application.getBalanceForUser(inputList.get(0)); } - return this.resultFormatter.getFormattedResult(splitResult); +// System.out.println("result" + splitResult.getOwedBy() + " " + splitResult.getOwedTo()); + + return this.resultFormatter.getFormattedResult(splitResult, this.dataStoreFactory.getUserDataStore()); } return new ArrayList(); } + + @Override + public boolean addNewUser(UserDetails userDetails) { + return this.dataStoreFactory.getUserDataStore().addNewUser(userDetails); + } diff --git a/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java b/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java index 2025855b..2bf79393 100644 --- a/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java +++ b/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java @@ -31,7 +31,7 @@ public class UserPairOwedAmountDataStore implements IUserPairOwedAmountDataStore public boolean updateAmount(String userId1, String userId2, double amount) { double amountOwed = amount; if (this.owedByMap.containsKey(userId2) && this.owedByMap.get(userId2).containsKey(userId1)) { - amountOwed = amount - owedByMap.get(userId2).get(userId1); + amountOwed = owedByMap.get(userId2).get(userId1) - amount; if (amountOwed > 0) { this.owedByMap.get(userId2).put(userId1, amountOwed); @@ -43,6 +43,8 @@ public boolean updateAmount(String userId1, String userId2, double amount) { this.owedByMap.get(userId2).remove(userId1); this.owesToMap.get(userId1).remove(userId2); + + amountOwed *= -1.0; } @@ -51,13 +53,23 @@ public boolean updateAmount(String userId1, String userId2, double amount) { this.owedByMap.put(userId1, new HashMap()); } - this.owedByMap.get(userId1).put(userId2, amountOwed); + if (!this.owedByMap.get(userId1).containsKey(userId2)) { + this.owedByMap.get(userId1).put(userId2, 0.0); + } + + this.owedByMap.get(userId1).put(userId2, this.owedByMap.get(userId1).get(userId2) + amountOwed); if (!owesToMap.containsKey(userId2)) { this.owesToMap.put(userId2, new HashMap()); } - this.owesToMap.get(userId2).put(userId1, amountOwed); + if (!this.owesToMap.get(userId2).containsKey(userId1)) { + this.owesToMap.get(userId2).put(userId1, 0.0); + } + + this.owesToMap.get(userId2).put(userId1, this.owesToMap.get(userId2).get(userId1) + amountOwed); + + return true; } @@ -86,7 +98,7 @@ public SplitResult getBalancesForUser(String userId) { */ @Override public SplitResult getBalancesForAllUsers() { - return new SplitResult(owedByMap, owedByMap, null, null); + return new SplitResult(owedByMap, null, null, null); } /** @@ -110,6 +122,8 @@ public boolean updateAmountForEntries(SplitResult splitResult) { } } +// System.out.println("DS " + this.owedByMap + " " + this.owesToMap); + return true; } diff --git a/SplitWiseImpl/src/com/factory/StrategyListFactory.java b/SplitWiseImpl/src/com/factory/StrategyListFactory.java index d8a3d371..6d210218 100644 --- a/SplitWiseImpl/src/com/factory/StrategyListFactory.java +++ b/SplitWiseImpl/src/com/factory/StrategyListFactory.java @@ -43,6 +43,7 @@ public StrategyListFactory() { * @return the strategy list */ @Override + public IStrategyList getStrategyList(List strategiesPresent) { Map result = new LinkedHashMap(); diff --git a/SplitWiseImpl/src/com/interfaces/IApplication.java b/SplitWiseImpl/src/com/interfaces/IApplication.java index ad833397..7b3b084f 100644 --- a/SplitWiseImpl/src/com/interfaces/IApplication.java +++ b/SplitWiseImpl/src/com/interfaces/IApplication.java @@ -3,6 +3,7 @@ import java.util.List; import com.enums.SplitStrategyType; +import com.strategies.interfaces.ISplitInput; import com.strategies.splitObjects.SplitResult; // TODO: Auto-generated Javadoc @@ -17,7 +18,7 @@ public interface IApplication { * @param expenseInput the expense input * @return true, if successful */ - boolean addExpense(List expenseInput); + boolean addExpense(ISplitInput splitInput); /** * Gets the balance for user. diff --git a/SplitWiseImpl/src/com/interfaces/IApplicationInterface.java b/SplitWiseImpl/src/com/interfaces/IApplicationInterface.java index 88c25165..cb8ff1a2 100644 --- a/SplitWiseImpl/src/com/interfaces/IApplicationInterface.java +++ b/SplitWiseImpl/src/com/interfaces/IApplicationInterface.java @@ -2,8 +2,12 @@ import java.util.List; +import com.user.UserDetails; + public interface IApplicationInterface { void instantiateApplication(); List runInputString(String input); + + boolean addNewUser(UserDetails userDetails); } diff --git a/SplitWiseImpl/src/com/ioParser/ResultFormatter.java b/SplitWiseImpl/src/com/ioParser/ResultFormatter.java index 6da78bdd..fe7ebf5d 100644 --- a/SplitWiseImpl/src/com/ioParser/ResultFormatter.java +++ b/SplitWiseImpl/src/com/ioParser/ResultFormatter.java @@ -1,15 +1,85 @@ package com.ioParser; +import java.util.ArrayList; +import java.util.Iterator; import java.util.List; +import com.dataStore.interfaces.IUserDataStore; import com.ioParser.interfaces.IResultFormatter; import com.strategies.splitObjects.SplitResult; public class ResultFormatter implements IResultFormatter{ + @Override - public List getFormattedResult(SplitResult splitResult) { - return null; + public List getFormattedResult(SplitResult splitResult, IUserDataStore userDataStore) { + List result = new ArrayList(); + + if (splitResult.getOwedBy() != null) { + Iterator it = splitResult.getOwedBy().keySet().iterator(); + + while (it.hasNext()) { + String next = it.next(); + + if (splitResult.getOwedBy().get(next) == null) { + continue; + } + + Iterator it1 = splitResult.getOwedBy().get(next).keySet().iterator(); + + while (it1.hasNext()) { + String next1 = it1.next(); + + double amount = splitResult.getOwedBy().get(next).get(next1); + + StringBuilder sb = new StringBuilder(); + + sb.append(userDataStore.getUserDetails(next1).getName()); + sb.append(" owes to "); + + sb.append(userDataStore.getUserDetails(next).getName()); + sb.append(": " + amount); + + result.add(sb.toString()); + } + } + } + + if (splitResult.getOwedTo() != null) { + Iterator it = splitResult.getOwedTo().keySet().iterator(); + + while (it.hasNext()) { + String next = it.next(); + + if (splitResult.getOwedTo().get(next) == null) { + continue; + } + + Iterator it1 = splitResult.getOwedTo().get(next).keySet().iterator(); + + while (it1.hasNext()) { + String next1 = it1.next(); + + double amount = splitResult.getOwedTo().get(next).get(next1); + + StringBuilder sb = new StringBuilder(); + + sb.append(userDataStore.getUserDetails(next).getName()); + sb.append(" owes to "); + + sb.append(userDataStore.getUserDetails(next1).getName()); + sb.append(": " + amount); + + result.add(sb.toString()); + } + } + } + + if (result.size() == 0) { + result.add("No Expenses"); + } + + return result; } diff --git a/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java b/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java index 1616bbbf..e46c35fb 100644 --- a/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java +++ b/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java @@ -2,6 +2,7 @@ import java.util.List; +import com.dataStore.interfaces.IUserDataStore; import com.strategies.splitObjects.SplitResult; // TODO: Auto-generated Javadoc @@ -16,5 +17,5 @@ public interface IResultFormatter { * @param splitResult the split result * @return the formatted result */ - List getFormattedResult(SplitResult splitResult); + List getFormattedResult(SplitResult splitResult, IUserDataStore userDataStore); } diff --git a/SplitWiseImpl/src/com/main/Main.java b/SplitWiseImpl/src/com/main/Main.java new file mode 100644 index 00000000..8d190728 --- /dev/null +++ b/SplitWiseImpl/src/com/main/Main.java @@ -0,0 +1,52 @@ +package com.main; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; + +import com.application.ApplicationInterface; +import com.factory.DataStoreFactory; +import com.factory.StrategyListFactory; +import com.interfaces.IApplicationInterface; +import com.ioParser.InputReader; +import com.ioParser.ResultFormatter; +import com.user.UserDetails; + +public class Main { + + public static void main(String[] args) { + IApplicationInterface applicationInterface = new ApplicationInterface(new DataStoreFactory(), new StrategyListFactory(), new ResultFormatter(), new InputReader()); + + + applicationInterface.addNewUser(new UserDetails("u1", "user 1", "user1@gmail.com", "11111")); + applicationInterface.addNewUser(new UserDetails("u2", "user 2", "user2@gmail.com", "22222")); + applicationInterface.addNewUser(new UserDetails("u3", "user 3", "user3@gmail.com", "33333")); + applicationInterface.addNewUser(new UserDetails("u4", "user 4", "user4@gmail.com", "44444")); + + applicationInterface.instantiateApplication(); + List result = new ArrayList(); + Iterator it = Arrays.asList("SHOW", "SHOW u1", "EXPENSE u1 1000 4 u1 u2 u3 u4 EQUAL", "SHOW u4", "SHOW u1", "EXPENSE u1 1250 2 u2 u3 EXACT 370 880", "SHOW", "EXPENSE u4 1200 4 u1 u2 u3 u4 PERCENT 40 20 20 20", "SHOW u1", "SHOW").listIterator(); + + while (it.hasNext()) { + String next = it.next(); + +// System.out.println(next); + + result.addAll(applicationInterface.runInputString(next)); + + // System.out.println( applicationInterface.runInputString(next)); + +// result.add("-----------------"); + + } + + // System.out.println(result); + + result.stream().forEach(s -> { + System.out.println(s); + }); + + } + +} diff --git a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java index 913eece1..7cf0a3d5 100644 --- a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java +++ b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java @@ -86,7 +86,7 @@ public SplitResult getFinalSplit(ISplitInput splitInput) { } - owedToMap.get(next).put(input.getPaidBy(), input.getPercentOwedMap().get(next)); + owedToMap.get(next).put(input.getPaidBy(), amountOwed); owesMap.put(next, amountOwed); From e7a3dd0ee12f9314131590788bd6269ed5af97e0 Mon Sep 17 00:00:00 2001 From: Anant Akash Date: Thu, 3 Apr 2025 18:26:36 +0530 Subject: [PATCH 07/19] Adding new changes --- .../com/application/ApplicationInterface.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/SplitWiseImpl/src/com/application/ApplicationInterface.java b/SplitWiseImpl/src/com/application/ApplicationInterface.java index 62d3acc7..f47cc30a 100644 --- a/SplitWiseImpl/src/com/application/ApplicationInterface.java +++ b/SplitWiseImpl/src/com/application/ApplicationInterface.java @@ -15,19 +15,37 @@ import com.strategies.splitObjects.SplitResult; import com.user.UserDetails; +// TODO: Auto-generated Javadoc +/** + * The Class ApplicationInterface. + */ public class ApplicationInterface implements IApplicationInterface { + /** The application. */ private IApplication application; + /** The data store factory. */ private IDataStoreFactory dataStoreFactory; + /** The strategy list factory. */ private IStrategyListFactory strategyListFactory; + /** The result formatter. */ private IResultFormatter resultFormatter; + + /** The input reader. */ private IInputReader inputReader; + /** + * Instantiates a new application interface. + * + * @param dataStoreFactory the data store factory + * @param strategyListFactory the strategy list factory + * @param resultFormatter the result formatter + * @param inputReader the input reader + */ public ApplicationInterface(IDataStoreFactory dataStoreFactory, IStrategyListFactory strategyListFactory, IResultFormatter resultFormatter, IInputReader inputReader) { super(); @@ -37,12 +55,21 @@ public ApplicationInterface(IDataStoreFactory dataStoreFactory, IStrategyListFac this.inputReader = inputReader; } + /** + * Instantiate application. + */ @Override public void instantiateApplication() { this.application = new Application(dataStoreFactory, strategyListFactory, Arrays.asList((String) SplitStrategyType.EQUAL.name(),(String) SplitStrategyType.EXACT.name(), (String)SplitStrategyType.PERCENT.name())); } + /** + * Run input string. + * + * @param input the input + * @return the list + */ @Override public List runInputString(String input) { String[] inputArr = input.split(" "); @@ -81,6 +108,12 @@ public List runInputString(String input) { } + /** + * Adds the new user. + * + * @param userDetails the user details + * @return true, if successful + */ @Override public boolean addNewUser(UserDetails userDetails) { return this.dataStoreFactory.getUserDataStore().addNewUser(userDetails); From dc968b23c0b834de9d759b588926779c74365a5c Mon Sep 17 00:00:00 2001 From: Anant Akash Date: Sat, 5 Apr 2025 23:00:47 +0530 Subject: [PATCH 08/19] Adding JAR Files --- SplitWiseImpl/Jar_File/SplitWise.jar | Bin 0 -> 39699 bytes SplitWiseImpl/Jar_File/Splitwise.sh | 1 + .../src/com/main/CommandLineMain.java | 37 ++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 SplitWiseImpl/Jar_File/SplitWise.jar create mode 100644 SplitWiseImpl/Jar_File/Splitwise.sh create mode 100644 SplitWiseImpl/src/com/main/CommandLineMain.java diff --git a/SplitWiseImpl/Jar_File/SplitWise.jar b/SplitWiseImpl/Jar_File/SplitWise.jar new file mode 100644 index 0000000000000000000000000000000000000000..187008eafb775c18168bec97b3bb04f27beb7171 GIT binary patch literal 39699 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 KKRe*&xBmxk&1)V2 literal 0 HcmV?d00001 diff --git a/SplitWiseImpl/Jar_File/Splitwise.sh b/SplitWiseImpl/Jar_File/Splitwise.sh new file mode 100644 index 00000000..c6ff1acc --- /dev/null +++ b/SplitWiseImpl/Jar_File/Splitwise.sh @@ -0,0 +1 @@ +java -cp Splitwise.jar com.main.CommandLineMain diff --git a/SplitWiseImpl/src/com/main/CommandLineMain.java b/SplitWiseImpl/src/com/main/CommandLineMain.java new file mode 100644 index 00000000..4445b6d2 --- /dev/null +++ b/SplitWiseImpl/src/com/main/CommandLineMain.java @@ -0,0 +1,37 @@ +package com.main; + +import java.util.Scanner; + +import com.application.ApplicationInterface; +import com.factory.DataStoreFactory; +import com.factory.StrategyListFactory; +import com.interfaces.IApplicationInterface; +import com.ioParser.InputReader; +import com.ioParser.ResultFormatter; +import com.user.UserDetails; + +public class CommandLineMain { + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + + IApplicationInterface applicationInterface = new ApplicationInterface(new DataStoreFactory(), new StrategyListFactory(), new ResultFormatter(), new InputReader()); + applicationInterface.addNewUser(new UserDetails("u1", "user 1", "user1@gmail.com", "11111")); + applicationInterface.addNewUser(new UserDetails("u2", "user 2", "user2@gmail.com", "22222")); + applicationInterface.addNewUser(new UserDetails("u3", "user 3", "user3@gmail.com", "33333")); + applicationInterface.addNewUser(new UserDetails("u4", "user 4", "user4@gmail.com", "44444")); + + applicationInterface.instantiateApplication(); + while (true) { + String next = sc.nextLine(); + if (next.equals("")) { + break; + } + applicationInterface.runInputString(next).stream().forEach(s -> { + System.out.println(s); + }); + } + + } + +} From b10a2ff8bfe3831fc8fd316e9063f8c04445f370 Mon Sep 17 00:00:00 2001 From: Anant Akash Date: Mon, 7 Apr 2025 12:09:55 +0530 Subject: [PATCH 09/19] Revert "Adding new changes" This reverts commit e7a3dd0ee12f9314131590788bd6269ed5af97e0. --- .../com/application/ApplicationInterface.java | 33 ------------------- 1 file changed, 33 deletions(-) diff --git a/SplitWiseImpl/src/com/application/ApplicationInterface.java b/SplitWiseImpl/src/com/application/ApplicationInterface.java index f47cc30a..62d3acc7 100644 --- a/SplitWiseImpl/src/com/application/ApplicationInterface.java +++ b/SplitWiseImpl/src/com/application/ApplicationInterface.java @@ -15,37 +15,19 @@ import com.strategies.splitObjects.SplitResult; import com.user.UserDetails; -// TODO: Auto-generated Javadoc -/** - * The Class ApplicationInterface. - */ public class ApplicationInterface implements IApplicationInterface { - /** The application. */ private IApplication application; - /** The data store factory. */ private IDataStoreFactory dataStoreFactory; - /** The strategy list factory. */ private IStrategyListFactory strategyListFactory; - /** The result formatter. */ private IResultFormatter resultFormatter; - - /** The input reader. */ private IInputReader inputReader; - /** - * Instantiates a new application interface. - * - * @param dataStoreFactory the data store factory - * @param strategyListFactory the strategy list factory - * @param resultFormatter the result formatter - * @param inputReader the input reader - */ public ApplicationInterface(IDataStoreFactory dataStoreFactory, IStrategyListFactory strategyListFactory, IResultFormatter resultFormatter, IInputReader inputReader) { super(); @@ -55,21 +37,12 @@ public ApplicationInterface(IDataStoreFactory dataStoreFactory, IStrategyListFac this.inputReader = inputReader; } - /** - * Instantiate application. - */ @Override public void instantiateApplication() { this.application = new Application(dataStoreFactory, strategyListFactory, Arrays.asList((String) SplitStrategyType.EQUAL.name(),(String) SplitStrategyType.EXACT.name(), (String)SplitStrategyType.PERCENT.name())); } - /** - * Run input string. - * - * @param input the input - * @return the list - */ @Override public List runInputString(String input) { String[] inputArr = input.split(" "); @@ -108,12 +81,6 @@ public List runInputString(String input) { } - /** - * Adds the new user. - * - * @param userDetails the user details - * @return true, if successful - */ @Override public boolean addNewUser(UserDetails userDetails) { return this.dataStoreFactory.getUserDataStore().addNewUser(userDetails); From d3e02dcb67f00e84cf1f437ebf3660e8ea6f8597 Mon Sep 17 00:00:00 2001 From: Anant Akash Date: Mon, 7 Apr 2025 12:10:06 +0530 Subject: [PATCH 10/19] Revert "Adding new changes" This reverts commit 3bfb8fdbba38c11f7f44862260c5338ddff6f8e6. --- .../src/com/application/Application.java | 14 ++-- .../com/application/ApplicationInterface.java | 31 ++------ .../UserPairOwedAmountDataStore.java | 22 +----- .../src/com/factory/StrategyListFactory.java | 1 - .../src/com/interfaces/IApplication.java | 3 +- .../com/interfaces/IApplicationInterface.java | 4 - .../src/com/ioParser/ResultFormatter.java | 74 +------------------ .../ioParser/interfaces/IResultFormatter.java | 3 +- SplitWiseImpl/src/com/main/Main.java | 52 ------------- .../PercentDivisionSplitStrategy.java | 2 +- 10 files changed, 25 insertions(+), 181 deletions(-) delete mode 100644 SplitWiseImpl/src/com/main/Main.java diff --git a/SplitWiseImpl/src/com/application/Application.java b/SplitWiseImpl/src/com/application/Application.java index 30ab147a..3c661412 100644 --- a/SplitWiseImpl/src/com/application/Application.java +++ b/SplitWiseImpl/src/com/application/Application.java @@ -9,6 +9,7 @@ import com.factory.interfaces.IStrategyListFactory; import com.interfaces.IApplication; import com.interfaces.IStrategyList; +import com.ioParser.interfaces.IInputReader; import com.strategies.interfaces.ISplitInput; import com.strategies.splitObjects.SplitResult; @@ -23,6 +24,8 @@ public class Application implements IApplication { /** The strategy list. */ private IStrategyList strategyList; + /** The input reader. */ + private IInputReader inputReader; @@ -34,11 +37,13 @@ public class Application implements IApplication { * @param strategiesPresnt the strategies presnt * @param inputReader the input reader */ - Application(IDataStoreFactory dataStoreFactory, IStrategyListFactory strategyListFactory, List strategiesPresnt) { + Application(IDataStoreFactory dataStoreFactory, IStrategyListFactory strategyListFactory, List strategiesPresnt, IInputReader inputReader) { this.userPairOwedAmountDataStore = dataStoreFactory.getUserPairOwedAmountDataStore(); this.strategyList = strategyListFactory.getStrategyList(strategiesPresnt); + + this.inputReader = inputReader; } /** @@ -51,7 +56,8 @@ public class Application implements IApplication { /** * */ - public boolean addExpense(ISplitInput splitInput) { + public boolean addExpense(List expenseInput) { + ISplitInput splitInput = this.inputReader.parseInput(expenseInput); if (splitInput == null) { return false; @@ -59,8 +65,6 @@ public boolean addExpense(ISplitInput splitInput) { SplitResult splitResult = this.strategyList.getSplitStrategies().get(splitInput.getSplitInputType()).getFinalSplit(splitInput); - // System.out.println("result " + splitResult.getOwedBy() + " " + splitResult.getOwedTo()); - return this.userPairOwedAmountDataStore.updateAmountForEntries(splitResult); } @@ -74,7 +78,7 @@ public boolean addExpense(ISplitInput splitInput) { @Override public SplitResult getBalanceForUser(String userId) { - return this.userPairOwedAmountDataStore.getBalancesForUser(userId); + return this.getBalanceForUser(userId); } /** diff --git a/SplitWiseImpl/src/com/application/ApplicationInterface.java b/SplitWiseImpl/src/com/application/ApplicationInterface.java index 62d3acc7..8b3961c9 100644 --- a/SplitWiseImpl/src/com/application/ApplicationInterface.java +++ b/SplitWiseImpl/src/com/application/ApplicationInterface.java @@ -4,8 +4,8 @@ import java.util.Arrays; import java.util.List; +import com.dataStore.interfaces.IUserDataStore; import com.enums.InputCommand; -import com.enums.SplitStrategyType; import com.factory.interfaces.IDataStoreFactory; import com.factory.interfaces.IStrategyListFactory; import com.interfaces.IApplication; @@ -13,12 +13,12 @@ import com.ioParser.interfaces.IInputReader; import com.ioParser.interfaces.IResultFormatter; import com.strategies.splitObjects.SplitResult; -import com.user.UserDetails; public class ApplicationInterface implements IApplicationInterface { private IApplication application; + private IUserDataStore userDataStore; private IDataStoreFactory dataStoreFactory; @@ -26,21 +26,11 @@ public class ApplicationInterface implements IApplicationInterface { private IResultFormatter resultFormatter; private IInputReader inputReader; - - - public ApplicationInterface(IDataStoreFactory dataStoreFactory, IStrategyListFactory strategyListFactory, - IResultFormatter resultFormatter, IInputReader inputReader) { - super(); - this.dataStoreFactory = dataStoreFactory; - this.strategyListFactory = strategyListFactory; - this.resultFormatter = resultFormatter; - this.inputReader = inputReader; - } - @Override public void instantiateApplication() { - this.application = new Application(dataStoreFactory, strategyListFactory, Arrays.asList((String) SplitStrategyType.EQUAL.name(),(String) SplitStrategyType.EXACT.name(), (String)SplitStrategyType.PERCENT.name())); + this.application = new Application(dataStoreFactory, strategyListFactory, null, inputReader); + this.userDataStore = this.dataStoreFactory.getUserDataStore(); } @Override @@ -58,9 +48,9 @@ public List runInputString(String input) { } if (InputCommand.EXPENSE == InputCommand.valueOf(inputArr[0])) { - this.application.addExpense(this.inputReader.parseInput(inputList)); + this.application.addExpense(inputList); - return Arrays.asList(); + return Arrays.asList("No Expenses"); } if (InputCommand.SHOW == InputCommand.valueOf(inputArr[0])) { @@ -71,20 +61,13 @@ public List runInputString(String input) { splitResult = this.application.getBalanceForUser(inputList.get(0)); } -// System.out.println("result" + splitResult.getOwedBy() + " " + splitResult.getOwedTo()); - - return this.resultFormatter.getFormattedResult(splitResult, this.dataStoreFactory.getUserDataStore()); + return this.resultFormatter.getFormattedResult(splitResult); } return new ArrayList(); } - - @Override - public boolean addNewUser(UserDetails userDetails) { - return this.dataStoreFactory.getUserDataStore().addNewUser(userDetails); - } diff --git a/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java b/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java index 2bf79393..2025855b 100644 --- a/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java +++ b/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java @@ -31,7 +31,7 @@ public class UserPairOwedAmountDataStore implements IUserPairOwedAmountDataStore public boolean updateAmount(String userId1, String userId2, double amount) { double amountOwed = amount; if (this.owedByMap.containsKey(userId2) && this.owedByMap.get(userId2).containsKey(userId1)) { - amountOwed = owedByMap.get(userId2).get(userId1) - amount; + amountOwed = amount - owedByMap.get(userId2).get(userId1); if (amountOwed > 0) { this.owedByMap.get(userId2).put(userId1, amountOwed); @@ -43,8 +43,6 @@ public boolean updateAmount(String userId1, String userId2, double amount) { this.owedByMap.get(userId2).remove(userId1); this.owesToMap.get(userId1).remove(userId2); - - amountOwed *= -1.0; } @@ -53,23 +51,13 @@ public boolean updateAmount(String userId1, String userId2, double amount) { this.owedByMap.put(userId1, new HashMap()); } - if (!this.owedByMap.get(userId1).containsKey(userId2)) { - this.owedByMap.get(userId1).put(userId2, 0.0); - } - - this.owedByMap.get(userId1).put(userId2, this.owedByMap.get(userId1).get(userId2) + amountOwed); + this.owedByMap.get(userId1).put(userId2, amountOwed); if (!owesToMap.containsKey(userId2)) { this.owesToMap.put(userId2, new HashMap()); } - if (!this.owesToMap.get(userId2).containsKey(userId1)) { - this.owesToMap.get(userId2).put(userId1, 0.0); - } - - this.owesToMap.get(userId2).put(userId1, this.owesToMap.get(userId2).get(userId1) + amountOwed); - - + this.owesToMap.get(userId2).put(userId1, amountOwed); return true; } @@ -98,7 +86,7 @@ public SplitResult getBalancesForUser(String userId) { */ @Override public SplitResult getBalancesForAllUsers() { - return new SplitResult(owedByMap, null, null, null); + return new SplitResult(owedByMap, owedByMap, null, null); } /** @@ -122,8 +110,6 @@ public boolean updateAmountForEntries(SplitResult splitResult) { } } -// System.out.println("DS " + this.owedByMap + " " + this.owesToMap); - return true; } diff --git a/SplitWiseImpl/src/com/factory/StrategyListFactory.java b/SplitWiseImpl/src/com/factory/StrategyListFactory.java index 6d210218..d8a3d371 100644 --- a/SplitWiseImpl/src/com/factory/StrategyListFactory.java +++ b/SplitWiseImpl/src/com/factory/StrategyListFactory.java @@ -43,7 +43,6 @@ public StrategyListFactory() { * @return the strategy list */ @Override - public IStrategyList getStrategyList(List strategiesPresent) { Map result = new LinkedHashMap(); diff --git a/SplitWiseImpl/src/com/interfaces/IApplication.java b/SplitWiseImpl/src/com/interfaces/IApplication.java index 7b3b084f..ad833397 100644 --- a/SplitWiseImpl/src/com/interfaces/IApplication.java +++ b/SplitWiseImpl/src/com/interfaces/IApplication.java @@ -3,7 +3,6 @@ import java.util.List; import com.enums.SplitStrategyType; -import com.strategies.interfaces.ISplitInput; import com.strategies.splitObjects.SplitResult; // TODO: Auto-generated Javadoc @@ -18,7 +17,7 @@ public interface IApplication { * @param expenseInput the expense input * @return true, if successful */ - boolean addExpense(ISplitInput splitInput); + boolean addExpense(List expenseInput); /** * Gets the balance for user. diff --git a/SplitWiseImpl/src/com/interfaces/IApplicationInterface.java b/SplitWiseImpl/src/com/interfaces/IApplicationInterface.java index cb8ff1a2..88c25165 100644 --- a/SplitWiseImpl/src/com/interfaces/IApplicationInterface.java +++ b/SplitWiseImpl/src/com/interfaces/IApplicationInterface.java @@ -2,12 +2,8 @@ import java.util.List; -import com.user.UserDetails; - public interface IApplicationInterface { void instantiateApplication(); List runInputString(String input); - - boolean addNewUser(UserDetails userDetails); } diff --git a/SplitWiseImpl/src/com/ioParser/ResultFormatter.java b/SplitWiseImpl/src/com/ioParser/ResultFormatter.java index fe7ebf5d..6da78bdd 100644 --- a/SplitWiseImpl/src/com/ioParser/ResultFormatter.java +++ b/SplitWiseImpl/src/com/ioParser/ResultFormatter.java @@ -1,85 +1,15 @@ package com.ioParser; -import java.util.ArrayList; -import java.util.Iterator; import java.util.List; -import com.dataStore.interfaces.IUserDataStore; import com.ioParser.interfaces.IResultFormatter; import com.strategies.splitObjects.SplitResult; public class ResultFormatter implements IResultFormatter{ - @Override - public List getFormattedResult(SplitResult splitResult, IUserDataStore userDataStore) { - List result = new ArrayList(); - - if (splitResult.getOwedBy() != null) { - Iterator it = splitResult.getOwedBy().keySet().iterator(); - - while (it.hasNext()) { - String next = it.next(); - - if (splitResult.getOwedBy().get(next) == null) { - continue; - } - - Iterator it1 = splitResult.getOwedBy().get(next).keySet().iterator(); - - while (it1.hasNext()) { - String next1 = it1.next(); - - double amount = splitResult.getOwedBy().get(next).get(next1); - - StringBuilder sb = new StringBuilder(); - - sb.append(userDataStore.getUserDetails(next1).getName()); - sb.append(" owes to "); - - sb.append(userDataStore.getUserDetails(next).getName()); - sb.append(": " + amount); - - result.add(sb.toString()); - } - } - } - - if (splitResult.getOwedTo() != null) { - Iterator it = splitResult.getOwedTo().keySet().iterator(); - - while (it.hasNext()) { - String next = it.next(); - - if (splitResult.getOwedTo().get(next) == null) { - continue; - } - - Iterator it1 = splitResult.getOwedTo().get(next).keySet().iterator(); - - while (it1.hasNext()) { - String next1 = it1.next(); - - double amount = splitResult.getOwedTo().get(next).get(next1); - - StringBuilder sb = new StringBuilder(); - - sb.append(userDataStore.getUserDetails(next).getName()); - sb.append(" owes to "); - - sb.append(userDataStore.getUserDetails(next1).getName()); - sb.append(": " + amount); - - result.add(sb.toString()); - } - } - } - - if (result.size() == 0) { - result.add("No Expenses"); - } - - return result; + public List getFormattedResult(SplitResult splitResult) { + return null; } diff --git a/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java b/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java index e46c35fb..1616bbbf 100644 --- a/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java +++ b/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java @@ -2,7 +2,6 @@ import java.util.List; -import com.dataStore.interfaces.IUserDataStore; import com.strategies.splitObjects.SplitResult; // TODO: Auto-generated Javadoc @@ -17,5 +16,5 @@ public interface IResultFormatter { * @param splitResult the split result * @return the formatted result */ - List getFormattedResult(SplitResult splitResult, IUserDataStore userDataStore); + List getFormattedResult(SplitResult splitResult); } diff --git a/SplitWiseImpl/src/com/main/Main.java b/SplitWiseImpl/src/com/main/Main.java deleted file mode 100644 index 8d190728..00000000 --- a/SplitWiseImpl/src/com/main/Main.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.main; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; - -import com.application.ApplicationInterface; -import com.factory.DataStoreFactory; -import com.factory.StrategyListFactory; -import com.interfaces.IApplicationInterface; -import com.ioParser.InputReader; -import com.ioParser.ResultFormatter; -import com.user.UserDetails; - -public class Main { - - public static void main(String[] args) { - IApplicationInterface applicationInterface = new ApplicationInterface(new DataStoreFactory(), new StrategyListFactory(), new ResultFormatter(), new InputReader()); - - - applicationInterface.addNewUser(new UserDetails("u1", "user 1", "user1@gmail.com", "11111")); - applicationInterface.addNewUser(new UserDetails("u2", "user 2", "user2@gmail.com", "22222")); - applicationInterface.addNewUser(new UserDetails("u3", "user 3", "user3@gmail.com", "33333")); - applicationInterface.addNewUser(new UserDetails("u4", "user 4", "user4@gmail.com", "44444")); - - applicationInterface.instantiateApplication(); - List result = new ArrayList(); - Iterator it = Arrays.asList("SHOW", "SHOW u1", "EXPENSE u1 1000 4 u1 u2 u3 u4 EQUAL", "SHOW u4", "SHOW u1", "EXPENSE u1 1250 2 u2 u3 EXACT 370 880", "SHOW", "EXPENSE u4 1200 4 u1 u2 u3 u4 PERCENT 40 20 20 20", "SHOW u1", "SHOW").listIterator(); - - while (it.hasNext()) { - String next = it.next(); - -// System.out.println(next); - - result.addAll(applicationInterface.runInputString(next)); - - // System.out.println( applicationInterface.runInputString(next)); - -// result.add("-----------------"); - - } - - // System.out.println(result); - - result.stream().forEach(s -> { - System.out.println(s); - }); - - } - -} diff --git a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java index 7cf0a3d5..913eece1 100644 --- a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java +++ b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java @@ -86,7 +86,7 @@ public SplitResult getFinalSplit(ISplitInput splitInput) { } - owedToMap.get(next).put(input.getPaidBy(), amountOwed); + owedToMap.get(next).put(input.getPaidBy(), input.getPercentOwedMap().get(next)); owesMap.put(next, amountOwed); From 22e1624ba38a7d7b1130a2c3596679aa8d809ba8 Mon Sep 17 00:00:00 2001 From: Anant Akash Date: Mon, 7 Apr 2025 12:10:12 +0530 Subject: [PATCH 11/19] Revert "Adding new changes" This reverts commit 76dc795fb353d58f268c26f765129f5eb1f79eef. --- .../com/application/ApplicationInterface.java | 74 ------------------- SplitWiseImpl/src/com/enums/InputCommand.java | 6 -- .../com/interfaces/IApplicationInterface.java | 9 --- SplitWiseImpl/src/com/user/User.java | 46 ------------ .../src/com/user/interfaces/IUser.java | 4 +- 5 files changed, 2 insertions(+), 137 deletions(-) delete mode 100644 SplitWiseImpl/src/com/application/ApplicationInterface.java delete mode 100644 SplitWiseImpl/src/com/enums/InputCommand.java delete mode 100644 SplitWiseImpl/src/com/interfaces/IApplicationInterface.java delete mode 100644 SplitWiseImpl/src/com/user/User.java diff --git a/SplitWiseImpl/src/com/application/ApplicationInterface.java b/SplitWiseImpl/src/com/application/ApplicationInterface.java deleted file mode 100644 index 8b3961c9..00000000 --- a/SplitWiseImpl/src/com/application/ApplicationInterface.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.application; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import com.dataStore.interfaces.IUserDataStore; -import com.enums.InputCommand; -import com.factory.interfaces.IDataStoreFactory; -import com.factory.interfaces.IStrategyListFactory; -import com.interfaces.IApplication; -import com.interfaces.IApplicationInterface; -import com.ioParser.interfaces.IInputReader; -import com.ioParser.interfaces.IResultFormatter; -import com.strategies.splitObjects.SplitResult; - -public class ApplicationInterface implements IApplicationInterface { - - private IApplication application; - - private IUserDataStore userDataStore; - - private IDataStoreFactory dataStoreFactory; - - private IStrategyListFactory strategyListFactory; - - private IResultFormatter resultFormatter; - private IInputReader inputReader; - @Override - public void instantiateApplication() { - this.application = new Application(dataStoreFactory, strategyListFactory, null, inputReader); - - this.userDataStore = this.dataStoreFactory.getUserDataStore(); - } - - @Override - public List runInputString(String input) { - String[] inputArr = input.split(" "); - - List inputList = new ArrayList(); - - int i = 1; - - while (i < inputArr.length) { - inputList.add(inputArr[i]); - - i++; - } - - if (InputCommand.EXPENSE == InputCommand.valueOf(inputArr[0])) { - this.application.addExpense(inputList); - - return Arrays.asList("No Expenses"); - } - - if (InputCommand.SHOW == InputCommand.valueOf(inputArr[0])) { - SplitResult splitResult; - if (inputList.size() == 0) { - splitResult = this.application.getAllBalances(); - } else { - splitResult = this.application.getBalanceForUser(inputList.get(0)); - } - - return this.resultFormatter.getFormattedResult(splitResult); - - } - - return new ArrayList(); - - } - - - -} diff --git a/SplitWiseImpl/src/com/enums/InputCommand.java b/SplitWiseImpl/src/com/enums/InputCommand.java deleted file mode 100644 index d58df98b..00000000 --- a/SplitWiseImpl/src/com/enums/InputCommand.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.enums; - -public enum InputCommand { - EXPENSE, - SHOW -} diff --git a/SplitWiseImpl/src/com/interfaces/IApplicationInterface.java b/SplitWiseImpl/src/com/interfaces/IApplicationInterface.java deleted file mode 100644 index 88c25165..00000000 --- a/SplitWiseImpl/src/com/interfaces/IApplicationInterface.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.interfaces; - -import java.util.List; - -public interface IApplicationInterface { - void instantiateApplication(); - - List runInputString(String input); -} diff --git a/SplitWiseImpl/src/com/user/User.java b/SplitWiseImpl/src/com/user/User.java deleted file mode 100644 index 1dcd9348..00000000 --- a/SplitWiseImpl/src/com/user/User.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.user; - -import com.dataStore.interfaces.IUserDataStore; -import com.user.interfaces.IUser; - -public class User implements IUser{ - private UserDetails userDetails; - - private String userId; - - private IUserDataStore userDataStore; - - - public User(String userId, IUserDataStore userDataStore) { - super(); - this.userId = userId; - this.userDataStore = userDataStore; - } - - @Override - public UserDetails getUserDetails() { - if (this.userDetails != null) { - return this.userDetails; - } - - this.userDetails = this.userDataStore.getUserDetails(this.userId); - - return this.userDetails; - } - - @Override - public boolean updateUserDetails(UserDetails userDetails) { - boolean result = this.userDataStore.updateUserDetails(this.userId, userDetails); - - if (!result) { - return false; - } - - this.userDetails = this.userDataStore.getUserDetails(this.userId); - - return true; - - } - - -} diff --git a/SplitWiseImpl/src/com/user/interfaces/IUser.java b/SplitWiseImpl/src/com/user/interfaces/IUser.java index 68232f54..cc7d1c8a 100644 --- a/SplitWiseImpl/src/com/user/interfaces/IUser.java +++ b/SplitWiseImpl/src/com/user/interfaces/IUser.java @@ -14,7 +14,7 @@ public interface IUser { * @param userId the user id * @return the user details */ - UserDetails getUserDetails(); + UserDetails getUserDetails(String userId); /** * Update user details. @@ -23,5 +23,5 @@ public interface IUser { * @param userDetails the user details * @return true, if successful */ - boolean updateUserDetails(UserDetails userDetails); + boolean updateUserDetails(String userId, UserDetails userDetails); } From e60a626f4a9ee609175ee3afc834389dbf76d642 Mon Sep 17 00:00:00 2001 From: Anant Akash Date: Mon, 7 Apr 2025 12:10:15 +0530 Subject: [PATCH 12/19] Revert "Add Javadocs" This reverts commit 43cae821f35f1d2be8ebe1b870b1d99f78f3dc80. --- .../src/com/application/Application.java | 40 ------------- .../src/com/dataStore/UserDataStore.java | 31 ---------- .../UserPairOwedAmountDataStore.java | 33 ----------- .../dataStore/interfaces/IUserDataStore.java | 29 ---------- .../IUserPairOwedAmountDataStore.java | 30 ---------- .../src/com/enums/InputValidationResult.java | 9 --- .../src/com/enums/SplitStrategyType.java | 10 ---- .../src/com/factory/DataStoreFactory.java | 18 ------ .../src/com/factory/StrategyListFactory.java | 14 ----- .../factory/interfaces/IDataStoreFactory.java | 15 ----- .../interfaces/IStrategyListFactory.java | 11 ---- .../src/com/interfaces/IApplication.java | 27 --------- .../src/com/interfaces/IStrategyList.java | 10 ---- .../src/com/ioParser/InputReader.java | 14 ----- .../src/com/ioParser/ResultFormatter.java | 13 +---- .../com/ioParser/interfaces/IInputReader.java | 11 ---- .../ioParser/interfaces/IResultFormatter.java | 11 ---- .../EqualDivisionSplitStrategy.java | 24 -------- .../EqualStrategyInutGenerator.java | 12 ---- .../EqualStrategySplitInput.java | 16 ------ .../ExactDivisionSplitStrategy.java | 21 ------- .../ExactStartegyInputGenerator.java | 13 ----- .../ExactStrategySplitInput.java | 23 -------- .../strategies/interfaces/ISplitInput.java | 10 ---- .../strategies/interfaces/ISplitStrategy.java | 24 -------- .../interfaces/IStrategyInputGenerator.java | 13 ----- .../PercentDivisionInputGenerator.java | 13 ----- .../PercentDivisionSplitInput.java | 24 -------- .../PercentDivisionSplitStrategy.java | 23 -------- .../strategies/splitObjects/SplitInput.java | 45 --------------- .../strategies/splitObjects/SplitResult.java | 34 ----------- .../splitObjects/StrategyInputGenerator.java | 12 ---- SplitWiseImpl/src/com/user/UserDetails.java | 57 ------------------- .../src/com/user/interfaces/IUser.java | 18 ------ 34 files changed, 1 insertion(+), 707 deletions(-) diff --git a/SplitWiseImpl/src/com/application/Application.java b/SplitWiseImpl/src/com/application/Application.java index 3c661412..2670030c 100644 --- a/SplitWiseImpl/src/com/application/Application.java +++ b/SplitWiseImpl/src/com/application/Application.java @@ -13,30 +13,16 @@ import com.strategies.interfaces.ISplitInput; import com.strategies.splitObjects.SplitResult; -/** - * The Class Application. - */ public class Application implements IApplication { - /** The user pair owed amount data store. */ private IUserPairOwedAmountDataStore userPairOwedAmountDataStore; - /** The strategy list. */ private IStrategyList strategyList; - /** The input reader. */ private IInputReader inputReader; - /** - * Instantiates a new application. - * - * @param dataStoreFactory the data store factory - * @param strategyListFactory the strategy list factory - * @param strategiesPresnt the strategies presnt - * @param inputReader the input reader - */ Application(IDataStoreFactory dataStoreFactory, IStrategyListFactory strategyListFactory, List strategiesPresnt, IInputReader inputReader) { this.userPairOwedAmountDataStore = dataStoreFactory.getUserPairOwedAmountDataStore(); @@ -46,16 +32,7 @@ public class Application implements IApplication { this.inputReader = inputReader; } - /** - * Adds the expense. - * - * @param expenseInput the expense input - * @return true, if successful - */ @Override - /** - * - */ public boolean addExpense(List expenseInput) { ISplitInput splitInput = this.inputReader.parseInput(expenseInput); @@ -68,35 +45,18 @@ public boolean addExpense(List expenseInput) { return this.userPairOwedAmountDataStore.updateAmountForEntries(splitResult); } - - /** - * Gets the balance for user. - * - * @param userId the user id - * @return the balance for user - */ @Override public SplitResult getBalanceForUser(String userId) { return this.getBalanceForUser(userId); } - /** - * Gets the all balances. - * - * @return the all balances - */ @Override public SplitResult getAllBalances() { // TODO Auto-generated method stub return this.userPairOwedAmountDataStore.getBalancesForAllUsers(); } - /** - * Gets the strategies name. - * - * @return the strategies name - */ @Override public List getStrategiesName() { return new ArrayList(this.strategyList.getSplitStrategies().keySet()); diff --git a/SplitWiseImpl/src/com/dataStore/UserDataStore.java b/SplitWiseImpl/src/com/dataStore/UserDataStore.java index 31aa14a6..3a820b8a 100644 --- a/SplitWiseImpl/src/com/dataStore/UserDataStore.java +++ b/SplitWiseImpl/src/com/dataStore/UserDataStore.java @@ -5,32 +5,14 @@ import com.dataStore.interfaces.IUserDataStore; import com.user.UserDetails; -/** - * The Class UserDataStore. - */ public class UserDataStore implements IUserDataStore { - - /** The user detail map. */ HashMap userDetailMap = new HashMap(); - - /** - * Gets the user details. - * - * @param userId the user id - * @return the user details - */ @Override public UserDetails getUserDetails(String userId) { // TODO Auto-generated method stub return this.userDetailMap.get(userId); } - /** - * Adds the new user. - * - * @param userDetails the user details - * @return true, if successful - */ @Override public boolean addNewUser(UserDetails userDetails) { if (userDetails != null && userDetails.getUserId() != null && !userDetails.getUserId().equals("")) { @@ -42,12 +24,6 @@ public boolean addNewUser(UserDetails userDetails) { return false; } - /** - * Delete user. - * - * @param userId the user id - * @return true, if successful - */ @Override public boolean deleteUser(String userId) { if (userId != null && !userId.equals("")) { @@ -58,13 +34,6 @@ public boolean deleteUser(String userId) { return false; } - /** - * Update user details. - * - * @param userId the user id - * @param userDetails the user details - * @return true, if successful - */ @Override public boolean updateUserDetails(String userId, UserDetails userDetails) { if (userId != null && !userId.equals("") && userDetails != null) { diff --git a/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java b/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java index 2025855b..5b9b9c2c 100644 --- a/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java +++ b/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java @@ -6,27 +6,11 @@ import com.dataStore.interfaces.IUserPairOwedAmountDataStore; import com.strategies.splitObjects.SplitResult; -// TODO: Auto-generated Javadoc -/** - * The Class UserPairOwedAmountDataStore. - */ public class UserPairOwedAmountDataStore implements IUserPairOwedAmountDataStore { - - /** The owed by map. */ private HashMap> owedByMap = new HashMap>(); - - /** The owes to map. */ private HashMap> owesToMap = new HashMap>(); - /** - * Update amount. - * - * @param userId1 the user id 1 - * @param userId2 the user id 2 - * @param amount the amount - * @return true, if successful - */ @Override public boolean updateAmount(String userId1, String userId2, double amount) { double amountOwed = amount; @@ -62,12 +46,6 @@ public boolean updateAmount(String userId1, String userId2, double amount) { return true; } - /** - * Gets the balances for user. - * - * @param userId the user id - * @return the balances for user - */ @Override public SplitResult getBalancesForUser(String userId) { SplitResult result = new SplitResult(); @@ -79,22 +57,11 @@ public SplitResult getBalancesForUser(String userId) { return result; } - /** - * Gets the balances for all users. - * - * @return the balances for all users - */ @Override public SplitResult getBalancesForAllUsers() { return new SplitResult(owedByMap, owedByMap, null, null); } - /** - * Update amount for entries. - * - * @param splitResult the split result - * @return true, if successful - */ @Override public boolean updateAmountForEntries(SplitResult splitResult) { Iterator it = splitResult.getOwedBy().keySet().iterator(); diff --git a/SplitWiseImpl/src/com/dataStore/interfaces/IUserDataStore.java b/SplitWiseImpl/src/com/dataStore/interfaces/IUserDataStore.java index 95e135d5..841b642b 100644 --- a/SplitWiseImpl/src/com/dataStore/interfaces/IUserDataStore.java +++ b/SplitWiseImpl/src/com/dataStore/interfaces/IUserDataStore.java @@ -2,41 +2,12 @@ import com.user.UserDetails; -/** - * The Interface IUserDataStore. - */ public interface IUserDataStore { - - /** - * Gets the user details. - * - * @param userId the user id - * @return the user details - */ UserDetails getUserDetails(String userId); - /** - * Adds the new user. - * - * @param userDetails the user details - * @return true, if successful - */ boolean addNewUser(UserDetails userDetails); - /** - * Delete user. - * - * @param userId the user id - * @return true, if successful - */ boolean deleteUser(String userId); - /** - * Update user details. - * - * @param userId the user id - * @param userDetails the user details - * @return true, if successful - */ boolean updateUserDetails(String userId, UserDetails userDetails); } diff --git a/SplitWiseImpl/src/com/dataStore/interfaces/IUserPairOwedAmountDataStore.java b/SplitWiseImpl/src/com/dataStore/interfaces/IUserPairOwedAmountDataStore.java index cf880e71..5ed1cfb4 100644 --- a/SplitWiseImpl/src/com/dataStore/interfaces/IUserPairOwedAmountDataStore.java +++ b/SplitWiseImpl/src/com/dataStore/interfaces/IUserPairOwedAmountDataStore.java @@ -2,42 +2,12 @@ import com.strategies.splitObjects.SplitResult; -// TODO: Auto-generated Javadoc -/** - * The Interface IUserPairOwedAmountDataStore. - */ public interface IUserPairOwedAmountDataStore { - - /** - * Update amount. - * - * @param userId1 the user id 1 - * @param userId2 the user id 2 - * @param amount the amount - * @return true, if successful - */ boolean updateAmount(String userId1, String userId2, double amount); - /** - * Gets the balances for user. - * - * @param userId the user id - * @return the balances for user - */ SplitResult getBalancesForUser(String userId); - /** - * Gets the balances for all users. - * - * @return the balances for all users - */ SplitResult getBalancesForAllUsers(); - /** - * Update amount for entries. - * - * @param splitResult the split result - * @return true, if successful - */ boolean updateAmountForEntries(SplitResult splitResult); } diff --git a/SplitWiseImpl/src/com/enums/InputValidationResult.java b/SplitWiseImpl/src/com/enums/InputValidationResult.java index cb5ba789..00e1d133 100644 --- a/SplitWiseImpl/src/com/enums/InputValidationResult.java +++ b/SplitWiseImpl/src/com/enums/InputValidationResult.java @@ -1,16 +1,7 @@ package com.enums; -/** - * The Enum InputValidationResult. - */ public enum InputValidationResult { - - /** The valid. */ VALID, - - /** The wrong input format. */ WRONG_INPUT_FORMAT, - - /** The sum not equal to total paid. */ SUM_NOT_EQUAL_TO_TOTAL_PAID } diff --git a/SplitWiseImpl/src/com/enums/SplitStrategyType.java b/SplitWiseImpl/src/com/enums/SplitStrategyType.java index 167fafc7..2792c3f4 100644 --- a/SplitWiseImpl/src/com/enums/SplitStrategyType.java +++ b/SplitWiseImpl/src/com/enums/SplitStrategyType.java @@ -1,17 +1,7 @@ package com.enums; -// TODO: Auto-generated Javadoc -/** - * The Enum SplitStrategyType. - */ public enum SplitStrategyType { - - /** The exact. */ EXACT, - - /** The equal. */ EQUAL, - - /** The percent. */ PERCENT } diff --git a/SplitWiseImpl/src/com/factory/DataStoreFactory.java b/SplitWiseImpl/src/com/factory/DataStoreFactory.java index fd4eed93..cca361b7 100644 --- a/SplitWiseImpl/src/com/factory/DataStoreFactory.java +++ b/SplitWiseImpl/src/com/factory/DataStoreFactory.java @@ -6,23 +6,10 @@ import com.dataStore.interfaces.IUserPairOwedAmountDataStore; import com.factory.interfaces.IDataStoreFactory; -// TODO: Auto-generated Javadoc -/** - * A factory for creating DataStore objects. - */ public class DataStoreFactory implements IDataStoreFactory { - - /** The user data store. */ private IUserDataStore userDataStore; - /** The user pair owed amount data store. */ private IUserPairOwedAmountDataStore userPairOwedAmountDataStore; - - /** - * Gets the user data store. - * - * @return the user data store - */ @Override public IUserDataStore getUserDataStore() { if (userDataStore == null) { @@ -31,11 +18,6 @@ public IUserDataStore getUserDataStore() { return this.userDataStore; } - /** - * Gets the user pair owed amount data store. - * - * @return the user pair owed amount data store - */ @Override public IUserPairOwedAmountDataStore getUserPairOwedAmountDataStore() { if (userPairOwedAmountDataStore == null) { diff --git a/SplitWiseImpl/src/com/factory/StrategyListFactory.java b/SplitWiseImpl/src/com/factory/StrategyListFactory.java index d8a3d371..b967bed9 100644 --- a/SplitWiseImpl/src/com/factory/StrategyListFactory.java +++ b/SplitWiseImpl/src/com/factory/StrategyListFactory.java @@ -14,15 +14,8 @@ import com.strategies.interfaces.ISplitStrategy; import com.strategies.percentDivisionStrategy.PercentDivisionSplitStrategy; -// TODO: Auto-generated Javadoc -/** - * A factory for creating StrategyList objects. - */ public class StrategyListFactory implements IStrategyListFactory { - /** - * Instantiates a new strategy list factory. - */ public StrategyListFactory() { this.strategyMap.put(SplitStrategyType.EXACT, new ExactDivisionSplitStrategy()); this.strategyMap.put(SplitStrategyType.EQUAL, new EqualDivisionSplitStrategy()); @@ -31,17 +24,10 @@ public StrategyListFactory() { - /** The strategy map. */ private HashMap strategyMap = new HashMap(); - /** - * Gets the strategy list. - * - * @param strategiesPresent the strategies present - * @return the strategy list - */ @Override public IStrategyList getStrategyList(List strategiesPresent) { Map result = new LinkedHashMap(); diff --git a/SplitWiseImpl/src/com/factory/interfaces/IDataStoreFactory.java b/SplitWiseImpl/src/com/factory/interfaces/IDataStoreFactory.java index c45880de..5a11a930 100644 --- a/SplitWiseImpl/src/com/factory/interfaces/IDataStoreFactory.java +++ b/SplitWiseImpl/src/com/factory/interfaces/IDataStoreFactory.java @@ -3,23 +3,8 @@ import com.dataStore.interfaces.IUserDataStore; import com.dataStore.interfaces.IUserPairOwedAmountDataStore; -// TODO: Auto-generated Javadoc -/** - * A factory for creating IDataStore objects. - */ public interface IDataStoreFactory { - - /** - * Gets the user data store. - * - * @return the user data store - */ IUserDataStore getUserDataStore(); - /** - * Gets the user pair owed amount data store. - * - * @return the user pair owed amount data store - */ IUserPairOwedAmountDataStore getUserPairOwedAmountDataStore(); } diff --git a/SplitWiseImpl/src/com/factory/interfaces/IStrategyListFactory.java b/SplitWiseImpl/src/com/factory/interfaces/IStrategyListFactory.java index 881ab263..3c348508 100644 --- a/SplitWiseImpl/src/com/factory/interfaces/IStrategyListFactory.java +++ b/SplitWiseImpl/src/com/factory/interfaces/IStrategyListFactory.java @@ -4,17 +4,6 @@ import com.interfaces.IStrategyList; -// TODO: Auto-generated Javadoc -/** - * A factory for creating IStrategyList objects. - */ public interface IStrategyListFactory { - - /** - * Gets the strategy list. - * - * @param strategiesPresent the strategies present - * @return the strategy list - */ IStrategyList getStrategyList(List strategiesPresent); } diff --git a/SplitWiseImpl/src/com/interfaces/IApplication.java b/SplitWiseImpl/src/com/interfaces/IApplication.java index ad833397..450f5ed2 100644 --- a/SplitWiseImpl/src/com/interfaces/IApplication.java +++ b/SplitWiseImpl/src/com/interfaces/IApplication.java @@ -5,39 +5,12 @@ import com.enums.SplitStrategyType; import com.strategies.splitObjects.SplitResult; -// TODO: Auto-generated Javadoc -/** - * The Interface IApplication. - */ public interface IApplication { - - /** - * Adds the expense. - * - * @param expenseInput the expense input - * @return true, if successful - */ boolean addExpense(List expenseInput); - /** - * Gets the balance for user. - * - * @param userId the user id - * @return the balance for user - */ SplitResult getBalanceForUser(String userId); - /** - * Gets the all balances. - * - * @return the all balances - */ SplitResult getAllBalances(); - /** - * Gets the strategies name. - * - * @return the strategies name - */ List getStrategiesName(); } diff --git a/SplitWiseImpl/src/com/interfaces/IStrategyList.java b/SplitWiseImpl/src/com/interfaces/IStrategyList.java index 1566f137..63732755 100644 --- a/SplitWiseImpl/src/com/interfaces/IStrategyList.java +++ b/SplitWiseImpl/src/com/interfaces/IStrategyList.java @@ -5,16 +5,6 @@ import com.enums.SplitStrategyType; import com.strategies.interfaces.ISplitStrategy; -// TODO: Auto-generated Javadoc -/** - * The Interface IStrategyList. - */ public interface IStrategyList { - - /** - * Gets the split strategies. - * - * @return the split strategies - */ Map getSplitStrategies(); } diff --git a/SplitWiseImpl/src/com/ioParser/InputReader.java b/SplitWiseImpl/src/com/ioParser/InputReader.java index 32977f24..ced2628e 100644 --- a/SplitWiseImpl/src/com/ioParser/InputReader.java +++ b/SplitWiseImpl/src/com/ioParser/InputReader.java @@ -13,19 +13,11 @@ import com.strategies.percentDivisionStrategy.PercentDivisionInputGenerator; import com.strategies.splitObjects.SplitInput; -// TODO: Auto-generated Javadoc -/** - * The Class InputReader. - */ public class InputReader implements IInputReader { - /** The strategy input generator map. */ HashMap strategyInputGeneratorMap; - /** - * Instantiates a new input reader. - */ public InputReader() { this.strategyInputGeneratorMap = new HashMap(); @@ -36,12 +28,6 @@ public InputReader() { this.strategyInputGeneratorMap.put(SplitStrategyType.PERCENT, new PercentDivisionInputGenerator()); } - /** - * Parses the input. - * - * @param input the input - * @return the i split input - */ @Override public ISplitInput parseInput(List input) { diff --git a/SplitWiseImpl/src/com/ioParser/ResultFormatter.java b/SplitWiseImpl/src/com/ioParser/ResultFormatter.java index 6da78bdd..a62392df 100644 --- a/SplitWiseImpl/src/com/ioParser/ResultFormatter.java +++ b/SplitWiseImpl/src/com/ioParser/ResultFormatter.java @@ -1,16 +1,5 @@ package com.ioParser; -import java.util.List; - -import com.ioParser.interfaces.IResultFormatter; -import com.strategies.splitObjects.SplitResult; - -public class ResultFormatter implements IResultFormatter{ - - @Override - public List getFormattedResult(SplitResult splitResult) { - return null; - - } +public class ResultFormatter { } diff --git a/SplitWiseImpl/src/com/ioParser/interfaces/IInputReader.java b/SplitWiseImpl/src/com/ioParser/interfaces/IInputReader.java index a3c06539..f42a53ed 100644 --- a/SplitWiseImpl/src/com/ioParser/interfaces/IInputReader.java +++ b/SplitWiseImpl/src/com/ioParser/interfaces/IInputReader.java @@ -4,17 +4,6 @@ import com.strategies.interfaces.ISplitInput; -// TODO: Auto-generated Javadoc -/** - * The Interface IInputReader. - */ public interface IInputReader { - - /** - * Parses the input. - * - * @param input the input - * @return the i split input - */ ISplitInput parseInput(List input); } diff --git a/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java b/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java index 1616bbbf..445f40d0 100644 --- a/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java +++ b/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java @@ -4,17 +4,6 @@ import com.strategies.splitObjects.SplitResult; -// TODO: Auto-generated Javadoc -/** - * The Interface IResultFormatter. - */ public interface IResultFormatter { - - /** - * Gets the formatted result. - * - * @param splitResult the split result - * @return the formatted result - */ List getFormattedResult(SplitResult splitResult); } diff --git a/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualDivisionSplitStrategy.java b/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualDivisionSplitStrategy.java index 8a4b36a9..7d1c52e8 100644 --- a/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualDivisionSplitStrategy.java +++ b/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualDivisionSplitStrategy.java @@ -9,26 +9,13 @@ import com.strategies.interfaces.ISplitStrategy; import com.strategies.splitObjects.SplitResult; -// TODO: Auto-generated Javadoc -/** - * The Class EqualDivisionSplitStrategy. - */ public class EqualDivisionSplitStrategy implements ISplitStrategy { - /** - * Instantiates a new equal division split strategy. - */ public EqualDivisionSplitStrategy() { // TODO Auto-generated constructor stub } - /** - * Gets the final split. - * - * @param splitInput the split input - * @return the final split - */ @Override public SplitResult getFinalSplit(ISplitInput splitInput) { @@ -78,12 +65,6 @@ public SplitResult getFinalSplit(ISplitInput splitInput) { } - /** - * Verify input. - * - * @param splitInput the split input - * @return the input validation result - */ @Override public InputValidationResult verifyInput(ISplitInput splitInput) { try { @@ -97,11 +78,6 @@ public InputValidationResult verifyInput(ISplitInput splitInput) { } } - /** - * Gets the spli strategy type. - * - * @return the spli strategy type - */ @Override public SplitStrategyType getSpliStrategyType() { // TODO Auto-generated method stub diff --git a/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategyInutGenerator.java b/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategyInutGenerator.java index 6674c7bf..f8a1ebf2 100644 --- a/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategyInutGenerator.java +++ b/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategyInutGenerator.java @@ -6,20 +6,8 @@ import com.strategies.splitObjects.SplitInput; import com.strategies.splitObjects.StrategyInputGenerator; -// TODO: Auto-generated Javadoc -/** - * The Class EqualStrategyInutGenerator. - */ public class EqualStrategyInutGenerator extends StrategyInputGenerator { - /** - * Generate split input. - * - * @param baseInput the base input - * @param input the input - * @param lastVisitedIndex the last visited index - * @return the equal strategy split input - */ @Override public EqualStrategySplitInput generateSplitInput(ISplitInput baseInput, List input, int lastVisitedIndex) { SplitInput baseInput2 = super.generateSplitInput(baseInput, input, lastVisitedIndex); diff --git a/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategySplitInput.java b/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategySplitInput.java index ddfe2086..e5718798 100644 --- a/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategySplitInput.java +++ b/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategySplitInput.java @@ -5,28 +5,12 @@ import com.enums.SplitStrategyType; import com.strategies.splitObjects.SplitInput; -// TODO: Auto-generated Javadoc -/** - * The Class EqualStrategySplitInput. - */ public class EqualStrategySplitInput extends SplitInput { - /** - * Instantiates a new equal strategy split input. - * - * @param paidBy the paid by - * @param participants the participants - * @param paidAmount the paid amount - */ public EqualStrategySplitInput(String paidBy, List participants, double paidAmount) { super(paidBy, participants, paidAmount); } - /** - * Gets the split input type. - * - * @return the split input type - */ @Override public SplitStrategyType getSplitInputType() { diff --git a/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactDivisionSplitStrategy.java b/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactDivisionSplitStrategy.java index a09a031b..17617c2a 100644 --- a/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactDivisionSplitStrategy.java +++ b/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactDivisionSplitStrategy.java @@ -9,18 +9,8 @@ import com.strategies.interfaces.ISplitStrategy; import com.strategies.splitObjects.SplitResult; -// TODO: Auto-generated Javadoc -/** - * The Class ExactDivisionSplitStrategy. - */ public class ExactDivisionSplitStrategy implements ISplitStrategy { - /** - * Verify input. - * - * @param splitInput the split input - * @return the input validation result - */ @Override public InputValidationResult verifyInput(ISplitInput splitInput) { ExactStrategySplitInput input; @@ -52,12 +42,6 @@ public InputValidationResult verifyInput(ISplitInput splitInput) { } } - /** - * Gets the final split. - * - * @param splitInput the split input - * @return the final split - */ @Override public SplitResult getFinalSplit(ISplitInput splitInput) { if (this.verifyInput(splitInput) != InputValidationResult.VALID) { @@ -102,11 +86,6 @@ public SplitResult getFinalSplit(ISplitInput splitInput) { return new SplitResult(owedByMap, owedToMap, owedMap, owesMap); } - /** - * Gets the spli strategy type. - * - * @return the spli strategy type - */ @Override public SplitStrategyType getSpliStrategyType() { // TODO Auto-generated method stub diff --git a/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStartegyInputGenerator.java b/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStartegyInputGenerator.java index 1594c959..7568f3d9 100644 --- a/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStartegyInputGenerator.java +++ b/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStartegyInputGenerator.java @@ -7,20 +7,7 @@ import com.strategies.splitObjects.SplitInput; import com.strategies.splitObjects.StrategyInputGenerator; -// TODO: Auto-generated Javadoc -/** - * The Class ExactStartegyInputGenerator. - */ public class ExactStartegyInputGenerator extends StrategyInputGenerator { - - /** - * Generate split input. - * - * @param baseInput the base input - * @param input the input - * @param lastVisitedIndex the last visited index - * @return the exact strategy split input - */ @Override public ExactStrategySplitInput generateSplitInput(ISplitInput baseInput, List input, int lastVisitedIndex) { SplitInput baseInput2 = super.generateSplitInput(baseInput, input, lastVisitedIndex); diff --git a/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStrategySplitInput.java b/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStrategySplitInput.java index 76aa142b..fa24ad75 100644 --- a/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStrategySplitInput.java +++ b/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStrategySplitInput.java @@ -6,43 +6,20 @@ import com.enums.SplitStrategyType; import com.strategies.splitObjects.SplitInput; -// TODO: Auto-generated Javadoc -/** - * The Class ExactStrategySplitInput. - */ public class ExactStrategySplitInput extends SplitInput { - /** The exact amount owed map. */ private HashMap exactAmountOwedMap; - /** - * Instantiates a new exact strategy split input. - * - * @param paidBy the paid by - * @param participants the participants - * @param paidAmount the paid amount - * @param exactAmountOwedMap the exact amount owed map - */ public ExactStrategySplitInput(String paidBy, List participants, double paidAmount, HashMap exactAmountOwedMap) { super(paidBy, participants, paidAmount); this.exactAmountOwedMap = exactAmountOwedMap; } - /** - * Gets the exact amount owed map. - * - * @return the exact amount owed map - */ public HashMap getExactAmountOwedMap() { return exactAmountOwedMap; } - /** - * Gets the split input type. - * - * @return the split input type - */ @Override public SplitStrategyType getSplitInputType() { diff --git a/SplitWiseImpl/src/com/strategies/interfaces/ISplitInput.java b/SplitWiseImpl/src/com/strategies/interfaces/ISplitInput.java index ce90af09..44c6aeb9 100644 --- a/SplitWiseImpl/src/com/strategies/interfaces/ISplitInput.java +++ b/SplitWiseImpl/src/com/strategies/interfaces/ISplitInput.java @@ -2,16 +2,6 @@ import com.enums.SplitStrategyType; -// TODO: Auto-generated Javadoc -/** - * The Interface ISplitInput. - */ public interface ISplitInput { - - /** - * Gets the split input type. - * - * @return the split input type - */ SplitStrategyType getSplitInputType(); } diff --git a/SplitWiseImpl/src/com/strategies/interfaces/ISplitStrategy.java b/SplitWiseImpl/src/com/strategies/interfaces/ISplitStrategy.java index 1b7e26a6..bb39a85e 100644 --- a/SplitWiseImpl/src/com/strategies/interfaces/ISplitStrategy.java +++ b/SplitWiseImpl/src/com/strategies/interfaces/ISplitStrategy.java @@ -3,32 +3,8 @@ import com.enums.SplitStrategyType; import com.strategies.splitObjects.SplitResult; -// TODO: Auto-generated Javadoc -/** - * The Interface ISplitStrategy. - */ public interface ISplitStrategy { - - /** - * Verify input. - * - * @param splitInput the split input - * @return the input validation result - */ InputValidationResult verifyInput(ISplitInput splitInput); - - /** - * Gets the final split. - * - * @param splitInput the split input - * @return the final split - */ SplitResult getFinalSplit(ISplitInput splitInput); - - /** - * Gets the spli strategy type. - * - * @return the spli strategy type - */ SplitStrategyType getSpliStrategyType(); } diff --git a/SplitWiseImpl/src/com/strategies/interfaces/IStrategyInputGenerator.java b/SplitWiseImpl/src/com/strategies/interfaces/IStrategyInputGenerator.java index 619130f2..fdcbe004 100644 --- a/SplitWiseImpl/src/com/strategies/interfaces/IStrategyInputGenerator.java +++ b/SplitWiseImpl/src/com/strategies/interfaces/IStrategyInputGenerator.java @@ -2,19 +2,6 @@ import java.util.List; -// TODO: Auto-generated Javadoc -/** - * The Interface IStrategyInputGenerator. - */ public interface IStrategyInputGenerator { - - /** - * Generate split input. - * - * @param baseInput the base input - * @param input the input - * @param lastVisitedIndex the last visited index - * @return the i split input - */ ISplitInput generateSplitInput(ISplitInput baseInput, List input, int lastVisitedIndex); } diff --git a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionInputGenerator.java b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionInputGenerator.java index 2fa35d3f..b21c319d 100644 --- a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionInputGenerator.java +++ b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionInputGenerator.java @@ -7,20 +7,7 @@ import com.strategies.splitObjects.SplitInput; import com.strategies.splitObjects.StrategyInputGenerator; -// TODO: Auto-generated Javadoc -/** - * The Class PercentDivisionInputGenerator. - */ public class PercentDivisionInputGenerator extends StrategyInputGenerator { - - /** - * Generate split input. - * - * @param baseInput the base input - * @param input the input - * @param lastVisitedIndex the last visited index - * @return the percent division split input - */ @Override public PercentDivisionSplitInput generateSplitInput(ISplitInput baseInput, List input, int lastVisitedIndex) { SplitInput baseInput2 = super.generateSplitInput(baseInput, input, lastVisitedIndex); diff --git a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitInput.java b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitInput.java index 7077aa2a..78ebabfe 100644 --- a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitInput.java +++ b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitInput.java @@ -6,43 +6,19 @@ import com.enums.SplitStrategyType; import com.strategies.splitObjects.SplitInput; -// TODO: Auto-generated Javadoc -/** - * The Class PercentDivisionSplitInput. - */ public class PercentDivisionSplitInput extends SplitInput { - - /** The percent owed map. */ private HashMap percentOwedMap; - /** - * Instantiates a new percent division split input. - * - * @param paidBy the paid by - * @param participants the participants - * @param paidAmount the paid amount - * @param percentOwedMap the percent owed map - */ public PercentDivisionSplitInput(String paidBy, List participants, double paidAmount, HashMap percentOwedMap) { super(paidBy, participants, paidAmount); this.percentOwedMap = percentOwedMap; } - /** - * Gets the percent owed map. - * - * @return the percent owed map - */ public HashMap getPercentOwedMap() { return percentOwedMap; } - /** - * Gets the split input type. - * - * @return the split input type - */ @Override public SplitStrategyType getSplitInputType() { diff --git a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java index 913eece1..0b80018c 100644 --- a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java +++ b/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java @@ -9,21 +9,9 @@ import com.strategies.interfaces.ISplitStrategy; import com.strategies.splitObjects.SplitResult; -// TODO: Auto-generated Javadoc -/** - * The Class PercentDivisionSplitStrategy. - */ public class PercentDivisionSplitStrategy implements ISplitStrategy { - - /** The percentage 100. */ static public double PERCENTAGE_100 = 100.0; - /** - * Verify input. - * - * @param splitInput the split input - * @return the input validation result - */ @Override public InputValidationResult verifyInput(ISplitInput splitInput) { try { @@ -45,12 +33,6 @@ public InputValidationResult verifyInput(ISplitInput splitInput) { } } - /** - * Gets the final split. - * - * @param splitInput the split input - * @return the final split - */ @Override public SplitResult getFinalSplit(ISplitInput splitInput) { if (this.verifyInput(splitInput) != InputValidationResult.VALID) { @@ -98,11 +80,6 @@ public SplitResult getFinalSplit(ISplitInput splitInput) { return new SplitResult(owedByMap, owedToMap, owedMap, owesMap); } - /** - * Gets the spli strategy type. - * - * @return the spli strategy type - */ @Override public SplitStrategyType getSpliStrategyType() { // TODO Auto-generated method stub diff --git a/SplitWiseImpl/src/com/strategies/splitObjects/SplitInput.java b/SplitWiseImpl/src/com/strategies/splitObjects/SplitInput.java index 296f4031..3b80fde1 100644 --- a/SplitWiseImpl/src/com/strategies/splitObjects/SplitInput.java +++ b/SplitWiseImpl/src/com/strategies/splitObjects/SplitInput.java @@ -4,19 +4,7 @@ import com.strategies.interfaces.ISplitInput; -// TODO: Auto-generated Javadoc -/** - * The Class SplitInput. - */ public abstract class SplitInput implements ISplitInput { - - /** - * Instantiates a new split input. - * - * @param paidBy the paid by - * @param participants the participants - * @param paidAmount the paid amount - */ public SplitInput(String paidBy, List participants, double paidAmount) { super(); this.paidBy = paidBy; @@ -24,67 +12,34 @@ public SplitInput(String paidBy, List participants, double paidAmount) { this.paidAmount = paidAmount; } - /** The paid by. */ private String paidBy; - /** The participants. */ private List participants; - /** The paid amount. */ private double paidAmount; - /** - * Gets the paid by. - * - * @return the paid by - */ public String getPaidBy() { return paidBy; } - /** - * Gets the paid amount. - * - * @return the paid amount - */ public double getPaidAmount() { return paidAmount; } - /** - * Sets the paid amount. - * - * @param paidAmount the new paid amount - */ public void setPaidAmount(double paidAmount) { this.paidAmount = paidAmount; } - /** - * Sets the paid by. - * - * @param paidBy the new paid by - */ public void setPaidBy(String paidBy) { this.paidBy = paidBy; } - /** - * Gets the participants. - * - * @return the participants - */ public List getParticipants() { return participants; } - /** - * Sets the participants. - * - * @param participants the new participants - */ public void setParticipants(List participants) { this.participants = participants; } diff --git a/SplitWiseImpl/src/com/strategies/splitObjects/SplitResult.java b/SplitWiseImpl/src/com/strategies/splitObjects/SplitResult.java index f8c94064..c8df1520 100644 --- a/SplitWiseImpl/src/com/strategies/splitObjects/SplitResult.java +++ b/SplitWiseImpl/src/com/strategies/splitObjects/SplitResult.java @@ -2,29 +2,14 @@ import java.util.HashMap; -// TODO: Auto-generated Javadoc -/** - * The Class SplitResult. - */ public class SplitResult { - - /** The owed by. */ HashMap> owedBy; - - /** The owed to. */ HashMap> owedTo; - - /** The owed map. */ HashMap owedMap; - - /** The owes map. */ HashMap owesMap; - /** - * Instantiates a new split result. - */ public SplitResult() { super(); this.owedBy = new HashMap>(); @@ -33,14 +18,6 @@ public SplitResult() { this.owesMap = new HashMap(); } - /** - * Instantiates a new split result. - * - * @param owedBy the owed by - * @param owedTo the owed to - * @param owedMap the owed map - * @param owesMap the owes map - */ public SplitResult(HashMap> owedBy, HashMap> owedTo, HashMap owedMap, HashMap owesMap) { super(); @@ -50,20 +27,9 @@ public SplitResult(HashMap> owedBy, HashMap> getOwedBy() { return owedBy; } - - /** - * Gets the owed to. - * - * @return the owed to - */ public HashMap> getOwedTo() { return owedTo; } diff --git a/SplitWiseImpl/src/com/strategies/splitObjects/StrategyInputGenerator.java b/SplitWiseImpl/src/com/strategies/splitObjects/StrategyInputGenerator.java index c36aadc0..77ef0df5 100644 --- a/SplitWiseImpl/src/com/strategies/splitObjects/StrategyInputGenerator.java +++ b/SplitWiseImpl/src/com/strategies/splitObjects/StrategyInputGenerator.java @@ -5,20 +5,8 @@ import com.strategies.interfaces.ISplitInput; import com.strategies.interfaces.IStrategyInputGenerator; -// TODO: Auto-generated Javadoc -/** - * The Class StrategyInputGenerator. - */ public abstract class StrategyInputGenerator implements IStrategyInputGenerator { - /** - * Generate split input. - * - * @param baseInput the base input - * @param input the input - * @param lastVisitedIndex the last visited index - * @return the split input - */ @Override public SplitInput generateSplitInput(ISplitInput baseInput, List input, int lastVisitedIndex) { try { diff --git a/SplitWiseImpl/src/com/user/UserDetails.java b/SplitWiseImpl/src/com/user/UserDetails.java index 1622a8ea..289050a5 100644 --- a/SplitWiseImpl/src/com/user/UserDetails.java +++ b/SplitWiseImpl/src/com/user/UserDetails.java @@ -1,31 +1,14 @@ package com.user; -// TODO: Auto-generated Javadoc -/** - * The Class UserDetails. - */ public class UserDetails { - /** The user id. */ String userId; - - /** The name. */ String name; - /** The email. */ String email; - /** The phone number. */ String phoneNumber; - /** - * Instantiates a new user details. - * - * @param userId the user id - * @param name the name - * @param email the email - * @param phoneNumber the phone number - */ public UserDetails(String userId, String name, String email, String phoneNumber) { super(); this.userId = userId; @@ -35,74 +18,34 @@ public UserDetails(String userId, String name, String email, String phoneNumber) } - /** - * Gets the user id. - * - * @return the user id - */ public String getUserId() { return userId; } - /** - * Sets the user id. - * - * @param userId the new user id - */ public void setUserId(String userId) { this.userId = userId; } - /** - * Gets the name. - * - * @return the name - */ public String getName() { return name; } - /** - * Sets the name. - * - * @param name the new name - */ public void setName(String name) { this.name = name; } - /** - * Gets the email. - * - * @return the email - */ public String getEmail() { return email; } - /** - * Sets the email. - * - * @param email the new email - */ public void setEmail(String email) { this.email = email; } - /** - * Gets the phone number. - * - * @return the phone number - */ public String getPhoneNumber() { return phoneNumber; } - /** - * Sets the phone number. - * - * @param phoneNumber the new phone number - */ public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } diff --git a/SplitWiseImpl/src/com/user/interfaces/IUser.java b/SplitWiseImpl/src/com/user/interfaces/IUser.java index cc7d1c8a..9f615f7f 100644 --- a/SplitWiseImpl/src/com/user/interfaces/IUser.java +++ b/SplitWiseImpl/src/com/user/interfaces/IUser.java @@ -2,26 +2,8 @@ import com.user.UserDetails; -// TODO: Auto-generated Javadoc -/** - * The Interface IUser. - */ public interface IUser { - - /** - * Gets the user details. - * - * @param userId the user id - * @return the user details - */ UserDetails getUserDetails(String userId); - /** - * Update user details. - * - * @param userId the user id - * @param userDetails the user details - * @return true, if successful - */ boolean updateUserDetails(String userId, UserDetails userDetails); } From f38398e7d8ae0d35e13a77a98fd09091e8c361f9 Mon Sep 17 00:00:00 2001 From: Anant Akash Date: Mon, 7 Apr 2025 12:10:18 +0530 Subject: [PATCH 13/19] Revert "Refactor" This reverts commit 5787076cb3e8166c6e220adc4fcfe7d3dd637cc6. --- SplitWiseImpl/src/com/application/Application.java | 12 ++++++------ SplitWiseImpl/src/com/dataStore/UserDataStore.java | 3 +-- .../src/com/{user => dataStore}/UserDetails.java | 2 +- .../com/dataStore/UserPairOwedAmountDataStore.java | 4 ++-- .../EqualDivisionSplitStrategy.java | 8 ++++---- .../EqualStrategyInutGenerator.java | 8 ++++---- .../EqualStrategySplitInput.java | 4 ++-- .../ExactDivisionSplitStrategy.java | 8 ++++---- .../ExactStartegyInputGenerator.java | 9 ++++----- .../ExactStrategySplitInput.java | 4 ++-- .../src/com/factory/DataStoreFactory.java | 6 +++--- .../src/com/factory/StrategyListFactory.java | 10 +++++----- .../com/factory/interfaces/IDataStoreFactory.java | 10 ---------- SplitWiseImpl/src/com/interfaces/IApplication.java | 2 +- .../src/com/interfaces/IDataStoreFactory.java | 7 +++++++ .../{ioParser => }/interfaces/IInputReader.java | 4 +--- .../{strategies => }/interfaces/ISplitInput.java | 2 +- .../interfaces/ISplitStrategy.java | 4 ++-- .../interfaces/IStrategyInputGenerator.java | 2 +- .../src/com/interfaces/IStrategyList.java | 1 - .../interfaces/IStrategyListFactory.java | 4 +--- .../src/com/{user => }/interfaces/IUser.java | 4 ++-- .../{dataStore => }/interfaces/IUserDataStore.java | 4 ++-- .../interfaces/IUserPairOwedAmountDataStore.java | 4 ++-- SplitWiseImpl/src/com/ioParser/InputReader.java | 14 +++++++------- .../src/com/ioParser/ResultFormatter.java | 5 ----- .../com/ioParser/interfaces/IResultFormatter.java | 9 --------- .../PercentDivisionInputGenerator.java | 9 ++++----- .../PercentDivisionSplitInput.java | 4 ++-- .../PercentDivisionSplitStrategy.java | 8 ++++---- .../{strategies => }/splitObjects/SplitInput.java | 4 ++-- .../{strategies => }/splitObjects/SplitResult.java | 2 +- .../splitObjects/StrategyInputGenerator.java | 6 +++--- 33 files changed, 81 insertions(+), 106 deletions(-) rename SplitWiseImpl/src/com/{user => dataStore}/UserDetails.java (97%) rename SplitWiseImpl/src/com/{strategies => }/equalDivisionStrategy/EqualDivisionSplitStrategy.java (92%) rename SplitWiseImpl/src/com/{strategies => }/equalDivisionStrategy/EqualStrategyInutGenerator.java (69%) rename SplitWiseImpl/src/com/{strategies => }/equalDivisionStrategy/EqualStrategySplitInput.java (81%) rename SplitWiseImpl/src/com/{strategies => }/exactDivisionStrategy/ExactDivisionSplitStrategy.java (92%) rename SplitWiseImpl/src/com/{strategies => }/exactDivisionStrategy/ExactStartegyInputGenerator.java (82%) rename SplitWiseImpl/src/com/{strategies => }/exactDivisionStrategy/ExactStrategySplitInput.java (87%) delete mode 100644 SplitWiseImpl/src/com/factory/interfaces/IDataStoreFactory.java create mode 100644 SplitWiseImpl/src/com/interfaces/IDataStoreFactory.java rename SplitWiseImpl/src/com/{ioParser => }/interfaces/IInputReader.java (56%) rename SplitWiseImpl/src/com/{strategies => }/interfaces/ISplitInput.java (76%) rename SplitWiseImpl/src/com/{strategies => }/interfaces/ISplitStrategy.java (76%) rename SplitWiseImpl/src/com/{strategies => }/interfaces/IStrategyInputGenerator.java (82%) rename SplitWiseImpl/src/com/{factory => }/interfaces/IStrategyListFactory.java (65%) rename SplitWiseImpl/src/com/{user => }/interfaces/IUser.java (71%) rename SplitWiseImpl/src/com/{dataStore => }/interfaces/IUserDataStore.java (79%) rename SplitWiseImpl/src/com/{dataStore => }/interfaces/IUserPairOwedAmountDataStore.java (76%) delete mode 100644 SplitWiseImpl/src/com/ioParser/ResultFormatter.java delete mode 100644 SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java rename SplitWiseImpl/src/com/{strategies => }/percentDivisionStrategy/PercentDivisionInputGenerator.java (82%) rename SplitWiseImpl/src/com/{strategies => }/percentDivisionStrategy/PercentDivisionSplitInput.java (86%) rename SplitWiseImpl/src/com/{strategies => }/percentDivisionStrategy/PercentDivisionSplitStrategy.java (92%) rename SplitWiseImpl/src/com/{strategies => }/splitObjects/SplitInput.java (90%) rename SplitWiseImpl/src/com/{strategies => }/splitObjects/SplitResult.java (96%) rename SplitWiseImpl/src/com/{strategies => }/splitObjects/StrategyInputGenerator.java (69%) diff --git a/SplitWiseImpl/src/com/application/Application.java b/SplitWiseImpl/src/com/application/Application.java index 2670030c..c8b11e23 100644 --- a/SplitWiseImpl/src/com/application/Application.java +++ b/SplitWiseImpl/src/com/application/Application.java @@ -3,15 +3,15 @@ import java.util.ArrayList; import java.util.List; -import com.dataStore.interfaces.IUserPairOwedAmountDataStore; import com.enums.SplitStrategyType; -import com.factory.interfaces.IDataStoreFactory; -import com.factory.interfaces.IStrategyListFactory; import com.interfaces.IApplication; +import com.interfaces.IDataStoreFactory; +import com.interfaces.IInputReader; +import com.interfaces.ISplitInput; import com.interfaces.IStrategyList; -import com.ioParser.interfaces.IInputReader; -import com.strategies.interfaces.ISplitInput; -import com.strategies.splitObjects.SplitResult; +import com.interfaces.IStrategyListFactory; +import com.interfaces.IUserPairOwedAmountDataStore; +import com.splitObjects.SplitResult; public class Application implements IApplication { diff --git a/SplitWiseImpl/src/com/dataStore/UserDataStore.java b/SplitWiseImpl/src/com/dataStore/UserDataStore.java index 3a820b8a..56a3753f 100644 --- a/SplitWiseImpl/src/com/dataStore/UserDataStore.java +++ b/SplitWiseImpl/src/com/dataStore/UserDataStore.java @@ -2,8 +2,7 @@ import java.util.HashMap; -import com.dataStore.interfaces.IUserDataStore; -import com.user.UserDetails; +import com.interfaces.IUserDataStore; public class UserDataStore implements IUserDataStore { HashMap userDetailMap = new HashMap(); diff --git a/SplitWiseImpl/src/com/user/UserDetails.java b/SplitWiseImpl/src/com/dataStore/UserDetails.java similarity index 97% rename from SplitWiseImpl/src/com/user/UserDetails.java rename to SplitWiseImpl/src/com/dataStore/UserDetails.java index 289050a5..8336fbf8 100644 --- a/SplitWiseImpl/src/com/user/UserDetails.java +++ b/SplitWiseImpl/src/com/dataStore/UserDetails.java @@ -1,4 +1,4 @@ -package com.user; +package com.dataStore; public class UserDetails { diff --git a/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java b/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java index 5b9b9c2c..9e00493a 100644 --- a/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java +++ b/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java @@ -3,8 +3,8 @@ import java.util.HashMap; import java.util.Iterator; -import com.dataStore.interfaces.IUserPairOwedAmountDataStore; -import com.strategies.splitObjects.SplitResult; +import com.interfaces.IUserPairOwedAmountDataStore; +import com.splitObjects.SplitResult; public class UserPairOwedAmountDataStore implements IUserPairOwedAmountDataStore { private HashMap> owedByMap = new HashMap>(); diff --git a/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualDivisionSplitStrategy.java b/SplitWiseImpl/src/com/equalDivisionStrategy/EqualDivisionSplitStrategy.java similarity index 92% rename from SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualDivisionSplitStrategy.java rename to SplitWiseImpl/src/com/equalDivisionStrategy/EqualDivisionSplitStrategy.java index 7d1c52e8..8748a769 100644 --- a/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualDivisionSplitStrategy.java +++ b/SplitWiseImpl/src/com/equalDivisionStrategy/EqualDivisionSplitStrategy.java @@ -1,13 +1,13 @@ -package com.strategies.equalDivisionStrategy; +package com.equalDivisionStrategy; import java.util.HashMap; import java.util.ListIterator; import com.enums.InputValidationResult; import com.enums.SplitStrategyType; -import com.strategies.interfaces.ISplitInput; -import com.strategies.interfaces.ISplitStrategy; -import com.strategies.splitObjects.SplitResult; +import com.interfaces.ISplitInput; +import com.interfaces.ISplitStrategy; +import com.splitObjects.SplitResult; public class EqualDivisionSplitStrategy implements ISplitStrategy { diff --git a/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategyInutGenerator.java b/SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategyInutGenerator.java similarity index 69% rename from SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategyInutGenerator.java rename to SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategyInutGenerator.java index f8a1ebf2..914a2fc3 100644 --- a/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategyInutGenerator.java +++ b/SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategyInutGenerator.java @@ -1,10 +1,10 @@ -package com.strategies.equalDivisionStrategy; +package com.equalDivisionStrategy; import java.util.List; -import com.strategies.interfaces.ISplitInput; -import com.strategies.splitObjects.SplitInput; -import com.strategies.splitObjects.StrategyInputGenerator; +import com.interfaces.ISplitInput; +import com.splitObjects.SplitInput; +import com.splitObjects.StrategyInputGenerator; public class EqualStrategyInutGenerator extends StrategyInputGenerator { diff --git a/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategySplitInput.java b/SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategySplitInput.java similarity index 81% rename from SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategySplitInput.java rename to SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategySplitInput.java index e5718798..85b961e2 100644 --- a/SplitWiseImpl/src/com/strategies/equalDivisionStrategy/EqualStrategySplitInput.java +++ b/SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategySplitInput.java @@ -1,9 +1,9 @@ -package com.strategies.equalDivisionStrategy; +package com.equalDivisionStrategy; import java.util.List; import com.enums.SplitStrategyType; -import com.strategies.splitObjects.SplitInput; +import com.splitObjects.SplitInput; public class EqualStrategySplitInput extends SplitInput { diff --git a/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactDivisionSplitStrategy.java b/SplitWiseImpl/src/com/exactDivisionStrategy/ExactDivisionSplitStrategy.java similarity index 92% rename from SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactDivisionSplitStrategy.java rename to SplitWiseImpl/src/com/exactDivisionStrategy/ExactDivisionSplitStrategy.java index 17617c2a..fa8d8a7b 100644 --- a/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactDivisionSplitStrategy.java +++ b/SplitWiseImpl/src/com/exactDivisionStrategy/ExactDivisionSplitStrategy.java @@ -1,13 +1,13 @@ -package com.strategies.exactDivisionStrategy; +package com.exactDivisionStrategy; import java.util.HashMap; import java.util.Iterator; import com.enums.InputValidationResult; import com.enums.SplitStrategyType; -import com.strategies.interfaces.ISplitInput; -import com.strategies.interfaces.ISplitStrategy; -import com.strategies.splitObjects.SplitResult; +import com.interfaces.ISplitInput; +import com.interfaces.ISplitStrategy; +import com.splitObjects.SplitResult; public class ExactDivisionSplitStrategy implements ISplitStrategy { diff --git a/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStartegyInputGenerator.java b/SplitWiseImpl/src/com/exactDivisionStrategy/ExactStartegyInputGenerator.java similarity index 82% rename from SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStartegyInputGenerator.java rename to SplitWiseImpl/src/com/exactDivisionStrategy/ExactStartegyInputGenerator.java index 7568f3d9..a4bb846a 100644 --- a/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStartegyInputGenerator.java +++ b/SplitWiseImpl/src/com/exactDivisionStrategy/ExactStartegyInputGenerator.java @@ -1,11 +1,10 @@ -package com.strategies.exactDivisionStrategy; +package com.exactDivisionStrategy; import java.util.HashMap; import java.util.List; - -import com.strategies.interfaces.ISplitInput; -import com.strategies.splitObjects.SplitInput; -import com.strategies.splitObjects.StrategyInputGenerator; +import com.interfaces.ISplitInput; +import com.splitObjects.SplitInput; +import com.splitObjects.StrategyInputGenerator; public class ExactStartegyInputGenerator extends StrategyInputGenerator { @Override diff --git a/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStrategySplitInput.java b/SplitWiseImpl/src/com/exactDivisionStrategy/ExactStrategySplitInput.java similarity index 87% rename from SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStrategySplitInput.java rename to SplitWiseImpl/src/com/exactDivisionStrategy/ExactStrategySplitInput.java index fa24ad75..52c63972 100644 --- a/SplitWiseImpl/src/com/strategies/exactDivisionStrategy/ExactStrategySplitInput.java +++ b/SplitWiseImpl/src/com/exactDivisionStrategy/ExactStrategySplitInput.java @@ -1,10 +1,10 @@ -package com.strategies.exactDivisionStrategy; +package com.exactDivisionStrategy; import java.util.HashMap; import java.util.List; import com.enums.SplitStrategyType; -import com.strategies.splitObjects.SplitInput; +import com.splitObjects.SplitInput; public class ExactStrategySplitInput extends SplitInput { diff --git a/SplitWiseImpl/src/com/factory/DataStoreFactory.java b/SplitWiseImpl/src/com/factory/DataStoreFactory.java index cca361b7..83c62fb6 100644 --- a/SplitWiseImpl/src/com/factory/DataStoreFactory.java +++ b/SplitWiseImpl/src/com/factory/DataStoreFactory.java @@ -2,9 +2,9 @@ import com.dataStore.UserDataStore; import com.dataStore.UserPairOwedAmountDataStore; -import com.dataStore.interfaces.IUserDataStore; -import com.dataStore.interfaces.IUserPairOwedAmountDataStore; -import com.factory.interfaces.IDataStoreFactory; +import com.interfaces.IDataStoreFactory; +import com.interfaces.IUserDataStore; +import com.interfaces.IUserPairOwedAmountDataStore; public class DataStoreFactory implements IDataStoreFactory { private IUserDataStore userDataStore; diff --git a/SplitWiseImpl/src/com/factory/StrategyListFactory.java b/SplitWiseImpl/src/com/factory/StrategyListFactory.java index b967bed9..b3bcaddc 100644 --- a/SplitWiseImpl/src/com/factory/StrategyListFactory.java +++ b/SplitWiseImpl/src/com/factory/StrategyListFactory.java @@ -7,12 +7,12 @@ import java.util.Map; import com.enums.SplitStrategyType; -import com.factory.interfaces.IStrategyListFactory; +import com.equalDivisionStrategy.EqualDivisionSplitStrategy; +import com.exactDivisionStrategy.ExactDivisionSplitStrategy; +import com.interfaces.ISplitStrategy; import com.interfaces.IStrategyList; -import com.strategies.equalDivisionStrategy.EqualDivisionSplitStrategy; -import com.strategies.exactDivisionStrategy.ExactDivisionSplitStrategy; -import com.strategies.interfaces.ISplitStrategy; -import com.strategies.percentDivisionStrategy.PercentDivisionSplitStrategy; +import com.interfaces.IStrategyListFactory; +import com.percentDivisionStrategy.PercentDivisionSplitStrategy; public class StrategyListFactory implements IStrategyListFactory { diff --git a/SplitWiseImpl/src/com/factory/interfaces/IDataStoreFactory.java b/SplitWiseImpl/src/com/factory/interfaces/IDataStoreFactory.java deleted file mode 100644 index 5a11a930..00000000 --- a/SplitWiseImpl/src/com/factory/interfaces/IDataStoreFactory.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.factory.interfaces; - -import com.dataStore.interfaces.IUserDataStore; -import com.dataStore.interfaces.IUserPairOwedAmountDataStore; - -public interface IDataStoreFactory { - IUserDataStore getUserDataStore(); - - IUserPairOwedAmountDataStore getUserPairOwedAmountDataStore(); -} diff --git a/SplitWiseImpl/src/com/interfaces/IApplication.java b/SplitWiseImpl/src/com/interfaces/IApplication.java index 450f5ed2..9474cd80 100644 --- a/SplitWiseImpl/src/com/interfaces/IApplication.java +++ b/SplitWiseImpl/src/com/interfaces/IApplication.java @@ -3,7 +3,7 @@ import java.util.List; import com.enums.SplitStrategyType; -import com.strategies.splitObjects.SplitResult; +import com.splitObjects.SplitResult; public interface IApplication { boolean addExpense(List expenseInput); diff --git a/SplitWiseImpl/src/com/interfaces/IDataStoreFactory.java b/SplitWiseImpl/src/com/interfaces/IDataStoreFactory.java new file mode 100644 index 00000000..324faf72 --- /dev/null +++ b/SplitWiseImpl/src/com/interfaces/IDataStoreFactory.java @@ -0,0 +1,7 @@ +package com.interfaces; + +public interface IDataStoreFactory { + IUserDataStore getUserDataStore(); + + IUserPairOwedAmountDataStore getUserPairOwedAmountDataStore(); +} diff --git a/SplitWiseImpl/src/com/ioParser/interfaces/IInputReader.java b/SplitWiseImpl/src/com/interfaces/IInputReader.java similarity index 56% rename from SplitWiseImpl/src/com/ioParser/interfaces/IInputReader.java rename to SplitWiseImpl/src/com/interfaces/IInputReader.java index f42a53ed..b49eb1fc 100644 --- a/SplitWiseImpl/src/com/ioParser/interfaces/IInputReader.java +++ b/SplitWiseImpl/src/com/interfaces/IInputReader.java @@ -1,9 +1,7 @@ -package com.ioParser.interfaces; +package com.interfaces; import java.util.List; -import com.strategies.interfaces.ISplitInput; - public interface IInputReader { ISplitInput parseInput(List input); } diff --git a/SplitWiseImpl/src/com/strategies/interfaces/ISplitInput.java b/SplitWiseImpl/src/com/interfaces/ISplitInput.java similarity index 76% rename from SplitWiseImpl/src/com/strategies/interfaces/ISplitInput.java rename to SplitWiseImpl/src/com/interfaces/ISplitInput.java index 44c6aeb9..5429949b 100644 --- a/SplitWiseImpl/src/com/strategies/interfaces/ISplitInput.java +++ b/SplitWiseImpl/src/com/interfaces/ISplitInput.java @@ -1,4 +1,4 @@ -package com.strategies.interfaces; +package com.interfaces; import com.enums.SplitStrategyType; diff --git a/SplitWiseImpl/src/com/strategies/interfaces/ISplitStrategy.java b/SplitWiseImpl/src/com/interfaces/ISplitStrategy.java similarity index 76% rename from SplitWiseImpl/src/com/strategies/interfaces/ISplitStrategy.java rename to SplitWiseImpl/src/com/interfaces/ISplitStrategy.java index bb39a85e..418b1b3b 100644 --- a/SplitWiseImpl/src/com/strategies/interfaces/ISplitStrategy.java +++ b/SplitWiseImpl/src/com/interfaces/ISplitStrategy.java @@ -1,7 +1,7 @@ -package com.strategies.interfaces; +package com.interfaces; import com.enums.InputValidationResult; import com.enums.SplitStrategyType; -import com.strategies.splitObjects.SplitResult; +import com.splitObjects.SplitResult; public interface ISplitStrategy { InputValidationResult verifyInput(ISplitInput splitInput); diff --git a/SplitWiseImpl/src/com/strategies/interfaces/IStrategyInputGenerator.java b/SplitWiseImpl/src/com/interfaces/IStrategyInputGenerator.java similarity index 82% rename from SplitWiseImpl/src/com/strategies/interfaces/IStrategyInputGenerator.java rename to SplitWiseImpl/src/com/interfaces/IStrategyInputGenerator.java index fdcbe004..e85bd127 100644 --- a/SplitWiseImpl/src/com/strategies/interfaces/IStrategyInputGenerator.java +++ b/SplitWiseImpl/src/com/interfaces/IStrategyInputGenerator.java @@ -1,4 +1,4 @@ -package com.strategies.interfaces; +package com.interfaces; import java.util.List; diff --git a/SplitWiseImpl/src/com/interfaces/IStrategyList.java b/SplitWiseImpl/src/com/interfaces/IStrategyList.java index 63732755..0db80a36 100644 --- a/SplitWiseImpl/src/com/interfaces/IStrategyList.java +++ b/SplitWiseImpl/src/com/interfaces/IStrategyList.java @@ -3,7 +3,6 @@ import java.util.Map; import com.enums.SplitStrategyType; -import com.strategies.interfaces.ISplitStrategy; public interface IStrategyList { Map getSplitStrategies(); diff --git a/SplitWiseImpl/src/com/factory/interfaces/IStrategyListFactory.java b/SplitWiseImpl/src/com/interfaces/IStrategyListFactory.java similarity index 65% rename from SplitWiseImpl/src/com/factory/interfaces/IStrategyListFactory.java rename to SplitWiseImpl/src/com/interfaces/IStrategyListFactory.java index 3c348508..c5bcd10e 100644 --- a/SplitWiseImpl/src/com/factory/interfaces/IStrategyListFactory.java +++ b/SplitWiseImpl/src/com/interfaces/IStrategyListFactory.java @@ -1,9 +1,7 @@ -package com.factory.interfaces; +package com.interfaces; import java.util.List; -import com.interfaces.IStrategyList; - public interface IStrategyListFactory { IStrategyList getStrategyList(List strategiesPresent); } diff --git a/SplitWiseImpl/src/com/user/interfaces/IUser.java b/SplitWiseImpl/src/com/interfaces/IUser.java similarity index 71% rename from SplitWiseImpl/src/com/user/interfaces/IUser.java rename to SplitWiseImpl/src/com/interfaces/IUser.java index 9f615f7f..eb8dc6ba 100644 --- a/SplitWiseImpl/src/com/user/interfaces/IUser.java +++ b/SplitWiseImpl/src/com/interfaces/IUser.java @@ -1,6 +1,6 @@ -package com.user.interfaces; +package com.interfaces; -import com.user.UserDetails; +import com.dataStore.UserDetails; public interface IUser { UserDetails getUserDetails(String userId); diff --git a/SplitWiseImpl/src/com/dataStore/interfaces/IUserDataStore.java b/SplitWiseImpl/src/com/interfaces/IUserDataStore.java similarity index 79% rename from SplitWiseImpl/src/com/dataStore/interfaces/IUserDataStore.java rename to SplitWiseImpl/src/com/interfaces/IUserDataStore.java index 841b642b..857526c1 100644 --- a/SplitWiseImpl/src/com/dataStore/interfaces/IUserDataStore.java +++ b/SplitWiseImpl/src/com/interfaces/IUserDataStore.java @@ -1,6 +1,6 @@ -package com.dataStore.interfaces; +package com.interfaces; -import com.user.UserDetails; +import com.dataStore.UserDetails; public interface IUserDataStore { UserDetails getUserDetails(String userId); diff --git a/SplitWiseImpl/src/com/dataStore/interfaces/IUserPairOwedAmountDataStore.java b/SplitWiseImpl/src/com/interfaces/IUserPairOwedAmountDataStore.java similarity index 76% rename from SplitWiseImpl/src/com/dataStore/interfaces/IUserPairOwedAmountDataStore.java rename to SplitWiseImpl/src/com/interfaces/IUserPairOwedAmountDataStore.java index 5ed1cfb4..744d4050 100644 --- a/SplitWiseImpl/src/com/dataStore/interfaces/IUserPairOwedAmountDataStore.java +++ b/SplitWiseImpl/src/com/interfaces/IUserPairOwedAmountDataStore.java @@ -1,6 +1,6 @@ -package com.dataStore.interfaces; +package com.interfaces; -import com.strategies.splitObjects.SplitResult; +import com.splitObjects.SplitResult; public interface IUserPairOwedAmountDataStore { boolean updateAmount(String userId1, String userId2, double amount); diff --git a/SplitWiseImpl/src/com/ioParser/InputReader.java b/SplitWiseImpl/src/com/ioParser/InputReader.java index ced2628e..c0e79eb1 100644 --- a/SplitWiseImpl/src/com/ioParser/InputReader.java +++ b/SplitWiseImpl/src/com/ioParser/InputReader.java @@ -5,13 +5,13 @@ import java.util.List; import com.enums.SplitStrategyType; -import com.ioParser.interfaces.IInputReader; -import com.strategies.equalDivisionStrategy.EqualStrategyInutGenerator; -import com.strategies.exactDivisionStrategy.ExactStartegyInputGenerator; -import com.strategies.interfaces.ISplitInput; -import com.strategies.interfaces.IStrategyInputGenerator; -import com.strategies.percentDivisionStrategy.PercentDivisionInputGenerator; -import com.strategies.splitObjects.SplitInput; +import com.equalDivisionStrategy.EqualStrategyInutGenerator; +import com.exactDivisionStrategy.ExactStartegyInputGenerator; +import com.interfaces.IInputReader; +import com.interfaces.ISplitInput; +import com.interfaces.IStrategyInputGenerator; +import com.percentDivisionStrategy.PercentDivisionInputGenerator; +import com.splitObjects.SplitInput; public class InputReader implements IInputReader { diff --git a/SplitWiseImpl/src/com/ioParser/ResultFormatter.java b/SplitWiseImpl/src/com/ioParser/ResultFormatter.java deleted file mode 100644 index a62392df..00000000 --- a/SplitWiseImpl/src/com/ioParser/ResultFormatter.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.ioParser; - -public class ResultFormatter { - -} diff --git a/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java b/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java deleted file mode 100644 index 445f40d0..00000000 --- a/SplitWiseImpl/src/com/ioParser/interfaces/IResultFormatter.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.ioParser.interfaces; - -import java.util.List; - -import com.strategies.splitObjects.SplitResult; - -public interface IResultFormatter { - List getFormattedResult(SplitResult splitResult); -} diff --git a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionInputGenerator.java b/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionInputGenerator.java similarity index 82% rename from SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionInputGenerator.java rename to SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionInputGenerator.java index b21c319d..1a37b460 100644 --- a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionInputGenerator.java +++ b/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionInputGenerator.java @@ -1,11 +1,10 @@ -package com.strategies.percentDivisionStrategy; +package com.percentDivisionStrategy; import java.util.HashMap; import java.util.List; - -import com.strategies.interfaces.ISplitInput; -import com.strategies.splitObjects.SplitInput; -import com.strategies.splitObjects.StrategyInputGenerator; +import com.interfaces.ISplitInput; +import com.splitObjects.SplitInput; +import com.splitObjects.StrategyInputGenerator; public class PercentDivisionInputGenerator extends StrategyInputGenerator { @Override diff --git a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitInput.java b/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitInput.java similarity index 86% rename from SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitInput.java rename to SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitInput.java index 78ebabfe..b4bfd845 100644 --- a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitInput.java +++ b/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitInput.java @@ -1,10 +1,10 @@ -package com.strategies.percentDivisionStrategy; +package com.percentDivisionStrategy; import java.util.HashMap; import java.util.List; import com.enums.SplitStrategyType; -import com.strategies.splitObjects.SplitInput; +import com.splitObjects.SplitInput; public class PercentDivisionSplitInput extends SplitInput { private HashMap percentOwedMap; diff --git a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java b/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitStrategy.java similarity index 92% rename from SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java rename to SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitStrategy.java index 0b80018c..edcd1476 100644 --- a/SplitWiseImpl/src/com/strategies/percentDivisionStrategy/PercentDivisionSplitStrategy.java +++ b/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitStrategy.java @@ -1,13 +1,13 @@ -package com.strategies.percentDivisionStrategy; +package com.percentDivisionStrategy; import java.util.HashMap; import java.util.Iterator; import com.enums.InputValidationResult; import com.enums.SplitStrategyType; -import com.strategies.interfaces.ISplitInput; -import com.strategies.interfaces.ISplitStrategy; -import com.strategies.splitObjects.SplitResult; +import com.interfaces.ISplitInput; +import com.interfaces.ISplitStrategy; +import com.splitObjects.SplitResult; public class PercentDivisionSplitStrategy implements ISplitStrategy { static public double PERCENTAGE_100 = 100.0; diff --git a/SplitWiseImpl/src/com/strategies/splitObjects/SplitInput.java b/SplitWiseImpl/src/com/splitObjects/SplitInput.java similarity index 90% rename from SplitWiseImpl/src/com/strategies/splitObjects/SplitInput.java rename to SplitWiseImpl/src/com/splitObjects/SplitInput.java index 3b80fde1..9b0c4e97 100644 --- a/SplitWiseImpl/src/com/strategies/splitObjects/SplitInput.java +++ b/SplitWiseImpl/src/com/splitObjects/SplitInput.java @@ -1,8 +1,8 @@ -package com.strategies.splitObjects; +package com.splitObjects; import java.util.List; -import com.strategies.interfaces.ISplitInput; +import com.interfaces.ISplitInput; public abstract class SplitInput implements ISplitInput { public SplitInput(String paidBy, List participants, double paidAmount) { diff --git a/SplitWiseImpl/src/com/strategies/splitObjects/SplitResult.java b/SplitWiseImpl/src/com/splitObjects/SplitResult.java similarity index 96% rename from SplitWiseImpl/src/com/strategies/splitObjects/SplitResult.java rename to SplitWiseImpl/src/com/splitObjects/SplitResult.java index c8df1520..b68ae4ee 100644 --- a/SplitWiseImpl/src/com/strategies/splitObjects/SplitResult.java +++ b/SplitWiseImpl/src/com/splitObjects/SplitResult.java @@ -1,4 +1,4 @@ -package com.strategies.splitObjects; +package com.splitObjects; import java.util.HashMap; diff --git a/SplitWiseImpl/src/com/strategies/splitObjects/StrategyInputGenerator.java b/SplitWiseImpl/src/com/splitObjects/StrategyInputGenerator.java similarity index 69% rename from SplitWiseImpl/src/com/strategies/splitObjects/StrategyInputGenerator.java rename to SplitWiseImpl/src/com/splitObjects/StrategyInputGenerator.java index 77ef0df5..7c17ae4c 100644 --- a/SplitWiseImpl/src/com/strategies/splitObjects/StrategyInputGenerator.java +++ b/SplitWiseImpl/src/com/splitObjects/StrategyInputGenerator.java @@ -1,9 +1,9 @@ -package com.strategies.splitObjects; +package com.splitObjects; import java.util.List; -import com.strategies.interfaces.ISplitInput; -import com.strategies.interfaces.IStrategyInputGenerator; +import com.interfaces.ISplitInput; +import com.interfaces.IStrategyInputGenerator; public abstract class StrategyInputGenerator implements IStrategyInputGenerator { From 0aaaf2e4abf9ad67e58a1451c6cfd33156098250 Mon Sep 17 00:00:00 2001 From: Anant Akash Date: Mon, 7 Apr 2025 12:10:28 +0530 Subject: [PATCH 14/19] Revert "Remove warnings" This reverts commit dc3b40c0096f967827d3d93edf517544652bdb84. --- SplitWiseImpl/src/com/application/Application.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SplitWiseImpl/src/com/application/Application.java b/SplitWiseImpl/src/com/application/Application.java index c8b11e23..b174ce32 100644 --- a/SplitWiseImpl/src/com/application/Application.java +++ b/SplitWiseImpl/src/com/application/Application.java @@ -1,6 +1,7 @@ package com.application; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import com.enums.SplitStrategyType; @@ -10,6 +11,7 @@ import com.interfaces.ISplitInput; import com.interfaces.IStrategyList; import com.interfaces.IStrategyListFactory; +import com.interfaces.IUserDataStore; import com.interfaces.IUserPairOwedAmountDataStore; import com.splitObjects.SplitResult; From e52d3c2ee3d85f22330a3d45159321185a2c307f Mon Sep 17 00:00:00 2001 From: Anant Akash Date: Mon, 7 Apr 2025 12:10:37 +0530 Subject: [PATCH 15/19] Revert "Splitwise Implementation" This reverts commit 163627ab46ffe28d702ce14ddbacc6e061e803be. --- SplitWiseImpl/.gitignore | 1 - .../src/com/application/Application.java | 67 ------------- .../src/com/dataStore/UserDataStore.java | 56 ----------- .../src/com/dataStore/UserDetails.java | 54 ----------- .../UserPairOwedAmountDataStore.java | 83 ---------------- .../src/com/enums/InputValidationResult.java | 7 -- .../src/com/enums/SplitStrategyType.java | 7 -- .../EqualDivisionSplitStrategy.java | 89 ----------------- .../EqualStrategyInutGenerator.java | 17 ---- .../EqualStrategySplitInput.java | 23 ----- .../ExactDivisionSplitStrategy.java | 95 ------------------- .../ExactStartegyInputGenerator.java | 34 ------- .../ExactStrategySplitInput.java | 31 ------ .../src/com/factory/DataStoreFactory.java | 30 ------ .../src/com/factory/StrategyListFactory.java | 55 ----------- .../src/com/interfaces/IApplication.java | 16 ---- .../src/com/interfaces/IDataStoreFactory.java | 7 -- .../src/com/interfaces/IInputReader.java | 7 -- .../src/com/interfaces/ISplitInput.java | 7 -- .../src/com/interfaces/ISplitStrategy.java | 10 -- .../interfaces/IStrategyInputGenerator.java | 7 -- .../src/com/interfaces/IStrategyList.java | 9 -- .../com/interfaces/IStrategyListFactory.java | 7 -- SplitWiseImpl/src/com/interfaces/IUser.java | 9 -- .../src/com/interfaces/IUserDataStore.java | 13 --- .../IUserPairOwedAmountDataStore.java | 13 --- .../src/com/ioParser/InputReader.java | 73 -------------- .../PercentDivisionInputGenerator.java | 34 ------- .../PercentDivisionSplitInput.java | 27 ------ .../PercentDivisionSplitStrategy.java | 89 ----------------- .../src/com/splitObjects/SplitInput.java | 48 ---------- .../src/com/splitObjects/SplitResult.java | 36 ------- .../splitObjects/StrategyInputGenerator.java | 19 ---- SplitWiseImpl/src/module-info.java | 8 -- 34 files changed, 1088 deletions(-) delete mode 100644 SplitWiseImpl/.gitignore delete mode 100644 SplitWiseImpl/src/com/application/Application.java delete mode 100644 SplitWiseImpl/src/com/dataStore/UserDataStore.java delete mode 100644 SplitWiseImpl/src/com/dataStore/UserDetails.java delete mode 100644 SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java delete mode 100644 SplitWiseImpl/src/com/enums/InputValidationResult.java delete mode 100644 SplitWiseImpl/src/com/enums/SplitStrategyType.java delete mode 100644 SplitWiseImpl/src/com/equalDivisionStrategy/EqualDivisionSplitStrategy.java delete mode 100644 SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategyInutGenerator.java delete mode 100644 SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategySplitInput.java delete mode 100644 SplitWiseImpl/src/com/exactDivisionStrategy/ExactDivisionSplitStrategy.java delete mode 100644 SplitWiseImpl/src/com/exactDivisionStrategy/ExactStartegyInputGenerator.java delete mode 100644 SplitWiseImpl/src/com/exactDivisionStrategy/ExactStrategySplitInput.java delete mode 100644 SplitWiseImpl/src/com/factory/DataStoreFactory.java delete mode 100644 SplitWiseImpl/src/com/factory/StrategyListFactory.java delete mode 100644 SplitWiseImpl/src/com/interfaces/IApplication.java delete mode 100644 SplitWiseImpl/src/com/interfaces/IDataStoreFactory.java delete mode 100644 SplitWiseImpl/src/com/interfaces/IInputReader.java delete mode 100644 SplitWiseImpl/src/com/interfaces/ISplitInput.java delete mode 100644 SplitWiseImpl/src/com/interfaces/ISplitStrategy.java delete mode 100644 SplitWiseImpl/src/com/interfaces/IStrategyInputGenerator.java delete mode 100644 SplitWiseImpl/src/com/interfaces/IStrategyList.java delete mode 100644 SplitWiseImpl/src/com/interfaces/IStrategyListFactory.java delete mode 100644 SplitWiseImpl/src/com/interfaces/IUser.java delete mode 100644 SplitWiseImpl/src/com/interfaces/IUserDataStore.java delete mode 100644 SplitWiseImpl/src/com/interfaces/IUserPairOwedAmountDataStore.java delete mode 100644 SplitWiseImpl/src/com/ioParser/InputReader.java delete mode 100644 SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionInputGenerator.java delete mode 100644 SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitInput.java delete mode 100644 SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitStrategy.java delete mode 100644 SplitWiseImpl/src/com/splitObjects/SplitInput.java delete mode 100644 SplitWiseImpl/src/com/splitObjects/SplitResult.java delete mode 100644 SplitWiseImpl/src/com/splitObjects/StrategyInputGenerator.java delete mode 100644 SplitWiseImpl/src/module-info.java diff --git a/SplitWiseImpl/.gitignore b/SplitWiseImpl/.gitignore deleted file mode 100644 index ae3c1726..00000000 --- a/SplitWiseImpl/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/SplitWiseImpl/src/com/application/Application.java b/SplitWiseImpl/src/com/application/Application.java deleted file mode 100644 index b174ce32..00000000 --- a/SplitWiseImpl/src/com/application/Application.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.application; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import com.enums.SplitStrategyType; -import com.interfaces.IApplication; -import com.interfaces.IDataStoreFactory; -import com.interfaces.IInputReader; -import com.interfaces.ISplitInput; -import com.interfaces.IStrategyList; -import com.interfaces.IStrategyListFactory; -import com.interfaces.IUserDataStore; -import com.interfaces.IUserPairOwedAmountDataStore; -import com.splitObjects.SplitResult; - -public class Application implements IApplication { - - private IUserPairOwedAmountDataStore userPairOwedAmountDataStore; - - private IStrategyList strategyList; - - private IInputReader inputReader; - - - - Application(IDataStoreFactory dataStoreFactory, IStrategyListFactory strategyListFactory, List strategiesPresnt, IInputReader inputReader) { - - this.userPairOwedAmountDataStore = dataStoreFactory.getUserPairOwedAmountDataStore(); - - this.strategyList = strategyListFactory.getStrategyList(strategiesPresnt); - - this.inputReader = inputReader; - } - - @Override - public boolean addExpense(List expenseInput) { - ISplitInput splitInput = this.inputReader.parseInput(expenseInput); - - if (splitInput == null) { - return false; - } - - SplitResult splitResult = this.strategyList.getSplitStrategies().get(splitInput.getSplitInputType()).getFinalSplit(splitInput); - - return this.userPairOwedAmountDataStore.updateAmountForEntries(splitResult); - } - - @Override - public SplitResult getBalanceForUser(String userId) { - - return this.getBalanceForUser(userId); - } - - @Override - public SplitResult getAllBalances() { - // TODO Auto-generated method stub - return this.userPairOwedAmountDataStore.getBalancesForAllUsers(); - } - - @Override - public List getStrategiesName() { - return new ArrayList(this.strategyList.getSplitStrategies().keySet()); - } - -} diff --git a/SplitWiseImpl/src/com/dataStore/UserDataStore.java b/SplitWiseImpl/src/com/dataStore/UserDataStore.java deleted file mode 100644 index 56a3753f..00000000 --- a/SplitWiseImpl/src/com/dataStore/UserDataStore.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.dataStore; - -import java.util.HashMap; - -import com.interfaces.IUserDataStore; - -public class UserDataStore implements IUserDataStore { - HashMap userDetailMap = new HashMap(); - @Override - public UserDetails getUserDetails(String userId) { - // TODO Auto-generated method stub - return this.userDetailMap.get(userId); - } - - @Override - public boolean addNewUser(UserDetails userDetails) { - if (userDetails != null && userDetails.getUserId() != null && !userDetails.getUserId().equals("")) { - this.userDetailMap.put(userDetails.getUserId(), userDetails); - - return true; - } - - return false; - } - - @Override - public boolean deleteUser(String userId) { - if (userId != null && !userId.equals("")) { - this.userDetailMap.remove(userId); - - return true; - } - return false; - } - - @Override - public boolean updateUserDetails(String userId, UserDetails userDetails) { - if (userId != null && !userId.equals("") && userDetails != null) { - if (userDetails.getName() != null) { - this.userDetailMap.get(userId).setName(userDetails.getName()); - } - - if (userDetails.getEmail() != null) { - this.userDetailMap.get(userId).setEmail(userDetails.getEmail()); - } - - if (userDetails.getPhoneNumber() != null) { - this.userDetailMap.get(userId).setPhoneNumber(userDetails.getPhoneNumber()); - } - - return true; - } - return false; - } - -} diff --git a/SplitWiseImpl/src/com/dataStore/UserDetails.java b/SplitWiseImpl/src/com/dataStore/UserDetails.java deleted file mode 100644 index 8336fbf8..00000000 --- a/SplitWiseImpl/src/com/dataStore/UserDetails.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.dataStore; - -public class UserDetails { - - String userId; - String name; - - String email; - - String phoneNumber; - - public UserDetails(String userId, String name, String email, String phoneNumber) { - super(); - this.userId = userId; - this.name = name; - this.email = email; - this.phoneNumber = phoneNumber; - } - - - public String getUserId() { - return userId; - } - - public void setUserId(String userId) { - this.userId = userId; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getPhoneNumber() { - return phoneNumber; - } - - public void setPhoneNumber(String phoneNumber) { - this.phoneNumber = phoneNumber; - } - - -} diff --git a/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java b/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java deleted file mode 100644 index 9e00493a..00000000 --- a/SplitWiseImpl/src/com/dataStore/UserPairOwedAmountDataStore.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.dataStore; - -import java.util.HashMap; -import java.util.Iterator; - -import com.interfaces.IUserPairOwedAmountDataStore; -import com.splitObjects.SplitResult; - -public class UserPairOwedAmountDataStore implements IUserPairOwedAmountDataStore { - private HashMap> owedByMap = new HashMap>(); - private HashMap> owesToMap = new HashMap>(); - - - @Override - public boolean updateAmount(String userId1, String userId2, double amount) { - double amountOwed = amount; - if (this.owedByMap.containsKey(userId2) && this.owedByMap.get(userId2).containsKey(userId1)) { - amountOwed = amount - owedByMap.get(userId2).get(userId1); - - if (amountOwed > 0) { - this.owedByMap.get(userId2).put(userId1, amountOwed); - - this.owesToMap.get(userId1).put(userId2, amountOwed); - - return true; - } - - this.owedByMap.get(userId2).remove(userId1); - this.owesToMap.get(userId1).remove(userId2); - } - - - - if (!this.owedByMap.containsKey(userId1)) { - this.owedByMap.put(userId1, new HashMap()); - } - - this.owedByMap.get(userId1).put(userId2, amountOwed); - - if (!owesToMap.containsKey(userId2)) { - this.owesToMap.put(userId2, new HashMap()); - } - - this.owesToMap.get(userId2).put(userId1, amountOwed); - - return true; - } - - @Override - public SplitResult getBalancesForUser(String userId) { - SplitResult result = new SplitResult(); - - result.getOwedBy().put(userId, this.owedByMap.get(userId)); - - result.getOwedTo().put(userId, this.owesToMap.get(userId)); - - return result; - } - - @Override - public SplitResult getBalancesForAllUsers() { - return new SplitResult(owedByMap, owedByMap, null, null); - } - - @Override - public boolean updateAmountForEntries(SplitResult splitResult) { - Iterator it = splitResult.getOwedBy().keySet().iterator(); - while (it.hasNext()) { - String next = it.next(); - - Iterator it1 = splitResult.getOwedBy().get(next).keySet().iterator(); - - while (it1.hasNext()) { - String next1 = it1.next(); - - this.updateAmount(next, next1, splitResult.getOwedBy().get(next).get(next1)); - } - } - - return true; - } - -} diff --git a/SplitWiseImpl/src/com/enums/InputValidationResult.java b/SplitWiseImpl/src/com/enums/InputValidationResult.java deleted file mode 100644 index 00e1d133..00000000 --- a/SplitWiseImpl/src/com/enums/InputValidationResult.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.enums; - -public enum InputValidationResult { - VALID, - WRONG_INPUT_FORMAT, - SUM_NOT_EQUAL_TO_TOTAL_PAID -} diff --git a/SplitWiseImpl/src/com/enums/SplitStrategyType.java b/SplitWiseImpl/src/com/enums/SplitStrategyType.java deleted file mode 100644 index 2792c3f4..00000000 --- a/SplitWiseImpl/src/com/enums/SplitStrategyType.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.enums; - -public enum SplitStrategyType { - EXACT, - EQUAL, - PERCENT -} diff --git a/SplitWiseImpl/src/com/equalDivisionStrategy/EqualDivisionSplitStrategy.java b/SplitWiseImpl/src/com/equalDivisionStrategy/EqualDivisionSplitStrategy.java deleted file mode 100644 index 8748a769..00000000 --- a/SplitWiseImpl/src/com/equalDivisionStrategy/EqualDivisionSplitStrategy.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.equalDivisionStrategy; - -import java.util.HashMap; -import java.util.ListIterator; - -import com.enums.InputValidationResult; -import com.enums.SplitStrategyType; -import com.interfaces.ISplitInput; -import com.interfaces.ISplitStrategy; -import com.splitObjects.SplitResult; - -public class EqualDivisionSplitStrategy implements ISplitStrategy { - - - public EqualDivisionSplitStrategy() { - // TODO Auto-generated constructor stub - } - - @Override - public SplitResult getFinalSplit(ISplitInput splitInput) { - - if (this.verifyInput(splitInput) != InputValidationResult.VALID) { - return null; - } - - EqualStrategySplitInput input; - - input = (EqualStrategySplitInput) splitInput; - - - HashMap> owedByMap = new HashMap>(); - HashMap> owedToMap = new HashMap>(); - HashMap owedMap = new HashMap(); - HashMap owesMap = new HashMap(); - - double amountPerPerson = input.getPaidAmount() / input.getParticipants().size(); - - owedByMap.put(input.getPaidBy(), new HashMap()); - - - ListIterator it = input.getParticipants().listIterator(); - - while (it.hasNext()) { - String next = it.next(); - - if (owedByMap.containsKey(next)) { - continue; - } - - owedByMap.get(input.getPaidBy()).put(next, amountPerPerson); - - if (!owedToMap.containsKey(next)) { - owedToMap.put(next, new HashMap()); - } - - owedToMap.get(next).put(input.getPaidBy(), amountPerPerson); - - owesMap.put(next, amountPerPerson); - - } - - owedMap.put(input.getPaidBy(), amountPerPerson * input.getParticipants().size()); - - return new SplitResult(owedByMap, owedToMap, owedMap, owesMap); - - } - - @Override - public InputValidationResult verifyInput(ISplitInput splitInput) { - try { - EqualStrategySplitInput input; - - input = (EqualStrategySplitInput) splitInput; - - return input != null ? InputValidationResult.VALID : InputValidationResult.WRONG_INPUT_FORMAT; - } catch (Exception e) { - return InputValidationResult.WRONG_INPUT_FORMAT; - } - } - - @Override - public SplitStrategyType getSpliStrategyType() { - // TODO Auto-generated method stub - return SplitStrategyType.EQUAL; - } - - - -} diff --git a/SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategyInutGenerator.java b/SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategyInutGenerator.java deleted file mode 100644 index 914a2fc3..00000000 --- a/SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategyInutGenerator.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.equalDivisionStrategy; - -import java.util.List; - -import com.interfaces.ISplitInput; -import com.splitObjects.SplitInput; -import com.splitObjects.StrategyInputGenerator; - -public class EqualStrategyInutGenerator extends StrategyInputGenerator { - - @Override - public EqualStrategySplitInput generateSplitInput(ISplitInput baseInput, List input, int lastVisitedIndex) { - SplitInput baseInput2 = super.generateSplitInput(baseInput, input, lastVisitedIndex); - - return new EqualStrategySplitInput(baseInput2.getPaidBy(), baseInput2.getParticipants(), baseInput2.getPaidAmount()); - } -} diff --git a/SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategySplitInput.java b/SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategySplitInput.java deleted file mode 100644 index 85b961e2..00000000 --- a/SplitWiseImpl/src/com/equalDivisionStrategy/EqualStrategySplitInput.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.equalDivisionStrategy; - -import java.util.List; - -import com.enums.SplitStrategyType; -import com.splitObjects.SplitInput; - -public class EqualStrategySplitInput extends SplitInput { - - public EqualStrategySplitInput(String paidBy, List participants, double paidAmount) { - super(paidBy, participants, paidAmount); - } - - @Override - public SplitStrategyType getSplitInputType() { - - // TODO Auto-generated method stub - return SplitStrategyType.EQUAL; - } - - - -} diff --git a/SplitWiseImpl/src/com/exactDivisionStrategy/ExactDivisionSplitStrategy.java b/SplitWiseImpl/src/com/exactDivisionStrategy/ExactDivisionSplitStrategy.java deleted file mode 100644 index fa8d8a7b..00000000 --- a/SplitWiseImpl/src/com/exactDivisionStrategy/ExactDivisionSplitStrategy.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.exactDivisionStrategy; - -import java.util.HashMap; -import java.util.Iterator; - -import com.enums.InputValidationResult; -import com.enums.SplitStrategyType; -import com.interfaces.ISplitInput; -import com.interfaces.ISplitStrategy; -import com.splitObjects.SplitResult; - -public class ExactDivisionSplitStrategy implements ISplitStrategy { - - @Override - public InputValidationResult verifyInput(ISplitInput splitInput) { - ExactStrategySplitInput input; - - try { - input = (ExactStrategySplitInput) splitInput; - - double sum = 0.0; - - Iterator it = input.getExactAmountOwedMap().keySet().iterator(); - - while (it.hasNext()) { - sum += input.getExactAmountOwedMap().get(it.next()); - } - - double diff = sum - input.getPaidAmount(); - - if (diff < 0) { - diff *= -1.0; - } - - if (diff > 0.01) { - return InputValidationResult.SUM_NOT_EQUAL_TO_TOTAL_PAID; - } - - return InputValidationResult.VALID; - } catch (Exception e) { - return InputValidationResult.WRONG_INPUT_FORMAT; - } - } - - @Override - public SplitResult getFinalSplit(ISplitInput splitInput) { - if (this.verifyInput(splitInput) != InputValidationResult.VALID) { - return null; - } - - ExactStrategySplitInput input = (ExactStrategySplitInput) splitInput; - - HashMap> owedByMap = new HashMap>(); - HashMap> owedToMap = new HashMap>(); - HashMap owedMap = new HashMap(); - HashMap owesMap = new HashMap(); - - owedByMap.put(input.getPaidBy(), new HashMap()); - - Iterator it = input.getExactAmountOwedMap().keySet().iterator(); - - double sum = 0.0; - - while (it.hasNext()) { - String next = it.next(); - - if (owedByMap.containsKey(next)) { - continue; - } - - owedByMap.get(input.getPaidBy()).put(next, input.getExactAmountOwedMap().get(next)); - - if (!owedToMap.containsKey(next)) { - owedToMap.put(next, new HashMap()); - } - - owedToMap.get(next).put(input.getPaidBy(), input.getExactAmountOwedMap().get(next)); - - owesMap.put(next, input.getExactAmountOwedMap().get(next)); - - sum += input.getExactAmountOwedMap().get(next); - } - - owedMap.put(input.getPaidBy(), sum); - - return new SplitResult(owedByMap, owedToMap, owedMap, owesMap); - } - - @Override - public SplitStrategyType getSpliStrategyType() { - // TODO Auto-generated method stub - return SplitStrategyType.EXACT; - } - -} diff --git a/SplitWiseImpl/src/com/exactDivisionStrategy/ExactStartegyInputGenerator.java b/SplitWiseImpl/src/com/exactDivisionStrategy/ExactStartegyInputGenerator.java deleted file mode 100644 index a4bb846a..00000000 --- a/SplitWiseImpl/src/com/exactDivisionStrategy/ExactStartegyInputGenerator.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.exactDivisionStrategy; - -import java.util.HashMap; -import java.util.List; -import com.interfaces.ISplitInput; -import com.splitObjects.SplitInput; -import com.splitObjects.StrategyInputGenerator; - -public class ExactStartegyInputGenerator extends StrategyInputGenerator { - @Override - public ExactStrategySplitInput generateSplitInput(ISplitInput baseInput, List input, int lastVisitedIndex) { - SplitInput baseInput2 = super.generateSplitInput(baseInput, input, lastVisitedIndex); - - int i = lastVisitedIndex; - i++; - HashMap amountOwedMap = new HashMap(); - - int count = 0; - - while (count < baseInput2.getParticipants().size()) { - - if (i < input.size()) { - amountOwedMap.put(baseInput2.getParticipants().get(count), Double.parseDouble(input.get(i))); - i++; - } else { - amountOwedMap.put(baseInput2.getParticipants().get(count), 0.0); - } - - count++; - } - return new ExactStrategySplitInput(baseInput2.getPaidBy(), baseInput2.getParticipants(), baseInput2.getPaidAmount(), amountOwedMap); - - } -} diff --git a/SplitWiseImpl/src/com/exactDivisionStrategy/ExactStrategySplitInput.java b/SplitWiseImpl/src/com/exactDivisionStrategy/ExactStrategySplitInput.java deleted file mode 100644 index 52c63972..00000000 --- a/SplitWiseImpl/src/com/exactDivisionStrategy/ExactStrategySplitInput.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.exactDivisionStrategy; - -import java.util.HashMap; -import java.util.List; - -import com.enums.SplitStrategyType; -import com.splitObjects.SplitInput; - -public class ExactStrategySplitInput extends SplitInput { - - private HashMap exactAmountOwedMap; - - public ExactStrategySplitInput(String paidBy, List participants, double paidAmount, - HashMap exactAmountOwedMap) { - super(paidBy, participants, paidAmount); - this.exactAmountOwedMap = exactAmountOwedMap; - } - - public HashMap getExactAmountOwedMap() { - return exactAmountOwedMap; - } - - @Override - public SplitStrategyType getSplitInputType() { - - // TODO Auto-generated method stub - return SplitStrategyType.EXACT; - } - - -} diff --git a/SplitWiseImpl/src/com/factory/DataStoreFactory.java b/SplitWiseImpl/src/com/factory/DataStoreFactory.java deleted file mode 100644 index 83c62fb6..00000000 --- a/SplitWiseImpl/src/com/factory/DataStoreFactory.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.factory; - -import com.dataStore.UserDataStore; -import com.dataStore.UserPairOwedAmountDataStore; -import com.interfaces.IDataStoreFactory; -import com.interfaces.IUserDataStore; -import com.interfaces.IUserPairOwedAmountDataStore; - -public class DataStoreFactory implements IDataStoreFactory { - private IUserDataStore userDataStore; - - private IUserPairOwedAmountDataStore userPairOwedAmountDataStore; - @Override - public IUserDataStore getUserDataStore() { - if (userDataStore == null) { - this.userDataStore = new UserDataStore(); - } - return this.userDataStore; - } - - @Override - public IUserPairOwedAmountDataStore getUserPairOwedAmountDataStore() { - if (userPairOwedAmountDataStore == null) { - this.userPairOwedAmountDataStore = new UserPairOwedAmountDataStore(); - } - - return this.userPairOwedAmountDataStore; - } - -} diff --git a/SplitWiseImpl/src/com/factory/StrategyListFactory.java b/SplitWiseImpl/src/com/factory/StrategyListFactory.java deleted file mode 100644 index b3bcaddc..00000000 --- a/SplitWiseImpl/src/com/factory/StrategyListFactory.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.factory; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import com.enums.SplitStrategyType; -import com.equalDivisionStrategy.EqualDivisionSplitStrategy; -import com.exactDivisionStrategy.ExactDivisionSplitStrategy; -import com.interfaces.ISplitStrategy; -import com.interfaces.IStrategyList; -import com.interfaces.IStrategyListFactory; -import com.percentDivisionStrategy.PercentDivisionSplitStrategy; - -public class StrategyListFactory implements IStrategyListFactory { - - public StrategyListFactory() { - this.strategyMap.put(SplitStrategyType.EXACT, new ExactDivisionSplitStrategy()); - this.strategyMap.put(SplitStrategyType.EQUAL, new EqualDivisionSplitStrategy()); - this.strategyMap.put(SplitStrategyType.PERCENT, new PercentDivisionSplitStrategy()); - } - - - - private HashMap strategyMap = new HashMap(); - - - - @Override - public IStrategyList getStrategyList(List strategiesPresent) { - Map result = new LinkedHashMap(); - - Iterator it = strategiesPresent.listIterator(); - - while (it.hasNext()) { - SplitStrategyType next = SplitStrategyType.valueOf(it.next()); - - if (this.strategyMap.containsKey(next)) { - result.put(next, this.strategyMap.get(next)); - } - } - - return new IStrategyList() { - - @Override - public Map getSplitStrategies() { - // TODO Auto-generated method stub - return result; - } - }; - } - -} diff --git a/SplitWiseImpl/src/com/interfaces/IApplication.java b/SplitWiseImpl/src/com/interfaces/IApplication.java deleted file mode 100644 index 9474cd80..00000000 --- a/SplitWiseImpl/src/com/interfaces/IApplication.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.interfaces; - -import java.util.List; - -import com.enums.SplitStrategyType; -import com.splitObjects.SplitResult; - -public interface IApplication { - boolean addExpense(List expenseInput); - - SplitResult getBalanceForUser(String userId); - - SplitResult getAllBalances(); - - List getStrategiesName(); -} diff --git a/SplitWiseImpl/src/com/interfaces/IDataStoreFactory.java b/SplitWiseImpl/src/com/interfaces/IDataStoreFactory.java deleted file mode 100644 index 324faf72..00000000 --- a/SplitWiseImpl/src/com/interfaces/IDataStoreFactory.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.interfaces; - -public interface IDataStoreFactory { - IUserDataStore getUserDataStore(); - - IUserPairOwedAmountDataStore getUserPairOwedAmountDataStore(); -} diff --git a/SplitWiseImpl/src/com/interfaces/IInputReader.java b/SplitWiseImpl/src/com/interfaces/IInputReader.java deleted file mode 100644 index b49eb1fc..00000000 --- a/SplitWiseImpl/src/com/interfaces/IInputReader.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.interfaces; - -import java.util.List; - -public interface IInputReader { - ISplitInput parseInput(List input); -} diff --git a/SplitWiseImpl/src/com/interfaces/ISplitInput.java b/SplitWiseImpl/src/com/interfaces/ISplitInput.java deleted file mode 100644 index 5429949b..00000000 --- a/SplitWiseImpl/src/com/interfaces/ISplitInput.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.interfaces; - -import com.enums.SplitStrategyType; - -public interface ISplitInput { - SplitStrategyType getSplitInputType(); -} diff --git a/SplitWiseImpl/src/com/interfaces/ISplitStrategy.java b/SplitWiseImpl/src/com/interfaces/ISplitStrategy.java deleted file mode 100644 index 418b1b3b..00000000 --- a/SplitWiseImpl/src/com/interfaces/ISplitStrategy.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.interfaces; -import com.enums.InputValidationResult; -import com.enums.SplitStrategyType; -import com.splitObjects.SplitResult; - -public interface ISplitStrategy { - InputValidationResult verifyInput(ISplitInput splitInput); - SplitResult getFinalSplit(ISplitInput splitInput); - SplitStrategyType getSpliStrategyType(); -} diff --git a/SplitWiseImpl/src/com/interfaces/IStrategyInputGenerator.java b/SplitWiseImpl/src/com/interfaces/IStrategyInputGenerator.java deleted file mode 100644 index e85bd127..00000000 --- a/SplitWiseImpl/src/com/interfaces/IStrategyInputGenerator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.interfaces; - -import java.util.List; - -public interface IStrategyInputGenerator { - ISplitInput generateSplitInput(ISplitInput baseInput, List input, int lastVisitedIndex); -} diff --git a/SplitWiseImpl/src/com/interfaces/IStrategyList.java b/SplitWiseImpl/src/com/interfaces/IStrategyList.java deleted file mode 100644 index 0db80a36..00000000 --- a/SplitWiseImpl/src/com/interfaces/IStrategyList.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.interfaces; - -import java.util.Map; - -import com.enums.SplitStrategyType; - -public interface IStrategyList { - Map getSplitStrategies(); -} diff --git a/SplitWiseImpl/src/com/interfaces/IStrategyListFactory.java b/SplitWiseImpl/src/com/interfaces/IStrategyListFactory.java deleted file mode 100644 index c5bcd10e..00000000 --- a/SplitWiseImpl/src/com/interfaces/IStrategyListFactory.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.interfaces; - -import java.util.List; - -public interface IStrategyListFactory { - IStrategyList getStrategyList(List strategiesPresent); -} diff --git a/SplitWiseImpl/src/com/interfaces/IUser.java b/SplitWiseImpl/src/com/interfaces/IUser.java deleted file mode 100644 index eb8dc6ba..00000000 --- a/SplitWiseImpl/src/com/interfaces/IUser.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.interfaces; - -import com.dataStore.UserDetails; - -public interface IUser { - UserDetails getUserDetails(String userId); - - boolean updateUserDetails(String userId, UserDetails userDetails); -} diff --git a/SplitWiseImpl/src/com/interfaces/IUserDataStore.java b/SplitWiseImpl/src/com/interfaces/IUserDataStore.java deleted file mode 100644 index 857526c1..00000000 --- a/SplitWiseImpl/src/com/interfaces/IUserDataStore.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.interfaces; - -import com.dataStore.UserDetails; - -public interface IUserDataStore { - UserDetails getUserDetails(String userId); - - boolean addNewUser(UserDetails userDetails); - - boolean deleteUser(String userId); - - boolean updateUserDetails(String userId, UserDetails userDetails); -} diff --git a/SplitWiseImpl/src/com/interfaces/IUserPairOwedAmountDataStore.java b/SplitWiseImpl/src/com/interfaces/IUserPairOwedAmountDataStore.java deleted file mode 100644 index 744d4050..00000000 --- a/SplitWiseImpl/src/com/interfaces/IUserPairOwedAmountDataStore.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.interfaces; - -import com.splitObjects.SplitResult; - -public interface IUserPairOwedAmountDataStore { - boolean updateAmount(String userId1, String userId2, double amount); - - SplitResult getBalancesForUser(String userId); - - SplitResult getBalancesForAllUsers(); - - boolean updateAmountForEntries(SplitResult splitResult); -} diff --git a/SplitWiseImpl/src/com/ioParser/InputReader.java b/SplitWiseImpl/src/com/ioParser/InputReader.java deleted file mode 100644 index c0e79eb1..00000000 --- a/SplitWiseImpl/src/com/ioParser/InputReader.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.ioParser; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import com.enums.SplitStrategyType; -import com.equalDivisionStrategy.EqualStrategyInutGenerator; -import com.exactDivisionStrategy.ExactStartegyInputGenerator; -import com.interfaces.IInputReader; -import com.interfaces.ISplitInput; -import com.interfaces.IStrategyInputGenerator; -import com.percentDivisionStrategy.PercentDivisionInputGenerator; -import com.splitObjects.SplitInput; - -public class InputReader implements IInputReader { - - - HashMap strategyInputGeneratorMap; - - public InputReader() { - this.strategyInputGeneratorMap = new HashMap(); - - this.strategyInputGeneratorMap.put(SplitStrategyType.EQUAL, new EqualStrategyInutGenerator()); - - this.strategyInputGeneratorMap.put(SplitStrategyType.EXACT, new ExactStartegyInputGenerator()); - - this.strategyInputGeneratorMap.put(SplitStrategyType.PERCENT, new PercentDivisionInputGenerator()); - } - - @Override - public ISplitInput parseInput(List input) { - - if (input.size() < 6) { - return null; - } - - - - try { - String userId = input.get(0); - - double amount = Double.parseDouble(input.get(1)); - - int noOfParticipants = Integer.parseInt(input.get(2)); - - List participantList = new ArrayList(); - - int i = 3; - - while (i < 3 + noOfParticipants) { - participantList.add(input.get(i)); - i++; - } - - SplitStrategyType splitStrategyType = SplitStrategyType.valueOf(input.get(i)); - - - return this.strategyInputGeneratorMap.get(splitStrategyType).generateSplitInput(new SplitInput(userId, participantList, amount) { - - @Override - public SplitStrategyType getSplitInputType() { - // TODO Auto-generated method stub - return splitStrategyType; - } - }, input, i); - - } catch (Exception e) { - return null; - } - } - -} diff --git a/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionInputGenerator.java b/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionInputGenerator.java deleted file mode 100644 index 1a37b460..00000000 --- a/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionInputGenerator.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.percentDivisionStrategy; - -import java.util.HashMap; -import java.util.List; -import com.interfaces.ISplitInput; -import com.splitObjects.SplitInput; -import com.splitObjects.StrategyInputGenerator; - -public class PercentDivisionInputGenerator extends StrategyInputGenerator { - @Override - public PercentDivisionSplitInput generateSplitInput(ISplitInput baseInput, List input, int lastVisitedIndex) { - SplitInput baseInput2 = super.generateSplitInput(baseInput, input, lastVisitedIndex); - - int i = lastVisitedIndex; - i++; - HashMap percentOwedMap = new HashMap(); - - int count = 0; - - while (count < baseInput2.getParticipants().size()) { - - if (i < input.size()) { - percentOwedMap.put(baseInput2.getParticipants().get(count), Double.parseDouble(input.get(i))); - i++; - } else { - percentOwedMap.put(baseInput2.getParticipants().get(count), 0.0); - } - - count++; - } - return new PercentDivisionSplitInput(baseInput2.getPaidBy(), baseInput2.getParticipants(), baseInput2.getPaidAmount(), percentOwedMap); - - } -} diff --git a/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitInput.java b/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitInput.java deleted file mode 100644 index b4bfd845..00000000 --- a/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitInput.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.percentDivisionStrategy; - -import java.util.HashMap; -import java.util.List; - -import com.enums.SplitStrategyType; -import com.splitObjects.SplitInput; - -public class PercentDivisionSplitInput extends SplitInput { - private HashMap percentOwedMap; - - public PercentDivisionSplitInput(String paidBy, List participants, double paidAmount, - HashMap percentOwedMap) { - super(paidBy, participants, paidAmount); - this.percentOwedMap = percentOwedMap; - } - - public HashMap getPercentOwedMap() { - return percentOwedMap; - } - - @Override - public SplitStrategyType getSplitInputType() { - - return SplitStrategyType.PERCENT; - } -} diff --git a/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitStrategy.java b/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitStrategy.java deleted file mode 100644 index edcd1476..00000000 --- a/SplitWiseImpl/src/com/percentDivisionStrategy/PercentDivisionSplitStrategy.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.percentDivisionStrategy; - -import java.util.HashMap; -import java.util.Iterator; - -import com.enums.InputValidationResult; -import com.enums.SplitStrategyType; -import com.interfaces.ISplitInput; -import com.interfaces.ISplitStrategy; -import com.splitObjects.SplitResult; - -public class PercentDivisionSplitStrategy implements ISplitStrategy { - static public double PERCENTAGE_100 = 100.0; - - @Override - public InputValidationResult verifyInput(ISplitInput splitInput) { - try { - PercentDivisionSplitInput input = (PercentDivisionSplitInput) splitInput; - - Iterator it = input.getPercentOwedMap().keySet().iterator(); - double sum = 0.0; - while (it.hasNext()) { - sum += input.getPercentOwedMap().get(it.next()); - } - - if (sum != PercentDivisionSplitStrategy.PERCENTAGE_100) { - return InputValidationResult.SUM_NOT_EQUAL_TO_TOTAL_PAID; - } - - return InputValidationResult.VALID; - } catch (Exception e) { - return InputValidationResult.WRONG_INPUT_FORMAT; - } - } - - @Override - public SplitResult getFinalSplit(ISplitInput splitInput) { - if (this.verifyInput(splitInput) != InputValidationResult.VALID) { - return null; - } - - PercentDivisionSplitInput input = (PercentDivisionSplitInput) splitInput; - - HashMap> owedByMap = new HashMap>(); - HashMap> owedToMap = new HashMap>(); - HashMap owedMap = new HashMap(); - HashMap owesMap = new HashMap(); - - owedByMap.put(input.getPaidBy(), new HashMap()); - - Iterator it = input.getPercentOwedMap().keySet().iterator(); - - double sum = 0.0; - - while (it.hasNext()) { - String next = it.next(); - - if (owedByMap.containsKey(next)) { - continue; - } - - double amountOwed = (input.getPercentOwedMap().get(next) * input.getPaidAmount()) / 100.0; - - owedByMap.get(input.getPaidBy()).put(next, amountOwed); - - if (!owedToMap.containsKey(next)) { - owedToMap.put(next, new HashMap()); - } - - - owedToMap.get(next).put(input.getPaidBy(), input.getPercentOwedMap().get(next)); - - owesMap.put(next, amountOwed); - - sum += amountOwed; - } - - owedMap.put(input.getPaidBy(), sum); - - return new SplitResult(owedByMap, owedToMap, owedMap, owesMap); - } - - @Override - public SplitStrategyType getSpliStrategyType() { - // TODO Auto-generated method stub - return SplitStrategyType.PERCENT; - } - -} diff --git a/SplitWiseImpl/src/com/splitObjects/SplitInput.java b/SplitWiseImpl/src/com/splitObjects/SplitInput.java deleted file mode 100644 index 9b0c4e97..00000000 --- a/SplitWiseImpl/src/com/splitObjects/SplitInput.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.splitObjects; - -import java.util.List; - -import com.interfaces.ISplitInput; - -public abstract class SplitInput implements ISplitInput { - public SplitInput(String paidBy, List participants, double paidAmount) { - super(); - this.paidBy = paidBy; - this.participants = participants; - this.paidAmount = paidAmount; - } - - private String paidBy; - - private List participants; - - private double paidAmount; - - - - public String getPaidBy() { - return paidBy; - } - - public double getPaidAmount() { - return paidAmount; - } - - public void setPaidAmount(double paidAmount) { - this.paidAmount = paidAmount; - } - - public void setPaidBy(String paidBy) { - this.paidBy = paidBy; - } - - public List getParticipants() { - return participants; - } - - public void setParticipants(List participants) { - this.participants = participants; - } - - -} diff --git a/SplitWiseImpl/src/com/splitObjects/SplitResult.java b/SplitWiseImpl/src/com/splitObjects/SplitResult.java deleted file mode 100644 index b68ae4ee..00000000 --- a/SplitWiseImpl/src/com/splitObjects/SplitResult.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.splitObjects; - -import java.util.HashMap; - -public class SplitResult { - HashMap> owedBy; - HashMap> owedTo; - HashMap owedMap; - HashMap owesMap; - - - - public SplitResult() { - super(); - this.owedBy = new HashMap>(); - this.owedTo = new HashMap>(); - this.owedMap = new HashMap(); - this.owesMap = new HashMap(); - } - - public SplitResult(HashMap> owedBy, HashMap> owedTo, - HashMap owedMap, HashMap owesMap) { - super(); - this.owedBy = owedBy; - this.owedTo = owedTo; - this.owedMap = owedMap; - this.owesMap = owesMap; - } - - public HashMap> getOwedBy() { - return owedBy; - } - public HashMap> getOwedTo() { - return owedTo; - } -} diff --git a/SplitWiseImpl/src/com/splitObjects/StrategyInputGenerator.java b/SplitWiseImpl/src/com/splitObjects/StrategyInputGenerator.java deleted file mode 100644 index 7c17ae4c..00000000 --- a/SplitWiseImpl/src/com/splitObjects/StrategyInputGenerator.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.splitObjects; - -import java.util.List; - -import com.interfaces.ISplitInput; -import com.interfaces.IStrategyInputGenerator; - -public abstract class StrategyInputGenerator implements IStrategyInputGenerator { - - @Override - public SplitInput generateSplitInput(ISplitInput baseInput, List input, int lastVisitedIndex) { - try { - return (SplitInput) baseInput; - } catch (Exception e) { - return null; - } - } - -} diff --git a/SplitWiseImpl/src/module-info.java b/SplitWiseImpl/src/module-info.java deleted file mode 100644 index 7839cd4b..00000000 --- a/SplitWiseImpl/src/module-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * - */ -/** - * - */ -module SplitwiseImpl { -} \ No newline at end of file From a6c4ac096eac8e3f3012c77f197366cabd7ade39 Mon Sep 17 00:00:00 2001 From: Anant Akash Date: Mon, 14 Apr 2025 00:19:15 +0530 Subject: [PATCH 16/19] In memory data store implementation --- InMemoryImpl/.gitignore | 1 + .../com/attribute/AttributeKeyValueMap.java | 108 +++++++++++++++ .../src/com/attribute/ValueAttribute.java | 78 +++++++++++ .../interfaces/IAttributeKeyValueMap.java | 18 +++ .../attribute/interfaces/IValueAttribute.java | 13 ++ .../BooleanAttributeKeyValueMap.java | 28 ++++ .../DoubleAttributeKeyValueMap.java | 27 ++++ .../IntegerAttributeKeyValueMap.java | 31 +++++ .../StringAttributekeyValueMap.java | 18 +++ InMemoryImpl/src/com/commonClasses/Pair.java | 22 +++ .../DataFormatIncorrectException.java | 18 +++ .../AttributeKeyValueMapFactory.java | 39 ++++++ .../IAttributeKeyValueMapFactory.java | 7 + .../src/com/keyvalueStore/KeyValueStore.java | 50 +++++++ .../interfaces/IKeyValueStore.java | 21 +++ InMemoryImpl/src/com/main/Main.java | 34 +++++ InMemoryImpl/src/com/map/KeyValueMap.java | 126 ++++++++++++++++++ .../src/com/map/interfaces/IKeyValueMap.java | 19 +++ InMemoryImpl/src/module-info.java | 9 ++ 19 files changed, 667 insertions(+) create mode 100644 InMemoryImpl/.gitignore create mode 100644 InMemoryImpl/src/com/attribute/AttributeKeyValueMap.java create mode 100644 InMemoryImpl/src/com/attribute/ValueAttribute.java create mode 100644 InMemoryImpl/src/com/attribute/interfaces/IAttributeKeyValueMap.java create mode 100644 InMemoryImpl/src/com/attribute/interfaces/IValueAttribute.java create mode 100644 InMemoryImpl/src/com/attribute/typeClasses/BooleanAttributeKeyValueMap.java create mode 100644 InMemoryImpl/src/com/attribute/typeClasses/DoubleAttributeKeyValueMap.java create mode 100644 InMemoryImpl/src/com/attribute/typeClasses/IntegerAttributeKeyValueMap.java create mode 100644 InMemoryImpl/src/com/attribute/typeClasses/StringAttributekeyValueMap.java create mode 100644 InMemoryImpl/src/com/commonClasses/Pair.java create mode 100644 InMemoryImpl/src/com/exceptions/DataFormatIncorrectException.java create mode 100644 InMemoryImpl/src/com/factories/AttributeKeyValueMapFactory.java create mode 100644 InMemoryImpl/src/com/factories/interfaces/IAttributeKeyValueMapFactory.java create mode 100644 InMemoryImpl/src/com/keyvalueStore/KeyValueStore.java create mode 100644 InMemoryImpl/src/com/keyvalueStore/interfaces/IKeyValueStore.java create mode 100644 InMemoryImpl/src/com/main/Main.java create mode 100644 InMemoryImpl/src/com/map/KeyValueMap.java create mode 100644 InMemoryImpl/src/com/map/interfaces/IKeyValueMap.java create mode 100644 InMemoryImpl/src/module-info.java diff --git a/InMemoryImpl/.gitignore b/InMemoryImpl/.gitignore new file mode 100644 index 00000000..ae3c1726 --- /dev/null +++ b/InMemoryImpl/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/InMemoryImpl/src/com/attribute/AttributeKeyValueMap.java b/InMemoryImpl/src/com/attribute/AttributeKeyValueMap.java new file mode 100644 index 00000000..8b770d8a --- /dev/null +++ b/InMemoryImpl/src/com/attribute/AttributeKeyValueMap.java @@ -0,0 +1,108 @@ +package com.attribute; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; + +import com.attribute.interfaces.IAttributeKeyValueMap; +import com.exceptions.DataFormatIncorrectException; + +public abstract class AttributeKeyValueMap implements IAttributeKeyValueMap { + + private HashMap keyValueMap; + + private HashMap> valueKeyMap; + + + + public AttributeKeyValueMap() { + this.keyValueMap = new HashMap<>(); + this.valueKeyMap = new HashMap>(); + } + + protected abstract T getValueAsT(String value) throws DataFormatIncorrectException; + + @Override + public abstract boolean isValidType(String value); + + @Override + public String get(String key) { + if (!keyValueMap.containsKey(key)) { + + } + return this.getValueAsString(this.keyValueMap.get(key)); + } + + @Override + public void put(String key, String value) throws DataFormatIncorrectException { + if (!isValidType(value)) { + throw new DataFormatIncorrectException(); + } + this.keyValueMap.put(key, this.getValueAsT(value)); + + if (!this.valueKeyMap.containsKey(this.getValueAsT(value))) { + this.valueKeyMap.put(this.getValueAsT(value), new HashSet()); + } + + this.valueKeyMap.get(this.getValueAsT(value)).add(key); + + } + + @Override + public boolean containsKey(String key) { + if (this.keyValueMap.containsKey(key)) { + return true; + } + + return false; + } + + + + @Override + public List getkeysWithValues(String value) throws DataFormatIncorrectException { + + if (!this.isValidType(value)) { + return new ArrayList(); + } + + List result = new ArrayList(); + + if (!this.valueKeyMap.containsKey(this.getValueAsT(value))) { + return new ArrayList(); + } + + Iterator it = this.valueKeyMap.get(getValueAsT(value)).iterator(); + + while (it.hasNext()) { + result.add(it.next()); + } + + return result; + } + + + + @Override + public void deleteKey(String key) { + if (!this.keyValueMap.containsKey(key)) { + return; + } + + } + + + + + @Override + public String toString() { + return "AttributeKeyValueMap [keyValueMap=" + keyValueMap + ", valueKeyMap=" + valueKeyMap + "]"; + } + + protected String getValueAsString(T obj) { + return obj.toString(); + } + +} diff --git a/InMemoryImpl/src/com/attribute/ValueAttribute.java b/InMemoryImpl/src/com/attribute/ValueAttribute.java new file mode 100644 index 00000000..8a2f564f --- /dev/null +++ b/InMemoryImpl/src/com/attribute/ValueAttribute.java @@ -0,0 +1,78 @@ +package com.attribute; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import com.attribute.interfaces.IValueAttribute; +import com.commonClasses.Pair; + +public class ValueAttribute implements IValueAttribute { + + HashMap attributeKeyValueMap; + + public ValueAttribute() { + this.attributeKeyValueMap = new HashMap(); + } + + public ValueAttribute(List> attributekeyValueList) { + this(); + Iterator> it = attributekeyValueList.listIterator(); + + while (it.hasNext()) { + Pair next = it.next(); + this.attributeKeyValueMap.put(next.getKey(), next.getValue()); + } + } + + @Override + public void setAttribute(String key, String value) { + this.attributeKeyValueMap.put(key, value); + + } + + @Override + public String getAttribute(String key) { + return this.attributeKeyValueMap.get(key); + } + + @Override + public List getAttributeKeys() { + List attributeKeys = new ArrayList(); + + Iterator it = this.attributeKeyValueMap.keySet().iterator(); + + while (it.hasNext()) { + attributeKeys.add(it.next()); + } + + return attributeKeys; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + + Iterator it = this.attributeKeyValueMap.keySet().iterator(); + + while (it.hasNext()) { + String next = it.next(); + + String value = this.attributeKeyValueMap.get(next); + + sb.append(next); + sb.append(": "); + sb.append(value); + + if (it.hasNext()) { + sb.append(", "); + } + } + + return sb.toString(); + } + + + +} diff --git a/InMemoryImpl/src/com/attribute/interfaces/IAttributeKeyValueMap.java b/InMemoryImpl/src/com/attribute/interfaces/IAttributeKeyValueMap.java new file mode 100644 index 00000000..7e2b4a74 --- /dev/null +++ b/InMemoryImpl/src/com/attribute/interfaces/IAttributeKeyValueMap.java @@ -0,0 +1,18 @@ +package com.attribute.interfaces; + +import java.util.List; + +import com.exceptions.DataFormatIncorrectException; + +public interface IAttributeKeyValueMap { + String get(String key); + void put(String key, String value) throws DataFormatIncorrectException; + + boolean containsKey(String key); + + boolean isValidType(String value); + + List getkeysWithValues(String value) throws DataFormatIncorrectException; + + void deleteKey(String key); + } diff --git a/InMemoryImpl/src/com/attribute/interfaces/IValueAttribute.java b/InMemoryImpl/src/com/attribute/interfaces/IValueAttribute.java new file mode 100644 index 00000000..0f945725 --- /dev/null +++ b/InMemoryImpl/src/com/attribute/interfaces/IValueAttribute.java @@ -0,0 +1,13 @@ +package com.attribute.interfaces; + +import java.util.List; + +public interface IValueAttribute { + String toString(); + + void setAttribute(K key, V value); + + String getAttribute(K key); + + List getAttributeKeys(); +} diff --git a/InMemoryImpl/src/com/attribute/typeClasses/BooleanAttributeKeyValueMap.java b/InMemoryImpl/src/com/attribute/typeClasses/BooleanAttributeKeyValueMap.java new file mode 100644 index 00000000..43423b9f --- /dev/null +++ b/InMemoryImpl/src/com/attribute/typeClasses/BooleanAttributeKeyValueMap.java @@ -0,0 +1,28 @@ +package com.attribute.typeClasses; + +import com.attribute.AttributeKeyValueMap; +import com.exceptions.DataFormatIncorrectException; + +public class BooleanAttributeKeyValueMap extends AttributeKeyValueMap { + + @Override + protected Boolean getValueAsT(String value) throws DataFormatIncorrectException { + try { + return Boolean.parseBoolean(value); + } catch (Exception e) { + throw new DataFormatIncorrectException(); + } + } + + @Override + public boolean isValidType(String value) { + try { + Boolean.parseBoolean(value); + + return true; + } catch (Exception e) { + return false; + } + } + +} diff --git a/InMemoryImpl/src/com/attribute/typeClasses/DoubleAttributeKeyValueMap.java b/InMemoryImpl/src/com/attribute/typeClasses/DoubleAttributeKeyValueMap.java new file mode 100644 index 00000000..9a071df3 --- /dev/null +++ b/InMemoryImpl/src/com/attribute/typeClasses/DoubleAttributeKeyValueMap.java @@ -0,0 +1,27 @@ +package com.attribute.typeClasses; + +import com.attribute.AttributeKeyValueMap; +import com.exceptions.DataFormatIncorrectException; + +public class DoubleAttributeKeyValueMap extends AttributeKeyValueMap { + + @Override + protected Double getValueAsT(String value) throws DataFormatIncorrectException { + try { + return Double.parseDouble(value); + } catch (Exception e) { + throw new DataFormatIncorrectException(); + } + } + + @Override + public boolean isValidType(String value) { + try { + Double.parseDouble(value); + return true; + } catch (Exception e) { + return false; + } + } + +} diff --git a/InMemoryImpl/src/com/attribute/typeClasses/IntegerAttributeKeyValueMap.java b/InMemoryImpl/src/com/attribute/typeClasses/IntegerAttributeKeyValueMap.java new file mode 100644 index 00000000..e44db3e8 --- /dev/null +++ b/InMemoryImpl/src/com/attribute/typeClasses/IntegerAttributeKeyValueMap.java @@ -0,0 +1,31 @@ +package com.attribute.typeClasses; + + +import com.attribute.AttributeKeyValueMap; +import com.exceptions.DataFormatIncorrectException; + +public class IntegerAttributeKeyValueMap extends AttributeKeyValueMap { + + @Override + protected Integer getValueAsT(String value) throws DataFormatIncorrectException { + + try { + return Integer.parseInt(value); + } catch (Exception e) { + throw new DataFormatIncorrectException(); + } + } + + @Override + public boolean isValidType(String value) { + try { + + Integer.parseInt(value); + + return true; + + } catch (Exception e) { + return false; + } + } +} diff --git a/InMemoryImpl/src/com/attribute/typeClasses/StringAttributekeyValueMap.java b/InMemoryImpl/src/com/attribute/typeClasses/StringAttributekeyValueMap.java new file mode 100644 index 00000000..beb1d46e --- /dev/null +++ b/InMemoryImpl/src/com/attribute/typeClasses/StringAttributekeyValueMap.java @@ -0,0 +1,18 @@ +package com.attribute.typeClasses; + +import com.attribute.AttributeKeyValueMap; +import com.exceptions.DataFormatIncorrectException; + +public class StringAttributekeyValueMap extends AttributeKeyValueMap { + + @Override + protected String getValueAsT(String value) throws DataFormatIncorrectException { + return value; + } + + @Override + public boolean isValidType(String value) { + return true; + } + +} diff --git a/InMemoryImpl/src/com/commonClasses/Pair.java b/InMemoryImpl/src/com/commonClasses/Pair.java new file mode 100644 index 00000000..fad95571 --- /dev/null +++ b/InMemoryImpl/src/com/commonClasses/Pair.java @@ -0,0 +1,22 @@ +package com.commonClasses; + +public class Pair { + private K key; + + private V value; + + public Pair(K key, V value) { + this.key = key; + this.value = value; + } + + public K getKey() { + return key; + } + + public V getValue() { + return value; + } + + +} diff --git a/InMemoryImpl/src/com/exceptions/DataFormatIncorrectException.java b/InMemoryImpl/src/com/exceptions/DataFormatIncorrectException.java new file mode 100644 index 00000000..a44424d0 --- /dev/null +++ b/InMemoryImpl/src/com/exceptions/DataFormatIncorrectException.java @@ -0,0 +1,18 @@ +package com.exceptions; + +public class DataFormatIncorrectException extends Exception { + + /** + * + */ + private static final long serialVersionUID = 1L; + + @Override + public String getMessage() { + // TODO Auto-generated method stub + return "DATA TYPE INCORRECT"; + } + + + +} diff --git a/InMemoryImpl/src/com/factories/AttributeKeyValueMapFactory.java b/InMemoryImpl/src/com/factories/AttributeKeyValueMapFactory.java new file mode 100644 index 00000000..a7eed264 --- /dev/null +++ b/InMemoryImpl/src/com/factories/AttributeKeyValueMapFactory.java @@ -0,0 +1,39 @@ +package com.factories; + +import com.attribute.interfaces.IAttributeKeyValueMap; +import com.attribute.typeClasses.BooleanAttributeKeyValueMap; +import com.attribute.typeClasses.DoubleAttributeKeyValueMap; +import com.attribute.typeClasses.IntegerAttributeKeyValueMap; +import com.attribute.typeClasses.StringAttributekeyValueMap; +import com.factories.interfaces.IAttributeKeyValueMapFactory; + +public class AttributeKeyValueMapFactory implements IAttributeKeyValueMapFactory { + + @Override + public IAttributeKeyValueMap createAttributeKeyValueMap(String value) { + try { + Integer.parseInt(value); + + return new IntegerAttributeKeyValueMap(); + } catch (Exception e) { + // do nothing + } + + try { + Double.parseDouble(value); + + return new DoubleAttributeKeyValueMap(); + } catch (Exception e) { + // Do nothing + } + + try { + Boolean.parseBoolean(value); + + return new BooleanAttributeKeyValueMap(); + } catch (Exception e) { + return new StringAttributekeyValueMap(); + } + } + +} diff --git a/InMemoryImpl/src/com/factories/interfaces/IAttributeKeyValueMapFactory.java b/InMemoryImpl/src/com/factories/interfaces/IAttributeKeyValueMapFactory.java new file mode 100644 index 00000000..c2069573 --- /dev/null +++ b/InMemoryImpl/src/com/factories/interfaces/IAttributeKeyValueMapFactory.java @@ -0,0 +1,7 @@ +package com.factories.interfaces; + +import com.attribute.interfaces.IAttributeKeyValueMap; + +public interface IAttributeKeyValueMapFactory { + IAttributeKeyValueMap createAttributeKeyValueMap(String value); +} diff --git a/InMemoryImpl/src/com/keyvalueStore/KeyValueStore.java b/InMemoryImpl/src/com/keyvalueStore/KeyValueStore.java new file mode 100644 index 00000000..fef60ff5 --- /dev/null +++ b/InMemoryImpl/src/com/keyvalueStore/KeyValueStore.java @@ -0,0 +1,50 @@ +package com.keyvalueStore; + +import java.util.List; + +import com.attribute.ValueAttribute; +import com.attribute.interfaces.IValueAttribute; +import com.commonClasses.Pair; +import com.exceptions.DataFormatIncorrectException; +import com.keyvalueStore.interfaces.IKeyValueStore; +import com.map.interfaces.IKeyValueMap; + +public class KeyValueStore implements IKeyValueStore { + + private IKeyValueMap keyValueMap; + + + + public KeyValueStore(IKeyValueMap keyValueMap) { + this.keyValueMap = keyValueMap; + } + + @Override + public IValueAttribute get(String key) { + return this.keyValueMap.get(key); + } + + @Override + public List search(String attributeKey, String attributeValue) throws DataFormatIncorrectException { + // TODO Auto-generated method stub + return this.keyValueMap.getKeyContainingAttributeKeyValuePair(attributeKey, attributeValue); + } + + @Override + public void put(String key, List> listOfAttributesPair) throws DataFormatIncorrectException { + this.keyValueMap.put(key, new ValueAttribute(listOfAttributesPair)); + } + + @Override + public void delete(String key) { + this.keyValueMap.deleteKey(key); + + } + + @Override + public List keys() { + return this.keyValueMap.getKeys(); + } + + +} diff --git a/InMemoryImpl/src/com/keyvalueStore/interfaces/IKeyValueStore.java b/InMemoryImpl/src/com/keyvalueStore/interfaces/IKeyValueStore.java new file mode 100644 index 00000000..fd1b0840 --- /dev/null +++ b/InMemoryImpl/src/com/keyvalueStore/interfaces/IKeyValueStore.java @@ -0,0 +1,21 @@ +package com.keyvalueStore.interfaces; + +import java.util.List; + +import com.attribute.interfaces.IValueAttribute; +import com.commonClasses.Pair; +import com.exceptions.DataFormatIncorrectException; + + +public interface IKeyValueStore { + + IValueAttribute get(String key); + + List search(String attributeKey, String attributeValue) throws DataFormatIncorrectException; + + void put(String key, List> listOfAttributesPair) throws DataFormatIncorrectException; + + void delete(String key); + + List keys(); +} diff --git a/InMemoryImpl/src/com/main/Main.java b/InMemoryImpl/src/com/main/Main.java new file mode 100644 index 00000000..f5a37256 --- /dev/null +++ b/InMemoryImpl/src/com/main/Main.java @@ -0,0 +1,34 @@ +package com.main; + +import java.util.Arrays; + +import com.commonClasses.Pair; +import com.exceptions.DataFormatIncorrectException; +import com.factories.AttributeKeyValueMapFactory; +import com.keyvalueStore.KeyValueStore; +import com.keyvalueStore.interfaces.IKeyValueStore; +import com.map.KeyValueMap; + +public class Main { + + public static void main(String[] args) throws DataFormatIncorrectException { + IKeyValueStore keyValueStore = new KeyValueStore(new KeyValueMap(new AttributeKeyValueMapFactory())); + + keyValueStore.put("test1", Arrays.asList(new Pair("att1", "123"))); + + System.out.println(keyValueStore.get("test1")); + + System.out.println(keyValueStore.search("att1", "1231")); + + System.out.println(keyValueStore.keys()); + + keyValueStore.delete("test1"); + + System.out.println(keyValueStore.get("test1")); + + keyValueStore.put("test1", Arrays.asList(new Pair("att1", "123"))); + + keyValueStore.put("test2", Arrays.asList(new Pair("att1", "123a"))); + } + +} diff --git a/InMemoryImpl/src/com/map/KeyValueMap.java b/InMemoryImpl/src/com/map/KeyValueMap.java new file mode 100644 index 00000000..a69eb4cc --- /dev/null +++ b/InMemoryImpl/src/com/map/KeyValueMap.java @@ -0,0 +1,126 @@ +package com.map; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import com.attribute.ValueAttribute; +import com.attribute.interfaces.IAttributeKeyValueMap; +import com.attribute.interfaces.IValueAttribute; +import com.exceptions.DataFormatIncorrectException; +import com.factories.interfaces.IAttributeKeyValueMapFactory; +import com.map.interfaces.IKeyValueMap; + +public class KeyValueMap implements IKeyValueMap { + + private HashMap attributeMap; + + private HashMap> keyAttributeMap; + + private IAttributeKeyValueMapFactory attributeKeyValueMapFactory; + + + + public KeyValueMap(IAttributeKeyValueMapFactory attributeKeyValueMapFactory) { + this.attributeKeyValueMapFactory = attributeKeyValueMapFactory; + this.attributeMap = new HashMap(); + + this.keyAttributeMap = new HashMap>(); + } + + @Override + public IValueAttribute get(String key) { + IValueAttribute value = new ValueAttribute(); + + if (!this.keyAttributeMap.containsKey(key)) { + return null; + } + + List attributeList = this.keyAttributeMap.get(key); + + Iterator it = attributeList.listIterator(); + + while (it.hasNext()) { + String next = it.next(); + + value.setAttribute(next, this.attributeMap.get(next).get(key).toString()); + } + + return value; + } + + @Override + public void put(String key, IValueAttribute value) throws DataFormatIncorrectException { + if (this.keyAttributeMap.containsKey(key)) { + this.deleteKey(key); + } + + List attributeList = new ArrayList(); + + Iterator it = value.getAttributeKeys().listIterator(); + + while (it.hasNext()) { + String attkey = it.next(); + + String attValue = value.getAttribute(attkey); + + if (!attributeMap.containsKey(attkey)) { + this.attributeMap.put(attkey, attributeKeyValueMapFactory.createAttributeKeyValueMap(attValue)); + } + + this.attributeMap.get(attkey).put(key, attValue); + + attributeList.add(attkey); + } + + this.keyAttributeMap.put(key, attributeList); + + System.out.println(this.attributeMap + " " + this.attributeMap.get("att1").get(key)); + + } + + @Override + public List getKeyContainingAttributeKeyValuePair(String attribute, String value) throws DataFormatIncorrectException { + + if (!this.attributeMap.containsKey(attribute)) { + return new ArrayList(); + } + return this.attributeMap.get(attribute).getkeysWithValues(value); + } + + @Override + public List getKeys() { + List keys = new ArrayList(); + + Iterator it = this.keyAttributeMap.keySet().iterator(); + + while (it.hasNext()) { + keys.add(it.next()); + } + + return keys; + } + + @Override + public void deleteKey(String key) { + if (!this.keyAttributeMap.containsKey(key)) { + return; + } + + Iterator it = this.keyAttributeMap.get(key).listIterator(); + + while (it.hasNext()) { + String attribute = it.next(); + + + this.attributeMap.get(attribute).deleteKey(key); + + } + + this.keyAttributeMap.remove(key); + + return; + } + +} diff --git a/InMemoryImpl/src/com/map/interfaces/IKeyValueMap.java b/InMemoryImpl/src/com/map/interfaces/IKeyValueMap.java new file mode 100644 index 00000000..75f7d2e7 --- /dev/null +++ b/InMemoryImpl/src/com/map/interfaces/IKeyValueMap.java @@ -0,0 +1,19 @@ +package com.map.interfaces; + +import java.util.List; + +import com.attribute.interfaces.IValueAttribute; +import com.exceptions.DataFormatIncorrectException; + +public interface IKeyValueMap { + IValueAttribute get(String key); + + void put(String key, IValueAttribute value) throws DataFormatIncorrectException; + + List getKeyContainingAttributeKeyValuePair(String attribute, String value) throws DataFormatIncorrectException; + + List getKeys(); + + void deleteKey(String key); + +} diff --git a/InMemoryImpl/src/module-info.java b/InMemoryImpl/src/module-info.java new file mode 100644 index 00000000..2913a884 --- /dev/null +++ b/InMemoryImpl/src/module-info.java @@ -0,0 +1,9 @@ +/** + * + */ +/** + * + */ +module InMemoryKeyvalueStore { + +} \ No newline at end of file From 5cbb149e3184ad345f14752393937b927cb3f8df Mon Sep 17 00:00:00 2001 From: Anant Akash Date: Mon, 14 Apr 2025 00:20:39 +0530 Subject: [PATCH 17/19] In memory data store implementation --- SplitWiseImpl/Jar_File/SplitWise.jar | Bin 39699 -> 0 bytes SplitWiseImpl/Jar_File/Splitwise.sh | 1 - .../src/com/main/CommandLineMain.java | 37 ------------------ 3 files changed, 38 deletions(-) delete mode 100644 SplitWiseImpl/Jar_File/SplitWise.jar delete mode 100644 SplitWiseImpl/Jar_File/Splitwise.sh delete mode 100644 SplitWiseImpl/src/com/main/CommandLineMain.java diff --git a/SplitWiseImpl/Jar_File/SplitWise.jar b/SplitWiseImpl/Jar_File/SplitWise.jar deleted file mode 100644 index 187008eafb775c18168bec97b3bb04f27beb7171..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39699 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 KKRe*&xBmxk&1)V2 diff --git a/SplitWiseImpl/Jar_File/Splitwise.sh b/SplitWiseImpl/Jar_File/Splitwise.sh deleted file mode 100644 index c6ff1acc..00000000 --- a/SplitWiseImpl/Jar_File/Splitwise.sh +++ /dev/null @@ -1 +0,0 @@ -java -cp Splitwise.jar com.main.CommandLineMain diff --git a/SplitWiseImpl/src/com/main/CommandLineMain.java b/SplitWiseImpl/src/com/main/CommandLineMain.java deleted file mode 100644 index 4445b6d2..00000000 --- a/SplitWiseImpl/src/com/main/CommandLineMain.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.main; - -import java.util.Scanner; - -import com.application.ApplicationInterface; -import com.factory.DataStoreFactory; -import com.factory.StrategyListFactory; -import com.interfaces.IApplicationInterface; -import com.ioParser.InputReader; -import com.ioParser.ResultFormatter; -import com.user.UserDetails; - -public class CommandLineMain { - - public static void main(String[] args) { - Scanner sc = new Scanner(System.in); - - IApplicationInterface applicationInterface = new ApplicationInterface(new DataStoreFactory(), new StrategyListFactory(), new ResultFormatter(), new InputReader()); - applicationInterface.addNewUser(new UserDetails("u1", "user 1", "user1@gmail.com", "11111")); - applicationInterface.addNewUser(new UserDetails("u2", "user 2", "user2@gmail.com", "22222")); - applicationInterface.addNewUser(new UserDetails("u3", "user 3", "user3@gmail.com", "33333")); - applicationInterface.addNewUser(new UserDetails("u4", "user 4", "user4@gmail.com", "44444")); - - applicationInterface.instantiateApplication(); - while (true) { - String next = sc.nextLine(); - if (next.equals("")) { - break; - } - applicationInterface.runInputString(next).stream().forEach(s -> { - System.out.println(s); - }); - } - - } - -} From 7e26ea6d67bf4d3cd93b0ad345e0fdec8291edbc Mon Sep 17 00:00:00 2001 From: Anant Akash Date: Mon, 14 Apr 2025 21:50:42 +0530 Subject: [PATCH 18/19] Adding new changes --- .../com/attribute/AttributeKeyValueMap.java | 50 ++++--- .../src/com/attribute/ValueAttribute.java | 28 ++-- .../interfaces/IAttributeKeyValueMap.java | 14 +- .../attribute/interfaces/IValueAttribute.java | 2 +- .../BooleanAttributeKeyValueMap.java | 10 +- .../DoubleAttributeKeyValueMap.java | 17 ++- .../IntegerAttributeKeyValueMap.java | 10 +- .../StringAttributekeyValueMap.java | 8 +- InMemoryImpl/src/com/enums/Operations.java | 10 ++ .../DataFormatIncorrectException.java | 2 +- .../InputFormatIncorrectException.java | 17 +++ .../exceptions/KeyValueStoreException.java | 10 ++ .../AttributeKeyValueMapFactory.java | 16 +-- .../src/com/factories/KeyValueMapFactory.java | 14 ++ .../IAttributeKeyValueMapFactory.java | 2 +- .../interfaces/IKeyValueMapFactory.java | 7 + .../src/com/ioParser/InputFormatter.java | 61 ++++++++ .../src/com/ioParser/ResultFormatter.java | 41 ++++++ .../ioParser/interfaces/IInputFormatter.java | 16 +++ .../ioParser/interfaces/IResultFormatter.java | 10 ++ .../src/com/keyvalueStore/KeyValueStore.java | 25 ++-- .../keyvalueStore/KeyValueStoreInterface.java | 135 ++++++++++++++++++ .../interfaces/IKeyValueStore.java | 12 +- .../interfaces/IKeyValueStoreInterface.java | 8 ++ InMemoryImpl/src/com/main/InterfaceMain.java | 52 +++++++ InMemoryImpl/src/com/main/Main.java | 13 +- InMemoryImpl/src/com/map/KeyValueMap.java | 50 ++++--- .../src/com/map/interfaces/IKeyValueMap.java | 12 +- 28 files changed, 525 insertions(+), 127 deletions(-) create mode 100644 InMemoryImpl/src/com/enums/Operations.java create mode 100644 InMemoryImpl/src/com/exceptions/InputFormatIncorrectException.java create mode 100644 InMemoryImpl/src/com/exceptions/KeyValueStoreException.java create mode 100644 InMemoryImpl/src/com/factories/KeyValueMapFactory.java create mode 100644 InMemoryImpl/src/com/factories/interfaces/IKeyValueMapFactory.java create mode 100644 InMemoryImpl/src/com/ioParser/InputFormatter.java create mode 100644 InMemoryImpl/src/com/ioParser/ResultFormatter.java create mode 100644 InMemoryImpl/src/com/ioParser/interfaces/IInputFormatter.java create mode 100644 InMemoryImpl/src/com/ioParser/interfaces/IResultFormatter.java create mode 100644 InMemoryImpl/src/com/keyvalueStore/KeyValueStoreInterface.java create mode 100644 InMemoryImpl/src/com/keyvalueStore/interfaces/IKeyValueStoreInterface.java create mode 100644 InMemoryImpl/src/com/main/InterfaceMain.java diff --git a/InMemoryImpl/src/com/attribute/AttributeKeyValueMap.java b/InMemoryImpl/src/com/attribute/AttributeKeyValueMap.java index 8b770d8a..893ba52d 100644 --- a/InMemoryImpl/src/com/attribute/AttributeKeyValueMap.java +++ b/InMemoryImpl/src/com/attribute/AttributeKeyValueMap.java @@ -9,49 +9,57 @@ import com.attribute.interfaces.IAttributeKeyValueMap; import com.exceptions.DataFormatIncorrectException; -public abstract class AttributeKeyValueMap implements IAttributeKeyValueMap { +public abstract class AttributeKeyValueMap implements IAttributeKeyValueMap +{ - private HashMap keyValueMap; + private HashMap keyValueMap; - private HashMap> valueKeyMap; + private HashMap> valueKeyMap; + + private HashMap tValueMap; public AttributeKeyValueMap() { this.keyValueMap = new HashMap<>(); - this.valueKeyMap = new HashMap>(); + this.valueKeyMap = new HashMap>(); + this.tValueMap = new HashMap(); } - protected abstract T getValueAsT(String value) throws DataFormatIncorrectException; + protected abstract T getValueAsT(Value value) throws DataFormatIncorrectException; @Override - public abstract boolean isValidType(String value); + public abstract boolean isValidType(Value value); @Override - public String get(String key) { + public Value get(Key key) { if (!keyValueMap.containsKey(key)) { } - return this.getValueAsString(this.keyValueMap.get(key)); + return this.getValue(this.keyValueMap.get(key)); } @Override - public void put(String key, String value) throws DataFormatIncorrectException { + public void put(Key key, Value value) throws DataFormatIncorrectException { if (!isValidType(value)) { throw new DataFormatIncorrectException(); } + + if (this.keyValueMap.containsKey(key)) { + this.valueKeyMap.remove(this.keyValueMap.get(key)); + } this.keyValueMap.put(key, this.getValueAsT(value)); if (!this.valueKeyMap.containsKey(this.getValueAsT(value))) { - this.valueKeyMap.put(this.getValueAsT(value), new HashSet()); + this.valueKeyMap.put(this.getValueAsT(value), new HashSet()); } this.valueKeyMap.get(this.getValueAsT(value)).add(key); - + this.tValueMap.put(this.getValueAsT(value), value); } @Override - public boolean containsKey(String key) { + public boolean containsKey(Key key) { if (this.keyValueMap.containsKey(key)) { return true; } @@ -62,19 +70,19 @@ public boolean containsKey(String key) { @Override - public List getkeysWithValues(String value) throws DataFormatIncorrectException { + public List getkeysWithValues(Value value) throws DataFormatIncorrectException { if (!this.isValidType(value)) { - return new ArrayList(); + return new ArrayList(); } - List result = new ArrayList(); + List result = new ArrayList(); if (!this.valueKeyMap.containsKey(this.getValueAsT(value))) { - return new ArrayList(); + return new ArrayList(); } - Iterator it = this.valueKeyMap.get(getValueAsT(value)).iterator(); + Iterator it = this.valueKeyMap.get(getValueAsT(value)).iterator(); while (it.hasNext()) { result.add(it.next()); @@ -86,7 +94,7 @@ public List getkeysWithValues(String value) throws DataFormatIncorrectEx @Override - public void deleteKey(String key) { + public void deleteKey(Key key) { if (!this.keyValueMap.containsKey(key)) { return; } @@ -94,15 +102,13 @@ public void deleteKey(String key) { } - - @Override public String toString() { return "AttributeKeyValueMap [keyValueMap=" + keyValueMap + ", valueKeyMap=" + valueKeyMap + "]"; } - protected String getValueAsString(T obj) { - return obj.toString(); + protected Value getValue(T obj) { + return this.tValueMap.get(obj); } } diff --git a/InMemoryImpl/src/com/attribute/ValueAttribute.java b/InMemoryImpl/src/com/attribute/ValueAttribute.java index 8a2f564f..25e1e081 100644 --- a/InMemoryImpl/src/com/attribute/ValueAttribute.java +++ b/InMemoryImpl/src/com/attribute/ValueAttribute.java @@ -8,40 +8,40 @@ import com.attribute.interfaces.IValueAttribute; import com.commonClasses.Pair; -public class ValueAttribute implements IValueAttribute { +public class ValueAttribute implements IValueAttribute { - HashMap attributeKeyValueMap; + HashMap attributeKeyValueMap; public ValueAttribute() { - this.attributeKeyValueMap = new HashMap(); + this.attributeKeyValueMap = new HashMap(); } - public ValueAttribute(List> attributekeyValueList) { + public ValueAttribute(List> attributekeyValueList) { this(); - Iterator> it = attributekeyValueList.listIterator(); + Iterator> it = attributekeyValueList.listIterator(); while (it.hasNext()) { - Pair next = it.next(); + Pair next = it.next(); this.attributeKeyValueMap.put(next.getKey(), next.getValue()); } } @Override - public void setAttribute(String key, String value) { + public void setAttribute(Key key, Value value) { this.attributeKeyValueMap.put(key, value); } @Override - public String getAttribute(String key) { + public Value getAttribute(Key key) { return this.attributeKeyValueMap.get(key); } @Override - public List getAttributeKeys() { - List attributeKeys = new ArrayList(); + public List getAttributeKeys() { + List attributeKeys = new ArrayList(); - Iterator it = this.attributeKeyValueMap.keySet().iterator(); + Iterator it = this.attributeKeyValueMap.keySet().iterator(); while (it.hasNext()) { attributeKeys.add(it.next()); @@ -54,12 +54,12 @@ public List getAttributeKeys() { public String toString() { StringBuilder sb = new StringBuilder(); - Iterator it = this.attributeKeyValueMap.keySet().iterator(); + Iterator it = this.attributeKeyValueMap.keySet().iterator(); while (it.hasNext()) { - String next = it.next(); + Key next = it.next(); - String value = this.attributeKeyValueMap.get(next); + Value value = this.attributeKeyValueMap.get(next); sb.append(next); sb.append(": "); diff --git a/InMemoryImpl/src/com/attribute/interfaces/IAttributeKeyValueMap.java b/InMemoryImpl/src/com/attribute/interfaces/IAttributeKeyValueMap.java index 7e2b4a74..0a27132a 100644 --- a/InMemoryImpl/src/com/attribute/interfaces/IAttributeKeyValueMap.java +++ b/InMemoryImpl/src/com/attribute/interfaces/IAttributeKeyValueMap.java @@ -4,15 +4,15 @@ import com.exceptions.DataFormatIncorrectException; -public interface IAttributeKeyValueMap { - String get(String key); - void put(String key, String value) throws DataFormatIncorrectException; +public interface IAttributeKeyValueMap { + V get(K key); + void put(K key, V value) throws DataFormatIncorrectException; - boolean containsKey(String key); + boolean containsKey(K key); - boolean isValidType(String value); + boolean isValidType(V value); - List getkeysWithValues(String value) throws DataFormatIncorrectException; + List getkeysWithValues(V value) throws DataFormatIncorrectException; - void deleteKey(String key); + void deleteKey(K key); } diff --git a/InMemoryImpl/src/com/attribute/interfaces/IValueAttribute.java b/InMemoryImpl/src/com/attribute/interfaces/IValueAttribute.java index 0f945725..0519df8d 100644 --- a/InMemoryImpl/src/com/attribute/interfaces/IValueAttribute.java +++ b/InMemoryImpl/src/com/attribute/interfaces/IValueAttribute.java @@ -7,7 +7,7 @@ public interface IValueAttribute { void setAttribute(K key, V value); - String getAttribute(K key); + V getAttribute(K key); List getAttributeKeys(); } diff --git a/InMemoryImpl/src/com/attribute/typeClasses/BooleanAttributeKeyValueMap.java b/InMemoryImpl/src/com/attribute/typeClasses/BooleanAttributeKeyValueMap.java index 43423b9f..b6b4fc0a 100644 --- a/InMemoryImpl/src/com/attribute/typeClasses/BooleanAttributeKeyValueMap.java +++ b/InMemoryImpl/src/com/attribute/typeClasses/BooleanAttributeKeyValueMap.java @@ -3,21 +3,21 @@ import com.attribute.AttributeKeyValueMap; import com.exceptions.DataFormatIncorrectException; -public class BooleanAttributeKeyValueMap extends AttributeKeyValueMap { +public class BooleanAttributeKeyValueMap extends AttributeKeyValueMap { @Override - protected Boolean getValueAsT(String value) throws DataFormatIncorrectException { + protected Boolean getValueAsT(Value value) throws DataFormatIncorrectException { try { - return Boolean.parseBoolean(value); + return Boolean.parseBoolean(value.toString()); } catch (Exception e) { throw new DataFormatIncorrectException(); } } @Override - public boolean isValidType(String value) { + public boolean isValidType(Value value) { try { - Boolean.parseBoolean(value); + Boolean.parseBoolean(value.toString()); return true; } catch (Exception e) { diff --git a/InMemoryImpl/src/com/attribute/typeClasses/DoubleAttributeKeyValueMap.java b/InMemoryImpl/src/com/attribute/typeClasses/DoubleAttributeKeyValueMap.java index 9a071df3..5c65d8e8 100644 --- a/InMemoryImpl/src/com/attribute/typeClasses/DoubleAttributeKeyValueMap.java +++ b/InMemoryImpl/src/com/attribute/typeClasses/DoubleAttributeKeyValueMap.java @@ -3,21 +3,24 @@ import com.attribute.AttributeKeyValueMap; import com.exceptions.DataFormatIncorrectException; -public class DoubleAttributeKeyValueMap extends AttributeKeyValueMap { +public class DoubleAttributeKeyValueMap extends AttributeKeyValueMap { @Override - protected Double getValueAsT(String value) throws DataFormatIncorrectException { - try { - return Double.parseDouble(value); - } catch (Exception e) { + protected Double getValueAsT(Value value) throws DataFormatIncorrectException { + if (!this.isValidType(value)) { throw new DataFormatIncorrectException(); } + + return Double.parseDouble(value.toString()); } @Override - public boolean isValidType(String value) { + public boolean isValidType(Value value) { try { - Double.parseDouble(value); + if (value.toString().indexOf('.') == -1) { + return false; + } + Double.parseDouble(value.toString()); return true; } catch (Exception e) { return false; diff --git a/InMemoryImpl/src/com/attribute/typeClasses/IntegerAttributeKeyValueMap.java b/InMemoryImpl/src/com/attribute/typeClasses/IntegerAttributeKeyValueMap.java index e44db3e8..3394a47c 100644 --- a/InMemoryImpl/src/com/attribute/typeClasses/IntegerAttributeKeyValueMap.java +++ b/InMemoryImpl/src/com/attribute/typeClasses/IntegerAttributeKeyValueMap.java @@ -4,23 +4,23 @@ import com.attribute.AttributeKeyValueMap; import com.exceptions.DataFormatIncorrectException; -public class IntegerAttributeKeyValueMap extends AttributeKeyValueMap { +public class IntegerAttributeKeyValueMap extends AttributeKeyValueMap { @Override - protected Integer getValueAsT(String value) throws DataFormatIncorrectException { + protected Integer getValueAsT(Value value) throws DataFormatIncorrectException { try { - return Integer.parseInt(value); + return Integer.parseInt(value.toString()); } catch (Exception e) { throw new DataFormatIncorrectException(); } } @Override - public boolean isValidType(String value) { + public boolean isValidType(Value value) { try { - Integer.parseInt(value); + Integer.parseInt(value.toString()); return true; diff --git a/InMemoryImpl/src/com/attribute/typeClasses/StringAttributekeyValueMap.java b/InMemoryImpl/src/com/attribute/typeClasses/StringAttributekeyValueMap.java index beb1d46e..abff4abc 100644 --- a/InMemoryImpl/src/com/attribute/typeClasses/StringAttributekeyValueMap.java +++ b/InMemoryImpl/src/com/attribute/typeClasses/StringAttributekeyValueMap.java @@ -3,15 +3,15 @@ import com.attribute.AttributeKeyValueMap; import com.exceptions.DataFormatIncorrectException; -public class StringAttributekeyValueMap extends AttributeKeyValueMap { +public class StringAttributekeyValueMap extends AttributeKeyValueMap { @Override - protected String getValueAsT(String value) throws DataFormatIncorrectException { - return value; + protected String getValueAsT(Value value) throws DataFormatIncorrectException { + return value.toString(); } @Override - public boolean isValidType(String value) { + public boolean isValidType(Value value) { return true; } diff --git a/InMemoryImpl/src/com/enums/Operations.java b/InMemoryImpl/src/com/enums/Operations.java new file mode 100644 index 00000000..a95fea02 --- /dev/null +++ b/InMemoryImpl/src/com/enums/Operations.java @@ -0,0 +1,10 @@ +package com.enums; + +public enum Operations { + PUT, + GET, + KEYS, + DELETE, + SEARCH; + +} diff --git a/InMemoryImpl/src/com/exceptions/DataFormatIncorrectException.java b/InMemoryImpl/src/com/exceptions/DataFormatIncorrectException.java index a44424d0..640c63fa 100644 --- a/InMemoryImpl/src/com/exceptions/DataFormatIncorrectException.java +++ b/InMemoryImpl/src/com/exceptions/DataFormatIncorrectException.java @@ -1,6 +1,6 @@ package com.exceptions; -public class DataFormatIncorrectException extends Exception { +public class DataFormatIncorrectException extends KeyValueStoreException { /** * diff --git a/InMemoryImpl/src/com/exceptions/InputFormatIncorrectException.java b/InMemoryImpl/src/com/exceptions/InputFormatIncorrectException.java new file mode 100644 index 00000000..e9dd5820 --- /dev/null +++ b/InMemoryImpl/src/com/exceptions/InputFormatIncorrectException.java @@ -0,0 +1,17 @@ +package com.exceptions; + +public class InputFormatIncorrectException extends KeyValueStoreException { + + + /** + * + */ + private static final long serialVersionUID = 1L; + + @Override + public String getMessage() { + return "INPUT FORMAT INCORRECT"; + } + + +} diff --git a/InMemoryImpl/src/com/exceptions/KeyValueStoreException.java b/InMemoryImpl/src/com/exceptions/KeyValueStoreException.java new file mode 100644 index 00000000..0fbe2a86 --- /dev/null +++ b/InMemoryImpl/src/com/exceptions/KeyValueStoreException.java @@ -0,0 +1,10 @@ +package com.exceptions; + +public class KeyValueStoreException extends Exception { + + /** + * + */ + private static final long serialVersionUID = 1L; + +} diff --git a/InMemoryImpl/src/com/factories/AttributeKeyValueMapFactory.java b/InMemoryImpl/src/com/factories/AttributeKeyValueMapFactory.java index a7eed264..6d660294 100644 --- a/InMemoryImpl/src/com/factories/AttributeKeyValueMapFactory.java +++ b/InMemoryImpl/src/com/factories/AttributeKeyValueMapFactory.java @@ -10,29 +10,29 @@ public class AttributeKeyValueMapFactory implements IAttributeKeyValueMapFactory { @Override - public IAttributeKeyValueMap createAttributeKeyValueMap(String value) { + public IAttributeKeyValueMap createAttributeKeyValueMap(Value value) { try { - Integer.parseInt(value); + Integer.parseInt(value.toString()); - return new IntegerAttributeKeyValueMap(); + return new IntegerAttributeKeyValueMap(); } catch (Exception e) { // do nothing } try { - Double.parseDouble(value); + Double.parseDouble(value.toString()); - return new DoubleAttributeKeyValueMap(); + return new DoubleAttributeKeyValueMap(); } catch (Exception e) { // Do nothing } try { - Boolean.parseBoolean(value); + Boolean.parseBoolean(value.toString()); - return new BooleanAttributeKeyValueMap(); + return new BooleanAttributeKeyValueMap(); } catch (Exception e) { - return new StringAttributekeyValueMap(); + return new StringAttributekeyValueMap(); } } diff --git a/InMemoryImpl/src/com/factories/KeyValueMapFactory.java b/InMemoryImpl/src/com/factories/KeyValueMapFactory.java new file mode 100644 index 00000000..c9ba073f --- /dev/null +++ b/InMemoryImpl/src/com/factories/KeyValueMapFactory.java @@ -0,0 +1,14 @@ +package com.factories; + +import com.factories.interfaces.IKeyValueMapFactory; +import com.map.KeyValueMap; +import com.map.interfaces.IKeyValueMap; + +public class KeyValueMapFactory implements IKeyValueMapFactory { + + @Override + public IKeyValueMap getKeyValueMap() { + return new KeyValueMap(new AttributeKeyValueMapFactory()); + } + +} diff --git a/InMemoryImpl/src/com/factories/interfaces/IAttributeKeyValueMapFactory.java b/InMemoryImpl/src/com/factories/interfaces/IAttributeKeyValueMapFactory.java index c2069573..6b7308d4 100644 --- a/InMemoryImpl/src/com/factories/interfaces/IAttributeKeyValueMapFactory.java +++ b/InMemoryImpl/src/com/factories/interfaces/IAttributeKeyValueMapFactory.java @@ -3,5 +3,5 @@ import com.attribute.interfaces.IAttributeKeyValueMap; public interface IAttributeKeyValueMapFactory { - IAttributeKeyValueMap createAttributeKeyValueMap(String value); + IAttributeKeyValueMap createAttributeKeyValueMap(V value); } diff --git a/InMemoryImpl/src/com/factories/interfaces/IKeyValueMapFactory.java b/InMemoryImpl/src/com/factories/interfaces/IKeyValueMapFactory.java new file mode 100644 index 00000000..57253fc5 --- /dev/null +++ b/InMemoryImpl/src/com/factories/interfaces/IKeyValueMapFactory.java @@ -0,0 +1,7 @@ +package com.factories.interfaces; + +import com.map.interfaces.IKeyValueMap; + +public interface IKeyValueMapFactory { + IKeyValueMap getKeyValueMap(); +} diff --git a/InMemoryImpl/src/com/ioParser/InputFormatter.java b/InMemoryImpl/src/com/ioParser/InputFormatter.java new file mode 100644 index 00000000..2e638006 --- /dev/null +++ b/InMemoryImpl/src/com/ioParser/InputFormatter.java @@ -0,0 +1,61 @@ +package com.ioParser; + +import java.util.ArrayList; +import java.util.List; + +import com.commonClasses.Pair; +import com.exceptions.InputFormatIncorrectException; +import com.exceptions.KeyValueStoreException; +import com.ioParser.interfaces.IInputFormatter; + +public class InputFormatter implements IInputFormatter { + + @Override + public Pair>> parsePutOperationInput(String[] parts) throws KeyValueStoreException { + if (parts.length < 2 || parts.length % 2 != 0) { + throw new InputFormatIncorrectException(); + } + + String key = parts[1]; + + List> attributeValue = new ArrayList<>(); + + int i = 2; + + while (i < parts.length - 1) { + String att = parts[i]; + + String val = parts[i + 1]; + + attributeValue.add(new Pair(att, val)); + + i += 2; + } + + return new Pair>>(key, attributeValue); + } + + @Override + public Pair parseSearchOperationInput(String[] parts) throws KeyValueStoreException { + if (parts.length < 3) { + throw new InputFormatIncorrectException(); + } + + return new Pair(parts[1], parts[2]); + } + + @Override + public String parseGetOperationInput(String[] parts) throws KeyValueStoreException { + if (parts.length < 2) { + throw new InputFormatIncorrectException(); + } + + return parts[1]; + } + + @Override + public String parseDeleteOperationInput(String[] parts) throws KeyValueStoreException { + return this.parseGetOperationInput(parts); + } + +} diff --git a/InMemoryImpl/src/com/ioParser/ResultFormatter.java b/InMemoryImpl/src/com/ioParser/ResultFormatter.java new file mode 100644 index 00000000..41029be9 --- /dev/null +++ b/InMemoryImpl/src/com/ioParser/ResultFormatter.java @@ -0,0 +1,41 @@ +package com.ioParser; + +import java.util.List; + +import com.attribute.interfaces.IValueAttribute; +import com.ioParser.interfaces.IResultFormatter; + +public class ResultFormatter implements IResultFormatter { + + @Override + public String getResultString(IValueAttribute valueAttribute) { + if (valueAttribute == null) { + return ""; + } + return valueAttribute.toString(); + } + + @Override + public String getResultString(List keys) { + if (keys == null || keys.size() == 0) { + return ""; + } + + StringBuilder sb = new StringBuilder(); + + sb.append(keys.get(0)); + + int i = 1; + + while (i < keys.size()) { + sb.append(","); + + sb.append(keys.get(i)); + + i++; + } + + return sb.toString(); + } + +} diff --git a/InMemoryImpl/src/com/ioParser/interfaces/IInputFormatter.java b/InMemoryImpl/src/com/ioParser/interfaces/IInputFormatter.java new file mode 100644 index 00000000..91a31f4f --- /dev/null +++ b/InMemoryImpl/src/com/ioParser/interfaces/IInputFormatter.java @@ -0,0 +1,16 @@ +package com.ioParser.interfaces; + +import java.util.List; + +import com.commonClasses.Pair; +import com.exceptions.KeyValueStoreException; + +public interface IInputFormatter { + Pair>> parsePutOperationInput(String[] input) throws KeyValueStoreException; + + Pair parseSearchOperationInput(String[] input) throws KeyValueStoreException; + + Key parseGetOperationInput(String[] input) throws KeyValueStoreException; + + Key parseDeleteOperationInput(String[] input) throws KeyValueStoreException; +} diff --git a/InMemoryImpl/src/com/ioParser/interfaces/IResultFormatter.java b/InMemoryImpl/src/com/ioParser/interfaces/IResultFormatter.java new file mode 100644 index 00000000..49796aa6 --- /dev/null +++ b/InMemoryImpl/src/com/ioParser/interfaces/IResultFormatter.java @@ -0,0 +1,10 @@ +package com.ioParser.interfaces; + +import java.util.List; + +import com.attribute.interfaces.IValueAttribute; + +public interface IResultFormatter { + String getResultString(IValueAttribute valueAttribute); + String getResultString(List keys); +} diff --git a/InMemoryImpl/src/com/keyvalueStore/KeyValueStore.java b/InMemoryImpl/src/com/keyvalueStore/KeyValueStore.java index fef60ff5..1a8f1335 100644 --- a/InMemoryImpl/src/com/keyvalueStore/KeyValueStore.java +++ b/InMemoryImpl/src/com/keyvalueStore/KeyValueStore.java @@ -6,43 +6,46 @@ import com.attribute.interfaces.IValueAttribute; import com.commonClasses.Pair; import com.exceptions.DataFormatIncorrectException; +import com.factories.interfaces.IKeyValueMapFactory; import com.keyvalueStore.interfaces.IKeyValueStore; import com.map.interfaces.IKeyValueMap; -public class KeyValueStore implements IKeyValueStore { - - private IKeyValueMap keyValueMap; +public class KeyValueStore implements IKeyValueStore { + private IKeyValueMap keyValueMap; + private IKeyValueMapFactory keyValueMapFactory; - public KeyValueStore(IKeyValueMap keyValueMap) { - this.keyValueMap = keyValueMap; + public KeyValueStore(IKeyValueMapFactory keyValueMapFactory) { + this.keyValueMapFactory = keyValueMapFactory; + + this.keyValueMap = this.keyValueMapFactory.getKeyValueMap(); } @Override - public IValueAttribute get(String key) { + public IValueAttribute get(Key key) { return this.keyValueMap.get(key); } @Override - public List search(String attributeKey, String attributeValue) throws DataFormatIncorrectException { + public List search(AttributeKey attributeKey, AttributeValue attributeValue) throws DataFormatIncorrectException { // TODO Auto-generated method stub return this.keyValueMap.getKeyContainingAttributeKeyValuePair(attributeKey, attributeValue); } @Override - public void put(String key, List> listOfAttributesPair) throws DataFormatIncorrectException { - this.keyValueMap.put(key, new ValueAttribute(listOfAttributesPair)); + public void put(Key key, List> listOfAttributesPair) throws DataFormatIncorrectException { + this.keyValueMap.put(key, new ValueAttribute(listOfAttributesPair)); } @Override - public void delete(String key) { + public void delete(Key key) { this.keyValueMap.deleteKey(key); } @Override - public List keys() { + public List keys() { return this.keyValueMap.getKeys(); } diff --git a/InMemoryImpl/src/com/keyvalueStore/KeyValueStoreInterface.java b/InMemoryImpl/src/com/keyvalueStore/KeyValueStoreInterface.java new file mode 100644 index 00000000..65475dea --- /dev/null +++ b/InMemoryImpl/src/com/keyvalueStore/KeyValueStoreInterface.java @@ -0,0 +1,135 @@ +package com.keyvalueStore; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import com.commonClasses.Pair; +import com.enums.Operations; +import com.exceptions.InputFormatIncorrectException; +import com.exceptions.KeyValueStoreException; +import com.factories.KeyValueMapFactory; +import com.ioParser.InputFormatter; +import com.ioParser.ResultFormatter; +import com.ioParser.interfaces.IInputFormatter; +import com.ioParser.interfaces.IResultFormatter; +import com.keyvalueStore.interfaces.IKeyValueStore; +import com.keyvalueStore.interfaces.IKeyValueStoreInterface; + +public class KeyValueStoreInterface implements IKeyValueStoreInterface { + + private IKeyValueStore keyValueStore; + + private IResultFormatter resultFormatter; + + private IInputFormatter inputFormatter; + + + public KeyValueStoreInterface() { + this.keyValueStore = new KeyValueStore(new KeyValueMapFactory()); + this.inputFormatter = new InputFormatter(); + + this.resultFormatter = new ResultFormatter(); + } + + + @Override + public List returnResult(List input) { + List result = new ArrayList(); + + Iterator it = input.listIterator(); + + while (it.hasNext()) { + try { + result.add(this.processInput(it.next())); + } catch (KeyValueStoreException e) { + result.add(e.getMessage()); + } + } + + return result; + } + + private String processInput(String inputString) throws KeyValueStoreException { + String[] parts = inputString.split(" "); + + if (parts.length == 0) { + throw new InputFormatIncorrectException(); + } + + try { + Operations operation = Operations.valueOf(parts[0].toUpperCase()); + + switch (operation) { + case PUT: + return this.parseAndExecutePUTOperation(parts); + case DELETE: + return this.parseAndExecuteDELETEOperation(parts); + case GET: + + return this.parseAndExecuteGETOperation(parts); + case KEYS: + return this.parseAndExecuteKEYSOperation(); + case SEARCH: + return this.parseAndExecuteSEARCHOperation(parts); + default: + return ""; + + } + } catch(KeyValueStoreException dataException) { + throw dataException; + } catch (Exception e) { + e.printStackTrace(); + throw new InputFormatIncorrectException(); + } + + + } + + + private String parseAndExecuteKEYSOperation() throws KeyValueStoreException { + + return this.resultFormatter.getResultString(this.keyValueStore.keys()); + } + + + private String parseAndExecuteGETOperation(String[] parts) throws KeyValueStoreException { + + String input = this.inputFormatter.parseGetOperationInput(parts); + + + String result = this.resultFormatter.getResultString(this.keyValueStore.get(this.inputFormatter.parseGetOperationInput(parts))); + + if (result.equals("")) { + return "No entry found for " + input; + } + + return result; + } + + + private String parseAndExecuteDELETEOperation(String[] parts) throws KeyValueStoreException { + + + this.keyValueStore.delete(this.inputFormatter.parseDeleteOperationInput(parts)); + + return null; + } + + + private String parseAndExecutePUTOperation(String[] parts) throws KeyValueStoreException { + Pair>> input = this.inputFormatter.parsePutOperationInput(parts); + + this.keyValueStore.put(input.getKey(), input.getValue()); + + return ""; + } + + private String parseAndExecuteSEARCHOperation(String[] parts) throws KeyValueStoreException { + Pair input = this.inputFormatter.parseSearchOperationInput(parts); + List result = this.keyValueStore.search(input.getKey(), input.getValue()); + + return this.resultFormatter.getResultString(result); + } + +} diff --git a/InMemoryImpl/src/com/keyvalueStore/interfaces/IKeyValueStore.java b/InMemoryImpl/src/com/keyvalueStore/interfaces/IKeyValueStore.java index fd1b0840..a4f10d9d 100644 --- a/InMemoryImpl/src/com/keyvalueStore/interfaces/IKeyValueStore.java +++ b/InMemoryImpl/src/com/keyvalueStore/interfaces/IKeyValueStore.java @@ -7,15 +7,15 @@ import com.exceptions.DataFormatIncorrectException; -public interface IKeyValueStore { +public interface IKeyValueStore { - IValueAttribute get(String key); + IValueAttribute get(Key key); - List search(String attributeKey, String attributeValue) throws DataFormatIncorrectException; + List search(AttributeKey attributeKey, AttributeValue attributeValue) throws DataFormatIncorrectException; - void put(String key, List> listOfAttributesPair) throws DataFormatIncorrectException; + void put(Key key, List> listOfAttributesPair) throws DataFormatIncorrectException; - void delete(String key); + void delete(Key key); - List keys(); + List keys(); } diff --git a/InMemoryImpl/src/com/keyvalueStore/interfaces/IKeyValueStoreInterface.java b/InMemoryImpl/src/com/keyvalueStore/interfaces/IKeyValueStoreInterface.java new file mode 100644 index 00000000..cd56b093 --- /dev/null +++ b/InMemoryImpl/src/com/keyvalueStore/interfaces/IKeyValueStoreInterface.java @@ -0,0 +1,8 @@ +package com.keyvalueStore.interfaces; + +import java.util.List; + +public interface IKeyValueStoreInterface { + List returnResult(List input); + +} diff --git a/InMemoryImpl/src/com/main/InterfaceMain.java b/InMemoryImpl/src/com/main/InterfaceMain.java new file mode 100644 index 00000000..6751fcba --- /dev/null +++ b/InMemoryImpl/src/com/main/InterfaceMain.java @@ -0,0 +1,52 @@ +package com.main; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; +import java.util.stream.Stream; + +import com.keyvalueStore.KeyValueStoreInterface; +import com.keyvalueStore.interfaces.IKeyValueStoreInterface; + +public class InterfaceMain { + + public static void main(String[] args) { + IKeyValueStoreInterface keyValueStoreInterface = new KeyValueStoreInterface(); + + Scanner sc = new Scanner(System.in); + + List input = new ArrayList(); + + + while (true) { + String next = sc.nextLine(); + + if (next.equals("EXIT")) { + break; + } + + input.add(next); + } + + List result = keyValueStoreInterface.returnResult(input); + +// Stream.of(result).forEach(s -> { +// System.out.println(s); +// }); +// +// System.out.println(result); + + int i = 0; + + while (i < result.size()) { + if (result.get(i) != null && !result.get(i).equals("")) { + System.out.println(result.get(i)); + } + + i++; + } + + sc.close(); + } + +} diff --git a/InMemoryImpl/src/com/main/Main.java b/InMemoryImpl/src/com/main/Main.java index f5a37256..af1726ee 100644 --- a/InMemoryImpl/src/com/main/Main.java +++ b/InMemoryImpl/src/com/main/Main.java @@ -5,6 +5,7 @@ import com.commonClasses.Pair; import com.exceptions.DataFormatIncorrectException; import com.factories.AttributeKeyValueMapFactory; +import com.factories.KeyValueMapFactory; import com.keyvalueStore.KeyValueStore; import com.keyvalueStore.interfaces.IKeyValueStore; import com.map.KeyValueMap; @@ -12,9 +13,9 @@ public class Main { public static void main(String[] args) throws DataFormatIncorrectException { - IKeyValueStore keyValueStore = new KeyValueStore(new KeyValueMap(new AttributeKeyValueMapFactory())); + IKeyValueStore keyValueStore = new KeyValueStore<>(new KeyValueMapFactory()); - keyValueStore.put("test1", Arrays.asList(new Pair("att1", "123"))); + keyValueStore.put("test1", Arrays.asList(new Pair("att1", "123.0"))); System.out.println(keyValueStore.get("test1")); @@ -28,7 +29,13 @@ public static void main(String[] args) throws DataFormatIncorrectException { keyValueStore.put("test1", Arrays.asList(new Pair("att1", "123"))); - keyValueStore.put("test2", Arrays.asList(new Pair("att1", "123a"))); + keyValueStore.put("test2", Arrays.asList(new Pair("att1", "1232"))); + + System.out.println(keyValueStore.get("test1")); + + System.out.println(keyValueStore.search("att1", "1231")); + + System.out.println(keyValueStore.keys()); } } diff --git a/InMemoryImpl/src/com/map/KeyValueMap.java b/InMemoryImpl/src/com/map/KeyValueMap.java index a69eb4cc..5a46763a 100644 --- a/InMemoryImpl/src/com/map/KeyValueMap.java +++ b/InMemoryImpl/src/com/map/KeyValueMap.java @@ -12,11 +12,11 @@ import com.factories.interfaces.IAttributeKeyValueMapFactory; import com.map.interfaces.IKeyValueMap; -public class KeyValueMap implements IKeyValueMap { +public class KeyValueMap implements IKeyValueMap { - private HashMap attributeMap; + private HashMap> attributeMap; - private HashMap> keyAttributeMap; + private HashMap> keyAttributeMap; private IAttributeKeyValueMapFactory attributeKeyValueMapFactory; @@ -24,46 +24,46 @@ public class KeyValueMap implements IKeyValueMap { public KeyValueMap(IAttributeKeyValueMapFactory attributeKeyValueMapFactory) { this.attributeKeyValueMapFactory = attributeKeyValueMapFactory; - this.attributeMap = new HashMap(); + this.attributeMap = new HashMap>(); - this.keyAttributeMap = new HashMap>(); + this.keyAttributeMap = new HashMap>(); } @Override - public IValueAttribute get(String key) { - IValueAttribute value = new ValueAttribute(); + public IValueAttribute get(Key key) { + IValueAttribute value = new ValueAttribute(); if (!this.keyAttributeMap.containsKey(key)) { return null; } - List attributeList = this.keyAttributeMap.get(key); + List attributeList = this.keyAttributeMap.get(key); - Iterator it = attributeList.listIterator(); + Iterator it = attributeList.listIterator(); while (it.hasNext()) { - String next = it.next(); + AttributeKey next = it.next(); - value.setAttribute(next, this.attributeMap.get(next).get(key).toString()); + value.setAttribute(next, this.attributeMap.get(next).get(key)); } return value; } @Override - public void put(String key, IValueAttribute value) throws DataFormatIncorrectException { + public void put(Key key, IValueAttribute value) throws DataFormatIncorrectException { if (this.keyAttributeMap.containsKey(key)) { this.deleteKey(key); } - List attributeList = new ArrayList(); + List attributeList = new ArrayList(); - Iterator it = value.getAttributeKeys().listIterator(); + Iterator it = value.getAttributeKeys().listIterator(); while (it.hasNext()) { - String attkey = it.next(); + AttributeKey attkey = it.next(); - String attValue = value.getAttribute(attkey); + AttributeValue attValue = value.getAttribute(attkey); if (!attributeMap.containsKey(attkey)) { this.attributeMap.put(attkey, attributeKeyValueMapFactory.createAttributeKeyValueMap(attValue)); @@ -76,24 +76,22 @@ public void put(String key, IValueAttribute value) throws DataFo this.keyAttributeMap.put(key, attributeList); - System.out.println(this.attributeMap + " " + this.attributeMap.get("att1").get(key)); - } @Override - public List getKeyContainingAttributeKeyValuePair(String attribute, String value) throws DataFormatIncorrectException { + public List getKeyContainingAttributeKeyValuePair(AttributeKey attribute, AttributeValue value) throws DataFormatIncorrectException { if (!this.attributeMap.containsKey(attribute)) { - return new ArrayList(); + return new ArrayList(); } return this.attributeMap.get(attribute).getkeysWithValues(value); } @Override - public List getKeys() { - List keys = new ArrayList(); + public List getKeys() { + List keys = new ArrayList(); - Iterator it = this.keyAttributeMap.keySet().iterator(); + Iterator it = this.keyAttributeMap.keySet().iterator(); while (it.hasNext()) { keys.add(it.next()); @@ -103,15 +101,15 @@ public List getKeys() { } @Override - public void deleteKey(String key) { + public void deleteKey(Key key) { if (!this.keyAttributeMap.containsKey(key)) { return; } - Iterator it = this.keyAttributeMap.get(key).listIterator(); + Iterator it = this.keyAttributeMap.get(key).listIterator(); while (it.hasNext()) { - String attribute = it.next(); + AttributeKey attribute = it.next(); this.attributeMap.get(attribute).deleteKey(key); diff --git a/InMemoryImpl/src/com/map/interfaces/IKeyValueMap.java b/InMemoryImpl/src/com/map/interfaces/IKeyValueMap.java index 75f7d2e7..10512b7e 100644 --- a/InMemoryImpl/src/com/map/interfaces/IKeyValueMap.java +++ b/InMemoryImpl/src/com/map/interfaces/IKeyValueMap.java @@ -5,15 +5,15 @@ import com.attribute.interfaces.IValueAttribute; import com.exceptions.DataFormatIncorrectException; -public interface IKeyValueMap { - IValueAttribute get(String key); +public interface IKeyValueMap { + IValueAttribute get(Key key); - void put(String key, IValueAttribute value) throws DataFormatIncorrectException; + void put(Key key, IValueAttribute value) throws DataFormatIncorrectException; - List getKeyContainingAttributeKeyValuePair(String attribute, String value) throws DataFormatIncorrectException; + List getKeyContainingAttributeKeyValuePair(AttributeKey attribute, AttributeValue value) throws DataFormatIncorrectException; - List getKeys(); + List getKeys(); - void deleteKey(String key); + void deleteKey(Key key); } From 461c098665536fefc8230bc6c09c6fb328b50fdf Mon Sep 17 00:00:00 2001 From: Anant Akash Date: Mon, 14 Apr 2025 23:32:58 +0530 Subject: [PATCH 19/19] Adding new javadocs --- .../com/attribute/AttributeKeyValueMap.java | 69 +++++++++++++++++++ .../src/com/attribute/ValueAttribute.java | 38 ++++++++++ .../interfaces/IAttributeKeyValueMap.java | 46 +++++++++++++ .../attribute/interfaces/IValueAttribute.java | 30 ++++++++ .../BooleanAttributeKeyValueMap.java | 20 ++++++ .../DoubleAttributeKeyValueMap.java | 20 ++++++ .../IntegerAttributeKeyValueMap.java | 20 ++++++ .../StringAttributekeyValueMap.java | 20 ++++++ InMemoryImpl/src/com/commonClasses/Pair.java | 26 +++++++ InMemoryImpl/src/com/enums/Operations.java | 14 ++++ .../DataFormatIncorrectException.java | 13 +++- .../InputFormatIncorrectException.java | 13 +++- .../exceptions/KeyValueStoreException.java | 8 ++- .../AttributeKeyValueMapFactory.java | 12 ++++ .../src/com/factories/KeyValueMapFactory.java | 12 ++++ .../IAttributeKeyValueMapFactory.java | 13 ++++ .../interfaces/IKeyValueMapFactory.java | 13 ++++ .../src/com/ioParser/InputFormatter.java | 32 +++++++++ .../src/com/ioParser/ResultFormatter.java | 16 +++++ .../ioParser/interfaces/IInputFormatter.java | 37 ++++++++++ .../ioParser/interfaces/IResultFormatter.java | 22 ++++++ .../src/com/keyvalueStore/KeyValueStore.java | 46 +++++++++++++ .../keyvalueStore/KeyValueStoreInterface.java | 57 +++++++++++++++ .../interfaces/IKeyValueStore.java | 39 +++++++++++ .../interfaces/IKeyValueStoreInterface.java | 11 +++ InMemoryImpl/src/com/main/InterfaceMain.java | 10 ++- InMemoryImpl/src/com/main/Main.java | 10 +++ InMemoryImpl/src/com/map/KeyValueMap.java | 47 +++++++++++++ .../src/com/map/interfaces/IKeyValueMap.java | 40 +++++++++++ 29 files changed, 744 insertions(+), 10 deletions(-) diff --git a/InMemoryImpl/src/com/attribute/AttributeKeyValueMap.java b/InMemoryImpl/src/com/attribute/AttributeKeyValueMap.java index 893ba52d..42e7818f 100644 --- a/InMemoryImpl/src/com/attribute/AttributeKeyValueMap.java +++ b/InMemoryImpl/src/com/attribute/AttributeKeyValueMap.java @@ -9,28 +9,61 @@ import com.attribute.interfaces.IAttributeKeyValueMap; import com.exceptions.DataFormatIncorrectException; +// TODO: Auto-generated Javadoc +/** + * The Class AttributeKeyValueMap. + * + * @param the generic type + * @param the generic type + * @param the generic type + */ public abstract class AttributeKeyValueMap implements IAttributeKeyValueMap { + /** The key value map. */ private HashMap keyValueMap; + /** The value key map. */ private HashMap> valueKeyMap; + /** The t value map. */ private HashMap tValueMap; + /** + * Instantiates a new attribute key value map. + */ public AttributeKeyValueMap() { this.keyValueMap = new HashMap<>(); this.valueKeyMap = new HashMap>(); this.tValueMap = new HashMap(); } + /** + * Gets the value as T. + * + * @param value the value + * @return the value as T + * @throws DataFormatIncorrectException the data format incorrect exception + */ protected abstract T getValueAsT(Value value) throws DataFormatIncorrectException; + /** + * Checks if is valid type. + * + * @param value the value + * @return true, if is valid type + */ @Override public abstract boolean isValidType(Value value); + /** + * Gets the. + * + * @param key the key + * @return the value + */ @Override public Value get(Key key) { if (!keyValueMap.containsKey(key)) { @@ -39,6 +72,13 @@ public Value get(Key key) { return this.getValue(this.keyValueMap.get(key)); } + /** + * Put. + * + * @param key the key + * @param value the value + * @throws DataFormatIncorrectException the data format incorrect exception + */ @Override public void put(Key key, Value value) throws DataFormatIncorrectException { if (!isValidType(value)) { @@ -58,6 +98,12 @@ public void put(Key key, Value value) throws DataFormatIncorrectException { this.tValueMap.put(this.getValueAsT(value), value); } + /** + * Contains key. + * + * @param key the key + * @return true, if successful + */ @Override public boolean containsKey(Key key) { if (this.keyValueMap.containsKey(key)) { @@ -69,6 +115,13 @@ public boolean containsKey(Key key) { + /** + * Gets the keys with values. + * + * @param value the value + * @return the keys with values + * @throws DataFormatIncorrectException the data format incorrect exception + */ @Override public List getkeysWithValues(Value value) throws DataFormatIncorrectException { @@ -93,6 +146,11 @@ public List getkeysWithValues(Value value) throws DataFormatIncorrectExcept + /** + * Delete key. + * + * @param key the key + */ @Override public void deleteKey(Key key) { if (!this.keyValueMap.containsKey(key)) { @@ -102,11 +160,22 @@ public void deleteKey(Key key) { } + /** + * To string. + * + * @return the string + */ @Override public String toString() { return "AttributeKeyValueMap [keyValueMap=" + keyValueMap + ", valueKeyMap=" + valueKeyMap + "]"; } + /** + * Gets the value. + * + * @param obj the obj + * @return the value + */ protected Value getValue(T obj) { return this.tValueMap.get(obj); } diff --git a/InMemoryImpl/src/com/attribute/ValueAttribute.java b/InMemoryImpl/src/com/attribute/ValueAttribute.java index 25e1e081..6b4419f5 100644 --- a/InMemoryImpl/src/com/attribute/ValueAttribute.java +++ b/InMemoryImpl/src/com/attribute/ValueAttribute.java @@ -8,14 +8,30 @@ import com.attribute.interfaces.IValueAttribute; import com.commonClasses.Pair; +// TODO: Auto-generated Javadoc +/** + * The Class ValueAttribute. + * + * @param the generic type + * @param the generic type + */ public class ValueAttribute implements IValueAttribute { + /** The attribute key value map. */ HashMap attributeKeyValueMap; + /** + * Instantiates a new value attribute. + */ public ValueAttribute() { this.attributeKeyValueMap = new HashMap(); } + /** + * Instantiates a new value attribute. + * + * @param attributekeyValueList the attributekey value list + */ public ValueAttribute(List> attributekeyValueList) { this(); Iterator> it = attributekeyValueList.listIterator(); @@ -26,17 +42,34 @@ public ValueAttribute(List> attributekeyValueList) { } } + /** + * Sets the attribute. + * + * @param key the key + * @param value the value + */ @Override public void setAttribute(Key key, Value value) { this.attributeKeyValueMap.put(key, value); } + /** + * Gets the attribute. + * + * @param key the key + * @return the attribute + */ @Override public Value getAttribute(Key key) { return this.attributeKeyValueMap.get(key); } + /** + * Gets the attribute keys. + * + * @return the attribute keys + */ @Override public List getAttributeKeys() { List attributeKeys = new ArrayList(); @@ -50,6 +83,11 @@ public List getAttributeKeys() { return attributeKeys; } + /** + * To string. + * + * @return the string + */ @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/InMemoryImpl/src/com/attribute/interfaces/IAttributeKeyValueMap.java b/InMemoryImpl/src/com/attribute/interfaces/IAttributeKeyValueMap.java index 0a27132a..7380c205 100644 --- a/InMemoryImpl/src/com/attribute/interfaces/IAttributeKeyValueMap.java +++ b/InMemoryImpl/src/com/attribute/interfaces/IAttributeKeyValueMap.java @@ -4,15 +4,61 @@ import com.exceptions.DataFormatIncorrectException; +// TODO: Auto-generated Javadoc +/** + * The Interface IAttributeKeyValueMap. + * + * @param the key type + * @param the value type + */ public interface IAttributeKeyValueMap { + + /** + * Gets the. + * + * @param key the key + * @return the v + */ V get(K key); + + /** + * Put. + * + * @param key the key + * @param value the value + * @throws DataFormatIncorrectException the data format incorrect exception + */ void put(K key, V value) throws DataFormatIncorrectException; + /** + * Contains key. + * + * @param key the key + * @return true, if successful + */ boolean containsKey(K key); + /** + * Checks if is valid type. + * + * @param value the value + * @return true, if is valid type + */ boolean isValidType(V value); + /** + * Gets the keys with values. + * + * @param value the value + * @return the keys with values + * @throws DataFormatIncorrectException the data format incorrect exception + */ List getkeysWithValues(V value) throws DataFormatIncorrectException; + /** + * Delete key. + * + * @param key the key + */ void deleteKey(K key); } diff --git a/InMemoryImpl/src/com/attribute/interfaces/IValueAttribute.java b/InMemoryImpl/src/com/attribute/interfaces/IValueAttribute.java index 0519df8d..adb01898 100644 --- a/InMemoryImpl/src/com/attribute/interfaces/IValueAttribute.java +++ b/InMemoryImpl/src/com/attribute/interfaces/IValueAttribute.java @@ -2,12 +2,42 @@ import java.util.List; +// TODO: Auto-generated Javadoc +/** + * The Interface IValueAttribute. + * + * @param the key type + * @param the value type + */ public interface IValueAttribute { + + /** + * To string. + * + * @return the string + */ String toString(); + /** + * Sets the attribute. + * + * @param key the key + * @param value the value + */ void setAttribute(K key, V value); + /** + * Gets the attribute. + * + * @param key the key + * @return the attribute + */ V getAttribute(K key); + /** + * Gets the attribute keys. + * + * @return the attribute keys + */ List getAttributeKeys(); } diff --git a/InMemoryImpl/src/com/attribute/typeClasses/BooleanAttributeKeyValueMap.java b/InMemoryImpl/src/com/attribute/typeClasses/BooleanAttributeKeyValueMap.java index b6b4fc0a..e4e568cb 100644 --- a/InMemoryImpl/src/com/attribute/typeClasses/BooleanAttributeKeyValueMap.java +++ b/InMemoryImpl/src/com/attribute/typeClasses/BooleanAttributeKeyValueMap.java @@ -3,8 +3,22 @@ import com.attribute.AttributeKeyValueMap; import com.exceptions.DataFormatIncorrectException; +// TODO: Auto-generated Javadoc +/** + * The Class BooleanAttributeKeyValueMap. + * + * @param the generic type + * @param the generic type + */ public class BooleanAttributeKeyValueMap extends AttributeKeyValueMap { + /** + * Gets the value as T. + * + * @param value the value + * @return the value as T + * @throws DataFormatIncorrectException the data format incorrect exception + */ @Override protected Boolean getValueAsT(Value value) throws DataFormatIncorrectException { try { @@ -14,6 +28,12 @@ protected Boolean getValueAsT(Value value) throws DataFormatIncorrectException { } } + /** + * Checks if is valid type. + * + * @param value the value + * @return true, if is valid type + */ @Override public boolean isValidType(Value value) { try { diff --git a/InMemoryImpl/src/com/attribute/typeClasses/DoubleAttributeKeyValueMap.java b/InMemoryImpl/src/com/attribute/typeClasses/DoubleAttributeKeyValueMap.java index 5c65d8e8..c4e40001 100644 --- a/InMemoryImpl/src/com/attribute/typeClasses/DoubleAttributeKeyValueMap.java +++ b/InMemoryImpl/src/com/attribute/typeClasses/DoubleAttributeKeyValueMap.java @@ -3,8 +3,22 @@ import com.attribute.AttributeKeyValueMap; import com.exceptions.DataFormatIncorrectException; +// TODO: Auto-generated Javadoc +/** + * The Class DoubleAttributeKeyValueMap. + * + * @param the generic type + * @param the generic type + */ public class DoubleAttributeKeyValueMap extends AttributeKeyValueMap { + /** + * Gets the value as T. + * + * @param value the value + * @return the value as T + * @throws DataFormatIncorrectException the data format incorrect exception + */ @Override protected Double getValueAsT(Value value) throws DataFormatIncorrectException { if (!this.isValidType(value)) { @@ -14,6 +28,12 @@ protected Double getValueAsT(Value value) throws DataFormatIncorrectException { return Double.parseDouble(value.toString()); } + /** + * Checks if is valid type. + * + * @param value the value + * @return true, if is valid type + */ @Override public boolean isValidType(Value value) { try { diff --git a/InMemoryImpl/src/com/attribute/typeClasses/IntegerAttributeKeyValueMap.java b/InMemoryImpl/src/com/attribute/typeClasses/IntegerAttributeKeyValueMap.java index 3394a47c..4d178ec4 100644 --- a/InMemoryImpl/src/com/attribute/typeClasses/IntegerAttributeKeyValueMap.java +++ b/InMemoryImpl/src/com/attribute/typeClasses/IntegerAttributeKeyValueMap.java @@ -4,8 +4,22 @@ import com.attribute.AttributeKeyValueMap; import com.exceptions.DataFormatIncorrectException; +// TODO: Auto-generated Javadoc +/** + * The Class IntegerAttributeKeyValueMap. + * + * @param the generic type + * @param the generic type + */ public class IntegerAttributeKeyValueMap extends AttributeKeyValueMap { + /** + * Gets the value as T. + * + * @param value the value + * @return the value as T + * @throws DataFormatIncorrectException the data format incorrect exception + */ @Override protected Integer getValueAsT(Value value) throws DataFormatIncorrectException { @@ -16,6 +30,12 @@ protected Integer getValueAsT(Value value) throws DataFormatIncorrectException { } } + /** + * Checks if is valid type. + * + * @param value the value + * @return true, if is valid type + */ @Override public boolean isValidType(Value value) { try { diff --git a/InMemoryImpl/src/com/attribute/typeClasses/StringAttributekeyValueMap.java b/InMemoryImpl/src/com/attribute/typeClasses/StringAttributekeyValueMap.java index abff4abc..aafe9e95 100644 --- a/InMemoryImpl/src/com/attribute/typeClasses/StringAttributekeyValueMap.java +++ b/InMemoryImpl/src/com/attribute/typeClasses/StringAttributekeyValueMap.java @@ -3,13 +3,33 @@ import com.attribute.AttributeKeyValueMap; import com.exceptions.DataFormatIncorrectException; +// TODO: Auto-generated Javadoc +/** + * The Class StringAttributekeyValueMap. + * + * @param the generic type + * @param the generic type + */ public class StringAttributekeyValueMap extends AttributeKeyValueMap { + /** + * Gets the value as T. + * + * @param value the value + * @return the value as T + * @throws DataFormatIncorrectException the data format incorrect exception + */ @Override protected String getValueAsT(Value value) throws DataFormatIncorrectException { return value.toString(); } + /** + * Checks if is valid type. + * + * @param value the value + * @return true, if is valid type + */ @Override public boolean isValidType(Value value) { return true; diff --git a/InMemoryImpl/src/com/commonClasses/Pair.java b/InMemoryImpl/src/com/commonClasses/Pair.java index fad95571..7fe5814c 100644 --- a/InMemoryImpl/src/com/commonClasses/Pair.java +++ b/InMemoryImpl/src/com/commonClasses/Pair.java @@ -1,19 +1,45 @@ package com.commonClasses; +// TODO: Auto-generated Javadoc +/** + * The Class Pair. + * + * @param the key type + * @param the value type + */ public class Pair { + + /** The key. */ private K key; + /** The value. */ private V value; + /** + * Instantiates a new pair. + * + * @param key the key + * @param value the value + */ public Pair(K key, V value) { this.key = key; this.value = value; } + /** + * Gets the key. + * + * @return the key + */ public K getKey() { return key; } + /** + * Gets the value. + * + * @return the value + */ public V getValue() { return value; } diff --git a/InMemoryImpl/src/com/enums/Operations.java b/InMemoryImpl/src/com/enums/Operations.java index a95fea02..6a4e1c93 100644 --- a/InMemoryImpl/src/com/enums/Operations.java +++ b/InMemoryImpl/src/com/enums/Operations.java @@ -1,10 +1,24 @@ package com.enums; +// TODO: Auto-generated Javadoc +/** + * The Enum Operations. + */ public enum Operations { + + /** The put. */ PUT, + + /** The get. */ GET, + + /** The keys. */ KEYS, + + /** The delete. */ DELETE, + + /** The search. */ SEARCH; } diff --git a/InMemoryImpl/src/com/exceptions/DataFormatIncorrectException.java b/InMemoryImpl/src/com/exceptions/DataFormatIncorrectException.java index 640c63fa..1c36891e 100644 --- a/InMemoryImpl/src/com/exceptions/DataFormatIncorrectException.java +++ b/InMemoryImpl/src/com/exceptions/DataFormatIncorrectException.java @@ -1,12 +1,19 @@ package com.exceptions; +// TODO: Auto-generated Javadoc +/** + * The Class DataFormatIncorrectException. + */ public class DataFormatIncorrectException extends KeyValueStoreException { - /** - * - */ + /** The Constant serialVersionUID. */ private static final long serialVersionUID = 1L; + /** + * Gets the message. + * + * @return the message + */ @Override public String getMessage() { // TODO Auto-generated method stub diff --git a/InMemoryImpl/src/com/exceptions/InputFormatIncorrectException.java b/InMemoryImpl/src/com/exceptions/InputFormatIncorrectException.java index e9dd5820..b35ac078 100644 --- a/InMemoryImpl/src/com/exceptions/InputFormatIncorrectException.java +++ b/InMemoryImpl/src/com/exceptions/InputFormatIncorrectException.java @@ -1,13 +1,20 @@ package com.exceptions; +// TODO: Auto-generated Javadoc +/** + * The Class InputFormatIncorrectException. + */ public class InputFormatIncorrectException extends KeyValueStoreException { - /** - * - */ + /** The Constant serialVersionUID. */ private static final long serialVersionUID = 1L; + /** + * Gets the message. + * + * @return the message + */ @Override public String getMessage() { return "INPUT FORMAT INCORRECT"; diff --git a/InMemoryImpl/src/com/exceptions/KeyValueStoreException.java b/InMemoryImpl/src/com/exceptions/KeyValueStoreException.java index 0fbe2a86..5bcd7762 100644 --- a/InMemoryImpl/src/com/exceptions/KeyValueStoreException.java +++ b/InMemoryImpl/src/com/exceptions/KeyValueStoreException.java @@ -1,10 +1,12 @@ package com.exceptions; +// TODO: Auto-generated Javadoc +/** + * The Class KeyValueStoreException. + */ public class KeyValueStoreException extends Exception { - /** - * - */ + /** The Constant serialVersionUID. */ private static final long serialVersionUID = 1L; } diff --git a/InMemoryImpl/src/com/factories/AttributeKeyValueMapFactory.java b/InMemoryImpl/src/com/factories/AttributeKeyValueMapFactory.java index 6d660294..669995f3 100644 --- a/InMemoryImpl/src/com/factories/AttributeKeyValueMapFactory.java +++ b/InMemoryImpl/src/com/factories/AttributeKeyValueMapFactory.java @@ -7,8 +7,20 @@ import com.attribute.typeClasses.StringAttributekeyValueMap; import com.factories.interfaces.IAttributeKeyValueMapFactory; +// TODO: Auto-generated Javadoc +/** + * A factory for creating AttributeKeyValueMap objects. + */ public class AttributeKeyValueMapFactory implements IAttributeKeyValueMapFactory { + /** + * Creates a new AttributeKeyValueMap object. + * + * @param the generic type + * @param the generic type + * @param value the value + * @return the i attribute key value map< key, value> + */ @Override public IAttributeKeyValueMap createAttributeKeyValueMap(Value value) { try { diff --git a/InMemoryImpl/src/com/factories/KeyValueMapFactory.java b/InMemoryImpl/src/com/factories/KeyValueMapFactory.java index c9ba073f..caed3962 100644 --- a/InMemoryImpl/src/com/factories/KeyValueMapFactory.java +++ b/InMemoryImpl/src/com/factories/KeyValueMapFactory.java @@ -4,8 +4,20 @@ import com.map.KeyValueMap; import com.map.interfaces.IKeyValueMap; +// TODO: Auto-generated Javadoc +/** + * A factory for creating KeyValueMap objects. + */ public class KeyValueMapFactory implements IKeyValueMapFactory { + /** + * Gets the key value map. + * + * @param the generic type + * @param the generic type + * @param the generic type + * @return the key value map + */ @Override public IKeyValueMap getKeyValueMap() { return new KeyValueMap(new AttributeKeyValueMapFactory()); diff --git a/InMemoryImpl/src/com/factories/interfaces/IAttributeKeyValueMapFactory.java b/InMemoryImpl/src/com/factories/interfaces/IAttributeKeyValueMapFactory.java index 6b7308d4..e4928871 100644 --- a/InMemoryImpl/src/com/factories/interfaces/IAttributeKeyValueMapFactory.java +++ b/InMemoryImpl/src/com/factories/interfaces/IAttributeKeyValueMapFactory.java @@ -2,6 +2,19 @@ import com.attribute.interfaces.IAttributeKeyValueMap; +// TODO: Auto-generated Javadoc +/** + * A factory for creating IAttributeKeyValueMap objects. + */ public interface IAttributeKeyValueMapFactory { + + /** + * Creates a new IAttributeKeyValueMap object. + * + * @param the key type + * @param the value type + * @param value the value + * @return the i attribute key value map< k, v> + */ IAttributeKeyValueMap createAttributeKeyValueMap(V value); } diff --git a/InMemoryImpl/src/com/factories/interfaces/IKeyValueMapFactory.java b/InMemoryImpl/src/com/factories/interfaces/IKeyValueMapFactory.java index 57253fc5..cde4dd7c 100644 --- a/InMemoryImpl/src/com/factories/interfaces/IKeyValueMapFactory.java +++ b/InMemoryImpl/src/com/factories/interfaces/IKeyValueMapFactory.java @@ -2,6 +2,19 @@ import com.map.interfaces.IKeyValueMap; +// TODO: Auto-generated Javadoc +/** + * A factory for creating IKeyValueMap objects. + */ public interface IKeyValueMapFactory { + + /** + * Gets the key value map. + * + * @param the generic type + * @param the generic type + * @param the generic type + * @return the key value map + */ IKeyValueMap getKeyValueMap(); } diff --git a/InMemoryImpl/src/com/ioParser/InputFormatter.java b/InMemoryImpl/src/com/ioParser/InputFormatter.java index 2e638006..ca839b50 100644 --- a/InMemoryImpl/src/com/ioParser/InputFormatter.java +++ b/InMemoryImpl/src/com/ioParser/InputFormatter.java @@ -8,8 +8,19 @@ import com.exceptions.KeyValueStoreException; import com.ioParser.interfaces.IInputFormatter; +// TODO: Auto-generated Javadoc +/** + * The Class InputFormatter. + */ public class InputFormatter implements IInputFormatter { + /** + * Parses the put operation input. + * + * @param parts the parts + * @return the pair + * @throws KeyValueStoreException the key value store exception + */ @Override public Pair>> parsePutOperationInput(String[] parts) throws KeyValueStoreException { if (parts.length < 2 || parts.length % 2 != 0) { @@ -35,6 +46,13 @@ public Pair>> parsePutOperationInput(String[] return new Pair>>(key, attributeValue); } + /** + * Parses the search operation input. + * + * @param parts the parts + * @return the pair + * @throws KeyValueStoreException the key value store exception + */ @Override public Pair parseSearchOperationInput(String[] parts) throws KeyValueStoreException { if (parts.length < 3) { @@ -44,6 +62,13 @@ public Pair parseSearchOperationInput(String[] parts) throws Key return new Pair(parts[1], parts[2]); } + /** + * Parses the get operation input. + * + * @param parts the parts + * @return the string + * @throws KeyValueStoreException the key value store exception + */ @Override public String parseGetOperationInput(String[] parts) throws KeyValueStoreException { if (parts.length < 2) { @@ -53,6 +78,13 @@ public String parseGetOperationInput(String[] parts) throws KeyValueStoreExcepti return parts[1]; } + /** + * Parses the delete operation input. + * + * @param parts the parts + * @return the string + * @throws KeyValueStoreException the key value store exception + */ @Override public String parseDeleteOperationInput(String[] parts) throws KeyValueStoreException { return this.parseGetOperationInput(parts); diff --git a/InMemoryImpl/src/com/ioParser/ResultFormatter.java b/InMemoryImpl/src/com/ioParser/ResultFormatter.java index 41029be9..aaa9f3a8 100644 --- a/InMemoryImpl/src/com/ioParser/ResultFormatter.java +++ b/InMemoryImpl/src/com/ioParser/ResultFormatter.java @@ -5,8 +5,18 @@ import com.attribute.interfaces.IValueAttribute; import com.ioParser.interfaces.IResultFormatter; +// TODO: Auto-generated Javadoc +/** + * The Class ResultFormatter. + */ public class ResultFormatter implements IResultFormatter { + /** + * Gets the result string. + * + * @param valueAttribute the value attribute + * @return the result string + */ @Override public String getResultString(IValueAttribute valueAttribute) { if (valueAttribute == null) { @@ -15,6 +25,12 @@ public String getResultString(IValueAttribute valueAttribute) { return valueAttribute.toString(); } + /** + * Gets the result string. + * + * @param keys the keys + * @return the result string + */ @Override public String getResultString(List keys) { if (keys == null || keys.size() == 0) { diff --git a/InMemoryImpl/src/com/ioParser/interfaces/IInputFormatter.java b/InMemoryImpl/src/com/ioParser/interfaces/IInputFormatter.java index 91a31f4f..89dbe154 100644 --- a/InMemoryImpl/src/com/ioParser/interfaces/IInputFormatter.java +++ b/InMemoryImpl/src/com/ioParser/interfaces/IInputFormatter.java @@ -5,12 +5,49 @@ import com.commonClasses.Pair; import com.exceptions.KeyValueStoreException; +// TODO: Auto-generated Javadoc +/** + * The Interface IInputFormatter. + * + * @param the generic type + * @param the generic type + * @param the generic type + */ public interface IInputFormatter { + + /** + * Parses the put operation input. + * + * @param input the input + * @return the pair + * @throws KeyValueStoreException the key value store exception + */ Pair>> parsePutOperationInput(String[] input) throws KeyValueStoreException; + /** + * Parses the search operation input. + * + * @param input the input + * @return the pair + * @throws KeyValueStoreException the key value store exception + */ Pair parseSearchOperationInput(String[] input) throws KeyValueStoreException; + /** + * Parses the get operation input. + * + * @param input the input + * @return the key + * @throws KeyValueStoreException the key value store exception + */ Key parseGetOperationInput(String[] input) throws KeyValueStoreException; + /** + * Parses the delete operation input. + * + * @param input the input + * @return the key + * @throws KeyValueStoreException the key value store exception + */ Key parseDeleteOperationInput(String[] input) throws KeyValueStoreException; } diff --git a/InMemoryImpl/src/com/ioParser/interfaces/IResultFormatter.java b/InMemoryImpl/src/com/ioParser/interfaces/IResultFormatter.java index 49796aa6..fd2ed541 100644 --- a/InMemoryImpl/src/com/ioParser/interfaces/IResultFormatter.java +++ b/InMemoryImpl/src/com/ioParser/interfaces/IResultFormatter.java @@ -4,7 +4,29 @@ import com.attribute.interfaces.IValueAttribute; +// TODO: Auto-generated Javadoc +/** + * The Interface IResultFormatter. + * + * @param the generic type + * @param the generic type + * @param the generic type + */ public interface IResultFormatter { + + /** + * Gets the result string. + * + * @param valueAttribute the value attribute + * @return the result string + */ String getResultString(IValueAttribute valueAttribute); + + /** + * Gets the result string. + * + * @param keys the keys + * @return the result string + */ String getResultString(List keys); } diff --git a/InMemoryImpl/src/com/keyvalueStore/KeyValueStore.java b/InMemoryImpl/src/com/keyvalueStore/KeyValueStore.java index 1a8f1335..a27a7d03 100644 --- a/InMemoryImpl/src/com/keyvalueStore/KeyValueStore.java +++ b/InMemoryImpl/src/com/keyvalueStore/KeyValueStore.java @@ -10,40 +10,86 @@ import com.keyvalueStore.interfaces.IKeyValueStore; import com.map.interfaces.IKeyValueMap; +// TODO: Auto-generated Javadoc +/** + * The Class KeyValueStore. + * + * @param the generic type + * @param the generic type + * @param the generic type + */ public class KeyValueStore implements IKeyValueStore { + /** The key value map. */ private IKeyValueMap keyValueMap; + /** The key value map factory. */ private IKeyValueMapFactory keyValueMapFactory; + /** + * Instantiates a new key value store. + * + * @param keyValueMapFactory the key value map factory + */ public KeyValueStore(IKeyValueMapFactory keyValueMapFactory) { this.keyValueMapFactory = keyValueMapFactory; this.keyValueMap = this.keyValueMapFactory.getKeyValueMap(); } + /** + * Gets the. + * + * @param key the key + * @return the i value attribute + */ @Override public IValueAttribute get(Key key) { return this.keyValueMap.get(key); } + /** + * Search. + * + * @param attributeKey the attribute key + * @param attributeValue the attribute value + * @return the list + * @throws DataFormatIncorrectException the data format incorrect exception + */ @Override public List search(AttributeKey attributeKey, AttributeValue attributeValue) throws DataFormatIncorrectException { // TODO Auto-generated method stub return this.keyValueMap.getKeyContainingAttributeKeyValuePair(attributeKey, attributeValue); } + /** + * Put. + * + * @param key the key + * @param listOfAttributesPair the list of attributes pair + * @throws DataFormatIncorrectException the data format incorrect exception + */ @Override public void put(Key key, List> listOfAttributesPair) throws DataFormatIncorrectException { this.keyValueMap.put(key, new ValueAttribute(listOfAttributesPair)); } + /** + * Delete. + * + * @param key the key + */ @Override public void delete(Key key) { this.keyValueMap.deleteKey(key); } + /** + * Keys. + * + * @return the list + */ @Override public List keys() { return this.keyValueMap.getKeys(); diff --git a/InMemoryImpl/src/com/keyvalueStore/KeyValueStoreInterface.java b/InMemoryImpl/src/com/keyvalueStore/KeyValueStoreInterface.java index 65475dea..2712c87a 100644 --- a/InMemoryImpl/src/com/keyvalueStore/KeyValueStoreInterface.java +++ b/InMemoryImpl/src/com/keyvalueStore/KeyValueStoreInterface.java @@ -16,15 +16,25 @@ import com.keyvalueStore.interfaces.IKeyValueStore; import com.keyvalueStore.interfaces.IKeyValueStoreInterface; +// TODO: Auto-generated Javadoc +/** + * The Class KeyValueStoreInterface. + */ public class KeyValueStoreInterface implements IKeyValueStoreInterface { + /** The key value store. */ private IKeyValueStore keyValueStore; + /** The result formatter. */ private IResultFormatter resultFormatter; + /** The input formatter. */ private IInputFormatter inputFormatter; + /** + * Instantiates a new key value store interface. + */ public KeyValueStoreInterface() { this.keyValueStore = new KeyValueStore(new KeyValueMapFactory()); this.inputFormatter = new InputFormatter(); @@ -33,6 +43,12 @@ public KeyValueStoreInterface() { } + /** + * Return result. + * + * @param input the input + * @return the list + */ @Override public List returnResult(List input) { List result = new ArrayList(); @@ -50,6 +66,13 @@ public List returnResult(List input) { return result; } + /** + * Process input. + * + * @param inputString the input string + * @return the string + * @throws KeyValueStoreException the key value store exception + */ private String processInput(String inputString) throws KeyValueStoreException { String[] parts = inputString.split(" "); @@ -87,12 +110,25 @@ private String processInput(String inputString) throws KeyValueStoreException { } + /** + * Parses the and execute KEYS operation. + * + * @return the string + * @throws KeyValueStoreException the key value store exception + */ private String parseAndExecuteKEYSOperation() throws KeyValueStoreException { return this.resultFormatter.getResultString(this.keyValueStore.keys()); } + /** + * Parses the and execute GET operation. + * + * @param parts the parts + * @return the string + * @throws KeyValueStoreException the key value store exception + */ private String parseAndExecuteGETOperation(String[] parts) throws KeyValueStoreException { String input = this.inputFormatter.parseGetOperationInput(parts); @@ -108,6 +144,13 @@ private String parseAndExecuteGETOperation(String[] parts) throws KeyValueStoreE } + /** + * Parses the and execute DELETE operation. + * + * @param parts the parts + * @return the string + * @throws KeyValueStoreException the key value store exception + */ private String parseAndExecuteDELETEOperation(String[] parts) throws KeyValueStoreException { @@ -117,6 +160,13 @@ private String parseAndExecuteDELETEOperation(String[] parts) throws KeyValueSto } + /** + * Parses the and execute PUT operation. + * + * @param parts the parts + * @return the string + * @throws KeyValueStoreException the key value store exception + */ private String parseAndExecutePUTOperation(String[] parts) throws KeyValueStoreException { Pair>> input = this.inputFormatter.parsePutOperationInput(parts); @@ -125,6 +175,13 @@ private String parseAndExecutePUTOperation(String[] parts) throws KeyValueStoreE return ""; } + /** + * Parses the and execute SEARCH operation. + * + * @param parts the parts + * @return the string + * @throws KeyValueStoreException the key value store exception + */ private String parseAndExecuteSEARCHOperation(String[] parts) throws KeyValueStoreException { Pair input = this.inputFormatter.parseSearchOperationInput(parts); List result = this.keyValueStore.search(input.getKey(), input.getValue()); diff --git a/InMemoryImpl/src/com/keyvalueStore/interfaces/IKeyValueStore.java b/InMemoryImpl/src/com/keyvalueStore/interfaces/IKeyValueStore.java index a4f10d9d..2da4ef69 100644 --- a/InMemoryImpl/src/com/keyvalueStore/interfaces/IKeyValueStore.java +++ b/InMemoryImpl/src/com/keyvalueStore/interfaces/IKeyValueStore.java @@ -7,15 +7,54 @@ import com.exceptions.DataFormatIncorrectException; +// TODO: Auto-generated Javadoc +/** + * The Interface IKeyValueStore. + * + * @param the generic type + * @param the generic type + * @param the generic type + */ public interface IKeyValueStore { + /** + * Gets the. + * + * @param key the key + * @return the i value attribute + */ IValueAttribute get(Key key); + /** + * Search. + * + * @param attributeKey the attribute key + * @param attributeValue the attribute value + * @return the list + * @throws DataFormatIncorrectException the data format incorrect exception + */ List search(AttributeKey attributeKey, AttributeValue attributeValue) throws DataFormatIncorrectException; + /** + * Put. + * + * @param key the key + * @param listOfAttributesPair the list of attributes pair + * @throws DataFormatIncorrectException the data format incorrect exception + */ void put(Key key, List> listOfAttributesPair) throws DataFormatIncorrectException; + /** + * Delete. + * + * @param key the key + */ void delete(Key key); + /** + * Keys. + * + * @return the list + */ List keys(); } diff --git a/InMemoryImpl/src/com/keyvalueStore/interfaces/IKeyValueStoreInterface.java b/InMemoryImpl/src/com/keyvalueStore/interfaces/IKeyValueStoreInterface.java index cd56b093..c0e757ea 100644 --- a/InMemoryImpl/src/com/keyvalueStore/interfaces/IKeyValueStoreInterface.java +++ b/InMemoryImpl/src/com/keyvalueStore/interfaces/IKeyValueStoreInterface.java @@ -2,7 +2,18 @@ import java.util.List; +// TODO: Auto-generated Javadoc +/** + * The Interface IKeyValueStoreInterface. + */ public interface IKeyValueStoreInterface { + + /** + * Return result. + * + * @param input the input + * @return the list + */ List returnResult(List input); } diff --git a/InMemoryImpl/src/com/main/InterfaceMain.java b/InMemoryImpl/src/com/main/InterfaceMain.java index 6751fcba..3271475e 100644 --- a/InMemoryImpl/src/com/main/InterfaceMain.java +++ b/InMemoryImpl/src/com/main/InterfaceMain.java @@ -3,13 +3,21 @@ import java.util.ArrayList; import java.util.List; import java.util.Scanner; -import java.util.stream.Stream; import com.keyvalueStore.KeyValueStoreInterface; import com.keyvalueStore.interfaces.IKeyValueStoreInterface; +// TODO: Auto-generated Javadoc +/** + * The Class InterfaceMain. + */ public class InterfaceMain { + /** + * The main method. + * + * @param args the arguments + */ public static void main(String[] args) { IKeyValueStoreInterface keyValueStoreInterface = new KeyValueStoreInterface(); diff --git a/InMemoryImpl/src/com/main/Main.java b/InMemoryImpl/src/com/main/Main.java index af1726ee..a5b2971f 100644 --- a/InMemoryImpl/src/com/main/Main.java +++ b/InMemoryImpl/src/com/main/Main.java @@ -10,8 +10,18 @@ import com.keyvalueStore.interfaces.IKeyValueStore; import com.map.KeyValueMap; +// TODO: Auto-generated Javadoc +/** + * The Class Main. + */ public class Main { + /** + * The main method. + * + * @param args the arguments + * @throws DataFormatIncorrectException the data format incorrect exception + */ public static void main(String[] args) throws DataFormatIncorrectException { IKeyValueStore keyValueStore = new KeyValueStore<>(new KeyValueMapFactory()); diff --git a/InMemoryImpl/src/com/map/KeyValueMap.java b/InMemoryImpl/src/com/map/KeyValueMap.java index 5a46763a..e25ee2b5 100644 --- a/InMemoryImpl/src/com/map/KeyValueMap.java +++ b/InMemoryImpl/src/com/map/KeyValueMap.java @@ -12,16 +12,32 @@ import com.factories.interfaces.IAttributeKeyValueMapFactory; import com.map.interfaces.IKeyValueMap; +// TODO: Auto-generated Javadoc +/** + * The Class KeyValueMap. + * + * @param the generic type + * @param the generic type + * @param the generic type + */ public class KeyValueMap implements IKeyValueMap { + /** The attribute map. */ private HashMap> attributeMap; + /** The key attribute map. */ private HashMap> keyAttributeMap; + /** The attribute key value map factory. */ private IAttributeKeyValueMapFactory attributeKeyValueMapFactory; + /** + * Instantiates a new key value map. + * + * @param attributeKeyValueMapFactory the attribute key value map factory + */ public KeyValueMap(IAttributeKeyValueMapFactory attributeKeyValueMapFactory) { this.attributeKeyValueMapFactory = attributeKeyValueMapFactory; this.attributeMap = new HashMap>(); @@ -29,6 +45,12 @@ public KeyValueMap(IAttributeKeyValueMapFactory attributeKeyValueMapFactory) { this.keyAttributeMap = new HashMap>(); } + /** + * Gets the. + * + * @param key the key + * @return the i value attribute + */ @Override public IValueAttribute get(Key key) { IValueAttribute value = new ValueAttribute(); @@ -50,6 +72,13 @@ public IValueAttribute get(Key key) { return value; } + /** + * Put. + * + * @param key the key + * @param value the value + * @throws DataFormatIncorrectException the data format incorrect exception + */ @Override public void put(Key key, IValueAttribute value) throws DataFormatIncorrectException { if (this.keyAttributeMap.containsKey(key)) { @@ -78,6 +107,14 @@ public void put(Key key, IValueAttribute value) th } + /** + * Gets the key containing attribute key value pair. + * + * @param attribute the attribute + * @param value the value + * @return the key containing attribute key value pair + * @throws DataFormatIncorrectException the data format incorrect exception + */ @Override public List getKeyContainingAttributeKeyValuePair(AttributeKey attribute, AttributeValue value) throws DataFormatIncorrectException { @@ -87,6 +124,11 @@ public List getKeyContainingAttributeKeyValuePair(AttributeKey attribute, A return this.attributeMap.get(attribute).getkeysWithValues(value); } + /** + * Gets the keys. + * + * @return the keys + */ @Override public List getKeys() { List keys = new ArrayList(); @@ -100,6 +142,11 @@ public List getKeys() { return keys; } + /** + * Delete key. + * + * @param key the key + */ @Override public void deleteKey(Key key) { if (!this.keyAttributeMap.containsKey(key)) { diff --git a/InMemoryImpl/src/com/map/interfaces/IKeyValueMap.java b/InMemoryImpl/src/com/map/interfaces/IKeyValueMap.java index 10512b7e..deab708b 100644 --- a/InMemoryImpl/src/com/map/interfaces/IKeyValueMap.java +++ b/InMemoryImpl/src/com/map/interfaces/IKeyValueMap.java @@ -5,15 +5,55 @@ import com.attribute.interfaces.IValueAttribute; import com.exceptions.DataFormatIncorrectException; +// TODO: Auto-generated Javadoc +/** + * The Interface IKeyValueMap. + * + * @param the generic type + * @param the generic type + * @param the generic type + */ public interface IKeyValueMap { + + /** + * Gets the. + * + * @param key the key + * @return the i value attribute + */ IValueAttribute get(Key key); + /** + * Put. + * + * @param key the key + * @param value the value + * @throws DataFormatIncorrectException the data format incorrect exception + */ void put(Key key, IValueAttribute value) throws DataFormatIncorrectException; + /** + * Gets the key containing attribute key value pair. + * + * @param attribute the attribute + * @param value the value + * @return the key containing attribute key value pair + * @throws DataFormatIncorrectException the data format incorrect exception + */ List getKeyContainingAttributeKeyValuePair(AttributeKey attribute, AttributeValue value) throws DataFormatIncorrectException; + /** + * Gets the keys. + * + * @return the keys + */ List getKeys(); + /** + * Delete key. + * + * @param key the key + */ void deleteKey(Key key); }