
net.filebot.ant.spk.RepositoryTask Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of ant-spk Show documentation
Show all versions of ant-spk Show documentation
Ant Task for creating SPK packages for Synology NAS
The newest version!
package net.filebot.ant.spk;
import static java.nio.charset.StandardCharsets.*;
import static java.util.Collections.*;
import static net.filebot.ant.spk.PackageTask.*;
import static net.filebot.ant.spk.util.Digest.*;
import java.io.File;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import javax.json.Json;
import javax.json.JsonArrayBuilder;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import javax.json.JsonReader;
import javax.json.JsonString;
import javax.json.JsonValue;
import javax.json.JsonWriter;
import javax.json.stream.JsonGenerator;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.taskdefs.Get;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.ResourceCollection;
import org.apache.tools.ant.types.TarFileSet;
import org.apache.tools.ant.types.resources.URLResource;
import org.apache.tools.ant.types.resources.Union;
import org.apache.tools.ant.util.FileUtils;
public class RepositoryTask extends Task {
File index;
Union keyrings = new Union();
List spks = new ArrayList();
List sources = new ArrayList();
public void setFile(File file) {
this.index = file;
}
public void addConfiguredKeyRing(FileSet key) {
keyrings.add(key);
}
public void addConfiguredKeyRing(ResourceCollection key) {
keyrings.add(key);
}
public void addConfiguredSource(URLResource source) {
sources.add(source);
}
public void addConfiguredSPK(SPK spk) {
if (spk.file == null) {
throw new BuildException("Required attributes: [file] or [url, file]");
}
spks.add(spk);
}
public static final String KEYRINGS = "keyrings";
public static final String PACKAGES = "packages";
@Override
public void execute() throws BuildException {
if (index == null) {
throw new BuildException("Required attributes: file");
}
try {
// generate package source for spk files
JsonArrayBuilder jsonPackages = Json.createArrayBuilder();
getPackages().forEach((p) -> {
JsonObjectBuilder jsonPackage = Json.createObjectBuilder();
p.forEach((k, v) -> {
if (v instanceof Boolean) {
jsonPackage.add(k, (Boolean) v); // Boolean
} else if (v instanceof Number) {
jsonPackage.add(k, ((Number) v).longValue()); // Integer
} else if (v instanceof String[]) {
JsonArrayBuilder array = Json.createArrayBuilder(); // String Array
for (String s : (String[]) v) {
array.add(s);
}
jsonPackage.add(k, array);
} else if (v == null) {
jsonPackage.addNull(k); // null
} else {
jsonPackage.add(k, v.toString()); // String
}
});
jsonPackages.add(jsonPackage);
});
// collect public keys and omit duplicates
Set keyrings = new LinkedHashSet();
keyrings.addAll(getKeyRings());
// include keyrings and packages from external package sources
for (URLResource source : sources) {
try (JsonReader reader = Json.createReader(source.getInputStream())) {
JsonObject json = reader.readObject();
if (json.getJsonArray(KEYRINGS) != null) {
for (JsonValue k : json.getJsonArray(KEYRINGS)) {
log("Import keyring: " + source);
keyrings.add(normalizeKey(((JsonString) k).getString()));
}
}
if (json.getJsonArray(PACKAGES) != null) {
for (JsonValue p : json.getJsonArray(PACKAGES)) {
log("Import package: " + (((JsonString) ((JsonObject) p).get(PACKAGE))).getString());
jsonPackages.add(p);
}
}
} catch (Exception e) {
throw new BuildException(e);
}
}
JsonObjectBuilder jsonRoot = Json.createObjectBuilder();
if (keyrings.size() > 0) {
JsonArrayBuilder jsonKeyrings = Json.createArrayBuilder();
keyrings.forEach(jsonKeyrings::add);
jsonRoot.add(KEYRINGS, jsonKeyrings);
}
jsonRoot.add(PACKAGES, jsonPackages);
log("Write Package Source: " + index);
StringWriter json = new StringWriter();
try (JsonWriter writer = Json.createWriterFactory(singletonMap(JsonGenerator.PRETTY_PRINTING, true)).createWriter(json)) {
writer.writeObject(jsonRoot.build());
}
Files.write(index.toPath(), json.toString().trim().getBytes(UTF_8));
} catch (Exception e) {
throw new BuildException(e);
}
}
public List getKeyRings() throws Exception {
List keys = new ArrayList();
for (Resource resource : keyrings) {
log("Include keyring: " + resource.getName());
String key = FileUtils.readFully(new InputStreamReader(resource.getInputStream(), US_ASCII));
if (key != null) {
keys.add(normalizeKey(key)); // make sure to normalize line endings
}
}
return keys;
}
private static final Pattern NEWLINE = Pattern.compile("\\R");
private static final String UNIX_NEWLINE = "\n";
private String normalizeKey(String key) {
return NEWLINE.matcher(key).replaceAll(UNIX_NEWLINE).trim();
}
public static final String PACKAGE = "package";
public static final String VERSION = "version";
public static final String LINK = "link";
public static final String MD5 = "md5";
public static final String SHA256 = "sha256"; // NOT SUPPORTED BY SYNOLOGY DSM
public static final String SIZE = "size";
public static final String THUMBNAIL = "thumbnail";
public static final String SNAPSHOT = "snapshot";
public List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy