/*
* 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.internal;
import static java.util.Collections.emptyList;
import static org.mockito.Mockito.mock;
import org.mule.runtime.container.api.ModuleRepository;
import org.mule.runtime.deployment.model.api.application.Application;
import org.mule.runtime.deployment.model.api.plugin.ArtifactPluginClassLoaderFactory;
import org.mule.runtime.deployment.model.api.plugin.ArtifactPluginDescriptor;
import org.mule.runtime.deployment.model.api.plugin.ArtifactPluginRepository;
import org.mule.runtime.deployment.model.internal.application.MuleApplicationClassLoaderFactory;
import org.mule.runtime.deployment.model.internal.plugin.BundlePluginDependenciesResolver;
import org.mule.runtime.deployment.model.internal.plugin.PluginDependenciesResolver;
import org.mule.runtime.module.artifact.classloader.ClassLoaderRepository;
import org.mule.runtime.module.artifact.classloader.TrackingArtifactClassLoaderFactory;
import org.mule.runtime.module.deployment.impl.internal.application.ApplicationClassLoaderBuilderFactory;
import org.mule.runtime.module.deployment.impl.internal.application.ApplicationDescriptorFactory;
import org.mule.runtime.module.deployment.impl.internal.application.DefaultApplicationFactory;
import org.mule.runtime.module.deployment.impl.internal.application.TestApplicationWrapper;
import org.mule.runtime.module.deployment.impl.internal.artifact.DefaultClassLoaderManager;
import org.mule.runtime.module.deployment.impl.internal.artifact.DescriptorLoaderRepository;
import org.mule.runtime.module.deployment.impl.internal.domain.DomainManager;
import org.mule.runtime.module.deployment.impl.internal.domain.DomainRepository;
import org.mule.runtime.module.deployment.impl.internal.plugin.ArtifactPluginDescriptorFactory;
import org.mule.runtime.module.deployment.impl.internal.plugin.ArtifactPluginDescriptorLoader;
import org.mule.runtime.module.deployment.impl.internal.policy.PolicyTemplateClassLoaderBuilderFactory;
import org.mule.runtime.module.extension.internal.loader.ExtensionModelLoaderRepository;
import org.mule.runtime.module.service.ServiceRepository;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
* Creates a {@link DefaultApplicationFactory} that returns {@link TestApplicationWrapper} instances in order to simulate errors
* on application deployment phases.
*/
public class TestApplicationFactory extends DefaultApplicationFactory {
private boolean failOnStopApplication;
private boolean failOnDisposeApplication;
public TestApplicationFactory(ApplicationClassLoaderBuilderFactory applicationClassLoaderBuilderFactory,
ApplicationDescriptorFactory applicationDescriptorFactory,
ArtifactPluginRepository artifactPluginRepository, DomainRepository domainRepository,
ServiceRepository serviceRepository,
ExtensionModelLoaderRepository extensionModelLoaderRepository,
ClassLoaderRepository classLoaderRepository,
PolicyTemplateClassLoaderBuilderFactory policyTemplateClassLoaderBuilderFactory,
PluginDependenciesResolver pluginDependenciesResolver,
ArtifactPluginDescriptorLoader artifactPluginDescriptorLoader) {
super(applicationClassLoaderBuilderFactory, applicationDescriptorFactory, artifactPluginRepository, domainRepository,
serviceRepository, extensionModelLoaderRepository, classLoaderRepository, policyTemplateClassLoaderBuilderFactory,
pluginDependenciesResolver, artifactPluginDescriptorLoader);
}
public static TestApplicationFactory createTestApplicationFactory(MuleApplicationClassLoaderFactory applicationClassLoaderFactory,
DomainManager domainManager,
ServiceRepository serviceRepository,
ExtensionModelLoaderRepository extensionModelLoaderRepository,
ModuleRepository moduleRepository,
DescriptorLoaderRepository descriptorLoaderRepository) {
ArtifactPluginDescriptorFactory artifactPluginDescriptorFactory =
new ArtifactPluginDescriptorFactory();
ArtifactPluginDescriptorLoader artifactPluginDescriptorLoader =
new ArtifactPluginDescriptorLoader(artifactPluginDescriptorFactory);
TestEmptyApplicationPluginRepository applicationPluginRepository = new TestEmptyApplicationPluginRepository();
ApplicationDescriptorFactory applicationDescriptorFactory =
new ApplicationDescriptorFactory(artifactPluginDescriptorLoader, applicationPluginRepository, descriptorLoaderRepository);
final DefaultClassLoaderManager artifactClassLoaderManager = new DefaultClassLoaderManager();
PluginDependenciesResolver pluginDependenciesResolver = new BundlePluginDependenciesResolver(artifactPluginDescriptorFactory);
ApplicationClassLoaderBuilderFactory applicationClassLoaderBuilderFactory =
new ApplicationClassLoaderBuilderFactory(applicationClassLoaderFactory,
new TrackingArtifactClassLoaderFactory<>(artifactClassLoaderManager,
new ArtifactPluginClassLoaderFactory(moduleRepository)));
return new TestApplicationFactory(applicationClassLoaderBuilderFactory, applicationDescriptorFactory,
applicationPluginRepository, domainManager, serviceRepository,
extensionModelLoaderRepository, artifactClassLoaderManager,
mock(PolicyTemplateClassLoaderBuilderFactory.class), pluginDependenciesResolver,
artifactPluginDescriptorLoader);
}
@Override
public Application createArtifact(File appLocation) throws IOException {
Application app = super.createArtifact(appLocation);
TestApplicationWrapper testApplicationWrapper = new TestApplicationWrapper(app);
testApplicationWrapper.setFailOnDisposeApplication(failOnDisposeApplication);
testApplicationWrapper.setFailOnStopApplication(failOnStopApplication);
return testApplicationWrapper;
}
public void setFailOnDisposeApplication(boolean failOnDisposeApplication) {
this.failOnDisposeApplication = failOnDisposeApplication;
}
public void setFailOnStopApplication(boolean failOnStopApplication) {
this.failOnStopApplication = failOnStopApplication;
}
private static class TestEmptyApplicationPluginRepository implements ArtifactPluginRepository {
public List<ArtifactPluginDescriptor> getContainerArtifactPluginDescriptors() {
return emptyList();
}
}
}