Author: hlship
Date: Fri Jan  1 23:15:08 2010
New Revision: 895090

URL: http://svn.apache.org/viewvc?rev=895090&view=rev
Log:
TAP5-944: When a ValueEncoder is unable to convert an id to a entity, it should 
wrap the underlying type coercion exception to describe the input and expected 
output type

Modified:
    tapestry/tapestry5/trunk/.gitignore
    
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/HibernateEntityValueEncoder.java
    
tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry5/internal/hibernate/HibernateEntityValueEncoderTest.java

Modified: tapestry/tapestry5/trunk/.gitignore
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/.gitignore?rev=895090&r1=895089&r2=895090&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/.gitignore (original)
+++ tapestry/tapestry5/trunk/.gitignore Fri Jan  1 23:15:08 2010
@@ -7,3 +7,4 @@
 *.iws
 target
 test-output
+temp-testng*.xml
\ No newline at end of file

Modified: 
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/HibernateEntityValueEncoder.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/HibernateEntityValueEncoder.java?rev=895090&r1=895089&r2=895090&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/HibernateEntityValueEncoder.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-hibernate/src/main/java/org/apache/tapestry5/internal/hibernate/HibernateEntityValueEncoder.java
 Fri Jan  1 23:15:08 2010
@@ -41,8 +41,8 @@
 
     private final Logger logger;
 
-    public HibernateEntityValueEncoder(Class<E> entityClass, PersistentClass 
persistentClass, Session session,
-                                       PropertyAccess propertyAccess, 
TypeCoercer typeCoercer, Logger logger)
+    public HibernateEntityValueEncoder(Class<E> entityClass, PersistentClass 
persistentClass,
+            Session session, PropertyAccess propertyAccess, TypeCoercer 
typeCoercer, Logger logger)
     {
         this.entityClass = entityClass;
         this.session = session;
@@ -53,20 +53,23 @@
 
         idPropertyName = property.getName();
 
-        propertyAdapter = 
propertyAccess.getAdapter(this.entityClass).getPropertyAdapter(idPropertyName);
+        propertyAdapter = 
propertyAccess.getAdapter(this.entityClass).getPropertyAdapter(
+                idPropertyName);
     }
 
-
     public String toClient(E value)
     {
-        if (value == null) return null;
+        if (value == null)
+            return null;
 
         Object id = propertyAdapter.get(value);
 
         if (id == null)
-            throw new IllegalStateException(String.format(
-                    "Entity %s has an %s property of null; this probably means 
that it has not been persisted yet.",
-                    value, idPropertyName));
+            throw new IllegalStateException(
+                    String
+                            .format(
+                                    "Entity %s has an %s property of null; 
this probably means that it has not been persisted yet.",
+                                    value, idPropertyName));
 
         return typeCoercer.coerce(id, String.class);
     }
@@ -74,9 +77,23 @@
     @SuppressWarnings("unchecked")
     public E toValue(String clientValue)
     {
-        if (InternalUtils.isBlank(clientValue)) return null;
+        if (InternalUtils.isBlank(clientValue))
+            return null;
+
+        Object id = null;
+
+        try
+        {
 
-        Object id = typeCoercer.coerce(clientValue, propertyAdapter.getType());
+            id = typeCoercer.coerce(clientValue, propertyAdapter.getType());
+        }
+        catch (Exception ex)
+        {
+            throw new RuntimeException(String.format(
+                    "Exception converting '%s' to instance of %s (id type for 
entity %s): %s",
+                    clientValue, propertyAdapter.getType().getName(), 
entityClass.getName(),
+                    InternalUtils.toMessage(ex)), ex);
+        }
 
         Serializable ser = Defense.cast(id, Serializable.class, "id");
 
@@ -84,8 +101,10 @@
 
         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));
+            // 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;

Modified: 
tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry5/internal/hibernate/HibernateEntityValueEncoderTest.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry5/internal/hibernate/HibernateEntityValueEncoderTest.java?rev=895090&r1=895089&r2=895090&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry5/internal/hibernate/HibernateEntityValueEncoderTest.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-hibernate/src/test/java/org/apache/tapestry5/internal/hibernate/HibernateEntityValueEncoderTest.java
 Fri Jan  1 23:15:08 2010
@@ -68,7 +68,6 @@
         HibernateEntityValueEncoder<SampleEntity> encoder = new 
HibernateEntityValueEncoder<SampleEntity>(
                 SampleEntity.class, persistentClass, session, access, 
typeCoercer, logger);
 
-
         try
         {
             encoder.toClient(entity);
@@ -76,8 +75,9 @@
         }
         catch (IllegalStateException ex)
         {
-            assertMessageContains(ex, "Entity 
org.apache.tapestry5.internal.hibernate.SampleEntity",
-                                  "has an id property of null");
+            assertMessageContains(ex,
+                    "Entity 
org.apache.tapestry5.internal.hibernate.SampleEntity",
+                    "has an id property of null");
         }
 
         verify();
@@ -104,11 +104,42 @@
         HibernateEntityValueEncoder<SampleEntity> encoder = new 
HibernateEntityValueEncoder<SampleEntity>(
                 SampleEntity.class, persistentClass, session, access, 
typeCoercer, logger);
 
-
         assertNull(encoder.toValue("12345"));
 
         verify();
+    }
+
+    @Test
+    public void to_value_bad_type_coercion()
+    {
+        Session session = mockSession();
+        Logger logger = mockLogger();
+
+        replay();
 
+        RootClass persistentClass = new RootClass();
+        Property idProperty = new Property();
+        idProperty.setName("id");
+        persistentClass.setIdentifierProperty(idProperty);
+
+        HibernateEntityValueEncoder<SampleEntity> encoder = new 
HibernateEntityValueEncoder<SampleEntity>(
+                SampleEntity.class, persistentClass, session, access, 
typeCoercer, logger);
+
+        try
+        {
+            encoder.toValue("xyz");
+            unreachable();
+        }
+        catch (RuntimeException ex)
+        {
+            assertMessageContains(
+                    ex,
+                    "Exception converting 'xyz' to instance of java.lang.Long 
(id type for entity org.apache.tapestry5.internal.hibernate.SampleEntity)");
+        }
+
+        assertNull(encoder.toValue(""));
+
+        verify();
     }
 
     protected final Session mockSession()


Reply via email to