The changes involved in this update are:
Change PrimaryObject.alias to "TEMPLATE"
Change PrimaryObject.field1 to 10
Change PrimaryObject.field2 to 0
Change PrimaryObject.subObjectC from SubObjectC(ID 2) to SubObjectC(ID 1)
Browser request:
{ "F" : "com.my.package.gwt.shared.MyRequestFactory",
"I" : [ { "O" : "j_yEHCJ9k$WUFHgn__u$bEm7haU=",
"P" : [ { "S" : "IjEi",
"T" : "AK9V76Rtc6gMKi9lbRBXpR_Vfsc="
} ],
"R" : [ "subobjectb.subobjecta",
"subobjectc.subobjecta",
"subobjecta",
"subobjectb",
"subobjectc"
]
} ],
"O" : [ { "O" : "UPDATE",
"P" : { "alias" : "TEMPLATE",
"field1" : 10,
"field2" : 0,
"subobjecta" : { "S" : "IjMi",
"T" : "xSFY59dKciM_bQDRhOYtCU94gBw="
},
"subobjectb" : { "S" : "IjEi",
"T" : "HtxC4B1dhRC9YcFi2VSkpbkVpcY="
},
"subobjectc" : { "S" : "IjEi",
"T" : "VJdvF9mvxcVn$KJmLjACkBkrjhw="
}
},
"S" : "IjEi",
"T" : "AK9V76Rtc6gMKi9lbRBXpR_Vfsc=",
"V" : "IjEzMjg2Mjc0MzI2Mzki"
},
{ "O" : "UPDATE",
"S" : "IjMi",
"T" : "xSFY59dKciM_bQDRhOYtCU94gBw=",
"V" : "IjEzMjM0NDUxNDMxODci"
},
{ "O" : "UPDATE",
"P" : { "subobjecta" : { "S" : "IjEi",
"T" : "xSFY59dKciM_bQDRhOYtCU94gBw="
} },
"S" : "IjEi",
"T" : "HtxC4B1dhRC9YcFi2VSkpbkVpcY=",
"V" : "IjEzMTk1NzUyOTgzNDgi"
},
{ "O" : "UPDATE",
"S" : "IjEi",
"T" : "xSFY59dKciM_bQDRhOYtCU94gBw=",
"V" : "IjEzMTk1NzUyOTA1NTQi"
},
{ "O" : "UPDATE",
"P" : { "subobjecta" : { "S" : "IjEi",
"T" : "xSFY59dKciM_bQDRhOYtCU94gBw="
} },
"S" : "IjIi",
"T" : "VJdvF9mvxcVn$KJmLjACkBkrjhw=",
"V" : "IjEzMjg2MjczOTk4NzQi"
}
]
}
Object Graph:
PrimaryObject
|
+--SubObjectA
+--SubObjectB
| |
| +--SubObjectA
|
+--SubObjectC
|
+--SubObjectA
Order of operations seen in the ServiceLayerDecorator:
1. Load PrimaryObject(ID 1)
2. Load SubObjectA(ID 3)
3. Load SubObjectB(ID 1)
4. Load SubObjectA(ID 1)
5. Load SubObjectC(ID 2)
6. PrimaryObject.setAlias(TEMPLATE)
7. PrimaryObject.setSubObjectA(SubObjectA(ID 3))
8. PrimaryObject.setField1(10)
9. PrimaryObject.setField2(0)
10. PrimaryObject.setSubObjectB(SubObjectB(ID 1))
11. LoadDomainObject SubObjectC(ID 1) <<-- This load after dirtying the PrimaryObject causes the flush
Stack trace at breakpoint 11:
ServiceLayerCache(ServiceLayerDecorator).loadDomainObject(Class<T>, Object) line: 121
ReflectiveServiceLayer.loadDomainObjects(List<Class<?>>, List<Object>) line: 221
LocatorServiceLayer(ServiceLayerDecorator).loadDomainObjects(List<Class<?>>, List<Object>) line: 126
MyServiceLayerDecorator(ServiceLayerDecorator).loadDomainObjects(List<Class<?>>, List<Object>) line: 126
ServiceLayerCache(ServiceLayerDecorator).loadDomainObjects(List<Class<?>>, List<Object>) line: 126
RequestState.getBeansForIds(List<SimpleProxyId<?>>) line: 267
RequestState.getBeansForPayload(List<IdMessage>) line: 147
RequestState.getBeanForPayload(Splittable) line: 124
EntityCodex.decode(EntitySource, Class<?>, Class<?>, Splittable) line: 101
MySimpleRequestProcessor$1.visitReferenceProperty(String, AutoBean<?>, PropertyContext) line: 547
ProxyAutoBean<T>.traverseProperties(AutoBeanVisitor, AbstractAutoBean$OneShotContext) line: 324
ProxyAutoBean<T>(AbstractAutoBean<T>).traverse(AutoBeanVisitor, AbstractAutoBean$OneShotContext) line: 166
ProxyAutoBean<T>(AbstractAutoBean<T>).accept(AutoBeanVisitor) line: 101
MySimpleRequestProcessor.processOperationMessages(RequestState, RequestMessage) line: 537
MySimpleRequestProcessor.process(RequestMessage, ResponseMessage) line: 210
MySimpleRequestProcessor.process(String) line: 127
MyRequestFactoryServlet.doPost(HttpServletRequest, HttpServletResponse) line: 153
MyRequestFactoryServlet(HttpServlet).service(HttpServletRequest, HttpServletResponse) line: 637
MyRequestFactoryServlet(HttpServlet).service(ServletRequest, ServletResponse) line: 717
ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 290
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 206
PageFilter(SiteMeshFilter).obtainContent(ContentProcessor, SiteMeshWebAppContext, HttpServletRequest, HttpServletResponse, FilterChain) line: 129
PageFilter(SiteMeshFilter).doFilter(ServletRequest, ServletResponse, FilterChain) line: 77
ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 235
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 206
OpenEntityManagerInViewFilter.doFilterInternal(HttpServletRequest, HttpServletResponse, FilterChain) line: 113
OpenEntityManagerInViewFilter(OncePerRequestFilter).doFilter(ServletRequest, ServletResponse, FilterChain) line: 76
ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 235
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 206
FilterChainProxy$VirtualFilterChain.doFilter(ServletRequest, ServletResponse) line: 368
FilterSecurityInterceptor.invoke(FilterInvocation) line: 109
FilterSecurityInterceptor.doFilter(ServletRequest, ServletResponse, FilterChain) line: 83
FilterChainProxy$VirtualFilterChain.doFilter(ServletRequest, ServletResponse) line: 380
ExceptionTranslationFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 97
FilterChainProxy$VirtualFilterChain.doFilter(ServletRequest, ServletResponse) line: 380
SessionManagementFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 100
FilterChainProxy$VirtualFilterChain.doFilter(ServletRequest, ServletResponse) line: 380
AnonymousAuthenticationFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 78
FilterChainProxy$VirtualFilterChain.doFilter(ServletRequest, ServletResponse) line: 380
SecurityContextHolderAwareRequestFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 54
FilterChainProxy$VirtualFilterChain.doFilter(ServletRequest, ServletResponse) line: 380
RequestCacheAwareFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 35
FilterChainProxy$VirtualFilterChain.doFilter(ServletRequest, ServletResponse) line: 380
UsernamePasswordAuthenticationFilter(AbstractAuthenticationProcessingFilter).doFilter(ServletRequest, ServletResponse, FilterChain) line: 187
FilterChainProxy$VirtualFilterChain.doFilter(ServletRequest, ServletResponse) line: 380
UsernamePasswordAuthenticationFilter(AbstractAuthenticationProcessingFilter).doFilter(ServletRequest, ServletResponse, FilterChain) line: 187
FilterChainProxy$VirtualFilterChain.doFilter(ServletRequest, ServletResponse) line: 380
UsernamePasswordAuthenticationFilter(AbstractAuthenticationProcessingFilter).doFilter(ServletRequest, ServletResponse, FilterChain) line: 187
FilterChainProxy$VirtualFilterChain.doFilter(ServletRequest, ServletResponse) line: 380
LogoutFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 105
FilterChainProxy$VirtualFilterChain.doFilter(ServletRequest, ServletResponse) line: 380
SecurityContextPersistenceFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: 79
FilterChainProxy$VirtualFilterChain.doFilter(ServletRequest, ServletResponse) line: 380
FilterChainProxy.doFilter(ServletRequest, ServletResponse, FilterChain) line: 169
DelegatingFilterProxy.invokeDelegate(Filter, ServletRequest, ServletResponse, FilterChain) line: 237
DelegatingFilterProxy.doFilter(ServletRequest, ServletResponse, FilterChain) line: 167
ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 235
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 206
StandardWrapperValve.invoke(Request, Response) line: 233
StandardContextValve.invoke(Request, Response) line: 191
StandardHostValve.invoke(Request, Response) line: 127
ErrorReportValve.invoke(Request, Response) line: 102
StandardEngineValve.invoke(Request, Response) line: 109
CoyoteAdapter.service(Request, Response) line: 298
Http11Processor.process(Socket) line: 857
Http11Protocol$Http11ConnectionHandler.process(Socket) line: 588
JIoEndpoint$Worker.run() line: 489
Thread.run() line: 662
(The custom Decorator, RequestProcessor, and Servlet are all identical to the 2.4 version except for a bit more error logging)