/*
* 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.table.exec.descs;
import java.util.List;
import org.rf.ide.core.testdata.text.read.IRobotLineElement;
import org.rf.ide.core.testdata.text.read.recognizer.RobotToken;
import org.rf.ide.core.testdata.text.read.recognizer.RobotTokenType;
import org.rf.ide.core.testdata.text.read.separators.Separator;
import org.rf.ide.core.testdata.text.read.separators.Separator.SeparatorType;
public class ForDescriptorInfo {
private int forStartIndex = -1;
private int forLineContinueInlineIndex = -1;
private int forInIndex = -1;
public static ForDescriptorInfo build(final List<IRobotLineElement> elements) {
final ForDescriptorInfo info = new ForDescriptorInfo();
int separatorsNumbers = 0;
SeparatorType separatorType = SeparatorType.TABULATOR_OR_DOUBLE_SPACE;
final int numberOfElements = elements.size();
for (int elementIndex = 0; elementIndex < numberOfElements; elementIndex++) {
final IRobotLineElement elem = elements.get(elementIndex);
if (elem instanceof RobotToken) {
final RobotToken token = (RobotToken) elem;
if (separatorType == SeparatorType.PIPE) {
if (separatorsNumbers == 2) {
tryToFindFor(info, elementIndex, token);
} else if (separatorsNumbers > 2) {
final String text = token.getText().toString();
final boolean shouldBreak = tryToFindPreviousLineContinoue(info, elementIndex, text);
if (shouldBreak) {
break;
}
}
} else {
if (separatorsNumbers == 1) {
tryToFindFor(info, elementIndex, token);
} else if (separatorsNumbers > 1) {
final String text = token.getText().toString();
final boolean shouldBreak = tryToFindPreviousLineContinoue(info, elementIndex, text);
if (shouldBreak) {
break;
}
}
}
} else {
final Separator sep = (Separator) elem;
if (sep.getTypes().contains(SeparatorType.PIPE) && separatorsNumbers == 0) {
separatorType = SeparatorType.PIPE;
}
separatorsNumbers++;
}
}
return info;
}
private static void tryToFindFor(final ForDescriptorInfo info, final int elementIndex, final RobotToken token) {
if (isForToken(token)) {
info.setForStartIndex(elementIndex);
}
}
public static boolean isForToken(final RobotToken token) {
final String text = trimWhitespaces(token.getText().toString());
return ":for".equalsIgnoreCase(text);
}
public static boolean isInToken(final RobotToken token) {
String text = token.getText().toString();
text = text.trim().toLowerCase();
return isInToken(text);
}
private static boolean isInToken(final String text) {
boolean isInToken = false;
final List<String> inRepresentations = RobotTokenType.IN_TOKEN.getRepresentation();
for (final String r : inRepresentations) {
if (r.equalsIgnoreCase(text)) {
isInToken = true;
break;
}
}
return isInToken;
}
private static boolean tryToFindPreviousLineContinoue(final ForDescriptorInfo info, final int elementIndex,
final String text) {
boolean shouldBreak = false;
if (text != null) {
final String normalizedText = text.trim().toLowerCase();
if (isInToken(normalizedText)) {
info.setForInIndex(elementIndex);
shouldBreak = true;
} else if (RobotTokenType.PREVIOUS_LINE_CONTINUE.getRepresentation().get(0).equals(normalizedText)) {
if (info.getForLineContinueInlineIndex() == -1) {
info.setForLineContinueInlineIndex(elementIndex);
}
}
}
return shouldBreak;
}
private void setForStartIndex(final int forStartIndex) {
this.forStartIndex = forStartIndex;
}
public int getForStartIndex() {
return forStartIndex;
}
public int getForLineContinueInlineIndex() {
return forLineContinueInlineIndex;
}
public void setForLineContinueInlineIndex(final int forLineContinueInlineIndex) {
this.forLineContinueInlineIndex = forLineContinueInlineIndex;
}
private void setForInIndex(final int forInIndex) {
this.forInIndex = forInIndex;
}
public int getForInIndex() {
return forInIndex;
}
private static String trimWhitespaces(final String text) {
final StringBuilder builder = new StringBuilder("");
if (text != null) {
final char[] tChars = text.toCharArray();
for (final char c : tChars) {
if (c != ' ' && c != '\t' && c != '\f') {
builder.append(c);
}
}
}
return builder.toString();
}
}