/* * Copyright (C) 2009 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.services.jcr.load.blob; import org.exoplatform.services.jcr.JcrAPIBaseTest; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.Random; import javax.jcr.ImportUUIDBehavior; import javax.jcr.Node; /** * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a> * @version $Id: TestExportBigFiles.java 34801 2009-07-31 15:44:50Z dkatayev $ */ public class TestExportBigFiles extends JcrAPIBaseTest { /** * Testing SysView import - export * * @throws Exception */ public void testBigExportSysView() throws Exception { String TEST_FILE = createBLOBTempFile(1024 * 5).getAbsolutePath();// 5M Node testLocalBigFiles = root.addNode("testLocalBigFiles"); // add file to repository long startTime, endTime; startTime = System.currentTimeMillis(); // to get the time of start Node localBigFile = testLocalBigFiles.addNode("bigFile" + 1, "nt:file"); Node contentNode = localBigFile.addNode("jcr:content", "nt:resource"); // contentNode.setProperty("jcr:encoding", "UTF-8"); InputStream is = new FileInputStream(TEST_FILE); contentNode.setProperty("jcr:data", is); contentNode.setProperty("jcr:mimeType", "application/octet-stream "); is.close(); System.out.println("Data is set: " + TEST_FILE); // contentNode.setProperty("jcr:mimeType", "video/avi"); contentNode.setProperty("jcr:lastModified", Calendar.getInstance()); session.save(); System.out.println("Saved: " + TEST_FILE + " " + Runtime.getRuntime().freeMemory()); endTime = System.currentTimeMillis(); log.info("Execution time after adding and saving (local big):" + ((endTime - startTime) / 1000) + "s"); // Exporting repository content File file = File.createTempFile("tesSysExport", ".xml"); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file)); session.exportSystemView(testLocalBigFiles.getPath(), bufferedOutputStream, false, false); bufferedOutputStream.flush(); bufferedOutputStream.close(); assertTrue(file.length() > 0); // removing source node testLocalBigFiles.remove(); session.save(); BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file)); // importing content session.importXML(root.getPath(), bufferedInputStream, ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING); session.save(); Node n1 = root.getNode("testLocalBigFiles"); Node lbf = n1.getNode("bigFile" + 1); Node content = lbf.getNode("jcr:content"); // comparing with source file compareStream(new BufferedInputStream(new FileInputStream(TEST_FILE)), content.getProperty("jcr:data") .getStream()); n1.remove(); session.save(); file.deleteOnExit(); file.delete(); } /** * Testing SysView import - export * * @throws Exception */ public void testBigImportExportDocView() throws Exception { String TEST_FILE2 = createBLOBTempFile(1024 * 5).getAbsolutePath(); // 5M Node testLocalBigFiles = root.addNode("testDocView"); // add file to repository long startTime, endTime; startTime = System.currentTimeMillis(); // to get the time of start Node localBigFile = testLocalBigFiles.addNode("bigFile" + 1, "nt:file"); Node contentNode = localBigFile.addNode("jcr:content", "nt:resource"); // contentNode.setProperty("jcr:encoding", "UTF-8"); InputStream is = new FileInputStream(TEST_FILE2); contentNode.setProperty("jcr:data", is); contentNode.setProperty("jcr:mimeType", "application/octet-stream "); is.close(); System.out.println("Data is set: " + TEST_FILE2); // contentNode.setProperty("jcr:mimeType", "video/avi"); contentNode.setProperty("jcr:lastModified", Calendar.getInstance()); session.save(); System.out.println("Saved: " + TEST_FILE2 + " " + Runtime.getRuntime().freeMemory()); endTime = System.currentTimeMillis(); log.info("Execution time after adding and saving (local big):" + ((endTime - startTime) / 1000) + "s"); // Exporting repository content File file = File.createTempFile("tesDocExport", ".xml"); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file)); session.exportDocumentView(testLocalBigFiles.getPath(), bufferedOutputStream, false, false); bufferedOutputStream.flush(); bufferedOutputStream.close(); assertTrue(file.length() > 0); // removing source node testLocalBigFiles.remove(); session.save(); BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file)); // importing content session.importXML(root.getPath(), bufferedInputStream, ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING); session.save(); Node n1 = root.getNode("testDocView"); Node lbf = n1.getNode("bigFile" + 1); Node content = lbf.getNode("jcr:content"); // comparing with source file compareStream(new BufferedInputStream(new FileInputStream(TEST_FILE2)), content.getProperty("jcr:data") .getStream()); n1.remove(); session.save(); file.deleteOnExit(); file.delete(); } public void testIEPdfFiles() throws Exception { // // 300 MB creating file String TEST_FILE = "D:/Dev/DOC/jsr170-1.0.pdf"; Node testLocalBigFiles = root.addNode("testLocalBigFiles"); // add file to repository long startTime, endTime; startTime = System.currentTimeMillis(); // to get the time of start Node localBigFile = testLocalBigFiles.addNode("bigFile" + 1, "nt:file"); Node contentNode = localBigFile.addNode("jcr:content", "nt:resource"); // contentNode.setProperty("jcr:encoding", "UTF-8"); InputStream is = new FileInputStream(TEST_FILE); contentNode.setProperty("jcr:data", is); contentNode.setProperty("jcr:mimeType", "application/octet-stream "); is.close(); System.out.println("Data is set: " + TEST_FILE); // contentNode.setProperty("jcr:mimeType", "video/avi"); contentNode.setProperty("jcr:lastModified", Calendar.getInstance()); session.save(); System.out.println("Saved: " + TEST_FILE + " " + Runtime.getRuntime().freeMemory()); endTime = System.currentTimeMillis(); log.info("Execution time after adding and saving (local big):" + ((endTime - startTime) / 1000) + "s"); // Exporting repository content File file = File.createTempFile("tesSysExport", ".xml"); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file)); session.exportSystemView(testLocalBigFiles.getPath(), bufferedOutputStream, false, false); bufferedOutputStream.flush(); bufferedOutputStream.close(); assertTrue(file.length() > 0); // removing source node testLocalBigFiles.remove(); session.save(); BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file)); // importing content session.importXML(root.getPath(), bufferedInputStream, ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING); session.save(); Node n1 = root.getNode("testLocalBigFiles"); Node lbf = n1.getNode("bigFile" + 1); Node content = lbf.getNode("jcr:content"); // comparing with source file compareStream(new BufferedInputStream(new FileInputStream(TEST_FILE)), content.getProperty("jcr:data") .getStream()); n1.remove(); session.save(); file.deleteOnExit(); file.delete(); } public void testRandomSizeExportImportSysView() throws Exception { final int FILES_COUNT = 100; List<String> fileList = new ArrayList<String>(); Random random = new Random(); for (int i = 0; i < FILES_COUNT; i++) { fileList.add(createBLOBTempFile(random.nextInt(1024 * 1024)).getAbsolutePath()); } Node testLocalBigFiles = root.addNode("testLocalBigFiles"); // add file to repository long startTime, endTime; for (int i = 0; i < FILES_COUNT; i++) { String TEST_FILE = fileList.get(i); startTime = System.currentTimeMillis(); // to get the time of start Node localBigFile = testLocalBigFiles.addNode("bigFile" + i, "nt:file"); Node contentNode = localBigFile.addNode("jcr:content", "nt:resource"); // contentNode.setProperty("jcr:encoding", "UTF-8"); InputStream is = new FileInputStream(TEST_FILE); contentNode.setProperty("jcr:data", is); contentNode.setProperty("jcr:mimeType", "application/octet-stream "); is.close(); System.out.println("Data is set: " + TEST_FILE); // contentNode.setProperty("jcr:mimeType", "video/avi"); contentNode.setProperty("jcr:lastModified", Calendar.getInstance()); session.save(); System.out.println("Saved: " + TEST_FILE + " " + Runtime.getRuntime().freeMemory()); endTime = System.currentTimeMillis(); log.info("Execution time after adding and saving (local big):" + ((endTime - startTime) / 1000) + "s"); } // Exporting repository content File file = File.createTempFile("tesSysExport", ".xml"); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file)); session.exportSystemView(testLocalBigFiles.getPath(), bufferedOutputStream, false, false); bufferedOutputStream.flush(); bufferedOutputStream.close(); assertTrue(file.length() > 0); // removing source node testLocalBigFiles.remove(); session.save(); BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file)); // importing content session.importXML(root.getPath(), bufferedInputStream, ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING); session.save(); Node n1 = root.getNode("testLocalBigFiles"); for (int i = 0; i < FILES_COUNT; i++) { String TEST_FILE = fileList.get(i); Node lbf = n1.getNode("bigFile" + i); Node content = lbf.getNode("jcr:content"); // comparing with source file compareStream(new BufferedInputStream(new FileInputStream(TEST_FILE)), content.getProperty("jcr:data") .getStream()); } n1.remove(); session.save(); file.deleteOnExit(); file.delete(); } public File createBLOBTempFile(int sizeInb) throws IOException { // create test file byte[] data = new byte[1024]; // 1Kb File testFile = File.createTempFile("exportImportFileTest", ".tmp"); FileOutputStream tempOut = new FileOutputStream(testFile); Random random = new Random(); for (int i = 0; i < sizeInb; i += 1024) { if (i + 1024 > sizeInb) { byte[] rest = new byte[sizeInb - i]; random.nextBytes(rest); tempOut.write(rest); continue; } random.nextBytes(data); tempOut.write(data); } tempOut.close(); testFile.deleteOnExit(); // delete on test exit log.info("Temp file created: " + testFile.getAbsolutePath() + " size: " + testFile.length()); return testFile; } }