Skip to content
This repository was archived by the owner on Sep 25, 2026. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,22 @@

package com.google.cloud.storage;

import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.ByteString;
import com.google.protobuf.MessageOrBuilder;
import com.google.protobuf.util.JsonFormat;
import com.google.protobuf.util.JsonFormat.Printer;
import com.google.protobuf.TextFormat;
import com.google.storage.v2.BidiReadObjectResponse;
import com.google.storage.v2.BidiWriteObjectRequest;
import com.google.storage.v2.BucketAccessControl;
import com.google.storage.v2.ChecksummedData;
import com.google.storage.v2.ObjectAccessControl;
import com.google.storage.v2.ObjectRangeData;
import com.google.storage.v2.ReadObjectRequest;
import com.google.storage.v2.ReadObjectResponse;
import com.google.storage.v2.WriteObjectRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.function.Function;
import java.util.function.Predicate;
import org.checkerframework.checker.nullness.qual.NonNull;

Expand All @@ -31,9 +40,6 @@ final class StorageV2ProtoUtils {
private static final String VALIDATION_TEMPLATE =
"offset >= 0 && limit >= 0 (%s >= 0 && %s >= 0)";

private static final Printer PROTO_PRINTER =
JsonFormat.printer().omittingInsignificantWhitespace().preservingProtoFieldNames();

private StorageV2ProtoUtils() {}

// TODO: can we eliminate this method all together?
Expand All @@ -53,13 +59,120 @@ static ReadObjectRequest seekReadObjectRequest(
return req;
}

@FunctionalInterface
interface MsgFmt extends Function<MessageOrBuilder, String> {}

@NonNull
public static String fmtProto(@NonNull Object obj) {
return fmtProtoWithFmt(obj, TextFormat.printer()::shortDebugString);
}

@NonNull
public static String fmtProtoWithFmt(@NonNull Object obj, MsgFmt fmt) {
if (obj instanceof WriteObjectRequest) {
return fmtProtoWithFmt((WriteObjectRequest) obj, fmt);
} else if (obj instanceof BidiWriteObjectRequest) {
return fmtProtoWithFmt((BidiWriteObjectRequest) obj, fmt);
} else if (obj instanceof ReadObjectResponse) {
return fmtProtoWithFmt((ReadObjectResponse) obj, fmt);
} else if (obj instanceof BidiReadObjectResponse) {
return fmtProtoWithFmt((BidiReadObjectResponse) obj, fmt);
} else if (obj instanceof ChecksummedData) {
return fmtProtoWithFmt((ChecksummedData) obj, fmt);
} else if (obj instanceof MessageOrBuilder) {
return fmt.apply((MessageOrBuilder) obj);
} else {
return obj.toString();
}
}

@NonNull
private static String fmtProtoWithFmt(ChecksummedData data, MsgFmt fmt) {
ByteString content = data.getContent();
if (content.size() > 20) {
ChecksummedData.Builder b = data.toBuilder();
ByteString trim = snipBytes(content);
b.setContent(trim);

return fmt.apply(b.build());
}
return fmt.apply(data);
}

@NonNull
static String fmtProto(@NonNull final MessageOrBuilder msg) {
try {
return PROTO_PRINTER.print(msg);
} catch (InvalidProtocolBufferException e) {
throw new RuntimeException(e);
private static String fmtProtoWithFmt(@NonNull WriteObjectRequest msg, MsgFmt fmt) {
if (msg.hasChecksummedData()) {
ByteString content = msg.getChecksummedData().getContent();
if (content.size() > 20) {
WriteObjectRequest.Builder b = msg.toBuilder();
ByteString trim = snipBytes(content);
b.getChecksummedDataBuilder().setContent(trim);

return fmt.apply(b.build());
}
}
return fmt.apply(msg);
}

@NonNull
private static String fmtProtoWithFmt(@NonNull BidiWriteObjectRequest msg, MsgFmt fmt) {
if (msg.hasChecksummedData()) {
ByteString content = msg.getChecksummedData().getContent();
if (content.size() > 20) {
BidiWriteObjectRequest.Builder b = msg.toBuilder();
ByteString trim = snipBytes(content);
b.getChecksummedDataBuilder().setContent(trim);

return fmt.apply(b.build());
}
}
return fmt.apply(msg);
}

@NonNull
private static String fmtProtoWithFmt(@NonNull ReadObjectResponse msg, MsgFmt fmt) {
if (msg.hasChecksummedData()) {
ByteString content = msg.getChecksummedData().getContent();
if (content.size() > 20) {
ReadObjectResponse.Builder b = msg.toBuilder();
ByteString trim = snipBytes(content);
b.getChecksummedDataBuilder().setContent(trim);

return fmt.apply(b.build());
}
}
return fmt.apply(msg);
}

@NonNull
private static String fmtProtoWithFmt(@NonNull BidiReadObjectResponse msg, MsgFmt fmt) {
List<ObjectRangeData> rangeData = msg.getObjectDataRangesList();
if (!rangeData.isEmpty()) {
List<ObjectRangeData> snips = new ArrayList<>();
for (ObjectRangeData rd : rangeData) {
if (rd.hasChecksummedData()) {
ByteString content = rd.getChecksummedData().getContent();
if (content.size() > 20) {
ObjectRangeData.Builder b = rd.toBuilder();
ByteString trim = snipBytes(content);
b.getChecksummedDataBuilder().setContent(trim);
snips.add(b.build());
} else {
snips.add(rd);
}
}
}
BidiReadObjectResponse snipped =
msg.toBuilder().clearObjectDataRanges().addAllObjectDataRanges(snips).build();
return fmt.apply(snipped);
}
return fmt.apply(msg);
}

private static ByteString snipBytes(ByteString content) {
ByteString snip =
ByteString.copyFromUtf8(java.lang.String.format(Locale.US, "<snip (%d)>", content.size()));
return content.substring(0, 20).concat(snip);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import com.google.cloud.storage.OtelStorageDecorator.OtelDecoratedReadChannel;
import com.google.cloud.storage.OtelStorageDecorator.OtelDecoratedWriteChannel;
import com.google.common.collect.ImmutableList;
import com.google.protobuf.MessageOrBuilder;
import com.google.storage.v2.StorageClient;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
Expand Down Expand Up @@ -134,4 +135,8 @@ public static <T1, T2> void ifNonNull(@Nullable T1 t, Function<T1, T2> map, Cons
public static BlobInfo noAcl(BlobInfo bi) {
return bi.toBuilder().setOwner(null).setAcl(ImmutableList.of()).build();
}

public static String fmtProto(Object msg, Function<MessageOrBuilder, String> fmt) {
return StorageV2ProtoUtils.fmtProtoWithFmt(msg, fmt::apply);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,16 @@
package com.google.cloud.storage.it;

import com.google.api.gax.grpc.GrpcInterceptorProvider;
import com.google.cloud.storage.PackagePrivateMethodWorkarounds;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import com.google.protobuf.Any;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.Message;
import com.google.protobuf.MessageOrBuilder;
import com.google.protobuf.TextFormat;
import com.google.protobuf.UnsafeByteOperations;
import com.google.rpc.DebugInfo;
import com.google.rpc.ErrorInfo;
import com.google.storage.v2.BidiReadObjectResponse;
import com.google.storage.v2.BidiWriteObjectRequest;
import com.google.storage.v2.ObjectRangeData;
import com.google.storage.v2.ReadObjectResponse;
import com.google.storage.v2.WriteObjectRequest;
import io.grpc.CallOptions;
import io.grpc.Channel;
import io.grpc.ClientCall;
Expand All @@ -43,7 +37,6 @@
import io.grpc.MethodDescriptor;
import io.grpc.Status;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
Expand Down Expand Up @@ -159,101 +152,8 @@ public void sendMessage(ReqT message) {
}

@NonNull
static String fmtProto(@NonNull Object obj) {
if (obj instanceof WriteObjectRequest) {
return fmtProto((WriteObjectRequest) obj);
} else if (obj instanceof BidiWriteObjectRequest) {
return fmtProto((BidiWriteObjectRequest) obj);
} else if (obj instanceof ReadObjectResponse) {
return fmtProto((ReadObjectResponse) obj);
} else if (obj instanceof BidiReadObjectResponse) {
return fmtProto((BidiReadObjectResponse) obj);
} else if (obj instanceof MessageOrBuilder) {
return fmtProto((MessageOrBuilder) obj);
} else {
return obj.toString();
}
}

@NonNull
static String fmtProto(@NonNull final MessageOrBuilder msg) {
return TextFormat.printer().printToString(msg);
}

@NonNull
static String fmtProto(@NonNull WriteObjectRequest msg) {
if (msg.hasChecksummedData()) {
ByteString content = msg.getChecksummedData().getContent();
if (content.size() > 20) {
WriteObjectRequest.Builder b = msg.toBuilder();
ByteString trim = snipBytes(content);
b.getChecksummedDataBuilder().setContent(trim);

return fmtProto((MessageOrBuilder) b.build());
}
}
return fmtProto((MessageOrBuilder) msg);
}

@NonNull
static String fmtProto(@NonNull BidiWriteObjectRequest msg) {
if (msg.hasChecksummedData()) {
ByteString content = msg.getChecksummedData().getContent();
if (content.size() > 20) {
BidiWriteObjectRequest.Builder b = msg.toBuilder();
ByteString trim = snipBytes(content);
b.getChecksummedDataBuilder().setContent(trim);

return fmtProto((MessageOrBuilder) b.build());
}
}
return fmtProto((MessageOrBuilder) msg);
}

@NonNull
static String fmtProto(@NonNull ReadObjectResponse msg) {
if (msg.hasChecksummedData()) {
ByteString content = msg.getChecksummedData().getContent();
if (content.size() > 20) {
ReadObjectResponse.Builder b = msg.toBuilder();
ByteString trim = snipBytes(content);
b.getChecksummedDataBuilder().setContent(trim);

return fmtProto((MessageOrBuilder) b.build());
}
}
return msg.toString();
}

@NonNull
public static String fmtProto(@NonNull BidiReadObjectResponse msg) {
List<ObjectRangeData> rangeData = msg.getObjectDataRangesList();
if (!rangeData.isEmpty()) {
List<ObjectRangeData> snips = new ArrayList<>();
for (ObjectRangeData rd : rangeData) {
if (rd.hasChecksummedData()) {
ByteString content = rd.getChecksummedData().getContent();
if (content.size() > 20) {
ObjectRangeData.Builder b = rd.toBuilder();
ByteString trim = snipBytes(content);
b.getChecksummedDataBuilder().setContent(trim);
snips.add(b.build());
} else {
snips.add(rd);
}
}
}
BidiReadObjectResponse snipped =
msg.toBuilder().clearObjectDataRanges().addAllObjectDataRanges(snips).build();
return fmtProto((MessageOrBuilder) snipped);
}
return fmtProto((MessageOrBuilder) msg);
}

private static ByteString snipBytes(ByteString content) {
ByteString snip =
ByteString.copyFromUtf8(String.format(Locale.US, "<snip (%d)>", content.size()));
return content.substring(0, 20).concat(snip);
public static String fmtProto(@NonNull Object obj) {
return PackagePrivateMethodWorkarounds.fmtProto(obj, TextFormat.printer()::printToString);
}

// Suppress DataFlowIssue warnings for this method.
Expand Down