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
This commit is contained in:
Jan Vonka
2010-09-02 16:00:14 +00:00
parent 846d79c06e
commit f41285ba21
3 changed files with 17 additions and 11 deletions

View File

@@ -50,7 +50,6 @@ import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.XPathException; import org.alfresco.service.cmr.repository.XPathException;
import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; 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.rule.RuleService;
import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.cmr.security.AccessPermission; 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.cmr.view.ImporterBinding.UUID_BINDING;
import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName; 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.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.ResourceLoader;
import org.springframework.extensions.surf.util.ParameterCheck;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.xml.sax.ContentHandler; import org.xml.sax.ContentHandler;
@@ -321,7 +321,7 @@ public class ImporterComponent
{ {
String[] qnameComponents = QName.splitPrefixedQName(segments[i]); String[] qnameComponents = QName.splitPrefixedQName(segments[i]);
QName segmentQName = QName.createQName(qnameComponents[0], QName.createValidLocalName(qnameComponents[1]), namespaceService); 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)) if (i < (segments.length -1))
{ {
@@ -1053,6 +1053,7 @@ public class ImporterComponent
} }
else if (importedRef.startsWith("/")) else if (importedRef.startsWith("/"))
{ {
importedRef = createValidPath(importedRef);
List<NodeRef> nodeRefs = searchService.selectNodes(sourceNodeRef, importedRef, null, namespaceService, false); List<NodeRef> nodeRefs = searchService.selectNodes(sourceNodeRef, importedRef, null, namespaceService, false);
if (nodeRefs.size() > 0) if (nodeRefs.size() > 0)
{ {
@@ -1071,6 +1072,7 @@ public class ImporterComponent
// resolve relative path // resolve relative path
try try
{ {
importedRef = createValidPath(importedRef);
List<NodeRef> nodeRefs = searchService.selectNodes(sourceNodeRef, importedRef, null, namespaceService, false); List<NodeRef> nodeRefs = searchService.selectNodes(sourceNodeRef, importedRef, null, namespaceService, false);
if (nodeRefs.size() > 0) if (nodeRefs.size() > 0)
{ {

View File

@@ -349,10 +349,20 @@ public class SearcherComponentTest extends TestCase
assertEquals(9, answer.size()); assertEquals(9, answer.size());
QName qname = QName.createQName(BaseNodeServiceTest.NAMESPACE, "my@test_with_at_sign"); 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<QName, Serializable> properties = new HashMap<QName, Serializable>();
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(); 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()); assertEquals(1, answer.size());
assertTrue(answer.contains(n4)); assertTrue(answer.contains(n4));
} }

View File

@@ -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("(?<![/\\[(])@(?!//*)", "_x0040_");
}
DocumentNavigator documentNavigator = new DocumentNavigator(dictionaryService, nodeService, searchService, DocumentNavigator documentNavigator = new DocumentNavigator(dictionaryService, nodeService, searchService,
namespacePrefixResolver, followAllParentLinks, useJCRXPath); namespacePrefixResolver, followAllParentLinks, useJCRXPath);