/*
* 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 org.exoplatform.services.jcr.core.CredentialsImpl;
import org.exoplatform.services.jcr.impl.core.SessionImpl;
import java.io.FileInputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Calendar;
import javax.jcr.Node;
/**
* Created by The eXo Platform SAS.
*
* NOTE: Make sure you have the files pointed below!
*/
public class TestBinaryValueMultiThreading extends JcrAPIBaseTest
{
private int FILES_COUNT = 3;
private int CLIENTS_COUNT = 3;
private String LOCAL_BIG_FILE = null;
private static String LOCAL_SMALL_FILE;
static
{
URL url = TestBinaryValueMultiThreading.class.getResource("/index/test_index.doc");
assertNotNull("test_index.doc not found", url);
LOCAL_SMALL_FILE = url.getFile();
}
private static String REMOTE_BIG_FILE = "\\\\Exooffice\\public\\Tmp\\resources\\BigFile.zip";
private static String REMOTE_SMALL_FILE = "\\\\Exooffice\\public\\Tmp\\resources\\SmallFile.zip";
private static String URL_BIG_FILE = "http://localhost:8080/ecm/jcr?workspace=production&path=/BigFile.zip";
private static String URL_SMALL_FILE = "http://localhost:8080/ecm/jcr?workspace=production&path=/SmallFile.zip";
// private static String LOCAL_VERYBIG_MEDIA_FILE = "D:\\films\\test.avi";
// private static String URL_BIG_FILE =
// "http://localhost:8080/ecm/jcr?workspace=production&path=/testBinaryValue/BigFile.zip";
// private static String URL_BIG_FILE =
// "http://exooffice:8080/jcr-webdav/repository/production/Lost.Season3.Preview.rus.avi";
// private static String URL_BIG_MEDIA_FILE=
// "ftp://exoua.dnsalias.net/pub/video/Lost.Season3.Preview.rus.avi";
// private static String URL_VERYBIG_MEDIA_FILE =
// "ftp://exoua.dnsalias.net/pub/video/9_11_xchcoin.avi";
// private static String URL_SMALL_FILE =
// "http://localhost:8080/ecm/jcr?workspace=production&path=/testBinaryValue/SmallFile.zip";
// private static String URL_SMALL_FILE =
// "http://exooffice:8080/jcr-webdav/repository/production/SmallFile.zip";
// private static String URL_SMALL_FILE = "ftp://exoua.dnsalias.net/jcr/test/SmallFile.zip";
protected class TestJCRClient extends Thread
{
public void run()
{
log.info("Client started...");
SessionImpl clientSession = null;
try
{
clientSession = (SessionImpl)repository.login(new CredentialsImpl("exo", "exo".toCharArray()), "ws");
Node testLocalSmallFiles = clientSession.getRootNode().getNode("testLocalSmallFiles");
Node testLocalBigFiles = clientSession.getRootNode().getNode("testLocalBigFiles");
/*
* Node testRemoteSmallFiles = clientSession.getRootNode().getNode("testRemoteSmallFiles");
* Node testRemoteBigFiles = clientSession.getRootNode().getNode("testRemoteBigFiles"); Node
* testUrlSmallFiles = clientSession.getRootNode().getNode("testUrlSmallFiles"); Node
* testUrlBigFiles = clientSession.getRootNode().getNode("testUrlBigFiles");
*/
for (int i = 0; i < FILES_COUNT; i++)
{
// check streams
compareStream(new FileInputStream(LOCAL_SMALL_FILE), testLocalSmallFiles.getProperty(
"smallFile" + i + "/jcr:content/jcr:data").getStream());
compareStream(new FileInputStream(LOCAL_BIG_FILE), testLocalBigFiles.getProperty(
"bigFile" + i + "/jcr:content/jcr:data").getStream());
/*
* compareStream(new FileInputStream(REMOTE_SMALL_FILE),
* testRemoteSmallFiles.getProperty("smallFile" + i +
* "/jcr:content/jcr:data").getStream()); compareStream(new
* FileInputStream(REMOTE_BIG_FILE), testRemoteBigFiles.getProperty("bigFile" + i +
* "/jcr:content/jcr:data").getStream()); compareStream(new
* URL(URL_SMALL_FILE).openStream(), testUrlSmallFiles.getProperty("smallFile" + i +
* "/jcr:content/jcr:data").getStream()); compareStream(new
* URL(URL_BIG_FILE).openStream(), testUrlBigFiles.getProperty("bigFile" + i +
* "/jcr:content/jcr:data").getStream());
*/
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
/**
* The test must be runed in preconfigured environment: LOCAL_SMALL_FILE, etc vars
*/
public void testMultiThreadReading() throws Exception
{
// Local small files creating
Node testLocalSmallFiles = root.addNode("testLocalSmallFiles");
for (int i = 0; i < FILES_COUNT; i++)
{
Node localSmallFile = testLocalSmallFiles.addNode("smallFile" + i, "nt:file");
Node contentNode = localSmallFile.addNode("jcr:content", "nt:resource");
contentNode.setProperty("jcr:data", new FileInputStream(LOCAL_SMALL_FILE));
contentNode.setProperty("jcr:mimeType", "application/octet-stream");
contentNode.setProperty("jcr:lastModified", Calendar.getInstance());
}
// Local big files
if (LOCAL_BIG_FILE == null)
{
// create test file
LOCAL_BIG_FILE = createBLOBTempFile(3).getAbsolutePath();
}
Node testLocalBigFiles = root.addNode("testLocalBigFiles");
for (int i = 0; i < FILES_COUNT; i++)
{
Node localBigFile = testLocalBigFiles.addNode("bigFile" + i, "nt:file");
Node contentNode = localBigFile.addNode("jcr:content", "nt:resource");
contentNode.setProperty("jcr:data", new FileInputStream(LOCAL_BIG_FILE));
contentNode.setProperty("jcr:mimeType", "application/octet-stream");
contentNode.setProperty("jcr:lastModified", Calendar.getInstance());
}
// Remote small files
/*
* Node testRemoteSmallFiles = root.addNode("testRemoteSmallFiles"); for (int i = 0; i <
* FILES_COUNT; i++) { Node remoteSmallFile = testRemoteSmallFiles.addNode("smallFile" + i,
* "nt:file"); Node contentNode = remoteSmallFile.addNode("jcr:content", "nt:resource");
* contentNode.setProperty("jcr:data", new FileInputStream(REMOTE_SMALL_FILE));
* contentNode.setProperty("jcr:mimeType", "application/octet-stream ");
* contentNode.setProperty("jcr:lastModified", Calendar.getInstance()); } //Remote big files
* Node testRemoteBigFiles = root.addNode("testRemoteBigFiles"); for (int i = 0; i <
* FILES_COUNT; i++) { Node remoteBigFile = testRemoteBigFiles.addNode("bigFile" + i,
* "nt:file"); Node contentNode = remoteBigFile.addNode("jcr:content", "nt:resource");
* contentNode.setProperty("jcr:data", new FileInputStream(REMOTE_BIG_FILE));
* contentNode.setProperty("jcr:mimeType", "application/octet-stream ");
* contentNode.setProperty("jcr:lastModified", Calendar.getInstance()); } //Url small files Node
* testUrlSmallFiles = root.addNode("testUrlSmallFiles"); for (int i = 0; i < FILES_COUNT; i++)
* { Node urlSmallFile = testUrlSmallFiles.addNode("smallFile" + i, "nt:file"); Node contentNode
* = urlSmallFile.addNode("jcr:content", "nt:resource"); contentNode.setProperty("jcr:data", new
* URL(URL_SMALL_FILE).openStream()); contentNode.setProperty("jcr:mimeType",
* "application/octet-stream "); contentNode.setProperty("jcr:lastModified",
* Calendar.getInstance()); } //Url big files Node testUrlBigFiles =
* root.addNode("testUrlBigFiles"); for (int i = 0; i < FILES_COUNT; i++) { Node urlBigFile =
* testUrlBigFiles.addNode("bigFile" + i, "nt:file"); Node contentNode =
* urlBigFile.addNode("jcr:content", "nt:resource"); contentNode.setProperty("jcr:data", new
* URL(URL_BIG_FILE).openStream()); contentNode.setProperty("jcr:mimeType",
* "application/octet-stream "); contentNode.setProperty("jcr:lastModified",
* Calendar.getInstance()); }
*/
session.save();
// Nodes has been created
// Run each thread
ArrayList<TestJCRClient> clients = new ArrayList<TestJCRClient>();
for (int i = 0; i < CLIENTS_COUNT; i++)
{
TestJCRClient jcrClient = new TestJCRClient();
jcrClient.start();
clients.add(jcrClient);
}
// Next code is waiting for shutting down of all the threads
boolean isNeedWait = true;
while (isNeedWait)
{
isNeedWait = false;
for (int i = 0; i < CLIENTS_COUNT; i++)
{
TestJCRClient curClient = clients.get(i);
if (curClient.isAlive())
{
isNeedWait = true;
break;
}
}
Thread.sleep(100);
}
}
}