001    // Copyright 2011 The Apache Software Foundation
002    //
003    // Licensed under the Apache License, Version 2.0 (the "License");
004    // you may not use this file except in compliance with the License.
005    // You may obtain a copy of the License at
006    //
007    // http://www.apache.org/licenses/LICENSE-2.0
008    //
009    // Unless required by applicable law or agreed to in writing, software
010    // distributed under the License is distributed on an "AS IS" BASIS,
011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012    // See the License for the specific language governing permissions and
013    // limitations under the License.
014    
015    package org.apache.tapestry5.internal.jpa;
016    
017    import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
018    import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo;
019    
020    import javax.naming.Context;
021    import javax.naming.InitialContext;
022    import javax.naming.NamingException;
023    import javax.persistence.SharedCacheMode;
024    import javax.persistence.ValidationMode;
025    import javax.persistence.spi.ClassTransformer;
026    import javax.persistence.spi.PersistenceUnitTransactionType;
027    import javax.sql.DataSource;
028    import java.net.MalformedURLException;
029    import java.net.URL;
030    import java.util.Collections;
031    import java.util.List;
032    import java.util.Properties;
033    import java.util.Set;
034    
035    public class PersistenceUnitInfoImpl implements TapestryPersistenceUnitInfo
036    {
037        private String persistenceUnitName;
038    
039        private String persistenceProviderClassName;
040    
041        private String persistenceXMLSchemaVersion;
042    
043        private PersistenceUnitTransactionType transactionType = PersistenceUnitTransactionType.RESOURCE_LOCAL;
044    
045        private DataSource nonJtaDataSource;
046    
047        private DataSource jtaDataSource;
048    
049        private ValidationMode validationMode;
050    
051        private SharedCacheMode sharedCacheMode;
052    
053        private boolean excludeUnlistedClasses = true;
054    
055        private final Set<String> managedClassNames = CollectionFactory.newSet();
056    
057        private final Set<String> mappingFilesNames = CollectionFactory.newSet();
058    
059        private final List<URL> jarFileUrls = CollectionFactory.newList();
060    
061        private final Properties properties = new Properties();
062    
063    
064        public PersistenceUnitInfoImpl(String persistenceUnitName)
065        {
066            this.persistenceUnitName = persistenceUnitName;
067        }
068    
069        /**
070         * {@inheritDoc}
071         */
072        public String getPersistenceUnitName()
073        {
074            return persistenceUnitName;
075        }
076    
077        /**
078         * {@inheritDoc}
079         */
080        public String getPersistenceProviderClassName()
081        {
082            return persistenceProviderClassName;
083        }
084    
085        /**
086         * {@inheritDoc}
087         */
088        public TapestryPersistenceUnitInfo persistenceProviderClassName(final String persistenceProviderClassName)
089        {
090            this.persistenceProviderClassName = persistenceProviderClassName;
091    
092            return this;
093        }
094    
095        /**
096         * {@inheritDoc}
097         */
098        public PersistenceUnitTransactionType getTransactionType()
099        {
100            return transactionType;
101        }
102    
103        /**
104         * {@inheritDoc}
105         */
106        public TapestryPersistenceUnitInfo transactionType(final PersistenceUnitTransactionType transactionType)
107        {
108            this.transactionType = transactionType;
109    
110            return this;
111        }
112    
113        /**
114         * {@inheritDoc}
115         */
116        public DataSource getJtaDataSource()
117        {
118            return jtaDataSource;
119        }
120    
121        /**
122         * {@inheritDoc}
123         */
124        public DataSource getNonJtaDataSource()
125        {
126            return nonJtaDataSource;
127        }
128    
129        /**
130         * {@inheritDoc}
131         */
132        public TapestryPersistenceUnitInfo nonJtaDataSource(final String nonJtaDataSource)
133        {
134            this.nonJtaDataSource = lookupDataSource(nonJtaDataSource);
135    
136            return this;
137        }
138    
139        /**
140         * {@inheritDoc}
141         */
142        public TapestryPersistenceUnitInfo jtaDataSource(final String jtaDataSource)
143        {
144            this.jtaDataSource = lookupDataSource(jtaDataSource);
145    
146            return this;
147        }
148    
149        /**
150         * {@inheritDoc}
151         */
152        public List<String> getMappingFileNames()
153        {
154            List<String> tmp = CollectionFactory.newList(mappingFilesNames);
155            return Collections.unmodifiableList(tmp);
156        }
157    
158        /**
159         * {@inheritDoc}
160         */
161        public TapestryPersistenceUnitInfo addMappingFileName(final String fileName)
162        {
163            mappingFilesNames.add(fileName);
164    
165            return this;
166    
167        }
168    
169        /**
170         * {@inheritDoc}
171         */
172        public TapestryPersistenceUnitInfo addJarFileUrl(URL url)
173        {
174            jarFileUrls.add(url);
175    
176            return this;
177        }
178    
179        /**
180         * {@inheritDoc}
181         */
182        public TapestryPersistenceUnitInfo addJarFileUrl(String url)
183        {
184            try
185            {
186                return addJarFileUrl(new URL(getPersistenceUnitRootUrl(), url));
187            } catch (MalformedURLException e)
188            {
189                throw new RuntimeException(e);
190            }
191        }
192    
193    
194        /**
195         * {@inheritDoc}
196         */
197        public TapestryPersistenceUnitInfo addProperty(String name, String value)
198        {
199            getProperties().put(name, value);
200    
201            return this;
202        }
203    
204    
205        /**
206         * {@inheritDoc}
207         */
208        public TapestryPersistenceUnitInfo excludeUnlistedClasses(boolean exclude)
209        {
210            this.excludeUnlistedClasses = exclude;
211    
212            return this;
213        }
214    
215        /**
216         * {@inheritDoc}
217         */
218        public List<URL> getJarFileUrls()
219        {
220            return Collections.unmodifiableList(jarFileUrls);
221        }
222    
223        /**
224         * {@inheritDoc}
225         */
226        public URL getPersistenceUnitRootUrl()
227        {
228            return getClass().getResource("/");
229        }
230    
231        /**
232         * {@inheritDoc}
233         */
234        public List<String> getManagedClassNames()
235        {
236            List<String> tmp = CollectionFactory.newList(managedClassNames);
237            return Collections.<String>unmodifiableList(tmp);
238        }
239    
240        /**
241         * {@inheritDoc}
242         */
243        public TapestryPersistenceUnitInfo addManagedClassName(final String className)
244        {
245            managedClassNames.add(className);
246    
247            return this;
248        }
249    
250        /**
251         * {@inheritDoc}
252         */
253        public TapestryPersistenceUnitInfo addManagedClass(final Class<?> clazz)
254        {
255            addManagedClassName(clazz.getName());
256    
257            return this;
258        }
259    
260        /**
261         * {@inheritDoc}
262         */
263        public boolean excludeUnlistedClasses()
264        {
265            return excludeUnlistedClasses;
266        }
267    
268        /**
269         * {@inheritDoc}
270         */
271        public SharedCacheMode getSharedCacheMode()
272        {
273            return sharedCacheMode;
274        }
275    
276        /**
277         * {@inheritDoc}
278         */
279        public TapestryPersistenceUnitInfo sharedCacheMode(final SharedCacheMode cacheMode)
280        {
281            sharedCacheMode = cacheMode;
282    
283            return this;
284        }
285    
286        /**
287         * {@inheritDoc}
288         */
289        public ValidationMode getValidationMode()
290        {
291            return validationMode;
292        }
293    
294        /**
295         * {@inheritDoc}
296         */
297        public TapestryPersistenceUnitInfo validationMode(final ValidationMode validationMode)
298        {
299            this.validationMode = validationMode;
300    
301            return this;
302        }
303    
304        /**
305         * {@inheritDoc}
306         */
307        public Properties getProperties()
308        {
309            return properties;
310        }
311    
312        /**
313         * {@inheritDoc}
314         */
315        public String getPersistenceXMLSchemaVersion()
316        {
317            return persistenceXMLSchemaVersion;
318        }
319    
320        public void setPersistenceXMLSchemaVersion(final String version)
321        {
322            persistenceXMLSchemaVersion = version;
323        }
324    
325        /**
326         * {@inheritDoc}
327         */
328        public ClassLoader getClassLoader()
329        {
330            return Thread.currentThread().getContextClassLoader();
331        }
332    
333        /**
334         * {@inheritDoc}
335         */
336        public void addTransformer(final ClassTransformer transformer)
337        {
338    
339        }
340    
341        /**
342         * {@inheritDoc}
343         */
344        public ClassLoader getNewTempClassLoader()
345        {
346            return getClassLoader();
347        }
348    
349    
350        private DataSource lookupDataSource(final String name)
351        {
352            try
353            {
354                // TODO: Create InitialContext with environment properties?
355                final Context initContext = new InitialContext();
356    
357                final Context envContext = (Context) initContext.lookup("java:comp/env");
358    
359                return (DataSource) envContext.lookup(name);
360            } catch (final NamingException e)
361            {
362                throw new RuntimeException(e);
363            }
364    
365        }
366    
367    }