/*******************************************************************************
 * Copyright (c) 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.
 ******************************************************************************/
package org.eclipse.persistence.testing.models.jpa22.sessionbean;

import org.eclipse.persistence.jpa.JpaEntityManagerFactory;
import org.eclipse.persistence.testing.models.jpa22.attributeconverter.AttributeConverter;
import org.eclipse.persistence.testing.models.jpa22.attributeconverter.AttributeConverterHolder;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;

@Stateless
public class AttributeConverterTestBean implements InjectionTest {

    @PersistenceUnit(name="jpa22-sessionbean")
    private EntityManagerFactory emf;

    public boolean triggerInjection(){
        cleanup();
        EntityManager em = emf.createEntityManager();
        AttributeConverterHolder holder = new AttributeConverterHolder();
        em.persist(holder);
        em.flush();
        em.clear();
        em.find(AttributeConverterHolder.class, holder.getId());
        return AttributeConverter.INJECTED_RETURN_VALUE && AttributeConverter.CONVERT_TO_DB_CALLS == 1 && AttributeConverter.CONVERT_TO_ENTITY_CALLS == 1;
    }

    public boolean triggerPreDestroy(){
        cleanup();
        emf.unwrap(JpaEntityManagerFactory.class).unwrap().close();
        return AttributeConverter.PRE_DESTROY_CALLS == 1;
    }

    private void cleanup() {
        AttributeConverter.INJECTED_RETURN_VALUE = false;
        AttributeConverter.CONVERT_TO_DB_CALLS = 0;
        AttributeConverter.CONVERT_TO_ENTITY_CALLS = 0;
        AttributeConverter.POST_CONSTRUCT_CALLS = 0;
        AttributeConverter.PRE_DESTROY_CALLS = 0;
    }
}
