public int run()

in ratis-shell/src/main/java/org/apache/ratis/shell/cli/sh/local/RaftMetaConfCommand.java [70:134]


  public int run(CommandLine cl) throws IOException {
    String peersStr = cl.getOptionValue(PEER_OPTION_NAME);
    String path = cl.getOptionValue(PATH_OPTION_NAME);
    if (peersStr == null || path == null || peersStr.isEmpty() || path.isEmpty()) {
      printf("peers or path can't be empty.");
      return -1;
    }
    Set<String> addresses = new HashSet<>();
    Set<String> ids = new HashSet<>();
    List<RaftPeerProto> raftPeerProtos = new ArrayList<>();
    for (String idWithAddress : peersStr.split(",")) {
      String[] peerIdWithAddressArray = idWithAddress.split(SEPARATOR);

      if (peerIdWithAddressArray.length < 1 || peerIdWithAddressArray.length > 2) {
        String message =
            "Failed to parse peer's ID and address for: %s, " +
                "from option: -peers %s. \n" +
                "Please make sure to provide list of peers" +
                " in format <[P0_ID|]P0_HOST:P0_PORT,[P1_ID|]P1_HOST:P1_PORT,[P2_ID|]P2_HOST:P2_PORT>";
        printf(message, idWithAddress, peersStr);
        return -1;
      }
      InetSocketAddress inetSocketAddress = CliUtils.parseInetSocketAddress(
          peerIdWithAddressArray[peerIdWithAddressArray.length - 1]);
      String addressString = inetSocketAddress.getHostString() + ":" + inetSocketAddress.getPort();
      if (addresses.contains(addressString)) {
        printf("Found duplicated address: %s. Please make sure the address of peer have no duplicated value.",
            addressString);
        return -1;
      }
      addresses.add(addressString);

      String peerId;
      if (peerIdWithAddressArray.length == 2) {
        // Peer ID is provided
        peerId = RaftPeerId.getRaftPeerId(peerIdWithAddressArray[0]).toString();

        if (ids.contains(peerId)) {
          printf("Found duplicated ID: %s. Please make sure the ID of peer have no duplicated value.", peerId);
          return -1;
        }
        ids.add(peerId);
      } else {
        // If peer ID is not provided, use host address as peerId value
        peerId = CliUtils.getPeerId(inetSocketAddress).toString();
      }

      raftPeerProtos.add(RaftPeerProto.newBuilder()
          .setId(ByteString.copyFrom(peerId.getBytes(StandardCharsets.UTF_8)))
          .setAddress(addressString)
          .setStartupRole(RaftPeerRole.FOLLOWER).build());
    }
    try (InputStream in = Files.newInputStream(Paths.get(path, RAFT_META_CONF));
         OutputStream out = Files.newOutputStream(Paths.get(path, NEW_RAFT_META_CONF))) {
      long index = LogEntryProto.newBuilder().mergeFrom(in).build().getIndex();
      println("Index in the original file is: " + index);
      LogEntryProto generateLogEntryProto = LogEntryProto.newBuilder()
          .setConfigurationEntry(RaftConfigurationProto.newBuilder()
              .addAllPeers(raftPeerProtos).build())
          .setIndex(index + 1).build();
      printf("Generate new LogEntryProto info is:\n" + generateLogEntryProto);
      generateLogEntryProto.writeTo(out);
    }
    return 0;
  }