/*
 * Copyright (c) 1998, 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 from Oracle TopLink
package org.eclipse.persistence.exceptions;

import java.util.Collection;
import java.util.Iterator;
import java.util.Vector;

import org.eclipse.persistence.exceptions.i18n.ExceptionMessageGenerator;

/**
 * <P><B>Purpose</B>: EJBQL parsing and resolution problems will raise this exception
 */
public class JPQLException extends EclipseLinkException {
    public static final int recognitionException = 8001;
    public static final int generalParsingException = 8002;
    public static final int classNotFoundException = 8003;
    public static final int aliasResolutionException = 8004;
    public static final int resolutionClassNotFoundException = 8005;
    public static final int missingDescriptorException = 8006;
    public static final int missingMappingException = 8007;
    public static final int invalidContextKeyException = 8008;
    public static final int expressionNotSupported = 8009;
    public static final int generalParsingException2 = 8010;
    public static final int invalidCollectionMemberDecl = 8011;
    public static final int notYetImplemented = 8012;
    public static final int constructorClassNotFound = 8013;
    public static final int invalidSizeArgument = 8014;
    public static final int invalidEnumLiteral = 8015;
    public static final int invalidSelectForGroupByQuery = 8016;
    public static final int invalidHavingExpression = 8017;
    public static final int invalidMultipleUseOfSameParameter = 8018;
    public static final int multipleVariableDeclaration = 8019;
    public static final int invalidFunctionArgument = 8020;
    public static final int expectedOrderableOrderByItem = 8021;
    public static final int invalidExpressionArgument = 8022;
    public static final int syntaxError = 8023;
    public static final int syntaxErrorAt = 8024;
    public static final int unexpectedToken = 8025;
    public static final int unexpectedChar = 8026;
    public static final int expectedCharFound = 8027;
    public static final int unexpectedEOF = 8028;
    public static final int invalidNavigation = 8029;
    public static final int unknownAttribute = 8030;
    public static final int unsupportJoinArgument = 8031;
    public static final int invalidSetClauseTarget = 8032;
    public static final int invalidSetClauseNavigation = 8033;
    /**
     * @see JPQLException#entityTypeNotFound(String, String)
     */
    public static final int entityTypeNotFound = 8034;
    public static final int invalidEnumEqualExpression = 8035;
    public static final int invalidCollectionNavigation = 8036;
    public static final int entityTypeNotFound2 = 8037;
    public static final int resolutionClassNotFoundException2 = 8038;
    public static final int variableCannotHaveMapKey = 8039;
    public static final int nonExistantOrderByAlias = 8040;
    public static final int indexOnlyAllowedOnVariable = 8041;

    public Collection internalExceptions = null;

    /**
    * INTERNAL
    * Only TopLink can throw and create these excpetions
    */
    protected JPQLException() {
        super();
    }

    /**
    * INTERNAL
    * Only TopLink can throw and create these excpetions
    */
    public JPQLException(String theMessage) {
        super(theMessage);
    }

    /**
    * INTERNAL
    * Only TopLink can throw and create these excpetions
    */
    public JPQLException(String message, Exception internalException) {
        super(message, internalException);
    }

    /**
    * INTERNAL
    * Only TopLink can throw and create these excpetions
    */
    protected JPQLException(String message, Exception internalException, int theErrorCode) {
        this(message, internalException);
        this.setErrorCode(theErrorCode);
    }

    /**
     * INTERNAL
     * Create an exception to wrap the recognition exception thrown
     */
    public static JPQLException recognitionException(String theEjbql, String theMessage) {
        Object[] args = { theEjbql, theMessage };

        String message = ExceptionMessageGenerator.buildMessage(JPQLException.class, recognitionException, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(recognitionException);
        return exception;
    }

    /**
     * INTERNAL
     * Create an exception to wrap a general parsing exception
     */
    public static JPQLException generalParsingException(String theEjbql, Exception theException) {
        Object[] args = { theEjbql, theException.getMessage() };

        String message = ExceptionMessageGenerator.buildMessage(JPQLException.class, generalParsingException, args);
        JPQLException exception = new JPQLException(message, theException, generalParsingException);
        exception.setErrorCode(generalParsingException);
        return exception;
    }

    /**
     * INTERNAL
     * Create an exception to wrap a general parsing exception
     */
    public static JPQLException generalParsingException(String theEjbql) {
        Object[] args = { theEjbql };

        String message = ExceptionMessageGenerator.buildMessage(JPQLException.class, generalParsingException2, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(generalParsingException);
        return exception;
    }

    public static JPQLException classNotFoundException(String theClassName, String theMessage, Exception theException) {
        Object[] args = { theClassName, theMessage };

        String message = ExceptionMessageGenerator.buildMessage(JPQLException.class, classNotFoundException, args);
        JPQLException exception = new JPQLException(message, theException, classNotFoundException);
        exception.setErrorCode(classNotFoundException);
        return exception;
    }

    public static JPQLException resolutionClassNotFoundException(String query, String theClassName) {
        Object[] args = { query, theClassName };

        String message = ExceptionMessageGenerator.buildMessage(JPQLException.class, resolutionClassNotFoundException, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(resolutionClassNotFoundException);
        return exception;
    }

    public static JPQLException resolutionClassNotFoundException2(String query, int line, int column, String theClassName) {
        Object[] args = { query, line, column, theClassName };

        String message = ExceptionMessageGenerator.buildMessage(JPQLException.class, resolutionClassNotFoundException2, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(resolutionClassNotFoundException2);
        return exception;
    }

    public static JPQLException missingDescriptorException(String query, String theClassName) {
        Object[] args = { query, theClassName };

        String message = ExceptionMessageGenerator.buildMessage(JPQLException.class, missingDescriptorException, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(missingDescriptorException);

        return exception;
    }

    public static JPQLException missingMappingException(String query, String theAttributeName) {
        Object[] args = { query, theAttributeName };

        String message = ExceptionMessageGenerator.buildMessage(JPQLException.class, missingMappingException, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(missingMappingException);

        return exception;
    }

    public static JPQLException aliasResolutionException(String query, int line, int column, String theAlias) {
        Object[] args = { query, line, column, theAlias };

        String message = ExceptionMessageGenerator.buildMessage(JPQLException.class, aliasResolutionException, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(aliasResolutionException);
        return exception;
    }

    public static JPQLException invalidContextKeyException(String query, String theKey) {
        Object[] args = { query, theKey };

        String message = ExceptionMessageGenerator.buildMessage(JPQLException.class, invalidContextKeyException, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(invalidContextKeyException);
        return exception;
    }

    public static JPQLException expressionNotSupported(String query, String unsupportedExpression) {
        Object[] args = { query, unsupportedExpression };

        String message = ExceptionMessageGenerator.buildMessage(JPQLException.class, expressionNotSupported, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(expressionNotSupported);
        return exception;
    }

    public static JPQLException invalidCollectionMemberDecl(String query, int line, int column, String attributeName) {
        Object[] args = { query, line, column, attributeName };

        String message = ExceptionMessageGenerator.buildMessage(
                JPQLException.class, invalidCollectionMemberDecl, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(invalidCollectionMemberDecl);
        return exception;
    }

    public static JPQLException notYetImplemented(String query, String detail) {
        Object[] args = { query, detail };

        String message = ExceptionMessageGenerator.buildMessage(
                JPQLException.class, notYetImplemented, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(notYetImplemented);
        return exception;
    }

    public static JPQLException constructorClassNotFound(String query, int line, int column, String className) {
        Object[] args = { query, line, column, className };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, constructorClassNotFound, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(constructorClassNotFound);
        return exception;
    }

    public static JPQLException invalidSizeArgument(String query, int line, int column, String attributeName) {
        Object[] args = { query, line, column, attributeName };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, invalidSizeArgument, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(invalidSizeArgument);
        return exception;
    }

    public static JPQLException invalidEnumLiteral(String query, int line, int column, String enumType, String literal) {
        Object[] args = { query, line, column, enumType, literal };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, invalidEnumLiteral, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(invalidEnumLiteral);
        return exception;
    }

    public static JPQLException invalidSelectForGroupByQuery(String query, int line, int column, String select, String groupBy) {
        Object[] args = { query, line, column, select, groupBy };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, invalidSelectForGroupByQuery, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(invalidSelectForGroupByQuery);
        return exception;
    }

    public static JPQLException invalidHavingExpression(String query, int line, int column, String having, String groupBy) {
        Object[] args = { query, line, column, having, groupBy };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, invalidHavingExpression, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(invalidHavingExpression);
        return exception;
    }

    public static JPQLException invalidMultipleUseOfSameParameter(
        String query, int line, int column, String parameter, String oldType, String newType) {
        Object[] args = { query, line, column , parameter, oldType, newType };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, invalidMultipleUseOfSameParameter, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(invalidMultipleUseOfSameParameter);
        return exception;
    }

    public static JPQLException multipleVariableDeclaration(
        String query, int line, int column, String variable, String oldDecl) {
        Object[] args = { query, line, column, variable, oldDecl };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, multipleVariableDeclaration, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(multipleVariableDeclaration);
        return exception;
    }

    public static JPQLException invalidFunctionArgument(String query, int line, int column, String functionName, String attributeName, String type) {
        Object[] args = { query, line, column, functionName, attributeName, type };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, invalidFunctionArgument, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(invalidFunctionArgument);
        return exception;
    }

    public static JPQLException invalidExpressionArgument(String query, int line, int column, String expression, String attributeName, String type) {
        Object[] args = { query, line, column, expression, attributeName, type };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, invalidExpressionArgument, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(invalidExpressionArgument);
        return exception;
    }

    public static JPQLException unsupportJoinArgument(String query, int line, int column, String join, String type) {
        Object[] args = { query, line, column, join, type };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, unsupportJoinArgument, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(unsupportJoinArgument);
        return exception;
    }

    public static JPQLException expectedOrderableOrderByItem(String query, int line, int column, String item, String type) {
        Object[] args = { query, line, column, item, type };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, expectedOrderableOrderByItem, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(expectedOrderableOrderByItem);
        return exception;
    }

    public static JPQLException syntaxError(String query, Exception ex) {
        Object[] args = { query };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, syntaxError, args);
        JPQLException exception = new JPQLException(message, ex);
        exception.setErrorCode(syntaxError);
        return exception;
    }

    public static JPQLException syntaxErrorAt(String query, int line, int column, String token, Exception ex) {
        Object[] args = { query, line, column, token };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, syntaxErrorAt, args);
        JPQLException exception = new JPQLException(message, ex);
        exception.setErrorCode(syntaxErrorAt);
        return exception;
    }

    public static JPQLException unexpectedToken(String query, int line, int column, String token, Exception ex) {
        Object[] args = { query, line, column, token };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, unexpectedToken, args);
        JPQLException exception = new JPQLException(message, ex);
        exception.setErrorCode(unexpectedToken);
        return exception;
    }

    public static JPQLException unexpectedChar(String query, int line, int column, String unexpected, Exception ex) {
        Object[] args = { query, line, column, unexpected };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, unexpectedChar, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(unexpectedChar);
        return exception;
    }

    public static JPQLException expectedCharFound(String query, int line, int column, String expected, String found, Exception ex) {
        Object[] args = { query, line, column, expected, found };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, expectedCharFound, args);
        JPQLException exception = new JPQLException(message, ex);
        exception.setErrorCode(expectedCharFound);
        return exception;
    }

    public static JPQLException unexpectedEOF(String query, int line, int column, Exception ex) {
        Object[] args = { query, line, column};

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, unexpectedEOF, args);
        JPQLException exception = new JPQLException(message, ex);
        exception.setErrorCode(unexpectedEOF);
        return exception;
    }

    public static JPQLException invalidNavigation(
        String query, int line, int column, String expr, String lhs, String type) {
        Object[] args = { query, line, column, expr, lhs, type };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, invalidNavigation, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(invalidNavigation);
        return exception;
    }

    public static JPQLException invalidCollectionNavigation(
        String query, int line, int column, String expr, String attribute) {
        Object[] args = { query, line, column, expr, attribute };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, invalidCollectionNavigation, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(invalidCollectionNavigation);
        return exception;
    }

    public static JPQLException invalidSetClauseTarget(
        String query, int line, int column, String expr, String attribute) {
        Object[] args = { query, line, column, attribute, expr };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, invalidSetClauseTarget, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(invalidSetClauseTarget);
        return exception;
    }

    public static JPQLException invalidSetClauseNavigation(
        String query, int line, int column, String expr, String relationship) {
        Object[] args = { query, line, column, expr, relationship };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, invalidSetClauseNavigation, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(invalidSetClauseNavigation);
        return exception;
    }

    public static JPQLException unknownAttribute(
        String query, int line, int column, String attribute, String type) {
        Object[] args = { query, line, column, attribute, type };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, unknownAttribute, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(unknownAttribute);
        return exception;
    }

    public static JPQLException invalidEnumEqualExpression(String query, int line, int column, String enumType, String type) {
        Object[] args = { query, line, column, enumType, type };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, invalidEnumEqualExpression, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(invalidEnumEqualExpression);
        return exception;
    }

    /**
     * <b>{@link JPQLException} Entity Type Not Found</b>
     * <p>
     * Indicates that a type specified in a JPQL query string cannot be found in
     * the current persistence unit. Ensure that the entity name is properly
     * spelled and matches the name of an entity in the persistence unit being
     * used.
     */
    public static JPQLException entityTypeNotFound(String query, String type) {
        Object[] args = { query, type };
        String message = ExceptionMessageGenerator.buildMessage(JPQLException.class, entityTypeNotFound, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(entityTypeNotFound);
        return exception;
    }

    public static JPQLException entityTypeNotFound2(String query, int line, int column, String type) {
        Object[] args = { query, line, column, type };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, entityTypeNotFound2, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(entityTypeNotFound2);
        return exception;
    }

    public static JPQLException variableCannotHaveMapKey(String query, int line, int column, String name) {
        Object[] args = { query, line, column, name };

        String message = ExceptionMessageGenerator.buildMessage(JPQLException.class, variableCannotHaveMapKey, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(variableCannotHaveMapKey);
        return exception;
    }

    public static JPQLException nonExistantOrderByAlias(String query, int line, int column, String alias) {
        Object[] args = { query, line, column, alias };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, nonExistantOrderByAlias, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(nonExistantOrderByAlias);
        return exception;
    }

    public static JPQLException indexOnlyAllowedOnVariable(String query, int line, int column, String node) {
        Object[] args = { query, line, column, node };

        String message = ExceptionMessageGenerator.buildMessage(
            JPQLException.class, indexOnlyAllowedOnVariable, args);
        JPQLException exception = new JPQLException(message);
        exception.setErrorCode(indexOnlyAllowedOnVariable);
        return exception;
    }

    /**
     * INTERNAL
     * Add an internal Exception to the collection of
     * internal Exceptions
     */
    public Object addInternalException(Object theException) {
        getInternalExceptions().add(theException);
        return theException;
    }

    /**
     * INTERNAL
     * Does this exception have any internal errors?
     */
    public boolean hasInternalExceptions() {
        return !getInternalExceptions().isEmpty();
    }

    /**
     * INTERNAL
     * Return the collection of internal Exceptions.
     * Intialize if there are no exceptions
     */
    public Collection getInternalExceptions() {
        if (internalExceptions == null) {
            setInternalExceptions(new Vector());
        }
        return internalExceptions;
    }

    /**
     * INTERNAL
     * Store the exceptions related to this exception
     */
    public void setInternalExceptions(Collection theExceptions) {
        internalExceptions = theExceptions;
    }

    /**
     * PUBLIC
     * Print the stack trace for each error generated by the
     * parser. This method is intended to assist in debugging
     * problems in EJBQL
     */
    public void printFullStackTrace() {
        if (hasInternalExceptions()) {
            Iterator exceptions = getInternalExceptions().iterator();
            while (exceptions.hasNext()) {
                Throwable error = (Throwable)exceptions.next();
                error.printStackTrace();
            }
        }
    }
}
