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 }