<!-- 
RSS generated by JIRA (9.4.2#940002-sha1:46d1a51de284217efdcb32434eab47a99af2938b) at Mon Feb 12 09:26:17 CET 2024

It is possible to restrict the fields that are returned in this document by specifying the 'field' parameter in your request.
For example, to request only the issue key and summary append 'field=key&field=summary' to the URL of your request.
-->
<rss version="0.92" >
<channel>
    <title>Magnolia - Issue tracker</title>
    <link>https://jira.magnolia-cms.com</link>
    <description>This file is an XML representation of an issue</description>
    <language>en-uk</language>    <build-info>
        <version>9.4.2</version>
        <build-number>940002</build-number>
        <build-date>19-01-2023</build-date>
    </build-info>


<item>
            <title>[MGNLUI-5415] Break ChainedAction execution sequence on failure gracefully</title>
                <link>https://jira.magnolia-cms.com/browse/MGNLUI-5415</link>
                <project id="10625" key="MGNLUI">Magnolia UI</project>
                    <description>&lt;p&gt;The&#160;info.magnolia.ui.contentapp.action.ChainedAction#ChainedAction currently keeps executing actions irrespective of whether there is a failure (validation) in an Action. &lt;/p&gt;

&lt;p&gt;In order to prevent further validation checks on dependent actions, failing actions have two choices - either duplicate validation logic or throw an Exception. &lt;/p&gt;

&lt;p&gt;Throwing Exception propagates all the way to the parent UI as RpcInvocationException for a very simple thing such as form validation failure. In order to avoid this behavior, the action sequence has to duplicate this validation in subsequent actions, which has it&apos;s own side effects of code duplication and suboptimal performance due to dependent ActionDefinition objects created and executed each time the chain sequence is executed.&lt;/p&gt;</description>
                <environment></environment>
        <key id="80218">MGNLUI-5415</key>
            <summary>Break ChainedAction execution sequence on failure gracefully</summary>
                <type id="3" iconUrl="https://jira.magnolia-cms.com/secure/viewavatar?size=xsmall&amp;avatarId=10898&amp;avatarType=issuetype">Task</type>
                                            <priority id="6" iconUrl="https://jira.magnolia-cms.com/images/icons/priorities/neutral.gif">Neutral</priority>
                        <status id="6" iconUrl="https://jira.magnolia-cms.com/images/icons/statuses/closed.png" description="The issue is considered finished, the resolution is correct. Issues which are not closed can be reopened.">Closed</status>
                    <statusCategory id="3" key="done" colorName="success"/>
                                    <resolution id="2">Won&apos;t Fix</resolution>
                                        <assignee username="rdhar">Rishab Dhar</assignee>
                                    <reporter username="rdhar">Rishab Dhar</reporter>
                        <labels>
                            <label>UI</label>
                    </labels>
                <created>Wed, 9 Oct 2019 12:06:42 +0200</created>
                <updated>Wed, 10 Mar 2021 13:16:59 +0100</updated>
                            <resolved>Wed, 10 Mar 2021 13:16:59 +0100</resolved>
                                    <version>6.2</version>
                                                        <due></due>
                            <votes>0</votes>
                                    <watches>2</watches>
                                                    <progress percentage="6">
                                    <originalProgress>
                                                    <row percentage="0" backgroundColor="#89afd7"/>
                                                    <row percentage="100" backgroundColor="transparent"/>
                                            </originalProgress>
                                                    <currentProgress>
                                                    <row percentage="6" backgroundColor="#51a825"/>
                                                    <row percentage="94" backgroundColor="#ec8e00"/>
                                            </currentProgress>
                            </progress>
                                    <aggregateprogress percentage="6">
                                    <originalProgress>
                                                    <row percentage="0" backgroundColor="#89afd7"/>
                                                    <row percentage="100" backgroundColor="transparent"/>
                                            </originalProgress>
                                                    <currentProgress>
                                                    <row percentage="6" backgroundColor="#51a825"/>
                                                    <row percentage="94" backgroundColor="#ec8e00"/>
                                            </currentProgress>
                            </aggregateprogress>
                                            <timeestimate seconds="18000">5h</timeestimate>
                            <timespent seconds="1320">22m</timespent>
                                <comments>
                            <comment id="199323" author="rkovarik" created="Wed, 9 Oct 2019 12:47:05 +0200"  >&lt;p&gt;Hard to believe this as exceptions are not swallowed anywhere, so the other actions can&apos;t be executed.&lt;/p&gt;

&lt;p&gt;Maybe the &quot;failure&quot; in your case is just failed validation which is not a &quot;real&quot; failure?&lt;/p&gt;</comment>
                            <comment id="199332" author="rdhar" created="Wed, 9 Oct 2019 13:37:53 +0200"  >&lt;p&gt;No the follow up Actions do not execute, but the problem is if I throw an Exception on validation failure, it shows RpcExecutionException on UI, which is quite misleading from UX perspective. Duplication of validation logic to prevent dependent action executions to prevent RpcInvocationException seems not optimal. Not to mention it leads to code duplication in a long chain of actions just for mere validation check and performance drop (n loop iterations where n is the number of chained actions defined).&lt;/p&gt;</comment>
                            <comment id="199338" author="rkovarik" created="Wed, 9 Oct 2019 14:09:43 +0200"  >&lt;blockquote&gt;&lt;p&gt;No the follow up Actions do not execute,&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Doesn&apos;t this statement contradict with the ticket description?&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&#160;it shows RpcExecutionException on UI&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;so it&apos;s a general problem, not a chained action problem right?&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&#160;Duplication of validation logic to prevent dependent action executions to prevent RpcInvocationException seems not optimal.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;every action would probably validate different things (e.g. first action validates the form, whereas second validates e.g. if there is new item created to operate on...)&lt;/p&gt;</comment>
                            <comment id="199346" author="rdhar" created="Wed, 9 Oct 2019 14:48:27 +0200"  >&lt;blockquote&gt;&lt;p&gt; Doesn&apos;t this statement contradict with the ticket description? &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;What I meant is validation failure in the chain, not exception failure. My assumption was that let&apos;s say I have validation check in an Action, but not in dependent Actions, the chain continues executing, dependent actions. This like I said in my previous comment can be solved in two ways currently which I mentioned. Neither one of which is currently optimal.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&#160;so it&apos;s a general problem, not a chained action problem right? &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Partially yes, because the ChainedAction is trying to execute ActionDefinitions but doesn&apos;t have the API necessary from info.magnolia.ui.contentapp.browser.ActionExecutionService because of which it has a custom ActionExecutor defined which directly invokes the ActionExecutor API to execute an Action, which does not handle Exceptions gracefully. As the ActionExecutionService was being delegated to do this graceful handling, ChainedAction should probably do this as well.&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;
 @Override
 &lt;span class=&quot;code-keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;code-keyword&quot;&gt;final&lt;/span&gt; void execute(&lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt; actionName, &lt;span class=&quot;code-object&quot;&gt;Object&lt;/span&gt;... args) &lt;span class=&quot;code-keyword&quot;&gt;throws&lt;/span&gt; ActionExecutionException {
        &lt;span class=&quot;code-keyword&quot;&gt;try&lt;/span&gt; {
            Action action = createAction(actionName, args);
            action.execute();
        } &lt;span class=&quot;code-keyword&quot;&gt;catch&lt;/span&gt; (RuntimeException e) {
            &lt;span class=&quot;code-keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt; ActionExecutionException(&lt;span class=&quot;code-quote&quot;&gt;&quot;Action execution failed &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; action: &quot;&lt;/span&gt; + actionName, e);
        }
 }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&#160;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt; every action would probably validate different things (e.g. first action validates the form, whereas second validates e.g. if there is new item created to operate on...) &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;If the form validation itself failed, it is redundant to check whether an item has been created. This just adds more complexity unnecessarily to mask the problem of non graceful handling at ChainedAction.&lt;/p&gt;</comment>
                            <comment id="199350" author="rkovarik" created="Wed, 9 Oct 2019 15:08:34 +0200"  >&lt;p&gt;It looks like you are trying to use the very simple implementation chained action for your use case but nobody prevents you to implement/extend your custom chained action or implement one action instead of a chain. Wouldn&apos;t that be better...or why do you have to use the chained action while one actions depends on result of another other?&lt;/p&gt;</comment>
                    </comments>
                <issuelinks>
                            <issuelinktype id="10020">
                    <name>dependency</name>
                                            <outwardlinks description="depends upon">
                                        <issuelink>
            <issuekey id="80764">MGNLUI-5455</issuekey>
        </issuelink>
                            </outwardlinks>
                                                        </issuelinktype>
                    </issuelinks>
                <attachments>
                    </attachments>
                <subtasks>
                    </subtasks>
                <customfields>
                                                                            <customfield id="customfield_14166" key="com.okapya.jira.checklist:checklist">
                        <customfieldname>Acceptance criteria</customfieldname>
                        <customfieldvalues>
                            
        <checklist>
        <![CDATA[
                            




                
                                    <div class="o-completion" style="display: flex; flex-shrink: 0;"><span  class="aui-lozenge aui-lozenge-complete" style="font-size: 12px; font-weight: normal; display: flex; flex-direction: row; align-items: center;" ><span style="padding-right: 4px; vertical-align: middle;"><svg width="15" height="15" viewBox="0 0 15 15" xmlns="http://www.w3.org/2000/svg" fill="white"><path clip-rule="evenodd" d="m10.41037,3.42544l-7.86501,0c-0.72395,0 -1.31084,0.58688 -1.31084,1.31084l0,7.86508c0,0.7239 0.58689,1.3108 1.31084,1.3108l7.86501,0c0.724,0 1.3109,-0.5869 1.3109,-1.3108l0,-7.86508c0,-0.72396 -0.5869,-1.31084 -1.3109,-1.31084zm-7.86501,-0.65542c-1.08593,0 -1.96626,0.88032 -1.96626,1.96626l0,7.86508c0,1.0859 0.88033,1.9662 1.96626,1.9662l7.86501,0c1.086,0 1.9663,-0.8803 1.9663,-1.9662l0,-7.86508c0,-1.08594 -0.8803,-1.96626 -1.9663,-1.96626l-7.86501,0z" fill-rule="evenodd"/><path d="m5.09049,10.18526l-1.82767,-1.82766l-0.78479,0.78479l2.61246,2.61246l5.38758,-5.38754l-0.78483,-0.78479l-4.60275,4.60274z"/></svg></span><span>Empty</span></span></div>
                        ]]>
    </checklist>


                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                <customfield id="customfield_10111" key="com.atlassian.jira.toolkit:reporterdomain">
                        <customfieldname>Company</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>magnolia-cms.com</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                <customfield id="customfield_10031" key="com.atlassian.jira.ext.charting:firstresponsedate">
                        <customfieldname>Date of First Response</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>Wed, 9 Oct 2019 12:47:05 +0200</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_12730" key="com.atlassian.jira.plugins.jira-development-integration-plugin:devsummary">
                        <customfieldname>Development</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_14151" key="com.atlassian.jira.toolkit:message">
                        <customfieldname>Docu info</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            <customfield id="customfield_10061" key="com.atlassian.jira.toolkit:lastusercommented">
                        <customfieldname>Last comm is not jira-dev</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>false</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10071" key="com.atlassian.jira.toolkit:lastupdaterorcommenter">
                        <customfieldname>Last participant</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>rkovarik</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_13136" key="com.atlassian.jira.toolkit:LastCommentDate">
                        <customfieldname>Last public comment date</customfieldname>
                        <customfieldvalues>
                            4 years, 18 weeks, 4 days ago
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                            <customfield id="customfield_10020" key="com.atlassian.jira.toolkit:attachments">
                        <customfieldname>Number of attachments</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>0.0</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10150" key="com.atlassian.jira.toolkit:comments">
                        <customfieldname>Number of comments</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>5.0</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        <customfield id="customfield_10011" key="com.atlassian.jira.toolkit:participants">
                        <customfieldname>Participants</customfieldname>
                        <customfieldvalues>
                                        <customfieldvalue>rdhar</customfieldvalue>
            <customfieldvalue>rkovarik</customfieldvalue>
    
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                <customfield id="customfield_10833" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>0|y01xt2:</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10244" key="com.pyxis.greenhopper.jira:gh-global-rank">
                        <customfieldname>Rank (Obsolete)</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>9223372036854775807</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                <customfield id="customfield_14167" key="com.okapya.jira.checklist:checklist">
                        <customfieldname>Task DoR</customfieldname>
                        <customfieldvalues>
                            
        <checklist>
        <![CDATA[
                            




                
                                    <div class="o-completion" style="display: flex; flex-shrink: 0;"><span  class="aui-lozenge aui-lozenge-complete" style="font-size: 12px; font-weight: normal; display: flex; flex-direction: row; align-items: center;" ><span style="padding-right: 4px; vertical-align: middle;"><svg width="15" height="15" viewBox="0 0 15 15" xmlns="http://www.w3.org/2000/svg" fill="white"><path clip-rule="evenodd" d="m10.41037,3.42544l-7.86501,0c-0.72395,0 -1.31084,0.58688 -1.31084,1.31084l0,7.86508c0,0.7239 0.58689,1.3108 1.31084,1.3108l7.86501,0c0.724,0 1.3109,-0.5869 1.3109,-1.3108l0,-7.86508c0,-0.72396 -0.5869,-1.31084 -1.3109,-1.31084zm-7.86501,-0.65542c-1.08593,0 -1.96626,0.88032 -1.96626,1.96626l0,7.86508c0,1.0859 0.88033,1.9662 1.96626,1.9662l7.86501,0c1.086,0 1.9663,-0.8803 1.9663,-1.9662l0,-7.86508c0,-1.08594 -0.8803,-1.96626 -1.9663,-1.96626l-7.86501,0z" fill-rule="evenodd"/><path d="m5.09049,10.18526l-1.82767,-1.82766l-0.78479,0.78479l2.61246,2.61246l5.38758,-5.38754l-0.78483,-0.78479l-4.60275,4.60274z"/></svg></span><span>Empty</span></span></div>
                        ]]>
    </checklist>


                        </customfieldvalues>
                    </customfield>
                                                                                                                                                    <customfield id="customfield_14145" key="com.intenso.jira.issue-templates:issue-templates-customfield">
                        <customfieldname>Template</customfieldname>
                        <customfieldvalues>
                            


                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                            <customfield id="customfield_15131" key="com.onresolve.jira.groovy.groovyrunner:scripted-field">
                        <customfieldname>Time in Discovery</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>0</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10032" key="com.atlassian.jira.ext.charting:timeinstatus">
                        <customfieldname>Time in Status</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                            <customfield id="customfield_13933" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>Urgency (resolution)</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="15724"><![CDATA[Normal]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                </customfields>
    </item>
</channel>
</rss>