<!-- 
RSS generated by JIRA (9.4.2#940002-sha1:46d1a51de284217efdcb32434eab47a99af2938b) at Mon Feb 12 04:13:58 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>[MAGNOLIA-6378] Allow yaml based configuration to make use of groovy</title>
                <link>https://jira.magnolia-cms.com/browse/MAGNOLIA-6378</link>
                <project id="10000" key="MAGNOLIA">Magnolia</project>
                    <description>&lt;p&gt;I am not able to use groovy model classes in yaml based templates definitions.&lt;/p&gt;

&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;2015-09-15 12:31:42,701 WARN  agnolia.config.source.yaml.YamlConfigurationSource: Problem while registering TEMPLATE from LayeredResource{path=&apos;/workshop-module/templates/pages/hello.yaml&apos;, layeredResources=[FileSystemResource{origin=filesystem,path=/workshop-module/templates/pages/hello.yaml,file}]}: Conversion: Error converting from &apos;String&apos; to &apos;Class&apos; info.magnolia.groovy.models.HelloModel
org.apache.commons.beanutils.ConversionException: Error converting from &apos;String&apos; to &apos;Class&apos; info.magnolia.groovy.models.HelloModel
	at org.apache.commons.beanutils.converters.AbstractConverter.handleError(AbstractConverter.java:282)
	at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:177)
	at org.apache.commons.beanutils.converters.ConverterFacade.convert(ConverterFacade.java:61)
	at org.apache.commons.beanutils.ConvertUtilsBean.convert(ConvertUtilsBean.java:491)
	at org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1000)
	at info.magnolia.config.map2bean.Map2BeanTransformer.readOutObject(Map2BeanTransformer.java:184)
	at info.magnolia.config.map2bean.Map2BeanTransformer.readComplexValue(Map2BeanTransformer.java:151)
	at info.magnolia.config.map2bean.Map2BeanTransformer.readValue(Map2BeanTransformer.java:114)
	at info.magnolia.config.map2bean.Map2BeanTransformer.toBean(Map2BeanTransformer.java:101)
	at info.magnolia.config.source.yaml.YamlConfigurationSource.loadAndRegister(YamlConfigurationSource.java:94)
	at info.magnolia.config.source.yaml.AbstractFileResourceConfigurationSource$LoadAndRegisterFunction.doWith(AbstractFileResourceConfigurationSource.java:132)
	at info.magnolia.config.source.yaml.AbstractFileResourceConfigurationSource$LoadAndRegisterFunction.doWith(AbstractFileResourceConfigurationSource.java:113)
	at info.magnolia.resourceloader.util.VoidFunction.apply(VoidFunction.java:49)
	at info.magnolia.resourceloader.util.VoidFunction.apply(VoidFunction.java:46)
	at info.magnolia.resourceloader.util.PredicatedResourceVisitor.visitFile(PredicatedResourceVisitor.java:117)
	at info.magnolia.resourceloader.layered.RelayerResourceVisitor.visitFile(RelayerResourceVisitor.java:61)
	at info.magnolia.resourceloader.file.VisitorFunction.apply(VisitorFunction.java:58)
	at info.magnolia.resourceloader.file.VisitorFunction.apply(VisitorFunction.java:46)
	at info.magnolia.resourceloader.file.FileWatcherCallback.doIt(FileWatcherCallback.java:78)
	at info.magnolia.resourceloader.file.FileWatcherCallback.modified(FileWatcherCallback.java:66)
	at info.magnolia.dirwatch.DirectoryWatcher.processEvent(DirectoryWatcher.java:247)
	at info.magnolia.dirwatch.DirectoryWatcher.run(DirectoryWatcher.java:199)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
	at java.util.concurrent.FutureTask.run(FutureTask.java:262)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: info.magnolia.groovy.models.HelloModel
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1858)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1709)
	at org.apache.commons.beanutils.converters.ClassConverter.convertToType(ClassConverter.java:104)
	at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:169)
	... 25 more
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;
&lt;p&gt;CAUSE AND PROPOSED SOLUTION&lt;/p&gt;

&lt;p&gt;Basically in &lt;tt&gt;Map2Bean&lt;/tt&gt; resolving model classes is delegated to &lt;tt&gt;BeanUtils&lt;/tt&gt; which uses its default class converter &lt;tt&gt;org.apache.commons.beanutils.converters.ClassConverter&lt;/tt&gt;. Code eventually ends up at &lt;tt&gt;ClassConverter.convertToType(..)&lt;/tt&gt; where the context class loader for the current thread is not aware of Groovy classes and thus fails. One way to fix this could be adding a check at &lt;tt&gt;Map2BeanTransformer.readSimpleValue(Object, TypeDescriptor)&lt;/tt&gt;&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;
 &lt;span class=&quot;code-keyword&quot;&gt;private&lt;/span&gt; &amp;lt;T&amp;gt; T readSimpleValue(&lt;span class=&quot;code-object&quot;&gt;Object&lt;/span&gt; source, TypeDescriptor defaultTargetTypeDescriptor) &lt;span class=&quot;code-keyword&quot;&gt;throws&lt;/span&gt; ClassNotFoundException {
        &lt;span class=&quot;code-comment&quot;&gt;// we need to convert classes here &lt;span class=&quot;code-keyword&quot;&gt;else&lt;/span&gt; org.apache.commons.beanutils.converters.ClassConverter (which isn&apos;t aware of Groovy classes) would be used and an exception thrown, e.g. in &lt;span class=&quot;code-keyword&quot;&gt;case&lt;/span&gt; of a Groovy &lt;span class=&quot;code-keyword&quot;&gt;class &lt;/span&gt;model. Basically we need to &lt;span class=&quot;code-keyword&quot;&gt;do&lt;/span&gt; here something similar to what is done at Node2BeanTransformerImpl.convertPropertyValue(..)  
&lt;/span&gt;        &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (defaultTargetTypeDescriptor.getType().isAssignableFrom(&lt;span class=&quot;code-object&quot;&gt;Class&lt;/span&gt;.class)) {
            &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; (T) Classes.getClassFactory().forName((&lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt;) source);
        }
        &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; (T) source;
    }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;One problem I see with this approach is that we throw CNFE which eventually must be thrown by the public API method &lt;tt&gt;Map2BeanTransformer.toBean(..)&lt;/tt&gt; meaning not being binary compatible (unless we catch the exception and just log it or rethrow it wrapped in some exception already thrown by &lt;tt&gt;toBean(..)&lt;/tt&gt;) &lt;/p&gt;</description>
                <environment></environment>
        <key id="47868">MAGNOLIA-6378</key>
            <summary>Allow yaml based configuration to make use of groovy</summary>
                <type id="4" iconUrl="https://jira.magnolia-cms.com/secure/viewavatar?size=xsmall&amp;avatarId=10890&amp;avatarType=issuetype">Improvement</type>
                                            <priority id="3" iconUrl="https://jira.magnolia-cms.com/images/icons/priorities/major.svg">Major</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="1">Fixed</resolution>
                                        <assignee username="fgrilli">Federico Grilli</assignee>
                                    <reporter username="rgange">Richard Gange</reporter>
                        <labels>
                            <label>pm</label>
                    </labels>
                <created>Wed, 16 Sep 2015 14:41:14 +0200</created>
                <updated>Tue, 23 Feb 2016 16:13:44 +0100</updated>
                            <resolved>Tue, 26 Jan 2016 19:13:58 +0100</resolved>
                                    <version>5.4.2</version>
                                    <fixVersion>5.4.5</fixVersion>
                                    <component>configuration</component>
                        <due></due>
                            <votes>0</votes>
                                    <watches>4</watches>
                                                    <progress percentage="100">
                                    <originalProgress>
                                                    <row percentage="0" backgroundColor="#89afd7"/>
                                                    <row percentage="100" backgroundColor="transparent"/>
                                            </originalProgress>
                                                    <currentProgress>
                                                    <row percentage="100" backgroundColor="#51a825"/>
                                                    <row percentage="0" backgroundColor="#ec8e00"/>
                                            </currentProgress>
                            </progress>
                                    <aggregateprogress percentage="100">
                                    <originalProgress>
                                                    <row percentage="0" backgroundColor="#89afd7"/>
                                                    <row percentage="100" backgroundColor="transparent"/>
                                            </originalProgress>
                                                    <currentProgress>
                                                    <row percentage="100" backgroundColor="#51a825"/>
                                                    <row percentage="0" backgroundColor="#ec8e00"/>
                                            </currentProgress>
                            </aggregateprogress>
                                            <timeestimate seconds="0">0d</timeestimate>
                            <timespent seconds="14400">0.5d</timespent>
                                <comments>
                            <comment id="112648" author="rgange" created="Wed, 16 Sep 2015 14:42:43 +0200"  >&lt;p&gt;Looking at the code it appears that MgnlGroovyClassLoader is never checked, therefore the class isn&apos;t found. &lt;/p&gt;</comment>
                            <comment id="118172" author="pbaerfuss" created="Thu, 10 Dec 2015 12:21:57 +0100"  >&lt;p&gt;First it should work. We support Groovy models in JCR configuration or lest say Groovy classes in general. The code transforming YAML to configuration beans need to respect that. I don&apos;t know how this is exactly done in Node2Bean but the same approach should be used.&lt;/p&gt;</comment>
                            <comment id="118177" author="rgange" created="Thu, 10 Dec 2015 13:32:04 +0100"  >&lt;p&gt;My &quot;patched&quot; version of Map2Bean transformer.&lt;/p&gt;

&lt;p&gt;What I&apos;m doing is looking for properties which come in with the name &lt;tt&gt;modelClass&lt;/tt&gt; in the function &lt;tt&gt;readOutObject()&lt;/tt&gt;&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;
&lt;span class=&quot;code-keyword&quot;&gt;private&lt;/span&gt; &amp;lt;T&amp;gt; T readOutObject(Map&amp;lt;&lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt;, &lt;span class=&quot;code-object&quot;&gt;Object&lt;/span&gt;&amp;gt; sourceMap, TypeDescriptor targetType) &lt;span class=&quot;code-keyword&quot;&gt;throws&lt;/span&gt; IllegalAccessException, NoSuchMethodException, InvocationTargetException, InstantiationException, ConfigurationParsingException {
        T targetObj = (T) componentProvider.newInstance(targetType.getType());

        Map&amp;lt;&lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt;, &lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt;&amp;gt; targetDescription = beanUtils.describe(targetObj);

        &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; (Map.Entry&amp;lt;&lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt;, &lt;span class=&quot;code-object&quot;&gt;Object&lt;/span&gt;&amp;gt; sourceEntry : sourceMap.entrySet()) {
            &lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt; sourcePropertyName = sourceEntry.getKey();
            &lt;span class=&quot;code-object&quot;&gt;Object&lt;/span&gt; sourcePropertyValue = sourceEntry.getValue();

            &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (&lt;span class=&quot;code-quote&quot;&gt;&quot;class&quot;&lt;/span&gt;.equals(sourcePropertyName)) {
                &lt;span class=&quot;code-keyword&quot;&gt;continue&lt;/span&gt;; &lt;span class=&quot;code-comment&quot;&gt;// skip &lt;span class=&quot;code-keyword&quot;&gt;class &lt;/span&gt;property because its only meta data
&lt;/span&gt;            }

            &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (!targetDescription.containsKey(sourcePropertyName)) {
                &lt;span class=&quot;code-comment&quot;&gt;// We should not just ignore &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; - see MAGNOLIA-6196
&lt;/span&gt;                log.warn(&lt;span class=&quot;code-quote&quot;&gt;&quot;Property &quot;&lt;/span&gt; + sourcePropertyName + &lt;span class=&quot;code-quote&quot;&gt;&quot; not found in class &quot;&lt;/span&gt; + targetObj.getClass());
                &lt;span class=&quot;code-keyword&quot;&gt;continue&lt;/span&gt;;
            }

            PropertyTypeDescriptor propertyTypeDescriptor = mapping.getPropertyTypeDescriptor(targetType.getType(), sourcePropertyName);

            &lt;span class=&quot;code-object&quot;&gt;Object&lt;/span&gt; value;
            &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (propertyTypeDescriptor.isCollection()) {
                value = readOutList(prepareListValue(sourcePropertyValue), propertyTypeDescriptor.getCollectionEntryType());
            } &lt;span class=&quot;code-keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (propertyTypeDescriptor.isMap()) {
                value = readOutMap((Map&amp;lt;&lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt;, &lt;span class=&quot;code-object&quot;&gt;Object&lt;/span&gt;&amp;gt;) sourcePropertyValue, propertyTypeDescriptor.getCollectionEntryType());
            } &lt;span class=&quot;code-keyword&quot;&gt;else&lt;/span&gt; {
                value = readValue(sourcePropertyValue, propertyTypeDescriptor.getType());
            }

            &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (&lt;span class=&quot;code-quote&quot;&gt;&quot;modelClass&quot;&lt;/span&gt;.equals(sourcePropertyName)) {
                &lt;span class=&quot;code-keyword&quot;&gt;try&lt;/span&gt; {
                    value = Classes.getClassFactory().forName((&lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt;) value);
                } &lt;span class=&quot;code-keyword&quot;&gt;catch&lt;/span&gt; (ClassNotFoundException e) {
                    log.error(&lt;span class=&quot;code-quote&quot;&gt;&quot;Can&apos;t convert property. &lt;span class=&quot;code-object&quot;&gt;Class&lt;/span&gt; &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; type [{}] not found.&quot;&lt;/span&gt;, value);
                    &lt;span class=&quot;code-keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt; ConfigurationParsingException(e.getMessage(), e);
                }
            }
            
            beanUtils.setProperty(targetObj, sourcePropertyName, value);
        }

        &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; targetObj;
    }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                            <comment id="118179" author="rgange" created="Thu, 10 Dec 2015 13:35:32 +0100"  >&lt;p&gt;If you&apos;d like to use groovy models with YAML templates then you can replace &lt;tt&gt;magnolia-configuration-5.4.3.jar&lt;/tt&gt; with &lt;tt&gt;magnolia-configuration-groovymodel-patch-5.4.3.jar&lt;/tt&gt; for the time being. Until we implement a real fix. I&apos;m not quite sure my approach was the best but I was under a bit of a time crunch getting it ready for the LDW. The funny thing is here, Map2Bean and Node2Bean are soooo different. &lt;/p&gt;</comment>
                            <comment id="118268" author="pbaerfuss" created="Mon, 14 Dec 2015 15:56:18 +0100"  >&lt;p&gt;The Content2BeanTranformer. convertPropertyValue() method handles this for JCR by using our Classes.getClassFactory().forName(name). The Groovy module registers its own GroovyClassFactory which delegates to the our MgnlGroovyClassLoader.&lt;/p&gt;

&lt;p&gt;Since any class can be a groovy class the solution should not be tied to a test on modelClass only.&lt;/p&gt;

&lt;p&gt;Anyway if this is fixed the problem of stale classes upon script changes remains: &lt;a href=&quot;https://jira.magnolia-cms.com/browse/MGNLGROOVY-68&quot; title=&quot;Changes to a Groovy class in config aren&amp;#39;t picked up&quot; class=&quot;issue-link&quot; data-issue-key=&quot;MGNLGROOVY-68&quot;&gt;&lt;del&gt;MGNLGROOVY-68&lt;/del&gt;&lt;/a&gt; &lt;/p&gt;</comment>
                    </comments>
                <issuelinks>
                            <issuelinktype id="10160">
                    <name>Relates</name>
                                                                <inwardlinks description="relates to">
                                        <issuelink>
            <issuekey id="47713">MGNLRES-210</issuekey>
        </issuelink>
                            </inwardlinks>
                                    </issuelinktype>
                            <issuelinktype id="10010">
                    <name>relation</name>
                                            <outwardlinks description="is related to">
                                        <issuelink>
            <issuekey id="28363">MGNLGROOVY-68</issuekey>
        </issuelink>
                            </outwardlinks>
                                                        </issuelinktype>
                    </issuelinks>
                <attachments>
                            <attachment id="31304" name="Map2BeanTransformer.java" size="13908" author="rgange" created="Thu, 10 Dec 2015 13:29:51 +0100"/>
                            <attachment id="31305" name="magnolia-configuration-groovymodel-patch-5.4.3.jar" size="94522" author="rgange" created="Thu, 10 Dec 2015 13:32:47 +0100"/>
                    </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>Thu, 10 Dec 2015 12:21:57 +0100</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_10246" key="com.pyxis.greenhopper.jira:gh-epic-link">
                        <customfieldname>Epic Link</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>BL-210</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    <customfield id="customfield_10061" key="com.atlassian.jira.toolkit:lastusercommented">
                        <customfieldname>Last comm is not jira-dev</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>true</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10071" key="com.atlassian.jira.toolkit:lastupdaterorcommenter">
                        <customfieldname>Last participant</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>ahietala</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_13136" key="com.atlassian.jira.toolkit:LastCommentDate">
                        <customfieldname>Last public comment date</customfieldname>
                        <customfieldvalues>
                            8 years, 9 weeks, 6 days ago
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                            <customfield id="customfield_10020" key="com.atlassian.jira.toolkit:attachments">
                        <customfieldname>Number of attachments</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>2.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>fgrilli</customfieldvalue>
            <customfieldvalue>pbaerfuss</customfieldvalue>
            <customfieldvalue>rgange</customfieldvalue>
    
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                <customfield id="customfield_10833" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>0|hzzzs8:zzr8zx</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_10245" key="com.pyxis.greenhopper.jira:gh-sprint">
                        <customfieldname>Sprint</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue id="176">Basel 28</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                            <customfield id="customfield_10242" key="com.atlassian.jira.plugin.system.customfieldtypes:float">
                        <customfieldname>Story Points</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>5.0</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                <customfield id="customfield_14168" key="com.okapya.jira.checklist:checklist">
                        <customfieldname>Task DoD</customfieldname>
                        <customfieldvalues>
                            
        <checklist>
        <![CDATA[
                            




                
                        
        <div style="margin-bottom: 8px;">
                            <div class="o-completion" style="display: flex; flex-shrink: 0;"><span  class="aui-lozenge" 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>0/6</span></span></div>
                    
            <div class="checklist-progress-bar-wrapper" style="">
        <div class="checklist-progress-bar" style="position: relative; width: 100%; background-color: #cccccc; margin-bottom: 2px; margin-top: 5px;">
                        <div class="checklist-progress" style="display: block; float: none; width: 0%; height: 2px; background: #14892c;">
                            </div>
        </div>
    </div>
        </div>
    
                                    <div style="display: flex; align-items: flex-start; padding: 0; margin-left: 12px; float: none; font-size: 14px;">
                                                                <span style="padding-right: 5px; align-self: flex-start;">
                                <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg" class="unchecked"><path d="M0.441406 6.94141C0.441406 5.28455 1.78455 3.94141 3.44141 3.94141H15.4414C17.0983 3.94141 18.4414 5.28455 18.4414 6.94141V18.9414C18.4414 20.5983 17.0983 21.9414 15.4414 21.9414H3.44141C1.78455 21.9414 0.441406 20.5983 0.441406 18.9414V6.94141Z" fill="#EFF4FB" /><path fill-rule="evenodd" clip-rule="evenodd" d="M12.4414 3.94141H3.44141C1.78455 3.94141 0.441406 5.28455 0.441406 6.94141V18.9414C0.441406 20.5983 1.78455 21.9414 3.44141 21.9414H15.4414C17.0983 21.9414 18.4414 20.5983 18.4414 18.9414V9.94141H17.4414V18.9414C17.4414 20.046 16.546 20.9414 15.4414 20.9414H3.44141C2.33684 20.9414 1.44141 20.046 1.44141 18.9414V6.94141C1.44141 5.83684 2.33684 4.94141 3.44141 4.94141H12.4414V3.94141Z" fill="#ADBBD0" /><path d="M21.5306 5.91574L19.3486 4.58101L21.5306 3.24628C21.5681 3.22328 21.595 3.18633 21.6053 3.14348C21.6156 3.10063 21.6084 3.05545 21.5855 3.01792L20.9444 1.96985C20.8966 1.89162 20.7942 1.86696 20.716 1.91479L18.6331 3.18898V0.747138C18.6331 0.65546 18.5587 0.581055 18.4671 0.581055H17.2386C17.1469 0.581055 17.0725 0.65546 17.0725 0.747138V3.18898L14.9896 1.91487C14.9112 1.86704 14.8091 1.89162 14.7612 1.96993L14.1201 3.018C14.0972 3.05554 14.09 3.10071 14.1003 3.14356C14.1106 3.18641 14.1375 3.22336 14.175 3.24637L16.3571 4.58101L14.175 5.91574C14.1375 5.93866 14.1106 5.9757 14.1003 6.01847C14.09 6.0614 14.0972 6.10657 14.1201 6.14411L14.7612 7.1921C14.8091 7.27032 14.9112 7.29507 14.9896 7.24724L17.0725 5.97304V8.41489C17.0725 8.50657 17.1469 8.58097 17.2386 8.58097H18.4671C18.5587 8.58097 18.6331 8.50657 18.6331 8.41489V5.97313L20.7161 7.24715C20.7943 7.29499 20.8967 7.27032 20.9444 7.19218L21.5856 6.14411C21.6085 6.10657 21.6157 6.0614 21.6054 6.01855C21.5952 5.97562 21.5682 5.93875 21.5306 5.91574Z" fill="#de350b" /></svg>
                        </span>
                                        <div style="cursor: default; text-align: left; flex-grow: 1; padding-right: 3px; margin-top: 2px;">
                                                
                                                
                                                <span >
                                                        <span>Doc/release notes changes? Comment present?</span>

                        </span>
                    </div>
                                                                    <span style="padding-right: 1px; white-space: nowrap;">
                                                        
                                                        
                                                                                </span>
                                    </div>
                                                <div style="display: flex; align-items: flex-start; padding: 0; margin-left: 12px; float: none; font-size: 14px;">
                                                                <span style="padding-right: 5px; align-self: flex-start;">
                                <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg" class="unchecked"><path d="M0.441406 6.94141C0.441406 5.28455 1.78455 3.94141 3.44141 3.94141H15.4414C17.0983 3.94141 18.4414 5.28455 18.4414 6.94141V18.9414C18.4414 20.5983 17.0983 21.9414 15.4414 21.9414H3.44141C1.78455 21.9414 0.441406 20.5983 0.441406 18.9414V6.94141Z" fill="#EFF4FB" /><path fill-rule="evenodd" clip-rule="evenodd" d="M12.4414 3.94141H3.44141C1.78455 3.94141 0.441406 5.28455 0.441406 6.94141V18.9414C0.441406 20.5983 1.78455 21.9414 3.44141 21.9414H15.4414C17.0983 21.9414 18.4414 20.5983 18.4414 18.9414V9.94141H17.4414V18.9414C17.4414 20.046 16.546 20.9414 15.4414 20.9414H3.44141C2.33684 20.9414 1.44141 20.046 1.44141 18.9414V6.94141C1.44141 5.83684 2.33684 4.94141 3.44141 4.94141H12.4414V3.94141Z" fill="#ADBBD0" /><path d="M21.5306 5.91574L19.3486 4.58101L21.5306 3.24628C21.5681 3.22328 21.595 3.18633 21.6053 3.14348C21.6156 3.10063 21.6084 3.05545 21.5855 3.01792L20.9444 1.96985C20.8966 1.89162 20.7942 1.86696 20.716 1.91479L18.6331 3.18898V0.747138C18.6331 0.65546 18.5587 0.581055 18.4671 0.581055H17.2386C17.1469 0.581055 17.0725 0.65546 17.0725 0.747138V3.18898L14.9896 1.91487C14.9112 1.86704 14.8091 1.89162 14.7612 1.96993L14.1201 3.018C14.0972 3.05554 14.09 3.10071 14.1003 3.14356C14.1106 3.18641 14.1375 3.22336 14.175 3.24637L16.3571 4.58101L14.175 5.91574C14.1375 5.93866 14.1106 5.9757 14.1003 6.01847C14.09 6.0614 14.0972 6.10657 14.1201 6.14411L14.7612 7.1921C14.8091 7.27032 14.9112 7.29507 14.9896 7.24724L17.0725 5.97304V8.41489C17.0725 8.50657 17.1469 8.58097 17.2386 8.58097H18.4671C18.5587 8.58097 18.6331 8.50657 18.6331 8.41489V5.97313L20.7161 7.24715C20.7943 7.29499 20.8967 7.27032 20.9444 7.19218L21.5856 6.14411C21.6085 6.10657 21.6157 6.0614 21.6054 6.01855C21.5952 5.97562 21.5682 5.93875 21.5306 5.91574Z" fill="#de350b" /></svg>
                        </span>
                                        <div style="cursor: default; text-align: left; flex-grow: 1; padding-right: 3px; margin-top: 2px;">
                                                
                                                
                                                <span >
                                                        <span>Downstream builds green?</span>

                        </span>
                    </div>
                                                                    <span style="padding-right: 1px; white-space: nowrap;">
                                                        
                                                        
                                                                                </span>
                                    </div>
                                                <div style="display: flex; align-items: flex-start; padding: 0; margin-left: 12px; float: none; font-size: 14px;">
                                                                <span style="padding-right: 5px; align-self: flex-start;">
                                <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg" class="unchecked"><path d="M0.441406 6.94141C0.441406 5.28455 1.78455 3.94141 3.44141 3.94141H15.4414C17.0983 3.94141 18.4414 5.28455 18.4414 6.94141V18.9414C18.4414 20.5983 17.0983 21.9414 15.4414 21.9414H3.44141C1.78455 21.9414 0.441406 20.5983 0.441406 18.9414V6.94141Z" fill="#EFF4FB" /><path fill-rule="evenodd" clip-rule="evenodd" d="M12.4414 3.94141H3.44141C1.78455 3.94141 0.441406 5.28455 0.441406 6.94141V18.9414C0.441406 20.5983 1.78455 21.9414 3.44141 21.9414H15.4414C17.0983 21.9414 18.4414 20.5983 18.4414 18.9414V9.94141H17.4414V18.9414C17.4414 20.046 16.546 20.9414 15.4414 20.9414H3.44141C2.33684 20.9414 1.44141 20.046 1.44141 18.9414V6.94141C1.44141 5.83684 2.33684 4.94141 3.44141 4.94141H12.4414V3.94141Z" fill="#ADBBD0" /><path d="M21.5306 5.91574L19.3486 4.58101L21.5306 3.24628C21.5681 3.22328 21.595 3.18633 21.6053 3.14348C21.6156 3.10063 21.6084 3.05545 21.5855 3.01792L20.9444 1.96985C20.8966 1.89162 20.7942 1.86696 20.716 1.91479L18.6331 3.18898V0.747138C18.6331 0.65546 18.5587 0.581055 18.4671 0.581055H17.2386C17.1469 0.581055 17.0725 0.65546 17.0725 0.747138V3.18898L14.9896 1.91487C14.9112 1.86704 14.8091 1.89162 14.7612 1.96993L14.1201 3.018C14.0972 3.05554 14.09 3.10071 14.1003 3.14356C14.1106 3.18641 14.1375 3.22336 14.175 3.24637L16.3571 4.58101L14.175 5.91574C14.1375 5.93866 14.1106 5.9757 14.1003 6.01847C14.09 6.0614 14.0972 6.10657 14.1201 6.14411L14.7612 7.1921C14.8091 7.27032 14.9112 7.29507 14.9896 7.24724L17.0725 5.97304V8.41489C17.0725 8.50657 17.1469 8.58097 17.2386 8.58097H18.4671C18.5587 8.58097 18.6331 8.50657 18.6331 8.41489V5.97313L20.7161 7.24715C20.7943 7.29499 20.8967 7.27032 20.9444 7.19218L21.5856 6.14411C21.6085 6.10657 21.6157 6.0614 21.6054 6.01855C21.5952 5.97562 21.5682 5.93875 21.5306 5.91574Z" fill="#de350b" /></svg>
                        </span>
                                        <div style="cursor: default; text-align: left; flex-grow: 1; padding-right: 3px; margin-top: 2px;">
                                                
                                                
                                                <span >
                                                        <span>Solution information and context easily available?</span>

                        </span>
                    </div>
                                                                    <span style="padding-right: 1px; white-space: nowrap;">
                                                        
                                                        
                                                                                </span>
                                    </div>
                                                <div style="display: flex; align-items: flex-start; padding: 0; margin-left: 12px; float: none; font-size: 14px;">
                                                                <span style="padding-right: 5px; align-self: flex-start;">
                                <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg" class="unchecked"><path d="M0.441406 6.94141C0.441406 5.28455 1.78455 3.94141 3.44141 3.94141H15.4414C17.0983 3.94141 18.4414 5.28455 18.4414 6.94141V18.9414C18.4414 20.5983 17.0983 21.9414 15.4414 21.9414H3.44141C1.78455 21.9414 0.441406 20.5983 0.441406 18.9414V6.94141Z" fill="#EFF4FB" /><path fill-rule="evenodd" clip-rule="evenodd" d="M12.4414 3.94141H3.44141C1.78455 3.94141 0.441406 5.28455 0.441406 6.94141V18.9414C0.441406 20.5983 1.78455 21.9414 3.44141 21.9414H15.4414C17.0983 21.9414 18.4414 20.5983 18.4414 18.9414V9.94141H17.4414V18.9414C17.4414 20.046 16.546 20.9414 15.4414 20.9414H3.44141C2.33684 20.9414 1.44141 20.046 1.44141 18.9414V6.94141C1.44141 5.83684 2.33684 4.94141 3.44141 4.94141H12.4414V3.94141Z" fill="#ADBBD0" /><path d="M21.5306 5.91574L19.3486 4.58101L21.5306 3.24628C21.5681 3.22328 21.595 3.18633 21.6053 3.14348C21.6156 3.10063 21.6084 3.05545 21.5855 3.01792L20.9444 1.96985C20.8966 1.89162 20.7942 1.86696 20.716 1.91479L18.6331 3.18898V0.747138C18.6331 0.65546 18.5587 0.581055 18.4671 0.581055H17.2386C17.1469 0.581055 17.0725 0.65546 17.0725 0.747138V3.18898L14.9896 1.91487C14.9112 1.86704 14.8091 1.89162 14.7612 1.96993L14.1201 3.018C14.0972 3.05554 14.09 3.10071 14.1003 3.14356C14.1106 3.18641 14.1375 3.22336 14.175 3.24637L16.3571 4.58101L14.175 5.91574C14.1375 5.93866 14.1106 5.9757 14.1003 6.01847C14.09 6.0614 14.0972 6.10657 14.1201 6.14411L14.7612 7.1921C14.8091 7.27032 14.9112 7.29507 14.9896 7.24724L17.0725 5.97304V8.41489C17.0725 8.50657 17.1469 8.58097 17.2386 8.58097H18.4671C18.5587 8.58097 18.6331 8.50657 18.6331 8.41489V5.97313L20.7161 7.24715C20.7943 7.29499 20.8967 7.27032 20.9444 7.19218L21.5856 6.14411C21.6085 6.10657 21.6157 6.0614 21.6054 6.01855C21.5952 5.97562 21.5682 5.93875 21.5306 5.91574Z" fill="#de350b" /></svg>
                        </span>
                                        <div style="cursor: default; text-align: left; flex-grow: 1; padding-right: 3px; margin-top: 2px;">
                                                
                                                
                                                <span >
                                                        <span><strong>Tests</strong></span>

                        </span>
                    </div>
                                                                    <span style="padding-right: 1px; white-space: nowrap;">
                                                        
                                                        
                                                                                </span>
                                    </div>
                                                <div style="display: flex; align-items: flex-start; padding: 0; margin-left: 12px; float: none; font-size: 14px;">
                                                                <span style="padding-right: 5px; align-self: flex-start;">
                                <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg" class="unchecked"><path d="M0.441406 6.94141C0.441406 5.28455 1.78455 3.94141 3.44141 3.94141H15.4414C17.0983 3.94141 18.4414 5.28455 18.4414 6.94141V18.9414C18.4414 20.5983 17.0983 21.9414 15.4414 21.9414H3.44141C1.78455 21.9414 0.441406 20.5983 0.441406 18.9414V6.94141Z" fill="#EFF4FB" /><path fill-rule="evenodd" clip-rule="evenodd" d="M12.4414 3.94141H3.44141C1.78455 3.94141 0.441406 5.28455 0.441406 6.94141V18.9414C0.441406 20.5983 1.78455 21.9414 3.44141 21.9414H15.4414C17.0983 21.9414 18.4414 20.5983 18.4414 18.9414V9.94141H17.4414V18.9414C17.4414 20.046 16.546 20.9414 15.4414 20.9414H3.44141C2.33684 20.9414 1.44141 20.046 1.44141 18.9414V6.94141C1.44141 5.83684 2.33684 4.94141 3.44141 4.94141H12.4414V3.94141Z" fill="#ADBBD0" /><path d="M21.5306 5.91574L19.3486 4.58101L21.5306 3.24628C21.5681 3.22328 21.595 3.18633 21.6053 3.14348C21.6156 3.10063 21.6084 3.05545 21.5855 3.01792L20.9444 1.96985C20.8966 1.89162 20.7942 1.86696 20.716 1.91479L18.6331 3.18898V0.747138C18.6331 0.65546 18.5587 0.581055 18.4671 0.581055H17.2386C17.1469 0.581055 17.0725 0.65546 17.0725 0.747138V3.18898L14.9896 1.91487C14.9112 1.86704 14.8091 1.89162 14.7612 1.96993L14.1201 3.018C14.0972 3.05554 14.09 3.10071 14.1003 3.14356C14.1106 3.18641 14.1375 3.22336 14.175 3.24637L16.3571 4.58101L14.175 5.91574C14.1375 5.93866 14.1106 5.9757 14.1003 6.01847C14.09 6.0614 14.0972 6.10657 14.1201 6.14411L14.7612 7.1921C14.8091 7.27032 14.9112 7.29507 14.9896 7.24724L17.0725 5.97304V8.41489C17.0725 8.50657 17.1469 8.58097 17.2386 8.58097H18.4671C18.5587 8.58097 18.6331 8.50657 18.6331 8.41489V5.97313L20.7161 7.24715C20.7943 7.29499 20.8967 7.27032 20.9444 7.19218L21.5856 6.14411C21.6085 6.10657 21.6157 6.0614 21.6054 6.01855C21.5952 5.97562 21.5682 5.93875 21.5306 5.91574Z" fill="#de350b" /></svg>
                        </span>
                                        <div style="cursor: default; text-align: left; flex-grow: 1; padding-right: 3px; margin-top: 2px;">
                                                
                                                
                                                <span >
                                                        <span><strong>FixVersion</strong> filled and not yet released</span>

                        </span>
                    </div>
                                                                    <span style="padding-right: 1px; white-space: nowrap;">
                                                        
                                                        
                                                                                </span>
                                    </div>
                                                <div style="display: flex; align-items: flex-start; padding: 0; margin-left: 12px; float: none; font-size: 14px;">
                                                                <span style="padding-right: 5px; align-self: flex-start;">
                                <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg" class="unchecked"><rect fill="#EFF4FB" height="17.5" rx="2.5" stroke="#ADBBD0" width="18" x="0.44141" y="3.94141"/></svg>
                        </span>
                                        <div style="cursor: default; text-align: left; flex-grow: 1; padding-right: 3px; margin-top: 2px;">
                                                
                                                
                                                <span >
                                                        <span>Architecture Decision Record (<strong>ADR</strong>)</span>

                        </span>
                    </div>
                                                                    <span style="padding-right: 1px; white-space: nowrap;">
                                                        
                                                        
                                                                                </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>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        </customfields>
    </item>
</channel>
</rss>