package org.wildfly.swarm.bootstrap.env;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.wildfly.swarm.bootstrap.util.BootstrapProperties;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;
/**
* @author Bob McWhirter
*/
public class WildFlySwarmManifest {
public static final String CLASSPATH_LOCATION = "META-INF/wildfly-swarm-manifest.yaml";
private static final String ASSET = "asset";
private static final String MAIN_CLASS = "main-class";
private static final String HOLLOW = "hollow";
private static final String PROPERTIES = "properties";
private static final String MODULES = "modules";
private static final String BOOTSTRAP_ARTIFACTS = "bootstrap-artifacts";
private static final String BUNDLE_DEPENDENCIES = "bundle-dependencies";
private static final String DEPENDENCIES = "dependencies";
public WildFlySwarmManifest() {
}
public WildFlySwarmManifest(URL url) throws IOException {
read(url);
}
public WildFlySwarmManifest(InputStream in) throws IOException {
read(in);
}
public void read(URL url) throws IOException {
try (InputStream in = url.openStream()) {
read(in);
}
}
@SuppressWarnings("unchecked")
public void read(InputStream in) throws IOException {
Yaml yaml = new Yaml();
Map data = (Map) yaml.load(in);
this.asset = (String) data.get(ASSET);
this.mainClass = (String) data.get(MAIN_CLASS);
this.hollow = (boolean) data.get(HOLLOW);
this.properties.clear();
this.properties.putAll((Map<?, ?>) data.get(PROPERTIES));
this.bootstrapModules.clear();
this.bootstrapModules.addAll((Collection<? extends String>) data.get(MODULES));
this.bootstrapArtifacts.clear();
this.bootstrapArtifacts.addAll((Collection<? extends String>) data.get(BOOTSTRAP_ARTIFACTS));
if (data.get(BUNDLE_DEPENDENCIES) != null) {
this.bundleDependencies = (boolean) data.get(BUNDLE_DEPENDENCIES);
}
this.dependencies.clear();
this.dependencies.addAll((Collection<? extends String>) data.get(DEPENDENCIES));
setupProperties();
}
public void write(Path path) throws IOException {
Files.createDirectories(path.getParent());
try (Writer out = new FileWriter(path.toFile())) {
out.write(this.toString());
}
}
@Override
public String toString() {
Map<String,Object> data = new LinkedHashMap<String,Object>() {{
if (asset != null) {
put(ASSET, asset);
}
put(MAIN_CLASS, mainClass);
put(HOLLOW, hollow);
put(PROPERTIES, properties);
put(MODULES, bootstrapModules);
put(BOOTSTRAP_ARTIFACTS, bootstrapArtifacts);
put(BUNDLE_DEPENDENCIES, bundleDependencies);
put(DEPENDENCIES, dependencies);
}};
DumperOptions options = new DumperOptions();
options.setPrettyFlow(true);
options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
Yaml yaml = new Yaml(options);
return yaml.dump(data);
}
private void setupProperties() {
// enumerate all properties, not just those with string
// values, because Gradle (and others) can set non-string
// values for things like swarm.http.port (integer)
Enumeration<?> names = this.properties.propertyNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
Object value = this.properties.get(name);
if (value != null) {
if (System.getProperty(name) == null) {
System.setProperty(name, value.toString());
}
}
}
if (this.bundleDependencies != null && this.bundleDependencies) {
System.setProperty(BootstrapProperties.BUNDLED_DEPENDENCIES, this.bundleDependencies.toString());
}
}
public void addBootstrapModule(String module) {
this.bootstrapModules.add(module);
}
public Set<String> bootstrapModules() {
return this.bootstrapModules;
}
public void addBootstrapArtifact(String artifact) {
this.bootstrapArtifacts.add(artifact);
}
public Set<String> bootstrapArtifacts() {
return this.bootstrapArtifacts;
}
public void addDependency(String gav) {
this.dependencies.add(gav);
}
public Set<String> getDependencies() {
return this.dependencies;
}
public void setAsset(String asset) {
if (!this.isHollow()) {
this.asset = asset;
}
}
public String getAsset() {
return this.asset;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public Properties getProperties() {
return this.properties;
}
public void bundleDependencies(boolean bundleDependencies) {
this.bundleDependencies = bundleDependencies;
}
public boolean isBundleDependencies() {
if (this.bundleDependencies == null) {
return true;
}
return this.bundleDependencies;
}
public void setMainClass(String mainClass) {
if (mainClass != null) {
this.mainClass = mainClass;
}
}
public String getMainClass() {
return this.mainClass;
}
public void setHollow(boolean hollow) {
this.hollow = hollow;
if (this.isHollow()) {
this.asset = null;
}
}
public boolean isHollow() {
return this.hollow;
}
private String asset = null;
private Set<String> bootstrapModules = new LinkedHashSet<>();
private Set<String> bootstrapArtifacts = new LinkedHashSet<>();
private Set<String> dependencies = new HashSet<>();
private Properties properties = new Properties();
private Boolean bundleDependencies;
private String mainClass = ApplicationEnvironment.DEFAULT_MAIN_CLASS_NAME;
private boolean hollow;
}