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;
+ }
+}