|
|
|
|
@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
|
|
|
|
|
/* |
|
|
|
|
* Copyright 2002-2009 the original author or authors. |
|
|
|
|
* Copyright 2002-2012 the original author or authors. |
|
|
|
|
* |
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
|
@ -22,34 +22,38 @@ import org.springframework.expression.TypedValue;
@@ -22,34 +22,38 @@ import org.springframework.expression.TypedValue;
|
|
|
|
|
import org.springframework.expression.spel.ExpressionState; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Implements the multiply operator. Conversions and promotions: |
|
|
|
|
* http://java.sun.com/docs/books/jls/third_edition/html/conversions.html Section 5.6.2:
|
|
|
|
|
* Implements the {@code multiply} operator. |
|
|
|
|
* |
|
|
|
|
* <p>If any of the operands is of a reference type, unboxing conversion (¤5.1.8) is performed. Then:<br> |
|
|
|
|
* <p>Conversions and promotions are handled as defined in |
|
|
|
|
* <a href="http://java.sun.com/docs/books/jls/third_edition/html/conversions.html">Section 5.6.2 |
|
|
|
|
* of the Java Language Specification</a>: |
|
|
|
|
* |
|
|
|
|
* <p>If any of the operands is of a reference type, unboxing conversion (Section 5.1.8) is performed. Then:<br> |
|
|
|
|
* If either operand is of type double, the other is converted to double.<br> |
|
|
|
|
* Otherwise, if either operand is of type float, the other is converted to float.<br> |
|
|
|
|
* Otherwise, if either operand is of type long, the other is converted to long.<br> |
|
|
|
|
* Otherwise, both operands are converted to type int. |
|
|
|
|
* |
|
|
|
|
* <p> |
|
|
|
|
* |
|
|
|
|
* @author Andy Clement |
|
|
|
|
* @author Sam Brannen |
|
|
|
|
* @since 3.0 |
|
|
|
|
*/ |
|
|
|
|
public class OpMultiply extends Operator { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public OpMultiply(int pos, SpelNodeImpl... operands) { |
|
|
|
|
super("*", pos, operands); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Implements multiply directly here for some types of operand, otherwise delegates to any registered overloader for |
|
|
|
|
* types it does not recognize. Supported types here are: |
|
|
|
|
* Implements the {@code multiply} operator directly here for certain types |
|
|
|
|
* of supported operands and otherwise delegates to any registered overloader |
|
|
|
|
* for types not supported here. |
|
|
|
|
* <p>Supported operand types: |
|
|
|
|
* <ul> |
|
|
|
|
* <li>integers |
|
|
|
|
* <li>doubles |
|
|
|
|
* <li>string and int ('abc' * 2 == 'abcabc') |
|
|
|
|
* <li>longs |
|
|
|
|
* <li>integers |
|
|
|
|
* <li>String and int ('abc' * 2 == 'abcabc') |
|
|
|
|
* </ul> |
|
|
|
|
*/ |
|
|
|
|
@Override |
|
|
|
|
@ -61,12 +65,15 @@ public class OpMultiply extends Operator {
@@ -61,12 +65,15 @@ public class OpMultiply extends Operator {
|
|
|
|
|
Number rightNumber = (Number) operandTwo; |
|
|
|
|
if (leftNumber instanceof Double || rightNumber instanceof Double) { |
|
|
|
|
return new TypedValue(leftNumber.doubleValue() * rightNumber.doubleValue()); |
|
|
|
|
} else if (leftNumber instanceof Long || rightNumber instanceof Long) { |
|
|
|
|
} |
|
|
|
|
else if (leftNumber instanceof Long || rightNumber instanceof Long) { |
|
|
|
|
return new TypedValue(leftNumber.longValue() * rightNumber.longValue()); |
|
|
|
|
} else { |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
return new TypedValue(leftNumber.intValue() * rightNumber.intValue()); |
|
|
|
|
} |
|
|
|
|
} else if (operandOne instanceof String && operandTwo instanceof Integer) { |
|
|
|
|
} |
|
|
|
|
else if (operandOne instanceof String && operandTwo instanceof Integer) { |
|
|
|
|
int repeats = (Integer) operandTwo; |
|
|
|
|
StringBuilder result = new StringBuilder(); |
|
|
|
|
for (int i = 0; i < repeats; i++) { |
|
|
|
|
|