Details
-
Bug
-
Status: Closed
-
Minor
-
Resolution: Invalid
-
1.2.3
-
None
-
None
-
Any
Description
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);
}