/*
* 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.builder;
import static org.mule.runtime.api.util.Preconditions.checkArgument;
import static org.mule.runtime.deployment.model.api.DeployableArtifactDescriptor.DEFAULT_DEPLOY_PROPERTIES_RESOURCE;
import static org.mule.runtime.deployment.model.api.domain.Domain.DOMAIN_CONFIG_FILE;
import org.mule.runtime.core.util.StringUtils;
import org.mule.runtime.module.artifact.builder.AbstractArtifactFileBuilder;
import org.mule.runtime.module.artifact.builder.AbstractDependencyFileBuilder;
import org.mule.tck.ZipUtils.ZipResource;
import java.io.File;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
/**
* Creates Mule Domain files.
*/
public class DomainFileBuilder extends AbstractArtifactFileBuilder<DomainFileBuilder> {
private List<ApplicationFileBuilder> applications = new LinkedList<>();
private Properties deployProperties = new Properties();
/**
* Creates a new builder
*
* @param id artifact identifier. Non empty.
*/
public DomainFileBuilder(String id) {
super(id);
}
/**
* Creates a new builder from another instance.
*
* @param source instance used as template to build the new one. Non null.
*/
public DomainFileBuilder(DomainFileBuilder source) {
super(source);
}
/**
* Create a new builder from another instance and different ID.
*
* @param id artifact identifier. Non empty.
* @param source instance used as template to build the new one. Non null.
*/
public DomainFileBuilder(String id, DomainFileBuilder source) {
super(id, source);
this.applications.addAll(source.applications);
}
@Override
protected DomainFileBuilder getThis() {
return this;
}
/**
* Sets the configuration file used for the domain.
*
* @param configFile domain configuration from a external file or test resource. Non empty.
* @return the same builder instance
*/
public DomainFileBuilder definedBy(String configFile) {
checkImmutable();
checkArgument(!StringUtils.isEmpty(configFile), "Config file cannot be empty");
this.resources.add(new ZipResource(configFile, "mule" + File.separator + DOMAIN_CONFIG_FILE));
return this;
}
/**
* Adds an application to the domain.
*
* @param appFileBuilder builder defining the application. Non null.
* @return the same builder instance
*/
public DomainFileBuilder containing(ApplicationFileBuilder appFileBuilder) {
checkImmutable();
checkArgument(appFileBuilder != null, "Application builder cannot be null");
this.applications.add(appFileBuilder);
return this;
}
/**
* Adds a property into the domain deployment properties file.
*
* @param propertyName name fo the property to add. Non empty
* @param propertyValue value of the property to add. Non null.
* @return the same builder instance
*/
public DomainFileBuilder deployedWith(String propertyName, String propertyValue) {
checkImmutable();
checkArgument(!StringUtils.isEmpty(propertyName), "Property name cannot be empty");
checkArgument(propertyValue != null, "Property value cannot be null");
deployProperties.put(propertyName, propertyValue);
return this;
}
@Override
protected List<ZipResource> getCustomResources() {
final List<ZipResource> customResources = new LinkedList<>();
for (ApplicationFileBuilder application : applications) {
final File applicationFile = application.getArtifactFile();
customResources.add(new ZipResource(applicationFile.getAbsolutePath(), "apps/" + applicationFile.getName()));
}
final ZipResource deployProperties =
createPropertiesFile(this.deployProperties, DEFAULT_DEPLOY_PROPERTIES_RESOURCE, DEFAULT_DEPLOY_PROPERTIES_RESOURCE);
if (deployProperties != null) {
customResources.add(deployProperties);
}
for (AbstractDependencyFileBuilder dependencyFileBuilder : getAllCompileDependencies()) {
customResources.add(new ZipResource(dependencyFileBuilder.getArtifactFile().getAbsolutePath(),
"lib/" + dependencyFileBuilder.getArtifactFile().getName()));
}
return customResources;
}
@Override
public String getConfigFile() {
return DOMAIN_CONFIG_FILE;
}
}