diff --git a/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilder.java b/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilder.java index 592aa32..731e5b2 100644 --- a/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilder.java +++ b/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilder.java @@ -2,5 +2,66 @@ @WithBuilder public class DatabaseConfigurationBuilder { + private String databaseUrl; + private String username; + private String password; + private int maxConnections; + private boolean enableCache; + private boolean isReadOnly; + private DatabaseConfigurationBuilder() { + } + + public static class Builder { + private String databaseUrl; + private String username; + private String password; + private int maxConnections; + private boolean enableCache; + private boolean isReadOnly; + + public Builder() { + } + + public DatabaseConfigurationBuilder build() { + DatabaseConfigurationBuilder outerClassObj = new DatabaseConfigurationBuilder(); + outerClassObj.databaseUrl = databaseUrl; + outerClassObj.username = username; + outerClassObj.password = password; + outerClassObj.maxConnections = maxConnections; + outerClassObj.enableCache = enableCache; + outerClassObj.isReadOnly = isReadOnly; + return outerClassObj; + } + + public Builder url(String databaseUrl) { + this.databaseUrl = databaseUrl; + return this; + } + + public Builder username(String username) { + this.username = username; + return this; + } + + public Builder password(String password) { + this.password = password; + return this; + } + + public Builder maxConnections(int maxConnections) { + this.maxConnections = maxConnections; + return this; + } + + public Builder enableCache(boolean enableCache) { + this.enableCache = enableCache; + return this; + } + + public Builder readOnly(boolean readOnly) { + isReadOnly = readOnly; + return this; + } + } } \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilderWithoutFieldsDuplication.java b/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilderWithoutFieldsDuplication.java new file mode 100644 index 0000000..9c2c2d6 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/assignments/builder/DatabaseConfigurationBuilderWithoutFieldsDuplication.java @@ -0,0 +1,63 @@ +package com.scaler.lld.design.assignments.builder; + +//@WithBuilder +public class DatabaseConfigurationBuilderWithoutFieldsDuplication { + private String databaseUrl; + private String username; + private String password; + private int maxConnections; + private boolean enableCache; + private boolean isReadOnly; + + private DatabaseConfigurationBuilderWithoutFieldsDuplication() { + } + + public static class Builder { + private DatabaseConfigurationBuilderWithoutFieldsDuplication instance; + public Builder() { + instance = new DatabaseConfigurationBuilderWithoutFieldsDuplication(); + } + + public DatabaseConfigurationBuilderWithoutFieldsDuplication build() { + //return new object instead of "instance" variable due to immutability advantage. + DatabaseConfigurationBuilderWithoutFieldsDuplication outerClassObj = new DatabaseConfigurationBuilderWithoutFieldsDuplication(); + outerClassObj.databaseUrl = instance.databaseUrl; + outerClassObj.username = instance.username; + outerClassObj.password = instance.password; + outerClassObj.maxConnections = instance.maxConnections;; + outerClassObj.enableCache = instance.enableCache; + outerClassObj.isReadOnly = instance.isReadOnly; + return outerClassObj; + } + + public Builder url(String databaseUrl) { + instance.databaseUrl = databaseUrl; + return this; + } + + public Builder username(String username) { + instance.username = username; + return this; + } + + public Builder password(String password) { + instance.password = password; + return this; + } + + public Builder maxConnections(int maxConnections) { + instance.maxConnections = maxConnections; + return this; + } + + public Builder enableCache(boolean enableCache) { + instance.enableCache = enableCache; + return this; + } + + public Builder readOnly(boolean readOnly) { + instance.isReadOnly = readOnly; + return this; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/assignments/prototype/Configuration.java b/src/main/java/com/scaler/lld/design/assignments/prototype/Configuration.java index 597f36e..7c7599a 100644 --- a/src/main/java/com/scaler/lld/design/assignments/prototype/Configuration.java +++ b/src/main/java/com/scaler/lld/design/assignments/prototype/Configuration.java @@ -1,6 +1,6 @@ package com.scaler.lld.design.assignments.prototype; -public class Configuration { +public class Configuration implements ClonableObject { private String themeColor; private Boolean autoSave; private String language; @@ -46,4 +46,9 @@ public String getFontFamily() { public ConfigurationType getType() { return type; } + + @Override + public Configuration cloneObject() { + return new Configuration(themeColor, autoSave, language, darkMode, fontSize, fontFamily, type); + } } \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/assignments/prototype/ConfigurationPrototypeRegistryImpl.java b/src/main/java/com/scaler/lld/design/assignments/prototype/ConfigurationPrototypeRegistryImpl.java new file mode 100644 index 0000000..be7943b --- /dev/null +++ b/src/main/java/com/scaler/lld/design/assignments/prototype/ConfigurationPrototypeRegistryImpl.java @@ -0,0 +1,28 @@ +package com.scaler.lld.design.assignments.prototype; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class ConfigurationPrototypeRegistryImpl implements ConfigurationPrototypeRegistry { + Map configurationRegistry = new HashMap<>(); + + @Override + public void addPrototype(Configuration user) { + configurationRegistry.put(user.getType(), user); + } + + @Override + public Configuration getPrototype(ConfigurationType type) { + return configurationRegistry.get(type); + } + + @Override + public Configuration clone(ConfigurationType type) { + Configuration configuration = getPrototype(type); + if(Objects.nonNull(configuration)) { + return configuration.cloneObject(); + } + return null; + } +} diff --git a/src/main/java/com/scaler/lld/design/assignments/singleton/FileBasedConfigurationManagerImpl.java b/src/main/java/com/scaler/lld/design/assignments/singleton/FileBasedConfigurationManagerImpl.java index 15470fc..5189555 100644 --- a/src/main/java/com/scaler/lld/design/assignments/singleton/FileBasedConfigurationManagerImpl.java +++ b/src/main/java/com/scaler/lld/design/assignments/singleton/FileBasedConfigurationManagerImpl.java @@ -1,50 +1,58 @@ package com.scaler.lld.design.assignments.singleton; +import java.util.Objects; + public class FileBasedConfigurationManagerImpl extends FileBasedConfigurationManager { + private static FileBasedConfigurationManagerImpl instance; + + private FileBasedConfigurationManagerImpl() { + super(); + } + @Override public String getConfiguration(String key) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'getConfiguration'"); + return properties.getProperty(key); } @Override public T getConfiguration(String key, Class type) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'getConfiguration'"); + String propertyValue = properties.getProperty(key); + if(propertyValue == null) { + return null; + } + return convert(propertyValue, type); } @Override public void setConfiguration(String key, String value) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'setConfiguration'"); + properties.setProperty(key, value); } @Override public void setConfiguration(String key, T value) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'setConfiguration'"); + properties.setProperty(key, String.valueOf(value)); } @Override public void removeConfiguration(String key) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'removeConfiguration'"); + properties.remove(key); } @Override public void clear() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'clear'"); + properties.clear(); } public static FileBasedConfigurationManager getInstance() { - // TODO Auto-generated method stub - return null; + if(Objects.isNull(instance)) { + instance = new FileBasedConfigurationManagerImpl(); + } + return instance; } public static void resetInstance() { - // TODO Auto-generated method stub + instance = null; } } \ No newline at end of file