Looks awesome! On Sat, Mar 8, 2008 at 7:23 AM, <[EMAIL PROTECTED]> wrote: > Author: dadams > Date: Sat Mar 8 07:23:21 2008 > New Revision: 634989 > > URL: http://svn.apache.org/viewvc?rev=634989&view=rev > Log: > TAPESTRY-1653: Provide automatic ValueEncoders for Hibernate entities > > Added: > > tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/HibernateEntityValueEncoder.java > tapestry/tapestry5/trunk/tapestry-hibernate/src/site/apt/userguide.apt > > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/EncodeEntities.java > > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/webapp/EncodeEntities.tml > Modified: > > tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/hibernate/HibernateModule.java > tapestry/tapestry5/trunk/tapestry-hibernate/src/site/site.xml > > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/hibernate/integration/TapestryHibernateIntegrationTests.java > > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/entities/User.java > > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/Start.java > > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/resources/hibernate.cfg.xml > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/webapp/Start.tml > > 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=634989&r1=634988&r2=634989&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 > Sat Mar 8 07:23:21 2008 > @@ -14,12 +14,17 @@ > > package org.apache.tapestry.hibernate; > > +import org.apache.tapestry.ValueEncoder; > import org.apache.tapestry.internal.InternalConstants; > import org.apache.tapestry.internal.hibernate.DefaultHibernateConfigurer; > +import org.apache.tapestry.internal.hibernate.HibernateEntityValueEncoder; > 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.ioc.Configuration; > +import org.apache.tapestry.ioc.MappedConfiguration; > +import org.apache.tapestry.ioc.ObjectLocator; > + > import static org.apache.tapestry.ioc.IOCConstants.PERTHREAD_SCOPE; > import org.apache.tapestry.ioc.OrderedConfiguration; > import org.apache.tapestry.ioc.annotations.Inject; > @@ -30,11 +35,15 @@ > import org.apache.tapestry.ioc.services.PerthreadManager; > import org.apache.tapestry.ioc.services.PropertyShadowBuilder; > import org.apache.tapestry.ioc.services.RegistryShutdownHub; > +import org.apache.tapestry.ioc.services.TypeCoercer; > import org.apache.tapestry.services.AliasContribution; > +import org.apache.tapestry.services.ValueEncoderFactory; > import org.hibernate.Session; > +import org.hibernate.mapping.PersistentClass; > import org.slf4j.Logger; > > import java.util.Collection; > +import java.util.Iterator; > import java.util.List; > > public class HibernateModule > @@ -129,4 +138,30 @@ > config.add("PackageName", new > PackageNameHibernateConfigurer(packageManager, classNameLocator)); > } > > + /** > + * Contributes [EMAIL PROTECTED] ValueEncoderFactory}s for all > registered Hibernate entity classes. Encoding and decoding are based > + * on the id property value of the entity using type coercion. Hence, > if the id can be coerced to a String and back then > + * the entity can be coerced. > + */ > + @SuppressWarnings("unchecked") > + public static void > contributeValueEncoderSource(MappedConfiguration<Class, ValueEncoderFactory> > configuration, > + final > HibernateSessionSource sessionSource, > + final Session session, > + final TypeCoercer > typeCoercer) > + { > + org.hibernate.cfg.Configuration config = > sessionSource.getConfiguration(); > + Iterator<PersistentClass> mappings = config.getClassMappings(); > + while(mappings.hasNext()) { > + final PersistentClass persistentClass = mappings.next(); > + final Class entityClass = persistentClass.getMappedClass(); > + > + ValueEncoderFactory factory = new > ValueEncoderFactory() { > + public ValueEncoder create(Class type) { > + return new > HibernateEntityValueEncoder(entityClass, persistentClass, session, > typeCoercer); > + } > + }; > + > + configuration.add(entityClass, factory); > + } > + } > } > > Added: > tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/HibernateEntityValueEncoder.java > URL: > http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/HibernateEntityValueEncoder.java?rev=634989&view=auto > > ============================================================================== > --- > tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/HibernateEntityValueEncoder.java > (added) > +++ > tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/HibernateEntityValueEncoder.java > Sat Mar 8 07:23:21 2008 > @@ -0,0 +1,59 @@ > +// Copyright 2008 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 java.io.Serializable; > + > +import org.apache.tapestry.ValueEncoder; > +import org.apache.tapestry.ioc.internal.util.Defense; > +import org.apache.tapestry.ioc.services.TypeCoercer; > +import org.hibernate.Session; > +import org.hibernate.mapping.PersistentClass; > +import org.hibernate.mapping.Property; > +import org.hibernate.property.Getter; > + > +public final class HibernateEntityValueEncoder<E> implements > ValueEncoder<E> { > + private final Class<E> _entityClass; > + private final PersistentClass _persistentClass; > + private final Session _session; > + private final TypeCoercer _typeCoercer; > + private final Getter _idGetter; > + > + public HibernateEntityValueEncoder(Class<E> entityClass, > PersistentClass persistentClass, Session session, TypeCoercer typeCoercer) { > + super(); > + _entityClass = entityClass; > + _persistentClass = persistentClass; > + _session = session; > + _typeCoercer = typeCoercer; > + > + Property property = _persistentClass.getIdentifierProperty(); > + _idGetter = > property.getPropertyAccessor(_entityClass).getGetter(_entityClass, > property.getName()); > + } > + > + public String toClient(E value) { > + Object id = _idGetter.get(value); > + return _typeCoercer.coerce(id, String.class); > + } > + > + @SuppressWarnings("unchecked") > + public E toValue(String clientValue) { > + Class<?> idType = _idGetter.getReturnType(); > + > + Object id = _typeCoercer.coerce(clientValue, idType); > + Serializable ser = Defense.cast(id, Serializable.class, > "id"); > + return (E)_session.get(_entityClass, ser); > + } > + > +} > > Added: tapestry/tapestry5/trunk/tapestry-hibernate/src/site/apt/userguide.apt > URL: > http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/site/apt/userguide.apt?rev=634989&view=auto > > ============================================================================== > --- tapestry/tapestry5/trunk/tapestry-hibernate/src/site/apt/userguide.apt > (added) > +++ tapestry/tapestry5/trunk/tapestry-hibernate/src/site/apt/userguide.apt > Sat Mar 8 07:23:21 2008 > @@ -0,0 +1,31 @@ > + ---- > + User Guide > + ---- > + > +Entity value encoding > + > + Value encoders are automatically created for all mapped Hibernate entity > types. This is done by encoding the entity as it's > + id (coerced to a String) and decoding the entity by looking it up in the > Hibernate Session using the encoded id. Consider > + the following: > + > ++----+ > +public class ViewPerson { > + @Property > + private Person _person; > + > + void onActivate(Person person) > + { > + _person = person; > + } > +} > ++----+ > + > ++----+ > +<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd"> > +<body> > + The person's name is: ${person.name} > +</body> > +</html> > ++----+ > + > + Accessing the page as <</viewperson/152>> would load the Person entity > with id 152 and use that as the page context. > > Modified: tapestry/tapestry5/trunk/tapestry-hibernate/src/site/site.xml > URL: > http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/site/site.xml?rev=634989&r1=634988&r2=634989&view=diff > > ============================================================================== > --- tapestry/tapestry5/trunk/tapestry-hibernate/src/site/site.xml (original) > +++ tapestry/tapestry5/trunk/tapestry-hibernate/src/site/site.xml Sat Mar 8 > 07:23:21 2008 > @@ -40,6 +40,7 @@ > <menu name="Quick Links"> > <item name="About" href="index.html"/> > <item name="Configuration" href="conf.html"/> > + <item name="User guide" href="userguide.html" /> > <item name="Download" href="http://tapestry.apache.org/download.html"/> > </menu> > > > Modified: > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/hibernate/integration/TapestryHibernateIntegrationTests.java > URL: > http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/hibernate/integration/TapestryHibernateIntegrationTests.java?rev=634989&r1=634988&r2=634989&view=diff > > ============================================================================== > --- > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/hibernate/integration/TapestryHibernateIntegrationTests.java > (original) > +++ > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/hibernate/integration/TapestryHibernateIntegrationTests.java > Sat Mar 8 07:23:21 2008 > @@ -25,12 +25,18 @@ > super("src/test/webapp"); > } > > - /** Only needed until actual integration tests are put in. Just proves > the integration > - * tests are set up correctly. > - */ > - public void test_placeholder() throws Exception { > - open("/"); > - // just make sure we can get the hibernate Session > - assertTrue(getText("//[EMAIL PROTECTED]'session']").length() > > 0); > + public void test_valueencode_all_entity_types() throws Exception { > + open("/encodeentities"); > + > + assertEquals(0, getText("//[EMAIL > PROTECTED]'name']").length()); > + > + // need to create an entity in order to link with one > + clickAndWait("//[EMAIL PROTECTED]'createentity']"); > + assertEquals("name", getText("//[EMAIL PROTECTED]'name']")); > + > + // should return null for missing objects > + open("/encodeentities/9999"); > + assertEquals(0, getText("//[EMAIL > PROTECTED]'name']").length()); > } > + > } > > Modified: > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/entities/User.java > URL: > http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/entities/User.java?rev=634989&r1=634988&r2=634989&view=diff > > ============================================================================== > --- > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/entities/User.java > (original) > +++ > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/entities/User.java > Sat Mar 8 07:23:21 2008 > @@ -22,67 +22,68 @@ > @Entity > public class User > { > + // NOTE: Hibernate doesn't understand the '_' syntax. It will end up > putting underscores on all the properties > @Id @GeneratedValue > - private Long _id; > + private Long id; > > - private String _firstName; > + private String firstName; > > - private String _lastName; > + private String lastName; > > - private String _email; > + private String email; > > - private String _encodedPassword; > + private String encodedPassword; > > @Version > - private int _version; > + private int version; > > public String getEmail() > { > - return _email; > + return email; > } > > public String getEncodedPassword() > { > - return _encodedPassword; > + return encodedPassword; > } > > public String getFirstName() > { > - return _firstName; > + return firstName; > } > > public Long getId() > { > - return _id; > + return id; > } > > public String getLastName() > { > - return _lastName; > + return lastName; > } > > public int getVersion() > { > - return _version; > + return version; > } > > public void setEmail(String email) > { > - _email = email; > + this.email = email; > } > > public void setEncodedPassword(String encodedPassword) > { > - _encodedPassword = encodedPassword; > + this.encodedPassword = encodedPassword; > } > > public void setFirstName(String firstName) > { > - _firstName = firstName; > + this.firstName = firstName; > } > > public void setLastName(String lastName) > { > - _lastName = lastName; > + this.lastName = lastName; > } > } > > Added: > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/EncodeEntities.java > URL: > http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/EncodeEntities.java?rev=634989&view=auto > > ============================================================================== > --- > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/EncodeEntities.java > (added) > +++ > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/EncodeEntities.java > Sat Mar 8 07:23:21 2008 > @@ -0,0 +1,37 @@ > +package org.example.app0.pages; > + > +import java.util.List; > + > +import org.apache.tapestry.annotations.Property; > +import org.apache.tapestry.ioc.annotations.Inject; > +import org.example.app0.entities.User; > +import org.hibernate.Session; > + > +public class EncodeEntities { > + @Inject > + @Property > + private Session _session; > + > + @SuppressWarnings("unused") > + @Property > + private User _user; > + > + void onCreate() { > + User user = new User(); > + user.setFirstName("name"); > + _session.save(user); > + } > + > + @SuppressWarnings("unchecked") > + User onPassivate() { > + List<User> users = _session.createQuery("from User").list(); > + if (users.isEmpty()) > + return null; > + > + return users.get(0); > + } > + > + void onActivate(User user) { > + _user = user; > + } > +} > > Modified: > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/Start.java > URL: > http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/Start.java?rev=634989&r1=634988&r2=634989&view=diff > > ============================================================================== > --- > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/Start.java > (original) > +++ > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/example/app0/pages/Start.java > Sat Mar 8 07:23:21 2008 > @@ -14,13 +14,6 @@ > > package org.example.app0.pages; > > -import org.apache.tapestry.annotations.Property; > -import org.apache.tapestry.ioc.annotations.Inject; > -import org.hibernate.Session; > - > public class Start { > - @Property > - @Inject > - private Session _session; > > } > > Modified: > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/resources/hibernate.cfg.xml > URL: > http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/test/resources/hibernate.cfg.xml?rev=634989&r1=634988&r2=634989&view=diff > > ============================================================================== > --- > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/resources/hibernate.cfg.xml > (original) > +++ > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/resources/hibernate.cfg.xml > Sat Mar 8 07:23:21 2008 > @@ -23,20 +23,19 @@ > > <session-factory> > <property > name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property> > - <property > name="hibernate.connection.url">jdbc:hsqldb:file:target/unit-testdb</property> > + <property > name="hibernate.connection.url">jdbc:hsqldb:mem:test</property> > <property name="hibernate.connection.username">sa</property> > <property > name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property> > > <property name="show_sql">true</property> > <property name="format_sql">true</property> > - <property name="hbm2ddl.auto">create-drop</property> > - > + <property name="hbm2ddl.auto">update</property> > + > <property name="hibernate.c3p0.min_size">5</property> > <property name="hibernate.c3p0.max_size">20</property> > <property name="hibernate.c3p0.timeout">300</property> > <property name="hibernate.c3p0.max_statements">50</property> > <property name="hibernate.c3p0.idle_test_period">3000</property> > - > </session-factory> > > > > Added: > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/webapp/EncodeEntities.tml > URL: > http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/test/webapp/EncodeEntities.tml?rev=634989&view=auto > > ============================================================================== > --- > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/webapp/EncodeEntities.tml > (added) > +++ > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/webapp/EncodeEntities.tml > Sat Mar 8 07:23:21 2008 > @@ -0,0 +1,6 @@ > +<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd"> > +<body> > + <p>entity name: <span id="name"><t:if > test="user">${user.firstName}</t:if></span></p> > + <p>create entity: <t:eventlink event="create" > t:id="createentity">create an entity</t:eventlink></p> > +</body> > +</html> > \ No newline at end of file > > Modified: > tapestry/tapestry5/trunk/tapestry-hibernate/src/test/webapp/Start.tml > URL: > http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/test/webapp/Start.tml?rev=634989&r1=634988&r2=634989&view=diff > > ============================================================================== > --- tapestry/tapestry5/trunk/tapestry-hibernate/src/test/webapp/Start.tml > (original) > +++ tapestry/tapestry5/trunk/tapestry-hibernate/src/test/webapp/Start.tml > Sat Mar 8 07:23:21 2008 > @@ -4,6 +4,5 @@ > </head> > <body> > <h2>Test application for tapestry-hibernate integration tests</h2> > - The Hibernate session: <span id="session">${session}</span> > </body> > </html> > > >
-- Howard M. Lewis Ship Creator Apache Tapestry and Apache HiveMind --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
