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    }