/* ******************************************************************* * Copyright (c) 2010 Contributors * All rights reserved. * This program and the accompanying materials are made available * under the terms of the Eclipse Public License v1.0 * which accompanies this distribution and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Andy Clement (SpringSource) * ******************************************************************/ package org.aspectj.weaver; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.FileOutputStream; import java.io.IOException; /** * A variation of a DataOutputStream that is linked to a constant pool writer. The linked constant pool can be used to compress * objects into to simple index references into the constant pool. The corresponding decompression is done in the * VersionedDataInputStream. * * @author Andy Clement */ public class CompressingDataOutputStream extends DataOutputStream { private ConstantPoolWriter constantPoolWriter; public boolean compressionEnabled = true; public CompressingDataOutputStream(ByteArrayOutputStream baos, ConstantPoolWriter constantPoolWriter) { super(baos); this.constantPoolWriter = constantPoolWriter; } public CompressingDataOutputStream(FileOutputStream fos) { super(fos); } public boolean canCompress() { return constantPoolWriter != null && compressionEnabled; } /** * @param signature of the form 'La/b/c/d;' * @return the constant pool index */ public int compressSignature(String signature) { if (constantPoolWriter == null) { throw new IllegalStateException(); } return constantPoolWriter.writeUtf8(signature); } /** * @param filepath a file system path 'c:\a\b\c.txt' or '/a/b/c.txt' * @return the constant pool index */ public int compressFilepath(String filepath) { if (constantPoolWriter == null) { throw new IllegalStateException(); } return constantPoolWriter.writeUtf8(filepath); } /** * @param name a simple name (for example a method or field name) * @return the constant pool index */ public int compressName(String name) { if (constantPoolWriter == null) { throw new IllegalStateException(); } return constantPoolWriter.writeUtf8(name); } /** * @param name a simple name (for example a method or field name) */ public void writeCompressedName(String name) throws IOException { writeShort(compressName(name)); } /** * @param signature of the form 'La/b/c/d;' */ public void writeCompressedSignature(String signature) throws IOException { writeShort(compressSignature(signature)); } /** * @param path a file system path 'c:\a\b\c.txt' or '/a/b/c.txt' */ public void writeCompressedPath(String path) throws IOException { writeShort(compressFilepath(path)); } }