/** * Creates additional types (Value, Struct and ListValue) to be added to the Service config. * TODO (guptasu): Fix this hack. Find a better way to add the predefined types. * TODO (guptasu): Add them only when required and not in all cases. */ static Iterable<Type> createAdditionalServiceTypes() { Map<String, DescriptorProto> additionalMessages = Maps.newHashMap(); additionalMessages.put(Struct.getDescriptor().getFullName(), Struct.getDescriptor().toProto()); additionalMessages.put(Value.getDescriptor().getFullName(), Value.getDescriptor().toProto()); additionalMessages.put(ListValue.getDescriptor().getFullName(), ListValue.getDescriptor().toProto()); additionalMessages.put(Empty.getDescriptor().getFullName(), Empty.getDescriptor().toProto()); additionalMessages.put(Int32Value.getDescriptor().getFullName(), Int32Value.getDescriptor().toProto()); additionalMessages.put(DoubleValue.getDescriptor().getFullName(), DoubleValue.getDescriptor().toProto()); additionalMessages.put(BoolValue.getDescriptor().getFullName(), BoolValue.getDescriptor().toProto()); additionalMessages.put(StringValue.getDescriptor().getFullName(), StringValue.getDescriptor().toProto()); for (Descriptor descriptor : Struct.getDescriptor().getNestedTypes()) { additionalMessages.put(descriptor.getFullName(), descriptor.toProto()); } // TODO (guptasu): Remove this hard coding. Without this, creation of Model from Service throws. // Needs investigation. String fileName = "struct.proto"; List<Type> additionalTypes = Lists.newArrayList(); for (String typeName : additionalMessages.keySet()) { additionalTypes.add(TypesBuilderFromDescriptor.createType(typeName, additionalMessages.get(typeName), fileName)); } return additionalTypes; }
@Test public void create_ordering_filters_for_numbers() { final double number = 3.14; final ColumnFilter filter = le("doubleColumn", number); assertNotNull(filter); assertEquals(LESS_OR_EQUAL, filter.getOperator()); final DoubleValue value = AnyPacker.unpack(filter.getValue()); assertEquals(number, value.getValue(), 0.0); }
@Before public void setUp() { RecordBasedRepository<Long, TestEntity1, StringValue> r1 = new TestRepository1(); RecordBasedRepository<Long, TestEntity2, DoubleValue> r2 = new TestRepository2(); entityFactory1 = r1.entityFactory(); entityFactory2 = r2.entityFactory(); }
@Test public void serialize() { SerializableTester.reserializeAndAssert( StorageSpec.of(newName(getClass().getSimpleName()), TypeUrl.of(DoubleValue.class), String.class)); }
DoubleValueMarshaller() { super(DoubleValue.getDefaultInstance()); }
@Override protected final void doMerge(JsonParser parser, int unused, Message.Builder messageBuilder) throws IOException { DoubleValue.Builder builder = (DoubleValue.Builder) messageBuilder; builder.setValue(ParseSupport.parseDouble(parser)); }
@Override protected final void doWrite(DoubleValue message, JsonGenerator gen) throws IOException { SerializeSupport.printDouble(message.getValue(), gen); }
@Test public void anyFields() throws Exception { TestAllTypes content = TestAllTypes.newBuilder().setOptionalInt32(1234).build(); TestAny message = TestAny.newBuilder().setAnyValue(Any.pack(content)).build(); assertMatchesUpstream(message, TestAllTypes.getDefaultInstance()); TestAny messageWithDefaultAnyValue = TestAny.newBuilder().setAnyValue(Any.getDefaultInstance()).build(); assertMatchesUpstream(messageWithDefaultAnyValue); // Well-known types have a special formatting when embedded in Any. // // 1. Any in Any. Any anyMessage = Any.pack(Any.pack(content)); assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance()); // 2. Wrappers in Any. anyMessage = Any.pack(Int32Value.newBuilder().setValue(12345).build()); assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance()); anyMessage = Any.pack(UInt32Value.newBuilder().setValue(12345).build()); assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance()); anyMessage = Any.pack(Int64Value.newBuilder().setValue(12345).build()); assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance()); anyMessage = Any.pack(UInt64Value.newBuilder().setValue(12345).build()); assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance()); anyMessage = Any.pack(FloatValue.newBuilder().setValue(12345).build()); assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance()); anyMessage = Any.pack(DoubleValue.newBuilder().setValue(12345).build()); assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance()); anyMessage = Any.pack(BoolValue.newBuilder().setValue(true).build()); assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance()); anyMessage = Any.pack(StringValue.newBuilder().setValue("Hello").build()); assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance()); anyMessage = Any.pack(BytesValue.newBuilder().setValue(ByteString.copyFrom(new byte[] {1, 2})).build()); assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance()); // 3. Timestamp in Any. anyMessage = Any.pack(Timestamps.parse("1969-12-31T23:59:59Z")); assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance()); // 4. Duration in Any anyMessage = Any.pack(Durations.parse("12345.10s")); assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance()); // 5. FieldMask in Any anyMessage = Any.pack(FieldMaskUtil.fromString("foo.bar,baz")); assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance()); // 6. Struct in Any Struct.Builder structBuilder = Struct.newBuilder(); structBuilder.putFields("number", Value.newBuilder().setNumberValue(1.125).build()); anyMessage = Any.pack(structBuilder.build()); assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance()); // 7. Value (number type) in Any Value.Builder valueBuilder = Value.newBuilder(); valueBuilder.setNumberValue(1); anyMessage = Any.pack(valueBuilder.build()); assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance()); // 8. Value (null type) in Any anyMessage = Any.pack(Value.newBuilder().setNullValue(NullValue.NULL_VALUE).build()); assertMatchesUpstream(anyMessage, TestAllTypes.getDefaultInstance()); }
/** * Convert a protocol buffer field value to {@link Any} with the below rule: * <ul> * <li> If the field is a primitive type and can be mapped to a wrapper message type * defined in //tech/type/proto/wrappers.proto, its value is boxed into a wrapper * and goes to Any.value, the type name of the wrapper goes to Any.type_url. * <li> If the field is already a message, its type name goes to Any.type_url, * its value directly goes to Any.value * <li> If the field is an enum value, the name of the enum value is boxed into * tech.type.String and put into Any.value, and tech.type.String goes to Any.type_url. */ private static Any toAnyType(FieldDescriptor.Type protobufType, Object value) { Any.Builder builder = Any.newBuilder(); java.lang.String typeFullName; Message wrapperMessage; switch (protobufType) { case MESSAGE: wrapperMessage = (Message) value; typeFullName = wrapperMessage.getDescriptorForType().getFullName(); break; case ENUM: // NOTE: Erasing the enum type to the String wrapper is currently intentional, to avoid // the need to add an enum wrapper type. This may change in the future. typeFullName = StringValue.getDescriptor().getFullName(); wrapperMessage = StringValue.newBuilder().setValue(((EnumValueDescriptor) value).getName()).build(); break; case BOOL: typeFullName = BoolValue.getDescriptor().getFullName(); wrapperMessage = BoolValue.newBuilder().setValue((Boolean) value).build(); break; case DOUBLE: typeFullName = DoubleValue.getDescriptor().getFullName(); wrapperMessage = DoubleValue.newBuilder().setValue((java.lang.Double) value).build(); break; case FLOAT: typeFullName = FloatValue.getDescriptor().getFullName(); wrapperMessage = FloatValue.newBuilder().setValue((java.lang.Float) value).build(); break; case STRING: typeFullName = StringValue.getDescriptor().getFullName(); wrapperMessage = StringValue.newBuilder().setValue((java.lang.String) value).build(); break; case SINT32: case SFIXED32: case INT32: typeFullName = Int32Value.getDescriptor().getFullName(); wrapperMessage = Int32Value.newBuilder().setValue((Integer) value).build(); break; case SINT64: case SFIXED64: case INT64: typeFullName = Int64Value.getDescriptor().getFullName(); wrapperMessage = Int64Value.newBuilder().setValue((Long) value).build(); break; case UINT32: case FIXED32: typeFullName = UInt32Value.getDescriptor().getFullName(); wrapperMessage = UInt32Value.newBuilder().setValue((Integer) value).build(); break; case UINT64: case FIXED64: typeFullName = UInt64Value.getDescriptor().getFullName(); wrapperMessage = UInt64Value.newBuilder().setValue((Long) value).build(); break; case BYTES: typeFullName = BytesValue.getDescriptor().getFullName(); wrapperMessage = BytesValue.newBuilder().setValue(ByteString.copyFrom((byte[]) value)) .build(); break; default: throw new IllegalArgumentException("Type " + protobufType.name() + " cannot be converted to Any type."); } return builder.setTypeUrl(TYPE_SERVICE_BASE_URL + "/" + typeFullName) .setValue(wrapperMessage.toByteString()).build(); }
@Test public void return_double_msg_field_class_by_descriptor() { assertReturnsFieldClass(Double.class, DoubleValue.getDescriptor()); }