/*******************************************************************************
 * Copyright (c) 1998, 2015 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 v1.0 and Eclipse Distribution License v. 1.0
 * which accompanies this distribution.
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     Oracle - initial API and implementation from Oracle TopLink
 ******************************************************************************/
package org.eclipse.persistence.testing.tests.jpa.metamodel;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

import org.eclipse.persistence.sessions.server.ServerSession;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;

/**
 * These tests verify the JPA 2.0 Metamodel API.
 * The framework is as follows:
 *   - initialize persistence unit
 *   - start a transaction
 *   - persist some entities to test
 *   - verify metamodel
 *   - delete test entities created above (to reset the database)
 *   - close persistence unit
 *
 */
public class MetamodelTest extends JUnitTestCase {

    public static final String PERSISTENCE_UNIT_NAME = "metamodel1";
    /** Cache the EMF on the test suite - for performance - to save 20 sec per test case */
    public EntityManagerFactory entityManagerFactory = null;
    /** Create tables only once - for performance */
    public boolean isDatabaseSchemaCreated = false;

    public MetamodelTest() {
        super();
    }

    public MetamodelTest(String name) {
        super(name);
    }

    public void setUp() {
        setUp(false);
    }

    public void setUp(boolean overrideEMFCachingForTesting) {
        super.setUp();
        initialize();
        ServerSession session = JUnitTestCase.getServerSession(PERSISTENCE_UNIT_NAME);
        //if(!isDatabaseSchemaCreated | overrideEMFCachingForTesting) {
        if(null == entityManagerFactory || (null != entityManagerFactory && !entityManagerFactory.isOpen())) {
            new MetamodelTableCreator().replaceTables(session);
            isDatabaseSchemaCreated = true;
        }
    }


    public EntityManagerFactory initialize() {
        return initialize(false);
    }

    public void resetEntityManagerFactory() {
        try {
            if(null != entityManagerFactory && entityManagerFactory.isOpen()) {
                entityManagerFactory.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            entityManagerFactory = null;
        }

    }

    public EntityManagerFactory initialize(boolean overrideEMFCachingForTesting) {
        try {
            if(null == entityManagerFactory || overrideEMFCachingForTesting || !entityManagerFactory.isOpen()) {
                entityManagerFactory = getEntityManagerFactory(PERSISTENCE_UNIT_NAME);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return entityManagerFactory;
    }

    public void cleanup(EntityManager em) {
        // close JPA
        try {
            if(null != em && em.isOpen()) {
                em.close();
                //emf.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
