<!-- 
RSS generated by JIRA (9.4.2#940002-sha1:46d1a51de284217efdcb32434eab47a99af2938b) at Mon Feb 12 09:17:42 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-4545] Investigate polishing of datasource observation mechanism in content apps</title>
                <link>https://jira.magnolia-cms.com/browse/MGNLUI-4545</link>
                <project id="10625" key="MGNLUI">Magnolia UI</project>
                    <description>&lt;p&gt;&lt;b&gt;primary goal&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;get away from the inevitable need of content changed events. In the new incarnation of the content app we try to stay away from the &lt;tt&gt;ContentChangedEvent&lt;/tt&gt; since it is an error-prone and cumbersome way to communicate the changes. Instead we try to utilise the native datasource observation capabilities relief the app developer from having to send notifications manually.&lt;/li&gt;
	&lt;li&gt;browser views should not have any imperative logic re: refreshing the views. Instead e.g. the table should use Vaadin DataProvider API and data providers should optionally subscribe to the backend events&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;b&gt;possible solution&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;JCR - use the wrapper around observation mechanism
	&lt;ul&gt;
		&lt;li&gt;do not want to have too many listeners at once. Maybe create a singleton pool of the listeners, which would broadcast the changes to the data providers?&lt;/li&gt;
		&lt;li&gt;non-JCR: depends on the capabilities of the backend
		&lt;ul&gt;
			&lt;li&gt;there could be no capabilities (like REST)&lt;/li&gt;
			&lt;li&gt;we could provide e.g. smth like localised CCE: specific action injects the specific DS observation and pushes the event&lt;br/&gt;
&lt;b&gt;additional complications&lt;/b&gt;&lt;/li&gt;
		&lt;/ul&gt;
		&lt;/li&gt;
		&lt;li&gt;we have some relying on the CCE in other places. E.g. details sub-apps catch them and automatically close once it is received.&lt;/li&gt;
		&lt;li&gt;how do we leverage that situation?&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
                <environment></environment>
        <key id="67244">MGNLUI-4545</key>
            <summary>Investigate polishing of datasource observation mechanism in content apps</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="11">Done</resolution>
                                        <assignee username="rkovarik">Roman Kova&#345;&#237;k</assignee>
                                    <reporter username="apchelintcev">Aleksandr Pchelintcev</reporter>
                        <labels>
                    </labels>
                <created>Fri, 15 Jun 2018 12:55:02 +0200</created>
                <updated>Mon, 20 Aug 2018 14:12:48 +0200</updated>
                            <resolved>Tue, 17 Jul 2018 07:33:25 +0200</resolved>
                                                    <fixVersion>6.0</fixVersion>
                                        <due></due>
                            <votes>0</votes>
                                    <watches>3</watches>
                                                                                                                <comments>
                            <comment id="164595" author="rkovarik" created="Fri, 13 Jul 2018 11:19:10 +0200"  >&lt;p&gt;My questions/concerns raised when investigating (more or less related to the topic)&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;info.magnolia.contentapp.framework.datasource.DatasourceSupport
	&lt;ul&gt;
		&lt;li&gt;Sources are referenced by definition.
		&lt;ul&gt;
			&lt;li&gt;How is this support to work with multiple apps for different workspaces?&lt;/li&gt;
			&lt;li&gt;Is this just a mistake and bundles should be referenced by the definition object?&lt;/li&gt;
		&lt;/ul&gt;
		&lt;/li&gt;
		&lt;li&gt;DatasourceSupport is a singleton
		&lt;ul&gt;
			&lt;li&gt;the bundles are kept in memory forever
			&lt;ul&gt;
				&lt;li&gt;is this intended?&#160;&lt;/li&gt;
				&lt;li&gt;as consequence, registered observations can&apos;t be released implicitly&lt;/li&gt;
				&lt;li&gt;for record, the singleton storage looks like this (in case of JCR):
				&lt;ul&gt;
					&lt;li&gt;DatasourceSupport -&amp;gt; JcrDatasourceBundle -&amp;gt;&#160;HierarchicalJcrDataProvider (among other objects, some of these don&apos;t hold any data so there is no problem with these) -&amp;gt;&#160;JcrObservation&lt;/li&gt;
				&lt;/ul&gt;
				&lt;/li&gt;
				&lt;li&gt;What should be the correct scope?
				&lt;ul&gt;
					&lt;li&gt;Looks like @UiScopedComponent doesn&apos;t coop with @Multibinding (which is used by DatasourceBundles)&lt;/li&gt;
					&lt;li&gt;@SessionScoped?&lt;/li&gt;
				&lt;/ul&gt;
				&lt;/li&gt;
			&lt;/ul&gt;
			&lt;/li&gt;
		&lt;/ul&gt;
		&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;Pool of listeners
	&lt;ul&gt;
		&lt;li&gt;implementation is fairly straitforward&lt;/li&gt;
		&lt;li&gt;since the &quot;delegating&quot; listeners is registered at root level, every subscriber would have to have an inner logic to filter event on its subpath&#160;&lt;/li&gt;
		&lt;li&gt;wouldn&apos;t then be easier to register listener on JCR level per app with proper root path so no additional logic would be needed?
		&lt;ul&gt;
			&lt;li&gt;if the datasource would be app scoped, the listener would/should be unregistered after closing the app&lt;/li&gt;
			&lt;li&gt;although pool of listeners sounds like a good idea, what&apos;s the different having the pool at Magnolia UI vs. JCR level?
			&lt;ul&gt;
				&lt;li&gt;the number of listener shouldn&apos;t be enormous (= number of opened apps per user), with the pool, the registration point would just move from JCR to UI. After implementing the pool, I have doubts about&#160;benefit of this solution.&lt;/li&gt;
				&lt;li&gt;&lt;/li&gt;
			&lt;/ul&gt;
			&lt;/li&gt;
		&lt;/ul&gt;
		&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;Investigated solutions for memory leaks
	&lt;ul&gt;
		&lt;li&gt;&#160;WeakHashMap:&#160;
		&lt;ul&gt;
			&lt;li&gt;works quite well in a simple use case&lt;/li&gt;
			&lt;li&gt;in our case are the items in the map (multiple wrapped consuments - inner class/lambdas) evicted too early)&#160;&lt;/li&gt;
		&lt;/ul&gt;
		&lt;/li&gt;
		&lt;li&gt;&#160;info.magnolia.contentapp.framework.datasource.components.JcrDataSourceObservation#finalize
		&lt;ul&gt;
			&lt;li&gt;a private field holds an object which is able to unregister a subscription
			&lt;ul&gt;
				&lt;li&gt;this fields needs to be static otherwise is nullified before the finalise method is called&lt;/li&gt;
			&lt;/ul&gt;
			&lt;/li&gt;
			&lt;li&gt;similarly as with&#160;WeakHashMap, the finalise method was called too early, but that could a be a problem with my implementation.&lt;/li&gt;
		&lt;/ul&gt;
		&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;Summary
	&lt;ul&gt;
		&lt;li&gt;Some questions regarding the data source observation arised.&lt;/li&gt;
		&lt;li&gt;Implementation if interaction between the data source and view might continue (as the datasource observation works in current state of the content app, even without the PoC with the pool)&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</comment>
                            <comment id="164613" author="rkovarik" created="Fri, 13 Jul 2018 15:36:42 +0200"  >&lt;p&gt;Added a PR with the observation pool for the record.&lt;/p&gt;</comment>
                            <comment id="164647" author="rkovarik" created="Mon, 16 Jul 2018 10:46:53 +0200"  >&lt;p&gt;Explained / Discussed. Closing so we can move on with actual impl (&lt;a href=&quot;https://jira.magnolia-cms.com/browse/MGNLUI-4566&quot; title=&quot;Polish datasource observation mechanism in content apps&quot; class=&quot;issue-link&quot; data-issue-key=&quot;MGNLUI-4566&quot;&gt;&lt;del&gt;DEV-1027&lt;/del&gt;&lt;/a&gt;).&lt;/p&gt;</comment>
                    </comments>
                <issuelinks>
                            <issuelinktype id="10030">
                    <name>Cloners</name>
                                                                <inwardlinks description="is cloned by">
                                        <issuelink>
            <issuekey id="68064">MGNLUI-4566</issuekey>
        </issuelink>
                            </inwardlinks>
                                    </issuelinktype>
                            <issuelinktype id="10020">
                    <name>dependency</name>
                                                                <inwardlinks description="is depended upon by">
                                        <issuelink>
            <issuekey id="67242">MGNLUI-4531</issuekey>
        </issuelink>
                            </inwardlinks>
                                    </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>Fri, 13 Jul 2018 11:19:10 +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_10246" key="com.pyxis.greenhopper.jira:gh-epic-link">
                        <customfieldname>Epic Link</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>MGNLUI-4958</customfieldvalue>
                        </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>sgasa</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_13136" key="com.atlassian.jira.toolkit:LastCommentDate">
                        <customfieldname>Last public comment date</customfieldname>
                        <customfieldvalues>
                            5 years, 30 weeks, 6 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>3.0</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        <customfield id="customfield_10011" key="com.atlassian.jira.toolkit:participants">
                        <customfieldname>Participants</customfieldname>
                        <customfieldvalues>
                                        <customfieldvalue>apchelintcev</customfieldvalue>
            <customfieldvalue>rkovarik</customfieldvalue>
    
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                <customfield id="customfield_10833" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>0|hzzz4l:qvvc</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="768">Kromeriz 155</customfieldvalue>
    <customfieldvalue id="772">Kromeriz 156</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_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>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        </customfields>
    </item>
</channel>
</rss>