diff --git a/src/main/java/com/ezylang/evalex/BaseException.java b/src/main/java/com/ezylang/evalex/BaseException.java index f1c90d5..18c9ea6 100644 --- a/src/main/java/com/ezylang/evalex/BaseException.java +++ b/src/main/java/com/ezylang/evalex/BaseException.java @@ -22,12 +22,13 @@ import lombok.ToString; /** Base exception class used in EvalEx. */ @EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false) @ToString +@Getter public class BaseException extends Exception { - @Getter @EqualsAndHashCode.Include private final int startPosition; - @Getter @EqualsAndHashCode.Include private final int endPosition; - @Getter @EqualsAndHashCode.Include private final String tokenString; - @Getter @EqualsAndHashCode.Include private final String message; + @EqualsAndHashCode.Include private final int startPosition; + @EqualsAndHashCode.Include private final int endPosition; + @EqualsAndHashCode.Include private final String tokenString; + @EqualsAndHashCode.Include private final String message; public BaseException(int startPosition, int endPosition, String tokenString, String message) { super(message); diff --git a/src/main/java/com/ezylang/evalex/config/ExpressionConfiguration.java b/src/main/java/com/ezylang/evalex/config/ExpressionConfiguration.java index fb3ae6b..4c5139e 100644 --- a/src/main/java/com/ezylang/evalex/config/ExpressionConfiguration.java +++ b/src/main/java/com/ezylang/evalex/config/ExpressionConfiguration.java @@ -60,6 +60,7 @@ import lombok.Getter; * */ @Builder(toBuilder = true) +@Getter public class ExpressionConfiguration { /** The standard set constants for EvalEx. */ @@ -95,7 +96,6 @@ public class ExpressionConfiguration { /** The operator dictionary holds all operators that will be allowed in an expression. */ @Builder.Default - @Getter @SuppressWarnings("unchecked") private final OperatorDictionaryIfc operatorDictionary = MapBasedOperatorDictionary.ofOperators( @@ -123,7 +123,6 @@ public class ExpressionConfiguration { /** The function dictionary holds all functions that will be allowed in an expression. */ @Builder.Default - @Getter @SuppressWarnings("unchecked") private final FunctionDictionaryIfc functionDictionary = MapBasedFunctionDictionary.ofFunctions( @@ -200,7 +199,7 @@ public class ExpressionConfiguration { Map.entry("DT_TODAY", new DateTimeTodayFunction())); /** The math context to use. */ - @Builder.Default @Getter private final MathContext mathContext = DEFAULT_MATH_CONTEXT; + @Builder.Default private final MathContext mathContext = DEFAULT_MATH_CONTEXT; /** * The data accessor is responsible for accessing variable and constant values in an expression. @@ -208,34 +207,33 @@ public class ExpressionConfiguration { * MapBasedDataAccessor} instance for each expression, providing a new storage for each * expression. */ - @Builder.Default @Getter + @Builder.Default private final Supplier dataAccessorSupplier = MapBasedDataAccessor::new; /** * Default constants will be added automatically to each expression and can be used in expression * evaluation. */ - @Builder.Default @Getter + @Builder.Default private final Map defaultConstants = getStandardConstants(); /** Support for arrays in expressions are allowed or not. */ - @Builder.Default @Getter private final boolean arraysAllowed = true; + @Builder.Default private final boolean arraysAllowed = true; /** Support for structures in expressions are allowed or not. */ - @Builder.Default @Getter private final boolean structuresAllowed = true; + @Builder.Default private final boolean structuresAllowed = true; /** Support for implicit multiplication, like in (a+b)(b+c) are allowed or not. */ - @Builder.Default @Getter private final boolean implicitMultiplicationAllowed = true; + @Builder.Default private final boolean implicitMultiplicationAllowed = true; /** Support for single quote string literals, like in 'Hello World' are allowed or not. */ - @Builder.Default @Getter private final boolean singleQuoteStringLiteralsAllowed = false; + @Builder.Default private final boolean singleQuoteStringLiteralsAllowed = false; /** * The power of operator precedence, can be set higher {@link * OperatorIfc#OPERATOR_PRECEDENCE_POWER_HIGHER} or to a custom value. */ - @Builder.Default @Getter - private final int powerOfPrecedence = OperatorIfc.OPERATOR_PRECEDENCE_POWER; + @Builder.Default private final int powerOfPrecedence = OperatorIfc.OPERATOR_PRECEDENCE_POWER; /** * If specified, only the final result of the evaluation will be rounded to the specified number @@ -243,8 +241,7 @@ public class ExpressionConfiguration { * *

The default value of _DECIMAL_PLACES_ROUNDING_UNLIMITED_ will disable rounding. */ - @Builder.Default @Getter - private final int decimalPlacesResult = DECIMAL_PLACES_ROUNDING_UNLIMITED; + @Builder.Default private final int decimalPlacesResult = DECIMAL_PLACES_ROUNDING_UNLIMITED; /** * If specified, all results from operations and functions will be rounded to the specified number @@ -255,25 +252,24 @@ public class ExpressionConfiguration { * specified number of decimal digits, using the current rounding mode. Using a value of * _DECIMAL_PLACES_ROUNDING_UNLIMITED_ will disable automatic rounding. */ - @Builder.Default @Getter - private final int decimalPlacesRounding = DECIMAL_PLACES_ROUNDING_UNLIMITED; + @Builder.Default private final int decimalPlacesRounding = DECIMAL_PLACES_ROUNDING_UNLIMITED; /** * If set to true (default), then the trailing decimal zeros in a number result will be stripped. */ - @Builder.Default @Getter private final boolean stripTrailingZeros = true; + @Builder.Default private final boolean stripTrailingZeros = true; /** * If set to true (default), then variables can be set that have the name of a constant. In that * case, the constant value will be removed and a variable value will be set. */ - @Builder.Default @Getter private final boolean allowOverwriteConstants = true; + @Builder.Default private final boolean allowOverwriteConstants = true; /** The time zone id. By default, the system default zone ID is used. */ - @Builder.Default @Getter private final ZoneId zoneId = ZoneId.systemDefault(); + @Builder.Default private final ZoneId zoneId = ZoneId.systemDefault(); /** The locale. By default, the system default locale is used. */ - @Builder.Default @Getter private final Locale locale = Locale.getDefault(); + @Builder.Default private final Locale locale = Locale.getDefault(); /** * The date-time formatters. When parsing, each format will be tried and the first matching will @@ -281,11 +277,11 @@ public class ExpressionConfiguration { * *

By default, the {@link ExpressionConfiguration#DEFAULT_DATE_TIME_FORMATTERS} are used. */ - @Builder.Default @Getter + @Builder.Default private final List dateTimeFormatters = DEFAULT_DATE_TIME_FORMATTERS; /** The converter to use when converting different data types to an {@link EvaluationValue}. */ - @Builder.Default @Getter + @Builder.Default private final EvaluationValueConverterIfc evaluationValueConverter = new DefaultEvaluationValueConverter(); diff --git a/src/main/java/com/ezylang/evalex/data/EvaluationValue.java b/src/main/java/com/ezylang/evalex/data/EvaluationValue.java index 65dbd2b..310af7f 100644 --- a/src/main/java/com/ezylang/evalex/data/EvaluationValue.java +++ b/src/main/java/com/ezylang/evalex/data/EvaluationValue.java @@ -35,7 +35,7 @@ import lombok.Value; * corresponding object type. */ @Value -public final class EvaluationValue implements Comparable { +public class EvaluationValue implements Comparable { /** A pre-built, immutable, null value. */ public static final EvaluationValue NULL_VALUE = new EvaluationValue(null, DataType.NULL); @@ -143,7 +143,7 @@ public final class EvaluationValue implements Comparable { } /** - * Returns a null value (immutable). + * Returns an immutable null value. * * @return A null value. */ @@ -178,7 +178,7 @@ public final class EvaluationValue implements Comparable { * @return the new boolean value. */ public static EvaluationValue booleanValue(Boolean value) { - return value != null && value.booleanValue() ? TRUE : FALSE; + return value != null && value ? TRUE : FALSE; } /** @@ -288,6 +288,7 @@ public final class EvaluationValue implements Comparable { public boolean isDurationValue() { return getDataType() == DataType.DURATION; } + /** * Checks if the value is of type {@link DataType#ARRAY}. * diff --git a/src/main/java/com/ezylang/evalex/data/conversion/DefaultEvaluationValueConverter.java b/src/main/java/com/ezylang/evalex/data/conversion/DefaultEvaluationValueConverter.java index 2e28d3f..0aa986d 100644 --- a/src/main/java/com/ezylang/evalex/data/conversion/DefaultEvaluationValueConverter.java +++ b/src/main/java/com/ezylang/evalex/data/conversion/DefaultEvaluationValueConverter.java @@ -55,7 +55,7 @@ import java.util.List; */ public class DefaultEvaluationValueConverter implements EvaluationValueConverterIfc { - static List converters = + static final List converters = Arrays.asList( new NumberConverter(), new StringConverter(), diff --git a/src/main/java/com/ezylang/evalex/functions/datetime/DurationNewFunction.java b/src/main/java/com/ezylang/evalex/functions/datetime/DurationNewFunction.java index 62afd70..ce6265b 100644 --- a/src/main/java/com/ezylang/evalex/functions/datetime/DurationNewFunction.java +++ b/src/main/java/com/ezylang/evalex/functions/datetime/DurationNewFunction.java @@ -15,7 +15,6 @@ */ package com.ezylang.evalex.functions.datetime; -import com.ezylang.evalex.EvaluationException; import com.ezylang.evalex.Expression; import com.ezylang.evalex.data.EvaluationValue; import com.ezylang.evalex.functions.AbstractFunction; @@ -33,8 +32,7 @@ import java.time.Duration; public class DurationNewFunction extends AbstractFunction { @Override public EvaluationValue evaluate( - Expression expression, Token functionToken, EvaluationValue... parameterValues) - throws EvaluationException { + Expression expression, Token functionToken, EvaluationValue... parameterValues) { int parameterLength = parameterValues.length; diff --git a/src/main/java/com/ezylang/evalex/parser/Tokenizer.java b/src/main/java/com/ezylang/evalex/parser/Tokenizer.java index 65e279a..aa7c2c6 100644 --- a/src/main/java/com/ezylang/evalex/parser/Tokenizer.java +++ b/src/main/java/com/ezylang/evalex/parser/Tokenizer.java @@ -409,12 +409,10 @@ public class Tokenizer { // hexadecimal number, consume "0x" tokenValue.append((char) currentChar); consumeChar(); - tokenValue.append((char) currentChar); - consumeChar(); - while (currentChar != -1 && isAtHexChar()) { + do { tokenValue.append((char) currentChar); consumeChar(); - } + } while (currentChar != -1 && isAtHexChar()); return new Token(tokenStartIndex, tokenValue.toString(), TokenType.NUMBER_LITERAL); } diff --git a/src/test/java/com/ezylang/evalex/ExpressionEvaluationMultiThreadedTest.java b/src/test/java/com/ezylang/evalex/ExpressionEvaluationMultiThreadedTest.java index d8ac9df..6f9e6f9 100644 --- a/src/test/java/com/ezylang/evalex/ExpressionEvaluationMultiThreadedTest.java +++ b/src/test/java/com/ezylang/evalex/ExpressionEvaluationMultiThreadedTest.java @@ -62,7 +62,7 @@ class ExpressionEvaluationMultiThreadedTest { } } } catch (EvaluationException | ParseException e) { - e.printStackTrace(); + System.err.printf("Exception adding decimals: %s%n", e.getMessage()); errorCount.getAndIncrement(); } }); diff --git a/src/test/java/com/ezylang/evalex/config/TestConfigurationProvider.java b/src/test/java/com/ezylang/evalex/config/TestConfigurationProvider.java index 9008949..f204ef1 100644 --- a/src/test/java/com/ezylang/evalex/config/TestConfigurationProvider.java +++ b/src/test/java/com/ezylang/evalex/config/TestConfigurationProvider.java @@ -41,12 +41,12 @@ public class TestConfigurationProvider { Map.entry("?", new PostfixQuestionOperator())) .withAdditionalFunctions(Map.entry("TEST", new DummyFunction())); - public static ExpressionConfiguration GermanConfiguration = + public static final ExpressionConfiguration GermanConfiguration = ExpressionConfiguration.builder() .zoneId(ZoneId.of("Europe/Berlin")) .locale(Locale.GERMAN) .build(); - public static ExpressionConfiguration ChicagoConfiguration = + public static final ExpressionConfiguration ChicagoConfiguration = ExpressionConfiguration.builder() .zoneId(ZoneId.of("America/Chicago")) .locale(Locale.ENGLISH) diff --git a/src/test/java/com/ezylang/evalex/data/EvaluationValueTest.java b/src/test/java/com/ezylang/evalex/data/EvaluationValueTest.java index 1dccd49..303e37f 100644 --- a/src/test/java/com/ezylang/evalex/data/EvaluationValueTest.java +++ b/src/test/java/com/ezylang/evalex/data/EvaluationValueTest.java @@ -548,24 +548,20 @@ class EvaluationValueTest { } @Test - void nestedEvaluationValue() { - try { - EvaluationValue value1 = EvaluationValue.of("Hello", defaultConfiguration()); - EvaluationValue value2 = EvaluationValue.of("World", defaultConfiguration()); + void nestedEvaluationValue() throws EvaluationException, ParseException { + EvaluationValue value1 = EvaluationValue.of("Hello", defaultConfiguration()); + EvaluationValue value2 = EvaluationValue.of("World", defaultConfiguration()); - Map structure = new HashMap<>(); - structure.put("a", value1); - structure.put("b", value2); + Map structure = new HashMap<>(); + structure.put("a", value1); + structure.put("b", value2); - EvaluationValue structureMap = EvaluationValue.of(structure, defaultConfiguration()); + EvaluationValue structureMap = EvaluationValue.of(structure, defaultConfiguration()); - Expression exp = new Expression("value.a == \"Hello\"").with("value", structureMap); + Expression exp = new Expression("value.a == \"Hello\"").with("value", structureMap); - EvaluationValue result = exp.evaluate(); - assertThat(result.getBooleanValue()).isTrue(); - } catch (EvaluationException | ParseException e) { - e.printStackTrace(); - } + EvaluationValue result = exp.evaluate(); + assertThat(result.getBooleanValue()).isTrue(); } @Test