// License: GPL. For details, see LICENSE file. package opendata; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.FilenameFilter; import java.io.IOException; import java.util.jar.JarFile; import java.util.jar.Manifest; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public final class ModuleListGenerator { private ModuleListGenerator() { // Hide default constructor for utilities classes } /** * @param args Main program arguments */ public static void main(String[] args) { final String url = "http://svn.openstreetmap.org/applications/editors/josm/plugins/opendata/dist/"; String baseDir = ""; if (args.length > 0) { baseDir = args[0]; } try ( BufferedWriter list = new BufferedWriter(new FileWriter(baseDir+"modules.txt")); ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(baseDir+"modules-icons.zip")); ) { for (File file : new File(baseDir+"dist").listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(".jar"); } })) { try { String filename = file.getName(); System.out.println("Processing "+filename); list.write(filename+";"+url+filename); list.newLine(); Manifest mf = new JarFile(file).getManifest(); for (Object att : mf.getMainAttributes().keySet()) { Object value = mf.getMainAttributes().get(att); if (value != null) { list.write("\t"+att+": "+value.toString()); list.newLine(); if (att.toString().equals("Module-Icon")) { // Directory with jar name, including extension String name = filename+"/"; zip.putNextEntry(new ZipEntry(name)); // Directory tree to image String[] items = value.toString().split("/"); for (int i = 0; i < items.length-1; i++) { zip.putNextEntry(new ZipEntry(name += items[i]+"/")); } // Image file zip.putNextEntry(new ZipEntry(name += items[items.length-1])); try { FileInputStream in; try { in = new FileInputStream(baseDir+"modules/"+filename.replace(".jar", "/")+value.toString()); } catch (FileNotFoundException e) { // If not in module dir, may be in main images directory if (value.toString().startsWith("images/")) { in = new FileInputStream(baseDir+value.toString()); } else { throw e; } } try { byte[] buffer = new byte[4096]; int n = -1; while ((n = in.read(buffer)) > 0) { zip.write(buffer, 0, n); } } finally { in.close(); } } catch (IOException e) { System.err.println("Cannot load Image-Icon: "+value.toString()); } finally { zip.closeEntry(); } } } } } catch (IOException e) { e.printStackTrace(); } } } catch (IOException e) { e.printStackTrace(); } } }