public static DShipCommand parse()

in odps-console-tunnel/src/main/java/com/aliyun/openservices/odps/console/tunnel/TunnelCommand.java [77:159]


  public static DShipCommand parse(String commandString, ExecutionContext sessionContext)
      throws ODPSConsoleException {

    String readCommandString = commandString;
    if (readCommandString.toUpperCase().matches("\\s*UPLOAD\\s+\\w[\\s\\S]*")
        || readCommandString.toUpperCase().matches("\\s*DOWNLOAD\\s+\\w[\\s\\S]*")) {
      // 会把所有多个空格都替换掉
      readCommandString = readCommandString.replaceAll("\\s+", " ");

      boolean isUp = true;

      if (readCommandString.toUpperCase().matches("\\s*DOWNLOAD\\s+\\w[\\s\\S]*")) {
        readCommandString = readCommandString.substring("DOWNLOAD ".length()).trim();
        isUp = false;
      } else {
        readCommandString = readCommandString.substring("UPLOAD ".length()).trim();
      }

      String tableName = "";
      int index = readCommandString.indexOf("(");
      if (index > 0) {
        tableName = readCommandString.substring(0, index);
        if (tableName.toUpperCase().indexOf(" PARTITION") > 0) {
          // tableName中也会包含PARTITION字符,
          tableName = tableName.substring(0, tableName.toUpperCase().indexOf(" PARTITION"));
        }
      } else {
        // 没有column和PARTITION,用" "空格来区分
        if (readCommandString.indexOf(" ") > 0) {
          tableName = readCommandString.substring(0, readCommandString.indexOf(" "));
        } else {
          // read mytable的情况
          tableName = readCommandString;
        }
      }
      // remove tablename, 把前面的空格也删除掉
      readCommandString = readCommandString.substring(tableName.length()).trim();

      String partitions = "";
      if (readCommandString.toUpperCase().indexOf("PARTITION") == 0
          && readCommandString.indexOf("(") > 0 && readCommandString.indexOf(")") > 0
          && readCommandString.indexOf("(") < readCommandString.indexOf(")")) {

        partitions = readCommandString.substring(readCommandString.indexOf("("),
            readCommandString.indexOf(")") + 1);
        // remove partitions
        readCommandString = readCommandString.substring(readCommandString.indexOf(")") + 1).trim();
      }

      String filename = "";
      if (isUp && readCommandString.toUpperCase().startsWith("FROM ")) {
        filename = readCommandString.substring(readCommandString.indexOf(" "));
      } else if (!isUp && readCommandString.toUpperCase().startsWith("TO ")) {
        filename = readCommandString.substring(readCommandString.indexOf(" "));
      } else {
        throw new ODPSConsoleException("bad command. '" + readCommandString + "'");
      }
      filename = filename.trim();

      readCommandString = readCommandString.substring(readCommandString.indexOf(filename)
          + filename.length());

      if (!"".equals(readCommandString)) {
        // TODO help
        throw new ODPSConsoleException("bad command. '" + readCommandString + "'");
      }

      // 转成partition_spec
      partitions = partitions.replace("(", "").replace(")", "")
                             .trim();

      // Replace tunnel command with dship command to get rid of the old tunnel-sdk
      String dshipCommandText = transformIntoDshipCommand(tableName, partitions, filename, isUp);

      DefaultOutputWriter writer = sessionContext.getOutputWriter();
      writer.writeDebug("Replacing command: " + commandString);
      writer.writeDebug("with " + dshipCommandText);

      return new DShipCommand(dshipCommandText, sessionContext);
    }

    return null;
  }