[ 
https://issues.apache.org/jira/browse/JCR-784?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Stefan Guggisberg resolved JCR-784.
-----------------------------------

    Resolution: Invalid

eric, thanks for reporting this issue and providing a detailed description.

however, i don't agree with your analysis. according to the jsr 170 spec, 
NodeType.canSetProperty "returns true if setting propertyName to value 
is allowed by this node type." since a property defined in a node type can
specify value constraints (e.g. length of binary value, regular expressions
for string values, etc) and such value constraints need to be checked
by NodeType.canSetProperty, a passed stream unfortunately needs to
be materialized in order to verify that the value constraint(s) are satisfied.

i resolved this issue as 'invalid' since the current behavior is IMO 
compliant with the spec and therefore not a bug.

while i agree that NodeType.canSetProperty consuming a binary value is
somewhat irritating you shouldn't need to call this method in most situations. 
actually the only reasonable use case i can think of is providing feedback in a 
responsive gui editor, e.g. for validity checking while the user enters text. 







> NodeType.canSetProperty(keyString, Value) consumes the InputStream making it 
> unusable for setting the property
> --------------------------------------------------------------------------------------------------------------
>
>                 Key: JCR-784
>                 URL: https://issues.apache.org/jira/browse/JCR-784
>             Project: Jackrabbit
>          Issue Type: Bug
>          Components: nodetype
>    Affects Versions: 1.2.3
>         Environment: Any
>            Reporter: Eric Norman
>            Priority: Minor
>
> When checking if a binary property can be added to a given node type, the 
> input stream inside the BinaryValue object is consumed, making the subsequent 
> call to setProperty(..) not work because the stream has been positioned at 
> the end of the input stream.
> The stream is consumed by the following line in 
> NodeTypeImpl.canSetProperty(..)
>             // create InternalValue from Value and perform
>             // type conversion as necessary
>             InternalValue internalValue = InternalValue.create(value, 
> targetType,
>                     nsResolver);
> The internalValue object becomes a BlobFileValue that consumes the input 
> stream in it's constructor.
> Expected:
> The canAddProperty decision should be made without consuming the input stream 
> in the Value object.
> Example Code:
> Node targetNode; //get node from somewhere
> InputStream inStream; //get instream from somewhere
> String key = "propName"; //property key
> Value value = session.getValueFactory().createValue(inStream);
> NodeType nodeType = revisionNode.getPrimaryNodeType();
> if (nodeType.canAddProperty(key, value)) {
>     targetNode.setProperty(key, value);
> }
> Workaround:
> Create a dummy value to do the canAddProperty check.
> Value dummyValue = session.getValueFactory().createValue(session, new 
> ByteArrayInputStream(new byte[0]));
> if (revisionNodeType.canSetProperty(key, dummyValue)) {
>     revisionNode.setProperty(key, (Value)value);
> }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to