use of javax.jcr.NamespaceException in project jackrabbit by apache.
the class XPathQueryBuilder method visit.
//---------------------< XPathVisitor >-------------------------------------
/**
* Implements the generic visit method for this <code>XPathVisitor</code>.
*
* @param node the current node as created by the XPath parser.
* @param data the current <code>QueryNode</code> created by this
* <code>XPathVisitor</code>.
* @return the current <code>QueryNode</code>. Can be different from
* <code>data</code>.
*/
public Object visit(SimpleNode node, Object data) {
QueryNode queryNode = (QueryNode) data;
switch(node.getId()) {
case JJTXPATH2:
queryNode = createPathQueryNode(node);
break;
case JJTROOT:
case JJTROOTDESCENDANTS:
if (queryNode instanceof PathQueryNode) {
((PathQueryNode) queryNode).setAbsolute(true);
} else {
exceptions.add(new InvalidQueryException("Unsupported root level query node: " + queryNode));
}
break;
case JJTSTEPEXPR:
if (isAttributeAxis(node)) {
if (queryNode.getType() == QueryNode.TYPE_RELATION || (queryNode.getType() == QueryNode.TYPE_DEREF && ((DerefQueryNode) queryNode).getRefProperty() == null) || queryNode.getType() == QueryNode.TYPE_ORDER || queryNode.getType() == QueryNode.TYPE_PATH || queryNode.getType() == QueryNode.TYPE_TEXTSEARCH) {
// traverse
node.childrenAccept(this, queryNode);
} else if (queryNode.getType() == QueryNode.TYPE_NOT) {
// is null expression
RelationQueryNode isNull = factory.createRelationQueryNode(queryNode, RelationQueryNode.OPERATION_NULL);
applyRelativePath(isNull);
node.childrenAccept(this, isNull);
NotQueryNode notNode = (NotQueryNode) queryNode;
NAryQueryNode parent = (NAryQueryNode) notNode.getParent();
parent.removeOperand(notNode);
parent.addOperand(isNull);
} else {
// not null expression
RelationQueryNode notNull = factory.createRelationQueryNode(queryNode, RelationQueryNode.OPERATION_NOT_NULL);
applyRelativePath(notNull);
node.childrenAccept(this, notNull);
((NAryQueryNode) queryNode).addOperand(notNull);
}
} else {
if (queryNode.getType() == QueryNode.TYPE_PATH) {
createLocationStep(node, (NAryQueryNode) queryNode);
} else if (queryNode.getType() == QueryNode.TYPE_TEXTSEARCH || queryNode.getType() == QueryNode.TYPE_RELATION) {
node.childrenAccept(this, queryNode);
} else {
// step within a predicate
RelationQueryNode tmp = factory.createRelationQueryNode(null, RelationQueryNode.OPERATION_NOT_NULL);
node.childrenAccept(this, tmp);
if (tmpRelPath == null) {
tmpRelPath = new PathBuilder();
}
PathQueryNode relPath = tmp.getRelativePath();
LocationStepQueryNode[] steps = relPath.getPathSteps();
Name nameTest = steps[steps.length - 1].getNameTest();
if (nameTest == null) {
// see LocationStepQueryNode javadoc on when getNameTest()==null: when it was a star (asterisk)
nameTest = RelationQueryNode.STAR_NAME_TEST;
}
tmpRelPath.addLast(nameTest);
}
}
break;
case JJTNAMETEST:
if (queryNode.getType() == QueryNode.TYPE_LOCATION || queryNode.getType() == QueryNode.TYPE_DEREF || queryNode.getType() == QueryNode.TYPE_RELATION || queryNode.getType() == QueryNode.TYPE_TEXTSEARCH || queryNode.getType() == QueryNode.TYPE_PATH) {
createNodeTest(node, queryNode);
} else if (queryNode.getType() == QueryNode.TYPE_ORDER) {
setOrderSpecPath(node, (OrderQueryNode) queryNode);
} else {
// traverse
node.childrenAccept(this, queryNode);
}
break;
case JJTELEMENTNAMEORWILDCARD:
if (queryNode.getType() == QueryNode.TYPE_LOCATION) {
SimpleNode child = (SimpleNode) node.jjtGetChild(0);
if (child.getId() != JJTANYNAME) {
createNodeTest(child, queryNode);
}
}
break;
case JJTTEXTTEST:
if (queryNode.getType() == QueryNode.TYPE_LOCATION) {
LocationStepQueryNode loc = (LocationStepQueryNode) queryNode;
loc.setNameTest(JCR_XMLTEXT);
}
break;
case JJTTYPENAME:
if (queryNode.getType() == QueryNode.TYPE_LOCATION) {
LocationStepQueryNode loc = (LocationStepQueryNode) queryNode;
String ntName = ((SimpleNode) node.jjtGetChild(0)).getValue();
try {
Name nt = resolver.getQName(ntName);
NodeTypeQueryNode nodeType = factory.createNodeTypeQueryNode(loc, nt);
loc.addPredicate(nodeType);
} catch (NameException e) {
exceptions.add(new InvalidQueryException("Not a valid name: " + ntName));
} catch (NamespaceException e) {
exceptions.add(new InvalidQueryException("Not a valid name: " + ntName));
}
}
break;
case JJTOREXPR:
NAryQueryNode parent = (NAryQueryNode) queryNode;
QueryNode orQueryNode = factory.createOrQueryNode(parent);
parent.addOperand(orQueryNode);
// traverse
node.childrenAccept(this, orQueryNode);
break;
case JJTANDEXPR:
parent = (NAryQueryNode) queryNode;
QueryNode andQueryNode = factory.createAndQueryNode(parent);
parent.addOperand(andQueryNode);
// traverse
node.childrenAccept(this, andQueryNode);
break;
case JJTCOMPARISONEXPR:
createExpression(node, (NAryQueryNode) queryNode);
break;
case JJTSTRINGLITERAL:
case JJTDECIMALLITERAL:
case JJTDOUBLELITERAL:
case JJTINTEGERLITERAL:
if (queryNode.getType() == QueryNode.TYPE_RELATION) {
assignValue(node, (RelationQueryNode) queryNode);
} else if (queryNode.getType() == QueryNode.TYPE_LOCATION) {
if (node.getId() == JJTINTEGERLITERAL) {
int index = Integer.parseInt(node.getValue());
((LocationStepQueryNode) queryNode).setIndex(index);
} else {
exceptions.add(new InvalidQueryException("LocationStep only allows integer literal as position index"));
}
} else {
exceptions.add(new InvalidQueryException("Parse error: data is not a RelationQueryNode"));
}
break;
case JJTUNARYMINUS:
if (queryNode.getType() == QueryNode.TYPE_RELATION) {
((RelationQueryNode) queryNode).setUnaryMinus(true);
} else {
exceptions.add(new InvalidQueryException("Parse error: data is not a RelationQueryNode"));
}
break;
case JJTFUNCTIONCALL:
queryNode = createFunction(node, queryNode);
break;
case JJTORDERBYCLAUSE:
root.setOrderNode(factory.createOrderQueryNode(root));
queryNode = root.getOrderNode();
node.childrenAccept(this, queryNode);
break;
case JJTORDERSPEC:
OrderQueryNode orderQueryNode = (OrderQueryNode) queryNode;
orderQueryNode.newOrderSpec();
node.childrenAccept(this, queryNode);
if (!orderQueryNode.isValid()) {
exceptions.add(new InvalidQueryException("Invalid order specification. (Missing @?)"));
}
break;
case JJTORDERMODIFIER:
if (node.jjtGetNumChildren() > 0 && ((SimpleNode) node.jjtGetChild(0)).getId() == JJTDESCENDING) {
((OrderQueryNode) queryNode).setAscending(false);
}
break;
case JJTPREDICATELIST:
if (queryNode.getType() == QueryNode.TYPE_PATH) {
// switch to last location
QueryNode[] operands = ((PathQueryNode) queryNode).getOperands();
queryNode = operands[operands.length - 1];
}
node.childrenAccept(this, queryNode);
break;
case JJTPREDICATE:
if (queryNode.getType() == QueryNode.TYPE_LOCATION || queryNode.getType() == QueryNode.TYPE_DEREF) {
node.childrenAccept(this, queryNode);
} else {
// predicate not allowed here
exceptions.add(new InvalidQueryException("Unsupported location for predicate"));
}
break;
case JJTDOTDOT:
if (queryNode instanceof LocationStepQueryNode) {
((LocationStepQueryNode) queryNode).setNameTest(PATH_FACTORY.getParentElement().getName());
} else {
((RelationQueryNode) queryNode).addPathElement(PATH_FACTORY.getParentElement());
}
break;
default:
// per default traverse
node.childrenAccept(this, queryNode);
}
return queryNode;
}
use of javax.jcr.NamespaceException in project jackrabbit by apache.
the class NameParserTest method testExpandedJcrNames.
public void testExpandedJcrNames() throws NamespaceException, IllegalNameException {
NamespaceResolver resolver = new TestNamespaceResolver();
List<String[]> valid = new ArrayList<String[]>();
// valid qualified jcr-names:
// String-array consisting of { jcrName , uri , localName }
valid.add(new String[] { "abc:{c}", "abc", "{c}" });
valid.add(new String[] { "abc:}c", "abc", "}c" });
valid.add(new String[] { "abc:c}", "abc", "c}" });
valid.add(new String[] { "{ab", "", "{ab" });
valid.add(new String[] { "ab}", "", "ab}" });
valid.add(new String[] { "a}bc", "", "a}bc" });
valid.add(new String[] { "{", "", "{" });
valid.add(new String[] { "}", "", "}" });
valid.add(new String[] { "abc", "", "abc" });
valid.add(new String[] { "abc{abc}", "", "abc{abc}" });
valid.add(new String[] { "{{abc}", "", "{{abc}" });
valid.add(new String[] { "{abc{abc}", "", "{abc{abc}" });
valid.add(new String[] { "abc {", "", "abc {" });
valid.add(new String[] { "abc { }", "", "abc { }" });
valid.add(new String[] { "{ ab }", "", "{ ab }" });
valid.add(new String[] { "{ }abc", "", "{ }abc" });
// unknown uri -> but valid non-prefixed jcr-name
valid.add(new String[] { "{test}abc", "", "{test}abc" });
valid.add(new String[] { "{ab}", "", "{ab}" });
valid.add(new String[] { ".{.}", "", ".{.}" });
// valid expanded jcr-names:
// String-array consisting of { jcrName , uri , localName }
valid.add(new String[] { "{http://jackrabbit.apache.org}abc", "http://jackrabbit.apache.org", "abc" });
valid.add(new String[] { "{http://jackrabbit.apache.org:80}abc", "http://jackrabbit.apache.org:80", "abc" });
valid.add(new String[] { "{http://jackrabbit.apache.org/info}abc", "http://jackrabbit.apache.org/info", "abc" });
valid.add(new String[] { "{jcr:jackrabbit}abc", "jcr:jackrabbit", "abc" });
valid.add(new String[] { "{abc:}def", "abc:", "def" });
valid.add(new String[] { "{}abc", "", "abc" });
for (Object aValid : valid) {
String[] strs = (String[]) aValid;
try {
Name n = NameParser.parse(strs[0], resolver, factory);
assertEquals("URI mismatch", strs[1], n.getNamespaceURI());
assertEquals("Local name mismatch", strs[2], n.getLocalName());
} catch (Exception e) {
fail(e.getMessage() + " -> " + strs[0]);
}
}
// invalid jcr-names (neither expanded nor qualified form)
List<String> invalid = new ArrayList<String>();
// invalid prefix
invalid.add("{a:b");
invalid.add("}a:b");
invalid.add("a{b:c");
invalid.add("a}b:c");
// unknown uri -> but invalid local name with ':' and or '/'
invalid.add("{http//test.apache.org}abc");
invalid.add("{test/test/test}abc");
// invalid local name containing '/'
invalid.add("{http://jackrabbit.apache.org}abc/dfg");
// invalid local name containing ':'
invalid.add("{http://jackrabbit.apache.org}abc:dfg");
// invalid local name containing ':' and '/'
invalid.add("{{http://jackrabbit.apache.org}abc:dfg}");
// invalid local name containing '/'
invalid.add("/a/b/c");
// known uri but local name missing -> must fail.
invalid.add("{http://jackrabbit.apache.org}");
invalid.add("{}");
for (Object anInvalid : invalid) {
String jcrName = (String) anInvalid;
try {
NameParser.parse(jcrName, resolver, factory);
fail("Parsing '" + jcrName + "' should fail. Not a valid jcr name.");
} catch (IllegalNameException e) {
//ok
}
}
}
use of javax.jcr.NamespaceException in project jackrabbit by apache.
the class NameParserTest method testParse.
public void testParse() throws Exception {
for (JcrName t : tests) {
long t1 = System.currentTimeMillis();
for (int j = 0; j < NUM_TESTS; j++) {
try {
Name n = NameParser.parse(t.jcrName, resolver, factory);
if (!t.isValid()) {
fail("Should throw IllegalNameException: " + t.jcrName);
}
assertEquals("\"" + t.jcrName + "\".uri", t.prefix, n.getNamespaceURI());
assertEquals("\"" + t.jcrName + "\".localName", t.name, n.getLocalName());
} catch (IllegalNameException e) {
if (t.isValid()) {
throw e;
}
} catch (NamespaceException e) {
if (t.isValid()) {
throw e;
}
}
}
long t2 = System.currentTimeMillis();
if (NUM_TESTS > 1) {
System.out.println("testCreate():\t" + t + "\t" + (t2 - t1) + "\tms");
}
}
}
use of javax.jcr.NamespaceException in project jackrabbit by apache.
the class ParsingNameResolverTest method assertValidName.
/**
* Checks that the given name resolves to the given namespace URI and
* local part.
*
* @param name JCR name
* @param uri namespace URI
* @param local local part
*/
private void assertValidName(String name, String uri, String local) {
try {
Name qname = resolver.getQName(name);
assertEquals(name, uri, qname.getNamespaceURI());
assertEquals(name, local, qname.getLocalName());
assertEquals(name, name, resolver.getJCRName(qname));
} catch (NameException e) {
fail(name);
} catch (NamespaceException e) {
fail(name);
}
}
use of javax.jcr.NamespaceException in project jackrabbit by apache.
the class QueryFormat method visit.
public Object visit(LocationStepQueryNode node, Object data) throws RepositoryException {
StringBuffer sb = (StringBuffer) data;
if (node.getIncludeDescendants()) {
sb.append('/');
}
final Name[] nodeType = new Name[1];
node.acceptOperands(new DefaultQueryNodeVisitor() {
public Object visit(NodeTypeQueryNode node, Object data) {
nodeType[0] = node.getValue();
return data;
}
}, null);
if (nodeType[0] != null) {
sb.append("element(");
}
if (node.getNameTest() == null) {
sb.append("*");
} else {
try {
if (node.getNameTest().getLocalName().length() == 0) {
sb.append(resolver.getJCRName(XPathQueryBuilder.JCR_ROOT));
} else {
sb.append(resolver.getJCRName(encode(node.getNameTest())));
}
} catch (NamespaceException e) {
exceptions.add(e);
}
}
if (nodeType[0] != null) {
sb.append(", ");
try {
sb.append(resolver.getJCRName(encode(nodeType[0])));
} catch (NamespaceException e) {
exceptions.add(e);
}
sb.append(")");
}
if (node.getIndex() != LocationStepQueryNode.NONE) {
sb.append('[').append(node.getIndex()).append(']');
}
QueryNode[] predicates = node.getPredicates();
for (int i = 0; i < predicates.length; i++) {
// ignore node type query nodes
if (predicates[i].getType() == QueryNode.TYPE_NODETYPE) {
continue;
}
sb.append('[');
predicates[i].accept(this, sb);
sb.append(']');
}
return sb;
}
Aggregations