org.rf.ide.core.testdata.model.RobotExpressions.java Source code

Java tutorial

Introduction

Here is the source code for org.rf.ide.core.testdata.model.RobotExpressions.java

Source

/*
 * Copyright 2015 Nokia Solutions and Networks
 * Licensed under the Apache License, Version 2.0,
 * see license.txt file for details.
 */
package org.rf.ide.core.testdata.model;

import static com.google.common.collect.Iterables.transform;
import static com.google.common.collect.Lists.newArrayList;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

import org.rf.ide.core.testdata.model.table.variables.names.VariableNamesSupport;

import com.google.common.base.Function;
import com.google.common.collect.Range;

public class RobotExpressions {

    /**
     * Removes escaping characters proceeding spaces (multiple spaces may
     * be escaped in robot format cells)
     * 
     * @param str
     * @return
     */
    public static String unescapeSpaces(final String str) {
        int backslashes = 0;
        final StringBuilder escaped = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            final char c = str.charAt(i);
            escaped.append(c);
            if (c == '\\') {
                backslashes++;
            } else if (c == ' ' && backslashes % 2 == 1) {
                backslashes = 0;
                escaped.deleteCharAt(escaped.length() - 2);
            } else {
                backslashes = 0;
            }
        }
        return escaped.toString();
    }

    public static List<Range<Integer>> getVariablesPositions(final String expression) {
        final List<Range<Integer>> ranges = newArrayList();

        int rangeStart = -1;
        boolean inVariable = false;
        for (int i = 0; i < expression.length(); i++) {
            if (!inVariable && "%$@&".contains(Character.toString(expression.charAt(i)))
                    && Character.valueOf('{').equals(lookahead(expression, i + 1))) {
                inVariable = true;
                rangeStart = i;
            } else if (inVariable && expression.charAt(i) == '}') {
                inVariable = false;
                ranges.add(Range.closed(rangeStart, i));
            }
        }
        return ranges;
    }

    public static List<String> getVariables(final String expression) {
        final List<Range<Integer>> positions = getVariablesPositions(expression);
        return newArrayList(transform(positions, new Function<Range<Integer>, String>() {

            @Override
            public String apply(final Range<Integer> range) {
                return expression.substring(range.lowerEndpoint(), range.upperEndpoint() + 1);
            }
        }));
    }

    public static String resolve(final Map<String, String> knownVariables, final String expression) {
        final List<Range<Integer>> positions = getVariablesPositions(expression);
        Collections.sort(positions, new Comparator<Range<Integer>>() {
            @Override
            public int compare(final Range<Integer> o1, final Range<Integer> o2) {
                return o2.lowerEndpoint().compareTo(o1.lowerEndpoint());
            }
        });

        final StringBuilder resolved = new StringBuilder(expression);
        for (final Range<Integer> position : positions) {
            final String variable = VariableNamesSupport.extractUnifiedVariableName(
                    expression.substring(position.lowerEndpoint(), position.upperEndpoint() + 1));
            if (knownVariables.containsKey(variable)) {
                resolved.replace(position.lowerEndpoint(), position.upperEndpoint() + 1,
                        knownVariables.get(variable));
            }
        }
        return resolved.toString();
    }

    public static boolean isParameterized(final String pathOrName) {
        return Pattern.compile("[@$&%]\\{[^\\}]+\\}").matcher(pathOrName).find();
    }

    private static Character lookahead(final String expression, final int index) {
        return index < expression.length() ? expression.charAt(index) : null;
    }
}