package org.apache.archiva.web.test; /* * 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. */ /** * Utility class for creating xpath expressions */ public class XPathExpressionUtil { public static final String CONTAINS = "contains"; public static final String AND = " and "; public static final String CURRENT_NODE = "./"; public static final String PARENT_NODE = "../"; public static final String GRANDPARENT_NODE = "../../"; public static final String ELEMENT_ANY_LEVEL = "//"; public static final String TABLE_COLUMN = "td"; public static final String TABLE_ROW = "tr"; public static final String START_NODE_TEST = "["; public static final String END_NODE_TEST = "]"; public static final String ANCHOR = "a"; public static final String IMG = "img"; public static final String LIST = "ul"; public static final String LINE = "li"; public static String getList( String[] values ) { String xpathExpression = ""; if ( values.length > 0 ) { xpathExpression += ELEMENT_ANY_LEVEL; xpathExpression += LIST; xpathExpression += START_NODE_TEST; for ( int nIndex = 0; nIndex < values.length; nIndex++ ) { xpathExpression += ( ( nIndex > 0 ) ? AND : "" ); xpathExpression += contains( LINE + position( nIndex + 1 ), values[nIndex] ); } xpathExpression += END_NODE_TEST; } return xpathExpression; } /** * expression for acquiring an element in one of the table columns * * @param element the node element * @param elementIndex column index of the element, used for skipping * @param columnValues the values to be matched in each column, element column is included * @return */ public static String getColumnElement( String element, int elementIndex, String[] columnValues ) { return getColumnElement( element, elementIndex, null, columnValues ); } /** * expression for acquiring an element in one of the table columns * * @param element the node element * @param elementIndex column index of the element, used for skipping * @param elementValue the matched element value * @param columnValues the values to be matched in each column, element column is included * @return */ public static String getColumnElement( String element, int elementIndex, String elementValue, String[] columnValues ) { return getColumnElement( element, elementIndex, elementValue, "TEXT", columnValues ); } /** * expression for acquiring an element in one of the table columns * * @param element the node element * @param elementIndex column index of the element, used for skipping * @param imageName the matched image name * @param columnValues the values to be matched in each column, element column is included * @return */ public static String getImgColumnElement( String element, int elementIndex, String imageName, String[] columnValues ) { return getColumnElement( element, elementIndex, imageName, IMG, columnValues ); } /** * expression for acquiring an element in one of the table columns * * @param element the node element * @param elementIndex column index of the element, used for skipping * @param imageName the matched image name * @param columnValues the values to be matched in each column, element column is included * @return */ private static String getColumnElement( String element, int elementIndex, String elementValue, String elementValueType, String[] columnValues ) { String xpathExpression = null; if ( ( columnValues != null ) && ( columnValues.length > 0 ) ) { xpathExpression = ELEMENT_ANY_LEVEL + element; xpathExpression += START_NODE_TEST; if ( elementValue != null ) { if ( "TEXT".equals( elementValueType ) ) { xpathExpression += contains( elementValue ); xpathExpression += ( columnValues.length > 0 ) ? AND : ""; } } // we are two levels below the table row element ( tr/td/<element> ) xpathExpression += matchColumns( GRANDPARENT_NODE, columnValues, elementIndex ); xpathExpression += END_NODE_TEST; } if ( IMG.equals( elementValueType ) ) { xpathExpression += "/img[contains(@src, '" + elementValue + "')]"; } return xpathExpression; } /** * expression for acquiring the table row that matches all column values with the same order as the list * * @param columnValues the matched list of columnValues * @return */ public static String getTableRow( String[] columnValues ) { String xpathExpression = null; if ( ( columnValues != null ) && ( columnValues.length > 0 ) ) { xpathExpression = new String( ELEMENT_ANY_LEVEL + TABLE_ROW + START_NODE_TEST ); xpathExpression += matchColumns( columnValues ); xpathExpression += END_NODE_TEST; } return xpathExpression; } private static String matchColumns( String[] columnValues ) { return matchColumns( columnValues, -1 ); } private static String matchColumns( String[] columnValues, int skipIndex ) { return matchColumns( null, columnValues, skipIndex ); } private static String matchColumns( String parent, String[] columnValues, int skipIndex ) { String xpathExpression = ""; for ( int nIndex = 0; nIndex < columnValues.length; nIndex++ ) { if ( ( skipIndex != nIndex ) || ( skipIndex == -1 ) ) { // prepend "and" if index > 0 xpathExpression += ( ( nIndex > 0 ) ? AND : "" ); xpathExpression += contains( parent, TABLE_COLUMN + position( nIndex + 1 ), columnValues[nIndex] ); } } return xpathExpression; } private static String position( int nIndex ) { return new String( "[" + nIndex + "]" ); } private static String contains( String parent, String element, String matchedString ) { String finalElement = ( parent != null ) ? parent : ""; finalElement += element; return contains( finalElement, matchedString ); } private static String contains( String matchedString ) { return contains( ".", matchedString ); } private static String contains( String axis, String matchedString ) { return new String( CONTAINS + "(" + axis + "," + "'" + matchedString + "')" ); } private static String equals( String parent, String element, String matchedString ) { String finalElement = ( parent != null ) ? parent : ""; finalElement += element; return equals( finalElement, matchedString ); } private static String equals( String axis, String matchedString ) { return new String( axis + "==" + "'" + matchedString + "'" ); } }