Index: magnolia-core/src/main/java/info/magnolia/freemarker/models/UserModel.java =================================================================== --- magnolia-core/src/main/java/info/magnolia/freemarker/models/UserModel.java (revision 21286) +++ magnolia-core/src/main/java/info/magnolia/freemarker/models/UserModel.java Mon Jan 25 18:32:24 CET 2010 @@ -49,6 +49,8 @@ * @version $Revision: $ ($Author: $) */ class UserModel extends BeanModel { + private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(UserModel.class); + static final MagnoliaModelFactory FACTORY = new MagnoliaModelFactory() { public Class factoryFor() { return User.class; @@ -72,8 +74,13 @@ if (result != null) { return result; } + try { - return new SimpleScalar(user.getProperty(key)); + return new SimpleScalar(user.getProperty(key)); + } catch (UnsupportedOperationException e) { + log.debug("getProperty({}) threw an UnsupportedOperationException: {}", key, e.getMessage()); + return null; - } + } + } public User asUser() { return this.user; Index: magnolia-core/src/test/java/info/magnolia/freemarker/FreemarkerHelperTest.java =================================================================== --- magnolia-core/src/test/java/info/magnolia/freemarker/FreemarkerHelperTest.java (revision 31148) +++ magnolia-core/src/test/java/info/magnolia/freemarker/FreemarkerHelperTest.java Mon Jan 25 18:28:49 CET 2010 @@ -574,6 +574,19 @@ verify(user); } + public void testUserUnsupportedExceptionFallback() throws Exception { + tplLoader.putTemplate("test.ftl", "${user.name} is my name, fullName: ${user.fullName!user.name}, testProp: ${user.testProp!'default'} !"); + final User user = createStrictMock(User.class); + expect(user.getName()).andReturn("myName"); + expect(user.getProperty("fullName")).andThrow(new UnsupportedOperationException("getProperty:fullName")); + expect(user.getName()).andReturn("myName"); + expect(user.getProperty("testProp")).andThrow(new UnsupportedOperationException("getProperty:testValue")); + + replay(user); + assertRendereredContent("myName is my name, fullName: myName, testProp: default !", createSingleValueMap("user", user), "test.ftl"); + verify(user); + } + public void testNodeNameCanBeRenderedImplicitely() throws Exception { tplLoader.putTemplate("test.ftl", "This should output the node's name: ${content}"); final Map root = createSingleValueMap("content", new MockContent("myNode"));