/*
 * Copyright (c) 2005, 2020 Oracle and/or its affiliates. All rights reserved.
 * Copyright (c) 2005, 2015 SAP. 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:
//     SAP - initial API and implementation

package org.eclipse.persistence.testing.tests.wdf.jpa1;

import jakarta.persistence.PersistenceException;

import org.eclipse.persistence.testing.framework.wdf.AbstractBaseTest;

public abstract class JPA1Base extends AbstractBaseTest {

    private static final String[] CLEARABLE_TABLE_NAMES = { "TMP_EMP_CREDIT", "TMP_CREDIT_ACC", "TMP_BROKER_ACC",
            "TMP_SAVE_ACC", "TMP_MARGIN_ACC", "TMP_CHECK_ACC", "TMP_EMP_PROJECT", "TMP_REVIEW_DETAILS",
            "TMP_EMP_REVIEW", "TMP_BASIC_TYPES_FA", "TMP_TEMPORAL_FA", "TMP_BASIC_TYPES_PA", "TMP_NODE", "TMP_EMBEDD_FA",
            "TMP_EMBEDD_PA", "TMP_ISLAND", "TMP_EMP_PATENT", "TMP_PROJECT_DETAILS", "TMP_VEHICLE_PROFILE", "TMP_CASC_NODE",
            "TMP_COURSE_EMP", "TMP_COURSE", "TMP_REVIEW", "TMP_PATENT", "TMP_CASC_NODE_DESC", "TMP_EMP_HOBBY", "TMP_HOBBY",
            "TMP_EMP_BICYCLE", "TMP_VEHICLE", "TMP_EMP", "TMP_PROFILE", "TMP_DEP", "TMP_OFFICE_CUBICLE", "TMP_OFFICE", "TMP_ALLRELATIONS", "TMP_CUBICLE",
            "TMP_ALLRELATIONS_LIST", "TMP_ALLRELATIONS_SET", "TMP_ALLRELATIONS_COLLECTION", "TMP_ALLRELATIONS_MAPID",
            "TMP_ALLRELATIONS_MAPFIELD", "TMP_TASK", "TMP_PROJECT", "TMP_CITY", "TMP_CITY_TMP_COP", "TMP_CITY_TMP_CRIMINAL",
            "TMP_COP", "TMP_COP_TMP_CRIMINAL", "TMP_COP_TMP_INFORMER", "TMP_CRIMINAL", "TMP_CRIMINAL_TMP_CRIMINAL",
            "TMP_INFORMER", "TMP_INFORMER_TMP_COP", "TMP_PERSON", "TMP_TIMESTAMP", "TMP_TRAILER", "TMP_ANIMAL", "TMP_PLANT",
            "TMP_ELEMENT", "TMP_CREATURE_DETAILS", "TMP_MYTHICALCREATURE", "TMP_CAVE_CREATURE", "TMP_CREATURE", "TMP_CAVE",
            "TMP_ABSTR_EMP", "TMP_FT_EMP", "TMP_PT_EMP", "TMP_CONTRACT_EMP", "TMP_READONLY",
            "BYTE_ITEM", "BYTE_ITEM_ATT", "TMP_WEAPON", "DIS_METRIC", "TMP_MATERIAL", "TMP_BPEM_TM_PRINC", "TMP_BPEM_TM_TASK",
            "TMP_COSTCENTER", "DIS_COMPONENT", "TMP_ACCOUNT", };

    public JPA1Base() {
        super("jpa1testmodel");
    }

    final protected String[] getClearableTableNames() {
        return CLEARABLE_TABLE_NAMES;
    }

    /**
     * Checks whether the given throwable is of type jakarta.persistence.PersistenceException, or otherwise if the throwable
     * contains a jakarta.persistence.PersistenceException somewhere in the cause stack.
     *
     * @param e
     *            The throwable to check
     * @return <code>true</code> if the throwable is instance of or caused by jakarta.persistence.PersistenceException
     */
    protected final boolean checkForPersistenceException(Throwable e) {
        boolean contained = false;
        while (e != null) {
            if (e instanceof PersistenceException) {
                contained = true;
                break;
            }
            e = e.getCause();
        }
        return contained;
    }

}
