Further to this, as an additional "safety measure" I've introduced three new configuration properties that allow this visibilty filtering to be disabled. They are documented at [1], [2].
I've left the feature as enabled by default because I don't believe there are any adverse side-effects from having it enabled. In particular, the WrapperFactory, as used in integration tests and elsewhere - should still work ok. Thanks Dan [1] http://isis.apache.org/guides/rg.html#_rg_runtime_configuring-core [2] http://isis.apache.org/guides/rg.html#_rg_runtime_configuring-core_filterVisibility On 23 August 2015 at 18:24, Dan Haywood <[email protected]> wrote: > Hi Nacho (and Oscar)... > > OK, I've pushed a commit... [1] could you retest? > > You'll see that I didn't got with your design... doing a clear() and > addAll() on the collection returned by DataNucleus (for a regular managed > "parented" collection) might result in unexpected side effects. So instead > the code always returns a copy of the collection, with just the visible > objects. However, it now takes care to ensure that the compile time type > of that collection is compatible with the underlying method's return type. > > One thing I wasn't completely certain on is what to do if the method's > return type isn't one of the standard ones (List, Set, SortedSet, > ArrayList, Collection etc). I decided to revert to returning the > unfiltered collection, but an alternative design would be to fail fast. > Opinions welcome. > > If this all works ok, then I'll cut a release. > > Thanks > Dan > > > [1] > https://github.com/apache/isis/commit/9417a0d01608ba640b881e391be8c8b0529b1321 > > > On 20 August 2015 at 10:15, Dan Haywood <[email protected]> > wrote: > >> Hi Nacho, >> >> Thanks for checking this out, and you are right, of course... the code >> should take the return type of the getter into account. >> >> I'll tidy up your code by way of a fix. >> >> Thanks again, >> Dan >> On 20 Aug 2015 09:40, "Nacho Cánovas Rejón" <[email protected]> >> wrote: >> >>> Hi Dan. >>> >>> In order to test new changes on 1.9.0 release, I think I find some bug. >>> >>> My problem is in "*ISIS-1044: fixing by filtering the >>> PropertyAccessorFacet and CollectionAccessorFacet, also the >>> ActionInvocationFacet (for contributed collections/properties):*" issue. >>> >>> You modified "*getProperty*" method on class >>> "*CollectionAccessorFacetViaAccessor*". I show you the code: >>> >>> *OLD Code* >>> >>> final Object collectionOrArray = >>> ObjectAdapter.InvokeUtils.invoke(method, owningAdapter); >>> >>> *NEW Code* >>> >>> final Object collectionOrArray = >>> ObjectAdapter.InvokeUtils.invoke(method, owningAdapter); >>> >>> final ObjectAdapter collectionAdapter = >>> getAdapterManager().adapterFor(collectionOrArray); >>> >>> final FacetedMethod facetedMethod = (FacetedMethod) getFacetHolder(); >>> final Class<?> collectionElementType = facetedMethod.getType(); >>> >>> final List<ObjectAdapter> visibleAdapters = >>> ObjectAdapter.Util.visibleAdapters( >>> collectionAdapter, >>> authenticationSession, deploymentCategory); >>> final List<Object> visibleObjects = Lists.newArrayList( >>> Iterables.transform(visibleAdapters, >>> ObjectAdapter.Functions.getObject())); >>> >>> return visibleObjects; >>> >>> Now I explain my problem. >>> >>> I have for example this property defined in one of my entities. >>> >>> private SortedSet<Product> customSelectedProducts = new >>> TreeSet<Product>(); >>> >>> public SortedSet<Product> getCustomSelectedProducts() { >>> return this.customSelectedProducts; >>> } >>> >>> public void setCustomSelectedProducts( >>> final SortedSet<Product> customSelectedProducts) { >>> this.customSelectedProducts = customSelectedProducts; >>> } >>> >>> And when I try to get his value, I received: >>> >>> java.lang.ClassCastException: java.util.ArrayList cannot be cast to >>> java.util.SortedSet >>> >>> You will see that you return always an ArrayList when it's a Collection, >>> but maybe there is other kind of collections (SortedSet in my case) and it >>> will failed on get method. >>> >>> I did some dirty and not to well modification for performance to work >>> with it in order to advance changing next code: >>> >>> final List<Object> visibleObjects = Lists.newArrayList( >>> Iterables.transform(visibleAdapters, >>> ObjectAdapter.Functions.getObject())); >>> >>> return visibleObjects; >>> * >>> **to* >>> >>> ((Collection) collectionOrArray).clear(); >>> ((Collection) collectionOrArray).addAll(Lists.newArrayList( >>> Iterables.transform(visibleAdapters, >>> ObjectAdapter.Functions.getObject()))); >>> >>> return collectionOrArray; >>> >>> I have the same problem in method "*invoke*" from class >>> "*ActionInvocationFacetForDomainEventAbstract*" and I fixed it with a >>> similar way than last mail: >>> >>> final List<Object> visibleObjects = >>> Lists.newArrayList(Lists.transform( >>> visibleAdapters, ObjectAdapter.Functions.getObject())); >>> final ObjectAdapter visibleObjectsAsAdapter = >>> getAdapterManager().adapterFor(visibleObjects); >>> >>> *to* >>> >>> ((Collection<Object>) result).clear(); >>> ((Collection<Object>) >>> result).addAll(Lists.newArrayList(Lists.transform(visibleAdapters, >>> ObjectAdapter.Functions.getObject()))); >>> >>> final ObjectAdapter visibleObjectsAsAdapter = >>> this.getAdapterManager().adapterFor(result); >>> >>> I hope you're well. >>> >>> Best regards and thanks. >>> >>> -- >>> Ignacio Cánovas Rejón >>> Tel. 902 900 231 >>> Fax 96 353 19 09 >>> [email protected] >>> www.gesconsultor.com >>> >>> Este mensaje y los ficheros anexos son confidenciales. Los mismos >>> contienen información reservada que no puede ser difundida. Si usted ha >>> recibido este correo por error, tenga la amabilidad de eliminarlo de su >>> sistema y avisar al remitente mediante reenvío a su dirección electrónica; >>> no deberá copiar el mensaje ni divulgar su contenido a ninguna persona. >>> >>> Su dirección de correo electrónico junto a sus datos personales constan >>> en un fichero titularidad de GESDATOS SOFTWARE S.L. cuya finalidad es la de >>> mantener el contacto con Ud. Si quiere saber de qué información disponemos >>> de Ud., modificarla, y en su caso, cancelarla, puede hacerlo enviando un >>> escrito al efecto, acompañado de una fotocopia de su D.N.I. a la siguiente >>> dirección: GESDATOS SOFTWARE S.L. Av. Cortes Valencianas 50-1º-C, C.P. >>> 46015 de Valencia. Asimismo, es su responsabilidad comprobar que este >>> mensaje o sus archivos adjuntos no contengan virus informáticos, y en caso >>> que los tuvieran eliminarlos. >>> >>> >>> >>> --- >>> El software de antivirus Avast ha analizado este correo electrónico en >>> busca de virus. >>> http://www.avast.com >>> >> >
