You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2008/05/14 02:09:34 UTC

svn commit: r656058 - in /tapestry/tapestry5/trunk/tapestry-hibernate/src: main/java/org/apache/tapestry/hibernate/ main/java/org/apache/tapestry/internal/hibernate/ test/java/org/apache/tapestry/internal/hibernate/

Author: hlship
Date: Tue May 13 17:09:33 2008
New Revision: 656058

URL: http://svn.apache.org/viewvc?rev=656058&view=rev
Log:
TAPESTRY-2416: When the HibernateValueEncoder is unable to convert a primary key into an entity, it should log an error

Added:
    tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/internal/hibernate/HibernateEntityValueEncoderTest.java
    tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/internal/hibernate/SampleEntity.java
Modified:
    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/HibernateEntityValueEncoder.java

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=656058&r1=656057&r2=656058&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 Tue May 13 17:09:33 2008
@@ -143,7 +143,8 @@
                                                     final HibernateSessionSource sessionSource,
                                                     final Session session,
                                                     final TypeCoercer typeCoercer,
-                                                    final PropertyAccess propertyAccess)
+                                                    final PropertyAccess propertyAccess,
+                                                    final LoggerSource loggerSource)
     {
         org.hibernate.cfg.Configuration config = sessionSource.getConfiguration();
         Iterator<PersistentClass> mappings = config.getClassMappings();
@@ -157,7 +158,7 @@
                 public ValueEncoder create(Class type)
                 {
                     return new HibernateEntityValueEncoder(entityClass, persistentClass, session, propertyAccess,
-                                                           typeCoercer);
+                                                           typeCoercer, loggerSource.getLogger(entityClass));
                 }
             };
 

Modified: 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=656058&r1=656057&r2=656058&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/HibernateEntityValueEncoder.java (original)
+++ tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry/internal/hibernate/HibernateEntityValueEncoder.java Tue May 13 17:09:33 2008
@@ -23,6 +23,7 @@
 import org.hibernate.Session;
 import org.hibernate.mapping.PersistentClass;
 import org.hibernate.mapping.Property;
+import org.slf4j.Logger;
 
 import java.io.Serializable;
 
@@ -38,12 +39,15 @@
 
     private final PropertyAdapter propertyAdapter;
 
+    private final Logger logger;
+
     public HibernateEntityValueEncoder(Class<E> entityClass, PersistentClass persistentClass, Session session,
-                                       PropertyAccess propertyAccess, TypeCoercer typeCoercer)
+                                       PropertyAccess propertyAccess, TypeCoercer typeCoercer, Logger logger)
     {
         this.entityClass = entityClass;
         this.session = session;
         this.typeCoercer = typeCoercer;
+        this.logger = logger;
 
         Property property = persistentClass.getIdentifierProperty();
 
@@ -76,7 +80,15 @@
 
         Serializable ser = Defense.cast(id, Serializable.class, "id");
 
-        return (E) session.get(entityClass, ser);
+        E result = (E) session.get(entityClass, ser);
+
+        if (result == null)
+        {
+            // We don't identify the entity type in the message because the logger is based on the entity type.
+            logger.error(String.format("Unable to convert client value '%s' into an entity instance.", clientValue));
+        }
+
+        return result;
     }
 
 }

Added: tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/internal/hibernate/HibernateEntityValueEncoderTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/internal/hibernate/HibernateEntityValueEncoderTest.java?rev=656058&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/internal/hibernate/HibernateEntityValueEncoderTest.java (added)
+++ tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/internal/hibernate/HibernateEntityValueEncoderTest.java Tue May 13 17:09:33 2008
@@ -0,0 +1,118 @@
+// 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 org.apache.tapestry.ioc.Registry;
+import org.apache.tapestry.ioc.services.PropertyAccess;
+import org.apache.tapestry.ioc.services.TypeCoercer;
+import org.apache.tapestry.ioc.test.IOCTestCase;
+import org.hibernate.Session;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.RootClass;
+import org.slf4j.Logger;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+public class HibernateEntityValueEncoderTest extends IOCTestCase
+{
+    private Registry registry;
+    private PropertyAccess access;
+    private TypeCoercer typeCoercer;
+
+    @BeforeClass
+    public void setup()
+    {
+        registry = buildRegistry();
+
+        access = registry.getService(PropertyAccess.class);
+        typeCoercer = registry.getService(TypeCoercer.class);
+    }
+
+    @AfterClass
+    public void cleanup()
+    {
+        registry.shutdown();
+
+        registry = null;
+        access = null;
+        typeCoercer = null;
+    }
+
+    @Test
+    public void to_client_id_null()
+    {
+        Session session = mockSession();
+        Logger logger = mockLogger();
+
+        replay();
+
+        RootClass persistentClass = new RootClass();
+        Property idProperty = new Property();
+        idProperty.setName("id");
+        persistentClass.setIdentifierProperty(idProperty);
+        SampleEntity entity = new SampleEntity();
+
+        HibernateEntityValueEncoder<SampleEntity> encoder = new HibernateEntityValueEncoder<SampleEntity>(
+                SampleEntity.class, persistentClass, session, access, typeCoercer, logger);
+
+
+        try
+        {
+            encoder.toClient(entity);
+            unreachable();
+        }
+        catch (IllegalStateException ex)
+        {
+            assertMessageContains(ex, "Entity org.apache.tapestry.internal.hibernate.SampleEntity",
+                                  "has an id property of null");
+        }
+
+        verify();
+    }
+
+    @Test
+    public void to_value_not_found()
+    {
+        Session session = mockSession();
+        Logger logger = mockLogger();
+
+        expect(session.get(SampleEntity.class, new Long(12345))).andReturn(null);
+
+        logger.error("Unable to convert client value '12345' into an entity instance.");
+
+        replay();
+
+        RootClass persistentClass = new RootClass();
+        Property idProperty = new Property();
+        idProperty.setName("id");
+        persistentClass.setIdentifierProperty(idProperty);
+        SampleEntity entity = new SampleEntity();
+
+        HibernateEntityValueEncoder<SampleEntity> encoder = new HibernateEntityValueEncoder<SampleEntity>(
+                SampleEntity.class, persistentClass, session, access, typeCoercer, logger);
+
+
+        assertNull(encoder.toValue("12345"));
+
+        verify();
+
+    }
+
+    protected final Session mockSession()
+    {
+        return newMock(Session.class);
+    }
+}

Added: tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/internal/hibernate/SampleEntity.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/internal/hibernate/SampleEntity.java?rev=656058&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/internal/hibernate/SampleEntity.java (added)
+++ tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry/internal/hibernate/SampleEntity.java Tue May 13 17:09:33 2008
@@ -0,0 +1,38 @@
+// 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 javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * Fake entity used by {@link org.apache.tapestry.internal.hibernate.HibernateEntityValueEncoderTest}.
+ */
+@Entity
+public class SampleEntity
+{
+    @Id
+    private Long id;
+
+    public Long getId()
+    {
+        return id;
+    }
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+}