Skip to content

Commit bc5c75f

Browse files
tanx16copybara-github
authored andcommitted
Internal change.
PiperOrigin-RevId: 756920361
1 parent 5a45301 commit bc5c75f

File tree

3 files changed

+86
-23
lines changed

3 files changed

+86
-23
lines changed

java/core/src/main/java/com/google/protobuf/AbstractMessage.java

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,8 @@ public FieldDescriptor getOneofFieldDescriptor(OneofDescriptor oneof) {
8484

8585
@Override
8686
public final String toString() {
87-
TextFormat.Printer printer =
88-
ProtobufToStringOutput.shouldOutputDebugFormat()
89-
? TextFormat.debugFormatPrinter()
90-
: TextFormat.printer();
91-
return printer.printToString(this, TextFormat.Printer.FieldReporterLevel.ABSTRACT_TO_STRING);
87+
return TextFormat.Printer.getOutputModePrinter()
88+
.printToString(this, TextFormat.Printer.FieldReporterLevel.ABSTRACT_TO_STRING);
9289
}
9390

9491
@Override
@@ -452,12 +449,8 @@ public Message.Builder getRepeatedFieldBuilder(final FieldDescriptor field, int
452449

453450
@Override
454451
public String toString() {
455-
TextFormat.Printer printer =
456-
ProtobufToStringOutput.shouldOutputDebugFormat()
457-
? TextFormat.debugFormatPrinter()
458-
: TextFormat.printer();
459-
return printer.printToString(
460-
this, TextFormat.Printer.FieldReporterLevel.ABSTRACT_BUILDER_TO_STRING);
452+
return TextFormat.Printer.getOutputModePrinter()
453+
.printToString(this, TextFormat.Printer.FieldReporterLevel.ABSTRACT_BUILDER_TO_STRING);
461454
}
462455

463456
/** Construct an UninitializedMessageException reporting missing fields in the given message. */

java/core/src/main/java/com/google/protobuf/ProtobufToStringOutput.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@
1111
public final class ProtobufToStringOutput {
1212
private enum OutputMode {
1313
DEBUG_FORMAT,
14-
TEXT_FORMAT
14+
TEXT_FORMAT,
15+
DEFAULT_FORMAT
1516
}
1617

1718
private static final ThreadLocal<OutputMode> outputMode =
18-
ThreadLocal.withInitial(() -> OutputMode.TEXT_FORMAT);
19+
ThreadLocal.withInitial(() -> OutputMode.DEFAULT_FORMAT);
1920

2021
private ProtobufToStringOutput() {}
2122

@@ -45,4 +46,8 @@ public static void callWithTextFormat(Runnable impl) {
4546
public static boolean shouldOutputDebugFormat() {
4647
return outputMode.get() == OutputMode.DEBUG_FORMAT;
4748
}
49+
50+
public static boolean isDefaultFormat() {
51+
return outputMode.get() == OutputMode.DEFAULT_FORMAT;
52+
}
4853
}

java/core/src/main/java/com/google/protobuf/TextFormat.java

Lines changed: 75 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ private TextFormat() {}
3939
private static final Logger logger = Logger.getLogger(TextFormat.class.getName());
4040

4141
private static final String DEBUG_STRING_SILENT_MARKER = " \t ";
42+
private static final String ENABLE_INSERT_SILENT_MARKER_ENV_NAME =
43+
"SILENT_MARKER_INSERTION_ENABLED";
44+
private static final boolean ENABLE_INSERT_SILENT_MARKER =
45+
"true".equals(System.getenv(ENABLE_INSERT_SILENT_MARKER_ENV_NAME));
4246

4347
private static final String REDACTED_MARKER = "[REDACTED]";
4448

@@ -118,6 +122,11 @@ public static Printer debugFormatPrinter() {
118122
return Printer.DEFAULT_DEBUG_FORMAT;
119123
}
120124

125+
/** Printer instance which escapes non-ASCII characters and prints in the debug format. */
126+
public static Printer defaultFormatPrinter() {
127+
return Printer.DEFAULT_FORMAT;
128+
}
129+
121130
/** Helper class for converting protobufs to text. */
122131
public static final class Printer {
123132

@@ -141,6 +150,27 @@ public static final class Printer {
141150
/* enablingSafeDebugFormat= */ true,
142151
/* singleLine= */ false);
143152

153+
// Printer instance which escapes non-ASCII characters and inserts a silent marker.
154+
private static final Printer DEFAULT_FORMAT =
155+
new Printer(
156+
/* escapeNonAscii= */ true,
157+
/* useShortRepeatedPrimitives= */ false,
158+
TypeRegistry.getEmptyTypeRegistry(),
159+
ExtensionRegistryLite.getEmptyRegistry(),
160+
/* enablingSafeDebugFormat= */ false,
161+
/* singleLine= */ false)
162+
.setInsertSilentMarker(ENABLE_INSERT_SILENT_MARKER);
163+
164+
static Printer getOutputModePrinter() {
165+
if (ProtobufToStringOutput.isDefaultFormat()) {
166+
return defaultFormatPrinter();
167+
} else if (ProtobufToStringOutput.shouldOutputDebugFormat()) {
168+
return debugFormatPrinter();
169+
} else {
170+
return printer();
171+
}
172+
}
173+
144174
/**
145175
* A list of the public APIs that output human-readable text from a message. A higher-level API
146176
* must be larger than any lower-level APIs it calls under the hood, e.g
@@ -186,6 +216,14 @@ static enum FieldReporterLevel {
186216

187217
private final boolean singleLine;
188218

219+
private boolean insertSilentMarker;
220+
221+
@CanIgnoreReturnValue
222+
private Printer setInsertSilentMarker(boolean insertSilentMarker) {
223+
this.insertSilentMarker = insertSilentMarker;
224+
return this;
225+
}
226+
189227
// Any API level equal to or greater than this level will be reported. This is set to
190228
// REPORT_NONE by default to prevent reporting for now.
191229
private static final ThreadLocal<FieldReporterLevel> sensitiveFieldReportingLevel =
@@ -209,6 +247,7 @@ private Printer(
209247
this.extensionRegistry = extensionRegistry;
210248
this.enablingSafeDebugFormat = enablingSafeDebugFormat;
211249
this.singleLine = singleLine;
250+
this.insertSilentMarker = false;
212251
}
213252

214253
/**
@@ -338,7 +377,12 @@ public void print(final MessageOrBuilder message, final Appendable output) throw
338377
void print(final MessageOrBuilder message, final Appendable output, FieldReporterLevel level)
339378
throws IOException {
340379
TextGenerator generator =
341-
setSingleLineOutput(output, this.singleLine, message.getDescriptorForType(), level);
380+
setSingleLineOutput(
381+
output,
382+
this.singleLine,
383+
message.getDescriptorForType(),
384+
level,
385+
this.insertSilentMarker);
342386
print(message, generator);
343387
}
344388

@@ -408,7 +452,9 @@ private boolean printAny(final MessageOrBuilder message, final TextGenerator gen
408452
}
409453
generator.print("[");
410454
generator.print(typeUrl);
411-
generator.print("] {");
455+
generator.print("]");
456+
generator.maybePrintSilentMarker();
457+
generator.print("{");
412458
generator.eol();
413459
generator.indent();
414460
print(contentBuilder, generator);
@@ -792,11 +838,13 @@ private void printSingleField(
792838
}
793839

794840
if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
795-
generator.print(" {");
841+
generator.maybePrintSilentMarker();
842+
generator.print("{");
796843
generator.eol();
797844
generator.indent();
798845
} else {
799-
generator.print(": ");
846+
generator.print(":");
847+
generator.maybePrintSilentMarker();
800848
}
801849

802850
printFieldValue(field, value, generator);
@@ -831,7 +879,8 @@ private static void printUnknownFields(
831879
redact);
832880
for (final UnknownFieldSet value : field.getGroupList()) {
833881
generator.print(entry.getKey().toString());
834-
generator.print(" {");
882+
generator.maybePrintSilentMarker();
883+
generator.print("{");
835884
generator.eol();
836885
generator.indent();
837886
printUnknownFields(value, generator, redact);
@@ -851,7 +900,8 @@ private static void printUnknownField(
851900
throws IOException {
852901
for (final Object value : values) {
853902
generator.print(String.valueOf(number));
854-
generator.print(": ");
903+
generator.print(":");
904+
generator.maybePrintSilentMarker();
855905
printUnknownFieldValue(wireType, value, generator, redact);
856906
generator.eol();
857907
}
@@ -879,22 +929,26 @@ public static String unsignedToString(final long value) {
879929
}
880930

881931
private static TextGenerator setSingleLineOutput(Appendable output, boolean singleLine) {
882-
return new TextGenerator(output, singleLine, null, Printer.FieldReporterLevel.TEXT_GENERATOR);
932+
return new TextGenerator(
933+
output, singleLine, null, Printer.FieldReporterLevel.TEXT_GENERATOR, false);
883934
}
884935

885936
private static TextGenerator setSingleLineOutput(
886937
Appendable output,
887938
boolean singleLine,
888939
Descriptor rootMessageType,
889-
Printer.FieldReporterLevel fieldReporterLevel) {
890-
return new TextGenerator(output, singleLine, rootMessageType, fieldReporterLevel);
940+
Printer.FieldReporterLevel fieldReporterLevel,
941+
boolean shouldEmitSilentMarker) {
942+
return new TextGenerator(
943+
output, singleLine, rootMessageType, fieldReporterLevel, shouldEmitSilentMarker);
891944
}
892945

893946
/** An inner class for writing text to the output stream. */
894947
private static final class TextGenerator {
895948
private final Appendable output;
896949
private final StringBuilder indent = new StringBuilder();
897950
private final boolean singleLineMode;
951+
private boolean shouldEmitSilentMarker;
898952
// While technically we are "at the start of a line" at the very beginning of the output, all
899953
// we would do in response to this is emit the (zero length) indentation, so it has no effect.
900954
// Setting it false here does however suppress an unwanted leading space in single-line mode.
@@ -910,11 +964,13 @@ private TextGenerator(
910964
final Appendable output,
911965
boolean singleLineMode,
912966
Descriptor rootMessageType,
913-
Printer.FieldReporterLevel fieldReporterLevel) {
967+
Printer.FieldReporterLevel fieldReporterLevel,
968+
boolean shouldEmitSilentMarker) {
914969
this.output = output;
915970
this.singleLineMode = singleLineMode;
916971
this.rootMessageType = rootMessageType;
917972
this.fieldReporterLevel = fieldReporterLevel;
973+
this.shouldEmitSilentMarker = shouldEmitSilentMarker;
918974
}
919975

920976
/**
@@ -958,6 +1014,15 @@ public void eol() throws IOException {
9581014
}
9591015
atStartOfLine = true;
9601016
}
1017+
1018+
void maybePrintSilentMarker() throws IOException {
1019+
if (shouldEmitSilentMarker) {
1020+
output.append(DEBUG_STRING_SILENT_MARKER);
1021+
shouldEmitSilentMarker = false;
1022+
} else {
1023+
output.append(" ");
1024+
}
1025+
}
9611026
}
9621027

9631028
// =================================================================

0 commit comments

Comments
 (0)