FileDocCategorySizeDatePackage
Persistence.javaAPI DocGlassfish v2 API10858Thu Jul 19 12:28:34 BST 2007javax.persistence

Persistence

public class Persistence extends Object
Bootstrap class that is used to obtain an {@link EntityManagerFactory}.
since
Java Persistence 1.0

Fields Summary
public static final String
PERSISTENCE_PROVIDER
protected static final Set
providers
private static final String
SERVICE_NAME
private static final String
PERSISTENCE_XML_NAME
private static final Pattern
nonCommentPattern
Constructors Summary
Methods Summary
public static javax.persistence.EntityManagerFactorycreateEntityManagerFactory(java.lang.String persistenceUnitName)
Create and return an EntityManagerFactory for the named persistence unit.

param
persistenceUnitName The name of the persistence unit
return
The factory that creates EntityManagers configured according to the specified persistence unit

  
                                           
         
        return createEntityManagerFactory(persistenceUnitName, null);
    
public static javax.persistence.EntityManagerFactorycreateEntityManagerFactory(java.lang.String persistenceUnitName, java.util.Map properties)
Create and return an EntityManagerFactory for the named persistence unit using the given properties.

param
persistenceUnitName The name of the persistence unit
param
properties Additional properties to use when creating the factory. The values of these properties override any values that may have been configured elsewhere.
return
The factory that creates EntityManagers configured according to the specified persistence unit.

        EntityManagerFactory emf = null;
        Set<PersistenceProvider> providersFound = null;

        try{
            providersFound = findAllProviders();
        } catch (IOException exc){};

        Map<String, String> errors = new HashMap<String, String>();
        Set<String> returnedNull = new HashSet<String>();
        for (PersistenceProvider provider : providersFound) {
            try {
                emf = provider.createEntityManagerFactory(persistenceUnitName, properties);
                if (emf != null) {
                    break;
                } else {
                    returnedNull.add(provider.getClass().getName());
                }
            } catch (Throwable t) {
                // ignore : according to Spec the provider must return null from
                // createEntityManagerFactory(), if not the right provider.
                // But non-compliant provider may throw exception
                errors.put(provider.getClass().getName(), createErrorMessage(t));
            }
        }

        if (emf == null) {
            StringBuffer message = new StringBuffer(
                    "No Persistence provider for EntityManager named " +
                     persistenceUnitName + ": ");
            if (!exists(PERSISTENCE_XML_NAME)) {
                message.append (" No META-INF/persistence.xml was found in classpath.\n");
            } else {
                Map<String, String> reasons = getReasons();
                for (Map.Entry me: reasons.entrySet()) {
                    message.append("Provider named ");
                    message.append(me.getKey());
                    message.append(" threw exception at initialization: ");
                    message.append(me.getValue() + "\n");
                }

                for (Map.Entry me: errors.entrySet()) {
                    message.append("Provider named ");
                    message.append(me.getKey());
                    message.append(" threw unexpected exception at create EntityManagerFactory: \n");
                    message.append(me.getValue() + "\n");
                }

                if (!returnedNull.isEmpty()) {
                    message.append(" The following providers:\n");
                    for (String n: returnedNull) {
                        message.append(n + "\n");
                    }
                    message.append("Returned null to createEntityManagerFactory.\n");
                }
            }
            throw new PersistenceException(message.toString());
        }
        return emf;
    
private static java.lang.StringcreateErrorMessage(java.lang.Throwable t)

        StringWriter errorMessage = new StringWriter();
        errorMessage.append(t.getClass().getName()).append("\r\n");
        t.printStackTrace(new PrintWriter(errorMessage));
        errorMessage.append("\r\n");
        return errorMessage.toString();
    
private static booleanexists(java.lang.String fileName)

        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        Enumeration<URL> resources;
        try {
            resources = loader.getResources(fileName);
        } catch (IOException ex) {
            resources = null;
        }
        return resources==null? false : resources.hasMoreElements();
    
private static java.util.SetfindAllProviders()

        HashSet<PersistenceProvider> providersFound = new HashSet<PersistenceProvider>();
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        Enumeration<URL> resources = loader.getResources(SERVICE_NAME);

        if (!resources.hasMoreElements()) {
            throw new PersistenceException("No resource files named " + SERVICE_NAME 
            + " were found. Please make sure that the persistence provider jar file is in your classpath.");
        }
        Set<String> names = new HashSet<String>();
        while (resources.hasMoreElements()) {
            URL url = resources.nextElement();
            InputStream is = url.openStream();
            try {
                names.addAll(providerNamesFromReader(new BufferedReader(new InputStreamReader(is))));
            } finally {
                is.close();
            }
        }

        if (names.isEmpty()) {
            throw new PersistenceException("No provider names were found in " + SERVICE_NAME);
        }
        for (String s : names) {
            try{
                providersFound.add((PersistenceProvider)loader.loadClass(s).newInstance());
            } catch (ClassNotFoundException exc){
            } catch (InstantiationException exc){
            } catch (IllegalAccessException exc){
            }
        }
        return providersFound;
    
private static java.util.MapgetReasons()

        Map<String, String> reasons = new HashMap<String, String>();
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        Set<String> names = new HashSet<String>();

        try {
            Enumeration<URL> resources = loader.getResources(SERVICE_NAME);
            while (resources.hasMoreElements()) {
                URL url = resources.nextElement();
                InputStream is = url.openStream();
                try {
                    names.addAll(providerNamesFromReader(new BufferedReader(new InputStreamReader(is))));
                } finally {
                    is.close();
                }
            }
        } catch (IOException exc){};

        for (String s : names) {
            try{
                loader.loadClass(s).newInstance();
            } catch (ClassNotFoundException exc){
                reasons.put(s, exc.getClass().getName() + " " + exc.getMessage());
            } catch (InstantiationException exc){
                reasons.put(s, createErrorMessage(exc));
            } catch (IllegalAccessException exc){
                reasons.put(s, createErrorMessage(exc));
            } catch (RuntimeException exc){
                reasons.put(s, createErrorMessage(exc));
            }
        }
        return reasons;
    
private static java.util.SetproviderNamesFromReader(java.io.BufferedReader reader)


         
              
        Set<String> names = new HashSet<String>();
        String line;
        while ((line = reader.readLine()) != null) {
            line = line.trim();
            Matcher m = nonCommentPattern.matcher(line);
            if (m.find()) {
                names.add(m.group().trim());
            }
        }
        return names;