/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jackrabbit.core.observation;
import org.apache.jackrabbit.test.api.observation.AbstractObservationTest;
import org.apache.jackrabbit.test.api.observation.EventResult;
import org.apache.jackrabbit.core.UserTransactionImpl;
import javax.jcr.RepositoryException;
import javax.jcr.Node;
import javax.jcr.Session;
import javax.jcr.observation.Event;
import javax.jcr.observation.ObservationManager;
import javax.jcr.version.Version;
import javax.transaction.UserTransaction;
import java.util.HashSet;
import java.util.Set;
/**
* <code>VersionEventsTest</code> checks if the correct events are triggered
* for version operations.
*/
public class VersionEventsTest extends AbstractObservationTest {
/**
* Test if checkin of a node creates two add node events: one for the
* version and one for the frozen node.
*/
public void testCheckin() throws RepositoryException {
// create versionable node
Node n1 = testRootNode.addNode(nodeName1);
n1.addMixin(mixVersionable);
testRootNode.save();
EventResult listener = new EventResult(log);
addEventListener(listener, Event.NODE_ADDED);
Version v = n1.checkin();
removeEventListener(listener);
Event[] events = listener.getEvents(1000);
Set paths = new HashSet();
for (int i = 0; i < events.length; i++) {
paths.add(events[i].getPath());
}
assertTrue("missing 'node added' event: " + v.getPath(), paths.contains(v.getPath()));
String frozenPath = v.getPath() + "/" + jcrFrozenNode;
assertTrue("missing 'node added' event: " + frozenPath, paths.contains(frozenPath));
}
/**
* Test if checkin of a node in an XA transaction creates two add node
* events: one for the version and one for the frozen node.
*/
public void testXACheckin() throws Exception {
// create versionable node
Node n1 = testRootNode.addNode(nodeName1);
n1.addMixin(mixVersionable);
testRootNode.save();
EventResult listener = new EventResult(log);
addEventListener(listener, Event.NODE_ADDED);
// use a transaction
UserTransaction utx = new UserTransactionImpl(superuser);
// start transaction
utx.begin();
Version v = n1.checkin();
// commit transaction
utx.commit();
removeEventListener(listener);
Event[] events = listener.getEvents(1000);
Set paths = new HashSet();
for (int i = 0; i < events.length; i++) {
paths.add(events[i].getPath());
}
assertTrue("missing 'node added' event: " + v.getPath(), paths.contains(v.getPath()));
String frozenPath = v.getPath() + "/" + jcrFrozenNode;
assertTrue("missing 'node added' event: " + frozenPath, paths.contains(frozenPath));
}
/**
* Test if removing a version triggers two node removed events: one for the
* version and one for the frozen node.
*/
public void testRemoveVersion() throws RepositoryException {
// create versionable node
Node n1 = testRootNode.addNode(nodeName1);
n1.addMixin(mixVersionable);
testRootNode.save();
Version v = n1.checkin();
String versionPath = v.getPath();
n1.remove();
testRootNode.save();
EventResult listener = new EventResult(log);
addEventListener(listener, Event.NODE_REMOVED);
v.getContainingHistory().removeVersion(v.getName());
removeEventListener(listener);
Event[] events = listener.getEvents(1000);
Set paths = new HashSet();
for (int i = 0; i < events.length; i++) {
paths.add(events[i].getPath());
}
assertTrue("missing 'node removed' event: " + versionPath, paths.contains(versionPath));
String frozenPath = versionPath + "/" + jcrFrozenNode;
assertTrue("missing 'node removed' event: " + frozenPath, paths.contains(frozenPath));
}
/**
* Test if removing a version in an XA transaction triggers two node removed
* events: one for the version and one for the frozen node.
*/
public void testXARemoveVersion() throws Exception {
// create versionable node
Node n1 = testRootNode.addNode(nodeName1);
n1.addMixin(mixVersionable);
testRootNode.save();
Version v = n1.checkin();
String versionPath = v.getPath();
n1.remove();
testRootNode.save();
EventResult listener = new EventResult(log);
addEventListener(listener, Event.NODE_REMOVED);
// use a transaction
UserTransaction utx = new UserTransactionImpl(superuser);
// start transaction
utx.begin();
v.getContainingHistory().removeVersion(v.getName());
// commit transaction
utx.commit();
removeEventListener(listener);
Event[] events = listener.getEvents(1000);
Set paths = new HashSet();
for (int i = 0; i < events.length; i++) {
paths.add(events[i].getPath());
}
assertTrue("missing 'node removed' event: " + versionPath, paths.contains(versionPath));
String frozenPath = versionPath + "/" + jcrFrozenNode;
assertTrue("missing 'node removed' event: " + frozenPath, paths.contains(frozenPath));
}
/**
* Test if checkin creates events also on a different workspace than the one
* where the checkin was executed.
*/
public void testCheckinOtherWorkspace() throws RepositoryException {
// create versionable node
Node n1 = testRootNode.addNode(nodeName1);
n1.addMixin(mixVersionable);
testRootNode.save();
Session s = getHelper().getReadOnlySession(workspaceName);
try {
EventResult listener = new EventResult(log);
ObservationManager obsMgr = s.getWorkspace().getObservationManager();
obsMgr.addEventListener(listener, Event.NODE_ADDED, "/", true,
null, null, false);
Version v = n1.checkin();
obsMgr.removeEventListener(listener);
Event[] events = listener.getEvents(1000);
Set paths = new HashSet();
for (int i = 0; i < events.length; i++) {
paths.add(events[i].getPath());
}
assertTrue("missing 'node removed': " + v.getPath(), paths.contains(v.getPath()));
String frozenPath = v.getPath() + "/" + jcrFrozenNode;
assertTrue("missing 'node removed': " + frozenPath, paths.contains(frozenPath));
} finally {
s.logout();
}
}
}