package org.exoplatform.services.jcr.lab.cluster.test; import org.exoplatform.services.jcr.JcrAPIBaseTest; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.Calendar; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.Property; import javax.jcr.Session; public class TestBLOBValue extends JcrAPIBaseTest { private static final String TEST_ROOT_NAME = "TestBLOBValue"; private static final int FILE_SIZE_KB = 512; private static final int FILES_COUNT = 10; private static File testFile; private Node testRoot; private Node addNTFile(String fileName, File blob) throws Exception { Node file = testRoot.addNode(fileName, "nt:file"); Node contentNode = file.addNode("jcr:content", "nt:resource"); // contentNode.setProperty("jcr:encoding", "UTF-8"); contentNode.setProperty("jcr:mimeType", "application/octet-stream"); InputStream is = new FileInputStream(blob); try { contentNode.setProperty("jcr:data", is); } finally { is.close(); } contentNode.setProperty("jcr:lastModified", Calendar.getInstance()); return file; } @Override public void setUp() throws Exception { super.setUp(); if (root.hasNode(TEST_ROOT_NAME)) { testRoot = root.getNode(TEST_ROOT_NAME); } else { testRoot = root.addNode(TEST_ROOT_NAME); root.save(); } if (testFile == null) { testFile = createBLOBTempFile(FILE_SIZE_KB); } } @Override protected void tearDown() throws Exception { if (testRoot.hasProperty("blob")) { testRoot.getProperty("blob").remove(); testRoot.save(); } if (testRoot.hasNodes()) { for (NodeIterator children = testRoot.getNodes(); children.hasNext();) { children.nextNode().remove(); } testRoot.save(); } testRoot.remove(); root.save(); super.tearDown(); } public void testAddProperty() throws Exception { // write Property text = testRoot.setProperty("text", "string property"); FileInputStream fis = new FileInputStream(testFile); Property blob = testRoot.setProperty("blob", fis); testRoot.save(); fis.close(); // read Session user1 = repository.login(credentials, root.getSession().getWorkspace().getName()); Node troot = user1.getRootNode().getNode(TEST_ROOT_NAME); Property tblob = troot.getProperty("blob"); InputStream blobStream = tblob.getStream(); byte[] buff = new byte[1024]; int r = 0; int size = 0; while ((r = blobStream.read(buff)) >= 0) { size += r; } assertEquals(testFile.length(), size); } // for read on another node of a cluster public void _testReadProperty() throws Exception { // read Property blob = testRoot.getProperty("blob"); InputStream blobStream = blob.getStream(); byte[] buff = new byte[1024]; int r = 0; int size = 0; while ((r = blobStream.read(buff)) >= 0) { size += r; } assertEquals(testFile.length(), size); } public void testAddNTFiles() throws Exception { // write series of FILES_COUNT adding to each next 1K bytes // do it in one save int size = FILE_SIZE_KB; for (int i = 0; i < FILES_COUNT; i++) { File blob = createBLOBTempFile(size); addNTFile("file" + i, blob); size += 1; } testRoot.save(); // it's ready for read } // for read on another node of a cluster public void _testReadNTFiles() throws Exception { // read series of FILES_COUNT were added each with size + 1K bytes int size = FILE_SIZE_KB; for (int i = 0; i < FILES_COUNT; i++) { Node file = testRoot.getNode("file" + i); Property blob = file.getProperty("jcr:content/jcr:data"); InputStream blobStream = blob.getStream(); byte[] buff = new byte[1024]; int r = 0; int bsize = 0; while ((r = blobStream.read(buff)) >= 0) { bsize += r; } assertEquals(size * 1024, bsize); // calc next size += 1; } } }