@Override public Short apply(ThriftFieldMetadata input) { return input.getId(); } }));
@Override public Short apply(ThriftFieldMetadata input) { return input.getId(); } }));
@Override public Short apply(ThriftFieldMetadata metadata) { return metadata.getId(); } };
@Override public Short apply(ThriftFieldMetadata metadata) { return metadata.getId(); } };
/** * Defines the code to inject data into the struct public fields. */ private void injectStructFields(MethodDefinition read, LocalVariableDefinition instance, Map<Short, LocalVariableDefinition> structData) { for (ThriftFieldMetadata field : metadata.getFields(THRIFT_FIELD)) { injectField(read, field, instance, structData.get(field.getId())); } }
@Override public void write(T instance, TProtocol protocol) throws Exception { TProtocolWriter writer = new TProtocolWriter(protocol); Short idValue = (Short) getFieldValue(instance, idField.getKey()); writer.writeStructBegin(metadata.getStructName()); if (metadataMap.containsKey(idValue)) { ThriftFieldMetadata fieldMetadata = metadataMap.get(idValue); if (fieldMetadata.isReadOnly() || fieldMetadata.getType() != THRIFT_FIELD) { throw new IllegalStateException(format("Field %s is not readable", fieldMetadata.getName())); } Object fieldValue = getFieldValue(instance, fieldMetadata); // write the field if (fieldValue != null) { @SuppressWarnings("unchecked") ThriftCodec<Object> codec = (ThriftCodec<Object>) fields.get(fieldMetadata.getId()); writer.writeField(fieldMetadata.getName(), fieldMetadata.getId(), codec, fieldValue); } } writer.writeStructEnd(); }
data.put(field.getId(), value); } catch (Exception e) { Throwables.throwIfUnchecked(e);
for (ThriftFieldMetadata fieldMetadata : methodMetadata.getParameters()) { @SuppressWarnings("unused") Builder<Short, ThriftCodec<?>> p = builder.put(fieldMetadata.getId(), codecManager.getCodec(fieldMetadata.getThriftType())); for (ThriftFieldMetadata fieldMetadata : methodMetadata.getParameters()) { @SuppressWarnings("unused") Builder<Short, Short> p = parameterOrderingBuilder.put(fieldMetadata.getId(), javaArgumentPosition++);
@Override public void write(T instance, TProtocol protocol) throws Exception { TProtocolWriter writer = new TProtocolWriter(protocol); writer.writeStructBegin(metadata.getStructName()); for (ThriftFieldMetadata fieldMetadata : metadata.getFields(THRIFT_FIELD)) { // is the field readable? if (fieldMetadata.isWriteOnly()) { continue; } // get the field value Object fieldValue = getFieldValue(instance, fieldMetadata); // write the field if (fieldValue != null) { @SuppressWarnings("unchecked") ThriftCodec<Object> codec = (ThriftCodec<Object>) fields.get(fieldMetadata.getId()); writer.writeField(fieldMetadata.getName(), fieldMetadata.getId(), codec, fieldValue); } } writer.writeStructEnd(); }
DecoratorThriftFieldMetadata(ThriftFieldMetadata input){ super( input.getId(), input.getRequiredness(), input.getThriftType(), input.getName(), input.getType(), input.getInjections(), input.getConstructorInjection(), input.getMethodInjection(), input.getExtraction(), input.getCoercion()); // 获取field的类型 List<ThriftInjection> injections = getInjections(); checkState(injections.size()>0,"invalid size of injections"); ThriftInjection injection = injections.get(0); if(injection instanceof ThriftParameterInjection){ javaType = ((ThriftParameterInjection)injection).getJavaType(); }else if(injection instanceof ThriftFieldInjection){ javaType = ((ThriftFieldInjection)injection).getField().getType(); }else{ javaType = null; // 对于不支持的数据类型无法获取field类型,输出警告 logger.warning( String.format("UNSUPPORED TYPE %s,can't get Java Type. " + "(不识别的ThriftInjection实例类型,无法实现requiredness转义)", null == injection? null : injection.getClass().getName())); } } /** 重载方法,实现 requiredness 转义 */
public DecoratorThriftFieldMetadata(ThriftFieldMetadata input){ super( input.getId(), input.getRequiredness(), input.getThriftType(), input.getName(), input.getType(), input.getInjections(), input.getConstructorInjection(), input.getMethodInjection(), input.getExtraction(), input.getCoercion()); // 获取field的类型 List<ThriftInjection> injections = getInjections(); checkState(injections.size()>0,"invalid size of injections"); ThriftInjection injection = injections.get(0); if(injection instanceof ThriftParameterInjection){ javaType = ((ThriftParameterInjection)injection).getJavaType(); }else if(injection instanceof ThriftFieldInjection){ javaType = ((ThriftFieldInjection)injection).getField().getType(); }else{ javaType = null; // 对于不支持的数据类型无法获取field类型,输出警告 logger.warning( String.format("UNSUPPORED TYPE %s,can't get Java Type. " + "(不识别的ThriftInjection实例类型,无法实现requiredness转义)", null == injection? null : injection.getClass().getName())); } } /** 重载方法,实现 requiredness 转义 */
/** * Declares a field for each delegate codec * * @return a map from field id to the codec for the field */ private Map<Short, FieldDefinition> declareCodecFields() { Map<Short, FieldDefinition> codecFields = new TreeMap<>(); for (ThriftFieldMetadata fieldMetadata : metadata.getFields()) { if (needsCodec(fieldMetadata)) { ThriftCodec<?> codec = codecManager.getCodec(fieldMetadata.getThriftType()); String fieldName = fieldMetadata.getName() + "Codec"; FieldDefinition codecField = new FieldDefinition(a(PRIVATE, FINAL), fieldName, type(codec.getClass())); classDefinition.addField(codecField); codecFields.put(fieldMetadata.getId(), codecField); parameters.add(codecField, codec); } } return codecFields; }
protected AbstractReflectionThriftCodec(ThriftCodecManager manager, ThriftStructMetadata metadata) { this.metadata = metadata; ImmutableSortedMap.Builder<Short, ThriftCodec<?>> fields = ImmutableSortedMap.naturalOrder(); for (ThriftFieldMetadata fieldMetadata : metadata.getFields(THRIFT_FIELD)) { fields.put(fieldMetadata.getId(), manager.getCodec(fieldMetadata.getThriftType())); } this.fields = fields.build(); }
private <T> void verifyField(ThriftStructMetadata metadata, int id, String name) { ThriftFieldMetadata messageField = metadata.getField(id); assertNotNull(messageField, "field '" + name + "' is null"); assertEquals(messageField.getId(), id); assertEquals(messageField.getName(), name); assertFalse(messageField.isReadOnly()); assertFalse(messageField.isWriteOnly()); assertTrue(messageField.getExtraction().isPresent()); ThriftExtraction extraction = messageField.getExtraction().get(); assertEquals(extraction.getId(), id); assertEquals(extraction.getName(), name); assertNotNull(messageField.getInjections()); assertEquals(messageField.getInjections().size(), 1); ThriftInjection injection = messageField.getInjections().get(0); assertEquals(injection.getId(), id); assertEquals(injection.getName(), name); } }
private <T> void verifyField(ThriftStructMetadata metadata, int id, String name) { ThriftFieldMetadata metadataField = metadata.getField(id); assertNotNull(metadataField, "metadataField is null"); assertEquals(metadataField.getId(), id); assertEquals(metadataField.getName(), name); assertFalse(metadataField.isReadOnly()); assertFalse(metadataField.isWriteOnly()); assertTrue(metadataField.getExtraction().isPresent()); ThriftExtraction extraction = metadataField.getExtraction().get(); assertEquals(extraction.getId(), id); assertEquals(extraction.getName(), name); assertNotNull(metadataField.getInjections()); assertEquals(metadataField.getInjections().size(), 1); ThriftInjection injection = metadataField.getInjections().get(0); assertEquals(injection.getId(), id); assertEquals(injection.getName(), name); } }
@Test public void testLegacyIdCorrectlyAnnotated() { ThriftStructMetadataBuilder builder = new ThriftStructMetadataBuilder(new ThriftCatalog(), LegacyIdCorrect.class); ThriftStructMetadata metadata = builder.build(); Set<Integer> seen = new HashSet<>(); for (ThriftFieldMetadata field : metadata.getFields()) { seen.add((int) field.getId()); } assertThat(seen) .as("fields found in LegacyIdCorrect") .isEqualTo(LegacyIdCorrect.IDS); }
@Test public void testLegacyIdOnUnion() { ThriftUnionMetadataBuilder builder = new ThriftUnionMetadataBuilder(new ThriftCatalog(), LegacyIdUnionCorrect.class); ThriftStructMetadata metadata = builder.build(); Set<Integer> seen = new HashSet<>(); for (ThriftFieldMetadata field : metadata.getFields()) { seen.add((int) field.getId()); } assertThat(seen) .as("fields found in LegacyIdUnionCorrect") .isEqualTo(LegacyIdUnionCorrect.IDS); }
@Test(dataProvider="getTestCasesWithLegacyFieldIds") public void testLegacyFieldIds(Method[] mBox) { Method m = mBox[0]; ThriftMethodMetadata metadata = new ThriftMethodMetadata("DummyService", m, new ThriftCatalog()); List<ThriftFieldMetadata> parameters = metadata.getParameters(); assertThat(parameters) .as("parameters") .hasSize(1); assertThat(parameters.get(0).getId()) .as("the parameter's ID") .isNegative(); }
@Test(dataProvider="getTestCasesWithNonLegacyFieldIds") public void testNonLegacyFieldIds(Method[] mBox) { Method m = mBox[0]; ThriftMethodMetadata metadata = new ThriftMethodMetadata("DummyService", m, new ThriftCatalog()); List<ThriftFieldMetadata> parameters = metadata.getParameters(); assertThat(parameters) .as("parameters") .hasSize(1); assertThat(parameters.get(0).getId()) .as("the parameter's ID") .isGreaterThanOrEqualTo((short) 0); }