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.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<NodeRef> 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<NodeRef> nodeRefs = searchService.selectNodes(sourceNodeRef, importedRef, null, namespaceService, false);
if (nodeRefs.size() > 0)
{

View File

@@ -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<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();
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));
}

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,
namespacePrefixResolver, followAllParentLinks, useJCRXPath);