/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.module.deployment.impl.internal.artifact;
import static org.mule.runtime.core.config.bootstrap.ClassLoaderRegistryBootstrapDiscoverer.BOOTSTRAP_PROPERTIES;
import static org.mule.runtime.api.util.Preconditions.checkArgument;
import org.mule.runtime.core.api.MuleContext;
import org.mule.runtime.core.config.bootstrap.BootstrapService;
import org.mule.runtime.core.config.bootstrap.BootstrapServiceDiscoverer;
import org.mule.runtime.core.config.bootstrap.PropertiesBootstrapService;
import org.mule.runtime.core.config.bootstrap.PropertiesBootstrapServiceDiscoverer;
import org.mule.runtime.core.config.builders.AbstractConfigurationBuilder;
import org.mule.runtime.core.util.PropertiesUtils;
import org.mule.runtime.deployment.model.api.plugin.ArtifactPlugin;
import java.net.URL;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
/**
* Configures a {@link BootstrapServiceDiscoverer} on an artifact's {@link MuleContext}
* <p/>
* Configuration done by this builder will use a {@link BootstrapServiceDiscoverer} to find {@link BootstrapService} provided by
* the container and will create a {@link BootstrapServiceDiscoverer} for each plugin deployed in the artifact. All the discovered
* services will then used to configure the context.
*/
public class ArtifactBootstrapServiceDiscovererConfigurationBuilder extends AbstractConfigurationBuilder {
private final List<ArtifactPlugin> artifactPlugins;
/**
* Creates a new context builder
*
* @param artifactPlugins artifact plugins deployed inside an artifact. Non null.
*/
public ArtifactBootstrapServiceDiscovererConfigurationBuilder(List<ArtifactPlugin> artifactPlugins) {
checkArgument(artifactPlugins != null, "ArtifactPlugins cannot be null");
this.artifactPlugins = artifactPlugins;
}
@Override
protected void doConfigure(MuleContext muleContext) throws Exception {
final PropertiesBootstrapServiceDiscoverer propertiesBootstrapServiceDiscoverer =
new PropertiesBootstrapServiceDiscoverer(this.getClass().getClassLoader());
List<BootstrapService> bootstrapServices = new LinkedList<>();
bootstrapServices.addAll(propertiesBootstrapServiceDiscoverer.discover());
for (ArtifactPlugin artifactPlugin : artifactPlugins) {
final Enumeration<URL> resources = artifactPlugin.getArtifactClassLoader().findResources(BOOTSTRAP_PROPERTIES);
while (resources.hasMoreElements()) {
final URL localResource = resources.nextElement();
final Properties properties = PropertiesUtils.loadProperties(localResource);
final BootstrapService pluginBootstrapService =
new PropertiesBootstrapService(artifactPlugin.getArtifactClassLoader().getClassLoader(), properties);
bootstrapServices.add(pluginBootstrapService);
}
}
muleContext.setBootstrapServiceDiscoverer(() -> bootstrapServices);
}
}