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