static async getPlugins()

in common/lib/connection_plugin_chain_builder.ts [98:168]


  static async getPlugins(
    pluginService: PluginService,
    props: Map<string, any>,
    connectionProviderManager: ConnectionProviderManager,
    configurationProfile: ConfigurationProfile | null
  ): Promise<ConnectionPlugin[]> {
    let pluginFactoryInfoList: PluginFactoryInfo[] = [];
    const plugins: ConnectionPlugin[] = [];
    let usingDefault: boolean = false;

    if (configurationProfile) {
      const profilePluginFactories = configurationProfile.getPluginFactories();
      if (profilePluginFactories) {
        for (const factory of profilePluginFactories) {
          const weight = ConnectionPluginChainBuilder.PLUGIN_WEIGHTS.get(factory);
          if (!weight) {
            throw new AwsWrapperError(Messages.get("PluginManager.unknownPluginWeight", factory.prototype.constructor.name));
          }
          pluginFactoryInfoList.push({ factory: factory, weight: weight });
        }
        usingDefault = true; // We assume that plugin factories in configuration profile is presorted.
      }
    } else {
      let pluginCodes: string = props.get(WrapperProperties.PLUGINS.name);
      if (pluginCodes == null) {
        pluginCodes = WrapperProperties.DEFAULT_PLUGINS;
      }
      usingDefault = pluginCodes === WrapperProperties.DEFAULT_PLUGINS;

      pluginCodes = pluginCodes.trim();
      if (pluginCodes !== "") {
        const pluginCodeList = pluginCodes.split(",").map((pluginCode) => pluginCode.trim());
        let lastWeight = 0;
        pluginCodeList.forEach((p) => {
          if (!ConnectionPluginChainBuilder.PLUGIN_FACTORIES.has(p)) {
            throw new AwsWrapperError(Messages.get("PluginManager.unknownPluginCode", p));
          }

          const factoryInfo = ConnectionPluginChainBuilder.PLUGIN_FACTORIES.get(p);
          if (factoryInfo) {
            if (factoryInfo.weight === ConnectionPluginChainBuilder.WEIGHT_RELATIVE_TO_PRIOR_PLUGIN) {
              lastWeight++;
            } else {
              lastWeight = factoryInfo.weight;
            }
            pluginFactoryInfoList.push({ factory: factoryInfo.factory, weight: lastWeight });
          }
        });
      }
    }

    if (!usingDefault && pluginFactoryInfoList.length > 1 && WrapperProperties.AUTO_SORT_PLUGIN_ORDER.get(props)) {
      pluginFactoryInfoList = pluginFactoryInfoList.sort((a, b) => a.weight - b.weight);

      if (!usingDefault) {
        logger.info(
          "Plugins order has been rearranged. The following order is in effect: " +
            pluginFactoryInfoList.map((pluginFactoryInfo) => pluginFactoryInfo.factory.name.split("Factory")[0]).join(", ")
        );
      }
    }

    for (const pluginFactoryInfo of pluginFactoryInfoList) {
      const factoryObj = new pluginFactoryInfo.factory();
      plugins.push(await factoryObj.getInstance(pluginService, props));
    }

    plugins.push(new DefaultPlugin(pluginService, connectionProviderManager));

    return plugins;
  }