Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
33 | PointedEar | 1 | // $Id: Persistence.java 14134 2007-10-25 22:34:46Z epbernard $ |
2 | package javax.persistence; |
||
3 | |||
4 | import java.io.BufferedReader; |
||
5 | import java.io.IOException; |
||
6 | import java.io.InputStream; |
||
7 | import java.io.InputStreamReader; |
||
8 | import java.net.URL; |
||
9 | import java.util.Enumeration; |
||
10 | import java.util.HashSet; |
||
11 | import java.util.Map; |
||
12 | import java.util.Set; |
||
13 | import java.util.regex.Matcher; |
||
14 | import java.util.regex.Pattern; |
||
15 | import javax.persistence.spi.PersistenceProvider; |
||
16 | |||
17 | /** |
||
18 | * Bootstrap class that provides access to an EntityManagerFactory. |
||
19 | */ |
||
20 | public class Persistence { |
||
21 | |||
22 | //typo intended because it leaked into the JPA 1 spec. Do not use this constant. |
||
23 | public static final java.lang.String PERSISTENCE_PROVIDER = "javax.persistence.spi.PeristenceProvider"; |
||
24 | |||
25 | protected static final Set<PersistenceProvider> providers = new HashSet<PersistenceProvider>(); |
||
26 | |||
27 | /** |
||
28 | * Create and return an EntityManagerFactory for the named persistence unit. |
||
29 | * |
||
30 | * @param persistenceUnitName The name of the persistence unit |
||
31 | * @return The factory that creates EntityManagers configured according to the specified persistence unit |
||
32 | */ |
||
33 | public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName) { |
||
34 | return createEntityManagerFactory( persistenceUnitName, null ); |
||
35 | } |
||
36 | |||
37 | /** |
||
38 | * Create and return an EntityManagerFactory for the named persistence unit using the given properties. |
||
39 | * |
||
40 | * @param persistenceUnitName The name of the persistence unit |
||
41 | * @param properties Additional properties to use when creating the factory. The values of these properties override |
||
42 | * any values that may have been configured elsewhere |
||
43 | * @return The factory that creates EntityManagers configured according to the specified persistence unit |
||
44 | */ |
||
45 | public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map properties) { |
||
46 | EntityManagerFactory emf = null; |
||
47 | |||
48 | if ( providers.size() == 0 ) { |
||
49 | findAllProviders(); |
||
50 | } |
||
51 | for ( PersistenceProvider provider : providers ) { |
||
52 | emf = provider.createEntityManagerFactory( persistenceUnitName, properties ); |
||
53 | if ( emf != null ) break; |
||
54 | } |
||
55 | if ( emf == null ) { |
||
56 | throw new PersistenceException( "No Persistence provider for EntityManager named " + persistenceUnitName ); |
||
57 | } |
||
58 | return emf; |
||
59 | } |
||
60 | |||
61 | // Helper methods |
||
62 | |||
63 | private static void findAllProviders() { |
||
64 | try { |
||
65 | ClassLoader loader = Thread.currentThread().getContextClassLoader(); |
||
66 | Enumeration<URL> resources = loader.getResources( "META-INF/services/" + PersistenceProvider.class.getName() ); |
||
67 | Set<String> names = new HashSet<String>(); |
||
68 | while ( resources.hasMoreElements() ) { |
||
69 | URL url = resources.nextElement(); |
||
70 | InputStream is = url.openStream(); |
||
71 | try { |
||
72 | names.addAll( providerNamesFromReader( new BufferedReader( new InputStreamReader( is ) ) ) ); |
||
73 | } |
||
74 | finally { |
||
75 | is.close(); |
||
76 | } |
||
77 | } |
||
78 | for ( String s : names ) { |
||
79 | Class providerClass = loader.loadClass( s ); |
||
80 | providers.add( (PersistenceProvider) providerClass.newInstance() ); |
||
81 | } |
||
82 | } |
||
83 | catch (IOException e) { |
||
84 | throw new PersistenceException( e ); |
||
85 | } |
||
86 | catch (InstantiationException e) { |
||
87 | throw new PersistenceException( e ); |
||
88 | } |
||
89 | catch (IllegalAccessException e) { |
||
90 | throw new PersistenceException( e ); |
||
91 | } |
||
92 | catch (ClassNotFoundException e) { |
||
93 | throw new PersistenceException( e ); |
||
94 | } |
||
95 | } |
||
96 | |||
97 | private static final Pattern nonCommentPattern = Pattern.compile( "^([^#]+)" ); |
||
98 | |||
99 | private static Set<String> providerNamesFromReader(BufferedReader reader) throws IOException { |
||
100 | Set<String> names = new HashSet<String>(); |
||
101 | String line; |
||
102 | while ( ( line = reader.readLine() ) != null ) { |
||
103 | line = line.trim(); |
||
104 | Matcher m = nonCommentPattern.matcher( line ); |
||
105 | if ( m.find() ) { |
||
106 | names.add( m.group().trim() ); |
||
107 | } |
||
108 | } |
||
109 | return names; |
||
110 | } |
||
111 | } |