[ https://issues.apache.org/jira/browse/ISIS-1976?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16638211#comment-16638211 ]
ASF subversion and git services commented on ISIS-1976: ------------------------------------------------------- Commit eac84c28380aa19b7e0e8d7a945e5f146dbb6a58 in isis's branch refs/heads/v2 from [~hobrom] [ https://gitbox.apache.org/repos/asf?p=isis.git;h=eac84c2 ] ISIS-1976: remove guava from DN-4/5 plugins Task-Url: https://issues.apache.org/jira/browse/ISIS-1976 > Improve the metamodel cache management > -------------------------------------- > > Key: ISIS-1976 > URL: https://issues.apache.org/jira/browse/ISIS-1976 > Project: Isis > Issue Type: Improvement > Components: Core > Reporter: Andi Huber > Assignee: Andi Huber > Priority: Major > Fix For: 2.0.0-M2 > > > The cache management we have with ObjectAdapter, might be simplified such > that we just work with java.lang.Object so far as possible. We would have a > "disposable" ObjectAdapter that we instantiate around an Object whenever we > need it - to access into the metamodel - and then throw it away after. Or > perhaps eventually we might not need ObjectAdapter at all, just simply use > #getClass() to look up the ObjectSpecification. > ~~~ > The main objective is to get rid of these two maps: > [https://github.com/apache/isis/blob/master/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidAdapterHashMap.java] > and > [https://github.com/apache/isis/blob/master/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/PojoAdapterHashMap.java] > As their name suggests, these map: > oid -> adapter (look up an adapter from an oid) > pojo -> adapter (look up an adapter from a pojo) > The adapter itself has a reference to its oid (getOid()) and to its pojo > (getObject()). > Most, though not all, objects have Oids. Certainly DN persistent objects do, > in fact they do even if they are not yet persisted (prior to calling > RepositoryService#persist(...). These will have a RootOid, which will > indicate if the object is persistent or still transient. > The same is true of view models, these also have a RootOid. They also have a > RecreatableObjectFacet which is used to actually manufacture the Oid (because > the oid for view models is basically a serialization of the state of the > domain object). The RootOid for view models will indicate that they are view > models. > Values (ints, strings etc), do NOT have an oid. This also means that - > obviously - they don't get saved in the OidAdapterHashMap; and they probably > aren't saved in PojoAdapterHashMap. Value objects will have a ValueFacet. > There's one other subtype of Oid (apart from RootOid), namely > ParentedCollectionOid. That's because the Set or List that holds "child" > objects is also managed as an adapter; ie: > {code:java} > public class Order { > @Getter @Setter > Set<OrderItem> orderItems = Sets.newTreeSet(); > ... > }{code} > Why is this done? Because a long time ago (before DN) the framework did its > own persistence, so this was for lazy loading etc. > > The "ensureMapsConsistent" method in PersistenceSessionXxx is there to ensure > that these are maintained correctly; it's rather paranoid because if these > get out of sync, then bad things would happen; eg: > [https://github.com/apache/isis/blob/master/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java#L1184] > > There's also some rather horrible "remapRecreatedPojo" methods that hack this > stuff > [https://github.com/apache/isis/blob/master/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java#L1739] > > All this stuff is a legacy from the original client/server architecture that > the framework used to have; it was probably needed then but I really don't > think it's needed now. > ~~~ > At the moment the object adapters are created eagerly, typically using > PersistenceSession#adapterFor(...). For domain services, we eagerly create > an adapter around every service before each session, "just in case" it gets > interacted with. This could be removed > [https://github.com/apache/isis/blob/master/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java#L237] > > > This also requires the ability to infer the Oid from the pojo, on the fly. > There are two different ways this is done: > * for DN entities, there is the JdoObjectIdSerlaizer > * for view models, there's RecreatableObjectFacet, already mentioned. > [https://github.com/apache/isis/blob/master/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java] > > Ideally the code to recreate/rehydrate the object should define a consistent > API to the rest of the framework. My thinking is that it could perhaps be a > pluggable service so that we can then support other persistence runtime > stores ... The idea is that the framework encounters a pojo and then asks for > a service (via an SPI) to see which can extract/infer an Oid from it, using > the usual chain-of-responsibility pattern. Out-of-the-box the framework > would provide two default implementations, one for DN entities (JdoIdHelper), > the other for view models. > > ~~~~~~ > Looking forward, ideally, PersistenceSession shouldn't need to use > ObjectAdapter at all; the ObjectAdapter really exists only for the viewer(s) > etc to obtain the ObjectSpecification to know how to render the object. > Ultimately, we could get rid of ObjectAdapter completely and just uses pojos > (=domain objects) everywhere. ObjectSpecification would remain, though. I > think this is for other tickets, though, not this one. > > ~~~~~~ > OK, hopefully some the above makes sense!!! > -- This message was sent by Atlassian JIRA (v7.6.3#76005)