Author: dadams
Date: Mon Oct 15 06:34:59 2007
New Revision: 584786
URL: http://svn.apache.org/viewvc?rev=584786&view=rev
Log:
Fixed TAPESTRY-1372 : Allow contributions to the Hibernate Configuration
Added:
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/hibernate/HibernateConfigurer.java
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/hibernate/HibernateEntityPackageManager.java
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/DefaultHibernateConfigurer.java
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/PackageNameHibernateConfigurer.java
tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/internal/hibernate/DefaultHibernateConfigurerFilterTest.java
Modified:
tapestry/tapestry5/trunk/tapestry-hibernate/ (props changed)
tapestry/tapestry5/trunk/tapestry-hibernate/pom.xml
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/hibernate/HibernateModule.java
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/HibernateSessionSourceImpl.java
tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/internal/hibernate/HibernateSessionSourceImplTest.java
Propchange: tapestry/tapestry5/trunk/tapestry-hibernate/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Mon Oct 15 06:34:59 2007
@@ -3,3 +3,4 @@
temp-testng-customsuite.xml
cobertura.ser
null
+test-output
Modified: tapestry/tapestry5/trunk/tapestry-hibernate/pom.xml
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/pom.xml?rev=584786&r1=584785&r2=584786&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-hibernate/pom.xml (original)
+++ tapestry/tapestry5/trunk/tapestry-hibernate/pom.xml Mon Oct 15 06:34:59 2007
@@ -34,6 +34,12 @@
<artifactId>easymock</artifactId>
</dependency>
<dependency>
+ <groupId>org.easymock</groupId>
+ <artifactId>easymockclassextension</artifactId>
+ <version>2.2.2</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>1.8.0.7</version>
Added:
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/hibernate/HibernateConfigurer.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/hibernate/HibernateConfigurer.java?rev=584786&view=auto
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/hibernate/HibernateConfigurer.java
(added)
+++
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/hibernate/HibernateConfigurer.java
Mon Oct 15 06:34:59 2007
@@ -0,0 +1,24 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.hibernate;
+
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.Configuration;
+
+/** Modifies the Hibernate configuration in some way before the [EMAIL
PROTECTED] SessionFactory} is created.
+ */
+public interface HibernateConfigurer {
+ void configure(Configuration configuration);
+}
Added:
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/hibernate/HibernateEntityPackageManager.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/hibernate/HibernateEntityPackageManager.java?rev=584786&view=auto
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/hibernate/HibernateEntityPackageManager.java
(added)
+++
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/hibernate/HibernateEntityPackageManager.java
Mon Oct 15 06:34:59 2007
@@ -0,0 +1,24 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.hibernate;
+
+import java.util.Collection;
+
+/** Contains a set of contributed package names from which to load entities.
+ */
+public interface HibernateEntityPackageManager {
+ /** Returns packages from which read entity classes */
+ Collection<String> getPackageNames();
+}
Modified:
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/hibernate/HibernateModule.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/hibernate/HibernateModule.java?rev=584786&r1=584785&r2=584786&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/hibernate/HibernateModule.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/hibernate/HibernateModule.java
Mon Oct 15 06:34:59 2007
@@ -16,11 +16,17 @@
import static org.apache.tapestry.ioc.IOCConstants.PERTHREAD_SCOPE;
+import java.util.Collection;
+import java.util.List;
+
import org.apache.tapestry.internal.InternalConstants;
+import org.apache.tapestry.internal.hibernate.DefaultHibernateConfigurer;
import org.apache.tapestry.internal.hibernate.HibernateSessionManagerImpl;
import org.apache.tapestry.internal.hibernate.HibernateSessionSourceImpl;
+import org.apache.tapestry.internal.hibernate.PackageNameHibernateConfigurer;
+import org.apache.tapestry.internal.services.ClassNameLocator;
import org.apache.tapestry.ioc.Configuration;
-import org.apache.tapestry.ioc.ServiceBinder;
+import org.apache.tapestry.ioc.OrderedConfiguration;
import org.apache.tapestry.ioc.annotations.Inject;
import org.apache.tapestry.ioc.annotations.InjectService;
import org.apache.tapestry.ioc.annotations.Scope;
@@ -30,19 +36,24 @@
import org.apache.tapestry.services.AliasContribution;
import org.hibernate.Session;
import org.hibernate.Transaction;
+import org.slf4j.Logger;
public class HibernateModule
{
- public static void bind(ServiceBinder binder)
- {
- binder.bind(HibernateSessionSource.class,
HibernateSessionSourceImpl.class);
- }
+ public static HibernateEntityPackageManager build(final Collection<String>
packageNames) {
+ return new HibernateEntityPackageManager() {
+ public Collection<String> getPackageNames() {
+ return packageNames;
+ }
+ };
+ }
+
/**
* Contributes the package "<root>.entities" to the configuration,
so that it will be
* scanned for annotated entity classes.
*/
- public static void contributeHibernateSessionSource(Configuration<String>
configuration,
+ public static void
contributeHibernateEntityPackageManager(Configuration<String> configuration,
@Inject
@Symbol(InternalConstants.TAPESTRY_APP_PACKAGE_PARAM)
@@ -95,4 +106,23 @@
{
configuration.add(AliasContribution.create(Session.class, session));
}
+
+ public static HibernateSessionSource build(Logger log,
List<HibernateConfigurer> config) {
+ return new HibernateSessionSourceImpl(log, config);
+ }
+
+ /** Adds the following configurers:
+ * <ul>
+ * <li>Default - performs default hibernate configuration</li>
+ * <li>PackageName - loads entities by package name</li>
+ * </ul>
+ */
+ public static void
contributeHibernateSessionSource(OrderedConfiguration<HibernateConfigurer>
config,
+ final ClassNameLocator classNameLocator,
+ final HibernateEntityPackageManager packageManager)
+ {
+ config.add("Default", new DefaultHibernateConfigurer());
+ config.add("PackageName", new
PackageNameHibernateConfigurer(packageManager, classNameLocator));
+ }
+
}
Added:
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/DefaultHibernateConfigurer.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/DefaultHibernateConfigurer.java?rev=584786&view=auto
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/DefaultHibernateConfigurer.java
(added)
+++
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/DefaultHibernateConfigurer.java
Mon Oct 15 06:34:59 2007
@@ -0,0 +1,27 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.hibernate;
+
+import org.apache.tapestry.hibernate.HibernateConfigurer;
+import org.hibernate.cfg.Configuration;
+
+/** Simply calls configure() to do the default Hibernate configuration.
+ */
+public final class DefaultHibernateConfigurer implements HibernateConfigurer {
+
+ public void configure(Configuration configuration) {
+ configuration.configure();
+ }
+}
Modified:
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/HibernateSessionSourceImpl.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/HibernateSessionSourceImpl.java?rev=584786&r1=584785&r2=584786&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/HibernateSessionSourceImpl.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/HibernateSessionSourceImpl.java
Mon Oct 15 06:34:59 2007
@@ -14,11 +14,10 @@
package org.apache.tapestry.internal.hibernate;
-import java.util.Collection;
+import java.util.List;
+import org.apache.tapestry.hibernate.HibernateConfigurer;
import org.apache.tapestry.hibernate.HibernateSessionSource;
-import org.apache.tapestry.internal.services.ClassNameLocator;
-import org.apache.tapestry.ioc.annotations.InjectService;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
@@ -28,38 +27,14 @@
{
private SessionFactory _sessionFactory;
- public HibernateSessionSourceImpl(Logger logger, Collection<String>
packageNames,
-
- @InjectService("ClassNameLocator")
- ClassNameLocator classNameLocator)
+ public HibernateSessionSourceImpl(Logger logger, List<HibernateConfigurer>
hibernateConfigurers)
{
- ClassLoader contextClassLoader =
Thread.currentThread().getContextClassLoader();
long startTime = System.currentTimeMillis();
AnnotationConfiguration configuration = new AnnotationConfiguration();
- // Perform normal configuration.
-
- configuration.configure();
-
- for (String packageName : packageNames)
- {
- configuration.addPackage(packageName);
-
- for (String className :
classNameLocator.locateClassNames(packageName))
- {
- try
- {
- Class entityClass =
contextClassLoader.loadClass(className);
-
- configuration.addAnnotatedClass(entityClass);
- }
- catch (ClassNotFoundException ex)
- {
- throw new RuntimeException(ex);
- }
- }
- }
+ for(HibernateConfigurer configurer : hibernateConfigurers)
+ configurer.configure(configuration);
long configurationComplete = System.currentTimeMillis();
Added:
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/PackageNameHibernateConfigurer.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/PackageNameHibernateConfigurer.java?rev=584786&view=auto
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/PackageNameHibernateConfigurer.java
(added)
+++
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/PackageNameHibernateConfigurer.java
Mon Oct 15 06:34:59 2007
@@ -0,0 +1,61 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.hibernate;
+
+import org.apache.tapestry.hibernate.HibernateConfigurer;
+import org.apache.tapestry.hibernate.HibernateEntityPackageManager;
+import org.apache.tapestry.internal.services.ClassNameLocator;
+import org.apache.tapestry.ioc.internal.util.Defense;
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.cfg.Configuration;
+
+/** Adds entity classes from a given set of packages to the configuration.
+ */
+public final class PackageNameHibernateConfigurer implements
HibernateConfigurer {
+ private final HibernateEntityPackageManager _packageManager;
+ private final ClassNameLocator _classNameLocator;
+
+ public PackageNameHibernateConfigurer(HibernateEntityPackageManager
packageManager, ClassNameLocator classNameLocator) {
+ super();
+ _packageManager = packageManager;
+ _classNameLocator = classNameLocator;
+ }
+
+ public void configure(Configuration configuration) {
+ Defense.cast(configuration, AnnotationConfiguration.class,
"configuration");
+ AnnotationConfiguration cfg =
(AnnotationConfiguration)configuration;
+
+ ClassLoader contextClassLoader =
Thread.currentThread().getContextClassLoader();
+
+ for (String packageName : _packageManager.getPackageNames())
+ {
+ cfg.addPackage(packageName);
+
+ for (String className :
_classNameLocator.locateClassNames(packageName))
+ {
+ try
+ {
+ Class entityClass =
contextClassLoader.loadClass(className);
+ cfg.addAnnotatedClass(entityClass);
+ }
+ catch (ClassNotFoundException ex)
+ {
+ throw new RuntimeException(ex);
+ }
+ }
+ }
+ }
+
+}
Added:
tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/internal/hibernate/DefaultHibernateConfigurerFilterTest.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/internal/hibernate/DefaultHibernateConfigurerFilterTest.java?rev=584786&view=auto
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/internal/hibernate/DefaultHibernateConfigurerFilterTest.java
(added)
+++
tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/internal/hibernate/DefaultHibernateConfigurerFilterTest.java
Mon Oct 15 06:34:59 2007
@@ -0,0 +1,35 @@
+// Copyright 2007 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.internal.hibernate;
+
+import static org.easymock.EasyMock.expect;
+import static org.easymock.classextension.EasyMock.createMock;
+import static org.easymock.classextension.EasyMock.replay;
+import static org.easymock.classextension.EasyMock.verify;
+
+import org.hibernate.cfg.Configuration;
+import org.testng.annotations.Test;
+
[EMAIL PROTECTED]
+public class DefaultHibernateConfigurerFilterTest {
+ public void testConfigure() throws Exception {
+ Configuration config = createMock(Configuration.class);
+ expect(config.configure()).andReturn(config);
+
+ replay(config);
+ new DefaultHibernateConfigurer().configure(config);
+ verify(config);
+ }
+}
Modified:
tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/internal/hibernate/HibernateSessionSourceImplTest.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/internal/hibernate/HibernateSessionSourceImplTest.java?rev=584786&r1=584785&r2=584786&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/internal/hibernate/HibernateSessionSourceImplTest.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/internal/hibernate/HibernateSessionSourceImplTest.java
Mon Oct 15 06:34:59 2007
@@ -14,12 +14,19 @@
package org.apache.tapestry.internal.hibernate;
+import java.util.Arrays;
import java.util.Collection;
+import java.util.List;
+import org.apache.tapestry.hibernate.HibernateConfigurer;
+import org.apache.tapestry.hibernate.HibernateEntityPackageManager;
import org.apache.tapestry.hibernate.HibernateSessionSource;
import org.apache.tapestry.internal.services.ClassNameLocatorImpl;
import org.apache.tapestry.ioc.internal.util.CollectionFactory;
import org.apache.tapestry.test.TapestryTestCase;
+import org.example.app0.entities.User;
+import org.hibernate.Session;
+import org.hibernate.metadata.ClassMetadata;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.annotations.Test;
@@ -35,10 +42,23 @@
Collection<String> packageNames = CollectionFactory.newList(
"org.example.myapp.entities",
"org.example.app0.entities");
+ HibernateEntityPackageManager packageManager =
newMock(HibernateEntityPackageManager.class);
+ expect(packageManager.getPackageNames()).andReturn(packageNames);
- HibernateSessionSource source = new HibernateSessionSourceImpl(_log,
packageNames,
- new ClassNameLocatorImpl());
+ List<HibernateConfigurer> filters = Arrays.asList(
+ new DefaultHibernateConfigurer(),
+ new PackageNameHibernateConfigurer(packageManager, new
ClassNameLocatorImpl()));
+
+ replay();
+ HibernateSessionSource source = new HibernateSessionSourceImpl(_log,
filters);
- assertNotNull(source.create());
+ Session session = source.create();
+ assertNotNull(session);
+
+ // make sure it found the entity in the package
+ ClassMetadata meta =
session.getSessionFactory().getClassMetadata(User.class);
+ assertEquals(meta.getEntityName(),
"org.example.app0.entities.User");
+
+ verify();
}
}