예제 #1
0
    public Common.Frame toProto() {
      Common.Frame.Builder builder = Common.Frame.newBuilder();

      builder.setDone(done).setOffset(offset);

      for (Object row : this.rows) {
        if (null == row) {
          // Does this need to be persisted for some reason?
          continue;
        }

        if (row instanceof Object[]) {
          final Common.Row.Builder rowBuilder = Common.Row.newBuilder();

          for (Object element : (Object[]) row) {
            final Common.TypedValue.Builder valueBuilder = Common.TypedValue.newBuilder();

            // Numbers
            if (element instanceof Byte) {
              valueBuilder.setType(Common.Rep.BYTE).setNumberValue(((Byte) element).longValue());
            } else if (element instanceof Short) {
              valueBuilder.setType(Common.Rep.SHORT).setNumberValue(((Short) element).longValue());
            } else if (element instanceof Integer) {
              valueBuilder
                  .setType(Common.Rep.INTEGER)
                  .setNumberValue(((Integer) element).longValue());
            } else if (element instanceof Long) {
              valueBuilder.setType(Common.Rep.LONG).setNumberValue((Long) element);
            } else if (element instanceof Double) {
              valueBuilder
                  .setType(Common.Rep.DOUBLE)
                  .setDoubleValue(((Double) element).doubleValue());
            } else if (element instanceof Float) {
              valueBuilder.setType(Common.Rep.FLOAT).setNumberValue(((Float) element).longValue());
            } else if (element instanceof BigDecimal) {
              valueBuilder
                  .setType(Common.Rep.NUMBER)
                  .setDoubleValue(((BigDecimal) element).doubleValue());
              // Strings
            } else if (element instanceof String) {
              valueBuilder.setType(Common.Rep.STRING).setStringValue((String) element);
            } else if (element instanceof Character) {
              valueBuilder
                  .setType(Common.Rep.CHARACTER)
                  .setStringValue(((Character) element).toString());
              // Bytes
            } else if (element instanceof byte[]) {
              valueBuilder
                  .setType(Common.Rep.BYTE_STRING)
                  .setBytesValues(ByteString.copyFrom((byte[]) element));
              // Boolean
            } else if (element instanceof Boolean) {
              valueBuilder.setType(Common.Rep.BOOLEAN).setBoolValue((boolean) element);
            } else if (null == element) {
              valueBuilder.setType(Common.Rep.NULL);
              // Unhandled
            } else {
              throw new RuntimeException("Unhandled type in Frame: " + element.getClass());
            }

            // Add value to row
            rowBuilder.addValue(valueBuilder.build());
          }

          // Collect all rows
          builder.addRows(rowBuilder.build());
        } else {
          // Can a "row" be a primitive? A struct? Only an Array?
          throw new RuntimeException("Only arrays are supported");
        }
      }

      return builder.build();
    }