001 package org.crsh.cmdline.matcher.impl;
002
003 import org.crsh.cmdline.CommandCompletion;
004 import org.crsh.cmdline.Delimiter;
005 import org.crsh.cmdline.completers.EmptyCompleter;
006 import org.crsh.cmdline.ParameterDescriptor;
007 import org.crsh.cmdline.matcher.CmdCompletionException;
008 import org.crsh.cmdline.spi.Completer;
009 import org.crsh.cmdline.spi.ValueCompletion;
010
011 /**
012 * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
013 */
014 class ParameterCompletion extends Completion {
015
016 /** . */
017 private final String prefix;
018
019 /** . */
020 private final Delimiter delimiter;
021
022 /** . */
023 private final ParameterDescriptor<?> parameter;
024
025 /** . */
026 private final Completer completer;
027
028 ParameterCompletion(String prefix, Delimiter delimiter, ParameterDescriptor<?> parameter, Completer completer) {
029 this.prefix = prefix;
030 this.delimiter = delimiter;
031 this.parameter = parameter;
032 this.completer = completer;
033 }
034
035 CommandCompletion complete() throws CmdCompletionException {
036
037 Class<? extends Completer> completerType = parameter.getCompleterType();
038 Completer completer = this.completer;
039
040 // Use the most adapted completer
041 if (completerType != EmptyCompleter.class) {
042 try {
043 completer = completerType.newInstance();
044 }
045 catch (Exception e) {
046 throw new CmdCompletionException(e);
047 }
048 }
049
050 //
051 if (completer != null) {
052 try {
053 return new CommandCompletion(delimiter, completer.complete(parameter, prefix));
054 }
055 catch (Exception e) {
056 throw new CmdCompletionException(e);
057 }
058 } else {
059 return new CommandCompletion(delimiter, ValueCompletion.create());
060 }
061 }
062 }