diff --git a/source/java/org/alfresco/repo/search/SearcherComponentTest.java b/source/java/org/alfresco/repo/search/SearcherComponentTest.java index 87fc2404c6..ef59332f31 100644 --- a/source/java/org/alfresco/repo/search/SearcherComponentTest.java +++ b/source/java/org/alfresco/repo/search/SearcherComponentTest.java @@ -121,7 +121,6 @@ public class SearcherComponentTest extends TestCase public void testNodeXPath() throws Exception { - Map assocRefs = BaseNodeServiceTest.buildNodeGraph(nodeService, rootNodeRef); Map properties = new HashMap(); @@ -274,6 +273,12 @@ public class SearcherComponentTest extends TestCase xpath.addNamespace(BaseNodeServiceTest.TEST_PREFIX, BaseNodeServiceTest.NAMESPACE); list = xpath.selectNodes(assocRefs.get(qname)); assertEquals(1, list.size()); + + xpathStr = "test:root_p_n1 | test:root_p_n2"; + xpath = new NodeServiceXPath(xpathStr, documentNavigator, null); + xpath.addNamespace(BaseNodeServiceTest.TEST_PREFIX, BaseNodeServiceTest.NAMESPACE); + list = xpath.selectNodes(new ChildAssociationRef(null, null, null, rootNodeRef)); + assertEquals(2, list.size()); } public void testSelectAPI() throws Exception @@ -296,6 +301,51 @@ public class SearcherComponentTest extends TestCase List attributes = searcher.selectProperties(rootNodeRef, "//@test:animal", null, namespacePrefixResolver, false); assertEquals(1, attributes.size()); + + NodeRef n1 = assocRefs.get(QName.createQName(BaseNodeServiceTest.NAMESPACE, "root_p_n1")).getChildRef(); + NodeRef n2 = assocRefs.get(QName.createQName(BaseNodeServiceTest.NAMESPACE, "root_p_n2")).getChildRef(); + + answer = searcher.selectNodes(rootNodeRef, "test:root_p_n1 | test:root_p_n2", null, namespacePrefixResolver, false); + assertEquals(2, answer.size()); + assertTrue(answer.contains(n1)); + assertTrue(answer.contains(n2)); + + NodeRef n3 = assocRefs.get(QName.createQName(BaseNodeServiceTest.NAMESPACE, "n1_p_n3")).getChildRef(); + + answer = searcher.selectNodes(rootNodeRef, "//@test:animal", null, namespacePrefixResolver, false); + assertEquals(1, answer.size()); + assertTrue(answer.contains(n3)); + + answer = searcher.selectNodes(rootNodeRef, "*//.[@test:animal]", null, namespacePrefixResolver, false); + assertEquals(1, answer.size()); + assertTrue(answer.contains(n3)); + + answer = searcher.selectNodes(rootNodeRef, "*//.[@test:animal='monkey']", null, namespacePrefixResolver, false); + assertEquals(1, answer.size()); + assertTrue(answer.contains(n3)); + + answer = searcher.selectNodes(rootNodeRef, "//.[@test:animal='monkey']", null, namespacePrefixResolver, false); + assertEquals(1, answer.size()); + assertTrue(answer.contains(n3)); + + answer = searcher.selectNodes(rootNodeRef, "*//.[@test:animal='monkey']", null, namespacePrefixResolver, false); + assertEquals(1, answer.size()); + assertTrue(answer.contains(n3)); + + answer = searcher.selectNodes(rootNodeRef, "//*[like(@test:animal, 'monk*')]", null, namespacePrefixResolver, false); + assertEquals(1, answer.size()); + assertTrue(answer.contains(n3)); + + answer = searcher.selectNodes(rootNodeRef, "//@*", null, namespacePrefixResolver, false); + assertEquals(9, answer.size()); + + QName qname = QName.createQName(BaseNodeServiceTest.NAMESPACE, "my@test_with_at_sign"); + ChildAssociationRef assoc = nodeService.createNode(n1, BaseNodeServiceTest.ASSOC_TYPE_QNAME_TEST_CHILDREN, qname, ContentModel.TYPE_CONTAINER); + NodeRef n4 = assoc.getChildRef(); + + answer = searcher.selectNodes(rootNodeRef, "/test:root_p_n1/test:my@test_with_at_sign", null, namespacePrefixResolver, false); + assertEquals(1, answer.size()); + assertTrue(answer.contains(n4)); } /** diff --git a/source/java/org/alfresco/repo/search/impl/NodeSearcher.java b/source/java/org/alfresco/repo/search/impl/NodeSearcher.java index 6b303010e5..5fb123ec28 100644 --- a/source/java/org/alfresco/repo/search/impl/NodeSearcher.java +++ b/source/java/org/alfresco/repo/search/impl/NodeSearcher.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2007 Alfresco Software Limited. + * Copyright (C) 2005-2009 Alfresco Software Limited. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -123,11 +123,15 @@ public class NodeSearcher throw new IllegalArgumentException("Malformed order by expression " + split[1]); } } - } - } - + else + { + // match '@' in a folder/filename (but do not match XPath query syntax '[@' or '/@' or '(@' or '@*') + // TODO cannot yet match '(@' or '[@' in a folder/filename - would need to identify and encode path elements + xpath = xpath.replaceAll("(?