/******************************************************************************* * Copyright 2013 SAP AG * * Licensed 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 com.sap.core.odata.core.uri.expression; import com.sap.core.odata.api.edm.EdmException; import com.sap.core.odata.api.edm.EdmStructuralType; import com.sap.core.odata.api.edm.EdmType; import com.sap.core.odata.api.exception.MessageReference; import com.sap.core.odata.api.exception.ODataBadRequestException; import com.sap.core.odata.api.uri.expression.BinaryOperator; import com.sap.core.odata.api.uri.expression.CommonExpression; import com.sap.core.odata.api.uri.expression.ExpressionParserException; import com.sap.core.odata.api.uri.expression.PropertyExpression; /** * This class is used to create exceptions of type FilterParserException. * Because this class lies inside com.sap.core.odata.core it is possible to define better/more detailed * input parameters for inserting into the exception text.<br> * The exception {@link ExpressionParserException} does not know the com.sap.core.odata.core content * * @author SAP AG */ public class FilterParserExceptionImpl extends ExpressionParserException { private static final long serialVersionUID = 77L; static public ExpressionParserException createCOMMON() { return new ExpressionParserException(ODataBadRequestException.COMMON); } static public ExpressionParserException createERROR_IN_TOKENIZER(final TokenizerException exceptionTokenizer, final String expression) { Token token = exceptionTokenizer.getToken(); MessageReference msgRef = ExpressionParserException.ERROR_IN_TOKENIZER.create(); msgRef.addContent(token.getUriLiteral()); msgRef.addContent(Integer.toString(token.getPosition() + 1)); msgRef.addContent(expression); return new ExpressionParserException(msgRef, exceptionTokenizer); } static public ExpressionParserException createINVALID_TRAILING_TOKEN_DETECTED_AFTER_PARSING(final Token token, final String expression) { MessageReference msgRef = ExpressionParserException.INVALID_TRAILING_TOKEN_DETECTED_AFTER_PARSING.create(); msgRef.addContent(token.getUriLiteral()); msgRef.addContent(Integer.toString(token.getPosition() + 1)); msgRef.addContent(expression); return new ExpressionParserException(msgRef); } static public ExpressionParserException createEXPRESSION_EXPECTED_AFTER_POS(final Token token, final String expression) { MessageReference msgRef = ExpressionParserException.EXPRESSION_EXPECTED_AFTER_POS.create(); msgRef.addContent(Integer.toString(token.getPosition() + 1)); msgRef.addContent(expression); return new ExpressionParserException(msgRef); } static public ExpressionParserException createEXPRESSION_EXPECTED_AFTER_POS(final int position, final String expression) { MessageReference msgRef = ExpressionParserException.EXPRESSION_EXPECTED_AFTER_POS.create(); msgRef.addContent(position); msgRef.addContent(expression); return new ExpressionParserException(msgRef); } static public ExpressionParserException createCOMMA_OR_END_EXPECTED_AT_POS(final Token token, final String expression) { MessageReference msgRef = ExpressionParserException.COMMA_OR_END_EXPECTED_AT_POS.create(); msgRef.addContent(Integer.toString(token.getPosition() + 1)); msgRef.addContent(expression); return new ExpressionParserException(msgRef); } static public ExpressionParserException createEXPRESSION_EXPECTED_AT_POS(final Token token, final String expression) { MessageReference msgRef = ExpressionParserException.EXPRESSION_EXPECTED_AT_POS.create(); msgRef.addContent(Integer.toString(token.getPosition() + 1)); msgRef.addContent(expression); return new ExpressionParserException(msgRef); } static public ExpressionParserException createCOMMA_OR_CLOSING_PHARENTHESIS_EXPECTED_AFTER_POS(final Token token, final String expression) { MessageReference msgRef = ExpressionParserException.COMMA_OR_CLOSING_PHARENTHESIS_EXPECTED_AFTER_POS.create(); msgRef.addContent(Integer.toString(token.getPosition() + token.getUriLiteral().length())); msgRef.addContent(expression); return new ExpressionParserException(msgRef); } public static ExpressionParserException createMETHOD_WRONG_ARG_COUNT(final MethodExpressionImpl methodExpression, final Token token, final String expression) { MessageReference msgRef = null; int minParam = methodExpression.getMethodInfo().getMinParameter(); int maxParam = methodExpression.getMethodInfo().getMaxParameter(); if ((minParam == -1) && (maxParam == -1)) { //no exception thrown in this case } else if ((minParam != -1) && (maxParam == -1)) { //Tested with TestParserExceptions.TestPMreadParameters CASE 7-1 msgRef = ExpressionParserException.METHOD_WRONG_ARG_X_OR_MORE.create(); msgRef.addContent(methodExpression.getMethod().toUriLiteral()); msgRef.addContent(token.getPosition() + 1); msgRef.addContent(expression); msgRef.addContent(minParam); } else if ((minParam == -1) && (maxParam != -1)) { //Tested with TestParserExceptions.TestPMreadParameters CASE 8-2 msgRef = ExpressionParserException.METHOD_WRONG_ARG_X_OR_LESS.create(); msgRef.addContent(methodExpression.getMethod().toUriLiteral()); msgRef.addContent(token.getPosition() + 1); msgRef.addContent(expression); msgRef.addContent(maxParam); } else if ((minParam != -1) && (maxParam != -1)) { if (minParam == maxParam) { //Tested with TestParserExceptions.TestPMreadParameters CASE 11-1 msgRef = ExpressionParserException.METHOD_WRONG_ARG_EXACT.create(); msgRef.addContent(methodExpression.getMethod().toUriLiteral()); msgRef.addContent(token.getPosition() + 1); msgRef.addContent(expression); msgRef.addContent(minParam); } else { //Tested with TestParserExceptions.TestPMreadParameters CASE 10-1 msgRef = ExpressionParserException.METHOD_WRONG_ARG_BETWEEN.create(); msgRef.addContent(methodExpression.getMethod().toUriLiteral()); msgRef.addContent(token.getPosition() + 1); msgRef.addContent(expression); msgRef.addContent(minParam); msgRef.addContent(maxParam); } } return new ExpressionParserException(msgRef); } public static ExpressionParserException createMETHOD_WRONG_INPUT_TYPE(final MethodExpressionImpl methodExpression, final Token token, final String expression) { MessageReference msgRef = null; //Tested with TestParserExceptions.TestPMreadParameters CASE 7-1 msgRef = ExpressionParserException.METHOD_WRONG_INPUT_TYPE.create(); msgRef.addContent(methodExpression.getMethod().toUriLiteral()); msgRef.addContent(token.getPosition() + 1); msgRef.addContent(expression); return new ExpressionParserException(msgRef); } public static ExpressionParserException createLEFT_SIDE_NOT_A_PROPERTY(final Token token, final String expression) throws ExpressionParserInternalError { MessageReference msgRef = ExpressionParserException.LEFT_SIDE_NOT_A_PROPERTY.create(); msgRef.addContent(token.getPosition() + 1); msgRef.addContent(expression); return new ExpressionParserException(msgRef); } public static ExpressionParserException createLEFT_SIDE_NOT_STRUCTURAL_TYPE(final EdmType parentType, final PropertyExpressionImpl property, final Token token, final String expression) throws ExpressionParserInternalError { MessageReference msgRef = ExpressionParserException.LEFT_SIDE_NOT_STRUCTURAL_TYPE.create(); try { msgRef.addContent(property.getUriLiteral()); msgRef.addContent(parentType.getNamespace() + "." + parentType.getName()); msgRef.addContent(token.getPosition() + 1); msgRef.addContent(expression); } catch (EdmException e) { throw ExpressionParserInternalError.createERROR_ACCESSING_EDM(e); } return new ExpressionParserException(msgRef); } public static ExpressionParserException createPROPERTY_NAME_NOT_FOUND_IN_TYPE(final EdmStructuralType parentType, final PropertyExpression property, final Token token, final String expression) throws ExpressionParserInternalError { MessageReference msgRef = ExpressionParserException.PROPERTY_NAME_NOT_FOUND_IN_TYPE.create(); try { msgRef.addContent(property.getUriLiteral()); msgRef.addContent(parentType.getNamespace() + "." + parentType.getName()); msgRef.addContent(token.getPosition() + 1); msgRef.addContent(expression); } catch (EdmException e) { throw ExpressionParserInternalError.createERROR_ACCESSING_EDM(e); } return new ExpressionParserException(msgRef); } public static ExpressionParserException createTOKEN_UNDETERMINATED_STRING(final int position, final String expression) { MessageReference msgRef = ExpressionParserException.TOKEN_UNDETERMINATED_STRING.create(); msgRef.addContent(position + 1); msgRef.addContent(expression); return new ExpressionParserException(msgRef); } public static ExpressionParserException createINVALID_TYPES_FOR_BINARY_OPERATOR(final BinaryOperator op, final EdmType left, final EdmType right, final Token token, final String expression) { MessageReference msgRef = ExpressionParserException.INVALID_TYPES_FOR_BINARY_OPERATOR.create(); msgRef.addContent(op.toUriLiteral()); try { msgRef.addContent(left.getNamespace() + "." + left.getName()); } catch (EdmException e) { msgRef.addContent(""); } try { msgRef.addContent(right.getNamespace() + "." + right.getName()); } catch (EdmException e) { msgRef.addContent(""); } msgRef.addContent(token.getPosition() + 1); msgRef.addContent(expression); return new ExpressionParserException(msgRef); } public static ExpressionParserException createMISSING_CLOSING_PHARENTHESIS(final int position, final String expression, final TokenizerExpectError e) { MessageReference msgRef = ExpressionParserException.MISSING_CLOSING_PHARENTHESIS.create(); msgRef.addContent(position + 1); msgRef.addContent(expression); return new ExpressionParserException(msgRef, e); } public static ExpressionParserException createINVALID_SORT_ORDER(final Token token, final String expression) { MessageReference msgRef = ExpressionParserException.INVALID_SORT_ORDER.create(); msgRef.addContent(token.getPosition() + 1); msgRef.addContent(expression); return new ExpressionParserException(msgRef); } public static ExpressionParserException createINVALID_METHOD_CALL(final CommonExpression leftNode, final Token prevToken, final String expression) { final MessageReference msgRef = ExpressionParserException.INVALID_METHOD_CALL.create(); msgRef.addContent(leftNode.getUriLiteral()); msgRef.addContent(prevToken.getPosition() + 1); msgRef.addContent(expression); return new ExpressionParserException(msgRef); } public static ExpressionParserException createTYPE_EXPECTED_AT(final EdmType expectedType, final EdmType actualType, final int position, final String expression) { final MessageReference msgRef = ExpressionParserException.TYPE_EXPECTED_AT.create(); try { msgRef.addContent(expectedType.getNamespace() + '.' + expectedType.getName()); } catch (EdmException e) { msgRef.addContent(""); } msgRef.addContent(position); msgRef.addContent(expression); if (actualType != null) { try { msgRef.addContent(actualType.getNamespace() + '.' + actualType.getName()); } catch (EdmException e) { msgRef.addContent(""); } } else { msgRef.addContent("null"); } return new ExpressionParserException(msgRef); } }