package org.fenixedu.bennu.core.api.json;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
import org.fenixedu.bennu.core.annotation.DefaultJsonAdapter;
import org.fenixedu.bennu.core.json.JsonBuilder;
import org.fenixedu.bennu.core.json.JsonViewer;
import org.joda.time.DateTime;
import com.google.common.hash.Hashing;
import com.google.common.io.Files;
import com.google.gson.JsonElement;
@DefaultJsonAdapter(JarFile.class)
public class JarFileViewer implements JsonViewer<JarFile> {
@Override
public JsonElement view(JarFile file, JsonBuilder ctx) {
Properties properties = new Properties();
properties.put("jar", file.getName());
try {
properties.put("checksum", Hashing.sha1().hashBytes(Files.toByteArray(new File(file.getName()))).toString());
} catch (IOException e) {
// Cannot compute checksum :(
}
ZipEntry manifest = file.getEntry("META-INF/MANIFEST.MF");
if (manifest != null) {
properties.put("creation", new DateTime(manifest.getTime()).toString("yyyy-MM-dd HH:mm:ss"));
}
Enumeration<JarEntry> entries = file.entries();
while (entries.hasMoreElements()) {
JarEntry jarEntry = entries.nextElement();
if (jarEntry.getName().endsWith("pom.properties")) {
try (InputStream stream = file.getInputStream(jarEntry)) {
properties.load(stream);
} catch (IOException e) {
throw new Error(e);
}
}
}
try {
if (file.getManifest() != null) {
for (Entry<Object, Object> entry : file.getManifest().getMainAttributes().entrySet()) {
properties.put(entry.getKey().toString(), entry.getValue());
}
}
} catch (IOException e) {
throw new Error(e);
}
return ctx.view(properties);
}
}