/*******************************************************************************
 * Copyright (c) 2010 Oracle.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Apache License v2.0 which accompanies this distribution. 
 * The Eclipse Public License is available at
 *     http://www.eclipse.org/legal/epl-v10.html
 * and the Apache License v2.0 is available at 
 *     http://www.opensource.org/licenses/apache2.0.php.
 * You may elect to redistribute this code under either of these licenses.
 *
 * Contributors:
 *     mkeith - Gemini JPA tests 
 ******************************************************************************/
package org.eclipse.gemini.jpa.tests;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

import model.weaved.WeavedEntity;

import org.junit.*;

/**
 * Test class to test weaving of JPA provider
 * 
 * @author mkeith
 */
public class TestWeaving extends JpaTest {
    
    public static final String TEST_NAME = "TestWeaving";
    public static final String PERSISTENCE_UNIT_UNDER_TEST = "Weaved";

    public static EntityManagerFactory emf;

    /* === Test Methods === */

    @BeforeClass
    public static void classSetUp() {
        slog(TEST_NAME, "In setup");
        emf = lookupEntityManagerFactory(TEST_NAME, PERSISTENCE_UNIT_UNDER_TEST);                
        slog(TEST_NAME, "Got EMF - " + emf);        
    }

    @AfterClass
    public static void classCleanUp() throws Exception {
        if (emf != null) {
            emf.close();
            emf = null;
        }
    }

    /* === Additional test methods === */
    @Test
    public void testWovenClass() {
        log("testWovenClass");
        WeavedEntity entity = new WeavedEntity();
        boolean weaved = false;

        Class<?>[] clsArray = entity.getClass().getInterfaces();
        for ( Class<?> cls : clsArray) {
            if (cls.toString().equals("org.eclipse.persistence.internal.weaving.PersistenceWeaved")) {
                weaved = true;
                break;
            }
        }
        assert(weaved) ;
    }
    
    /* === Subclassed methods === */

    // Dues to Lazy EMF creation, and the fact that we are never actually invoking  
    // methods on the EMF, the real underlying provider EMF is never really created
    public boolean needsDsfService() { return false; }

    public EntityManagerFactory getEmf() { return emf; }

    public String getTestPersistenceUnitName() { return PERSISTENCE_UNIT_UNDER_TEST; }

    public Object newObject() {
        WeavedEntity a = new WeavedEntity();
        a.setId(100);
        return a;
    }
    
    public Object findObject() {
        EntityManager em = getEmf().createEntityManager();
        Object obj = em.find(WeavedEntity.class, 100);        
        em.close();
        return obj;
    }

    public Object queryObjects() {
        EntityManager em = getEmf().createEntityManager();
        List<?> result = em.createQuery("SELECT a FROM WeavedEntity a").getResultList();
        em.close();
        return result;
    }        
}
