Documentation
Documentation copied to clipboard
ChangeFirmwareRequest: wrong firmware path after model update
If the firmware is created with one model and later on model is changed, a firmware path doesn't reflect this change and firmware can not be deleted anymore.
For example: Create FW with manufacturer=LAGY and model=Landis_and_Gyr-T_E360_CDMA_SMR5.1_energy_meter
path=/var/www/html/firmware/LAGY/Landis_and_Gyr-T_E360_CDMA_SMR5.1_energy_meter/test-firmware.fw
Update FW with model=E360 CD2D GPRS SMR5
new path should be: /var/www/html/firmware/LAGY/E360_CD2D_GPRS_SMR5/test-firmware.fw
Stacktrace:
2020-06-29 10:28:34.506] [dev-box] [ajp-nio-8009-exec-15] INFO o.o.a.w.e.WebServiceMonitorInterceptor@printSoapMessage:338 - soap message: <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header><OrganisationIdentification xmlns="http://www.op
ensmartgridplatform.org/schemas/common">test-org</OrganisationIdentification><ApplicationName xmlns="http://www.opensmartgridplatform.org/schemas/common">client-application</ApplicationName><UserName xmlns="http://www.opensmartgridplatform.org/schemas/common">client-application-use
r</UserName></SOAP-ENV:Header><SOAP-ENV:Body><ns2:RemoveFirmwareRequest xmlns:ns2="http://www.opensmartgridplatform.org/schemas/common/firmwaremanagement/2014/10" xmlns:ns3="http://www.opensmartgridplatform.org/schemas/common/2014/10" xmlns:ns4="http://www.opensmartgridplatform.org
/schemas/devicemanagement/2014/10"><ns2:Id>4</ns2:Id></ns2:RemoveFirmwareRequest></SOAP-ENV:Body></SOAP-ENV:Envelope>
2020-06-29 10:28:34.507] [dev-box] [ajp-nio-8009-exec-15] INFO o.o.a.w.c.e.FirmwareManagementEndpoint@removedFirmware:814 - Removing firmware with id:4.
2020-06-29 10:28:34.509] [dev-box] [ajp-nio-8009-exec-15] INFO o.o.d.core.services.SecurityService@checkAuthorization:84 - Organisation test-org is allowed function REMOVE_FIRMWARE
2020-06-29 10:28:34.514] [dev-box] [ajp-nio-8009-exec-15] INFO o.o.a.w.c.a.s.DeviceManagementService@supplyfirmwareFileNotFoundException:715 - FirmwareFile not found for id 4.
2020-06-29 10:28:34.518] [dev-box] [ajp-nio-8009-exec-15] ERROR o.o.a.w.c.e.FirmwareManagementEndpoint@removedFirmware:832 - Exception: [null, 4, test-org] while removing firmware: {} for organisation {}
java.lang.NullPointerException: null
at org.opensmartgridplatform.adapter.ws.core.application.services.FirmwareManagementService.removePhysicalFirmwareFile(FirmwareManagementService.java:802)
at org.opensmartgridplatform.adapter.ws.core.application.services.FirmwareManagementService.removeFirmware(FirmwareManagementService.java:702)
at org.opensmartgridplatform.adapter.ws.core.application.services.FirmwareManagementService$$FastClassBySpringCGLIB$$b1a2241.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:120)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691)
at org.opensmartgridplatform.adapter.ws.core.application.services.FirmwareManagementService$$EnhancerBySpringCGLIB$$410b0d99.removeFirmware(<generated>)
at org.opensmartgridplatform.adapter.ws.core.endpoints.FirmwareManagementEndpoint.removedFirmware(FirmwareManagementEndpoint.java:818)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.ws.server.endpoint.MethodEndpoint.invoke(MethodEndpoint.java:134)
at org.springframework.ws.server.endpoint.adapter.DefaultMethodEndpointAdapter.invokeInternal(DefaultMethodEndpointAdapter.java:291)
at org.springframework.ws.server.endpoint.adapter.AbstractMethodEndpointAdapter.invoke(AbstractMethodEndpointAdapter.java:55)
at org.springframework.ws.server.MessageDispatcher.dispatch(MessageDispatcher.java:236)
at org.springframework.ws.server.MessageDispatcher.receive(MessageDispatcher.java:176)
at org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection(WebServiceMessageReceiverObjectSupport.java:89)
at org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter.handle(WebServiceMessageReceiverHandlerAdapter.java:61)
at org.springframework.ws.transport.http.MessageDispatcherServlet.doService(MessageDispatcherServlet.java:293)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at psiprobe.Tomcat90AgentValve.invoke(Tomcat90AgentValve.java:35)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.ajp.AjpProcessor.service(AjpProcessor.java:399)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1598)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
@ThE-MaRaC,
Thank you for reporting this issue. I found that updating the device model can lead to the problem you describe. There are 2 solutions I can think of:
- prevent changing the device model when firmware files are present for the device model (which could be similar to the implementation of the checks in the function org.opensmartgridplatform.adapter.ws.core.application.services.FirmwareManagementService#removeDeviceModel(String, String, String))
- updating the folder on the file system
The first option is the best fit for the behavior of our client application which manages manufacturers, device models and firmware files. I will discuss this issue with the team.