A248

Why Dependency Injection - Example from LibertyBans

Aug 16th, 2021 (edited)
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.45 KB | None | 0 0
  1. /*
  2.  * LibertyBans
  3.  * Copyright © 2021 Anand Beh
  4.  *
  5.  * LibertyBans is free software: you can redistribute it and/or modify
  6.  * it under the terms of the GNU Affero General Public License as
  7.  * published by the Free Software Foundation, either version 3 of the
  8.  * License, or (at your option) any later version.
  9.  *
  10.  * LibertyBans is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  * GNU Affero General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU Affero General Public License
  16.  * along with LibertyBans. If not, see <https://www.gnu.org/licenses/>
  17.  * and navigate to version 3 of the GNU Affero General Public License.
  18.  */
  19.  
  20. package space.arim.libertybans.core;
  21.  
  22. import jakarta.inject.Provider;
  23. import org.junit.jupiter.api.Test;
  24. import org.junit.jupiter.api.io.TempDir;
  25. import space.arim.api.env.PlatformHandle;
  26. import space.arim.libertybans.api.punish.PunishmentDrafter;
  27. import space.arim.libertybans.core.alts.AltCheckFormatter;
  28. import space.arim.libertybans.core.alts.AltDetection;
  29. import space.arim.libertybans.core.alts.AltNotification;
  30. import space.arim.libertybans.core.commands.extra.StandardTabCompletion;
  31. import space.arim.libertybans.core.commands.extra.TabCompletion;
  32. import space.arim.libertybans.core.config.Configs;
  33. import space.arim.libertybans.core.config.Formatter;
  34. import space.arim.libertybans.core.config.InternalFormatter;
  35. import space.arim.libertybans.core.config.StandardConfigs;
  36. import space.arim.libertybans.core.database.DatabaseManager;
  37. import space.arim.libertybans.core.database.InternalDatabase;
  38. import space.arim.libertybans.core.env.EnvEnforcer;
  39. import space.arim.libertybans.core.env.EnvUserResolver;
  40. import space.arim.libertybans.core.env.Environment;
  41. import space.arim.libertybans.core.env.EnvironmentManager;
  42. import space.arim.libertybans.core.punish.Enactor;
  43. import space.arim.libertybans.core.punish.Enforcer;
  44. import space.arim.libertybans.core.punish.InternalRevoker;
  45. import space.arim.libertybans.core.punish.PunishmentCreator;
  46. import space.arim.libertybans.core.punish.Revoker;
  47. import space.arim.libertybans.core.punish.SecurePunishmentCreator;
  48. import space.arim.libertybans.core.punish.StandardEnforcer;
  49. import space.arim.libertybans.core.scope.InternalScopeManager;
  50. import space.arim.libertybans.core.scope.Scoper;
  51. import space.arim.libertybans.core.selector.ApplicableImpl;
  52. import space.arim.libertybans.core.selector.CaffeineMuteCache;
  53. import space.arim.libertybans.core.selector.IDImpl;
  54. import space.arim.libertybans.core.selector.InternalSelector;
  55. import space.arim.libertybans.core.selector.MuteCache;
  56. import space.arim.libertybans.core.selector.SelectionImpl;
  57. import space.arim.libertybans.core.selector.SelectorImpl;
  58. import space.arim.libertybans.core.service.AsynchronicityManager;
  59. import space.arim.libertybans.core.service.LateBindingFactoryOfTheFuture;
  60. import space.arim.libertybans.core.service.LiveTime;
  61. import space.arim.libertybans.core.service.StandardAsynchronicityManager;
  62. import space.arim.libertybans.core.service.Time;
  63. import space.arim.libertybans.core.uuid.CachingUUIDManager;
  64. import space.arim.libertybans.core.uuid.UUIDManager;
  65. import space.arim.libertybans.it.env.QuackEnforcer;
  66. import space.arim.libertybans.it.env.QuackEnv;
  67. import space.arim.libertybans.it.env.QuackUserResolver;
  68. import space.arim.libertybans.it.env.platform.QuackPlatform;
  69. import space.arim.libertybans.it.env.platform.QuackPlayer;
  70. import space.arim.omnibus.DefaultOmnibus;
  71. import space.arim.omnibus.Omnibus;
  72. import space.arim.omnibus.util.concurrent.FactoryOfTheFuture;
  73.  
  74. import java.nio.file.Path;
  75. import java.util.Objects;
  76.  
  77. public class ManualConstructionTest {
  78.  
  79.     @Test
  80.     public void manualConstruction(@TempDir Path folder, PlatformHandle handle) {
  81.         Time time = LiveTime.INSTANCE;
  82.         Omnibus omnibus = new DefaultOmnibus();
  83.         AsynchronicityManager asyncManager = new StandardAsynchronicityManager(omnibus, handle);
  84.         FactoryOfTheFuture futuresFactory = new LateBindingFactoryOfTheFuture(asyncManager);
  85.  
  86.         Configs configs = new StandardConfigs(folder);
  87.         InternalScopeManager scopeManager = new Scoper();
  88.         DatabaseManager databaseManager = new DatabaseManager(
  89.                 folder, futuresFactory, handle::createEnhancedExecutor, configs, scopeManager, time);
  90.         Provider<InternalDatabase> dbProvider = databaseManager::getInternal;
  91.  
  92.         // Platform-specific section which would need to be abstracted
  93.         QuackPlatform quackPlatform = new QuackPlatform();
  94.         EnvUserResolver envUserResolver = new QuackUserResolver(quackPlatform);
  95.         // End platform-specific section
  96.  
  97.         UUIDManager uuidManager = new CachingUUIDManager(configs, futuresFactory, dbProvider, envUserResolver);
  98.         InternalFormatter formatter = new Formatter(futuresFactory, configs, scopeManager, uuidManager, time);
  99.  
  100.         // Platform-specific section which would need to be abstracted
  101.         EnvEnforcer<QuackPlayer> envEnforcer = new QuackEnforcer(formatter, handle, quackPlatform);
  102.         Environment environment = new QuackEnv(); // No dependencies here, though a real platform has several dependencies
  103.         // End platform-specific section
  104.  
  105.         SettableProvider<Enforcer> enforcerProvider = new SettableProvider<>();
  106.         SettableProvider<InternalRevoker> revokerProvider = new SettableProvider<>();
  107.         SettableProvider<MuteCache> muteCacheProvider = new SettableProvider<>();
  108.  
  109.         AltCheckFormatter altCheckFormatter = new AltCheckFormatter(configs, formatter);
  110.         AltDetection altDetection = new AltDetection(dbProvider);
  111.         AltNotification altNotification = new AltNotification(configs, altCheckFormatter, envEnforcer);
  112.         PunishmentCreator punishmentCreator = new SecurePunishmentCreator(
  113.                 futuresFactory, enforcerProvider, revokerProvider, muteCacheProvider
  114.         );
  115.         InternalSelector selector = new SelectorImpl(
  116.                 new SelectionImpl(futuresFactory, dbProvider, punishmentCreator, time),
  117.                 new IDImpl(futuresFactory, dbProvider, punishmentCreator, time),
  118.                 new ApplicableImpl(configs, futuresFactory, dbProvider, punishmentCreator,
  119.                         altDetection, altNotification, time),
  120.                 muteCacheProvider
  121.         );
  122.         MuteCache muteCache = new CaffeineMuteCache(futuresFactory, selector);
  123.         muteCacheProvider.set(muteCache);
  124.         Enforcer enforcer = new StandardEnforcer(
  125.                 configs, futuresFactory, dbProvider, selector, formatter, envEnforcer, uuidManager, muteCache);
  126.         enforcerProvider.set(enforcer);
  127.         InternalRevoker revoker = new Revoker(futuresFactory, dbProvider, punishmentCreator, muteCache, time);
  128.         revokerProvider.set(revoker);
  129.         PunishmentDrafter punishmentDrafter = new Enactor(scopeManager, dbProvider, punishmentCreator, time);
  130.         TabCompletion tabCompletion = new StandardTabCompletion(configs, dbProvider, time);
  131.         EnvironmentManager envManager = new EnvironmentManager(environment, configs);
  132.         LibertyBansApi api = new LibertyBansApi(
  133.                 omnibus, futuresFactory, punishmentDrafter, revoker, selector,
  134.                 () -> dbProvider.get().asExternal(), formatter, scopeManager, uuidManager);
  135.         LifecycleGodfather lifecycleGodfather = new LifecycleGodfather(
  136.                 asyncManager, configs, databaseManager, uuidManager, tabCompletion, envManager, api);
  137.  
  138.         // Commands omitted
  139.  
  140.         lifecycleGodfather.startup();
  141.     }
  142.  
  143.     static final class SettableProvider<T> implements Provider<T> {
  144.  
  145.         private T value;
  146.  
  147.         void set(T value) {
  148.             this.value = Objects.requireNonNull(value, "value");
  149.         }
  150.  
  151.         @Override
  152.         public T get() {
  153.             return value;
  154.         }
  155.     }
  156.  
  157. }
  158.  
Add Comment
Please, Sign In to add comment