All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.cognifide.qa.bb.utils.XpathUtils Maven / Gradle / Ivy

The newest version!
/*-
 * #%L
 * Bobcat
 * %%
 * Copyright (C) 2016 Cognifide Ltd.
 * %%
 * Licensed 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.
 * #L%
 */
package com.cognifide.qa.bb.utils;

import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

/**
 * A handy set of tools to work with XPATH locators
 */
public final class XpathUtils {

  private XpathUtils() {}

  /**
   * Method perform intelligent escaping of quotes in xpath expressions, if necessary it constructs concat
   * functions otherwise it simply add single or double quotes.
   *
   * @param sentence - e.g. "'My Login' te"xt" then result: concat("'", 'My Login', "'", ' te"xt')
   * @return sentence with quotes or concat function
   * @throws NullPointerException if sentence is null
   */
  public static String quote(String sentence) {
    if (!sentence.contains("'")) {
      return addSingleQuotation(sentence);
    } else if (sentence.contains("'") && !sentence.contains("\"")) {
      return addDoubleQuotation(sentence);
    } else {
      return changeToConcat(sentence);
    }
  }

  private static String addDoubleQuotation(String sentence) {
    return "\"" + sentence + "\"";
  }

  private static String addSingleQuotation(String sentence) {
    return "'" + sentence + "'";
  }

  private static String changeToConcat(String sentenceTosearch) {
    StringBuilder builder = new StringBuilder();
    builder.append("concat(");

    List tokens = splitTokens(sentenceTosearch);
    quoteTokens(tokens);

    for (int i = 0; i < tokens.size(); i++) {
      builder.append(tokens.get(i));
      if (i < tokens.size() - 1) {
        builder.append(", ");
      }
    }

    builder.append(")");

    return builder.toString();
  }

  private static void quoteTokens(List tokens) {
    for (int i = 0; i < tokens.size(); i++) {
      String token = tokens.get(i);
      if ("'".equals(token)) {
        token = addDoubleQuotation(token);
      } else {
        token = addSingleQuotation(token);
      }
      tokens.set(i, token);
    }
  }

  private static List splitTokens(String sentenceTosearch) {
    StringTokenizer tokenizer = new StringTokenizer(sentenceTosearch, "'", true);
    List tokens = new ArrayList<>();
    while (tokenizer.hasMoreElements()) {
      tokens.add(tokenizer.nextToken());
    }
    return tokens;
  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy