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.Map; 033 import java.util.Properties; 034 import java.util.Set; 035 036 public class PersistenceUnitInfoImpl implements TapestryPersistenceUnitInfo 037 { 038 private String persistenceUnitName; 039 040 private String persistenceProviderClassName; 041 042 private String persistenceXMLSchemaVersion; 043 044 private PersistenceUnitTransactionType transactionType = PersistenceUnitTransactionType.RESOURCE_LOCAL; 045 046 private DataSource nonJtaDataSource; 047 048 private DataSource jtaDataSource; 049 050 private ValidationMode validationMode; 051 052 private SharedCacheMode sharedCacheMode; 053 054 private boolean excludeUnlistedClasses = true; 055 056 private final Set<String> managedClassNames = CollectionFactory.newSet(); 057 058 private final Set<String> mappingFilesNames = CollectionFactory.newSet(); 059 060 private final List<URL> jarFileUrls = CollectionFactory.newList(); 061 062 private final Properties properties = new Properties(); 063 064 private Map entityManagerProperties; 065 066 public PersistenceUnitInfoImpl(String persistenceUnitName) 067 { 068 this.persistenceUnitName = persistenceUnitName; 069 } 070 071 /** 072 * {@inheritDoc} 073 */ 074 public String getPersistenceUnitName() 075 { 076 return persistenceUnitName; 077 } 078 079 /** 080 * {@inheritDoc} 081 */ 082 public String getPersistenceProviderClassName() 083 { 084 return persistenceProviderClassName; 085 } 086 087 /** 088 * {@inheritDoc} 089 */ 090 public TapestryPersistenceUnitInfo persistenceProviderClassName(final String persistenceProviderClassName) 091 { 092 this.persistenceProviderClassName = persistenceProviderClassName; 093 094 return this; 095 } 096 097 /** 098 * {@inheritDoc} 099 */ 100 public PersistenceUnitTransactionType getTransactionType() 101 { 102 return transactionType; 103 } 104 105 /** 106 * {@inheritDoc} 107 */ 108 public TapestryPersistenceUnitInfo transactionType(final PersistenceUnitTransactionType transactionType) 109 { 110 this.transactionType = transactionType; 111 112 return this; 113 } 114 115 /** 116 * {@inheritDoc} 117 */ 118 public DataSource getJtaDataSource() 119 { 120 return jtaDataSource; 121 } 122 123 /** 124 * {@inheritDoc} 125 */ 126 public DataSource getNonJtaDataSource() 127 { 128 return nonJtaDataSource; 129 } 130 131 /** 132 * {@inheritDoc} 133 */ 134 public TapestryPersistenceUnitInfo nonJtaDataSource(final String nonJtaDataSource) 135 { 136 this.nonJtaDataSource = lookupDataSource(nonJtaDataSource); 137 138 return this; 139 } 140 141 /** 142 * {@inheritDoc} 143 */ 144 public TapestryPersistenceUnitInfo jtaDataSource(final String jtaDataSource) 145 { 146 this.jtaDataSource = lookupDataSource(jtaDataSource); 147 148 return this; 149 } 150 151 /** 152 * {@inheritDoc} 153 */ 154 public List<String> getMappingFileNames() 155 { 156 List<String> tmp = CollectionFactory.newList(mappingFilesNames); 157 return Collections.unmodifiableList(tmp); 158 } 159 160 /** 161 * {@inheritDoc} 162 */ 163 public TapestryPersistenceUnitInfo addMappingFileName(final String fileName) 164 { 165 mappingFilesNames.add(fileName); 166 167 return this; 168 169 } 170 171 /** 172 * {@inheritDoc} 173 */ 174 public TapestryPersistenceUnitInfo addJarFileUrl(URL url) 175 { 176 jarFileUrls.add(url); 177 178 return this; 179 } 180 181 /** 182 * {@inheritDoc} 183 */ 184 public TapestryPersistenceUnitInfo addJarFileUrl(String url) 185 { 186 try 187 { 188 return addJarFileUrl(new URL(getPersistenceUnitRootUrl(), url)); 189 } catch (MalformedURLException e) 190 { 191 throw new RuntimeException(e); 192 } 193 } 194 195 196 /** 197 * {@inheritDoc} 198 */ 199 public TapestryPersistenceUnitInfo addProperty(String name, String value) 200 { 201 getProperties().put(name, value); 202 203 return this; 204 } 205 206 207 /** 208 * {@inheritDoc} 209 */ 210 public TapestryPersistenceUnitInfo excludeUnlistedClasses(boolean exclude) 211 { 212 this.excludeUnlistedClasses = exclude; 213 214 return this; 215 } 216 217 /** 218 * {@inheritDoc} 219 */ 220 public List<URL> getJarFileUrls() 221 { 222 return Collections.unmodifiableList(jarFileUrls); 223 } 224 225 /** 226 * {@inheritDoc} 227 */ 228 public URL getPersistenceUnitRootUrl() 229 { 230 return getClass().getResource("/"); 231 } 232 233 /** 234 * {@inheritDoc} 235 */ 236 public List<String> getManagedClassNames() 237 { 238 List<String> tmp = CollectionFactory.newList(managedClassNames); 239 return Collections.<String>unmodifiableList(tmp); 240 } 241 242 /** 243 * {@inheritDoc} 244 */ 245 public TapestryPersistenceUnitInfo addManagedClassName(final String className) 246 { 247 managedClassNames.add(className); 248 249 return this; 250 } 251 252 /** 253 * {@inheritDoc} 254 */ 255 public TapestryPersistenceUnitInfo addManagedClass(final Class<?> clazz) 256 { 257 addManagedClassName(clazz.getName()); 258 259 return this; 260 } 261 262 /** 263 * {@inheritDoc} 264 */ 265 public boolean excludeUnlistedClasses() 266 { 267 return excludeUnlistedClasses; 268 } 269 270 /** 271 * {@inheritDoc} 272 */ 273 public SharedCacheMode getSharedCacheMode() 274 { 275 return sharedCacheMode; 276 } 277 278 /** 279 * {@inheritDoc} 280 */ 281 public TapestryPersistenceUnitInfo sharedCacheMode(final SharedCacheMode cacheMode) 282 { 283 sharedCacheMode = cacheMode; 284 285 return this; 286 } 287 288 /** 289 * {@inheritDoc} 290 */ 291 public ValidationMode getValidationMode() 292 { 293 return validationMode; 294 } 295 296 /** 297 * {@inheritDoc} 298 */ 299 public TapestryPersistenceUnitInfo validationMode(final ValidationMode validationMode) 300 { 301 this.validationMode = validationMode; 302 303 return this; 304 } 305 306 /** 307 * {@inheritDoc} 308 */ 309 public Properties getProperties() 310 { 311 return properties; 312 } 313 314 /** 315 * {@inheritDoc} 316 */ 317 public String getPersistenceXMLSchemaVersion() 318 { 319 return persistenceXMLSchemaVersion; 320 } 321 322 public void setPersistenceXMLSchemaVersion(final String version) 323 { 324 persistenceXMLSchemaVersion = version; 325 } 326 327 /** 328 * {@inheritDoc} 329 */ 330 public ClassLoader getClassLoader() 331 { 332 return Thread.currentThread().getContextClassLoader(); 333 } 334 335 /** 336 * {@inheritDoc} 337 */ 338 public void addTransformer(final ClassTransformer transformer) 339 { 340 341 } 342 343 /** 344 * {@inheritDoc} 345 */ 346 public ClassLoader getNewTempClassLoader() 347 { 348 return getClassLoader(); 349 } 350 351 352 private DataSource lookupDataSource(final String name) 353 { 354 try 355 { 356 // TODO: Create InitialContext with environment properties? 357 final Context initContext = new InitialContext(); 358 359 final Context envContext = (Context) initContext.lookup("java:comp/env"); 360 361 return (DataSource) envContext.lookup(name); 362 } catch (final NamingException e) 363 { 364 throw new RuntimeException(e); 365 } 366 367 } 368 369 public TapestryPersistenceUnitInfo setEntityManagerProperties(Map properties) { 370 entityManagerProperties = properties; 371 return this; 372 } 373 374 public Map getEntityManagerProperties() { 375 return entityManagerProperties; 376 } 377 378 379 }