/*
* Copyright (C) 2003-2007 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.services.jcr.lab.query;
import org.exoplatform.services.jcr.core.CredentialsImpl;
import org.exoplatform.services.jcr.impl.core.NodeImpl;
import org.exoplatform.services.jcr.impl.core.SessionImpl;
import org.exoplatform.services.jcr.impl.core.query.BaseQueryTest;
import org.exoplatform.services.jcr.util.IdGenerator;
import java.io.File;
import java.io.FileInputStream;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import javax.jcr.Credentials;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Session;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
/**
* Created by The eXo Platform SAS Author : Sergey Karpenko <sergey.karpenko@exoplatform.com.ua>
*
* @version $Id: $
*/
public class TestErrorMultithreading extends BaseQueryTest
{
public static final int COUNT = 5;
public static final int NODE_COUNT = 10;
public static final int THREADS_COUNT = 10;
public static final String THREAD_NAME = "name";
public void tearDown()
{
}
public void testRunActions() throws Exception
{
// fillRepo();
// checkRepo();
// checkRepoByContent();
loadLargeFiles();
}
private void loadLargeFiles() throws Exception
{
class Writer extends Thread
{
public String name;
public Session sess;
File file = new File("src/test/resources/LARGE.txt");
public FileInputStream fis = null;
Writer(String name, Session s)
{
this.name = name;
this.sess = s;
}
public void run()
{
System.out.println(name + " - START");
try
{
Node root = sess.getRootNode();
for (int i = 0; i < 100000; i++)
{
IdGenerator obj;
String fileName = IdGenerator.generate();// + "_" + i;
NodeImpl node = (NodeImpl)root.addNode(fileName, "nt:file");
NodeImpl cont = (NodeImpl)node.addNode("jcr:content", "nt:resource");
cont.setProperty("jcr:mimeType", "text/plain");
cont.setProperty("jcr:lastModified", Calendar.getInstance());
fis = new FileInputStream(file);
cont.setProperty("jcr:data", fis);
root.save();
System.out.println(fileName + " saved");
fis.close();
}
}
catch (Exception e)
{
e.printStackTrace();
}
System.out.println(name + " - STOP");
}
}
Set<Writer> writers = new HashSet<Writer>();
// create
for (int t = 0; t < 10; t++)
{
Credentials credentials = new CredentialsImpl("admin", "admin".toCharArray());
Session ss = (SessionImpl)repository.login(credentials, "ws");
Writer wr = new Writer(THREAD_NAME + t, ss);
writers.add(wr);
}
// start
Iterator<Writer> it = writers.iterator();
while (it.hasNext())
{
it.next().start();
}
// join
it = writers.iterator();
while (it.hasNext())
{
it.next().join();
}
}
private void fillRepo() throws Exception
{
class Writer extends Thread
{
public String name;
public Session sess;
Writer(String name, Session s)
{
this.name = name;
this.sess = s;
super.setName(this.name); // super.getName() + ", " +
}
public void run()
{
System.out.println(name + " - START");
try
{
Node root = sess.getRootNode();
for (int i = 0; i < COUNT; i++)
{
for (int j = 0; j < NODE_COUNT; j++)
{
int num = i * NODE_COUNT * 10 + j;
String n = name + "_" + num;
root.addNode(n);
System.out.println("ADD " + n);
}
root.save();
System.out.println(name + " - SAVE");
}
}
catch (Exception e)
{
System.out.println();
System.out.println(name + "-thread error");
e.printStackTrace();
}
System.out.println(name + " - FINISH");
}
}
Set<Writer> writers = new HashSet<Writer>();
// create
for (int t = 0; t < THREADS_COUNT; t++)
{
Credentials credentials = new CredentialsImpl("admin", "admin".toCharArray());
Session ss = (SessionImpl)repository.login(credentials, "ws");
Writer wr = new Writer(THREAD_NAME + t, ss);
writers.add(wr);
}
// start
Iterator<Writer> it = writers.iterator();
while (it.hasNext())
{
it.next().start();
}
// join
it = writers.iterator();
while (it.hasNext())
{
it.next().join();
}
System.out.println("FINISH!");
Object obj = new Object();
synchronized (obj)
{
try
{
obj.wait(10000);
}
catch (Exception e)
{
}
}
}
private void checkRepo() throws Exception
{
QueryManager qman = this.workspace.getQueryManager();
for (int t = 0; t < THREADS_COUNT; t++)
{
String name = THREAD_NAME + t;
for (int i = 0; i < COUNT; i++)
{
for (int j = 0; j < NODE_COUNT; j++)
{
int num = i * NODE_COUNT * 10 + j;
String n = name + "_" + num;
Query q = qman.createQuery("SELECT * FROM nt:unstructured WHERE jcr:path LIKE '/" + n + "'", Query.SQL);
QueryResult res = q.execute();
if (res.getNodes().getSize() != 1)
{
System.out.println("Thread " + t + " " + n + " NO");
}
}
}
}
}
private void checkRepoByContent() throws Exception
{
QueryManager qman = this.workspace.getQueryManager();
Node root = session.getRootNode();
NodeIterator it = root.getNodes();
System.out.append("SEARCH START");
System.out.println("Nodes: " + it.getSize());
while (it.hasNext())
{
Node node = it.nextNode();
String name = node.getName();
Query q = qman.createQuery("SELECT * FROM nt:unstructured WHERE jcr:path LIKE '/" + name + "'", Query.SQL);
QueryResult res = q.execute();
if (res.getNodes().getSize() != 1)
{
System.out.println(name + " NO");
}
}
System.out.append("SEARCH STOP");
}
}