tsgrp / HPI

OpenContent Management Suite (OCMS)
http://www.tsgrp.com/products
17 stars 5 forks source link

CopyWizardForm - Execution Failing in ACS 7+ #2439

Closed engerernoah closed 3 years ago

engerernoah commented 3 years ago

The Copy Wizard Form Action Execution is failing for certain forms in ACS 7+ more research is needed to determine exact conditions for this error.

This is likely related to https://github.com/tsgrp/HPI/issues/2430 (Complex Form's JSON Rendition Invalid After Publish in Alfresco 7 in ACA PnP). These popped up in Alfresco 7 with the update of the json jar. Here is the stack trace produced by the error:

[2021-09-08 15:59:07,840|ERROR|RESTService|sendErrorResponse|193] error in execute copy form com.tsgrp.opencontent.core.exception.OCRuntimeException: error in execute copy form at com.tsgrp.opencontent.wizard.action.executer.CopyWizardFormActionExecuter.executeImpl(CopyWizardFormActionExecuter.java:101) at com.tsgrp.opencontent.core.action.executer.AbstractActionExecuter.executeImpl(AbstractActionExecuter.java:239) at com.tsgrp.opencontent.core.action.executer.AbstractActionExecuter.execute(AbstractActionExecuter.java:226) at com.tsgrp.opencontent.core.action.executer.AbstractActionExecuter.evaluateAndExecute(AbstractActionExecuter.java:156) at com.tsgrp.opencontent.core.action.service.CoreActionService.execute(CoreActionService.java:475) at com.tsgrp.opencontent.core.action.service.RESTAction.executeActionPost(RESTAction.java:224) at jdk.internal.reflect.GeneratedMethodAccessor2167.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962) 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:652) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at com.tsgrp.opencontent.rest.filter.OCTimingFilter.doFilterInternal(OCTimingFilter.java:83) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.alfresco.module.aosmodule.service.ContextRootFilter.doFilter(ContextRootFilter.java:93) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.alfresco.web.app.servlet.ServletMetricsFilter.doFilter(ServletMetricsFilter.java:161) at org.alfresco.repo.web.filter.beans.BeanProxyFilter.doFilter(BeanProxyFilter.java:89) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.alfresco.web.app.servlet.GlobalLocalizationFilter.doFilter(GlobalLocalizationFilter.java:68) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.alfresco.web.app.servlet.ClearSecurityContextFilter.doFilter(ClearSecurityContextFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.apache.catalina.filters.CorsFilter.handleNonCORS(CorsFilter.java:352) at org.apache.catalina.filters.CorsFilter.doFilter(CorsFilter.java:171) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687) at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:764) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: java.lang.ClassCastException: class java.lang.String cannot be cast to class org.json.JSONObject (java.lang.String is in module java.base of loader 'bootstrap'; org.json.JSONObject is in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @28a6301f) at com.tsgrp.opencontent.wizard.action.executer.CopyWizardFormActionExecuter.getUserInputRules(CopyWizardFormActionExecuter.java:149) at com.tsgrp.opencontent.wizard.action.executer.CopyWizardFormActionExecuter.executeImpl(CopyWizardFormActionExecuter.java:80) ... 65 more

This appears to fail on userInput.get("rules") (line 149) which attempts to cast a string to a JSONObject. This is likely related to the previously mentioned issue as it was found this rules object is being set to an empty string.

Updates will be added to this issue.

engerernoah commented 3 years ago

Fix with OC Revision: 26988 XML TO JSON, REPLACE EMPTY STRINGS WITH EMPTY OBJECTS - We updated the version of the JSON jar we pull in since newer versions of ACS use updated JSON jars, however with the newer jars the xml to json conversion was updated. Previously empty XML tags were set to empty JSONObjects in the converted JSON, however in newer versions the empty XML tags were set to empty strings in the converted JSON. We had a few places in our code that expected empty JSONObjects and thus had some failures. Linked below are two github issues that were the result of the new jar using empty strings. To fix this we created a util function in the JSONUtil to convert empty strings to empty objects, we don't want to do this for every empty string in the JSON however as there could be empty attributes such as name or type that came from the XML. Therefore, we set up a whitelist of XML tag names to convert from empty string to empty object in the wizard config. The whitelist can be found in the wizard-defaults.properties file and is accessed through a getter in the wizard config. Any area in the wizard code calling the XML to JSON method now calls the util function immediately after with the whitelist from the wizard config. CR aking, skovacinski

engerernoah commented 3 years ago

Reopening, needs fix to be compatible across json jars

engerernoah commented 3 years ago

Updated OC Revision for compatibility across JSON jars - 26999 JSONUTIL UPDATING JSON ITERATION TO WORK WITH ALL JARS - Needed to update the json iteration process to support older json jars utilized in older alfresco versions. We cannot use the keySet function across all jars switching to keys iterator.

CR: aking, skovacinski