DefaultTypedConfigGetter: Box values to avoid infinite recursion Errorprone says: DefaultTypedConfigGetter.java:176: error: [InfiniteRecursion] This method always recurses, and will cause a StackOverflowError return getLong(config, section, subsection, name, defaultValue); [1] introduced new getters with boxed types to return a null when the config is not set. The getters of unboxed types should call to the boxed version, but, as the values are not explicitely boxed, they are calling to themselves. [1] https://gerrithub.io/c/eclipse-jgit/jgit/+/1207895 Change-Id: Ied45a199c8ef905e3774a17a04d91a656aa0e42b
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/DefaultTypedConfigGetter.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/DefaultTypedConfigGetter.java index 6509398..3059f28 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/DefaultTypedConfigGetter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/DefaultTypedConfigGetter.java
@@ -32,10 +32,12 @@ */ public class DefaultTypedConfigGetter implements TypedConfigGetter { + @SuppressWarnings("boxed") @Override public boolean getBoolean(Config config, String section, String subsection, String name, boolean defaultValue) { - return getBoolean(config, section, subsection, name, defaultValue); + return neverNull(getBoolean(config, section, subsection, name, + Boolean.valueOf(defaultValue))); } @Nullable @@ -116,7 +118,8 @@ public <T extends Enum<?>> T getEnum(Config config, T[] all, String section, @Override public int getInt(Config config, String section, String subsection, String name, int defaultValue) { - return getInt(config, section, subsection, name, defaultValue); + return neverNull(getInt(config, section, subsection, name, + Integer.valueOf(defaultValue))); } @Nullable @@ -144,8 +147,8 @@ public Integer getInt(Config config, String section, String subsection, @Override public int getIntInRange(Config config, String section, String subsection, String name, int minValue, int maxValue, int defaultValue) { - return getIntInRange(config, section, subsection, name, minValue, - maxValue, defaultValue); + return neverNull(getIntInRange(config, section, subsection, name, + minValue, maxValue, Integer.valueOf(defaultValue))); } @Override @@ -161,9 +164,9 @@ public Integer getIntInRange(Config config, String section, return val; } if (subsection == null) { - throw new IllegalArgumentException(MessageFormat.format( - JGitText.get().integerValueNotInRange, section, name, - val, minValue, maxValue)); + throw new IllegalArgumentException( + MessageFormat.format(JGitText.get().integerValueNotInRange, + section, name, val, minValue, maxValue)); } throw new IllegalArgumentException(MessageFormat.format( JGitText.get().integerValueNotInRangeSubSection, section, @@ -173,7 +176,8 @@ public Integer getIntInRange(Config config, String section, @Override public long getLong(Config config, String section, String subsection, String name, long defaultValue) { - return getLong(config, section, subsection, name, defaultValue); + return neverNull(getLong(config, section, subsection, name, + Long.valueOf(defaultValue))); } @Nullable @@ -190,8 +194,9 @@ public Long getLong(Config config, String section, String subsection, // Empty return defaultValue; } catch (NumberFormatException nfe) { - throw new IllegalArgumentException(MessageFormat.format( - JGitText.get().invalidIntegerValue, section, name, str), + throw new IllegalArgumentException( + MessageFormat.format(JGitText.get().invalidIntegerValue, + section, name, str), nfe); } } @@ -199,9 +204,8 @@ public Long getLong(Config config, String section, String subsection, @Override public long getTimeUnit(Config config, String section, String subsection, String name, long defaultValue, TimeUnit wantUnit) { - Long v = getTimeUnit(config, section, subsection, name, - Long.valueOf(defaultValue), wantUnit); - return v == null ? defaultValue : v.longValue(); + return neverNull(getTimeUnit(config, section, subsection, name, + Long.valueOf(defaultValue), wantUnit)); } @Override @@ -325,4 +329,14 @@ public List<RefSpec> getRefSpecs(Config config, String section, } return result; } + + // Trick for the checkers. When we use this, one is never null, but + // they don't know. + @NonNull + private static <T> T neverNull(T one) { + if (one == null) { + throw new IllegalArgumentException(); + } + return one; + } }