/* * 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.ext.access; import org.exoplatform.services.jcr.ext.BaseStandaloneTest; import org.exoplatform.services.jcr.impl.core.SessionImpl; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import java.util.ArrayList; import java.util.Random; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.Property; import javax.jcr.PropertyIterator; import javax.jcr.RepositoryException; /** * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a> * @version $Id: $ */ public class AccessContextTest extends BaseStandaloneTest { private static final Log log = ExoLogger.getLogger("exo.jcr.component.ext.AccessContextTest"); private final static int MULTI_THIARD_OPERATIONS = 100; private final static int THREAD_COUNT = 300; public void testAccessMenedgerContextMultiThread() throws RepositoryException, InterruptedException { Node multiACTNode = root.addNode("testMultiACT"); Random random = new Random(); int nextInt = 0; for (int i = 0; i < MULTI_THIARD_OPERATIONS; i++) { nextInt = random.nextInt(100); if (nextInt % 2 == 0) { multiACTNode.setProperty("deny" + i, i); } else { multiACTNode.setProperty("someNode" + i, i); } } session.save(); // Run each thread ArrayList<JCRClient4AccessContext> clients = new ArrayList<JCRClient4AccessContext>(); for (int i = 0; i < THREAD_COUNT; i++) { JCRClient4AccessContext jcrClient = new JCRClient4AccessContext(); 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 < THREAD_COUNT; i++) { JCRClient4AccessContext curClient = clients.get(i); if (curClient.isAlive()) { isNeedWait = true; break; } } Thread.sleep(100); } } protected class JCRClient4AccessContext extends Thread { private SessionImpl systemSession; private SessionImpl adminSession; private SessionImpl userSession; private Log log = ExoLogger.getLogger("exo.jcr.component.ext.JCRClient4AccessContextTest"); public JCRClient4AccessContext() { try { systemSession = repository.getSystemSession(); adminSession = repository.getSystemSession(); userSession = (SessionImpl)repository.login(credentials, "ws"); } catch (Exception e) { e.printStackTrace(); } } private void SequentialReadProperty() throws RepositoryException { Node sysNode = systemSession.getRootNode().getNode("testMultiACT"); Node adminNode = adminSession.getRootNode().getNode("testMultiACT"); Node userNode = userSession.getRootNode().getNode("testMultiACT"); for (PropertyIterator i = userNode.getProperties(); i.hasNext();) { i.nextProperty(); } } private void SequentialReadNode() throws RepositoryException { Node sysNode = systemSession.getRootNode().getNode("testMultiACT"); Node adminNode = systemSession.getRootNode().getNode("testMultiACT"); Node userNode = systemSession.getRootNode().getNode("testMultiACT"); for (NodeIterator i = sysNode.getNodes(); i.hasNext();) { i.nextNode(); } for (PropertyIterator i = adminNode.getProperties(); i.hasNext();) { Property prop = i.nextProperty(); try { prop.getValue().getString(); } catch (RepositoryException e) { log.error("Exception must not to throw"); } } for (PropertyIterator i = userNode.getProperties(); i.hasNext();) { Property prop = i.nextProperty(); try { prop.getValue().getString(); if (prop.getName().indexOf("deny") > -1) { log.error("Exception must throw"); } } catch (RepositoryException e) { } } } private void ParalelRead() { for (int i = 0; i < MULTI_THIARD_OPERATIONS; i++) { } } @Override public void run() { try { SequentialReadProperty(); // SequentialReadNode(); ParalelRead(); } catch (RepositoryException e) { e.printStackTrace(); log.error("Error"); } } } }