Merge "Fixed for bug 1197"
[controller.git] / opendaylight / netconf / netconf-cli / src / main / java / org / opendaylight / controller / netconf / cli / reader / impl / DecisionReader.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.netconf.cli.reader.impl;
9
10 import static org.opendaylight.controller.netconf.cli.io.IOUtil.SKIP;
11
12 import com.google.common.base.Optional;
13 import java.io.IOException;
14 import jline.console.completer.AggregateCompleter;
15 import jline.console.completer.Completer;
16 import jline.console.completer.StringsCompleter;
17 import jline.internal.Log;
18 import org.opendaylight.controller.netconf.cli.io.ConsoleContext;
19 import org.opendaylight.controller.netconf.cli.io.ConsoleIO;
20 import org.opendaylight.controller.netconf.cli.io.IOUtil;
21 import org.opendaylight.controller.netconf.cli.reader.ReadingException;
22
23 public class DecisionReader {
24
25     private static final String YES = "Y";
26     private static final String NO = "N";
27     public static final Completer YES_NO_COMPLETER = new StringsCompleter(YES, NO);
28
29     public Optional<Boolean> read(final ConsoleIO console, final String questionMessageBlueprint,
30             final Object... questionMessageArgs) throws IOException, ReadingException {
31         final ConsoleContext ctx = getContext();
32         console.enterContext(ctx);
33         try {
34             console.formatLn(questionMessageBlueprint, questionMessageArgs);
35             final String rawValue = console.read();
36             if (YES.equals(rawValue.toUpperCase())) {
37                 return Optional.of(Boolean.TRUE);
38             } else if (NO.equals(rawValue.toUpperCase())) {
39                 return Optional.of(Boolean.FALSE);
40             } else if (SKIP.equals(rawValue)) {
41                 return Optional.absent();
42             } else {
43                 final String message = String.format("Incorrect possibility (%s) was selected", rawValue);
44                 Log.error(message);
45                 throw new ReadingException(message);
46             }
47         } finally {
48             console.leaveContext();
49         }
50     }
51
52     private static ConsoleContext getContext() {
53         return new ConsoleContext() {
54
55             @Override
56             public Optional<String> getPrompt() {
57                 return Optional.absent();
58             }
59
60             @Override
61             public Completer getCompleter() {
62                 return new AggregateCompleter(YES_NO_COMPLETER, new StringsCompleter(IOUtil.SKIP));
63             }
64
65         };
66     }
67
68 }