| /* |
| * Copyright (c) 2006, 2020 Oracle and/or its affiliates. All rights reserved. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0, |
| * or the Eclipse Distribution License v. 1.0 which is available at |
| * http://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause |
| */ |
| |
| // Contributors: |
| // Oracle - initial API and implementation |
| // |
| package org.eclipse.persistence.jpa.jpql; |
| |
| import org.eclipse.persistence.jpa.jpql.parser.AbstractPathExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.AbstractSchemaName; |
| import org.eclipse.persistence.jpa.jpql.parser.AnonymousExpressionVisitor; |
| import org.eclipse.persistence.jpa.jpql.parser.CollectionMemberDeclaration; |
| import org.eclipse.persistence.jpa.jpql.parser.CollectionValuedPathExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.EntityTypeLiteral; |
| import org.eclipse.persistence.jpa.jpql.parser.FunctionExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.IdentificationVariable; |
| import org.eclipse.persistence.jpa.jpql.parser.InputParameter; |
| import org.eclipse.persistence.jpa.jpql.parser.Join; |
| import org.eclipse.persistence.jpa.jpql.parser.RangeVariableDeclaration; |
| import org.eclipse.persistence.jpa.jpql.parser.ResultVariable; |
| import org.eclipse.persistence.jpa.jpql.parser.StateFieldPathExpression; |
| import org.eclipse.persistence.jpa.jpql.parser.StringLiteral; |
| import org.eclipse.persistence.jpa.jpql.parser.TreatExpression; |
| |
| /** |
| * This visitor traverses an {@link org.eclipse.persistence.jpa.jpql.parser.Expression Expression} |
| * and retrieves the "literal" value. The literal to retrieve depends on the {@link LiteralType type}. |
| * The literal is basically a string value like an identification variable name, an input parameter, |
| * a path expression, an abstract schema name, etc. |
| * <p> |
| * Provisional API: This interface is part of an interim API that is still under development and |
| * expected to change significantly before reaching stability. It is available at this early stage |
| * to solicit feedback from pioneering adopters on the understanding that any code that uses this |
| * API will almost certainly be broken (repeatedly) as the API evolves. |
| * |
| * @version 2.5 |
| * @since 2.4 |
| * @author Pascal Filion |
| */ |
| public abstract class LiteralVisitor extends AnonymousExpressionVisitor { |
| |
| /** |
| * The literal value retrieved from the visited |
| * {@link org.eclipse.persistence.jpa.jpql.parser.Expression Expression}. |
| */ |
| public String literal; |
| |
| /** |
| * The {@link LiteralType} helps to determine when traversing an |
| * {@link org.eclipse.persistence.jpa.jpql.parser.Expression Expression} what to retrieve. |
| */ |
| protected LiteralType type; |
| |
| /** |
| * Creates a new <code>AbstractLiteralVisitor</code>. |
| */ |
| protected LiteralVisitor() { |
| super(); |
| } |
| |
| /** |
| * Returns the way this visitor retrieves the literal value. |
| * |
| * @return One of the possible {@link LiteralType LiteralTypes} |
| */ |
| public LiteralType getType() { |
| return type; |
| } |
| |
| /** |
| * Changes the way this visitor should retrieve the literal value. |
| * |
| * @param type One of the possible {@link LiteralType LiteralTypes} |
| */ |
| public void setType(LiteralType type) { |
| this.type = type; |
| this.literal = ExpressionTools.EMPTY_STRING; |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void visit(AbstractSchemaName expression) { |
| if (type == LiteralType.ABSTRACT_SCHEMA_NAME) { |
| literal = expression.getText(); |
| } |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void visit(CollectionMemberDeclaration expression) { |
| |
| if (type == LiteralType.PATH_EXPRESSION_ALL_PATH || |
| type == LiteralType.PATH_EXPRESSION_IDENTIFICATION_VARIABLE || |
| type == LiteralType.PATH_EXPRESSION_LAST_PATH) { |
| |
| expression.getCollectionValuedPathExpression().accept(this); |
| } |
| else if (type == LiteralType.IDENTIFICATION_VARIABLE) { |
| expression.getIdentificationVariable().accept(this); |
| } |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void visit(CollectionValuedPathExpression expression) { |
| visitAbstractPathExpression(expression); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void visit(EntityTypeLiteral expression) { |
| if (type == LiteralType.ENTITY_TYPE) { |
| literal = expression.getEntityTypeName(); |
| } |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void visit(FunctionExpression expression) { |
| if (type == LiteralType.STRING_LITERAL) { |
| literal = expression.getFunctionName(); |
| } |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void visit(IdentificationVariable expression) { |
| |
| if (type == LiteralType.RESULT_VARIABLE || |
| type == LiteralType.IDENTIFICATION_VARIABLE || |
| type == LiteralType.PATH_EXPRESSION_IDENTIFICATION_VARIABLE) { |
| |
| literal = expression.getText(); |
| } |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void visit(InputParameter expression) { |
| if (type == LiteralType.INPUT_PARAMETER) { |
| literal = expression.getParameter(); |
| } |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void visit(Join expression) { |
| if (type == LiteralType.IDENTIFICATION_VARIABLE) { |
| expression.getIdentificationVariable().accept(this); |
| } |
| else { |
| expression.getJoinAssociationPath().accept(this); |
| } |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void visit(RangeVariableDeclaration expression) { |
| if (type == LiteralType.ABSTRACT_SCHEMA_NAME) { |
| expression.getRootObject().accept(this); |
| } |
| else if (type == LiteralType.IDENTIFICATION_VARIABLE) { |
| expression.getIdentificationVariable().accept(this); |
| } |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void visit(ResultVariable expression) { |
| if (type == LiteralType.RESULT_VARIABLE) { |
| expression.getResultVariable().accept(this); |
| } |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void visit(StateFieldPathExpression expression) { |
| visitAbstractPathExpression(expression); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void visit(StringLiteral expression) { |
| if (type == LiteralType.STRING_LITERAL) { |
| literal = expression.getText(); |
| } |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void visit(TreatExpression expression) { |
| expression.getCollectionValuedPathExpression().accept(this); |
| expression.getEntityType().accept(this); |
| } |
| |
| protected void visitAbstractPathExpression(AbstractPathExpression expression) { |
| |
| if (type == LiteralType.PATH_EXPRESSION_IDENTIFICATION_VARIABLE) { |
| expression.getIdentificationVariable().accept(this); |
| } |
| else if (type == LiteralType.PATH_EXPRESSION_ALL_PATH) { |
| literal = expression.toParsedText(); |
| } |
| else if (type == LiteralType.PATH_EXPRESSION_LAST_PATH) { |
| literal = expression.getPath(expression.pathSize() - 1); |
| } |
| } |
| } |