package org.ecgine.gradle;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.text.ParseException;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
import org.gradle.api.GradleException;
import org.gradle.api.Project;
public class EManifest {
private BundleType ecgineBundleType;
private String symbolicName;
private String version;
private Project project;
private Map<String, String> requiredBundles;
public EManifest(Project project, File file) {
this.project = project;
Map<String, String> allProperties = readProperties(file);
String sn = allProperties.get("Bundle-SymbolicName");
if (sn != null) {
symbolicName = sn.split(";")[0].trim();
}
String bt = allProperties.get("Ecgine-BundleType");
if (bt != null) {
try {
ecgineBundleType = BundleType.valueOf(bt.trim().toUpperCase());
} catch (Exception exception) {
throw new GradleException("Invalid ecgine bundle type");
}
}
String bv = allProperties.get("Bundle-Version");
if (bv != null) {
version = bv.trim();
}
String rb = allProperties.get("Require-Bundle");
if (rb != null) {
prepareRequiredBundles(rb);
}
if (requiredBundles == null) {
requiredBundles = new HashMap<>();
}
}
private Map<String, String> readProperties(File file) {
Map<String, String> allProperties = new HashMap<>();
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line;
String name = null;
StringBuilder value = new StringBuilder();
while ((line = br.readLine()) != null) {
if (line.contains(":")) {
if (name != null) {
allProperties.put(name, value.toString());
}
String[] split = line.split(":");
name = split[0];
value = new StringBuilder(split[1]);
} else {
value.append("\n").append(line);
}
}
if (name != null) {
allProperties.put(name, value.toString());
}
} catch (Exception e) {
throw new GradleException("Unable to read .ecgine file", e);
}
return allProperties;
}
private void prepareRequiredBundles(String all) {
try {
requiredBundles = new HashMap<>();
ManifestHeaderValue value = new ManifestHeaderValue(all);
value.getElements().forEach(e -> {
String name = e.getValues().get(0);
String val = e.getAttributes().get("bundle-version");
requiredBundles.put(name, val);
});
} catch (ParseException e) {
throw new GradleException("", e);
}
}
public boolean isServer() {
return ecgineBundleType == BundleType.SERVER;
}
public boolean isShared() {
return ecgineBundleType == BundleType.SHARED;
}
public boolean isClient() {
return ecgineBundleType == BundleType.CLIENT;
}
public boolean isUnknown() {
return ecgineBundleType == null;
}
public String getSymbolicName() {
return symbolicName;
}
public String getVersion() {
return version;
}
public BundleType getEcgineBundleType() {
return ecgineBundleType;
}
public Project getProject() {
return project;
}
@Override
public String toString() {
return symbolicName;
}
public void foreachRequiredBundle(BiConsumer<String, String> requiredBundle) {
requiredBundles.forEach(requiredBundle);
}
public File getJar() {
return new File(getProject().getRootProject().getBuildDir(), project.getName() + ".jar");
}
}