public static CIKey of(final String key, final String lowerKey) {
        if (key == null) {
            return null;
        } else if (key.isEmpty()) {
            return EMPTY_STRING;
        } else {
            // See if we have a common key that matches exactly with the one requested.
            // Case-sensitive here because CIKey should wrap the exact case passed in.
            return NullSafe.requireNonNullElseGet(
                    CIKeys.getCommonKey(key),
                    () -> new CIKey(key, lowerKey));
        }
    }
Create a {@link CIKey} for an upper or mixed case key, e.g. "FOO", or "Foo",
when you already know the lower-case form of the key.
If key is all lower case then user {@link CIKey#ofLowerCase(String)}.
If key is a common key this method will return an existing {@link CIKey} instance
else it will create a new instance.
<p>
Is null safe. If key is null, returns null.
</p>
stroom-util-shared/src/main/java/stroom/util/shared/string/CIKey.java