diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..1b673a0
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..aa00ffa
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 0000000..712ab9d
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..b2173c2
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
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..a728296 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,94 @@
@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 Builder builder() {
+ return new Builder();
+ }
+
+ public static class Builder {
+
+ private DatabaseConfigurationBuilder databaseConfigurationBuilder;
+
+ Builder() {
+ databaseConfigurationBuilder = new DatabaseConfigurationBuilder();
+ }
+
+ public Builder setDatabaseUrl(String databaseUrl) {
+ this.databaseConfigurationBuilder.databaseUrl = databaseUrl;
+ return this;
+ }
+
+ public Builder setUsername(String username) {
+ this.databaseConfigurationBuilder.username = username;
+ return this;
+ }
+
+ public Builder setPassword(String password) {
+ this.databaseConfigurationBuilder.password = password;
+ return this;
+
+ }
+
+ public Builder setMaxConnections(int maxConnections) {
+ this.databaseConfigurationBuilder.maxConnections = maxConnections;
+ return this;
+ }
+
+ public Builder setEnableCache(boolean enableCache) {
+ this.databaseConfigurationBuilder.enableCache = enableCache;
+ return this;
+
+ }
+
+ public Builder setReadOnly(boolean isReadOnly) {
+ this.databaseConfigurationBuilder.isReadOnly = isReadOnly;
+ return this;
+ }
+
+ public DatabaseConfigurationBuilder build(){
+ DatabaseConfigurationBuilder db=new DatabaseConfigurationBuilder();
+ db.databaseUrl=this.databaseConfigurationBuilder.databaseUrl;
+ db.enableCache=this.databaseConfigurationBuilder.enableCache;
+ db.isReadOnly=this.databaseConfigurationBuilder.isReadOnly;
+ db.maxConnections=this.databaseConfigurationBuilder.maxConnections;
+ db.password=this.databaseConfigurationBuilder.password;
+ db.username=this.databaseConfigurationBuilder.username;
+ return db;
+ }
+ }
+
+ public String getDatabaseUrl() {
+ return databaseUrl;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public int getMaxConnections() {
+ return maxConnections;
+ }
+
+ public boolean isEnableCache() {
+ return enableCache;
+ }
+
+ public boolean isReadOnly() {
+ return isReadOnly;
+ }
}
\ 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..f12684d 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;
@@ -19,6 +19,44 @@ public Configuration(String themeColor, Boolean autoSave, String language, Boole
this.type = type;
}
+ public Configuration(Configuration reference) {
+ this.themeColor = reference.themeColor;
+ this.autoSave = reference.autoSave;
+ this.language = reference.language;
+ this.darkMode = reference.darkMode;
+ this.fontSize = reference.fontSize;
+ this.fontFamily = reference.fontFamily;
+ this.type = reference.type;
+ }
+
+ public void setThemeColor(String themeColor) {
+ this.themeColor = themeColor;
+ }
+
+ public void setAutoSave(Boolean autoSave) {
+ this.autoSave = autoSave;
+ }
+
+ public void setLanguage(String language) {
+ this.language = language;
+ }
+
+ public void setDarkMode(Boolean darkMode) {
+ this.darkMode = darkMode;
+ }
+
+ public void setFontSize(Integer fontSize) {
+ this.fontSize = fontSize;
+ }
+
+ public void setFontFamily(String fontFamily) {
+ this.fontFamily = fontFamily;
+ }
+
+ public void setType(ConfigurationType type) {
+ this.type = type;
+ }
+
public String getThemeColor() {
return themeColor;
}
@@ -46,4 +84,9 @@ public String getFontFamily() {
public ConfigurationType getType() {
return type;
}
+
+ @Override
+ public Configuration cloneObject() {
+ return new Configuration(this);
+ }
}
\ No newline at end of file
diff --git a/src/main/java/com/scaler/lld/design/assignments/prototype/ConfigurationPrototypeRegistry.java b/src/main/java/com/scaler/lld/design/assignments/prototype/ConfigurationPrototypeRegistry.java
index 245b2cf..cdd2c09 100644
--- a/src/main/java/com/scaler/lld/design/assignments/prototype/ConfigurationPrototypeRegistry.java
+++ b/src/main/java/com/scaler/lld/design/assignments/prototype/ConfigurationPrototypeRegistry.java
@@ -1,7 +1,9 @@
package com.scaler.lld.design.assignments.prototype;
-public interface ConfigurationPrototypeRegistry {
+import java.util.HashMap;
+import java.util.Map;
+public interface ConfigurationPrototypeRegistry {
void addPrototype(Configuration user);
Configuration getPrototype(ConfigurationType type);
diff --git a/src/main/java/com/scaler/lld/design/assignments/prototype/Registry.java b/src/main/java/com/scaler/lld/design/assignments/prototype/Registry.java
new file mode 100644
index 0000000..f52e001
--- /dev/null
+++ b/src/main/java/com/scaler/lld/design/assignments/prototype/Registry.java
@@ -0,0 +1,23 @@
+package com.scaler.lld.design.assignments.prototype;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Registry implements ConfigurationPrototypeRegistry{
+ private Map registry = new HashMap<>();
+ @Override
+ public void addPrototype(Configuration user) {
+ registry.put(user.getType(), user);
+ }
+
+ @Override
+ public Configuration getPrototype(ConfigurationType type) {
+ return registry.get(type);
+ }
+
+ @Override
+ public Configuration clone(ConfigurationType type) {
+ Configuration configuration = registry.get(type);
+ return configuration.cloneObject();
+ }
+}
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..245b9d3 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,49 +1,70 @@
package com.scaler.lld.design.assignments.singleton;
public class FileBasedConfigurationManagerImpl extends FileBasedConfigurationManager {
+ private static FileBasedConfigurationManager INSTANCE;
+
+ private FileBasedConfigurationManagerImpl() {
+ }
@Override
public String getConfiguration(String key) {
// TODO Auto-generated method stub
- throw new UnsupportedOperationException("Unimplemented method 'getConfiguration'");
+ //throw new UnsupportedOperationException("Unimplemented method 'getConfiguration'");
+ return this.properties.getProperty(key);
}
@Override
public T getConfiguration(String key, Class type) {
// TODO Auto-generated method stub
- throw new UnsupportedOperationException("Unimplemented method 'getConfiguration'");
+ //throw new UnsupportedOperationException("Unimplemented method 'getConfiguration'");
+ T result = null;
+ String configuration = this.properties.getProperty(key);
+ if (configuration != null) {
+ result = convert(configuration, type);
+ }
+ return result;
}
@Override
public void setConfiguration(String key, String value) {
// TODO Auto-generated method stub
- throw new UnsupportedOperationException("Unimplemented method 'setConfiguration'");
+ //throw new UnsupportedOperationException("Unimplemented method 'setConfiguration'");
+ this.properties.setProperty(key, value);
}
@Override
public void setConfiguration(String key, T value) {
// TODO Auto-generated method stub
- throw new UnsupportedOperationException("Unimplemented method 'setConfiguration'");
+ //throw new UnsupportedOperationException("Unimplemented method 'setConfiguration'");
+ this.properties.setProperty(key, String.valueOf(value));
}
@Override
public void removeConfiguration(String key) {
// TODO Auto-generated method stub
- throw new UnsupportedOperationException("Unimplemented method 'removeConfiguration'");
+ //throw new UnsupportedOperationException("Unimplemented method 'removeConfiguration'");
+ this.properties.remove(key);
}
@Override
public void clear() {
// TODO Auto-generated method stub
- throw new UnsupportedOperationException("Unimplemented method 'clear'");
+ //throw new UnsupportedOperationException("Unimplemented method 'clear'");
+ this.properties.clear();
}
public static FileBasedConfigurationManager getInstance() {
- // TODO Auto-generated method stub
- return null;
+ if (INSTANCE == null) {
+ synchronized (FileBasedConfigurationManagerImpl.class) {
+ if(INSTANCE == null)
+ INSTANCE = new FileBasedConfigurationManagerImpl();
+ }
+ }
+ return INSTANCE;
}
public static void resetInstance() {
+ INSTANCE = null;
// TODO Auto-generated method stub
}