1 package eu
.etaxonomy
.taxeditor
.service
;
3 import java
.io
.IOException
;
4 import java
.io
.OutputStream
;
6 import org
.apache
.log4j
.Logger
;
7 import org
.springframework
.remoting
.httpinvoker
.HttpInvokerClientConfiguration
;
8 import org
.springframework
.remoting
.support
.RemoteInvocation
;
9 import org
.springframework
.remoting
.support
.RemoteInvocationResult
;
10 import org
.springframework
.stereotype
.Component
;
12 import eu
.etaxonomy
.cdm
.api
.application
.CdmApplicationRemoteController
;
13 import eu
.etaxonomy
.cdm
.api
.application
.CdmApplicationState
;
14 import eu
.etaxonomy
.cdm
.api
.service
.UpdateResult
;
15 import eu
.etaxonomy
.cdm
.persistence
.dto
.MergeResult
;
16 import eu
.etaxonomy
.taxeditor
.session
.ICdmEntitySessionManager
;
19 public class CdmServiceRequestExecutor
extends CdmAuthenticatedHttpInvokerRequestExecutor
{
21 private static final Logger logger
= Logger
.getLogger(CdmServiceRequestExecutor
.class);
23 private ICdmEntitySessionManager cdmEntitySessionManager
;
25 private RemoteInvocation currentRemoteInvocation
;
30 protected void writeRemoteInvocation(RemoteInvocation invocation
, OutputStream os
) throws IOException
{
31 if(cdmEntitySessionManager
== null) {
32 cdmEntitySessionManager
=
33 ((CdmApplicationRemoteController
)CdmApplicationState
.getCurrentAppConfig()).getCdmEntitySessionManager();
35 currentRemoteInvocation
= invocation
;
36 super.writeRemoteInvocation(invocation
, os
);
40 protected RemoteInvocationResult
doExecuteRequest(HttpInvokerClientConfiguration config
,
41 java
.io
.ByteArrayOutputStream baos
)
42 throws java
.io
.IOException
,
43 java
.lang
.ClassNotFoundException
{
44 RemoteInvocationResult rir
= fromCache(currentRemoteInvocation
);
46 // if rir is not null at this point we assume that the
47 // the object has already been loaded in the cache and
48 // does not need to be reloaded
51 logger
.info("Remote invoking : " + currentRemoteInvocation
.getMethodName() + "@" + config
.getServiceUrl());
52 rir
= super.doExecuteRequest(config
, baos
);
53 if(rir
.getValue() != null && !rir
.hasException()) {
54 if("merge".equals(currentRemoteInvocation
.getMethodName()) ||
55 "save".equals(currentRemoteInvocation
.getMethodName()) ||
56 "findWithUpdate".equals(currentRemoteInvocation
.getMethodName())) {
57 if(rir
.getValue() instanceof MergeResult
) {
58 MergeResult result
= (MergeResult
) rir
.getValue();
59 cdmEntitySessionManager
.load(result
.getMergedEntity(), true);
60 cdmEntitySessionManager
.load(result
.getNewEntities(), true);
62 rir
= new RemoteInvocationResult(cdmEntitySessionManager
.load(rir
.getValue(), true));
64 } else if(rir
.getValue() instanceof UpdateResult
){
65 UpdateResult result
= (UpdateResult
)rir
.getValue();
67 cdmEntitySessionManager
.load(result
, true);
70 rir
= new RemoteInvocationResult(cdmEntitySessionManager
.load(rir
.getValue(), false));
73 cache(currentRemoteInvocation
, rir
);
75 currentRemoteInvocation
= null;
80 public void cache(RemoteInvocation ri
, RemoteInvocationResult rir
) {
84 public RemoteInvocationResult
fromCache(RemoteInvocation ri
) {