You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by dd...@apache.org on 2017/08/08 17:56:55 UTC
[05/17] incubator-freemarker git commit: Renamed XxxUtil classes to
XxxUtils, as this convention is more widespread nowadays.
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/ebb39b84/freemarker-core/src/main/java/org/apache/freemarker/core/util/_LocaleUtils.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/util/_LocaleUtils.java b/freemarker-core/src/main/java/org/apache/freemarker/core/util/_LocaleUtils.java
new file mode 100644
index 0000000..249a624
--- /dev/null
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/util/_LocaleUtils.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.freemarker.core.util;
+
+import java.util.Locale;
+
+/**
+ * For internal use only; don't depend on this, there's no backward compatibility guarantee at all!
+ */
+public class _LocaleUtils {
+
+ /**
+ * Returns a locale that's one less specific, or {@code null} if there's no less specific locale.
+ */
+ public static Locale getLessSpecificLocale(Locale locale) {
+ String country = locale.getCountry();
+ if (locale.getVariant().length() != 0) {
+ String language = locale.getLanguage();
+ return country != null ? new Locale(language, country) : new Locale(language);
+ }
+ if (country.length() != 0) {
+ return new Locale(locale.getLanguage());
+ }
+ return null;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/ebb39b84/freemarker-core/src/main/java/org/apache/freemarker/core/util/_NumberUtil.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/util/_NumberUtil.java b/freemarker-core/src/main/java/org/apache/freemarker/core/util/_NumberUtil.java
deleted file mode 100644
index c300b5c..0000000
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/util/_NumberUtil.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.freemarker.core.util;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-/** Don't use this; used internally by FreeMarker, might changes without notice. */
-public class _NumberUtil {
-
- private static final BigDecimal BIG_DECIMAL_INT_MIN = BigDecimal.valueOf(Integer.MIN_VALUE);
- private static final BigDecimal BIG_DECIMAL_INT_MAX = BigDecimal.valueOf(Integer.MAX_VALUE);
- private static final BigInteger BIG_INTEGER_INT_MIN = BIG_DECIMAL_INT_MIN.toBigInteger();
- private static final BigInteger BIG_INTEGER_INT_MAX = BIG_DECIMAL_INT_MAX.toBigInteger();
- private static final BigInteger BIG_INTEGER_LONG_MIN = BigInteger.valueOf(Long.MIN_VALUE);
- private static final BigInteger BIG_INTEGER_LONG_MAX = BigInteger.valueOf(Long.MAX_VALUE);
-
- private _NumberUtil() { }
-
- public static boolean isInfinite(Number num) {
- if (num instanceof Double) {
- return ((Double) num).isInfinite();
- } else if (num instanceof Float) {
- return ((Float) num).isInfinite();
- } else if (isNonFPNumberOfSupportedClass(num)) {
- return false;
- } else {
- throw new UnsupportedNumberClassException(num.getClass());
- }
- }
-
- public static boolean isNaN(Number num) {
- if (num instanceof Double) {
- return ((Double) num).isNaN();
- } else if (num instanceof Float) {
- return ((Float) num).isNaN();
- } else if (isNonFPNumberOfSupportedClass(num)) {
- return false;
- } else {
- throw new UnsupportedNumberClassException(num.getClass());
- }
- }
-
- /**
- * @return -1 for negative, 0 for zero, 1 for positive.
- * @throws ArithmeticException if the number is NaN
- */
- public static int getSignum(Number num) throws ArithmeticException {
- if (num instanceof Integer) {
- int n = num.intValue();
- return n > 0 ? 1 : (n == 0 ? 0 : -1);
- } else if (num instanceof BigDecimal) {
- BigDecimal n = (BigDecimal) num;
- return n.signum();
- } else if (num instanceof Double) {
- double n = num.doubleValue();
- if (n > 0) return 1;
- else if (n == 0) return 0;
- else if (n < 0) return -1;
- else throw new ArithmeticException("The signum of " + n + " is not defined."); // NaN
- } else if (num instanceof Float) {
- float n = num.floatValue();
- if (n > 0) return 1;
- else if (n == 0) return 0;
- else if (n < 0) return -1;
- else throw new ArithmeticException("The signum of " + n + " is not defined."); // NaN
- } else if (num instanceof Long) {
- long n = num.longValue();
- return n > 0 ? 1 : (n == 0 ? 0 : -1);
- } else if (num instanceof Short) {
- short n = num.shortValue();
- return n > 0 ? 1 : (n == 0 ? 0 : -1);
- } else if (num instanceof Byte) {
- byte n = num.byteValue();
- return n > 0 ? 1 : (n == 0 ? 0 : -1);
- } else if (num instanceof BigInteger) {
- BigInteger n = (BigInteger) num;
- return n.signum();
- } else {
- throw new UnsupportedNumberClassException(num.getClass());
- }
- }
-
- /**
- * Tells if a {@link BigDecimal} stores a whole number. For example, it returns {@code true} for {@code 1.0000},
- * but {@code false} for {@code 1.0001}.
- */
- static public boolean isIntegerBigDecimal(BigDecimal bd) {
- // [Java 1.5] Try to utilize BigDecimal.toXxxExact methods
- return bd.scale() <= 0 // A fast check that whole numbers usually (not always) match
- || bd.setScale(0, BigDecimal.ROUND_DOWN).compareTo(bd) == 0; // This is rather slow
- // Note that `bd.signum() == 0 || bd.stripTrailingZeros().scale() <= 0` was also tried for the last
- // condition, but stripTrailingZeros was slower than setScale + compareTo.
- }
-
- private static boolean isNonFPNumberOfSupportedClass(Number num) {
- return num instanceof Integer || num instanceof BigDecimal || num instanceof Long
- || num instanceof Short || num instanceof Byte || num instanceof BigInteger;
- }
-
- /**
- * Converts a {@link Number} to {@code int} whose mathematical value is exactly the same as of the original number.
- *
- * @throws ArithmeticException
- * if the conversion to {@code int} is not possible without losing precision or overflow/underflow.
- */
- public static int toIntExact(Number num) {
- if (num instanceof Integer || num instanceof Short || num instanceof Byte) {
- return num.intValue();
- } else if (num instanceof Long) {
- final long n = num.longValue();
- final int result = (int) n;
- if (n != result) {
- throw newLossyConverionException(num, Integer.class);
- }
- return result;
- } else if (num instanceof Double || num instanceof Float) {
- final double n = num.doubleValue();
- if (n % 1 != 0 || n < Integer.MIN_VALUE || n > Integer.MAX_VALUE) {
- throw newLossyConverionException(num, Integer.class);
- }
- return (int) n;
- } else if (num instanceof BigDecimal) {
- // [Java 1.5] Use BigDecimal.toIntegerExact()
- BigDecimal n = (BigDecimal) num;
- if (!isIntegerBigDecimal(n)
- || n.compareTo(BIG_DECIMAL_INT_MAX) > 0 || n.compareTo(BIG_DECIMAL_INT_MIN) < 0) {
- throw newLossyConverionException(num, Integer.class);
- }
- return n.intValue();
- } else if (num instanceof BigInteger) {
- BigInteger n = (BigInteger) num;
- if (n.compareTo(BIG_INTEGER_INT_MAX) > 0 || n.compareTo(BIG_INTEGER_INT_MIN) < 0) {
- throw newLossyConverionException(num, Integer.class);
- }
- return n.intValue();
- } else {
- throw new UnsupportedNumberClassException(num.getClass());
- }
- }
-
- private static ArithmeticException newLossyConverionException(Number fromValue, Class/*<Number>*/ toType) {
- return new ArithmeticException(
- "Can't convert " + fromValue + " to type " + _ClassUtil.getShortClassName(toType) + " without loss.");
- }
-
- /**
- * This is needed to reverse the extreme conversions in arithmetic
- * operations so that numbers can be meaningfully used with models that
- * don't know what to do with a BigDecimal. Of course, this will make
- * impossible for these models (i.e. Jython) to receive a BigDecimal even if
- * it was originally placed as such in the data model. However, since
- * arithmetic operations aggressively erase the information regarding the
- * original number type, we have no other choice to ensure expected operation
- * in majority of cases.
- */
- public static Number optimizeNumberRepresentation(Number number) {
- if (number instanceof BigDecimal) {
- BigDecimal bd = (BigDecimal) number;
- if (bd.scale() == 0) {
- // BigDecimal -> BigInteger
- number = bd.unscaledValue();
- } else {
- double d = bd.doubleValue();
- if (d != Double.POSITIVE_INFINITY && d != Double.NEGATIVE_INFINITY) {
- // BigDecimal -> Double
- return Double.valueOf(d);
- }
- }
- }
- if (number instanceof BigInteger) {
- BigInteger bi = (BigInteger) number;
- if (bi.compareTo(BIG_INTEGER_INT_MAX) <= 0 && bi.compareTo(BIG_INTEGER_INT_MIN) >= 0) {
- // BigInteger -> Integer
- return Integer.valueOf(bi.intValue());
- }
- if (bi.compareTo(BIG_INTEGER_LONG_MAX) <= 0 && bi.compareTo(BIG_INTEGER_LONG_MIN) >= 0) {
- // BigInteger -> Long
- return Long.valueOf(bi.longValue());
- }
- }
- return number;
- }
-
- public static BigDecimal toBigDecimal(Number num) {
- try {
- return num instanceof BigDecimal ? (BigDecimal) num : new BigDecimal(num.toString());
- } catch (NumberFormatException e) {
- // The exception message is useless, so we add a new one:
- throw new NumberFormatException("Can't parse this as BigDecimal number: " + _StringUtil.jQuote(num));
- }
- }
-
- public static Number toBigDecimalOrDouble(String s) {
- if (s.length() > 2) {
- char c = s.charAt(0);
- if (c == 'I' && (s.equals("INF") || s.equals("Infinity"))) {
- return Double.valueOf(Double.POSITIVE_INFINITY);
- } else if (c == 'N' && s.equals("NaN")) {
- return Double.valueOf(Double.NaN);
- } else if (c == '-' && s.charAt(1) == 'I' && (s.equals("-INF") || s.equals("-Infinity"))) {
- return Double.valueOf(Double.NEGATIVE_INFINITY);
- }
- }
- return new BigDecimal(s);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/ebb39b84/freemarker-core/src/main/java/org/apache/freemarker/core/util/_NumberUtils.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/util/_NumberUtils.java b/freemarker-core/src/main/java/org/apache/freemarker/core/util/_NumberUtils.java
new file mode 100644
index 0000000..5cff40b
--- /dev/null
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/util/_NumberUtils.java
@@ -0,0 +1,224 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.core.util;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
+/** Don't use this; used internally by FreeMarker, might changes without notice. */
+public class _NumberUtils {
+
+ private static final BigDecimal BIG_DECIMAL_INT_MIN = BigDecimal.valueOf(Integer.MIN_VALUE);
+ private static final BigDecimal BIG_DECIMAL_INT_MAX = BigDecimal.valueOf(Integer.MAX_VALUE);
+ private static final BigInteger BIG_INTEGER_INT_MIN = BIG_DECIMAL_INT_MIN.toBigInteger();
+ private static final BigInteger BIG_INTEGER_INT_MAX = BIG_DECIMAL_INT_MAX.toBigInteger();
+ private static final BigInteger BIG_INTEGER_LONG_MIN = BigInteger.valueOf(Long.MIN_VALUE);
+ private static final BigInteger BIG_INTEGER_LONG_MAX = BigInteger.valueOf(Long.MAX_VALUE);
+
+ private _NumberUtils() { }
+
+ public static boolean isInfinite(Number num) {
+ if (num instanceof Double) {
+ return ((Double) num).isInfinite();
+ } else if (num instanceof Float) {
+ return ((Float) num).isInfinite();
+ } else if (isNonFPNumberOfSupportedClass(num)) {
+ return false;
+ } else {
+ throw new UnsupportedNumberClassException(num.getClass());
+ }
+ }
+
+ public static boolean isNaN(Number num) {
+ if (num instanceof Double) {
+ return ((Double) num).isNaN();
+ } else if (num instanceof Float) {
+ return ((Float) num).isNaN();
+ } else if (isNonFPNumberOfSupportedClass(num)) {
+ return false;
+ } else {
+ throw new UnsupportedNumberClassException(num.getClass());
+ }
+ }
+
+ /**
+ * @return -1 for negative, 0 for zero, 1 for positive.
+ * @throws ArithmeticException if the number is NaN
+ */
+ public static int getSignum(Number num) throws ArithmeticException {
+ if (num instanceof Integer) {
+ int n = num.intValue();
+ return n > 0 ? 1 : (n == 0 ? 0 : -1);
+ } else if (num instanceof BigDecimal) {
+ BigDecimal n = (BigDecimal) num;
+ return n.signum();
+ } else if (num instanceof Double) {
+ double n = num.doubleValue();
+ if (n > 0) return 1;
+ else if (n == 0) return 0;
+ else if (n < 0) return -1;
+ else throw new ArithmeticException("The signum of " + n + " is not defined."); // NaN
+ } else if (num instanceof Float) {
+ float n = num.floatValue();
+ if (n > 0) return 1;
+ else if (n == 0) return 0;
+ else if (n < 0) return -1;
+ else throw new ArithmeticException("The signum of " + n + " is not defined."); // NaN
+ } else if (num instanceof Long) {
+ long n = num.longValue();
+ return n > 0 ? 1 : (n == 0 ? 0 : -1);
+ } else if (num instanceof Short) {
+ short n = num.shortValue();
+ return n > 0 ? 1 : (n == 0 ? 0 : -1);
+ } else if (num instanceof Byte) {
+ byte n = num.byteValue();
+ return n > 0 ? 1 : (n == 0 ? 0 : -1);
+ } else if (num instanceof BigInteger) {
+ BigInteger n = (BigInteger) num;
+ return n.signum();
+ } else {
+ throw new UnsupportedNumberClassException(num.getClass());
+ }
+ }
+
+ /**
+ * Tells if a {@link BigDecimal} stores a whole number. For example, it returns {@code true} for {@code 1.0000},
+ * but {@code false} for {@code 1.0001}.
+ */
+ static public boolean isIntegerBigDecimal(BigDecimal bd) {
+ // [Java 1.5] Try to utilize BigDecimal.toXxxExact methods
+ return bd.scale() <= 0 // A fast check that whole numbers usually (not always) match
+ || bd.setScale(0, BigDecimal.ROUND_DOWN).compareTo(bd) == 0; // This is rather slow
+ // Note that `bd.signum() == 0 || bd.stripTrailingZeros().scale() <= 0` was also tried for the last
+ // condition, but stripTrailingZeros was slower than setScale + compareTo.
+ }
+
+ private static boolean isNonFPNumberOfSupportedClass(Number num) {
+ return num instanceof Integer || num instanceof BigDecimal || num instanceof Long
+ || num instanceof Short || num instanceof Byte || num instanceof BigInteger;
+ }
+
+ /**
+ * Converts a {@link Number} to {@code int} whose mathematical value is exactly the same as of the original number.
+ *
+ * @throws ArithmeticException
+ * if the conversion to {@code int} is not possible without losing precision or overflow/underflow.
+ */
+ public static int toIntExact(Number num) {
+ if (num instanceof Integer || num instanceof Short || num instanceof Byte) {
+ return num.intValue();
+ } else if (num instanceof Long) {
+ final long n = num.longValue();
+ final int result = (int) n;
+ if (n != result) {
+ throw newLossyConverionException(num, Integer.class);
+ }
+ return result;
+ } else if (num instanceof Double || num instanceof Float) {
+ final double n = num.doubleValue();
+ if (n % 1 != 0 || n < Integer.MIN_VALUE || n > Integer.MAX_VALUE) {
+ throw newLossyConverionException(num, Integer.class);
+ }
+ return (int) n;
+ } else if (num instanceof BigDecimal) {
+ // [Java 1.5] Use BigDecimal.toIntegerExact()
+ BigDecimal n = (BigDecimal) num;
+ if (!isIntegerBigDecimal(n)
+ || n.compareTo(BIG_DECIMAL_INT_MAX) > 0 || n.compareTo(BIG_DECIMAL_INT_MIN) < 0) {
+ throw newLossyConverionException(num, Integer.class);
+ }
+ return n.intValue();
+ } else if (num instanceof BigInteger) {
+ BigInteger n = (BigInteger) num;
+ if (n.compareTo(BIG_INTEGER_INT_MAX) > 0 || n.compareTo(BIG_INTEGER_INT_MIN) < 0) {
+ throw newLossyConverionException(num, Integer.class);
+ }
+ return n.intValue();
+ } else {
+ throw new UnsupportedNumberClassException(num.getClass());
+ }
+ }
+
+ private static ArithmeticException newLossyConverionException(Number fromValue, Class/*<Number>*/ toType) {
+ return new ArithmeticException(
+ "Can't convert " + fromValue + " to type " + _ClassUtils.getShortClassName(toType) + " without loss.");
+ }
+
+ /**
+ * This is needed to reverse the extreme conversions in arithmetic
+ * operations so that numbers can be meaningfully used with models that
+ * don't know what to do with a BigDecimal. Of course, this will make
+ * impossible for these models (i.e. Jython) to receive a BigDecimal even if
+ * it was originally placed as such in the data model. However, since
+ * arithmetic operations aggressively erase the information regarding the
+ * original number type, we have no other choice to ensure expected operation
+ * in majority of cases.
+ */
+ public static Number optimizeNumberRepresentation(Number number) {
+ if (number instanceof BigDecimal) {
+ BigDecimal bd = (BigDecimal) number;
+ if (bd.scale() == 0) {
+ // BigDecimal -> BigInteger
+ number = bd.unscaledValue();
+ } else {
+ double d = bd.doubleValue();
+ if (d != Double.POSITIVE_INFINITY && d != Double.NEGATIVE_INFINITY) {
+ // BigDecimal -> Double
+ return Double.valueOf(d);
+ }
+ }
+ }
+ if (number instanceof BigInteger) {
+ BigInteger bi = (BigInteger) number;
+ if (bi.compareTo(BIG_INTEGER_INT_MAX) <= 0 && bi.compareTo(BIG_INTEGER_INT_MIN) >= 0) {
+ // BigInteger -> Integer
+ return Integer.valueOf(bi.intValue());
+ }
+ if (bi.compareTo(BIG_INTEGER_LONG_MAX) <= 0 && bi.compareTo(BIG_INTEGER_LONG_MIN) >= 0) {
+ // BigInteger -> Long
+ return Long.valueOf(bi.longValue());
+ }
+ }
+ return number;
+ }
+
+ public static BigDecimal toBigDecimal(Number num) {
+ try {
+ return num instanceof BigDecimal ? (BigDecimal) num : new BigDecimal(num.toString());
+ } catch (NumberFormatException e) {
+ // The exception message is useless, so we add a new one:
+ throw new NumberFormatException("Can't parse this as BigDecimal number: " + _StringUtils.jQuote(num));
+ }
+ }
+
+ public static Number toBigDecimalOrDouble(String s) {
+ if (s.length() > 2) {
+ char c = s.charAt(0);
+ if (c == 'I' && (s.equals("INF") || s.equals("Infinity"))) {
+ return Double.valueOf(Double.POSITIVE_INFINITY);
+ } else if (c == 'N' && s.equals("NaN")) {
+ return Double.valueOf(Double.NaN);
+ } else if (c == '-' && s.charAt(1) == 'I' && (s.equals("-INF") || s.equals("-Infinity"))) {
+ return Double.valueOf(Double.NEGATIVE_INFINITY);
+ }
+ }
+ return new BigDecimal(s);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/ebb39b84/freemarker-core/src/main/java/org/apache/freemarker/core/util/_SecurityUtil.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/util/_SecurityUtil.java b/freemarker-core/src/main/java/org/apache/freemarker/core/util/_SecurityUtil.java
deleted file mode 100644
index eebed61..0000000
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/util/_SecurityUtil.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.freemarker.core.util;
-
-import java.security.AccessControlException;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- */
-public class _SecurityUtil {
-
- private static final Logger LOG = LoggerFactory.getLogger(_SecurityUtil.class);
-
- private _SecurityUtil() {
- }
-
- public static String getSystemProperty(final String key) {
- return (String) AccessController.doPrivileged(
- new PrivilegedAction()
- {
- @Override
- public Object run() {
- return System.getProperty(key);
- }
- });
- }
-
- public static String getSystemProperty(final String key, final String defValue) {
- try {
- return (String) AccessController.doPrivileged(
- new PrivilegedAction()
- {
- @Override
- public Object run() {
- return System.getProperty(key, defValue);
- }
- });
- } catch (AccessControlException e) {
- if (LOG.isWarnEnabled()) {
- LOG.warn("Insufficient permissions to read system property " +
- _StringUtil.jQuoteNoXSS(key) + ", using default value " +
- _StringUtil.jQuoteNoXSS(defValue));
- }
- return defValue;
- }
- }
-
- public static Integer getSystemProperty(final String key, final int defValue) {
- try {
- return (Integer) AccessController.doPrivileged(
- new PrivilegedAction()
- {
- @Override
- public Object run() {
- return Integer.getInteger(key, defValue);
- }
- });
- } catch (AccessControlException e) {
- if (LOG.isWarnEnabled()) {
- LOG.warn("Insufficient permissions to read system property " +
- _StringUtil.jQuote(key) + ", using default value " + defValue);
- }
- return Integer.valueOf(defValue);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/ebb39b84/freemarker-core/src/main/java/org/apache/freemarker/core/util/_SecurityUtils.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/util/_SecurityUtils.java b/freemarker-core/src/main/java/org/apache/freemarker/core/util/_SecurityUtils.java
new file mode 100644
index 0000000..81688e3
--- /dev/null
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/util/_SecurityUtils.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.core.util;
+
+import java.security.AccessControlException;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ */
+public class _SecurityUtils {
+
+ private static final Logger LOG = LoggerFactory.getLogger(_SecurityUtils.class);
+
+ private _SecurityUtils() {
+ }
+
+ public static String getSystemProperty(final String key) {
+ return (String) AccessController.doPrivileged(
+ new PrivilegedAction()
+ {
+ @Override
+ public Object run() {
+ return System.getProperty(key);
+ }
+ });
+ }
+
+ public static String getSystemProperty(final String key, final String defValue) {
+ try {
+ return (String) AccessController.doPrivileged(
+ new PrivilegedAction()
+ {
+ @Override
+ public Object run() {
+ return System.getProperty(key, defValue);
+ }
+ });
+ } catch (AccessControlException e) {
+ if (LOG.isWarnEnabled()) {
+ LOG.warn("Insufficient permissions to read system property " +
+ _StringUtils.jQuoteNoXSS(key) + ", using default value " +
+ _StringUtils.jQuoteNoXSS(defValue));
+ }
+ return defValue;
+ }
+ }
+
+ public static Integer getSystemProperty(final String key, final int defValue) {
+ try {
+ return (Integer) AccessController.doPrivileged(
+ new PrivilegedAction()
+ {
+ @Override
+ public Object run() {
+ return Integer.getInteger(key, defValue);
+ }
+ });
+ } catch (AccessControlException e) {
+ if (LOG.isWarnEnabled()) {
+ LOG.warn("Insufficient permissions to read system property " +
+ _StringUtils.jQuote(key) + ", using default value " + defValue);
+ }
+ return Integer.valueOf(defValue);
+ }
+ }
+}