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()