diff -r 33aef54e80d0 modules/fxml/src/main/java/com/sun/javafx/fxml/expression/Expression.java --- a/modules/fxml/src/main/java/com/sun/javafx/fxml/expression/Expression.java Wed Apr 16 08:40:56 2014 +0200 +++ b/modules/fxml/src/main/java/com/sun/javafx/fxml/expression/Expression.java Wed Apr 16 14:29:06 2014 +0200 @@ -1,41 +1,38 @@ + /* * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * */ package com.sun.javafx.fxml.expression; +import com.sun.javafx.fxml.BeanAdapter; + import java.io.IOException; import java.io.PushbackReader; import java.io.Reader; import java.io.StringReader; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -import com.sun.javafx.fxml.BeanAdapter; +import java.util.*; /** * Abstract base class for expressions. Also provides static methods for @@ -106,12 +103,12 @@ } case UNARY_OPERATOR: { - String operator = (String)token.value; + Operator operator = (Operator)token.value; Expression operand = stack.pop(); - if (operator.equals(NEGATE)) { + if (operator.equals(Operator.NEGATE)) { expression = negate(operand); - } else if (operator.equals(NOT)) { + } else if (operator.equals(Operator.NOT)) { expression = not(operand); } else { throw new UnsupportedOperationException(); @@ -125,31 +122,31 @@ Expression right = stack.pop(); Expression left = stack.pop(); - if (operator.equals(ADD)) { + if (operator.equals(Operator.ADD)) { expression = add(left, right); - } else if (operator.equals(SUBTRACT)) { + } else if (operator.equals(Operator.SUBTRACT)) { expression = subtract(left, right); - } else if (operator.equals(MULTIPLY)) { + } else if (operator.equals(Operator.MULTIPLY)) { expression = multiply(left, right); - } else if (operator.equals(DIVIDE)) { + } else if (operator.equals(Operator.DIVIDE)) { expression = divide(left, right); - } else if (operator.equals(MODULO)) { + } else if (operator.equals(Operator.MODULO)) { expression = modulo(left, right); - } else if (operator.equals(GREATER_THAN)) { + } else if (operator.equals(Operator.GREATER_THAN)) { expression = greaterThan(left, right); - } else if (operator.equals(GREATER_THAN_OR_EQUAL_TO)) { + } else if (operator.equals(Operator.GREATER_THAN_OR_EQUAL_TO)) { expression = greaterThanOrEqualTo(left, right); - } else if (operator.equals(LESS_THAN)) { + } else if (operator.equals(Operator.LESS_THAN)) { expression = lessThan(left, right); - } else if (operator.equals(LESS_THAN_OR_EQUAL_TO)) { + } else if (operator.equals(Operator.LESS_THAN_OR_EQUAL_TO)) { expression = lessThanOrEqualTo(left, right); - } else if (operator.equals(EQUAL_TO)) { + } else if (operator.equals(Operator.EQUAL_TO)) { expression = equalTo(left, right); - } else if (operator.equals(NOT_EQUAL_TO)) { + } else if (operator.equals(Operator.NOT_EQUAL_TO)) { expression = notEqualTo(left, right); - } else if (operator.equals(AND)) { + } else if (operator.equals(Operator.AND)) { expression = and(left, right); - } else if (operator.equals(OR)) { + } else if (operator.equals(Operator.OR)) { expression = or(left, right); } else { throw new UnsupportedOperationException(); @@ -191,7 +188,7 @@ Token token; if (c == 'n') { - if (readKeyword(reader, NULL_KEYWORD)) { + if (readKeyword(reader, Operator.NULL_KEYWORD)) { token = new Token(TokenType.LITERAL, null); } else { token = new Token(TokenType.VARIABLE, KeyPath.parse(reader)); @@ -232,10 +229,10 @@ c = (char)Integer.parseInt(unicodeValue, 16); } else { if (!(c == '\\' - || c == '/' - || c == '\"' - || c == '\'' - || c == t)) { + || c == '/' + || c == '\"' + || c == '\'' + || c == t)) { throw new IllegalArgumentException("Unsupported escape sequence."); } } @@ -260,7 +257,7 @@ boolean integer = true; while (c != -1 && (Character.isDigit(c) || c == '.' - || c == 'e' || c == 'E')) { + || c == 'e' || c == 'E')) { numberBuilder.append((char)c); integer &= !(c == '.'); c = reader.read(); @@ -275,14 +272,14 @@ token = new Token(TokenType.LITERAL, value); } else if (c == 't') { - if (readKeyword(reader, TRUE_KEYWORD)) { + if (readKeyword(reader, Operator.TRUE_KEYWORD)) { token = new Token(TokenType.LITERAL, true); } else { token = new Token(TokenType.VARIABLE, KeyPath.parse(reader)); c = reader.read(); } } else if (c == 'f') { - if (readKeyword(reader, FALSE_KEYWORD)) { + if (readKeyword(reader, Operator.FALSE_KEYWORD)) { token = new Token(TokenType.LITERAL, false); } else { token = new Token(TokenType.VARIABLE, KeyPath.parse(reader)); @@ -298,72 +295,72 @@ token = new Token(TokenType.VARIABLE, KeyPath.parse(reader)); c = reader.read(); } else { - if (c == NEGATE.charAt(0) && unary) { - token = new Token(TokenType.UNARY_OPERATOR, NEGATE); - } else if (c == NOT.charAt(0) && unary) { - token = new Token(TokenType.UNARY_OPERATOR, NOT); - } else if (c == ADD.charAt(0)) { - token = new Token(TokenType.BINARY_OPERATOR, ADD); - } else if (c == SUBTRACT.charAt(0)) { - token = new Token(TokenType.BINARY_OPERATOR, SUBTRACT); - } else if (c == MULTIPLY.charAt(0)) { - token = new Token(TokenType.BINARY_OPERATOR, MULTIPLY); - } else if (c == DIVIDE.charAt(0)) { - token = new Token(TokenType.BINARY_OPERATOR, DIVIDE); - } else if (c == MODULO.charAt(0)) { - token = new Token(TokenType.BINARY_OPERATOR, MODULO); - } else if (c == EQUAL_TO.charAt(0)) { + if (c == Operator.NEGATE.charAt(0) && unary) { + token = new Token(TokenType.UNARY_OPERATOR, Operator.NEGATE); + } else if (c == Operator.NOT.charAt(0) && unary) { + token = new Token(TokenType.UNARY_OPERATOR, Operator.NOT); + } else if (c == Operator.ADD.charAt(0)) { + token = new Token(TokenType.BINARY_OPERATOR, Operator.ADD); + } else if (c == Operator.SUBTRACT.charAt(0)) { + token = new Token(TokenType.BINARY_OPERATOR, Operator.SUBTRACT); + } else if (c == Operator.MULTIPLY.charAt(0)) { + token = new Token(TokenType.BINARY_OPERATOR, Operator.MULTIPLY); + } else if (c == Operator.DIVIDE.charAt(0)) { + token = new Token(TokenType.BINARY_OPERATOR, Operator.DIVIDE); + } else if (c == Operator.MODULO.charAt(0)) { + token = new Token(TokenType.BINARY_OPERATOR, Operator.MODULO); + } else if (c == Operator.EQUAL_TO.charAt(0)) { c = reader.read(); - if (c == EQUAL_TO.charAt(1)) { - token = new Token(TokenType.BINARY_OPERATOR, EQUAL_TO); + if (c == Operator.EQUAL_TO.charAt(1)) { + token = new Token(TokenType.BINARY_OPERATOR, Operator.EQUAL_TO); } else { throw new IllegalArgumentException(); } - } else if (c == NOT_EQUAL_TO.charAt(0)) { + } else if (c == Operator.NOT_EQUAL_TO.charAt(0)) { c = reader.read(); - if (c == NOT_EQUAL_TO.charAt(1)) { - token = new Token(TokenType.BINARY_OPERATOR, NOT_EQUAL_TO); + if (c == Operator.NOT_EQUAL_TO.charAt(1)) { + token = new Token(TokenType.BINARY_OPERATOR, Operator.NOT_EQUAL_TO); } else { throw new IllegalArgumentException(); } - } else if (c == GREATER_THAN.charAt(0)) { + } else if (c == Operator.GREATER_THAN.charAt(0)) { c = reader.read(); - if (c == GREATER_THAN_OR_EQUAL_TO.charAt(1)) { - token = new Token(TokenType.BINARY_OPERATOR, GREATER_THAN_OR_EQUAL_TO); + if (c == Operator.GREATER_THAN_OR_EQUAL_TO.charAt(1)) { + token = new Token(TokenType.BINARY_OPERATOR, Operator.GREATER_THAN_OR_EQUAL_TO); } else { - token = new Token(TokenType.BINARY_OPERATOR, GREATER_THAN); + token = new Token(TokenType.BINARY_OPERATOR, Operator.GREATER_THAN); } - } else if (c == LESS_THAN.charAt(0)) { + } else if (c == Operator.LESS_THAN.charAt(0)) { c = reader.read(); - if (c == LESS_THAN_OR_EQUAL_TO.charAt(1)) { - token = new Token(TokenType.BINARY_OPERATOR, LESS_THAN_OR_EQUAL_TO); + if (c == Operator.LESS_THAN_OR_EQUAL_TO.charAt(1)) { + token = new Token(TokenType.BINARY_OPERATOR, Operator.LESS_THAN_OR_EQUAL_TO); } else { - token = new Token(TokenType.BINARY_OPERATOR, LESS_THAN); + token = new Token(TokenType.BINARY_OPERATOR, Operator.LESS_THAN); } - } else if (c == AND.charAt(0)) { + } else if (c == Operator.AND.charAt(0)) { c = reader.read(); - if (c == AND.charAt(0)) { - token = new Token(TokenType.BINARY_OPERATOR, AND); + if (c == Operator.AND.charAt(0)) { + token = new Token(TokenType.BINARY_OPERATOR, Operator.AND); } else { throw new IllegalArgumentException(); } - } else if (c == OR.charAt(0)) { + } else if (c == Operator.OR.charAt(0)) { c = reader.read(); - if (c == OR.charAt(0)) { - token = new Token(TokenType.BINARY_OPERATOR, OR); + if (c == Operator.OR.charAt(0)) { + token = new Token(TokenType.BINARY_OPERATOR, Operator.OR); } else { throw new IllegalArgumentException(); } } else if (c == '(') { - token = new Token(TokenType.BEGIN_GROUP, LEFT_PARENTHESIS); + token = new Token(TokenType.BEGIN_GROUP, Operator.LEFT_PARENTHESIS); } else if (c == ')') { - token = new Token(TokenType.END_GROUP, RIGHT_PARENTHESIS); + token = new Token(TokenType.END_GROUP, Operator.RIGHT_PARENTHESIS); } else { throw new IllegalArgumentException("Unexpected character in expression."); } @@ -381,12 +378,12 @@ case UNARY_OPERATOR: case BINARY_OPERATOR: { - int priority = getPriority((String)token.value); + int priority = getPriority((Operator)token.value); while (!stack.isEmpty() - && stack.peek().type != TokenType.BEGIN_GROUP - && getPriority((String)stack.peek().value) >= priority - && getPriority((String)stack.peek().value) != MAX_PRIORITY) { + && stack.peek().type != TokenType.BEGIN_GROUP + && getPriority((Operator)stack.peek().value) >= priority + && getPriority((Operator)stack.peek().value) != MAX_PRIORITY) { tokens.add(stack.pop()); } @@ -423,8 +420,8 @@ return tokens; } - private boolean readKeyword(PushbackReader reader, String keyword) throws IOException { - int n = keyword.length(); + private boolean readKeyword(PushbackReader reader, Operator keyword) throws IOException { + int n = keyword.token.length(); int i = 0; while (c != -1 && i < n) { @@ -448,30 +445,30 @@ return result; } - private int getPriority(String operator) { + private int getPriority(Operator operator) { int priority; - if (operator.equals(NEGATE) - || operator.equals(NOT)) { + if (operator.equals(Operator.NEGATE) + || operator.equals(Operator.NOT)) { priority = MAX_PRIORITY; - } else if (operator.equals(MULTIPLY) - || operator.equals(DIVIDE) - || operator.equals(MODULO)) { + } else if (operator.equals(Operator.MULTIPLY) + || operator.equals(Operator.DIVIDE) + || operator.equals(Operator.MODULO)) { priority = MAX_PRIORITY - 1; - } else if (operator.equals(ADD) - || operator.equals(SUBTRACT)) { + } else if (operator.equals(Operator.ADD) + || operator.equals(Operator.SUBTRACT)) { priority = MAX_PRIORITY - 2; - } else if (operator.equals(GREATER_THAN) - || operator.equals(GREATER_THAN_OR_EQUAL_TO) - || operator.equals(LESS_THAN) - || operator.equals(LESS_THAN_OR_EQUAL_TO)) { + } else if (operator.equals(Operator.GREATER_THAN) + || operator.equals(Operator.GREATER_THAN_OR_EQUAL_TO) + || operator.equals(Operator.LESS_THAN) + || operator.equals(Operator.LESS_THAN_OR_EQUAL_TO)) { priority = MAX_PRIORITY - 3; - } else if (operator.equals(EQUAL_TO) - || operator.equals(NOT_EQUAL_TO)) { + } else if (operator.equals(Operator.EQUAL_TO) + || operator.equals(Operator.NOT_EQUAL_TO)) { priority = MAX_PRIORITY - 4; - } else if (operator.equals(AND)) { + } else if (operator.equals(Operator.AND)) { priority = MAX_PRIORITY - 5; - } else if (operator.equals(OR)) { + } else if (operator.equals(Operator.OR)) { priority = MAX_PRIORITY - 6; } else { throw new IllegalArgumentException(); @@ -481,31 +478,66 @@ } } - private static final String NEGATE = "-"; - private static final String NOT = "!"; + private static enum Operator { + NEGATE("-"), + NOT("!"), + ADD("+"), + SUBTRACT("-"), + MULTIPLY("*"), + DIVIDE("/"), + MODULO("%"), + GREATER_THAN(">"), + GREATER_THAN_OR_EQUAL_TO(">="), + LESS_THAN("<"), + LESS_THAN_OR_EQUAL_TO("<="), + EQUAL_TO("=="), + NOT_EQUAL_TO("!="), + AND("&&"), + OR("||"), + LEFT_PARENTHESIS("("), + RIGHT_PARENTHESIS(")"), + NULL_KEYWORD("null"), + TRUE_KEYWORD("true"), + FALSE_KEYWORD("false") + ; - private static final String ADD = "+"; - private static final String SUBTRACT = "-"; - private static final String MULTIPLY = "*"; - private static final String DIVIDE = "/"; - private static final String MODULO = "%"; + private final String token; - private static final String GREATER_THAN = ">"; - private static final String GREATER_THAN_OR_EQUAL_TO = ">="; - private static final String LESS_THAN = "<"; - private static final String LESS_THAN_OR_EQUAL_TO = "<="; - private static final String EQUAL_TO = "=="; - private static final String NOT_EQUAL_TO = "!="; + Operator(String token) { + this.token = token; + } - private static final String AND = "&&"; - private static final String OR = "||"; + public char charAt(int index) { + return token.charAt(index); + } - private static final String LEFT_PARENTHESIS = "("; - private static final String RIGHT_PARENTHESIS = ")"; + } - private static final String NULL_KEYWORD = "null"; - private static final String TRUE_KEYWORD = "true"; - private static final String FALSE_KEYWORD = "false"; +// private static final String NEGATE = "-"; +// private static final String NOT = "!"; +// +// private static final String ADD = "+"; +// private static final String SUBTRACT = "-"; +// private static final String MULTIPLY = "*"; +// private static final String DIVIDE = "/"; +// private static final String MODULO = "%"; +// +// private static final String GREATER_THAN = ">"; +// private static final String GREATER_THAN_OR_EQUAL_TO = ">="; +// private static final String LESS_THAN = "<"; +// private static final String LESS_THAN_OR_EQUAL_TO = "<="; +// private static final String EQUAL_TO = "=="; +// private static final String NOT_EQUAL_TO = "!="; +// +// private static final String AND = "&&"; +// private static final String OR = "||"; +// +// private static final String LEFT_PARENTHESIS = "("; +// private static final String RIGHT_PARENTHESIS = ")"; +// +// private static final String NULL_KEYWORD = "null"; +// private static final String TRUE_KEYWORD = "true"; +// private static final String FALSE_KEYWORD = "false"; /** * Evaluates the expression. @@ -806,7 +838,7 @@ return new BinaryExpression(left, right) { @Override public String getOperator() { - return ADD; + return Operator.ADD.token; } @Override @@ -883,7 +915,7 @@ return new BinaryExpression(left, right) { @Override public String getOperator() { - return SUBTRACT; + return Operator.SUBTRACT.token; } @Override @@ -953,7 +985,7 @@ return new BinaryExpression(left, right) { @Override public String getOperator() { - return MULTIPLY; + return Operator.MULTIPLY.token; } @Override @@ -1023,7 +1055,7 @@ return new BinaryExpression(left, right) { @Override public String getOperator() { - return DIVIDE; + return Operator.DIVIDE.token; } @Override @@ -1093,7 +1125,7 @@ return new BinaryExpression(left, right) { @Override public String getOperator() { - return MODULO; + return Operator.MODULO.token; } @Override @@ -1163,7 +1195,7 @@ return new BinaryExpression(left, right) { @Override public String getOperator() { - return EQUAL_TO; + return Operator.EQUAL_TO.token; } @Override @@ -1214,7 +1246,7 @@ return new BinaryExpression(left, right) { @Override public String getOperator() { - return NOT_EQUAL_TO; + return Operator.NOT_EQUAL_TO.token; } @Override @@ -1265,7 +1297,7 @@ return new BinaryExpression(left, right) { @Override public String getOperator() { - return GREATER_THAN; + return Operator.GREATER_THAN.token; } @Override @@ -1316,7 +1348,7 @@ return new BinaryExpression(left, right) { @Override public String getOperator() { - return GREATER_THAN_OR_EQUAL_TO; + return Operator.GREATER_THAN_OR_EQUAL_TO.token; } @Override @@ -1367,7 +1399,7 @@ return new BinaryExpression(left, right) { @Override public String getOperator() { - return LESS_THAN; + return Operator.LESS_THAN.token; } @Override @@ -1418,7 +1450,7 @@ return new BinaryExpression(left, right) { @Override public String getOperator() { - return LESS_THAN_OR_EQUAL_TO; + return Operator.LESS_THAN_OR_EQUAL_TO.token; } @Override @@ -1469,7 +1501,7 @@ return new BinaryExpression(left, right) { @Override public String getOperator() { - return AND; + return Operator.AND.token; } @Override @@ -1519,7 +1551,7 @@ return new BinaryExpression(left, right) { @Override public String getOperator() { - return OR; + return Operator.OR.token; } @Override @@ -1568,7 +1600,7 @@ return new UnaryExpression(operand) { @Override public String getOperator() { - return "-"; + return Operator.NEGATE.token; } @Override @@ -1615,7 +1647,7 @@ return new UnaryExpression(operand) { @Override public String getOperator() { - return "!"; + return Operator.NOT.token; } @Override