/*
* 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.keywords;
import static com.google.common.collect.Lists.newArrayList;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.rf.ide.core.testdata.model.AModelElement;
import org.rf.ide.core.testdata.model.FilePosition;
import org.rf.ide.core.testdata.model.ModelType;
import org.rf.ide.core.testdata.model.presenter.MoveElementHelper;
import org.rf.ide.core.testdata.model.table.IExecutableStepsHolder;
import org.rf.ide.core.testdata.model.table.KeywordTable;
import org.rf.ide.core.testdata.model.table.RobotExecutableRow;
import org.rf.ide.core.testdata.model.table.RobotTokenPositionComparator;
import org.rf.ide.core.testdata.text.read.recognizer.RobotToken;
import org.rf.ide.core.testdata.text.read.recognizer.RobotTokenType;
public class UserKeyword extends AModelElement<KeywordTable>
implements IExecutableStepsHolder<UserKeyword>, Serializable {
private static final long serialVersionUID = -7553229094807229714L;
private RobotToken keywordName;
private final List<KeywordDocumentation> documentation = new ArrayList<>();
private final List<KeywordTags> tags = new ArrayList<>();
private final List<KeywordArguments> keywordArguments = new ArrayList<>();
private final List<KeywordReturn> keywordReturns = new ArrayList<>();
private final List<KeywordTeardown> teardowns = new ArrayList<>();
private final List<KeywordTimeout> timeouts = new ArrayList<>();
private final List<KeywordUnknownSettings> unknownSettings = new ArrayList<>(0);
private final List<RobotExecutableRow<UserKeyword>> keywordContext = new ArrayList<>();
public UserKeyword(final RobotToken keywordName) {
this.keywordName = keywordName;
fixForTheType(keywordName, RobotTokenType.KEYWORD_NAME);
}
public RobotToken getKeywordName() {
return keywordName;
}
public void setKeywordName(final RobotToken keywordName) {
fixForTheType(keywordName, RobotTokenType.KEYWORD_NAME, true);
this.keywordName = keywordName;
}
public void addKeywordExecutionRow(final RobotExecutableRow<UserKeyword> executionRow) {
executionRow.setParent(this);
this.keywordContext.add(executionRow);
}
public void addKeywordExecutionRow(final RobotExecutableRow<UserKeyword> executionRow, final int position) {
executionRow.setParent(this);
this.keywordContext.add(position, executionRow);
}
public void removeExecutableRow(final RobotExecutableRow<UserKeyword> executionRow) {
this.keywordContext.remove(executionRow);
}
public boolean moveUpExecutableRow(final RobotExecutableRow<UserKeyword> executionRow) {
return MoveElementHelper.moveUp(keywordContext, executionRow);
}
public boolean moveDownExecutableRow(final RobotExecutableRow<UserKeyword> executionRow) {
return MoveElementHelper.moveDown(keywordContext, executionRow);
}
public void removeExecutableLineWithIndex(final int rowIndex) {
this.keywordContext.remove(rowIndex);
}
public void removeAllKeywordExecutionRows() {
keywordContext.clear();
}
public List<RobotExecutableRow<UserKeyword>> getKeywordExecutionRows() {
return Collections.unmodifiableList(keywordContext);
}
@Override
public List<RobotExecutableRow<UserKeyword>> getExecutionContext() {
return getKeywordExecutionRows();
}
public KeywordDocumentation newDocumentation() {
final RobotToken dec = new RobotToken();
dec.setText(RobotTokenType.KEYWORD_SETTING_DOCUMENTATION
.getTheMostCorrectOneRepresentation(getParent().getParent().getParent().getRobotVersion())
.getRepresentation());
fixForTheType(dec, RobotTokenType.KEYWORD_SETTING_DOCUMENTATION);
final KeywordDocumentation keyDoc = new KeywordDocumentation(dec);
addDocumentation(0, keyDoc);
return keyDoc;
}
public void addDocumentation(final KeywordDocumentation doc) {
addDocumentation(documentation.size(), doc);
}
public void addDocumentation(final int index, final KeywordDocumentation doc) {
doc.setParent(this);
this.documentation.add(index, doc);
getParent().getParent().getParent().getDocumentationCacher().register(doc);
}
public List<KeywordDocumentation> getDocumentation() {
return Collections.unmodifiableList(documentation);
}
public KeywordTags newTags() {
final RobotToken dec = new RobotToken();
dec.setText(RobotTokenType.KEYWORD_SETTING_TAGS
.getTheMostCorrectOneRepresentation(getParent().getParent().getParent().getRobotVersion())
.getRepresentation());
fixForTheType(dec, RobotTokenType.KEYWORD_SETTING_TAGS);
final KeywordTags keyTags = new KeywordTags(dec);
addTag(0, keyTags);
return keyTags;
}
public void addTag(final KeywordTags tag) {
addTag(tags.size(), tag);
}
public void addTag(final int index, final KeywordTags tag) {
tag.setParent(this);
tags.add(index, tag);
}
public List<KeywordTags> getTags() {
return Collections.unmodifiableList(tags);
}
public KeywordArguments newArguments() {
final RobotToken dec = new RobotToken();
dec.setText(RobotTokenType.KEYWORD_SETTING_ARGUMENTS
.getTheMostCorrectOneRepresentation(getParent().getParent().getParent().getRobotVersion())
.getRepresentation());
fixForTheType(dec, RobotTokenType.KEYWORD_SETTING_ARGUMENTS);
final KeywordArguments keyArgs = new KeywordArguments(dec);
addArguments(0, keyArgs);
return keyArgs;
}
public void addArguments(final KeywordArguments arguments) {
addArguments(keywordArguments.size(), arguments);
}
public void addArguments(final int index, final KeywordArguments arguments) {
arguments.setParent(this);
keywordArguments.add(index, arguments);
}
public List<KeywordArguments> getArguments() {
return Collections.unmodifiableList(keywordArguments);
}
public KeywordReturn newReturn() {
final RobotToken dec = new RobotToken();
dec.setText(RobotTokenType.KEYWORD_SETTING_RETURN
.getTheMostCorrectOneRepresentation(getParent().getParent().getParent().getRobotVersion())
.getRepresentation());
fixForTheType(dec, RobotTokenType.KEYWORD_SETTING_RETURN);
final KeywordReturn keyReturn = new KeywordReturn(dec);
addReturn(0, keyReturn);
return keyReturn;
}
public void addReturn(final KeywordReturn keywordReturn) {
addReturn(keywordReturns.size(), keywordReturn);
}
public void addReturn(final int index, final KeywordReturn keywordReturn) {
keywordReturn.setParent(this);
keywordReturns.add(index, keywordReturn);
}
public List<KeywordReturn> getReturns() {
return Collections.unmodifiableList(keywordReturns);
}
public KeywordTeardown newTeardown() {
final RobotToken dec = new RobotToken();
dec.setText(RobotTokenType.KEYWORD_SETTING_TEARDOWN
.getTheMostCorrectOneRepresentation(getParent().getParent().getParent().getRobotVersion())
.getRepresentation());
fixForTheType(dec, RobotTokenType.KEYWORD_SETTING_TEARDOWN);
final KeywordTeardown keyTeardown = new KeywordTeardown(dec);
addTeardown(0, keyTeardown);
return keyTeardown;
}
public void addTeardown(final KeywordTeardown teardown) {
addTeardown(teardowns.size(), teardown);
}
public void addTeardown(final int index, final KeywordTeardown teardown) {
teardown.setParent(this);
teardowns.add(index, teardown);
}
public List<KeywordTeardown> getTeardowns() {
return Collections.unmodifiableList(teardowns);
}
public KeywordTimeout newTimeout() {
final RobotToken dec = new RobotToken();
dec.setText(RobotTokenType.KEYWORD_SETTING_TIMEOUT
.getTheMostCorrectOneRepresentation(getParent().getParent().getParent().getRobotVersion())
.getRepresentation());
fixForTheType(dec, RobotTokenType.KEYWORD_SETTING_TIMEOUT);
final KeywordTimeout keyTimeout = new KeywordTimeout(dec);
addTimeout(0, keyTimeout);
return keyTimeout;
}
public void addTimeout(final KeywordTimeout timeout) {
addTimeout(timeouts.size(), timeout);
}
public void addTimeout(final int index, final KeywordTimeout timeout) {
timeout.setParent(this);
timeouts.add(index, timeout);
}
public List<KeywordTimeout> getTimeouts() {
return Collections.unmodifiableList(timeouts);
}
public KeywordUnknownSettings newUnknownSettings() {
final RobotToken dec = RobotToken.create("[]",
newArrayList(RobotTokenType.KEYWORD_SETTING_UNKNOWN_DECLARATION));
final KeywordUnknownSettings unknown = new KeywordUnknownSettings(dec);
addUnknownSettings(unknown);
return unknown;
}
public void addUnknownSettings(final KeywordUnknownSettings unknownSetting) {
addUnknownSettings(unknownSettings.size(), unknownSetting);
}
public void addUnknownSettings(final int index, final KeywordUnknownSettings unknownSetting) {
unknownSetting.setParent(this);
this.unknownSettings.add(index, unknownSetting);
}
public List<KeywordUnknownSettings> getUnknownSettings() {
return Collections.unmodifiableList(unknownSettings);
}
@Override
public boolean isPresent() {
return (getKeywordName() != null);
}
@Override
public ModelType getModelType() {
return ModelType.USER_KEYWORD;
}
@Override
public FilePosition getBeginPosition() {
return getKeywordName().getFilePosition();
}
@Override
public RobotToken getDeclaration() {
return getKeywordName();
}
@Override
public List<RobotToken> getElementTokens() {
final List<RobotToken> tokens = new ArrayList<>();
if (isPresent()) {
if (getKeywordName() != null) {
tokens.add(getKeywordName());
}
for (final KeywordDocumentation doc : documentation) {
tokens.addAll(doc.getElementTokens());
}
for (final KeywordArguments arguments : keywordArguments) {
tokens.addAll(arguments.getElementTokens());
}
final List<RobotToken> keywordContextInModel = new ArrayList<>(0);
for (final RobotExecutableRow<UserKeyword> row : keywordContext) {
keywordContextInModel.addAll(row.getElementTokens());
}
tokens.addAll(keywordContextInModel);
for (final KeywordReturn returns : keywordReturns) {
tokens.addAll(returns.getElementTokens());
}
for (final KeywordTags tag : tags) {
tokens.addAll(tag.getElementTokens());
}
for (final KeywordTeardown teardown : teardowns) {
tokens.addAll(teardown.getElementTokens());
}
for (final KeywordTimeout timeout : timeouts) {
tokens.addAll(timeout.getElementTokens());
}
for (final KeywordUnknownSettings setting : unknownSettings) {
tokens.addAll(setting.getElementTokens());
}
Collections.sort(tokens, new RobotTokenPositionComparator());
positionRevertToExpectedOrder(tokens, keywordContextInModel);
}
return tokens;
}
@Override
public UserKeyword getHolder() {
return this;
}
@Override
public List<AModelElement<UserKeyword>> getUnitSettings() {
final List<AModelElement<UserKeyword>> settings = new ArrayList<>();
settings.addAll(getDocumentation());
settings.addAll(getTags());
settings.addAll(getArguments());
settings.addAll(getReturns());
settings.addAll(getTeardowns());
settings.addAll(getTimeouts());
settings.addAll(getUnknownSettings());
return settings;
}
@Override
public boolean removeUnitSettings(final AModelElement<UserKeyword> setting) {
if (setting != null) {
final ModelType settingType = setting.getModelType();
switch (settingType) {
case USER_KEYWORD_DOCUMENTATION:
return this.documentation.remove(setting);
case USER_KEYWORD_TAGS:
return this.tags.remove(setting);
case USER_KEYWORD_ARGUMENTS:
return this.keywordArguments.remove(setting);
case USER_KEYWORD_RETURN:
return this.keywordReturns.remove(setting);
case USER_KEYWORD_TEARDOWN:
return this.teardowns.remove(setting);
case USER_KEYWORD_TIMEOUT:
return this.timeouts.remove(setting);
case USER_KEYWORD_SETTING_UNKNOWN:
return this.unknownSettings.remove(setting);
default:
return false;
}
}
return false;
}
@Override
public boolean removeElementToken(final int index) {
throw new UnsupportedOperationException("This operation is not allowed inside UserKeyword.");
}
public boolean isDuplicatedSetting(final AModelElement<UserKeyword> setting) {
if (setting.getModelType() == ModelType.USER_KEYWORD_SETTING_UNKNOWN) {
return false;
} else {
return getContainingList(setting).indexOf(setting) > 0;
}
}
public List<? extends AModelElement<UserKeyword>> getContainingList(final AModelElement<?> setting) {
if (setting != null) {
final ModelType settingType = setting.getModelType();
switch (settingType) {
case USER_KEYWORD_DOCUMENTATION:
return documentation;
case USER_KEYWORD_TAGS:
return tags;
case USER_KEYWORD_TEARDOWN:
return teardowns;
case USER_KEYWORD_TIMEOUT:
return timeouts;
case USER_KEYWORD_ARGUMENTS:
return keywordArguments;
case USER_KEYWORD_RETURN:
return keywordReturns;
case USER_KEYWORD_SETTING_UNKNOWN:
return unknownSettings;
default:
return new ArrayList<>();
}
}
return new ArrayList<>();
}
@Override
public RobotToken getName() {
return getKeywordName();
}
@Override
public FilePosition getEndPosition() {
return findEndPosition(getParent().getParent());
}
}