예제 #1
0
    String getPrompt() {
      StringBuilder buffer = new StringBuilder();
      if (promptConnectPart == null) {
        buffer.append('[');
        if (controllerHost != null) {
          if (domainMode) {
            buffer.append("domain@");
          } else {
            buffer.append("standalone@");
          }
          buffer.append(controllerHost).append(':').append(controllerPort).append(' ');
          promptConnectPart = buffer.toString();
        } else {
          buffer.append("disconnected ");
        }
      } else {
        buffer.append(promptConnectPart);
      }

      if (prefix.isEmpty()) {
        buffer.append('/');
      } else {
        buffer.append(prefix.getNodeType());
        final String nodeName = prefix.getNodeName();
        if (nodeName != null) {
          buffer.append('=').append(nodeName);
        }
      }

      if (isBatchMode()) {
        buffer.append(" #");
      }
      buffer.append("] ");
      return buffer.toString();
    }
  /* (non-Javadoc)
   * @see org.jboss.as.cli.CandidatesProvider#getNodeNames(org.jboss.as.cli.Prefix)
   */
  @Override
  public List<String> getNodeNames(OperationRequestAddress prefix) {

    ModelControllerClient client = ctx.getModelControllerClient();
    if (client == null) {
      return Collections.emptyList();
    }

    if (prefix.isEmpty()) {
      throw new IllegalArgumentException("The prefix must end on a type but it's empty.");
    }

    if (!prefix.endsOnType()) {
      throw new IllegalArgumentException("The prefix doesn't end on a type.");
    }

    final ModelNode request;
    DefaultOperationRequestBuilder builder = new DefaultOperationRequestBuilder(prefix);
    try {
      builder.operationName("read-children-names");
      builder.property("child-type", prefix.getNodeType(), -1);
      request = builder.buildRequest();
    } catch (OperationFormatException e1) {
      throw new IllegalStateException("Failed to build operation", e1);
    }

    List<String> result;
    try {
      ModelNode outcome = client.execute(request);
      if (!Util.isSuccess(outcome)) {
        // TODO logging... exception?
        result = Collections.emptyList();
      } else {
        result = Util.getList(outcome);
      }
    } catch (Exception e) {
      result = Collections.emptyList();
    }
    return result;
  }
  public GenericTypeOperationHandler(
      String nodeType, String idProperty, List<String> excludeOperations) {

    super("generic-type-operation", true);

    if (nodeType == null) {
      throw new IllegalArgumentException("Node type is null.");
    }
    this.nodeType = nodeType;

    helpArg =
        new ArgumentWithoutValue(this, "--help", "-h") {
          @Override
          public boolean canAppearNext(CommandContext ctx) throws CommandFormatException {
            if (ctx.isDomainMode() && !profile.isValueComplete(ctx.getParsedCommandLine())) {
              return false;
            }
            return super.canAppearNext(ctx);
          }
        };

    nodePath = new DefaultOperationRequestAddress();
    CommandLineParser.CallbackHandler handler = new DefaultCallbackHandler(nodePath);
    try {
      ParserUtil.parseOperationRequest(nodeType, handler);
    } catch (CommandFormatException e) {
      throw new IllegalArgumentException("Failed to parse nodeType: " + e.getMessage());
    }

    if (!nodePath.endsOnType()) {
      throw new IllegalArgumentException("The node path doesn't end on a type: '" + nodeType + "'");
    }
    this.type = nodePath.getNodeType();
    nodePath.toParentNode();
    addRequiredPath(nodePath);
    this.commandName = type;
    this.idProperty = idProperty;

    this.excludeOps = excludeOperations;

    profile =
        new ArgumentWithValue(
            this,
            new DefaultCompleter(
                new CandidatesProvider() {
                  @Override
                  public List<String> getAllCandidates(CommandContext ctx) {
                    return Util.getNodeNames(ctx.getModelControllerClient(), null, "profile");
                  }
                }),
            "--profile") {
          @Override
          public boolean canAppearNext(CommandContext ctx) throws CommandFormatException {
            if (!ctx.isDomainMode()) {
              return false;
            }
            return super.canAppearNext(ctx);
          }
        };
    // profile.addCantAppearAfter(helpArg);

    operation =
        new ArgumentWithValue(
            this,
            new DefaultCompleter(
                new CandidatesProvider() {
                  @Override
                  public Collection<String> getAllCandidates(CommandContext ctx) {
                    DefaultOperationRequestAddress address = new DefaultOperationRequestAddress();
                    if (ctx.isDomainMode()) {
                      final String profileName = profile.getValue(ctx.getParsedCommandLine());
                      if (profileName == null) {
                        return Collections.emptyList();
                      }
                      address.toNode("profile", profileName);
                    }

                    for (OperationRequestAddress.Node node : nodePath) {
                      address.toNode(node.getType(), node.getName());
                    }
                    address.toNode(type, "?");
                    Collection<String> ops =
                        ctx.getOperationCandidatesProvider().getOperationNames(ctx, address);
                    ops.removeAll(excludeOps);
                    return ops;
                  }
                }),
            0,
            "--operation") {
          @Override
          public boolean canAppearNext(CommandContext ctx) throws CommandFormatException {
            if (ctx.isDomainMode() && !profile.isValueComplete(ctx.getParsedCommandLine())) {
              return false;
            }
            return super.canAppearNext(ctx);
          }
        };
    operation.addCantAppearAfter(helpArg);

    name =
        new ArgumentWithValue(
            this,
            new DefaultCompleter(
                new DefaultCompleter.CandidatesProvider() {
                  @Override
                  public List<String> getAllCandidates(CommandContext ctx) {
                    ModelControllerClient client = ctx.getModelControllerClient();
                    if (client == null) {
                      return Collections.emptyList();
                    }

                    DefaultOperationRequestAddress address = new DefaultOperationRequestAddress();
                    if (ctx.isDomainMode()) {
                      final String profileName = profile.getValue(ctx.getParsedCommandLine());
                      if (profile == null) {
                        return Collections.emptyList();
                      }
                      address.toNode("profile", profileName);
                    }

                    for (OperationRequestAddress.Node node : nodePath) {
                      address.toNode(node.getType(), node.getName());
                    }

                    return Util.getNodeNames(ctx.getModelControllerClient(), address, type);
                  }
                }),
            (idProperty == null ? "--name" : "--" + idProperty)) {
          @Override
          public boolean canAppearNext(CommandContext ctx) throws CommandFormatException {
            if (ctx.isDomainMode() && !profile.isValueComplete(ctx.getParsedCommandLine())) {
              return false;
            }
            return super.canAppearNext(ctx);
          }
        };
    name.addCantAppearAfter(helpArg);

    helpArg.addCantAppearAfter(name);

    helpProperties = new ArgumentWithoutValue(this, "--properties");
    helpProperties.addRequiredPreceding(helpArg);
    helpProperties.addCantAppearAfter(operation);

    helpCommands = new ArgumentWithoutValue(this, "--commands");
    helpCommands.addRequiredPreceding(helpArg);
    helpCommands.addCantAppearAfter(operation);
    helpCommands.addCantAppearAfter(helpProperties);
    helpProperties.addCantAppearAfter(helpCommands);

    ///
    staticArgs.add(helpArg);
    staticArgs.add(helpCommands);
    staticArgs.add(helpProperties);
    staticArgs.add(profile);
    staticArgs.add(name);
    staticArgs.add(operation);
  }