I created a Java program, which needs to be able to update fields in nested 
Messages.
The problem is that if I have a Message.Builder and within this builder I 
have a repeated Message, I cannot find a general method in the GPB 
libraries to change this into a Builder which is automatically part of the 
parent builder.

I solved this with the following code:

    private Message.Builder createRepeatedBuilder(Message.Builder builder, 
FieldDescriptor fieldDescriptor)
    {
        // Unfortunately I cannot find any general method to create a 
builder for a repeated message.
        // Therefore I use reflection myself by using the field name and 
convert it to add<name>Builder.
        // E.g. add MergeElementsBuilder
        String name = fieldDescriptor.getName();
        if (name.contains("_"))
        {
            name = name.substring(0, 1).toUpperCase() + name.substring(1);
        }
        while (name.contains("_"))
        {
            name = name.substring(0, name.indexOf("_")) +
                name.substring(name.indexOf("_") + 1, name.indexOf("_") + 
2).toUpperCase() +
                name.substring(name.indexOf("_") + 2);
        }
        name = "add" + name + "Builder";
        // propertiesBuilder = ((DataObjectMerge.Builder) 
mainBuilder).addMergeElementsBuilder(0);
        // Reflection
        try
        {
            if (parent == null)
            {
                Method method = mainBuilder.getClass().getMethod(name);
                return (Message.Builder) method.invoke(mainBuilder);
            }
            else
            {
                Method method = builder.getClass().getMethod(name);
                return (Message.Builder) method.invoke(builder);
            }
        }
        catch (IllegalAccessException e)
        {
            e.printStackTrace();
        }
        catch (IllegalArgumentException e)
        {
            e.printStackTrace();
        }
        catch (InvocationTargetException e)
        {
            e.printStackTrace();
        }
        catch (NoSuchMethodException | SecurityException e)
        {
            e.printStackTrace();
        }
        return null;
    }

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to