Finding Base64 implementations in Apache Software Foundation projects

NZ Grey Warbler (riroriro)
NZ Grey Warbler (riroriro)

New Zealand Grey Warbler (riroriro)

Some time ago while working in one of the many projects in the Apache Software Foundation (Apache Commons FileUpload if I remember well), I noticed that it had a Base64 implementation. What called my attention was that the project not using the Apache Commons Codec Base64 implementation.

While Apache Commons’ mission is to create components that can be re-used across ASF projects, and also by other projects not necessarily under the ASF, it is understandable that some projects prefer to keep its dependencies to a minimum. It is normally a good software engineering practice to carefully manage your dependencies.

But would Apache Commons FileUpload be the only project in the ASF with its own Base64 implementation?

What is Base64?

Simply put, Base64 is a way to encode bytes to strings. It utilises a table, to convert parts of the binary input to certain numbers. These numbers match an entry in the table used by the Base64 implementation. There are several Base64 implementations, though some are obsolete now.

The input text “this is base64!” results in “dGhpcyBpcyBiYXNlNjQh”. It can be decoded and will result in the same input text. An image can also be encoded. Or a ZIP file. This is helpful for data transfer and storage.

Apache Commons Codec is well known to provide a Bse64 implementation, and used in several projects, both Open Source and in the industry. Its implementation is based on the RFC-2045.

Java 8 contains a Base64 implementation, so that may very well replace Apache Commons Coded use in some projects, though that may take some time. The Java 8 implementation supports the RFC-2045, RFC-4648, and has also support to the URL and MIME formats.

Searching for other Base64 implementations

Using GitHub search, I looked for other Base64 implementations in the ASF projects. Here’s the result table with only the custom implementations found after going through some 15 pages in more than 100 pages with hits for “base64”.

Project & link to implementationJVMBase64 implementation
Apache ActiveMQ Artemis8RFC-3548, based on http://iharder.net/base64
Apache AsterixDB Hyracks (Incubator)8?
Apache Calcite Avatica7RFC-3548, based on http://iharder.net/base64
Apache Cayenne8RFC-2045 (based on codec)
Apache Chemistry7RFC-3548, based on http://iharder.net/base64
Apache Commons FileUpload6?
Apache Commons Net6RFC-2045 (copy of codec?)
Apache Directory Kerby7RFC-2045 (copy of codec?)
Apache Felix5 (?)RFC-2045 (copy of codec?)
Apache HBase8RFC-3548, based on http://iharder.net/base64
Apache Jackrabbit8 (?)?
Apache James6RFC-2045 via javax.mail.internet.MimeUtility
Apache James Mime4J5RFC-2045 (based on codec)
Apache OFBiz8RFC-2045
Apache Pivot6RFC-2045
Apache Qpid8? uses javax.xml.bind.DatatypeConverter#parseBase64Binary()
Apache Shiro6RFC-2045 (based on commons)
Apache Tomcat8RFC-2045 (copy of codec?)
Apache TomEE7RFC-2045
Apache TomEE (Site-NG)6RFC-2045
Apache Trafodion (Incubator)7RFC-3548, based on http://iharder.net/base64
Apache Wave (Incubator)7RFC-3548 (?), based on http://iharder.net/base64

Notes and conclusions

Future work

Happy encoding!

♥ Open Source

Categories: Blog

Tags: Java, Programming, Opensource, Apache Software Foundation