From f41285ba211d2a1cd763d8508c98a37b193ed091 Mon Sep 17 00:00:00 2001 From: Jan Vonka Date: Thu, 2 Sep 2010 16:00:14 +0000 Subject: [PATCH] Fix ALF-4363 - XPath based queries don't work when attribute value contains @ git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@22190 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../alfresco/repo/importer/ImporterComponent.java | 8 +++++--- .../repo/search/SearcherComponentTest.java | 14 ++++++++++++-- .../alfresco/repo/search/impl/NodeSearcher.java | 6 ------ 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/source/java/org/alfresco/repo/importer/ImporterComponent.java b/source/java/org/alfresco/repo/importer/ImporterComponent.java index 44df42bc80..ef4f9f505b 100644 --- a/source/java/org/alfresco/repo/importer/ImporterComponent.java +++ b/source/java/org/alfresco/repo/importer/ImporterComponent.java @@ -50,7 +50,6 @@ import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.XPathException; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; -import org.alfresco.service.cmr.repository.datatype.TypeConverter; import org.alfresco.service.cmr.rule.RuleService; import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.cmr.security.AccessPermission; @@ -67,12 +66,13 @@ import org.alfresco.service.cmr.view.Location; import org.alfresco.service.cmr.view.ImporterBinding.UUID_BINDING; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; -import org.springframework.extensions.surf.util.ParameterCheck; +import org.alfresco.util.ISO9075; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; +import org.springframework.extensions.surf.util.ParameterCheck; import org.springframework.util.StringUtils; import org.xml.sax.ContentHandler; @@ -321,7 +321,7 @@ public class ImporterComponent { String[] qnameComponents = QName.splitPrefixedQName(segments[i]); QName segmentQName = QName.createQName(qnameComponents[0], QName.createValidLocalName(qnameComponents[1]), namespaceService); - validPath.append(segmentQName.toPrefixString()); + validPath.append(ISO9075.getXPathName(segmentQName, namespaceService)); } if (i < (segments.length -1)) { @@ -1053,6 +1053,7 @@ public class ImporterComponent } else if (importedRef.startsWith("/")) { + importedRef = createValidPath(importedRef); List nodeRefs = searchService.selectNodes(sourceNodeRef, importedRef, null, namespaceService, false); if (nodeRefs.size() > 0) { @@ -1071,6 +1072,7 @@ public class ImporterComponent // resolve relative path try { + importedRef = createValidPath(importedRef); List nodeRefs = searchService.selectNodes(sourceNodeRef, importedRef, null, namespaceService, false); if (nodeRefs.size() > 0) { diff --git a/source/java/org/alfresco/repo/search/SearcherComponentTest.java b/source/java/org/alfresco/repo/search/SearcherComponentTest.java index 933b9d1e86..04b66af534 100644 --- a/source/java/org/alfresco/repo/search/SearcherComponentTest.java +++ b/source/java/org/alfresco/repo/search/SearcherComponentTest.java @@ -349,10 +349,20 @@ public class SearcherComponentTest extends TestCase 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); + + Map properties = new HashMap(); + properties.put(QName.createQName(BaseNodeServiceTest.NAMESPACE, "mytest"), "my@test_value_with_at_sign"); + + ChildAssociationRef assoc = nodeService.createNode(n1, BaseNodeServiceTest.ASSOC_TYPE_QNAME_TEST_CHILDREN, qname, ContentModel.TYPE_CONTAINER, properties); NodeRef n4 = assoc.getChildRef(); - answer = searcher.selectNodes(rootNodeRef, "/test:root_p_n1/test:my@test_with_at_sign", null, namespacePrefixResolver, false); + StringBuffer path = new StringBuffer().append("test:root_p_n1/").append(ISO9075.getXPathName(qname, namespacePrefixResolver)); + answer = searcher.selectNodes(rootNodeRef, path.toString(), null, namespacePrefixResolver, false); + assertEquals(1, answer.size()); + assertTrue(answer.contains(n4)); + + String xpathQuery = "//*[@test:mytest='my@test_value_with_at_sign']"; + answer = searcher.selectNodes(rootNodeRef, xpathQuery, 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 cef3181463..fd823b14ed 100644 --- a/source/java/org/alfresco/repo/search/impl/NodeSearcher.java +++ b/source/java/org/alfresco/repo/search/impl/NodeSearcher.java @@ -119,12 +119,6 @@ public class NodeSearcher } } } - 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("(?