Properties files are useful for configuration, but they're still too wordy and the hierarchy or partitioning is left as an exercise to the reader. What if we were to make it more explicit?
Old:
# embedded web server -- don't turn this off # unless you know what you're doing! service.jetty.enabled = true service.jetty.host = * service.jetty.port = 80 service.jetty.minThreads = 100 service.jetty.maxThreads = 4000 service.jetty.lowThreads = 75 service.jetty.acceptQueueSize = 50 service.jetty.ssl_enabled = false service.jetty.ssl_port = 8443 service.jetty.ssl_key_password = changeme service.jetty.ssl_keystore_path = ${path.data}/keystore service.jetty.ssl_keystore_password = changeme |
New:
# embedded web server -- don't turn this off # unless you know what you're doing! [service.jetty] enabled = true host = * port = 80 minThreads = 100 maxThreads = 4000 lowThreads = 75 acceptQueueSize = 50 ssl_enabled = false ssl_port = 8443 ssl_key_password = changeme ssl_keystore_path = ${path.data}/keystore ssl_keystore_password = changeme |
The data are exactly the same, and the transform is straightforward (prepend the section name plus a '.' to each key). But you get explicit partitioning with the INI section heading. As a result the keys are much easier to read, particularly for operations people who aren't used to parsing structured text with their eyes.
I haven't seen this anywhere else, but it's so straightforward I can't believe it's new. In terms of getting it done, implementing a subclass of java.util.Properties looks... interesting. (It would be a lot easier if it were an interface.) It would be easier if you could just needed read-only access, but I do have the need to write the file back out when we programmatically add new properties. I think keeping metadata about which section a particular property belongs to should be pretty straightfroward.
The nifty little ini4j library does INI manipulations and has an extension for java.util.Properties that allows property replacement (like the ${path.data} item above), but it doesn't do the partitioned sections. Maybe building on that makes sense...