Skip to content

Commit 62aae63

Browse files
l46kokcopybara-github
authored andcommitted
Support evaluation of dynamic messages constructed via dynamic descriptors
Closes #350 PiperOrigin-RevId: 637930690
1 parent 28de306 commit 62aae63

File tree

9 files changed

+1302
-11
lines changed

9 files changed

+1302
-11
lines changed

common/resources/testdata/proto3/BUILD.bazel

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ package(
44
default_visibility = ["//visibility:public"],
55
)
66

7+
alias(
8+
name = "test_all_types_file_descriptor_set",
9+
actual = "//common/src/main/resources/testdata/proto3:test_all_types_file_descriptor_set",
10+
)
11+
712
alias(
813
name = "test_all_types_java_proto",
914
actual = "//common/src/main/resources/testdata/proto3:test_all_types_java_proto",

common/src/main/java/dev/cel/common/internal/ProtoAdapter.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -210,14 +210,32 @@ public Optional<Object> adaptFieldToValue(FieldDescriptor fieldDescriptor, Objec
210210
}
211211
if (fieldDescriptor.isMapField()) {
212212
Descriptor entryDescriptor = fieldDescriptor.getMessageType();
213-
BidiConverter keyConverter = fieldToValueConverter(entryDescriptor.findFieldByNumber(1));
214-
BidiConverter valueConverter = fieldToValueConverter(entryDescriptor.findFieldByNumber(2));
213+
FieldDescriptor keyFieldDescriptor = entryDescriptor.findFieldByNumber(1);
214+
FieldDescriptor valueFieldDescriptor = entryDescriptor.findFieldByNumber(2);
215+
BidiConverter keyConverter = fieldToValueConverter(keyFieldDescriptor);
216+
BidiConverter valueConverter = fieldToValueConverter(valueFieldDescriptor);
217+
215218
Map<Object, Object> map = new HashMap<>();
216-
for (MapEntry entry : ((List<MapEntry>) fieldValue)) {
219+
Object mapKey;
220+
Object mapValue;
221+
for (Object entry : ((List<Object>) fieldValue)) {
222+
if (entry instanceof MapEntry) {
223+
MapEntry mapEntry = (MapEntry) entry;
224+
mapKey = mapEntry.getKey();
225+
mapValue = mapEntry.getValue();
226+
} else if (entry instanceof DynamicMessage) {
227+
DynamicMessage dynamicMessage = (DynamicMessage) entry;
228+
mapKey = dynamicMessage.getField(keyFieldDescriptor);
229+
mapValue = dynamicMessage.getField(valueFieldDescriptor);
230+
} else {
231+
throw new IllegalStateException("Unexpected map field type: " + entry);
232+
}
233+
217234
map.put(
218-
keyConverter.forwardConverter().convert(entry.getKey()),
219-
valueConverter.forwardConverter().convert(entry.getValue()));
235+
keyConverter.forwardConverter().convert(mapKey),
236+
valueConverter.forwardConverter().convert(mapValue));
220237
}
238+
221239
return Optional.of(map);
222240
}
223241
if (fieldDescriptor.isRepeated()) {

common/src/main/java/dev/cel/common/values/ProtoCelValueConverter.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ public CelValue fromJavaObjectToCelValue(Object value) {
186186
}
187187

188188
/** Adapts the protobuf message field into {@link CelValue}. */
189-
@SuppressWarnings("unchecked")
189+
@SuppressWarnings({"unchecked", "rawtypes"})
190190
public CelValue fromProtoMessageFieldToCelValue(
191191
Message message, FieldDescriptor fieldDescriptor) {
192192
Preconditions.checkNotNull(message);
@@ -202,8 +202,26 @@ public CelValue fromProtoMessageFieldToCelValue(
202202
return NullValue.NULL_VALUE;
203203
} else if (fieldDescriptor.isMapField()) {
204204
Map<Object, Object> map = new HashMap<>();
205-
for (MapEntry<Object, Object> entry : ((List<MapEntry<Object, Object>>) result)) {
206-
map.put(entry.getKey(), entry.getValue());
205+
Object mapKey;
206+
Object mapValue;
207+
for (Object entry : ((List<Object>) result)) {
208+
if (entry instanceof MapEntry) {
209+
MapEntry mapEntry = (MapEntry) entry;
210+
mapKey = mapEntry.getKey();
211+
mapValue = mapEntry.getValue();
212+
} else if (entry instanceof DynamicMessage) {
213+
DynamicMessage dynamicMessage = (DynamicMessage) entry;
214+
FieldDescriptor keyFieldDescriptor =
215+
fieldDescriptor.getMessageType().findFieldByNumber(1);
216+
FieldDescriptor valueFieldDescriptor =
217+
fieldDescriptor.getMessageType().findFieldByNumber(2);
218+
mapKey = dynamicMessage.getField(keyFieldDescriptor);
219+
mapValue = dynamicMessage.getField(valueFieldDescriptor);
220+
} else {
221+
throw new IllegalStateException("Unexpected map field type: " + entry);
222+
}
223+
224+
map.put(mapKey, mapValue);
207225
}
208226
return fromJavaObjectToCelValue(map);
209227
}

common/src/main/resources/testdata/proto3/BUILD.bazel

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ package(
88
],
99
)
1010

11+
filegroup(
12+
name = "test_all_types_file_descriptor_set",
13+
srcs = ["test_all_types.fds"],
14+
)
15+
1116
proto_library(
1217
name = "test_all_types_proto",
1318
srcs = [

0 commit comments

Comments
 (0)