[icedtea-web] RFC: depend on sun.misc and remove local HexDumpEncoder and CharacterEncoder

Dr Andrew John Hughes ahughes at redhat.com
Wed Dec 8 10:44:56 PST 2010


On 13:30 Wed 08 Dec     , Omair Majid wrote:
> Hi,
> 
> IcedTea-Web contains the classes 
> net.sourceforge.jnlp.tools.HexDumpEncoder and 
> net.sourceforge.jnlp.tools.CharacterEncoder. These classes are copies of 
> those in sun.misc pacakge. In fact, diff -w shows that the only 
> differences are in license headers (the Sun->Oracle name change).
> 
> Copying code like this does not help with maintenance. I propose that we 
> remove these classes from IcedTea-Web and instead depend on the classes 
> in the JDK (similar to how we deal with Base64Encoder). The attached 
> patch accomplishes this.
> 
> Of course, the ideal solution would be to depend on a proper public API 
> for this sort of thing, but we want to avoid adding extra dependencies 
> to IcedTea-Web for now.
> 
> Any thoughts or comments?
> 

Can you file a bug for this as for the other sun.* dependencies?  Then
reference it in configure.ac.

Otherwise, good to commit.  It doesn't help to have verbatim copies of
such code in the tree.

> ChangeLog:
> 2010-12-08  Omair Majid  <omajid at redhat.com>
> 
>      * configure.ac: Add check for sun.misc.HexDumpEncoder
>      * netx/net/sourceforge/jnlp/security/CertsInfoPane.java: Import
>      sun.misc.HexDumpEncoder. Remove import of
>      net.sourceforge.jnlp.tools.*
>      * netx/net/sourceforge/jnlp/tools/CharacterEncoder.java: Remove
>      file.
>      * netx/net/sourceforge/jnlp/tools/HexDumpEncoder.java: Remove file.
> 
> Cheers,
> Omair

> diff -r 78afe7c627ae configure.ac
> --- a/configure.ac	Wed Dec 08 12:09:00 2010 -0500
> +++ b/configure.ac	Wed Dec 08 12:48:01 2010 -0500
> @@ -69,6 +69,7 @@
>  IT_CHECK_FOR_CLASS(SUN_SECURITY_UTIL_HOSTNAMECHECKER, [sun.security.util.HostnameChecker])
>  IT_CHECK_FOR_CLASS(SUN_SECURITY_X509_X500NAME, [sun.security.x509.X500Name])
>  IT_CHECK_FOR_CLASS(SUN_MISC_BASE64ENCODER, [sun.misc.BASE64Encoder])
> +IT_CHECK_FOR_CLASS(SUN_MISC_HEXDUMPENCODER, [sun.misc.HexDumpEncoder])
>  IT_CHECK_FOR_CLASS(SUN_SECURITY_VALIDATOR_VALIDATOREXCEPTION, [sun.security.validator.ValidatorException])
>  IT_CHECK_FOR_CLASS(COM_SUN_NET_SSL_INTERNAL_SSL_X509EXTENDEDTRUSTMANAGER,
>  	[com.sun.net.ssl.internal.ssl.X509ExtendedTrustManager])
> diff -r 78afe7c627ae netx/net/sourceforge/jnlp/security/CertsInfoPane.java
> --- a/netx/net/sourceforge/jnlp/security/CertsInfoPane.java	Wed Dec 08 12:09:00 2010 -0500
> +++ b/netx/net/sourceforge/jnlp/security/CertsInfoPane.java	Wed Dec 08 12:48:01 2010 -0500
> @@ -46,6 +46,8 @@
>  import java.security.MessageDigest;
>  import java.math.BigInteger;
>  import javax.security.auth.x500.X500Principal;
> +
> +import sun.misc.HexDumpEncoder;
>  import sun.security.x509.*;
>  import javax.swing.*;
>  import javax.swing.event.*;
> @@ -57,8 +59,6 @@
>  import javax.swing.tree.DefaultMutableTreeNode;
>  import javax.swing.tree.TreeSelectionModel;
>  
> -import net.sourceforge.jnlp.tools.*;
> -
>  /**
>   * Provides the panel for the Certificate Info dialog. This dialog displays data from
>   * X509Certificate(s) used in jar signing.
> diff -r 78afe7c627ae netx/net/sourceforge/jnlp/tools/CharacterEncoder.java
> --- a/netx/net/sourceforge/jnlp/tools/CharacterEncoder.java	Wed Dec 08 12:09:00 2010 -0500
> +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
> @@ -1,350 +0,0 @@
> -/*
> - * Copyright 1995-2005 Sun Microsystems, Inc.  All Rights Reserved.
> - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
> - *
> - * This code is free software; you can redistribute it and/or modify it
> - * under the terms of the GNU General Public License version 2 only, as
> - * published by the Free Software Foundation.  Sun designates this
> - * particular file as subject to the "Classpath" exception as provided
> - * by Sun in the LICENSE file that accompanied this code.
> - *
> - * This code 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 General Public License
> - * version 2 for more details (a copy is included in the LICENSE file that
> - * accompanied this code).
> - *
> - * You should have received a copy of the GNU General Public License version
> - * 2 along with this work; if not, write to the Free Software Foundation,
> - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
> - *
> - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
> - * CA 95054 USA or visit www.sun.com if you need additional information or
> - * have any questions.
> - */
> -
> -package net.sourceforge.jnlp.tools;
> -
> -import java.io.InputStream;
> -import java.io.ByteArrayInputStream;
> -import java.io.OutputStream;
> -import java.io.ByteArrayOutputStream;
> -import java.io.PrintStream;
> -import java.io.IOException;
> -import java.nio.ByteBuffer;
> -
> -/**
> - * This class defines the encoding half of character encoders.
> - * A character encoder is an algorithim for transforming 8 bit binary
> - * data into text (generally 7 bit ASCII or 8 bit ISO-Latin-1 text)
> - * for transmition over text channels such as e-mail and network news.
> - *
> - * The character encoders have been structured around a central theme
> - * that, in general, the encoded text has the form:
> - *
> - * <pre>
> - *      [Buffer Prefix]
> - *      [Line Prefix][encoded data atoms][Line Suffix]
> - *      [Buffer Suffix]
> - * </pre>
> - *
> - * In the CharacterEncoder and CharacterDecoder classes, one complete
> - * chunk of data is referred to as a <i>buffer</i>. Encoded buffers
> - * are all text, and decoded buffers (sometimes just referred to as
> - * buffers) are binary octets.
> - *
> - * To create a custom encoder, you must, at a minimum,  overide three
> - * abstract methods in this class.
> - * <DL>
> - * <DD>bytesPerAtom which tells the encoder how many bytes to
> - * send to encodeAtom
> - * <DD>encodeAtom which encodes the bytes sent to it as text.
> - * <DD>bytesPerLine which tells the encoder the maximum number of
> - * bytes per line.
> - * </DL>
> - *
> - * Several useful encoders have already been written and are
> - * referenced in the See Also list below.
> - *
> - * @author      Chuck McManis
> - * @see         HexDumpEncoder
> - */
> -public abstract class CharacterEncoder {
> -
> -    /** Stream that understands "printing" */
> -    protected PrintStream pStream;
> -
> -    /** Return the number of bytes per atom of encoding */
> -    abstract protected int bytesPerAtom();
> -
> -    /** Return the number of bytes that can be encoded per line */
> -    abstract protected int bytesPerLine();
> -
> -    /**
> -     * Encode the prefix for the entire buffer. By default is simply
> -     * opens the PrintStream for use by the other functions.
> -     */
> -    protected void encodeBufferPrefix(OutputStream aStream) throws IOException {
> -        pStream = new PrintStream(aStream);
> -    }
> -
> -    /**
> -     * Encode the suffix for the entire buffer.
> -     */
> -    protected void encodeBufferSuffix(OutputStream aStream) throws IOException {
> -    }
> -
> -    /**
> -     * Encode the prefix that starts every output line.
> -     */
> -    protected void encodeLinePrefix(OutputStream aStream, int aLength)
> -            throws IOException {
> -    }
> -
> -    /**
> -     * Encode the suffix that ends every output line. By default
> -     * this method just prints a <newline> into the output stream.
> -     */
> -    protected void encodeLineSuffix(OutputStream aStream) throws IOException {
> -        pStream.println();
> -    }
> -
> -    /** Encode one "atom" of information into characters. */
> -    abstract protected void encodeAtom(OutputStream aStream, byte someBytes[],
> -                int anOffset, int aLength) throws IOException;
> -
> -    /**
> -     * This method works around the bizarre semantics of BufferedInputStream's
> -     * read method.
> -     */
> -    protected int readFully(InputStream in, byte buffer[])
> -            throws java.io.IOException {
> -        for (int i = 0; i < buffer.length; i++) {
> -            int q = in.read();
> -            if (q == -1)
> -                return i;
> -            buffer[i] = (byte) q;
> -        }
> -        return buffer.length;
> -    }
> -
> -    /**
> -     * Encode bytes from the input stream, and write them as text characters
> -     * to the output stream. This method will run until it exhausts the
> -     * input stream, but does not print the line suffix for a final
> -     * line that is shorter than bytesPerLine().
> -     */
> -    public void encode(InputStream inStream, OutputStream outStream)
> -            throws IOException {
> -        int j;
> -        int numBytes;
> -        byte tmpbuffer[] = new byte[bytesPerLine()];
> -
> -        encodeBufferPrefix(outStream);
> -
> -        while (true) {
> -            numBytes = readFully(inStream, tmpbuffer);
> -            if (numBytes == 0) {
> -                break;
> -            }
> -            encodeLinePrefix(outStream, numBytes);
> -            for (j = 0; j < numBytes; j += bytesPerAtom()) {
> -
> -                if ((j + bytesPerAtom()) <= numBytes) {
> -                    encodeAtom(outStream, tmpbuffer, j, bytesPerAtom());
> -                } else {
> -                    encodeAtom(outStream, tmpbuffer, j, (numBytes) - j);
> -                }
> -            }
> -            if (numBytes < bytesPerLine()) {
> -                break;
> -            } else {
> -                encodeLineSuffix(outStream);
> -            }
> -        }
> -        encodeBufferSuffix(outStream);
> -    }
> -
> -    /**
> -     * Encode the buffer in <i>aBuffer</i> and write the encoded
> -     * result to the OutputStream <i>aStream</i>.
> -     */
> -    public void encode(byte aBuffer[], OutputStream aStream)
> -            throws IOException {
> -        ByteArrayInputStream inStream = new ByteArrayInputStream(aBuffer);
> -        encode(inStream, aStream);
> -    }
> -
> -    /**
> -     * A 'streamless' version of encode that simply takes a buffer of
> -     * bytes and returns a string containing the encoded buffer.
> -     */
> -    public String encode(byte aBuffer[]) {
> -        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
> -        ByteArrayInputStream inStream = new ByteArrayInputStream(aBuffer);
> -        String retVal = null;
> -        try {
> -            encode(inStream, outStream);
> -            // explicit ascii->unicode conversion
> -            retVal = outStream.toString("8859_1");
> -        } catch (Exception IOException) {
> -            // This should never happen.
> -            throw new Error("CharacterEncoder.encode internal error");
> -        }
> -        return (retVal);
> -    }
> -
> -    /**
> -     * Return a byte array from the remaining bytes in this ByteBuffer.
> -     * <P>
> -     * The ByteBuffer's position will be advanced to ByteBuffer's limit.
> -     * <P>
> -     * To avoid an extra copy, the implementation will attempt to return the
> -     * byte array backing the ByteBuffer.  If this is not possible, a
> -     * new byte array will be created.
> -     */
> -    private byte[] getBytes(ByteBuffer bb) {
> -        /*
> -         * This should never return a BufferOverflowException, as we're
> -         * careful to allocate just the right amount.
> -         */
> -        byte[] buf = null;
> -
> -        /*
> -         * If it has a usable backing byte buffer, use it.  Use only
> -         * if the array exactly represents the current ByteBuffer.
> -         */
> -        if (bb.hasArray()) {
> -            byte[] tmp = bb.array();
> -            if ((tmp.length == bb.capacity()) &&
> -                    (tmp.length == bb.remaining())) {
> -                buf = tmp;
> -                bb.position(bb.limit());
> -            }
> -        }
> -
> -        if (buf == null) {
> -            /*
> -             * This class doesn't have a concept of encode(buf, len, off),
> -             * so if we have a partial buffer, we must reallocate
> -             * space.
> -             */
> -            buf = new byte[bb.remaining()];
> -
> -            /*
> -             * position() automatically updated
> -             */
> -            bb.get(buf);
> -        }
> -
> -        return buf;
> -    }
> -
> -    /**
> -     * Encode the <i>aBuffer</i> ByteBuffer and write the encoded
> -     * result to the OutputStream <i>aStream</i>.
> -     * <P>
> -     * The ByteBuffer's position will be advanced to ByteBuffer's limit.
> -     */
> -    public void encode(ByteBuffer aBuffer, OutputStream aStream)
> -            throws IOException {
> -        byte[] buf = getBytes(aBuffer);
> -        encode(buf, aStream);
> -    }
> -
> -    /**
> -     * A 'streamless' version of encode that simply takes a ByteBuffer
> -     * and returns a string containing the encoded buffer.
> -     * <P>
> -     * The ByteBuffer's position will be advanced to ByteBuffer's limit.
> -     */
> -    public String encode(ByteBuffer aBuffer) {
> -        byte[] buf = getBytes(aBuffer);
> -        return encode(buf);
> -    }
> -
> -    /**
> -     * Encode bytes from the input stream, and write them as text characters
> -     * to the output stream. This method will run until it exhausts the
> -     * input stream. It differs from encode in that it will add the
> -     * line at the end of a final line that is shorter than bytesPerLine().
> -     */
> -    public void encodeBuffer(InputStream inStream, OutputStream outStream)
> -            throws IOException {
> -        int j;
> -        int numBytes;
> -        byte tmpbuffer[] = new byte[bytesPerLine()];
> -
> -        encodeBufferPrefix(outStream);
> -
> -        while (true) {
> -            numBytes = readFully(inStream, tmpbuffer);
> -            if (numBytes == 0) {
> -                break;
> -            }
> -            encodeLinePrefix(outStream, numBytes);
> -            for (j = 0; j < numBytes; j += bytesPerAtom()) {
> -                if ((j + bytesPerAtom()) <= numBytes) {
> -                    encodeAtom(outStream, tmpbuffer, j, bytesPerAtom());
> -                } else {
> -                    encodeAtom(outStream, tmpbuffer, j, (numBytes) - j);
> -                }
> -            }
> -            encodeLineSuffix(outStream);
> -            if (numBytes < bytesPerLine()) {
> -                break;
> -            }
> -        }
> -        encodeBufferSuffix(outStream);
> -    }
> -
> -    /**
> -     * Encode the buffer in <i>aBuffer</i> and write the encoded
> -     * result to the OutputStream <i>aStream</i>.
> -     */
> -    public void encodeBuffer(byte aBuffer[], OutputStream aStream)
> -            throws IOException {
> -        ByteArrayInputStream inStream = new ByteArrayInputStream(aBuffer);
> -        encodeBuffer(inStream, aStream);
> -    }
> -
> -    /**
> -     * A 'streamless' version of encode that simply takes a buffer of
> -     * bytes and returns a string containing the encoded buffer.
> -     */
> -    public String encodeBuffer(byte aBuffer[]) {
> -        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
> -        ByteArrayInputStream inStream = new ByteArrayInputStream(aBuffer);
> -        try {
> -            encodeBuffer(inStream, outStream);
> -        } catch (Exception IOException) {
> -            // This should never happen.
> -            throw new Error("CharacterEncoder.encodeBuffer internal error");
> -        }
> -        return (outStream.toString());
> -    }
> -
> -    /**
> -     * Encode the <i>aBuffer</i> ByteBuffer and write the encoded
> -     * result to the OutputStream <i>aStream</i>.
> -     * <P>
> -     * The ByteBuffer's position will be advanced to ByteBuffer's limit.
> -     */
> -    public void encodeBuffer(ByteBuffer aBuffer, OutputStream aStream)
> -            throws IOException {
> -        byte[] buf = getBytes(aBuffer);
> -        encodeBuffer(buf, aStream);
> -    }
> -
> -    /**
> -     * A 'streamless' version of encode that simply takes a ByteBuffer
> -     * and returns a string containing the encoded buffer.
> -     * <P>
> -     * The ByteBuffer's position will be advanced to ByteBuffer's limit.
> -     */
> -    public String encodeBuffer(ByteBuffer aBuffer) {
> -        byte[] buf = getBytes(aBuffer);
> -        return encodeBuffer(buf);
> -    }
> -
> -}
> diff -r 78afe7c627ae netx/net/sourceforge/jnlp/tools/HexDumpEncoder.java
> --- a/netx/net/sourceforge/jnlp/tools/HexDumpEncoder.java	Wed Dec 08 12:09:00 2010 -0500
> +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
> @@ -1,120 +0,0 @@
> -/*
> - * Copyright 1995-1997 Sun Microsystems, Inc.  All Rights Reserved.
> - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
> - *
> - * This code is free software; you can redistribute it and/or modify it
> - * under the terms of the GNU General Public License version 2 only, as
> - * published by the Free Software Foundation.  Sun designates this
> - * particular file as subject to the "Classpath" exception as provided
> - * by Sun in the LICENSE file that accompanied this code.
> - *
> - * This code 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 General Public License
> - * version 2 for more details (a copy is included in the LICENSE file that
> - * accompanied this code).
> - *
> - * You should have received a copy of the GNU General Public License version
> - * 2 along with this work; if not, write to the Free Software Foundation,
> - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
> - *
> - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
> - * CA 95054 USA or visit www.sun.com if you need additional information or
> - * have any questions.
> - */
> -
> -package net.sourceforge.jnlp.tools;
> -
> -import java.io.PrintStream;
> -import java.io.OutputStream;
> -import java.io.IOException;
> -
> -/**
> - * This class encodes a buffer into the classic: "Hexadecimal Dump" format of
> - * the past. It is useful for analyzing the contents of binary buffers.
> - * The format produced is as follows:
> - * <pre>
> - * xxxx: 00 11 22 33 44 55 66 77   88 99 aa bb cc dd ee ff ................
> - * </pre>
> - * Where xxxx is the offset into the buffer in 16 byte chunks, followed
> - * by ascii coded hexadecimal bytes followed by the ASCII representation of
> - * the bytes or '.' if they are not valid bytes.
> - *
> - * @author      Chuck McManis
> - */
> -
> -public class HexDumpEncoder extends CharacterEncoder {
> -
> -    private int offset;
> -    private int thisLineLength;
> -    private int currentByte;
> -    private byte thisLine[] = new byte[16];
> -
> -    static void hexDigit(PrintStream p, byte x) {
> -        char c;
> -
> -        c = (char) ((x >> 4) & 0xf);
> -        if (c > 9)
> -            c = (char) ((c - 10) + 'A');
> -        else
> -            c = (char) (c + '0');
> -        p.write(c);
> -        c = (char) (x & 0xf);
> -        if (c > 9)
> -            c = (char) ((c - 10) + 'A');
> -        else
> -            c = (char) (c + '0');
> -        p.write(c);
> -    }
> -
> -    protected int bytesPerAtom() {
> -        return (1);
> -    }
> -
> -    protected int bytesPerLine() {
> -        return (16);
> -    }
> -
> -    protected void encodeBufferPrefix(OutputStream o) throws IOException {
> -        offset = 0;
> -        super.encodeBufferPrefix(o);
> -    }
> -
> -    protected void encodeLinePrefix(OutputStream o, int len) throws IOException {
> -        hexDigit(pStream, (byte) ((offset >>> 8) & 0xff));
> -        hexDigit(pStream, (byte) (offset & 0xff));
> -        pStream.print(": ");
> -        currentByte = 0;
> -        thisLineLength = len;
> -    }
> -
> -    protected void encodeAtom(OutputStream o, byte buf[], int off, int len) throws IOException {
> -        thisLine[currentByte] = buf[off];
> -        hexDigit(pStream, buf[off]);
> -        pStream.print(" ");
> -        currentByte++;
> -        if (currentByte == 8)
> -            pStream.print("  ");
> -    }
> -
> -    protected void encodeLineSuffix(OutputStream o) throws IOException {
> -        if (thisLineLength < 16) {
> -            for (int i = thisLineLength; i < 16; i++) {
> -                pStream.print("   ");
> -                if (i == 7)
> -                    pStream.print("  ");
> -            }
> -        }
> -        pStream.print(" ");
> -        for (int i = 0; i < thisLineLength; i++) {
> -            if ((thisLine[i] < ' ') || (thisLine[i] > 'z')) {
> -                pStream.print(".");
> -            } else {
> -                pStream.write(thisLine[i]);
> -            }
> -        }
> -        pStream.println();
> -        offset += thisLineLength;
> -    }
> -
> -}


-- 
Andrew :)

Free Java Software Engineer
Red Hat, Inc. (http://www.redhat.com)

Support Free Java!
Contribute to GNU Classpath and IcedTea
http://www.gnu.org/software/classpath
http://icedtea.classpath.org
PGP Key: 94EFD9D8 (http://subkeys.pgp.net)
Fingerprint = F8EF F1EA 401E 2E60 15FA  7927 142C 2591 94EF D9D8



More information about the distro-pkg-dev mailing list