Martin Makundi created WICKET-5772:
--------------------------------------

             Summary: LoadableDetachableModel caches null value if load() 
fails, bug in getObject() {attached = true;}
                 Key: WICKET-5772
                 URL: https://issues.apache.org/jira/browse/WICKET-5772
             Project: Wicket
          Issue Type: Bug
          Components: wicket
    Affects Versions: 7.0.0-M4, 6.18.0, 1.4.23
            Reporter: Martin Makundi


If you have a LoadableDetachableModel whose load() operation fails at an 
instance, the LoadableDetachableModel will cache null value because 

getObject() method sets attached = true; before load() invocation has returned.

This results in methods trusting LoadableDetachableModel using the null value 
for their operations which is logically incorrect as null might not be a legal 
value at all. Such behavior would result in unexpected difficult-to-debug 
behavior in depending components.

Easy fix:
Move:
attached = true;
after line:
transientModelObject = load();

Test case:


/**
   * LoadableDetachableModel must not return null as an attached value if load()
   * fails.
   */
  public void testWhenLoadFails() {
    final LoadableDetachableModel<Void> loadableDetachableModel = new 
LoadableDetachableModel<Void>() {
      /**
       * @see org.apache.wicket.model.LoadableDetachableModel#load()
       */
      @Override
      protected Void load() {
        throw new UnsupportedOperationException("Let's assume this fails for 
some reason.");
      }
    };
    try {
      loadableDetachableModel.getObject();
      fail(UnsupportedOperationException.class + " expected.");
    } catch (final UnsupportedOperationException e) {
      LoggerFactory.getLogger(LoadableDetachableModel.class).debug("Expected 
behavior due to " + UnsupportedOperationException.class);
    }

    try {
      assertNotSame(LoadableDetachableModel.class + " should not return null if 
it's load() has failed\n", null,
          loadableDetachableModel.getObject());
    } catch (final UnsupportedOperationException e) {
      LoggerFactory.getLogger(LoadableDetachableModel.class).debug("Expected 
behavior due to " + UnsupportedOperationException.class);
    }
  }



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to