/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jackrabbit.test.api.query.qom; import javax.jcr.Node; import javax.jcr.PropertyType; import javax.jcr.RepositoryException; import javax.jcr.Value; import javax.jcr.query.qom.DynamicOperand; import javax.jcr.query.qom.QueryObjectModelConstants; import javax.jcr.query.qom.QueryObjectModel; /** * <code>UpperLowerCaseTest</code> performs tests with upper- and lower-case * operands. */ public class UpperLowerCaseTest extends AbstractQOMTest { private Node node; protected void setUp() throws Exception { super.setUp(); node = testRootNode.addNode(nodeName1, testNodeType); node.setProperty(propertyName1, "abc"); node.setProperty(propertyName2, "ABC"); superuser.save(); } protected void tearDown() throws Exception { node = null; super.tearDown(); } public void testLength() throws RepositoryException { String lenStr = String.valueOf(node.getProperty(propertyName1).getLength()); // upper case checkQueries(qf.length(qf.propertyValue("s", propertyName1)), true, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, new String[]{lenStr.toUpperCase()}, PropertyType.STRING, new boolean[]{true}); // lower case checkQueries(qf.length(qf.propertyValue("s", propertyName1)), false, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, new String[]{lenStr.toLowerCase()}, PropertyType.STRING, new boolean[]{true}); } public void testNodeLocalName() throws RepositoryException { String localName = getLocalName(node.getName()); // upper case checkQueries(qf.nodeLocalName("s"), true, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, new String[]{localName.toLowerCase(), localName.toUpperCase()}, PropertyType.STRING, new boolean[]{false, true}); // lower case checkQueries(qf.nodeLocalName("s"), false, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, new String[]{localName.toLowerCase(), localName.toUpperCase()}, PropertyType.STRING, new boolean[]{true, false}); } public void testNodeName() throws RepositoryException { // upper case checkQueries(qf.nodeName("s"), true, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, new String[]{node.getName().toLowerCase(), node.getName().toUpperCase()}, PropertyType.NAME, new boolean[]{false, true}); // lower case checkQueries(qf.nodeName("s"), false, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, new String[]{node.getName().toLowerCase(), node.getName().toUpperCase()}, PropertyType.NAME, new boolean[]{true, false}); } public void testPropertyValue() throws RepositoryException { // upper case checkQueries(qf.propertyValue("s", propertyName1), true, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, new String[]{"abc", "Abc", "aBc", "abC", "ABC"}, PropertyType.STRING, new boolean[]{false, false, false, false, true}); checkQueries(qf.propertyValue("s", propertyName2), true, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, new String[]{"abc", "Abc", "aBc", "abC", "ABC"}, PropertyType.STRING, new boolean[]{false, false, false, false, true}); // lower case checkQueries(qf.propertyValue("s", propertyName1), false, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, new String[]{"abc", "Abc", "aBc", "abC", "ABC"}, PropertyType.STRING, new boolean[]{true, false, false, false, false}); checkQueries(qf.propertyValue("s", propertyName2), false, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, new String[]{"abc", "Abc", "aBc", "abC", "ABC"}, PropertyType.STRING, new boolean[]{true, false, false, false, false}); } public void testUpperLowerCase() throws RepositoryException { // first upper case, then lower case again checkQueries(qf.upperCase(qf.propertyValue("s", propertyName1)), false, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, new String[]{"abc", "Abc", "aBc", "abC", "ABC"}, PropertyType.STRING, new boolean[]{true, false, false, false, false}); } public void testUpperCaseTwice() throws RepositoryException { // upper case twice checkQueries(qf.upperCase(qf.propertyValue("s", propertyName1)), true, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, new String[]{"abc", "Abc", "aBc", "abC", "ABC"}, PropertyType.STRING, new boolean[]{false, false, false, false, true}); } public void testLowerUpperCase() throws RepositoryException { // first lower case, then upper case again checkQueries(qf.lowerCase(qf.propertyValue("s", propertyName1)), true, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, new String[]{"abc", "Abc", "aBc", "abC", "ABC"}, PropertyType.STRING, new boolean[]{false, false, false, false, true}); } public void testLowerCaseTwice() throws RepositoryException { // lower case twice checkQueries(qf.lowerCase(qf.propertyValue("s", propertyName1)), false, QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO, new String[]{"abc", "Abc", "aBc", "abC", "ABC"}, PropertyType.STRING, new boolean[]{true, false, false, false, false}); } //-------------------------------< internal >------------------------------- private void checkQueries(DynamicOperand operand, boolean toUpper, String operator, String[] literals, int type, boolean[] matches) throws RepositoryException { for (int i = 0; i < literals.length; i++) { QueryObjectModel qom = createQuery(operand, toUpper, operator, vf.createValue(literals[i], type)); checkQOM(qom, matches[i] ? new Node[]{node} : new Node[0]); } } private QueryObjectModel createQuery(DynamicOperand operand, boolean toUpper, String operator, Value literal) throws RepositoryException { if (toUpper) { operand = qf.upperCase(operand); } else { operand = qf.lowerCase(operand); } return qf.createQuery( qf.selector(testNodeType, "s"), qf.and( qf.childNode("s", testRoot), qf.comparison( operand, operator, qf.literal(literal) ) ), null, null); } }