/*
* Copyright 2015 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.robotframework.ide.eclipse.main.plugin.model.cmd;
import java.util.Collection;
import java.util.Collections;
import org.robotframework.ide.eclipse.main.plugin.model.RobotElement;
import com.google.common.base.Function;
import com.google.common.collect.Collections2;
import com.google.common.primitives.Ints;
public class NamesGenerator {
public static String generateUniqueName(final RobotElement parent, final String prefix) {
return generateUniqueName(parent, prefix, true);
}
public static String generateUniqueName(final RobotElement parent, final String prefix,
final boolean includeSpace) {
final String prefixWithoutNumber = removeNumberSuffix(prefix);
final int maxNumber = getCurrentMaxNumber(parent, prefixWithoutNumber);
if (maxNumber < 0) {
return prefix;
} else if (includeSpace) {
return prefixWithoutNumber + " " + (maxNumber + 1);
} else {
return prefixWithoutNumber + (maxNumber + 1);
}
}
private static String removeNumberSuffix(final String name) {
final StringBuilder number = new StringBuilder();
for (int i = name.length() - 1; i >= 0; i--) {
if (Character.isDigit(name.charAt(i))) {
number.append(name.charAt(i));
} else {
break;
}
}
return name.substring(0, name.length() - number.length()).trim();
}
private static int getCurrentMaxNumber(final RobotElement parent, final String prefix) {
final Collection<String> currentNames = Collections2.transform(parent.getChildren(), toLowerCaseNames());
final Collection<Integer> numbers = Collections2.transform(currentNames, byExtractingNumbersFromSuffixes(prefix));
return numbers.isEmpty() ? -1 : Collections.max(numbers);
}
private static Function<String, Integer> byExtractingNumbersFromSuffixes(final String prefix) {
return new Function<String, Integer>() {
@Override
public Integer apply(final String name) {
if (name.startsWith(prefix.toLowerCase())) {
final String numberInSuffix = name.substring(prefix.length()).trim();
final Integer num = Ints.tryParse(numberInSuffix);
return num == null ? 0 : num;
}
return -1;
}
};
}
private static Function<RobotElement, String> toLowerCaseNames() {
return new Function<RobotElement, String>() {
@Override
public String apply(final RobotElement element) {
return element.getName().toLowerCase();
}
};
}
}