[ 
https://issues.apache.org/jira/browse/ISIS-1063?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Dan Haywood resolved ISIS-1063.
-------------------------------
    Resolution: Fixed

Fixed in previous work on JAXB view models...

ISIS-915 and ISIS-1251: use JAXB to create memento for the Recreatabl…

https://github.com/apache/isis/commit/9163f6db4fd5214057ee3562e0fae2c52ce0df36


> View models with mandatory enum properties are not initialized correctly.
> -------------------------------------------------------------------------
>
>                 Key: ISIS-1063
>                 URL: https://issues.apache.org/jira/browse/ISIS-1063
>             Project: Isis
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: core-1.8.0
>            Reporter: Dan Haywood
>            Assignee: Dan Haywood
>             Fix For: 1.12.0
>
>
> ... because deep within Isis, in PersistenceSession#createViewModelInstance, 
> there is some code that initializes all mandatory fields of a pojo just after 
> an adapter has been created for it.
> This has the effect of trampling the state on the pojo that was created by 
> from the view model's memento.
> here's one possible fix:
> {code}
>     public ObjectAdapter createViewModelInstance(final ObjectSpecification 
> objectSpec, final String memento) {
>         if (LOG.isDebugEnabled()) {
>             LOG.debug("creating view model instance of " + objectSpec);
>         }
>         final Object pojo = objectSpec.createObject();
>         final ViewModelFacet facet = 
> objectSpec.getFacet(ViewModelFacet.class);
>         //
>         // the code below is horrid... we effectively initialize the view 
> model pojo twice from the memento.
>         // An alternative would be to not do the default initialize above, 
> but that might change behaviour
>         //
>         // we initialize the pojo here in order to be able to build the OID
>         facet.initialize(pojo, memento);
>         final ObjectAdapter adapter = getAdapterManager().adapterFor(pojo);
>         // next, (legacy behaviour... remove?) we initialize the pojo (set 
> default values for any non-optional fields)
>         // nb: this could have the effect of overwriting some of the state 
> just set up
>         objectSpec.initialize(adapter);
>         // so finally we re-initialize, in order to reinstate any state that 
> might have been overwritten.
>         facet.initialize(pojo, memento);
>         return adapter;
>     }
> {code}
> However, perhaps we should simply not do the defaulting for view models at 
> all, on the basis that it's the view model's own responsibility to set up its 
> entire state.
> So another possible fix is simply:
> {code}
>     public ObjectAdapter createViewModelInstance(final ObjectSpecification 
> objectSpec, final String memento) {
>         if (LOG.isDebugEnabled()) {
>             LOG.debug("creating view model instance of " + objectSpec);
>         }
>         final Object pojo = objectSpec.createObject();
>         final ViewModelFacet facet = 
> objectSpec.getFacet(ViewModelFacet.class);
>         facet.initialize(pojo, memento);
>         final ObjectAdapter adapter = getAdapterManager().adapterFor(pojo);
>         // no longer initialize the pojo for any default values 
>         return adapter;
>     }
> {code}



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

Reply via email to