private boolean parseFooter(byte[] value, HashMap<String, String> properties) {
        boolean added = false;

        StringBuilder ftr_source = new StringBuilder();
        String ftr_datetime = "";

        int read = 0;
        boolean done = false;

        while (!done && (read < value.length)) {

            // pull apart the footer, getting the news feed source (^....\x0d\x0a)
            byte val_next = value[read++];
            byte val_peek = (read < value.length) ? value[read + 1] : 0x00;  // skip the new lines

            while (((val_next < (byte) 0x30) || (val_next > (byte) 0x39)) &&
                    (val_next != 0)) {  // consume all non-numerics first
                ftr_source.append((char) (val_next & 0xff));  // convert the byte to an unsigned int
                val_next = (read < value.length) ? value[read] :
                        0x00;  // attempt to read until end of stream
                read++;
                if (read >= value.length) {
                    break;
                }  // shouldn't ever hit this, but save a NPE
            }

            while ((val_next != LT) && (val_next != CR) && (val_next != LF) &&
                    (val_next != 0)) {  // get as much timedate as possible
                // this is an american format, so arrives as mm-dd-yy HHiizzz
                ftr_datetime += (char) (val_next & 0xff);  // convert the byte to an unsigned int
                val_next = (read < value.length) ? value[read++] : 0x00;  // skip the new lines
                if (read >= value.length) {
                    break;
                }  // shouldn't ever hit this, but save a NPE
            }
            if (val_next == LT) {
                // hit the delimiter, carry on
                val_next = (read < value.length) ? value[read++] : 0x00;
            }

            if (ftr_datetime.length() > 0) {
                // we want to pass this back in a more friendly format
                String format_out = "yyyy-MM-dd'T'HH:mm:ss'Z'";
                Date dateunix = new Date();
                try {
                    // standard ap format
                    String format_in = "MM-dd-yy HHmmzzz";

                    if (FORMAT == this.FMT_IPTC_RTR) {
                        // standard reuters format
                        format_in = "HH:mm MM-dd-yy";
                    }
                    SimpleDateFormat dfi = new SimpleDateFormat(format_in, Locale.ROOT);
                    dfi.setTimeZone(TimeZone.getTimeZone("UTC"));
                    dateunix = dfi.parse(ftr_datetime);
                } catch (ParseException ep) {
                    // failed, but this will just fall through to setting the date to now
                }
                SimpleDateFormat dfo = new SimpleDateFormat(format_out, Locale.ROOT);
                dfo.setTimeZone(TimeZone.getTimeZone("UTC"));
                ftr_datetime = dfo.format(dateunix);
            }
            while ((val_next == CR) || (val_next == LF)) {
                val_next = (read < value.length) ? value[read++] : 0x00;  // skip the new lines
                if ((val_next != CR) && (val_next != LF)) {
                    --read;
                }
            }
            done = true; // don't let this run back through and start thrashing metadata
        }

        properties.put("publisher", ftr_source.toString());
        properties.put("created", ftr_datetime);
        properties.put("modified", ftr_datetime);

        added = (ftr_source.length() + ftr_datetime.length()) > 0;
        return added;
    }
scan the news messsage and store the metadata and data into a map
tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-news-module/src/main/java/org/apache/tika/parser/iptc/IptcAnpaParser.java