class XenonConfiguration {

    long getInteger(Class<?> subsystem, String property, long defaultValue) {
        String v = this.source.get(subsystem, property, true);

        if (v == null) {
            logUsingDefaultBecauseUnset(subsystem, property, defaultValue, true);
            return defaultValue;
        }

        try {
            return Long.parseLong(v);
        } catch (NumberFormatException e) {
        }

        if (lastToUpper(v) == 'K') {
            Long res = parseOr(stripSuffix(v, 1));
            if (res == null) {
                logUsingDefaultBecauseBadValue(subsystem, property, defaultValue, v);
                return defaultValue;
            } else {
                return 1024 * res;
            }
        }
        if (lastToUpper(v) == 'M') {
            Long res = parseOr(stripSuffix(v, 1));
            if (res == null) {
                logUsingDefaultBecauseBadValue(subsystem, property, defaultValue, v);
                return defaultValue;
            } else {
                return 1024 * 1024 * res;
            }
        }
        if (lastToUpper(v) == 'G') {
            Long res = parseOr(stripSuffix(v, 1));
            if (res == null) {
                logUsingDefaultBecauseBadValue(subsystem, property, defaultValue, v);
                return defaultValue;
            } else {
                return 1024 * 1024 * 1024 * res;
            }
        }

        logUsingDefaultBecauseBadValue(subsystem, property, defaultValue, v);
        return defaultValue;
    }

      XenonConfiguration(ConfigurationSource source);

}