SORMAS-Project icon indicating copy to clipboard operation
SORMAS-Project copied to clipboard

Sharing a case back to the original sender fails due to failed deletion in surveillance tool

Open JonasCir opened this issue 3 years ago • 7 comments

Bug Description

Split from #9836.

A rough summary: A shares a case with B and hands over ownership, and then B shares the received case back with A, again handing over ownership. Then the deletion from SurvNet fails.

Stack trace is the following (trimmed) on instance B:

failed to delete shared entities in external surveillance tool (de.symeda.sormas.backend.sormastosormas.SormasToSormasFacadeEjb.java:246)
de.symeda.sormas.api.externalsurveillancetool.ExternalSurveillanceToolException: Fehler beim Löschen des Eintrags
	at de.symeda.sormas.backend.externalsurveillancetool.ExternalSurveillanceToolGatewayFacadeEjb.sendDeleteRequest(ExternalSurveillanceToolGatewayFacadeEjb.java:179)
	at de.symeda.sormas.backend.externalsurveillancetool.ExternalSurveillanceToolGatewayFacadeEjb.deleteCases(ExternalSurveillanceToolGatewayFacadeEjb.java:140)
de.symeda.sormas.backend.externalsurveillancetool.__EJB31_Generated__ExternalSurveillanceToolGatewayFacadeEjb$ExternalSurveillanceToolGatewayFacadeEjbLocal__Intf____Bean__.deleteCases(Unknown Source)
	at de.symeda.sormas.backend.sormastosormas.share.shareinfo.SormasToSormasShareInfoService.handleOwnershipChangeInExternalSurvTool(SormasToSormasShareInfoService.java:261)
	at de.symeda.sormas.backend.sormastosormas.share.shareinfo.SormasToSormasShareInfoService.handleOwnershipChangeInExternalSurvTool(SormasToSormasShareInfoService.java:238)	de.symeda.sormas.backend.sormastosormas.share.shareinfo.__EJB31_Generated__SormasToSormasShareInfoService__Intf____Bean__.handleOwnershipChangeInExternalSurvTool(Unknown Source)
	at de.symeda.sormas.backend.sormastosormas.SormasToSormasFacadeEjb.requestAccepted(SormasToSormasFacadeEjb.java:244)
	at de.symeda.sormas.api.sormastosormas.__SormasToSormasFacade_Remote_DynamicStub.requestAccepted(de/symeda/sormas/api/sormastosormas/__SormasToSormasFacade_Remote_DynamicStub.java)
	at de.symeda.sormas.api.sormastosormas._SormasToSormasFacade_Wrapper.requestAccepted(de/symeda/sormas/api/sormastosormas/_SormasToSormasFacade_Wrapper.java)
	at de.symeda.sormas.rest.SormasToSormasResource.lambda$acceptedShareRequests$15(SormasToSormasResource.java:149)
	at de.symeda.sormas.rest.SormasToSormasResource.handleVoidRequest(SormasToSormasResource.java:186)
	at de.symeda.sormas.rest.SormasToSormasResource.acceptedShareRequests(SormasToSormasResource.java:149)
	at de.symeda.sormas.rest.SormasToSormasResource$Proxy$_$$_WeldSubclass.acceptedShareRequests$$super(Unknown Source)
	

Please note that stack trace contains requestAccepted from S2S but I'm quite certain from looking at the code that this can be reproduced with share/accept feature disabled which should make the reproduction shorter.

Please note that the converter errors, not SORMAS directly. Maybe its worth to be a little bit more resilient here in SORMAS.

Steps to Reproduce

  1. SORMAS A: Create a case on SORMAS A and add an external ID, external token, internal token and general comment + external ID of pathogen result
  2. SORMAS A: Send the case to SORMAS B with hand over the ownership
  3. SORMAS B: Change the external token, internal token and general comment on SORMAS B
  4. SORMAS B: Save the case
  5. SORMAS B: Open the case on SORMAS B and send the case back to SORMAS A with hand over the ownership
  6. SORMAS B: Errors with stack trace above
  7. SORMAS A: case not shared back

Expected Behavior

No error with external surveillance tool and SORMAS A receives the case back in the last step of the reproduction.

Additional Information

IMPORTANT: As a first step, make sure that you can reproduce the issue if not, reach out to @JonasCir and @SahaLinaPrueger .

Properties are:

sormas2sormas.ignoreProperty.additionalDetails=false
sormas2sormas.ignoreProperty.externalId=false
sormas2sormas.ignoreProperty.externalToken=false
sormas2sormas.ignoreProperty.internalToken=false

JonasCir avatar Jul 26 '22 13:07 JonasCir

@markusmann-vg @SahaLinaPrueger @JonasCir

The question is how tight should the SurvNet and SORMAS be coupled. Is it a problem if the case doesn't get deleted in SurvNet after the ownership is lost?

leventegal-she avatar Jul 27 '22 08:07 leventegal-she

after the ownership is lost = after a case is shared with hand over the ownership ? If a case is shared with hand over the ownership it is mandatory that the case will be deleted in the SurvNet of the sending organisation (source system). Otherwise the case may also be sent to survnet in the target system. This would lead to the case being reported twice, in the source and target system, and this would distort the statistics. So whenever a case is shared with hand over the ownership, the case in the associated survnet of the instance must be deleted.

SahaLinaPrueger avatar Jul 27 '22 09:07 SahaLinaPrueger

after the ownership is lost = after a case is shared with hand over the ownership ?

Yes

So whenever a case is shared with hand over the ownership, the case in the associated survnet of the instance must be deleted.

Then in SORMAS we just have adjust the message that it couldn't be sent due to an error when deleting for SurvNet.

And we need another ticket for the SurvNet converter with more details about the issue, maybe a stack trace or a few lines from the log.

If the converter is not running for SORMAS B, then someone responsible for the infrastructure should be notified.

leventegal-she avatar Jul 27 '22 10:07 leventegal-she

@leventegal-she agreed :) showing an error and aborting the share operation is enough here

I filed another issue w.r.t. better error messages happening on the remote instance: https://github.com/hzi-braunschweig/SORMAS-Project/issues/9956

JonasCir avatar Jul 27 '22 12:07 JonasCir

@SahaLinaPrueger Can you try to get the Converter logs?

JonasCir avatar Jul 27 '22 12:07 JonasCir

So I'm still waiting for the correct converter logs, once I have them, I'm going to close this and open one ticket in the converter repo @AndyBakcsy-she

JonasCir avatar Aug 02 '22 11:08 JonasCir

2022-07-29 10:26:07.333 ERROR 1 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[.[dispatcherServlet]      : Servlet.service() for servlet [dispatcherServlet] in context with path [/survnet] threw exception [Request processing failed; nested exception is de.symeda.sormas.exception.TransformationException: Ungültige GUID: External ID] with root cause

de.symeda.sormas.exception.TransformationException: Ungültige GUID: External ID
	at de.symeda.sormas.transformer.converter.GuidConverter.externalIdToGuid(GuidConverter.java:27) ~[classes!/:13.0.1]
	at de.symeda.sormas.transformer.converter.GuidConverter.convert(GuidConverter.java:18) ~[classes!/:13.0.1]
	at de.symeda.sormas.service.AdminService.lambda$delete$23(AdminService.java:296) ~[classes!/:13.0.1]
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source) ~[na:na]
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(Unknown Source) ~[na:na]
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source) ~[na:na]
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) ~[na:na]
	at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(Unknown Source) ~[na:na]
	at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Unknown Source) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) ~[na:na]
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source) ~[na:na]
	at java.base/java.util.stream.ReferencePipeline.collect(Unknown Source) ~[na:na]
	at de.symeda.sormas.service.AdminService.delete(AdminService.java:297) ~[classes!/:13.0.1]
	at de.symeda.sormas.service.AdminService$$FastClassBySpringCGLIB$$7a72fc7e.invoke(<generated>) ~[classes!/:13.0.1]
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.15.jar!/:5.3.15]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783) ~[spring-aop-5.3.15.jar!/:5.3.15]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.15.jar!/:5.3.15]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) ~[spring-aop-5.3.15.jar!/:5.3.15]
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.15.jar!/:5.3.15]
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.15.jar!/:5.3.15]
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.15.jar!/:5.3.15]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.15.jar!/:5.3.15]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) ~[spring-aop-5.3.15.jar!/:5.3.15]
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698) ~[spring-aop-5.3.15.jar!/:5.3.15]
	at de.symeda.sormas.service.AdminService$$EnhancerBySpringCGLIB$$f66b3ee8.delete(<generated>) ~[classes!/:13.0.1]
	at de.symeda.sormas.controller.AdminController.delete(AdminController.java:125) ~[classes!/:13.0.1]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Unknown Source) ~[na:na]
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.15.jar!/:5.3.15]
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.15.jar!/:5.3.15]
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.15.jar!/:5.3.15]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.15.jar!/:5.3.15]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.15.jar!/:5.3.15]
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.15.jar!/:5.3.15]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067) ~[spring-webmvc-5.3.15.jar!/:5.3.15]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.15.jar!/:5.3.15]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.15.jar!/:5.3.15]
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.15.jar!/:5.3.15]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:681) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.15.jar!/:5.3.15]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.56.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.15.jar!/:5.3.15]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.15.jar!/:5.3.15]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.15.jar!/:5.3.15]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.15.jar!/:5.3.15]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96) ~[spring-boot-actuator-2.6.3.jar!/:2.6.3]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.15.jar!/:5.3.15]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.15.jar!/:5.3.15]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.15.jar!/:5.3.15]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1732) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]

2022-07-29 10:26:47.853 ERROR 1 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[.[dispatcherServlet]      : Servlet.service() for servlet [dispatcherServlet] in context with path [/survnet] threw exception [Request processing failed; nested exception is de.symeda.sormas.exception.TransformationException: Ungültige GUID: External ID] with root cause

de.symeda.sormas.exception.TransformationException: Ungültige GUID: External ID
	at de.symeda.sormas.transformer.converter.GuidConverter.externalIdToGuid(GuidConverter.java:27) ~[classes!/:13.0.1]
	at de.symeda.sormas.transformer.converter.GuidConverter.convert(GuidConverter.java:18) ~[classes!/:13.0.1]
	at de.symeda.sormas.service.AdminService.lambda$delete$23(AdminService.java:296) ~[classes!/:13.0.1]
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source) ~[na:na]
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(Unknown Source) ~[na:na]
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source) ~[na:na]
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) ~[na:na]
	at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(Unknown Source) ~[na:na]
	at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Unknown Source) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) ~[na:na]
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source) ~[na:na]
	at java.base/java.util.stream.ReferencePipeline.collect(Unknown Source) ~[na:na]
	at de.symeda.sormas.service.AdminService.delete(AdminService.java:297) ~[classes!/:13.0.1]
	at de.symeda.sormas.service.AdminService$$FastClassBySpringCGLIB$$7a72fc7e.invoke(<generated>) ~[classes!/:13.0.1]
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.15.jar!/:5.3.15]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783) ~[spring-aop-5.3.15.jar!/:5.3.15]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.15.jar!/:5.3.15]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) ~[spring-aop-5.3.15.jar!/:5.3.15]
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.15.jar!/:5.3.15]
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.15.jar!/:5.3.15]
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.15.jar!/:5.3.15]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.15.jar!/:5.3.15]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) ~[spring-aop-5.3.15.jar!/:5.3.15]
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698) ~[spring-aop-5.3.15.jar!/:5.3.15]
	at de.symeda.sormas.service.AdminService$$EnhancerBySpringCGLIB$$f66b3ee8.delete(<generated>) ~[classes!/:13.0.1]
	at de.symeda.sormas.controller.AdminController.delete(AdminController.java:125) ~[classes!/:13.0.1]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Unknown Source) ~[na:na]
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.15.jar!/:5.3.15]
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.15.jar!/:5.3.15]
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.15.jar!/:5.3.15]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.15.jar!/:5.3.15]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.15.jar!/:5.3.15]
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.15.jar!/:5.3.15]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067) ~[spring-webmvc-5.3.15.jar!/:5.3.15]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.15.jar!/:5.3.15]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.15.jar!/:5.3.15]
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.15.jar!/:5.3.15]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:681) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.15.jar!/:5.3.15]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.56.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.15.jar!/:5.3.15]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.15.jar!/:5.3.15]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.15.jar!/:5.3.15]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.15.jar!/:5.3.15]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96) ~[spring-boot-actuator-2.6.3.jar!/:2.6.3]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.15.jar!/:5.3.15]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.15.jar!/:5.3.15]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.15.jar!/:5.3.15]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1732) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.56.jar!/:na]
	at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]

JonasCir avatar Aug 10 '22 09:08 JonasCir

@SahaLinaPrueger When sharing a case from A -> B and then back from B -> A, do you still encounter an error in the SurvNet converter?

JonasCir avatar Oct 04 '22 11:10 JonasCir

@leventegal-she @HolgerReiseVSys

The following scenario was reproduced on the following environments: test1402 & release-x

  1. Health Department B sends back a case that was sent from Health Department A with ownership as they do not consider to be responsible. Sending a case back should delete the case in the System of B and trigger automatically the survnet Converter, so that SurvNet of Health Department B is informed that this case is deleted. This seems not to work. Sending a case with ownership to another health department, which is not A, triggers the deletion update information for SurvNet.

  2. When Health Department A gets the formerly sent case back, they should be able to send that case again, but not as a new case but as an updated case. This means with sending to survnet, the case should be updated in SurvNet (no longer deleted).

Case 1 looks to me like a SORMAS Issue, Case 2 might be checked in the SurvNet Converter (and mabye SORMAS)

Please comment as this has to be solved within 1.76 and converter 15.

markusmann-vg avatar Oct 04 '22 13:10 markusmann-vg

The stack trace of SurvNet converter indicates that the value of the external id of the case does not satisfy the following regexp: \{[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}\}

HolgerReiseVSys avatar Oct 05 '22 07:10 HolgerReiseVSys

So went through the reproduction and it seems to work as intended: circle

So this is from A. I reported it, handed over ownership, changed the ID on the other side, shared back with ownership and above picture is the result.

JonasCir avatar Oct 05 '22 14:10 JonasCir

Also I was not able to change the external ID to something not matching the regex at any point in time b/c it is always grayed out.

JonasCir avatar Oct 05 '22 14:10 JonasCir

So I argue that everything works fine with deletion and sharing. The question is more how @SahaLinaPrueger was able to set the external ID to something invalid :smile:

JonasCir avatar Oct 05 '22 14:10 JonasCir

@markusmann-vg Is it ok to reassign this ticket to 1.77? This doesn't seem like a blocker issue and should not block 1.76. As per Jonas's last comment this isn't reproducible.

AndyBakcsy-she avatar Oct 12 '22 12:10 AndyBakcsy-she

This Issue can be closed if:

The following properties are set on both test-systems: #sormas2sormas.ignoreProperty.additionalDetails=false #sormas2sormas.ignoreProperty.externalId=false #sormas2sormas.ignoreProperty.externalToken=false #sormas2sormas.ignoreProperty.internalToken=false

And the following is working:

  1. Health Department B sends back a case that was sent from Health Department A with ownership as they do not consider to be responsible. Sending a case back should delete the case in the System of B and trigger automatically the survnet Converter, so that SurvNet of Health Department B is informed that this case is deleted.
  2. When Health Department A gets the formerly sent case back, they should be able to send that case again, but not as a new case but as an updated case. This means with sending to survnet, the case should be updated in SurvNet (no longer deleted).

Of course this should also work if the properties are set on = true. I wanted to test this, but on 1402 SurvNet is currently broken. So i have no option to verify this right now.

If this works with the properties set on = true the issue can be moved to 1.77. If this works with the properties set on = true AND on = false the issue can be closed.

SahaLinaPrueger avatar Oct 12 '22 13:10 SahaLinaPrueger

We close this ticket as it's partially not reproducable. Point 2 of the last comment will result in a new ticket, that needs to be specified => https://github.com/hzi-braunschweig/SORMAS-Project/issues/10619

markusmann-vg avatar Oct 12 '22 14:10 markusmann-vg