code: public Tuple toTuple(Message msg) {
      if (msg == null) {
        // Pig tuples deal gracefully with nulls.
        // Also, we can be called with null here in recursive calls.
        return null;
      }
  
      Descriptor msgDescriptor = msg.getDescriptorForType();
      Tuple tuple = tupleFactory_.newTuple(msgDescriptor.getFields().size());
      int curField = 0;
      try {
        // Walk through all the possible fields in the message.
        for (FieldDescriptor fieldDescriptor : msgDescriptor.getFields()) {
          // Get the set value, or the default value, or null.
          Object fieldValue = msg.getField(fieldDescriptor);
  
          if (fieldDescriptor.getType() == FieldDescriptor.Type.MESSAGE) {
            tuple.set(curField++, messageToTuple(fieldDescriptor, fieldValue));
          } else {
            tuple.set(curField++, singleFieldToTuple(fieldDescriptor, fieldValue));
          }
        }
      } catch (ExecException e) {
        LOG.warn("Could not convert msg " + msg + " to tuple", e);
      }
  
      return tuple;
    }
docs: Turn a generic message into a Tuple.  Individual fields that are enums
  are converted into their string equivalents.  Fields that are not filled
  out in the protobuf are set to null, unless there is a default field value in
  which case that is used instead.
  @param msg the protobuf message
  @return a pig tuple representing the message.