/** * Title: The SWORD Project

* Description:

* Copyright: Copyright (c) CrossWire Java Development Team

* Company: CrossWire Bible Society

* @author CrossWire Java Development Team * @version 1.0 */ package org.crosswire.sword.web; import org.crosswire.sword.mgr.SWMgr; import org.crosswire.sword.mgr.SWConfig; import java.util.zip.*; import java.util.Enumeration; import java.io.OutputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FilenameFilter; import com.objectspace.jgl.HashMap; import java.util.Vector; public class PackageMod { public PackageMod() { } public static void copyFileToZip(ZipOutputStream zos, String sourceDir, String fileName, String prefix) { try { if ( (prefix.length() > 0) && (!prefix.endsWith("/"))) { prefix += "/"; } zos.putNextEntry(new ZipEntry(prefix + fileName)); fileName = sourceDir + ( (sourceDir.endsWith("/")) ? "" : "/") + fileName; FileInputStream fin = new FileInputStream(fileName); byte[] buffer = new byte[20000]; int len; while ( (len = fin.read(buffer)) > 0) { zos.write(buffer, 0, len); } fin.close(); } catch (Exception e) { e.printStackTrace(); } } public static long getLastModFile(SWMgr mgr, String sourceDir, String modName) { String entry = null; Enumeration fileList = null; Vector files = new Vector(); long lastModFile = 0; if (!sourceDir.endsWith("/")) { sourceDir += "/"; } try { if (mgr.config.contains(modName)) { /* fileList = section.keys("File"); if (fileList.hasMoreElements()) { // copy each file while (fileList.hasMoreElements()) { files.add((String)fileList.nextElement()); } } else { //copy all files in DataPath directory */ String modDir; String modFile; String sourceOrig = sourceDir; modDir = mgr.config.getProperty(modName, "DataPath"); if (modDir != null) { entry = mgr.config.getProperty(modName, "ModDrv"); if (entry != null) { if (entry.equals("RawLD") || entry.equals("RawLD4") || entry.equals("zLD") || entry.equals("RawGenBook")) { modDir = modDir.substring(0, modDir.lastIndexOf('/')); } } if (modDir.startsWith("./")) { modDir = modDir.substring(2); } sourceDir += modDir; File dataDir = new File(sourceDir); String names[] = dataDir.list(); for (int i = 0; i < names.length; i++) { if ( (!names[i].equals(".")) && (!names[i].equals(".."))) { File testFile = new File(dataDir, names[i]); if (testFile.canRead()) { if (testFile.lastModified() > lastModFile) { lastModFile = testFile.lastModified(); } } } } } sourceDir = sourceOrig; sourceDir += "mods.d/"; File dataDir = new File(sourceDir); String names[] = dataDir.list( new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".conf"); } }); for (int i = 0; i < names.length; i++) { if ( (!names[i].equals(".")) && (!names[i].equals(".."))) { modFile = sourceDir; modFile += names[i]; SWConfig config = new SWConfig(modFile); if (config.contains(modName)) { File testFile = new File(dataDir, names[i]); if (testFile.canRead()) { if (testFile.lastModified() > lastModFile) { lastModFile = testFile.lastModified(); } } } } } // } } } catch (Exception e1) { e1.printStackTrace(); } return lastModFile; } public static void addFileNames(Vector target, File directory, String prefix) { String []names = directory.list(); for (int i = 0; i < names.length; i++) { if ((!names[i].equals(".")) && (!names[i].equals(".."))) { File child = new File(directory, names[i]); if (child.isDirectory()) { addFileNames(target, child, prefix+names[i]+"/"); } else { target.add(prefix+names[i]); } } } } public static void sendToZipStream(OutputStream os, SWMgr mgr, String sourceDir, String modName, boolean triggerInstall, String internalZipSubdir) { ZipOutputStream zstream = new ZipOutputStream(os); HashMap section = null; String entry = null; Enumeration fileList = null; if (!sourceDir.endsWith("/")) { sourceDir += "/"; } try { section = (HashMap) mgr.config.sections.get(modName); if (section != null) { fileList = section.keys("File"); if (fileList.hasMoreElements()) { // copy each file while (fileList.hasMoreElements()) { copyFileToZip(zstream, sourceDir, (String) fileList.nextElement(), internalZipSubdir); } } else { //copy all files in DataPath directory String modDir; String modFile; String sourceOrig = sourceDir; modDir = (String) section.get("DataPath"); if (modDir != null) { entry = (String) section.get("ModDrv"); if (entry != null) { if (entry.equals("RawLD") || entry.equals("RawLD4") || entry.equals("zLD") || entry.equals("RawGenBook")) { modDir = modDir.substring(0, modDir.lastIndexOf('/')); } } if (modDir.startsWith("./")) { modDir = modDir.substring(2); } sourceDir += modDir; File dataDir = new File(sourceDir); Vector names = new Vector(); addFileNames(names, dataDir, ""); for (int i = 0; i < names.size(); i++) { modFile = modDir; if (!modFile.endsWith("/")) { modFile += "/"; } modFile += names.get(i); copyFileToZip(zstream, sourceOrig, modFile, internalZipSubdir); } } sourceDir = sourceOrig; sourceDir += "mods.d/"; File dataDir = new File(sourceDir); String names[] = dataDir.list( new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".conf"); } }); for (int i = 0; i < names.length; i++) { if ( (!names[i].equals(".")) && (!names[i].equals(".."))) { modFile = sourceDir; modFile += names[i]; SWConfig config = new SWConfig(modFile); if (config.sections.get(modName) != null) { if (triggerInstall) { String dir = (internalZipSubdir.length() > 0) ? (internalZipSubdir + "/newmods/") : "newmods/"; copyFileToZip(zstream, sourceOrig + "mods.d/", names[i], dir); } else { copyFileToZip(zstream, sourceOrig, "mods.d/" + names[i], internalZipSubdir); } } } } } zstream.flush(); zstream.close(); } } catch (Exception e1) { e1.printStackTrace(); } } }