<!-- 
RSS generated by JIRA (9.4.2#940002-sha1:46d1a51de284217efdcb32434eab47a99af2938b) at Sun Feb 11 23:58:25 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>[CELUM-34] Saving public URLs in JCR creates redundant and ambiguous nodes</title>
                <link>https://jira.magnolia-cms.com/browse/CELUM-34</link>
                <project id="17110" key="CELUM">Celum DAM Connector </project>
                    <description>&lt;h2&gt;&lt;a name=&quot;Statusquo%28code%29&quot;&gt;&lt;/a&gt;Status quo (code)&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;info.magnolia.external.dam.celum.service.CelumJcrServiceImpl#savePublicUrlToJcr:&lt;/em&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;public&lt;/span&gt; void savePublicUrlToJcr(&lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt; url, &lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt; description, &lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt; assetId) {
  [...] Node node = findNode(session, assetId);
  [...] node = NodeUtil.createPath(session.getRootNode(), createPath() + assetId, ContentNode.NAME); 
} 
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;info.magnolia.external.dam.celum.service.CelumJcrServiceImpl#findNode:&lt;/em&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;protected&lt;/span&gt; Node findNode(Session session, &lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt; assetId) {
  [...] Query query = jcrQueryManager.createQuery(&lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt;.format(GET_QUERY, assetId), Query.JCR_SQL2);
} 
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;info.magnolia.external.dam.celum.service.CelumJcrServiceImpl#GET_QUERY&lt;/em&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; &lt;span class=&quot;code-keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;code-keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt; GET_QUERY = &lt;span class=&quot;code-quote&quot;&gt;&quot;SELECT * from [&lt;span class=&quot;code-quote&quot;&gt;&apos;mgnl:contentNode&apos;&lt;/span&gt;] as t WHERE name(t) =&lt;span class=&quot;code-quote&quot;&gt;&apos;%s&apos;&lt;/span&gt;&quot;&lt;/span&gt;;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The following is tremendously prone to conflicts and causes a bug with the used &lt;tt&gt;GET_QUERY&lt;/tt&gt;:&lt;br/&gt;
&lt;em&gt;info.magnolia.external.dam.celum.service.CelumJcrServiceImpl#createPath:&lt;/em&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; &lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt; createPath() {
  &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; &quot;&quot; + &lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt; Random().nextInt(1000) + CelumConstants.SLASH;
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;h2&gt;&lt;a name=&quot;Explaination&quot;&gt;&lt;/a&gt;Explaination&lt;/h2&gt;
&lt;p&gt;The above results in multiple nodes for one single celum asset, e.g. with asset-id &lt;tt&gt;100&lt;/tt&gt;&lt;br/&gt;
&lt;tt&gt;/0/102, /100/102, /567/102, /999/102&lt;/tt&gt;, etc.&lt;/p&gt;

&lt;p&gt;Each rendition is potentially written into a different node, e.g.&lt;br/&gt;
&lt;tt&gt;/0/102.original=&lt;a href=&quot;https://cdn.url/original/asset-102.jpg&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://cdn.url/original/asset-102.jpg&lt;/a&gt;&lt;/tt&gt;, &lt;br/&gt;
&lt;tt&gt;/100/102.small=&lt;a href=&quot;https://cdn.url/small/asset-102.jpg&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://cdn.url/small/asset-102.jpg&lt;/a&gt;&lt;/tt&gt;, etc.&lt;/p&gt;

&lt;p&gt;Given the asset id &lt;tt&gt;100&lt;/tt&gt;, the &lt;tt&gt;GET_QUERY&lt;/tt&gt; finds all nodes which are named &lt;tt&gt;100&lt;/tt&gt;, but the &lt;tt&gt;findNode&lt;/tt&gt;-method returns only the first found node:&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;if&lt;/span&gt; (iterator.hasNext()) {
  &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; iterator.nextNode();
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;h2&gt;&lt;a name=&quot;Suggestion&quot;&gt;&lt;/a&gt;Suggestion&lt;/h2&gt;
&lt;p&gt;Get rid of &lt;tt&gt;createPath()&lt;/tt&gt;, in particular of the random parent node name ranging 0-999&lt;br/&gt;
Use the same Path as in the Asset&apos;s itemKey (assetId) as the absolut path of the public-urls-node&lt;br/&gt;
Write all public-urls as properties &lt;ins&gt;under the same&lt;/ins&gt; node&lt;br/&gt;
And please write unit tests, because this kind of design issues come to light very quickly during test-driven development&lt;/p&gt;</description>
                <environment></environment>
        <key id="109643">CELUM-34</key>
            <summary>Saving public URLs in JCR creates redundant and ambiguous nodes</summary>
                <type id="1" iconUrl="https://jira.magnolia-cms.com/secure/viewavatar?size=xsmall&amp;avatarId=10883&amp;avatarType=issuetype">Bug</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="1">Fixed</resolution>
                                        <assignee username="rfalvo">Raphael Falvo</assignee>
                                    <reporter username="tszczepanski">Tobias Szczepanski</reporter>
                        <labels>
                    </labels>
                <created>Tue, 5 Apr 2022 16:16:10 +0200</created>
                <updated>Wed, 21 Dec 2022 09:59:35 +0100</updated>
                            <resolved>Wed, 19 Oct 2022 09:03:23 +0200</resolved>
                                    <version>1.0.2</version>
                                    <fixVersion>1.0.4</fixVersion>
                                        <due></due>
                            <votes>0</votes>
                                    <watches>2</watches>
                                                                                                                <comments>
                            <comment id="325941" author="tmiyar" created="Mon, 10 Oct 2022 13:32:09 +0200"  >&lt;p&gt;Hi,&lt;/p&gt;

&lt;p&gt;This two points are valid:&lt;/p&gt;

&lt;p&gt;Write all public-urls as properties &lt;ins&gt;under the same&lt;/ins&gt; node&lt;br/&gt;
And please write unit tests, because this kind of design issues come to light very quickly during test-driven development&lt;/p&gt;

&lt;p&gt;but we cannot save the assets using the same path they have in the Celum server since we want to avoid the problem of having too many nodes under the same path due to JCR limitation and the fact that you have folders with more than 40 thousand items&lt;/p&gt;</comment>
                    </comments>
                <issuelinks>
                            <issuelinktype id="10030">
                    <name>Cloners</name>
                                            <outwardlinks description="clones">
                                        <issuelink>
            <issuekey id="108593">CELUM-32</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>prodyna.com</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                <customfield id="customfield_10031" key="com.atlassian.jira.ext.charting:firstresponsedate">
                        <customfieldname>Date of First Response</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>Mon, 10 Oct 2022 13:32:09 +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>true</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10071" key="com.atlassian.jira.toolkit:lastupdaterorcommenter">
                        <customfieldname>Last participant</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>mkobus</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_13136" key="com.atlassian.jira.toolkit:LastCommentDate">
                        <customfieldname>Last public comment date</customfieldname>
                        <customfieldvalues>
                            1 year, 17 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>1.0</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        <customfield id="customfield_10011" key="com.atlassian.jira.toolkit:participants">
                        <customfieldname>Participants</customfieldname>
                        <customfieldvalues>
                                        <customfieldvalue>rfalvo</customfieldvalue>
            <customfieldvalue>tmiyar</customfieldvalue>
            <customfieldvalue>tszczepanski</customfieldvalue>
    
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                    <customfield id="customfield_10833" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>0|y06eai:</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_12430" key="com.atlassian.teams:rm-teams-custom-field-team">
                        <customfieldname>Team</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue><![CDATA[34]]></customfieldvalue>

                        </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_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>