/*
* 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.api.observation;
import org.exoplatform.services.jcr.JcrAPIBaseTest;
import org.exoplatform.services.jcr.impl.core.SessionImpl;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.observation.Event;
public class TestSessionsObservation extends JcrAPIBaseTest
{
private Node testRootWs = null;
private Node nodeWs = null;
private SessionImpl sessionWs1 = null;
private Node testRootWs1 = null;
private Node nodeWs1 = null;
@Override
public void setUp() throws Exception
{
super.setUp();
testRootWs = root.addNode("observationTest");
nodeWs = testRootWs.addNode("node");
session.save();
sessionWs1 = (SessionImpl)repository.login(credentials, "ws1");
testRootWs1 = sessionWs1.getRootNode().addNode("observationTest");
nodeWs1 = testRootWs1.addNode("node");
sessionWs1.save();
}
@Override
protected void tearDown() throws Exception
{
testRootWs.remove();
session.save();
sessionWs1 = (SessionImpl)repository.login(credentials, "ws1");
testRootWs1 = sessionWs1.getRootNode().getNode("observationTest");
testRootWs1.remove();
sessionWs1.save();
super.tearDown();
}
public void testSessionOpen() throws RepositoryException
{
int counter = 0;
SimpleListener listener = new SimpleListener("testSessionOpen", log, counter);
try
{
sessionWs1.getWorkspace().getObservationManager().addEventListener(listener, Event.NODE_ADDED,
testRootWs1.getPath() + "/n1", false, null, null, false);
Node n1 = testRootWs1.addNode("n1"); // /observationTest/n1
Node n1n2 = n1.addNode("n2"); // /observationTest/n1/n2
sessionWs1.save();
assertEquals("A events count expected 1. ", 1, listener.getCounter());
}
finally
{
sessionWs1.getWorkspace().getObservationManager().removeEventListener(listener);
}
}
public void testSessionClosed() throws Exception
{
int counter = 0;
SimpleListener listener = new SimpleListener("testSessionOpen", log, counter);
try
{
sessionWs1.getWorkspace().getObservationManager().addEventListener(listener, Event.NODE_ADDED,
testRootWs1.getPath() + "/n1", false, null, null, false);
sessionWs1.logout();
System.gc();
Thread.sleep(1000);
SessionImpl anotherWs1 = (SessionImpl)repository.login(credentials, "ws1");
try
{
Node n1 = anotherWs1.getRootNode().getNode(testRootWs1.getName()).addNode("n1"); // /
// observationTest
// /n1
Node n1n2 = n1.addNode("n2"); // /observationTest/n1/n2
anotherWs1.save();
assertEquals("A events count expected 1. ", 1, listener.getCounter());
}
catch (Exception e)
{
fail("No exception was expected but we got : " + e.getMessage());
}
}
finally
{
sessionWs1.getWorkspace().getObservationManager().removeEventListener(listener);
}
}
public void testMultipleSessionClosed() throws Exception
{
SimpleListener addListener = new SimpleListener("testMultipleSessionClosed__add_nt:file", log, 0);
SimpleListener removeListener = new SimpleListener("testMultipleSessionClosed__remove", log, 0);
try
{
sessionWs1.getWorkspace().getObservationManager().addEventListener(addListener, Event.NODE_ADDED,
testRootWs1.getPath(), true, null, new String[]{"nt:file"}, false);
sessionWs1.logout();
System.gc();
Thread.sleep(1000);
// each session will add two nodes, one of them is mix:referenceable
int sessionCount = 300; // can't be smaller removeCount, see below
int removeCount = 100;
int removeIndex = 0;
for (int i = 0; i < sessionCount; i++)
{
SessionImpl anotherWs1 = (SessionImpl)repository.login(credentials, "ws1");
try
{
Node n1 = anotherWs1.getRootNode().getNode(testRootWs1.getName()).addNode("n" + i, "nt:file"); // /
// observationTest
// /
// n1
Node n1n2 = n1.addNode("jcr:content", "nt:unstructured"); // /observationTest/nXXXX/jcr:
// content
n1n2.addMixin("mix:referenceable");
anotherWs1.save();
if (i == removeCount)
{
anotherWs1.getWorkspace().getObservationManager().addEventListener(removeListener,
Event.PROPERTY_REMOVED, testRootWs1.getPath(), true, null, null, true); // no local
removeIndex = i + removeCount;
}
else if (i > removeCount && i <= removeIndex)
{
// remove prop:
// jcr:content --> jcr:primaryType, jcr:mixinTypes, jcr:uuid
// nt:file --> jcr:primaryType, jcr:created
n1.remove();
anotherWs1.save();
}
}
catch (Exception e)
{
fail("No exception was expected but we got : " + e.getMessage());
}
finally
{
anotherWs1.logout();
}
}
assertEquals("A events count expected ", sessionCount, addListener.getCounter());
assertEquals("A events count expected ", removeCount * 5, removeListener.getCounter());
}
finally
{
sessionWs1.getWorkspace().getObservationManager().removeEventListener(addListener);
sessionWs1.getWorkspace().getObservationManager().removeEventListener(removeListener);
}
}
public void testListenerRemoved() throws Exception
{
SimpleListener listener1 = new SimpleListener("testListenerRemoved1", log, 0);
SimpleListener listener2 = new SimpleListener("testListenerRemoved2", log, 0);
try
{
sessionWs1.getWorkspace().getObservationManager().addEventListener(listener1, Event.NODE_ADDED,
testRootWs1.getPath() + "/n1", true, null, null, false);
sessionWs1.getWorkspace().getObservationManager().addEventListener(listener2, Event.PROPERTY_CHANGED,
testRootWs1.getPath() + "/n1", true, null, null, false);
sessionWs1.logout();
SessionImpl anotherWs1 = (SessionImpl)repository.login(credentials, "ws1");
try
{
Node n1 = anotherWs1.getRootNode().getNode(testRootWs1.getName()).addNode("n1"); // /
// observationTest
// /n1
Node n1n2 = n1.addNode("n2"); // /observationTest/n1/n2
n1n2.setProperty("prop", "observation property");
anotherWs1.save();
n1n2.setProperty("prop", "property edition 1"); // change 1
anotherWs1.save();
anotherWs1.getWorkspace().getObservationManager().removeEventListener(listener1);
Node n1n3 = n1.addNode("n3"); // /observationTest/n1/n3
n1n3.setProperty("prop", "observation property");
n1n2.setProperty("prop", "property edition 2"); // change 2
anotherWs1.save();
assertEquals("A events count expected", 1, listener1.getCounter());
assertEquals("A events count expected", 2, listener2.getCounter());
}
catch (Exception e)
{
fail("No exception was expected but we got : " + e.getMessage());
}
}
finally
{
sessionWs1.getWorkspace().getObservationManager().removeEventListener(listener1);
sessionWs1.getWorkspace().getObservationManager().removeEventListener(listener2);
}
}
public void testRemoveEventListener() throws Exception {
SimpleListener addListener = new SimpleListener("testMultipleSessionClosed__add_nt:file", log, 0);
try {
sessionWs1.getWorkspace().getObservationManager().addEventListener(addListener, Event.NODE_ADDED,
testRootWs1.getPath(), true, null, new String[]{"nt:file"}, false);
SessionImpl anotherWs1 = (SessionImpl) repository.login(credentials, "ws1");
anotherWs1.getWorkspace().getObservationManager().removeEventListener(addListener);
assertEquals(0, sessionWs1.getWorkspace().getObservationManager().getRegisteredEventListeners().getSize());
} catch (Exception e) {
fail("No exception was expected but we got : " + e.getMessage());
}
}
}