I changed to use Node.setProperty(String, InputStream) as
byte[] content = input.getContent();
ValueFactoryImpl valueFactory = (ValueFactoryImpl) uiExplorer.getSession().getValueFactory() ;
Value contentValue = valueFactory.createValue(content) ;
.......
contentNode.setProperty(JCR_DATA, contentValue.getStream());
Still get problem...
java.lang.OutOfMemoryError: Java heap space
[ERROR] JDBCIOChannel - Can't write value data of property with id a26802030a00001f012df636928f64fd,
error:java.sql.SQLException: out of memory <java.sql.SQLException: out of memory>java.sql.SQLExcept
ion: out of memory
at org.hsqldb.jdbc.jdbcUtil.throwError(Unknown Source)
at org.hsqldb.jdbc.jdbcPreparedStatement.executeUpdate(Unknown Source)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedState
ment.java:101)
at org.exoplatform.services.jcr.impl.storage.jdbc.JDBCIOHelper.writeValueData(JDBCIOHelper.j
ava:423)
at org.exoplatform.services.jcr.impl.storage.jdbc.JDBCIOHelper.write(JDBCIOHelper.java:386)
at org.exoplatform.services.jcr.impl.storage.jdbc.JDBCStorageConnection.add(JDBCStorageConne
ction.java:281)
at org.exoplatform.services.jcr.impl.dataflow.persistent.WorkspaceDataManager.doAdd(Workspac
eDataManager.java:354)
at org.exoplatform.services.jcr.impl.dataflow.persistent.WorkspaceDataManager.save(Workspace
DataManager.java:95)
at org.exoplatform.services.jcr.impl.dataflow.persistent.VersionableWorkspaceDataManager.sav
e(VersionableWorkspaceDataManager.java:170)
at org.exoplatform.services.jcr.impl.dataflow.session.TransactionableDataManager.save(Transa
ctionableDataManager.java:254)
at org.exoplatform.services.jcr.impl.dataflow.session.TransactionableDataManager.saveItem(Tr
ansactionableDataManager.java:292)
at org.exoplatform.services.jcr.impl.dataflow.session.TransactionableDataManager.saveItem(Tr
ansactionableDataManager.java:303)
at org.exoplatform.services.jcr.impl.core.SessionDataManager.commit(SessionDataManager.java:
410)
at org.exoplatform.services.jcr.impl.core.ItemImpl.save(ItemImpl.java:239)
at org.exoplatform.portlets.content.jcr.component.UIUploadForm$SaveActionListener.execute(UI
UploadForm.java:95)
at org.exoplatform.faces.core.event.ExoActionListener.processAction(ExoActionListener.java:6
7)
The problem is not in "Out of memory" error. It's a consequense of reading BLOB data in memory (ByteArrayInputStream).
eXo JCR has internal mechanism of use BLOBs in Property.setValue(InputStream) and Node.setProperty(String,InputStream), ValueFactory.createValue(InputStream value) methods.
So, you have to give InputStream to JCR only, no more. If it's a HTTP form upload give a InputStream obtained from app.server direct without any 'caching' etc. JCR has own cache/swap logic for InputStreams