/*******************************************************************************
 * Copyright (c) 1998, 2009 Oracle. 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.
 * 
 * The API for this class and its comments are derived from the JPA 2.0 specification 
 * which is developed under the Java Community Process (JSR 317) and is copyright 
 * Sun Microsystems, Inc. 
 *
 * Contributors:
 *     dclarke - Java Persistence 2.0 - Proposed Final Draft (March 13, 2009)
 *     			 Specification and licensing terms available from
 *     		   	 http://jcp.org/en/jsr/detail?id=317
 *
 * EARLY ACCESS - PUBLIC DRAFT
 * This is an implementation of an early-draft specification developed under the 
 * Java Community Process (JCP) and is made available for testing and evaluation 
 * purposes only. The code is not compatible with any specification of the JCP.
 ******************************************************************************/

package javax.persistence;

import java.util.Map;
import java.util.Set;

import javax.persistence.criteria.QueryBuilder;
import javax.persistence.metamodel.Metamodel;

/**
 * Interface used to interact with the entity manager factory for the
 * persistence unit.
 */
public interface EntityManagerFactory {
    /**
     * Create a new EntityManager. This method returns a new EntityManager
     * instance each time it is invoked. The isOpen method will return true on
     * the returned instance.
     * 
     * @throws IllegalStateException
     *             if the entity manager factory has been closed.
     */
    public EntityManager createEntityManager();

    /**
     * Create a new EntityManager with the specified Map of properties. This
     * method returns a new EntityManager instance each time it is invoked. The
     * isOpen method will return true on the returned instance.
     * 
     * @throws IllegalStateException
     *             if the entity manager factory has been closed.
     */
    public EntityManager createEntityManager(Map map);

    /**
     * Return an instance of QueryBuilder for the creation of CriteriaQuery
     * objects.
     * 
     * @return QueryBuilder instance
     * @throws IllegalStateException
     *             if the entity manager factory has been closed.
     */
    public QueryBuilder getQueryBuilder();

    /**
     * Return an instance of Metamodel interface for access to the metamodel of
     * the persistence unit.
     * 
     * @return Metamodel instance
     * @throws IllegalStateException
     *             if the entity manager factory has been closed.
     */
    public Metamodel getMetamodel();

    /**
     * Indicates whether the factory is open. Returns true until the factory has
     * been closed.
     */
    public boolean isOpen();

    /**
     * Close the factory, releasing any resources that it holds. After a factory
     * instance is closed, all methods invoked on it will throw an
     * IllegalStateException, except for isOpen, which will return false. Once
     * an EntityManagerFactory has been closed, all its entity managers are
     * considered to be in the closed state.
     * 
     * @throws IllegalStateException
     *             if the entity manager factory has been closed.
     */
    public void close();

    /**
     * Get the properties and associated values that are in effect for the
     * entity manager factory. Changing the contents of the map does not change
     * the configuration in effect.
     * 
     * @return properties
     */
    public Map<String, Object> getProperties();

    /**
     * Get the names of the properties that are supported for use with the
     * entity manager factory. These correspond to properties that may be passed
     * to the methods of the EntityManagerFactory interface that take a
     * properties argument. These include all standard properties as well as
     * vendor-specific properties supported by the provider. These properties
     * may or may not currently be in effect.
     * 
     * @return properties and hints
     */
    public Set<String> getSupportedProperties();

    /**
     * Access the cache that is associated with the entity manager factory (the
     * "second level cache").
     * 
     * @return instance of the Cache interface
     * @throws IllegalStateException
     *             if the entity manager factory has been closed.
     */
    public Cache getCache();
}
