package org.jboss.as.test.patching.util.module;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.jboss.as.patching.IoUtils;
import org.jboss.as.patching.metadata.ModuleItem;
import org.jboss.as.test.patching.PatchingTestUtil;
import org.jboss.as.test.patching.ResourceItem;
/**
* @author Martin Simka
*/
public class Module {
private String namespace;
private String name;
private String slot;
private Properties properties;
private List<String> dependencies;
private List<ResourceItem> resourceRoots;
private List<ResourceItem> miscFiles;
private Module(Builder builder) {
this.namespace = builder.namespace;
this.name = builder.name;
this.slot = builder.slot;
this.properties = builder.properties;
this.dependencies = builder.dependencies;
this.resourceRoots = builder.resourceRoots;
this.miscFiles = builder.miscFiles;
}
public String getName() {
return name;
}
public String getSlot() {
return slot;
}
public String generateXml() {
StringBuilder stringBuilder = new StringBuilder("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
String rootElementTemplate = "<module xmlns=\"%s\" name=\"%s\" slot=\"%s\">\n";
stringBuilder.append(String.format(rootElementTemplate, namespace, name, slot));
if (!properties.isEmpty()) {
stringBuilder.append(" <properties>\n");
String propertyTemplate = " <property name=\"%s\" value=\"%s\"/>\n";
for (String key : properties.stringPropertyNames()) {
stringBuilder.append(String.format(propertyTemplate, key, properties.getProperty(key)));
}
stringBuilder.append(" </properties>\n");
}
stringBuilder.append(" <resources>\n");
String resourceRootTemplate = " <resource-root path=\"%s\"/>\n";
for (ResourceItem resourceRoot : resourceRoots) {
stringBuilder.append(String.format(resourceRootTemplate, resourceRoot.getItemName()));
}
stringBuilder.append(String.format(resourceRootTemplate, "."));
stringBuilder.append(" </resources>\n");
if (!resourceRoots.isEmpty()) {
stringBuilder.append(" <dependencies>\n");
String dependencyTemplate = " <module name=\"%s\"/>\n";
for (String module : dependencies) {
stringBuilder.append(String.format(dependencyTemplate, module));
}
stringBuilder.append(" </dependencies>\n");
}
stringBuilder.append("</module>\n");
return stringBuilder.toString();
}
/**
* writes module to disk
*
* @param baseDir usually modules dir, written path starts with first part of module name
* @return main dir
* @throws java.io.IOException
*/
public File writeToDisk(File baseDir) throws IOException {
File mainDir = IoUtils.mkdir(baseDir, (name + "." + slot).split("\\."));
File moduleXml = PatchingTestUtil.touch(mainDir, "module.xml");
PatchingTestUtil.dump(moduleXml, generateXml().getBytes(StandardCharsets.UTF_8));
for (ResourceItem resourceRoot : resourceRoots) {
File f = PatchingTestUtil.touch(mainDir, resourceRoot.getItemName());
PatchingTestUtil.dump(f, resourceRoot.getContent());
}
for (ResourceItem miscFile : miscFiles) {
File f = PatchingTestUtil.touch(mainDir, miscFile.getItemName());
PatchingTestUtil.dump(f, miscFile.getContent());
}
return mainDir;
}
public static class Builder {
private String namespace;
private String name;
private String slot;
private Properties properties;
private List<String> dependencies;
private List<ResourceItem> resourceRoots;
private List<ResourceItem> miscFiles;
public Builder(String name, String namespace) {
if (name == null) {
throw new NullPointerException("name");
}
if (namespace == null) {
throw new NullPointerException("namespace");
}
this.name = name;
this.namespace = namespace;
properties = new Properties();
dependencies = new ArrayList<String>();
resourceRoots = new ArrayList<ResourceItem>();
miscFiles = new ArrayList<ResourceItem>();
}
public Builder(String name) {
if (name == null) {
throw new NullPointerException("name");
}
this.name = name;
this.namespace = "urn:jboss:module:1.2";
properties = new Properties();
dependencies = new ArrayList<String>();
resourceRoots = new ArrayList<ResourceItem>();
miscFiles = new ArrayList<ResourceItem>();
}
public Builder slot(String slot) {
if (slot == null) {
throw new NullPointerException("slot");
}
this.slot = slot;
return this;
}
public Builder property(String name, String value) {
if (name == null) {
throw new NullPointerException("name");
}
if (value == null) {
throw new NullPointerException("value");
}
properties.setProperty(name, value);
return this;
}
public Builder dependency(String moduleName) {
if (moduleName == null) {
throw new NullPointerException("moduleName");
}
dependencies.add(moduleName);
return this;
}
public Builder resourceRoot(ResourceItem resourceRoot) {
if (resourceRoot == null) {
throw new NullPointerException("resourceRoot");
}
resourceRoots.add(resourceRoot);
return this;
}
public Builder miscFile(ResourceItem miscFile) {
if (miscFile == null) {
throw new NullPointerException("miscFile");
}
miscFiles.add(miscFile);
return this;
}
public Module build() {
assert notNull(name);
assert notNull(namespace);
if (slot == null) {
slot = ModuleItem.MAIN_SLOT;
}
return new Module(this);
}
static boolean notNull(Object o) {
return o != null;
}
}
}