/* * $Id$ * * Copyright (c) 2000-2003 by Rodney Kinney * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License (LGPL) as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, copies are available * at http://www.opensource.org. */ package VASSAL.chat; import java.awt.Frame; import java.awt.TextField; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Arrays; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; import VASSAL.tools.io.IOUtils; public abstract class Compressor { public static byte[] compress(byte[] in) throws IOException { final ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); final ZipOutputStream zipOut = new ZipOutputStream(byteOut); try { zipOut.putNextEntry(new ZipEntry("Dummy")); //$NON-NLS-1$ zipOut.write(in); } finally { try { zipOut.close(); } // FIXME: review error message catch (IOException e) { e.printStackTrace(); } } return byteOut.toByteArray(); } public static byte[] decompress(byte[] in) throws IOException { final ZipInputStream zipIn = new ZipInputStream(new ByteArrayInputStream(in)); try { zipIn.getNextEntry(); return IOUtils.toByteArray(zipIn); } finally { try { zipIn.close(); } // FIXME: review error message catch (IOException e) { e.printStackTrace(); } } } public static void main(String args[]) throws Exception { if (args.length == 0) { final Frame f = new Frame(); final TextField tf = new TextField(60); f.add(tf); f.pack(); f.setVisible(true); tf.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { try { final String s = evt.getActionCommand(); System.err.println("Input (" + s.length() + ") = " + s); //$NON-NLS-1$ //$NON-NLS-2$ final String comp = new String(compress(s.getBytes())); System.err.println("Compressed (" + comp.length() + ") = " + comp); //$NON-NLS-1$ //$NON-NLS-2$ final String decomp = new String(decompress(comp.getBytes())); System.err.println("Decompressed (" + decomp.length() + ") = " + decomp); //$NON-NLS-1$ //$NON-NLS-2$ } // FIXME: review error message catch (IOException ex) { ex.printStackTrace(); } } }); } else { final ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); final FileInputStream file = new FileInputStream(args[0]); try { IOUtils.copy(file, byteOut); } finally { try { file.close(); } // FIXME: review error message catch (IOException e) { e.printStackTrace(); } } final byte[] contents = byteOut.toByteArray(); if (contents[0] == 'P' && contents[1] == 'K') { final byte[] uncompressed = Compressor.decompress(contents); final FileOutputStream out = new FileOutputStream(args[0] + ".uncompressed"); //$NON-NLS-1$ try { out.write(uncompressed); } finally { try { out.close(); } // FIXME: review error message catch (IOException e) { e.printStackTrace(); } } final byte[] recompressed = Compressor.compress(uncompressed); if (!Arrays.equals(recompressed,contents)) { // FIXME: don't throw unchecked exception throw new RuntimeException("Compression failed"); //$NON-NLS-1$ } } else { final byte[] compressed = Compressor.compress(contents); final FileOutputStream out = new FileOutputStream(args[0] + ".compressed"); //$NON-NLS-1$ try { out.write(compressed); } finally { try { out.close(); } // FIXME: review error message catch (IOException e) { e.printStackTrace(); } } if (!Arrays.equals(Compressor.decompress(compressed),contents)) { // FIXME: don't throw unchecked exception throw new RuntimeException("Compression failed"); //$NON-NLS-1$ } } } } }