Update root entity merge calls to use new merge method.
[taxeditor.git] / eu.etaxonomy.taxeditor.cdmlib / src / main / java / eu / etaxonomy / taxeditor / service / CdmServiceRequestExecutor.java
1 package eu.etaxonomy.taxeditor.service;
2
3 import java.io.IOException;
4 import java.io.OutputStream;
5
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;
11
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;
17
18 @Component
19 public class CdmServiceRequestExecutor extends CdmAuthenticatedHttpInvokerRequestExecutor {
20
21 private static final Logger logger = Logger.getLogger(CdmServiceRequestExecutor.class);
22
23 private ICdmEntitySessionManager cdmEntitySessionManager ;
24
25 private RemoteInvocation currentRemoteInvocation;
26
27
28
29 @Override
30 protected void writeRemoteInvocation(RemoteInvocation invocation, OutputStream os) throws IOException {
31 if(cdmEntitySessionManager == null) {
32 cdmEntitySessionManager =
33 ((CdmApplicationRemoteController)CdmApplicationState.getCurrentAppConfig()).getCdmEntitySessionManager();
34 }
35 currentRemoteInvocation = invocation;
36 super.writeRemoteInvocation(invocation, os);
37 }
38
39 @Override
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);
45
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
49
50 if(rir == null) {
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);
61 } else {
62 rir = new RemoteInvocationResult(cdmEntitySessionManager.load(rir.getValue(), true));
63 }
64 } else if(rir.getValue() instanceof UpdateResult){
65 UpdateResult result = (UpdateResult)rir.getValue();
66 if(result.isOk()){
67 cdmEntitySessionManager.load(result, true);
68 }
69 } else {
70 rir = new RemoteInvocationResult(cdmEntitySessionManager.load(rir.getValue(), false));
71 }
72 }
73 cache(currentRemoteInvocation, rir);
74 }
75 currentRemoteInvocation = null;
76
77 return rir;
78 }
79
80 public void cache(RemoteInvocation ri, RemoteInvocationResult rir) {
81
82 }
83
84 public RemoteInvocationResult fromCache(RemoteInvocation ri) {
85 return null;
86 }
87 }