Class ManifestUtil


  • public final class ManifestUtil
    extends java.lang.Object
    Unfortunately we have to write our own manifest :-( because of a stupid bug in the manifest code. It tries to handle UTF-8 but the way it does it it makes the bytes platform dependent. So the following code outputs the manifest. A Manifest consists of
     'Manifest-Version: 1.0\r\n'
     main-attributes * \r\n name-section
     main-attributes ::= attributes
     attributes ::= key ': ' value '\r\n'
     name-section ::= 'Name: ' name '\r\n' attributes
     
    Lines in the manifest should not exceed 72 bytes (! this is where the manifest screwed up as well when 16 bit unicodes were used).

    As a bonus, we can now sort the manifest!

    • Field Summary

      Fields 
      Modifier and Type Field Description
      private static byte[] EOL  
      private static int MAX_LENGTH  
      private static java.util.jar.Attributes.Name NAME  
      private static java.util.Comparator<java.util.jar.Attributes.Name> nameComparator  
      private static byte[] SEPARATOR  
    • Constructor Summary

      Constructors 
      Modifier Constructor Description
      private ManifestUtil()  
    • Method Summary

      All Methods Static Methods Concrete Methods 
      Modifier and Type Method Description
      private static java.util.Map<java.util.jar.Attributes.Name,​java.lang.String> coerce​(java.util.jar.Attributes attributes)
      Coerce Attributes to Map.
      private static java.util.stream.Stream<java.util.Map.Entry<java.util.jar.Attributes.Name,​java.lang.String>> sortedAttributes​(java.util.jar.Attributes attributes)
      Sort the attributes by key.
      private static int write​(java.io.OutputStream out, int width, byte[] bytes)
      Write the bytes but ensure that the line length does not exceed 72 characters.
      private static int write​(java.io.OutputStream out, int width, java.lang.String s)
      Convert a string to bytes with UTF-8 and then output in max 72 bytes
      static void write​(java.util.jar.Manifest manifest, java.io.OutputStream out)  
      private static void writeAttributes​(java.io.OutputStream out, java.util.stream.Stream<java.util.Map.Entry<java.util.jar.Attributes.Name,​java.lang.String>> attributes)
      Output an Attributes map.
      private static void writeEntry​(java.io.OutputStream out, java.util.jar.Attributes.Name name, java.lang.String value)
      Write out an entry, handling proper unicode and line length constraints
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • nameComparator

        private static final java.util.Comparator<java.util.jar.Attributes.Name> nameComparator
      • NAME

        private static final java.util.jar.Attributes.Name NAME
      • EOL

        private static final byte[] EOL
      • SEPARATOR

        private static final byte[] SEPARATOR
      • MAX_LENGTH

        private static final int MAX_LENGTH
    • Constructor Detail

      • ManifestUtil

        private ManifestUtil()
    • Method Detail

      • write

        public static void write​(java.util.jar.Manifest manifest,
                                 java.io.OutputStream out)
                          throws java.io.IOException
        Throws:
        java.io.IOException
      • writeEntry

        private static void writeEntry​(java.io.OutputStream out,
                                       java.util.jar.Attributes.Name name,
                                       java.lang.String value)
                                throws java.io.IOException
        Write out an entry, handling proper unicode and line length constraints
        Throws:
        java.io.IOException
      • write

        private static int write​(java.io.OutputStream out,
                                 int width,
                                 java.lang.String s)
                          throws java.io.IOException
        Convert a string to bytes with UTF-8 and then output in max 72 bytes
        Parameters:
        out - the output string
        width - the current width
        s - the string to output
        Returns:
        the new width
        Throws:
        java.io.IOException - when something fails
      • write

        private static int write​(java.io.OutputStream out,
                                 int width,
                                 byte[] bytes)
                          throws java.io.IOException
        Write the bytes but ensure that the line length does not exceed 72 characters. If it is more than 70 characters, we just put a cr/lf + space.
        Parameters:
        out - The output stream
        width - The number of characters output in a line before this method started
        bytes - the bytes to output
        Returns:
        the number of characters in the last line
        Throws:
        java.io.IOException - if something fails
      • writeAttributes

        private static void writeAttributes​(java.io.OutputStream out,
                                            java.util.stream.Stream<java.util.Map.Entry<java.util.jar.Attributes.Name,​java.lang.String>> attributes)
                                     throws java.io.IOException
        Output an Attributes map. We sort the map keys.
        Parameters:
        value - the attributes
        out - the output stream
        Throws:
        java.io.IOException - when something fails
      • sortedAttributes

        private static java.util.stream.Stream<java.util.Map.Entry<java.util.jar.Attributes.Name,​java.lang.String>> sortedAttributes​(java.util.jar.Attributes attributes)
        Sort the attributes by key.
        Parameters:
        attributes - the attributes
        Throws:
        A - sorted stream of the attributes
      • coerce

        private static java.util.Map<java.util.jar.Attributes.Name,​java.lang.String> coerce​(java.util.jar.Attributes attributes)
        Coerce Attributes to Map.
        Parameters:
        attribute - the attribute
        Returns:
        A map.