From a6383cc1d0077f21e77fc341100cff570c6c6d51 Mon Sep 17 00:00:00 2001 From: Onkar Marbhal Date: Fri, 13 Oct 2023 11:11:02 +0530 Subject: [PATCH 1/4] feat: singleton assignment solution added in new package. --- .../FileBasedConfigurationManager.java | 62 +++++++++++++++++++ .../FileBasedConfigurationManagerImpl.java | 58 +++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 src/main/java/com/scaler/lld/design/solutions/singleton/FileBasedConfigurationManager.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/singleton/FileBasedConfigurationManagerImpl.java diff --git a/src/main/java/com/scaler/lld/design/solutions/singleton/FileBasedConfigurationManager.java b/src/main/java/com/scaler/lld/design/solutions/singleton/FileBasedConfigurationManager.java new file mode 100644 index 0000000..097c31b --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/singleton/FileBasedConfigurationManager.java @@ -0,0 +1,62 @@ +package com.scaler.lld.design.solutions.singleton; + +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Properties; + +public abstract class FileBasedConfigurationManager { + + protected final Properties properties; + + public FileBasedConfigurationManager() { + this.properties = new Properties(); + } + + public void load(String filePath) { + try (FileInputStream fileInputStream = new FileInputStream(filePath)) { + properties.load(fileInputStream); + } catch (IOException e) { + throw new RuntimeException("Error while loading configuration file", e); + } + } + + public static FileBasedConfigurationManager getInstance() { + throw new UnsupportedOperationException("Not implemented yet"); + } + + protected static void resetInstance() { + + } + + public abstract String getConfiguration(String key); + + public abstract T getConfiguration(String key, Class type); + + public abstract void setConfiguration(String key, String value); + + public abstract void setConfiguration(String key, T value); + + public abstract void removeConfiguration(String key); + + public abstract void clear(); + + protected Properties getProperties() { + return properties; + } + + protected T convert(String value, Class type) { + System.out.println("Converting " + value + " to " + type.getSimpleName()); + switch (type.getSimpleName()) { + case "Integer": + return (T) Integer.valueOf(value); + case "Long": + return (T) Long.valueOf(value); + case "Float": + return (T) Float.valueOf(value); + case "Double": + return (T) Double.valueOf(value); + } + throw new UnsupportedOperationException("Invalid type: " + type.getSimpleName()); + } + +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/singleton/FileBasedConfigurationManagerImpl.java b/src/main/java/com/scaler/lld/design/solutions/singleton/FileBasedConfigurationManagerImpl.java new file mode 100644 index 0000000..383462a --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/singleton/FileBasedConfigurationManagerImpl.java @@ -0,0 +1,58 @@ +package com.scaler.lld.design.solutions.singleton; + +public class FileBasedConfigurationManagerImpl extends FileBasedConfigurationManager { + + private static FileBasedConfigurationManagerImpl INSTANCE; + + private FileBasedConfigurationManagerImpl() { + } + + @Override + public String getConfiguration(String key) { + return getProperties().getProperty(key); + } + + @Override + public T getConfiguration(String key, Class type) { + String value = getProperties().getProperty(key); + if(value != null) + return convert(getProperties().getProperty(key), type); + return null; + } + + @Override + public void setConfiguration(String key, String value) { + getProperties().setProperty(key, value); + } + + @Override + public void setConfiguration(String key, T value) { + getProperties().setProperty(key, value.toString()); + } + + @Override + public void removeConfiguration(String key) { + getProperties().remove(key); + } + + @Override + public void clear() { + getProperties().clear(); + } + + public static FileBasedConfigurationManager getInstance() { + if (INSTANCE == null){ + synchronized (FileBasedConfigurationManagerImpl.class) { + if(INSTANCE == null){ + INSTANCE = new FileBasedConfigurationManagerImpl(); + } + } + } + return INSTANCE; + } + + public static void resetInstance() { + INSTANCE = null; + } + +} \ No newline at end of file From 392b9ed3097fc0a57b2bb3495f32f55037a8dbb3 Mon Sep 17 00:00:00 2001 From: Onkar Marbhal Date: Sun, 15 Oct 2023 16:15:17 +0530 Subject: [PATCH 2/4] feat: prototype and registry pattern solutions added. --- .../solutions/prototype/ClonableObject.java | 5 + .../solutions/prototype/Configuration.java | 64 ++++++++++ .../ConfigurationPrototypeRegistry.java | 10 ++ .../ConfigurationPrototypeRegistryImpl.java | 24 ++++ .../prototype/ConfigurationType.java | 8 ++ .../prototype/ConfigurationTest.java | 116 ++++++++++++++++++ 6 files changed, 227 insertions(+) create mode 100644 src/main/java/com/scaler/lld/design/solutions/prototype/ClonableObject.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/prototype/Configuration.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/prototype/ConfigurationPrototypeRegistry.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/prototype/ConfigurationPrototypeRegistryImpl.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/prototype/ConfigurationType.java create mode 100644 src/test/java/com/scaler/lld/design/solutions/prototype/ConfigurationTest.java diff --git a/src/main/java/com/scaler/lld/design/solutions/prototype/ClonableObject.java b/src/main/java/com/scaler/lld/design/solutions/prototype/ClonableObject.java new file mode 100644 index 0000000..c5cde65 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/prototype/ClonableObject.java @@ -0,0 +1,5 @@ +package com.scaler.lld.design.solutions.prototype; + +public interface ClonableObject { + T cloneObject(); +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/prototype/Configuration.java b/src/main/java/com/scaler/lld/design/solutions/prototype/Configuration.java new file mode 100644 index 0000000..16fbdb7 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/prototype/Configuration.java @@ -0,0 +1,64 @@ +package com.scaler.lld.design.solutions.prototype; + +public class Configuration implements ClonableObject{ + private String themeColor; + private Boolean autoSave; + private String language; + private Boolean darkMode; + private Integer fontSize; + private String fontFamily; + private ConfigurationType type; + + public Configuration(String themeColor, Boolean autoSave, String language, Boolean darkMode, Integer fontSize, String fontFamily, ConfigurationType type) { + this.themeColor = themeColor; + this.autoSave = autoSave; + this.language = language; + this.darkMode = darkMode; + this.fontSize = fontSize; + this.fontFamily = fontFamily; + this.type = type; + } + + public Configuration(Configuration configuration) { + this.themeColor = configuration.themeColor; + this.autoSave = configuration.autoSave; + this.language = configuration.language; + this.darkMode = configuration.darkMode; + this.fontSize = configuration.fontSize; + this.fontFamily = configuration.fontFamily; + this.type = configuration.type; + } + + public String getThemeColor() { + return themeColor; + } + + public Boolean getAutoSave() { + return autoSave; + } + + public String getLanguage() { + return language; + } + + public Boolean getDarkMode() { + return darkMode; + } + + public Integer getFontSize() { + return fontSize; + } + + public String getFontFamily() { + return fontFamily; + } + + 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/solutions/prototype/ConfigurationPrototypeRegistry.java b/src/main/java/com/scaler/lld/design/solutions/prototype/ConfigurationPrototypeRegistry.java new file mode 100644 index 0000000..10e00e3 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/prototype/ConfigurationPrototypeRegistry.java @@ -0,0 +1,10 @@ +package com.scaler.lld.design.solutions.prototype; + +public interface ConfigurationPrototypeRegistry { + + void addPrototype(Configuration user); + + Configuration getPrototype(ConfigurationType type); + + Configuration clone(ConfigurationType type); +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/prototype/ConfigurationPrototypeRegistryImpl.java b/src/main/java/com/scaler/lld/design/solutions/prototype/ConfigurationPrototypeRegistryImpl.java new file mode 100644 index 0000000..2410405 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/prototype/ConfigurationPrototypeRegistryImpl.java @@ -0,0 +1,24 @@ +package com.scaler.lld.design.solutions.prototype; + +import java.util.HashMap; +import java.util.Map; + +public class ConfigurationPrototypeRegistryImpl implements ConfigurationPrototypeRegistry { + + private Map map = new HashMap(); + + @Override + public void addPrototype(Configuration user) { + map.put(user.getType(), user); + } + + @Override + public Configuration getPrototype(ConfigurationType type) { + return map.get(type); + } + + @Override + public Configuration clone(ConfigurationType type) { + return map.get(type).cloneObject(); + } +} diff --git a/src/main/java/com/scaler/lld/design/solutions/prototype/ConfigurationType.java b/src/main/java/com/scaler/lld/design/solutions/prototype/ConfigurationType.java new file mode 100644 index 0000000..fab6109 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/prototype/ConfigurationType.java @@ -0,0 +1,8 @@ +package com.scaler.lld.design.solutions.prototype; + +public enum ConfigurationType { + BASIC, + ADVANCED, + CUSTOM, + DEFAULT +} diff --git a/src/test/java/com/scaler/lld/design/solutions/prototype/ConfigurationTest.java b/src/test/java/com/scaler/lld/design/solutions/prototype/ConfigurationTest.java new file mode 100644 index 0000000..35e1bd9 --- /dev/null +++ b/src/test/java/com/scaler/lld/design/solutions/prototype/ConfigurationTest.java @@ -0,0 +1,116 @@ +package com.scaler.lld.design.solutions.prototype; + +import org.junit.jupiter.api.Test; +import org.reflections.Reflections; +import org.reflections.scanners.SubTypesScanner; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.*; + +public class ConfigurationTest { + + @Test + public void testConfigurationImplementsClonableObject() { + Class configurationClass = com.scaler.lld.design.solutions.prototype.Configuration.class; + Class[] interfaces = configurationClass.getInterfaces(); + + boolean implementsClonableObject = false; + + for (Class iface : interfaces) { + if (iface == ClonableObject.class) { + implementsClonableObject = true; + break; + } + } + + assertTrue(implementsClonableObject, "If the prototype pattern is implemented correctly, the Configuration class should implement the ClonableObject interface"); + } + + @Test + public void testConfigurationCloneMethodCreatesDistinctObject() { + com.scaler.lld.design.solutions.prototype.Configuration configuration = new com.scaler.lld.design.solutions.prototype.Configuration("Black", true, "English", true, 12, "Arial", com.scaler.lld.design.solutions.prototype.ConfigurationType.BASIC); + + // Using reflection to find and invoke the clone method + try { + Method cloneMethod = configuration.getClass().getMethod("cloneObject"); + assertNotNull(cloneMethod, "If the prototype pattern is implemented correctly, the Configuration class should have a cloneObject method"); + + // Calling the clone method to create a copy + com.scaler.lld.design.solutions.prototype.Configuration clonedConfiguration = (com.scaler.lld.design.solutions.prototype.Configuration) cloneMethod.invoke(configuration); + assertNotNull(clonedConfiguration, "If the clone method is implemented correctly, it should return a non-null object"); + + // Validating that the clonedConfiguration is not the same object as configuration + assertNotSame(configuration, clonedConfiguration, "If the clone method is implemented correctly, it should return a new object"); + + // Asserting that the cloned configuration has the same values as the original configuration + assertEquals(configuration.getThemeColor(), clonedConfiguration.getThemeColor(), "If the clone method is implemented correctly, it should return a new object with the same values as the original object"); + assertEquals(configuration.getAutoSave(), clonedConfiguration.getAutoSave(), "If the clone method is implemented correctly, it should return a new object with the same values as the original object"); + assertEquals(configuration.getFontSize(), clonedConfiguration.getFontSize(), "If the clone method is implemented correctly, it should return a new object with the same values as the original object"); + assertEquals(configuration.getDarkMode(), clonedConfiguration.getDarkMode(), "If the clone method is implemented correctly, it should return a new object with the same values as the original object"); + assertEquals(configuration.getLanguage(), clonedConfiguration.getLanguage(), "If the clone method is implemented correctly, it should return a new object with the same values as the original object"); + assertEquals(configuration.getFontFamily(), clonedConfiguration.getFontFamily(), "If the clone method is implemented correctly, it should return a new object with the same values as the original object"); + assertEquals(configuration.getType(), clonedConfiguration.getType(), "If the clone method is implemented correctly, it should return a new object with the same values as the original object"); + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + fail("If the prototype pattern is implemented correctly, the Configuration class should have a cloneObject method"); + } + } + + @Test + public void testRegistry() { + + com.scaler.lld.design.solutions.prototype.ConfigurationPrototypeRegistry registry = getRegistry(); + assertNotNull(registry, "If the registry pattern is implemented correctly, the registry should not be null"); + + com.scaler.lld.design.solutions.prototype.Configuration configuration = new com.scaler.lld.design.solutions.prototype.Configuration("Black", true, "English", true, 12, "Arial", com.scaler.lld.design.solutions.prototype.ConfigurationType.BASIC); + registry.addPrototype(configuration); + + com.scaler.lld.design.solutions.prototype.Configuration prototype = registry.getPrototype(configuration.getType()); + assertNotNull(prototype, "If the clone method is implemented correctly, it should return a non-null object"); + assertSame(configuration, prototype, "If the registry pattern is implemented correctly, the registry should return the same object that was added"); + } + + private static com.scaler.lld.design.solutions.prototype.ConfigurationPrototypeRegistry getRegistry() { + // Use Reflections to find the class implementing ConfigurationPrototypeRegistry + Reflections reflections = new Reflections(ConfigurationTest.class.getPackageName(), + new SubTypesScanner(false)); + Set> classes = reflections.getSubTypesOf(com.scaler.lld.design.solutions.prototype.ConfigurationPrototypeRegistry.class); + + // Ensure there is exactly one class implementing the interface + assertEquals(1, classes.size(), "If the registry pattern is implemented correctly, there should be exactly one class implementing ConfigurationPrototypeRegistry"); + + // Instantiate the registry implementation + Class registryClass = classes.iterator().next(); + try { + return registryClass.getDeclaredConstructor().newInstance(); + } catch (Exception e) { + fail("If the registry pattern is implemented correctly, the registry class should have a public no-args constructor"); + } + return null; + } + + @Test + public void testRegistryClone() { + + com.scaler.lld.design.solutions.prototype.Configuration configuration = new com.scaler.lld.design.solutions.prototype.Configuration("Black", true, "English", true, 12, "Arial", ConfigurationType.BASIC); + ConfigurationPrototypeRegistry registry = getRegistry(); + assertNotNull(registry, "If the registry pattern is implemented correctly, the registry should not be null"); + + registry.addPrototype(configuration); + + // Clone the prototype and validate it's a distinct object with the same values + Configuration clonedConfiguration = registry.clone(configuration.getType()); + assertNotNull(clonedConfiguration, "If the clone method is implemented correctly, it should return a non-null object"); + assertNotSame(configuration, clonedConfiguration, "If the clone method is implemented correctly, it should return a new object"); + + assertEquals(configuration.getThemeColor(), clonedConfiguration.getThemeColor(), "If the clone method is implemented correctly, it should return a new object with the same values as the original object"); + assertEquals(configuration.getAutoSave(), clonedConfiguration.getAutoSave(), "If the clone method is implemented correctly, it should return a new object with the same values as the original object"); + assertEquals(configuration.getFontSize(), clonedConfiguration.getFontSize(), "If the clone method is implemented correctly, it should return a new object with the same values as the original object"); + assertEquals(configuration.getDarkMode(), clonedConfiguration.getDarkMode(), "If the clone method is implemented correctly, it should return a new object with the same values as the original object"); + assertEquals(configuration.getLanguage(), clonedConfiguration.getLanguage(), "If the clone method is implemented correctly, it should return a new object with the same values as the original object"); + assertEquals(configuration.getFontFamily(), clonedConfiguration.getFontFamily(), "If the clone method is implemented correctly, it should return a new object with the same values as the original object"); + assertEquals(configuration.getType(), clonedConfiguration.getType(), "If the clone method is implemented correctly, it should return a new object with the same values as the original object"); + } +} \ No newline at end of file From e458c658e54548fc31562d1dc5cdcfaabad76801 Mon Sep 17 00:00:00 2001 From: Onkar Marbhal Date: Sat, 21 Oct 2023 00:16:27 +0530 Subject: [PATCH 3/4] feat: factory assignment solution. --- .../design/solutions/factory/AudioPlayer.java | 19 +++++++++ .../solutions/factory/AudioPlayerFactory.java | 14 +++++++ .../design/solutions/factory/FLACPlayer.java | 39 ++++++++++++++++++ .../solutions/factory/FLACPlayerFactory.java | 9 +++++ .../design/solutions/factory/MP3Player.java | 40 +++++++++++++++++++ .../solutions/factory/MP3PlayerFactory.java | 8 ++++ .../design/solutions/factory/MediaFormat.java | 7 ++++ .../design/solutions/factory/WAVPlayer.java | 39 ++++++++++++++++++ .../solutions/factory/WAVPlayerFactory.java | 9 +++++ 9 files changed, 184 insertions(+) create mode 100644 src/main/java/com/scaler/lld/design/solutions/factory/AudioPlayer.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/factory/AudioPlayerFactory.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/factory/FLACPlayer.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/factory/FLACPlayerFactory.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/factory/MP3Player.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/factory/MP3PlayerFactory.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/factory/MediaFormat.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/factory/WAVPlayer.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/factory/WAVPlayerFactory.java diff --git a/src/main/java/com/scaler/lld/design/solutions/factory/AudioPlayer.java b/src/main/java/com/scaler/lld/design/solutions/factory/AudioPlayer.java new file mode 100644 index 0000000..d86dd8c --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/factory/AudioPlayer.java @@ -0,0 +1,19 @@ +package com.scaler.lld.design.solutions.factory; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@AllArgsConstructor +@Getter +@Setter +public abstract class AudioPlayer { + + protected int volume; + protected double playBackRate; + + public abstract MediaFormat supportsType(); + public abstract void play(); + public abstract void pause(); + public abstract void stop(); +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/factory/AudioPlayerFactory.java b/src/main/java/com/scaler/lld/design/solutions/factory/AudioPlayerFactory.java new file mode 100644 index 0000000..d739a36 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/factory/AudioPlayerFactory.java @@ -0,0 +1,14 @@ +package com.scaler.lld.design.solutions.factory; + +public abstract class AudioPlayerFactory { + + public abstract AudioPlayer create(int volume, double playBackRate); + + public static AudioPlayer create(MediaFormat format, double playBackRate, int volume){ + return switch (format) { + case FLAC -> new FLACPlayer(volume, playBackRate); + case WAV -> new WAVPlayer(volume, playBackRate); + case MP3 -> new MP3Player(volume, playBackRate); + }; + } +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/factory/FLACPlayer.java b/src/main/java/com/scaler/lld/design/solutions/factory/FLACPlayer.java new file mode 100644 index 0000000..360a1d3 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/factory/FLACPlayer.java @@ -0,0 +1,39 @@ +package com.scaler.lld.design.solutions.factory; + +public class FLACPlayer extends AudioPlayer { + + public FLACPlayer(int volume, double playBackRate) { + super(volume, playBackRate); + } + + public void play() { + // Simulate playing audio in FLAC format + // Each media format will have its own implementation + System.out.println("Playing FLAC audio"); + } + + public void pause() { + // Simulate pausing audio in FLAC format + // Each media format will have its own implementation + System.out.println("Pausing FLAC audio"); + } + + public void stop() { + // Simulate stopping audio in FLAC format + // Each media format will have its own implementation + System.out.println("Stopping FLAC audio"); + } + + public void setVolume(int volume) { + if (volume >= 0 && volume <= 100) { + this.volume = volume; + System.out.println("Volume set to " + volume); + } else { + System.out.println("Invalid volume level"); + } + } + + public MediaFormat supportsType() { + return MediaFormat.FLAC; + } +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/factory/FLACPlayerFactory.java b/src/main/java/com/scaler/lld/design/solutions/factory/FLACPlayerFactory.java new file mode 100644 index 0000000..83d1e1d --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/factory/FLACPlayerFactory.java @@ -0,0 +1,9 @@ +package com.scaler.lld.design.solutions.factory; + +public class FLACPlayerFactory extends AudioPlayerFactory{ + + @Override + public AudioPlayer create(int volume, double playBackRate) { + return new FLACPlayer(volume, playBackRate); + } +} diff --git a/src/main/java/com/scaler/lld/design/solutions/factory/MP3Player.java b/src/main/java/com/scaler/lld/design/solutions/factory/MP3Player.java new file mode 100644 index 0000000..c08f5fb --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/factory/MP3Player.java @@ -0,0 +1,40 @@ +package com.scaler.lld.design.solutions.factory; + +public class MP3Player extends AudioPlayer { + + public MP3Player(int volume, double playBackRate) { + super(volume, playBackRate); + } + + public void play() { + // Simulate playing audio in FLAC format + // Each media format will have its own implementation + System.out.println("Playing MP3 audio"); + } + + public void pause() { + // Simulate pausing audio in FLAC format + // Each media format will have its own implementation + System.out.println("Pausing MP3 audio"); + } + + public void stop() { + // Simulate stopping audio in FLAC format + // Each media format will have its own implementation + System.out.println("Stopping MP3 audio"); + } + + public void setVolume(int volume) { + if (volume >= 0 && volume <= 100) { + this.volume = volume; + System.out.println("Volume set to " + volume); + } else { + System.out.println("Invalid volume level"); + } + } + + + public MediaFormat supportsType() { + return MediaFormat.MP3; + } +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/factory/MP3PlayerFactory.java b/src/main/java/com/scaler/lld/design/solutions/factory/MP3PlayerFactory.java new file mode 100644 index 0000000..7eabe7d --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/factory/MP3PlayerFactory.java @@ -0,0 +1,8 @@ +package com.scaler.lld.design.solutions.factory; + +public class MP3PlayerFactory extends AudioPlayerFactory { + @Override + public AudioPlayer create(int volume, double playBackRate) { + return new MP3Player(volume, playBackRate); + } +} diff --git a/src/main/java/com/scaler/lld/design/solutions/factory/MediaFormat.java b/src/main/java/com/scaler/lld/design/solutions/factory/MediaFormat.java new file mode 100644 index 0000000..25f74fb --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/factory/MediaFormat.java @@ -0,0 +1,7 @@ +package com.scaler.lld.design.solutions.factory; + +public enum MediaFormat { + MP3, + FLAC, + WAV +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/factory/WAVPlayer.java b/src/main/java/com/scaler/lld/design/solutions/factory/WAVPlayer.java new file mode 100644 index 0000000..0762899 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/factory/WAVPlayer.java @@ -0,0 +1,39 @@ +package com.scaler.lld.design.solutions.factory; + +public class WAVPlayer extends AudioPlayer { + + public WAVPlayer(int volume, double playBackRate) { + super(volume, playBackRate); + } + + public void play() { + // Simulate playing audio in WAV format + // Each media format will have its own implementation + System.out.println("Playing WAV audio"); + } + + public void pause() { + // Simulate pausing audio in WAV format + // Each media format will have its own implementation + System.out.println("Pausing WAV audio"); + } + + public void stop() { + // Simulate stopping audio in WAV format + // Each media format will have its own implementation + System.out.println("Stopping WAV audio"); + } + + public void setVolume(int volume) { + if (volume >= 0 && volume <= 100) { + this.volume = volume; + System.out.println("Volume set to " + volume); + } else { + System.out.println("Invalid volume level"); + } + } + + public MediaFormat supportsType() { + return MediaFormat.WAV; + } +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/factory/WAVPlayerFactory.java b/src/main/java/com/scaler/lld/design/solutions/factory/WAVPlayerFactory.java new file mode 100644 index 0000000..cc17024 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/factory/WAVPlayerFactory.java @@ -0,0 +1,9 @@ +package com.scaler.lld.design.solutions.factory; + +public class WAVPlayerFactory extends AudioPlayerFactory { + + @Override + public AudioPlayer create(int volume, double playBackRate) { + return new WAVPlayer(volume, playBackRate); + } +} From 0eacd571e583cd3fd02a94d76387727159066932 Mon Sep 17 00:00:00 2001 From: Onkar Marbhal Date: Tue, 24 Oct 2023 16:13:21 +0530 Subject: [PATCH 4/4] feat: adapter & abstract factory solutions. --- .../abstractfactory/AudioFactory.java | 12 ++++++ .../abstractfactory/FLACAudioFactory.java | 30 ++++++++++++++ .../abstractfactory/MP3AudioFactory.java | 30 ++++++++++++++ .../abstractfactory/MediaFormat.java | 7 ++++ .../abstractfactory/decoder/AudioDecoder.java | 20 ++++++++++ .../abstractfactory/decoder/FLACDecoder.java | 23 +++++++++++ .../abstractfactory/decoder/MP3Decoder.java | 23 +++++++++++ .../abstractfactory/player/AudioPlayer.java | 39 +++++++++++++++++++ .../abstractfactory/player/FLACPlayer.java | 35 +++++++++++++++++ .../abstractfactory/player/MP3Player.java | 35 +++++++++++++++++ .../processor/AudioProcessor.java | 21 ++++++++++ .../processor/FLACAudioProcessor.java | 24 ++++++++++++ .../processor/MP3AudioProcessor.java | 24 ++++++++++++ .../GoogleTranslationProviderAdapter.java | 25 ++++++++++++ .../MicrosoftTranslationProviderAdapter.java | 19 +++++++++ .../adapter/TranslationProviderAdapter.java | 9 +++++ .../solutions/adapter/TranslationRequest.java | 14 +++++++ .../solutions/adapter/external/ApiUtils.java | 21 ++++++++++ .../adapter/external/GoogleTranslateApi.java | 21 ++++++++++ .../external/GoogleTranslationRequest.java | 13 +++++++ .../external/MicrosoftTranslateApi.java | 21 ++++++++++ 21 files changed, 466 insertions(+) create mode 100644 src/main/java/com/scaler/lld/design/solutions/abstractfactory/AudioFactory.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/abstractfactory/FLACAudioFactory.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/abstractfactory/MP3AudioFactory.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/abstractfactory/MediaFormat.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/abstractfactory/decoder/AudioDecoder.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/abstractfactory/decoder/FLACDecoder.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/abstractfactory/decoder/MP3Decoder.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/abstractfactory/player/AudioPlayer.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/abstractfactory/player/FLACPlayer.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/abstractfactory/player/MP3Player.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/abstractfactory/processor/AudioProcessor.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/abstractfactory/processor/FLACAudioProcessor.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/abstractfactory/processor/MP3AudioProcessor.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/adapter/GoogleTranslationProviderAdapter.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/adapter/MicrosoftTranslationProviderAdapter.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/adapter/TranslationProviderAdapter.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/adapter/TranslationRequest.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/adapter/external/ApiUtils.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/adapter/external/GoogleTranslateApi.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/adapter/external/GoogleTranslationRequest.java create mode 100644 src/main/java/com/scaler/lld/design/solutions/adapter/external/MicrosoftTranslateApi.java diff --git a/src/main/java/com/scaler/lld/design/solutions/abstractfactory/AudioFactory.java b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/AudioFactory.java new file mode 100644 index 0000000..a661ad9 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/AudioFactory.java @@ -0,0 +1,12 @@ +package com.scaler.lld.design.solutions.abstractfactory; + +import com.scaler.lld.design.solutions.abstractfactory.player.AudioPlayer; +import com.scaler.lld.design.solutions.abstractfactory.decoder.AudioDecoder; +import com.scaler.lld.design.solutions.abstractfactory.processor.AudioProcessor; + +public abstract class AudioFactory { + public abstract MediaFormat supportsFormat(); + public abstract AudioDecoder createDecoder(byte[] audioData); + public abstract AudioPlayer createPlayer(int volume, double playbackRate); + public abstract AudioProcessor createProcessor(byte[] audioData); +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/abstractfactory/FLACAudioFactory.java b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/FLACAudioFactory.java new file mode 100644 index 0000000..84a0f65 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/FLACAudioFactory.java @@ -0,0 +1,30 @@ +package com.scaler.lld.design.solutions.abstractfactory; + +import com.scaler.lld.design.solutions.abstractfactory.player.AudioPlayer; +import com.scaler.lld.design.solutions.abstractfactory.player.FLACPlayer; +import com.scaler.lld.design.solutions.abstractfactory.decoder.AudioDecoder; +import com.scaler.lld.design.solutions.abstractfactory.decoder.FLACDecoder; +import com.scaler.lld.design.solutions.abstractfactory.processor.AudioProcessor; +import com.scaler.lld.design.solutions.abstractfactory.processor.FLACAudioProcessor; + +public class FLACAudioFactory extends AudioFactory { + @Override + public MediaFormat supportsFormat() { + return MediaFormat.FLAC; + } + + @Override + public AudioDecoder createDecoder(byte[] audioData) { + return new FLACDecoder(audioData); + } + + @Override + public AudioPlayer createPlayer(int volume, double playbackRate) { + return new FLACPlayer(volume, playbackRate); + } + + @Override + public AudioProcessor createProcessor(byte[] audioData) { + return new FLACAudioProcessor(audioData); + } +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/abstractfactory/MP3AudioFactory.java b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/MP3AudioFactory.java new file mode 100644 index 0000000..3772695 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/MP3AudioFactory.java @@ -0,0 +1,30 @@ +package com.scaler.lld.design.solutions.abstractfactory; + +import com.scaler.lld.design.solutions.abstractfactory.player.AudioPlayer; +import com.scaler.lld.design.solutions.abstractfactory.player.MP3Player; +import com.scaler.lld.design.solutions.abstractfactory.decoder.AudioDecoder; +import com.scaler.lld.design.solutions.abstractfactory.decoder.MP3Decoder; +import com.scaler.lld.design.solutions.abstractfactory.processor.AudioProcessor; +import com.scaler.lld.design.solutions.abstractfactory.processor.MP3AudioProcessor; + +public class MP3AudioFactory extends AudioFactory { + @Override + public MediaFormat supportsFormat() { + return MediaFormat.MP3; + } + + @Override + public AudioDecoder createDecoder(byte[] audioData) { + return new MP3Decoder(audioData); + } + + @Override + public AudioPlayer createPlayer(int volume, double playbackRate) { + return new MP3Player(volume, playbackRate); + } + + @Override + public AudioProcessor createProcessor(byte[] audioData) { + return new MP3AudioProcessor(audioData); + } +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/abstractfactory/MediaFormat.java b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/MediaFormat.java new file mode 100644 index 0000000..7ccf133 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/MediaFormat.java @@ -0,0 +1,7 @@ +package com.scaler.lld.design.solutions.abstractfactory; + +public enum MediaFormat { + MP3, + FLAC, + WAV +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/abstractfactory/decoder/AudioDecoder.java b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/decoder/AudioDecoder.java new file mode 100644 index 0000000..943e5af --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/decoder/AudioDecoder.java @@ -0,0 +1,20 @@ +package com.scaler.lld.design.solutions.abstractfactory.decoder; + +import com.scaler.lld.design.solutions.abstractfactory.MediaFormat; + +public abstract class AudioDecoder { + + private final byte[] audioData; + + public AudioDecoder(byte[] audioData) { + this.audioData = audioData; + } + + public byte[] getAudioData() { + return audioData; + } + + public abstract MediaFormat supportsFormat(); + + public abstract byte[] decode(); +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/abstractfactory/decoder/FLACDecoder.java b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/decoder/FLACDecoder.java new file mode 100644 index 0000000..db4fb4e --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/decoder/FLACDecoder.java @@ -0,0 +1,23 @@ +package com.scaler.lld.design.solutions.abstractfactory.decoder; + +import com.scaler.lld.design.solutions.abstractfactory.MediaFormat; + +public class FLACDecoder extends AudioDecoder { + + public FLACDecoder(byte[] audioData) { + super(audioData); + } + + @Override + public MediaFormat supportsFormat() { + return MediaFormat.FLAC; + } + + @Override + public byte[] decode() { + // Implement FLAC decoding logic + System.out.println("Decoding FLAC audio data..."); + // Decoding process + return getAudioData(); + } +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/abstractfactory/decoder/MP3Decoder.java b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/decoder/MP3Decoder.java new file mode 100644 index 0000000..b3f61b1 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/decoder/MP3Decoder.java @@ -0,0 +1,23 @@ +package com.scaler.lld.design.solutions.abstractfactory.decoder; + +import com.scaler.lld.design.solutions.abstractfactory.MediaFormat; + +public class MP3Decoder extends AudioDecoder { + + public MP3Decoder(byte[] audioData) { + super(audioData); + } + + @Override + public MediaFormat supportsFormat() { + return MediaFormat.MP3; + } + + @Override + public byte[] decode() { + // Implement MP3 decoding logic + System.out.println("Decoding MP3 audio data..."); + // Decoding process + return getAudioData(); + } +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/abstractfactory/player/AudioPlayer.java b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/player/AudioPlayer.java new file mode 100644 index 0000000..70bcd08 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/player/AudioPlayer.java @@ -0,0 +1,39 @@ +package com.scaler.lld.design.solutions.abstractfactory.player; + +import com.scaler.lld.design.solutions.abstractfactory.MediaFormat; + +public abstract class AudioPlayer { + + private int volume; + private double playbackRate; + + public AudioPlayer(int volume, double playbackRate) { + this.volume = volume; + this.playbackRate = playbackRate; + } + + public abstract MediaFormat supportsFormat(); + + public abstract void play(); + + public abstract void pause(); + + public abstract void stop(); + + public int getVolume() { + return volume; + } + + public double getPlaybackRate() { + return playbackRate; + } + + public void setVolume(int volume) { + if (volume >= 0 && volume <= 100) { + this.volume = volume; + System.out.println("Volume set to " + volume); + } else { + System.out.println("Invalid volume level"); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/abstractfactory/player/FLACPlayer.java b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/player/FLACPlayer.java new file mode 100644 index 0000000..4e9ab90 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/player/FLACPlayer.java @@ -0,0 +1,35 @@ +package com.scaler.lld.design.solutions.abstractfactory.player; + +import com.scaler.lld.design.solutions.abstractfactory.MediaFormat; + +public class FLACPlayer extends AudioPlayer { + + public FLACPlayer(int volume, double playBackRate) { + super(volume, playBackRate); + } + + @Override + public void play() { + // Simulate playing audio in FLAC format + // Each media format will have its own implementation + System.out.println("Playing FLAC audio"); + } + + @Override + public void pause() { + // Simulate pausing audio in FLAC format + // Each media format will have its own implementation + System.out.println("Pausing FLAC audio"); + } + + @Override + public void stop() { + // Simulate stopping audio in FLAC format + // Each media format will have its own implementation + System.out.println("Stopping FLAC audio"); + } + + public MediaFormat supportsFormat() { + return MediaFormat.FLAC; + } +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/abstractfactory/player/MP3Player.java b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/player/MP3Player.java new file mode 100644 index 0000000..a970139 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/player/MP3Player.java @@ -0,0 +1,35 @@ +package com.scaler.lld.design.solutions.abstractfactory.player; + +import com.scaler.lld.design.solutions.abstractfactory.MediaFormat; + +public class MP3Player extends AudioPlayer { + + public MP3Player(int volume, double playBackRate) { + super(volume, playBackRate); + } + + @Override + public void play() { + // Simulate playing audio in MP3 format + // Each media format will have its own implementation + System.out.println("Playing MP3 audio"); + } + + @Override + public void pause() { + // Simulate pausing audio in MP3 format + // Each media format will have its own implementation + System.out.println("Pausing MP3 audio"); + } + + @Override + public void stop() { + // Simulate stopping audio in MP3 format + // Each media format will have its own implementation + System.out.println("Stopping MP3 audio"); + } + + public MediaFormat supportsFormat() { + return MediaFormat.MP3; + } +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/abstractfactory/processor/AudioProcessor.java b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/processor/AudioProcessor.java new file mode 100644 index 0000000..1d367cf --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/processor/AudioProcessor.java @@ -0,0 +1,21 @@ +package com.scaler.lld.design.solutions.abstractfactory.processor; + + +import com.scaler.lld.design.solutions.abstractfactory.MediaFormat; + +public abstract class AudioProcessor { + + private final byte[] audioData; + + public AudioProcessor(byte[] audioData) { + this.audioData = audioData; + } + + public byte[] getAudioData() { + return audioData; + } + + public abstract MediaFormat supportsFormat(); + + public abstract byte[] process(); +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/abstractfactory/processor/FLACAudioProcessor.java b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/processor/FLACAudioProcessor.java new file mode 100644 index 0000000..e6d22ab --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/processor/FLACAudioProcessor.java @@ -0,0 +1,24 @@ +package com.scaler.lld.design.solutions.abstractfactory.processor; + + +import com.scaler.lld.design.solutions.abstractfactory.MediaFormat; + +public class FLACAudioProcessor extends AudioProcessor { + + public FLACAudioProcessor(byte[] audioData) { + super(audioData); + } + + @Override + public MediaFormat supportsFormat() { + return MediaFormat.FLAC; + } + + @Override + public byte[] process() { + // Implement FLAC audio processing logic + System.out.println("Processing FLAC audio data..."); + // Processing process + return getAudioData(); + } +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/abstractfactory/processor/MP3AudioProcessor.java b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/processor/MP3AudioProcessor.java new file mode 100644 index 0000000..6b8f45d --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/abstractfactory/processor/MP3AudioProcessor.java @@ -0,0 +1,24 @@ +package com.scaler.lld.design.solutions.abstractfactory.processor; + + +import com.scaler.lld.design.solutions.abstractfactory.MediaFormat; + +public class MP3AudioProcessor extends AudioProcessor { + + public MP3AudioProcessor(byte[] audioData) { + super(audioData); + } + + @Override + public MediaFormat supportsFormat() { + return MediaFormat.MP3; + } + + @Override + public byte[] process() { + // Implement MP3 audio processing logic + System.out.println("Processing MP3 audio data..."); + // Processing process + return getAudioData(); + } +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/adapter/GoogleTranslationProviderAdapter.java b/src/main/java/com/scaler/lld/design/solutions/adapter/GoogleTranslationProviderAdapter.java new file mode 100644 index 0000000..a625328 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/adapter/GoogleTranslationProviderAdapter.java @@ -0,0 +1,25 @@ +package com.scaler.lld.design.solutions.adapter; + +import com.scaler.lld.design.solutions.adapter.external.GoogleTranslateApi; +import com.scaler.lld.design.solutions.adapter.external.GoogleTranslationRequest; + +import java.util.List; + +public class GoogleTranslationProviderAdapter implements TranslationProviderAdapter{ + + private final GoogleTranslateApi api = new GoogleTranslateApi(); + @Override + public String convert(TranslationRequest request) { + return api.convert(convertRequest(request)); + } + + private GoogleTranslationRequest convertRequest(TranslationRequest request) { + return new GoogleTranslationRequest(request.getText(), + request.getSourceLanguage(), request.getTargetLanguage(), request.getConfidenceThreshold()); + } + + @Override + public List getSupportedLanguages() { + return api.getLanguages(); + } +} diff --git a/src/main/java/com/scaler/lld/design/solutions/adapter/MicrosoftTranslationProviderAdapter.java b/src/main/java/com/scaler/lld/design/solutions/adapter/MicrosoftTranslationProviderAdapter.java new file mode 100644 index 0000000..a90298b --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/adapter/MicrosoftTranslationProviderAdapter.java @@ -0,0 +1,19 @@ +package com.scaler.lld.design.solutions.adapter; + +import com.scaler.lld.design.solutions.adapter.external.MicrosoftTranslateApi; + +import java.util.List; + +public class MicrosoftTranslationProviderAdapter implements TranslationProviderAdapter{ + + private final MicrosoftTranslateApi api = new MicrosoftTranslateApi(); + @Override + public String convert(TranslationRequest request) { + return api.translate(request.getText(), request.getSourceLanguage(), request.getTargetLanguage()); + } + + @Override + public List getSupportedLanguages() { + return api.getSupportedLanguages(); + } +} diff --git a/src/main/java/com/scaler/lld/design/solutions/adapter/TranslationProviderAdapter.java b/src/main/java/com/scaler/lld/design/solutions/adapter/TranslationProviderAdapter.java new file mode 100644 index 0000000..62dc076 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/adapter/TranslationProviderAdapter.java @@ -0,0 +1,9 @@ +package com.scaler.lld.design.solutions.adapter; + +import java.util.List; + +public interface TranslationProviderAdapter { + + String convert(TranslationRequest request); + List getSupportedLanguages(); +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/adapter/TranslationRequest.java b/src/main/java/com/scaler/lld/design/solutions/adapter/TranslationRequest.java new file mode 100644 index 0000000..c95b4a9 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/adapter/TranslationRequest.java @@ -0,0 +1,14 @@ +package com.scaler.lld.design.solutions.adapter; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +// DO NOT REMOVE THE NO-ARG CONSTRUCTOR ANNOTATION +@NoArgsConstructor +@Getter +public class TranslationRequest { + private String text; + private String sourceLanguage; + private String targetLanguage; + private Double confidenceThreshold; +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/adapter/external/ApiUtils.java b/src/main/java/com/scaler/lld/design/solutions/adapter/external/ApiUtils.java new file mode 100644 index 0000000..e93834e --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/adapter/external/ApiUtils.java @@ -0,0 +1,21 @@ +package com.scaler.lld.design.solutions.adapter.external; + +public class ApiUtils { + + public static void logGoogleGetSupportedLanguages() { + System.out.println("Getting supported languages from Google Translate API"); + } + + public static void logGoogleTranslate() { + System.out.println("Translating text using Google Translate API"); + } + + public static void logMicrosoftGetSupportedLanguages() { + System.out.println("Getting supported languages from Microsoft Translator API"); + } + + public static void logMicrosoftTranslate() { + System.out.println("Translating text using Microsoft Translator API"); + } + +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/adapter/external/GoogleTranslateApi.java b/src/main/java/com/scaler/lld/design/solutions/adapter/external/GoogleTranslateApi.java new file mode 100644 index 0000000..c2389e3 --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/adapter/external/GoogleTranslateApi.java @@ -0,0 +1,21 @@ +package com.scaler.lld.design.solutions.adapter.external; + +import java.util.List; + +import static com.scaler.lld.design.solutions.adapter.external.ApiUtils.logGoogleGetSupportedLanguages; +import static com.scaler.lld.design.solutions.adapter.external.ApiUtils.logGoogleTranslate; + +public class GoogleTranslateApi { + + public String convert(GoogleTranslationRequest request) { + // Implementation for translating text using Google Translate API + logGoogleTranslate(); + return "Translated text"; + } + + public List getLanguages() { + // Implementation for fetching supported languages from Google Translate + logGoogleGetSupportedLanguages(); + return List.of("hindi", "marathi", "kannada"); + } +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/adapter/external/GoogleTranslationRequest.java b/src/main/java/com/scaler/lld/design/solutions/adapter/external/GoogleTranslationRequest.java new file mode 100644 index 0000000..4c4f6ec --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/adapter/external/GoogleTranslationRequest.java @@ -0,0 +1,13 @@ +package com.scaler.lld.design.solutions.adapter.external; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public class GoogleTranslationRequest { + private String text; + private String sourceLanguage; + private String targetLanguage; + private Double confidenceThreshold; +} \ No newline at end of file diff --git a/src/main/java/com/scaler/lld/design/solutions/adapter/external/MicrosoftTranslateApi.java b/src/main/java/com/scaler/lld/design/solutions/adapter/external/MicrosoftTranslateApi.java new file mode 100644 index 0000000..aa154dd --- /dev/null +++ b/src/main/java/com/scaler/lld/design/solutions/adapter/external/MicrosoftTranslateApi.java @@ -0,0 +1,21 @@ +package com.scaler.lld.design.solutions.adapter.external; + +import java.util.List; + +import static com.scaler.lld.design.solutions.adapter.external.ApiUtils.logMicrosoftGetSupportedLanguages; +import static com.scaler.lld.design.solutions.adapter.external.ApiUtils.logMicrosoftTranslate; + +public class MicrosoftTranslateApi { + public String translate(String text, String sourceLanguage, String targetLanguage) { + // Implementation for translating text using Microsoft Translator API + logMicrosoftTranslate(); + return "Translated text"; + } + + // Method to retrieve the list of supported languages from Microsoft Translator + public List getSupportedLanguages() { + // Implementation for fetching supported languages from Microsoft Translator + logMicrosoftGetSupportedLanguages(); + return List.of("hindi", "marathi", "kannada"); + } +} \ No newline at end of file