mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
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:
@@ -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)
|
||||
{
|
||||
|
@@ -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));
|
||||
}
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user