@Override public IRepeatedFieldValueBuilder<E> remove(final int index) { @SuppressWarnings("unchecked") final List<E> list = (List<E>) parent.getField(field); if ((list == null) || (index < 0) || (index >= list.size())) { throw new IndexOutOfBoundsException(); } final List<E> newList = new ArrayList<E>(list); newList.remove(index); parent.setField(field, newList); changedIndex = index; return this; }
@Override public IRepeatedFieldValueBuilder<E> add(final int index, final E element) { @SuppressWarnings("unchecked") final List<E> list = (List<E>) parent.getField(field); if (((list == null) && (index != 0)) || (index < 0) || ((list != null) && (index > list.size()))) { throw new IndexOutOfBoundsException(); } final List<E> newList = list == null ? new ArrayList<E>() : new ArrayList<E>(list); newList.add(index, element); parent.setField(field, newList); changedIndex = index; return this; }
/** * Helper method to get an {@link Map} from message builder for the map field. The map returned is * an immutable copy, to add entries to a map field use {@link * ConfigSource#putMapEntry(com.google.protobuf.Message.Builder, FieldDescriptor, Object, Object)} */ @SuppressWarnings("unchecked") private static ImmutableMap<Object, Object> getMapFromProtoMapBuilder( Message.Builder builder, FieldDescriptor field) { List<Message> entries = (List<Message>) builder.getField(field); ImmutableMap.Builder<Object, Object> mapBuilder = ImmutableMap.builder(); for (Message entry : entries) { Object key = entry.getField(entry.getDescriptorForType().findFieldByName("key")); Object value = entry.getField(entry.getDescriptorForType().findFieldByName("value")); mapBuilder.put(key, value); } return mapBuilder.build(); } }
/** * Constructs a sub-builder for given field and calls the action on it. After the action's * processing, the sub-message will be build and stored into the field of this builder. * Moreover, update locations of the sub-builder are integrated into this builder. */ public Builder withBuilder(FieldDescriptor field, BuildAction action) { // Construct a fresh builder for the given field and merge in the current value. As we depend // on message identity, we need to control this builder directly, so can't use implicit // building via getFieldBuilder. A builder created by getFieldBuilder as build() called // when the parent is called, resulting in a different message identity. Message currentValue = (Message) configBuilder.getField(field); Message.Builder protoBuilder = configBuilder.newBuilderForField(field); protoBuilder.mergeFrom(currentValue); // Construct config builder, and let the action process it. Builder fieldConfigBuilder = new Builder(currentValue, protoBuilder, locations); action.accept(fieldConfigBuilder); // Build config, which updates the location mapping, and update proto builder. ConfigSource fieldConfig = fieldConfigBuilder.build(); configBuilder.setField(field, fieldConfig.getConfig()); return this; }
/** * Constructs a sub-builder for given field and calls the action on it. After the action's * processing, the sub-message will be build and stored into the field of this builder. * Moreover, update locations of the sub-builder are integrated into this builder. */ public Builder withBuilder(FieldDescriptor field, BuildAction action) { // Construct a fresh builder for the given field and merge in the current value. As we depend // on message identity, we need to control this builder directly, so can't use implicit // building via getFieldBuilder. A builder created by getFieldBuilder as build() called // when the parent is called, resulting in a different message identity. Message currentValue = (Message) configBuilder.getField(field); Message.Builder protoBuilder = configBuilder.newBuilderForField(field); protoBuilder.mergeFrom(currentValue); // Construct config builder, and let the action process it. Builder fieldConfigBuilder = new Builder(currentValue, protoBuilder, locations); action.accept(fieldConfigBuilder); // Build config, which updates the location mapping, and update proto builder. ConfigSource fieldConfig = fieldConfigBuilder.build(); configBuilder.setField(field, fieldConfig.getConfig()); return this; }
@Override public Object getValue(final ELContext context, final Object base, final Object property) { if (context == null) { throw new NullPointerException(); } if ((property != null) && resolveType(base)) { context.setPropertyResolved(base, property); final Message.Builder builder = (Message.Builder) base; final FieldDescriptor field = getPropertyFieldDescriptor(builder, property); if (field.isRepeated()) { return getBuilderForRepeatedField(builder, field); } else { if (field.getJavaType() == JavaType.MESSAGE) { return builder.getFieldBuilder(field); } else { return builder.getField(field); } } } return null; }
/** * Helper method to get an {@link Map} from message builder for the map field. The map returned is * an immutable copy, to add entries to a map field use {@link * ConfigSource#putMapEntry(com.google.protobuf.Message.Builder, FieldDescriptor, Object, Object)} */ @SuppressWarnings("unchecked") private static ImmutableMap<Object, Object> getMapFromProtoMapBuilder( Message.Builder builder, FieldDescriptor field) { List<Message> entries = (List<Message>) builder.getField(field); ImmutableMap.Builder<Object, Object> mapBuilder = ImmutableMap.builder(); for (Message entry : entries) { Object key = entry.getField(entry.getDescriptorForType().findFieldByName("key")); Object value = entry.getField(entry.getDescriptorForType().findFieldByName("value")); mapBuilder.put(key, value); } return mapBuilder.build(); } }
@SuppressWarnings("unchecked") private static void putMapEntry( Message.Builder builder, FieldDescriptor field, Object key, Object value) { Message.Builder entryBuilder = builder.newBuilderForField(field); FieldDescriptor keyField = entryBuilder.getDescriptorForType().findFieldByName("key"); FieldDescriptor valueField = entryBuilder.getDescriptorForType().findFieldByName("value"); entryBuilder.setField(keyField, key); entryBuilder.setField(valueField, value); List<Message> entries = removeEntryWithKeyIfPresent((List<Message>) builder.getField(field), key); entries.add(entryBuilder.build()); builder.setField(field, entries); }
public Object getField(Descriptors.FieldDescriptor field) { return builder.getField(field); }
@Override public Object getField(Descriptors.FieldDescriptor field) { return builder.getField(field); }
@SuppressWarnings("unchecked") @Override public List<? extends E> getList() { return (List<? extends E>) parent.getField(field); }
@SuppressWarnings("unchecked") private static void putMapEntry( Message.Builder builder, FieldDescriptor field, Object key, Object value) { Message.Builder entryBuilder = builder.newBuilderForField(field); FieldDescriptor keyField = entryBuilder.getDescriptorForType().findFieldByName("key"); FieldDescriptor valueField = entryBuilder.getDescriptorForType().findFieldByName("value"); entryBuilder.setField(keyField, key); entryBuilder.setField(valueField, value); List<Message> entries = removeEntryWithKeyIfPresent((List<Message>) builder.getField(field), key); entries.add(entryBuilder.build()); builder.setField(field, entries); }
@Override public Object getField(Descriptors.FieldDescriptor field) { return builder.getField(field); }
/** helper method to handle {@code builder} and {@code extensions}. */ private static Message getOriginalMessage( Message.Builder builder, FieldSet<FieldDescriptor> extensions, FieldDescriptor field) { if (builder != null) { return (Message) builder.getField(field); } else { return (Message) extensions.getField(field); } }