/** * all supported type, default to packed * @param protoField * @return */ public static boolean isSupportPacked(Field protoField) { if (protoField.getType().isEnum()) { return true; } if (protoField.getType().isScalar()) { ScalarFieldType scalarFieldType = (ScalarFieldType) protoField.getType(); return scalarFieldType != ScalarFieldType.STRING && scalarFieldType != ScalarFieldType.BYTES; } return false; }
private void fieldMapToString(Field field, StringBuilder sb) { Message entryMessage = (Message) field.getType(); Field keyField = entryMessage.getField(1); Field valueField = entryMessage.getField(2); // map<string, string> name = 1; appendLine(sb, "map<%s, %s> %s = %d;", keyField.getTypeName(), valueField.getTypeName(), field.getName(), field.getTag()); } }
public static boolean isAnyField(Field protoField) { return protoField.getType().getCanonicalName().equals(ProtoConst.ANY.getCanonicalName()); }
@Override public void mergeFrom(InputEx input, T message) throws IOException { FieldSchema<T> fieldSchema = null; try { for (int n = input.readFieldNumber(); n != 0; ) { fieldSchema = fieldMap.getFieldByNumber(n); if (fieldSchema != null) { n = fieldSchema.mergeFrom(input, message); continue; } input.handleUnknownField(n); n = input.readFieldNumber(); } } catch (Throwable e) { Field protoField = fieldSchema.getProtoField(); LOGGER.error("Failed to mergeFrom, field={}:{}, type={}", protoField.getType().getCanonicalName(), protoField.getName(), protoField.getTypeName(), e.getMessage()); throw e; } }
public EnumMeta(Field protoField, JavaType javaType) { io.protostuff.compiler.model.Enum enumType = (io.protostuff.compiler.model.Enum) protoField.getType(); for (EnumConstant enumConstant : enumType.getConstants()) { enumNameToValueMap.put(enumConstant.getName(), enumConstant.getValue()); enumValues.put(enumConstant.getValue(), null); } if (!javaType.isEnumType()) { return; } try { Method method = javaType.getRawClass().getMethod("values"); method.setAccessible(true); Object[] values = (Object[]) method.invoke(null); for (Object value : values) { Enum<?> enumValue = (Enum<?>) value; enumValues.put(enumNameToValueMap.get(enumValue.name()), enumValue); } } catch (Throwable e) { throw new IllegalStateException( "Failed to collect enum values, class=" + javaType.getRawClass().getName(), e); } }
private void updateFieldTypes(ProtoContext context, Deque<String> scopeLookupList, FieldContainer fieldContainer) { // check if field type isn't already set fieldContainer.getFields() .stream() .filter(field -> field.getType() == null) // for map fields it is set by parser .forEach(field -> { String typeName = field.getTypeName(); FieldType fieldType = resolveFieldType(field, context, scopeLookupList, typeName); field.setType(fieldType); }); }
protected <T> FieldSchema<T> createMapFieldSchema(Field protoField, PropertyDescriptor propertyDescriptor) { JavaType javaType = propertyDescriptor.getJavaType(); if (javaType.isJavaLangObject()) { javaType = ProtoConst.MAP_TYPE; } JavaType entryType = TypeFactory.defaultInstance().constructParametricType(MapEntry.class, javaType.getKeyType(), javaType.getContentType()); SchemaEx<Entry<Object, Object>> entrySchema = getOrCreateMessageSchema((Message) protoField.getType(), entryType); return new MapSchema<>(protoField, propertyDescriptor, entrySchema); }
public AbstractWriters(Field protoField, Class<T[]> arrayClass) { this.protoField = protoField; int wireType = ProtoUtils.isPacked(protoField) && protoField.isRepeated() ? WireFormat.WIRETYPE_LENGTH_DELIMITED : FieldTypeUtils.convert(protoField.getType()).wireType; this.tag = WireFormat.makeTag(protoField.getTag(), wireType); this.tagSize = ProtobufOutputEx.computeRawVarint32Size(tag); if (arrayClass == null) { arrayClass = getFieldArgument(this.getClass(), "arrayWriter"); } this.arrayClass = arrayClass; }
public <T> FieldSchema<T> createSchemaField(Field protoField, PropertyDescriptor propertyDescriptor) { // map is a special repeated if (protoField.isMap()) { return createMapFieldSchema(protoField, propertyDescriptor); } if (protoField.isRepeated()) { return createRepeatedSchema(protoField, propertyDescriptor); } if (isAnyField(protoField)) { return new AnySchema<>(protoMapper, protoField, propertyDescriptor); } if (protoField.getType().isScalar()) { return createScalarField(protoField, propertyDescriptor); } // message if (protoField.getType().isMessage()) { SchemaEx<Object> messageSchema = getOrCreateMessageSchema((Message) protoField.getType(), propertyDescriptor.getJavaType()); if (isWrapProperty((Message) protoField.getType())) { return new PropertyWrapperAsFieldSchema<>(protoField, propertyDescriptor, messageSchema); } return new MessageAsFieldSchema<>(protoField, propertyDescriptor, messageSchema); } if (protoField.isOneofPart()) { throw new IllegalStateException("not IMPL oneof now."); } ProtoUtils.throwNotSupportWrite(protoField, propertyDescriptor.getJavaType().getRawClass()); return null; }
public FieldSchema(Field protoField, JavaType javaType) { this.protoField = protoField; this.name = protoField.getName(); this.fieldNumber = protoField.getTag(); this.packed = ProtoUtils.isPacked(protoField); int wireType = packed && protoField.isRepeated() ? WireFormat.WIRETYPE_LENGTH_DELIMITED : FieldTypeUtils.convert(protoField.getType()).wireType; this.tag = WireFormat.makeTag(fieldNumber, wireType); this.tagSize = ProtobufOutputEx.computeRawVarint32Size(tag); this.javaType = javaType; this.primitive = javaType.isPrimitive(); }
@Override protected <T> SchemaEx<T> newMessageSchema(Message message, JavaType javaType) { if (ProtoUtils.isWrapProperty(message) && javaType.getRawClass() != PropertyWrapper.class) { Field protoField = message.getField(1); if (javaType.isJavaLangObject()) { javaType = protoField.isRepeated() && protoField.getType().isMessage() && !protoField.isMap() ? ProtoConst.LIST_TYPE : ProtoConst.MAP_TYPE; } javaType = TypeFactory.defaultInstance().constructParametricType(PropertyWrapper.class, javaType); } if (javaType.isJavaLangObject()) { javaType = ProtoConst.MAP_TYPE; } return new MessageReadSchema<>(protoMapper, message, javaType); }
protected <T> FieldSchema<T> createScalarField(Field protoField, PropertyDescriptor propertyDescriptor) { if (protoField.getType().isEnum()) { return EnumsReadSchemas.create(protoField, propertyDescriptor); switch ((ScalarFieldType) protoField.getType()) { case INT32: return Int32ReadSchemas.create(protoField, propertyDescriptor); return BytesReadSchemas.create(protoField, propertyDescriptor); default: throw new IllegalStateException("unknown proto field type: " + protoField.getType());
protected <T> FieldSchema<T> createScalarField(Field protoField, PropertyDescriptor propertyDescriptor) { if (protoField.getType().isEnum()) { return EnumWriteSchemas.create(protoField, propertyDescriptor); switch ((ScalarFieldType) protoField.getType()) { case INT32: return Int32WriteSchemas.create(protoField, propertyDescriptor); return BytesWriteSchemas.create(protoField, propertyDescriptor); default: throw new IllegalStateException("unknown proto field type: " + protoField.getType());
@Override protected <T> FieldSchema<T> createRepeatedSchema(Field protoField, PropertyDescriptor propertyDescriptor) { boolean packed = ProtoUtils.isPacked(protoField); if (protoField.getType().isEnum()) { return packed ? EnumPackedReadSchemas.create(protoField, propertyDescriptor) : EnumNotPackedReadSchemas.create(protoField, propertyDescriptor); if (protoField.getType().isScalar()) { switch ((ScalarFieldType) protoField.getType()) { case INT32: return packed ? Int32PackedReadSchemas.create(protoField, propertyDescriptor) : if (protoField.getType().isMessage()) { JavaType contentType = propertyDescriptor.getJavaType().getContentType(); if (contentType == null) { contentType = ProtoConst.OBJECT_TYPE; SchemaEx<Object> contentSchema = getOrCreateMessageSchema((Message) protoField.getType(), contentType); if (isWrapProperty((Message) protoField.getType())) { return PropertyWrapperRepeatedReadSchemas.create(protoField, propertyDescriptor, contentSchema);
@Override protected <T> FieldSchema<T> createRepeatedSchema(Field protoField, PropertyDescriptor propertyDescriptor) { boolean packed = ProtoUtils.isPacked(protoField); if (protoField.getType().isEnum()) { return packed ? EnumPackedWriteSchemas.create(protoField, propertyDescriptor) : EnumNotPackedWriteSchemas.create(protoField, propertyDescriptor); if (protoField.getType().isScalar()) { switch ((ScalarFieldType) protoField.getType()) { case INT32: return packed ? Int32PackedWriteSchemas.create(protoField, propertyDescriptor) : if (protoField.getType().isMessage()) { JavaType contentType = propertyDescriptor.getJavaType().getContentType(); if (contentType == null) { contentType = ProtoConst.OBJECT_TYPE; SchemaEx<Object> contentSchema = getOrCreateMessageSchema((Message) protoField.getType(), contentType); if (isWrapProperty((Message) protoField.getType())) { return PropertyWrapperRepeatedWriteSchemas.create(protoField, propertyDescriptor, contentSchema);
/** * Check if field type is numeric. */ public static boolean isNumericType(Field field) { FieldType type = field.getType(); boolean scalar = type instanceof ScalarFieldType; return scalar && !(BOOL.equals(type) || STRING.equals(type) || BYTES.equals(type)); }
/** * Check if field type is numeric. */ public static boolean isNumericType(Field field) { FieldType type = field.getType(); boolean scalar = type instanceof ScalarFieldType; return scalar && !(BOOL.equals(type) || STRING.equals(type) || BYTES.equals(type)); }