//basic solution to encode statement according to ISO9075 //this resolve problems for statement like this resolve enconding problems for statements like this //"catalogue/Home---Buildings-Solutions/house-phone/1-1wire/resources/resource[@id='test']" public Query createQuery(String s, String s1) throws InvalidQueryException, RepositoryException { // encode just before invoking jackrabbit querymanagerImpl query creation s = encodeISO9075(s); javax.jcr.query.Query query = this.queryManager.createQuery(s, s1); return (new QueryImpl(query, this.accessManager)); } // encoding statement ISO9075 private String encodeISO9075(String statement2) { //the statement is splitted with "/" separator String[] tokens = StringUtils.split(statement2, "/"); String[] encodedTokens = new String[]{}; for (String token : tokens) { //each token should be analized. In fact if it contains clause it should be further splitted String subBefore = containsNodeRelativeOperator(token); String ncName = ISO9075.encode(subBefore); //the encoded part and the remaining original part are joined againg String ncToken = StringUtils.join(new String[]{ncName, StringUtils.substringAfter(token, subBefore) }); encodedTokens = (String[]) ArrayUtils.add(encodedTokens, ncToken); } return StringUtils.join(encodedTokens, "/"); } //token is splitted if une of five structural characters are found and //substringBefore is returned. //This is clearly a very basic solution but works for 100% of our projects needs private String containsNodeRelativeOperator(String qToken) { Vector nros = new Vector(); nros.add("("); //this three are really useful for basic porpouse nros.add("("); nros.add("["); nros.add("@"); nros.add("]"); boolean contains = false; String qname = qToken; for (Object nro : nros.toArray()) { contains = StringUtils.contains(qToken, nro.toString()); if (contains) { qname = StringUtils.substringBefore(qname, nro.toString()); break; } } return qname; }