} else {
final OperationRequestHeader header = headers.get(parsedCmd.getLastHeaderName());
if(header == null) {
return -1;
}
final CommandLineCompleter headerCompleter = header.getCompleter();
if(headerCompleter == null) {
return -1;
}
int valueResult = headerCompleter.complete(ctx, buffer.substring(parsedCmd.getLastChunkIndex()), cursor, candidates);
if(valueResult < 0) {
return -1;
}
result = parsedCmd.getLastChunkIndex() + valueResult;
}
} else {
if(!parsedCmd.hasHeaders()) {
candidates.addAll(headers.keySet());
} else if(parsedCmd.endsOnHeaderSeparator()) {
candidates.addAll(headers.keySet());
for(ParsedOperationRequestHeader parsed : parsedCmd.getHeaders()) {
candidates.remove(parsed.getName());
}
} else {
final ParsedOperationRequestHeader lastParsedHeader = parsedCmd.getLastHeader();
final OperationRequestHeader lastHeader = headers.get(lastParsedHeader.getName());
if(lastHeader == null) {
return -1;
}
final CommandLineCompleter headerCompleter = lastHeader.getCompleter();
if(headerCompleter == null) {
return -1;
}
result = headerCompleter.complete(ctx, buffer, cursor, candidates);
}
}
Collections.sort(candidates);
return result;
}
if(parsedCmd.endsOnPropertyListEnd()) {
return buffer.length();
}
if (parsedCmd.hasProperties() || parsedCmd.endsOnPropertyListStart()) {
final Collection<CommandArgument> allArgs = candidatesProvider.getProperties(ctx, parsedCmd.getOperationName(), parsedCmd.getAddress());
if (allArgs.isEmpty()) {
final CommandLineFormat format = parsedCmd.getFormat();
if(format != null && format.getPropertyListEnd() != null) {
candidates.add(format.getPropertyListEnd());
}
return buffer.length();
}
try {
if (!parsedCmd.hasProperties()) {
for (CommandArgument arg : allArgs) {
if (arg.canAppearNext(ctx)) {
if (arg.getIndex() >= 0) {
final CommandLineCompleter valCompl = arg.getValueCompleter();
if (valCompl != null) {
valCompl.complete(ctx, "", 0, candidates);
}
} else {
String argName = arg.getFullName();
if (arg.isValueRequired()) {
argName += '=';
}
candidates.add(argName);
}
}
}
Collections.sort(candidates);
return buffer.length();
}
} catch (CommandFormatException e) {
return -1;
}
int result = buffer.length();
String chunk = null;
CommandLineCompleter valueCompleter = null;
if (!parsedCmd.endsOnPropertySeparator()) {
final String argName = parsedCmd.getLastParsedPropertyName();
final String argValue = parsedCmd.getLastParsedPropertyValue();
if (argValue != null || parsedCmd.endsOnPropertyValueSeparator()) {
result = parsedCmd.getLastChunkIndex();
if (parsedCmd.endsOnPropertyValueSeparator()) {
++result;// it enters on '='
}
chunk = argValue;
if (argName != null) {
valueCompleter = getValueCompleter(ctx, allArgs, argName);
} else {
valueCompleter = getValueCompleter(ctx, allArgs, parsedCmd.getOtherProperties().size() - 1);
}
if (valueCompleter == null) {
if (parsedCmd.endsOnSeparator()) {
return -1;
}
for (CommandArgument arg : allArgs) {
try {
if (arg.canAppearNext(ctx) && !arg.getFullName().equals(argName)) {
return -1;
}
} catch (CommandFormatException e) {
break;
}
}
final CommandLineFormat format = parsedCmd.getFormat();
if(format != null && format.getPropertyListEnd() != null) {
candidates.add(format.getPropertyListEnd());
}
return buffer.length();
}
} else {
chunk = argName;
result = parsedCmd.getLastChunkIndex();
}
} else {
chunk = null;
}
if (valueCompleter != null) {
int valueResult = valueCompleter.complete(ctx, chunk == null ? "" : chunk, 0, candidates);
if (valueResult < 0) {
return valueResult;
} else {
return result + valueResult;
}
}
for (CommandArgument arg : allArgs) {
try {
if (arg.canAppearNext(ctx)) {
if (arg.getIndex() >= 0) {
CommandLineCompleter valCompl = arg.getValueCompleter();
if (valCompl != null) {
final String value = chunk == null ? "" : chunk;
valCompl.complete(ctx, value, value.length(), candidates);
}
} else {
String argFullName = arg.getFullName();
if (chunk == null) {
if (arg.isValueRequired()) {