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;
}