jackrabbit-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Alessandro Bologna <alessandro.bolo...@gmail.com>
Subject System View XML mapping and multivalued properties
Date Thu, 20 Nov 2008 16:29:45 GMT
Hi all,

I never gave it too much thought, but I recently encountered an issue  
that seems to be a limit case, but nevertheless worth reporting.

If I export a multi valued property in System View,  I will obtain an  
sv:property element, and as children, a sequence of sv:value elements:

...
<sv:property sv:name="my:list" sv:type="String">
	<sv:value>one</sv:value>
	<sv:value>two</sv:value>
</sv:property>
...

Now, if my:list happens to have only one element, my export will look  
like the following:

<sv:property sv:name="my:list" sv:type="String">
	<sv:value>one</sv:value>
</sv:property>

which happens to be exactly the same XML mapping of a "regular",  
single valued property (and that's the issue)

The specs (I have jcr 283 handy, so I am quoting form there ) say at  
4.4.1:

	"A multi-value property is converted to an <sv:property> element  
containing multiple <sv:value> elements. The order of the <sv:value>  
elements reflects the order of the value array returned by  
Property.getValues" (4.4.1)

So this as by specs. But, when I import it (and the assumption is that  
I want to roundtrip my data, which should be supported in the System  
View), the logic is implemented (I believe in in   
o.a.j.core.xml.PropInfo) as follow: if there's a node type definition  
that tells me that this node is multi valued or if I don't have  
exaclty one value, set it as such, otherwise set it as single valued.  
This works fine if there's a node type definition that constrains this  
property, but if there's none (unstructured nodes all around) then my  
roundtrip will create a node that is not exaclty like the original  
one, and if the application is using getValues() it will probably  
throw an exception:

	"Accessing a multi-valued property with Property.getValue, or a   
single-value property with Property.getValues will throw a  
ValueFormatException" (3.7.1)

Which in turns forces the application code to recover in the catch  
using getValue(). I think is dangerous and quite inefficient to do so,  
especially in situations where  multi valued properties have often a  
single value (say for instance my:authors).

Maybe I am missing something, but if that's the case that I am not,  
maybe it would be worth adding some implementation specific  
workaround, such as adding an optional sv:multivalued="true" attribute  
that then can be used transparently during import. It should not break  
anything I believe (unless there's some strict validation of the SV  
schema in place). Or was this intentional?

Thoughts?
Alessandro




Mime
View raw message