/*
* Copyright 2016 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.presenter.update.settings;
import java.util.List;
import org.rf.ide.core.testdata.model.AModelElement;
import org.rf.ide.core.testdata.model.ModelType;
import org.rf.ide.core.testdata.model.RobotVersion;
import org.rf.ide.core.testdata.model.presenter.update.ISettingTableElementOperation;
import org.rf.ide.core.testdata.model.table.SettingTable;
import org.rf.ide.core.testdata.model.table.setting.AImported;
import org.rf.ide.core.testdata.model.table.setting.LibraryAlias;
import org.rf.ide.core.testdata.model.table.setting.LibraryImport;
import org.rf.ide.core.testdata.text.read.IRobotTokenType;
import org.rf.ide.core.testdata.text.read.recognizer.RobotToken;
import org.rf.ide.core.testdata.text.read.recognizer.RobotTokenType;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
public class LibraryImportModelOperation implements ISettingTableElementOperation {
@Override
public boolean isApplicable(final IRobotTokenType elementType) {
return (elementType == RobotTokenType.SETTING_LIBRARY_DECLARATION);
}
@Override
public boolean isApplicable(final ModelType elementType) {
return (elementType == ModelType.LIBRARY_IMPORT_SETTING);
}
@Override
public AModelElement<?> create(final SettingTable settingsTable, final int tableIndex, final List<String> args,
final String comment) {
final LibraryImport newLibraryImport = isValidTableIndex(settingsTable, tableIndex)
? settingsTable.newLibraryImport(tableIndex) : settingsTable.newLibraryImport();
if (!args.isEmpty()) {
newLibraryImport.setPathOrName(args.get(0));
}
int argsNr = args.size();
int indexOfAlias = indexOfAliasStarting(args, settingsTable.getParent().getParent().getRobotVersion());
if (indexOfAlias >= 0) {
RobotToken aliasText = new RobotToken();
aliasText.setText(args.get(argsNr - 1));
RobotToken aliasDecText = new RobotToken();
aliasDecText.setText(args.get(argsNr - 2));
LibraryAlias libAliasDec = new LibraryAlias(aliasDecText);
libAliasDec.setLibraryAlias(aliasText);
newLibraryImport.setAlias(libAliasDec);
argsNr -= 2;
}
for (int i = 1; i < argsNr; i++) {
newLibraryImport.addArgument(args.get(i));
}
if (comment != null && !comment.isEmpty()) {
newLibraryImport.setComment(comment);
}
return newLibraryImport;
}
private int indexOfAliasStarting(final List<String> args, final RobotVersion rVersionInstalled) {
int aliasDecIndex = -1;
int size = args.size();
if (size >= 2) {
String lastArg = args.get(size - 1);
String penultimateArg = args.get(size - 2);
final String aliasDecText = RobotTokenType.SETTING_LIBRARY_ALIAS
.getTheMostCorrectOneRepresentation(rVersionInstalled).getRepresentation();
if (!lastArg.equals(aliasDecText) && penultimateArg.equals(aliasDecText)) {
aliasDecIndex = size - 2;
}
}
return aliasDecIndex;
}
@Override
public void insert(final SettingTable settingsTable, final int index, final AModelElement<?> modelElement) {
settingsTable.addImported((AImported) modelElement, index);
}
@Override
public void update(final AModelElement<?> modelElement, final int index, final String value) {
final LibraryImport libraryImport = (LibraryImport) modelElement;
if (index == 0) {
libraryImport.setPathOrName(value != null ? value : "");
} else if (index > 0) {
if (value == null) {
libraryImport.removeElementToken(index-1);
} else {
final int properIndex = index - 1;
int nrOfArgs = libraryImport.getArguments().size();
int nrOfArgsWithAlias = nrOfArgs + libraryImport.getAlias().getElementTokens().size();
if (nrOfArgs < nrOfArgsWithAlias) {
libraryImport.addArgument(libraryImport.getAlias().getDeclaration());
libraryImport.addArgument(libraryImport.getAlias().getLibraryAlias());
libraryImport.setAlias(new LibraryAlias(null));
}
libraryImport.setArguments(properIndex, value);
int indexOfAlias = indexOfAliasStarting(
Lists.transform(libraryImport.getArguments(), new GetTokenText()),
libraryImport.getParent().getParent().getParent().getRobotVersion());
if (indexOfAlias > -1) {
RobotToken aliasDec = libraryImport.getArguments().get(libraryImport.getArguments().size() - 2);
RobotToken aliasValue = libraryImport.getArguments().get(libraryImport.getArguments().size() - 1);
// remove alias value and alias declaration
libraryImport.removeArgument(indexOfAlias);
libraryImport.removeArgument(indexOfAlias);
LibraryAlias alias = new LibraryAlias(aliasDec);
alias.setLibraryAlias(aliasValue);
libraryImport.setAlias(alias);
}
}
}
}
private class GetTokenText implements Function<RobotToken, String> {
@Override
public String apply(final RobotToken token) {
return token.getText();
}
}
@Override
public void remove(final SettingTable settingsTable, final AModelElement<?> modelElement) {
settingsTable.removeImported((AImported) modelElement);
}
private boolean isValidTableIndex(final SettingTable settingsTable, final int tableIndex) {
return tableIndex >= 0 && tableIndex < settingsTable.getImports().size();
}
}