You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2006/03/24 16:17:23 UTC
svn commit: r388559 - in /jackrabbit/trunk/jackrabbit/src:
main/java/org/apache/jackrabbit/core/query/lucene/
test/java/org/apache/jackrabbit/core/observation/
test/java/org/apache/jackrabbit/core/query/
Author: mreutegg
Date: Fri Mar 24 07:17:20 2006
New Revision: 388559
URL: http://svn.apache.org/viewcvs?rev=388559&view=rev
Log:
JCR-257: Use separate index for jcr:system tree
- use common namespace mapping if there is a system index
- Added some test cases
Added:
jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/observation/VersionEventsTest.java (with props)
jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/query/VersionStoreQueryTest.java (with props)
Modified:
jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java
jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/query/lucene/SearchIndex.java
jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/observation/TestAll.java
jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/query/TestAll.java
Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java
URL: http://svn.apache.org/viewcvs/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java?rev=388559&r1=388558&r2=388559&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java Fri Mar 24 07:17:20 2006
@@ -77,11 +77,6 @@
private static final Logger log = LoggerFactory.getLogger(MultiIndex.class);
/**
- * Name of the file to persist search internal namespace mappings
- */
- private static final String NS_MAPPING_FILE = "ns_mappings.properties";
-
- /**
* Default name of the redo log file
*/
private static final String REDO_LOG = "redo.log";
@@ -201,19 +196,22 @@
* @param rootId id of the root node
* @param excludedIDs Set<NodeId> that contains uuids that should not
* be indexed nor further traversed.
+ * @param mapping the namespace mapping to use
* @throws IOException if an error occurs
*/
MultiIndex(File indexDir,
SearchIndex handler,
ItemStateManager stateMgr,
NodeId rootId,
- Set excludedIDs) throws IOException {
+ Set excludedIDs,
+ NamespaceMappings mapping) throws IOException {
this.indexDir = indexDir;
this.handler = handler;
this.cache = new DocNumberCache(handler.getCacheSize());
this.redoLog = new RedoLog(new File(indexDir, REDO_LOG));
this.excludedIDs = new HashSet(excludedIDs);
+ this.nsMappings = mapping;
if (indexNames.exists(indexDir)) {
indexNames.read(indexDir);
@@ -224,10 +222,6 @@
// try to remove deletable files if there are any
attemptDelete();
-
- // read namespace mappings
- File mapFile = new File(indexDir, NS_MAPPING_FILE);
- nsMappings = new NamespaceMappings(mapFile);
// initialize IndexMerger
merger = new IndexMerger(this);
Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/query/lucene/SearchIndex.java
URL: http://svn.apache.org/viewcvs/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/query/lucene/SearchIndex.java?rev=388559&r1=388558&r2=388559&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/query/lucene/SearchIndex.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/query/lucene/SearchIndex.java Fri Mar 24 07:17:20 2006
@@ -65,6 +65,11 @@
private static final Logger log = LoggerFactory.getLogger(SearchIndex.class);
/**
+ * Name of the file to persist search internal namespace mappings
+ */
+ private static final String NS_MAPPING_FILE = "ns_mappings.properties";
+
+ /**
* The default value for property {@link #minMergeDocs}.
*/
public static final int DEFAULT_MIN_MERGE_DOCS = 100;
@@ -197,8 +202,21 @@
excludedIDs.add(context.getExcludedNodeId());
}
- index = new MultiIndex(new File(path), this,
- context.getItemStateManager(), context.getRootId(), excludedIDs);
+ File indexDir = new File(path);
+
+ NamespaceMappings nsMappings;
+ if (context.getParentHandler() instanceof SearchIndex) {
+ // use system namespace mappings
+ SearchIndex sysIndex = (SearchIndex) context.getParentHandler();
+ nsMappings = sysIndex.getNamespaceMappings();
+ } else {
+ // read local namespace mappings
+ File mapFile = new File(indexDir, NS_MAPPING_FILE);
+ nsMappings = new NamespaceMappings(mapFile);
+ }
+
+ index = new MultiIndex(indexDir, this, context.getItemStateManager(),
+ context.getRootId(), excludedIDs, nsMappings);
if (index.getRedoLogApplied() || forceConsistencyCheck) {
log.info("Running consistency check...");
try {
Modified: jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/observation/TestAll.java
URL: http://svn.apache.org/viewcvs/jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/observation/TestAll.java?rev=388559&r1=388558&r2=388559&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/observation/TestAll.java (original)
+++ jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/observation/TestAll.java Fri Mar 24 07:17:20 2006
@@ -37,6 +37,7 @@
suite.addTestSuite(ReorderTest.class);
suite.addTestSuite(MixinTest.class);
+ suite.addTestSuite(VersionEventsTest.class);
return suite;
}
Added: jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/observation/VersionEventsTest.java
URL: http://svn.apache.org/viewcvs/jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/observation/VersionEventsTest.java?rev=388559&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/observation/VersionEventsTest.java (added)
+++ jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/observation/VersionEventsTest.java Fri Mar 24 07:17:20 2006
@@ -0,0 +1,202 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. 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 = helper.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();
+ }
+ }
+}
Propchange: jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/observation/VersionEventsTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/query/TestAll.java
URL: http://svn.apache.org/viewcvs/jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/query/TestAll.java?rev=388559&r1=388558&r2=388559&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/query/TestAll.java (original)
+++ jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/query/TestAll.java Fri Mar 24 07:17:20 2006
@@ -43,6 +43,7 @@
suite.addTestSuite(SkipDeletedNodesTest.class);
suite.addTestSuite(MixinTest.class);
suite.addTestSuite(DerefTest.class);
+ suite.addTestSuite(VersionStoreQueryTest.class);
// exclude long running tests per default
//suite.addTestSuite(MassiveRangeTest.class);
Added: jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/query/VersionStoreQueryTest.java
URL: http://svn.apache.org/viewcvs/jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/query/VersionStoreQueryTest.java?rev=388559&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/query/VersionStoreQueryTest.java (added)
+++ jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/query/VersionStoreQueryTest.java Fri Mar 24 07:17:20 2006
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. 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.query;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Node;
+import java.util.Calendar;
+
+/**
+ * <code>VersionStoreQueryTest</code> tests queries against the version store.
+ */
+public class VersionStoreQueryTest extends AbstractQueryTest {
+
+ /**
+ * Tests if after each checkin an additional node is returned in a result
+ * of a query.
+ */
+ public void testCheckin() throws RepositoryException {
+ // current time
+ Calendar c = Calendar.getInstance();
+ Node n1 = testRootNode.addNode(nodeName1);
+ n1.setProperty(propertyName1, c);
+ n1.addMixin(mixVersionable);
+ testRootNode.save();
+
+ String statement = "//*[@" + propertyName1 + "=xs:dateTime('" +
+ n1.getProperty(propertyName1).getString() + "')]";
+
+ Node v1 = n1.checkin().getNode(jcrFrozenNode);
+
+ executeXPathQuery(statement, new Node[]{n1,v1});
+
+ n1.checkout();
+ Node v2 = n1.checkin().getNode(jcrFrozenNode);
+
+ executeXPathQuery(statement, new Node[]{n1,v1,v2});
+
+ n1.checkout();
+ Node v3 = n1.checkin().getNode(jcrFrozenNode);
+
+ executeXPathQuery(statement, new Node[]{n1,v1,v2,v3});
+ }
+}
Propchange: jackrabbit/trunk/jackrabbit/src/test/java/org/apache/jackrabbit/core/query/VersionStoreQueryTest.java
------------------------------------------------------------------------------
svn:eol-style = native