vaadin / flow-components

Java counterpart of Vaadin Web Components
82 stars 63 forks source link

Enable giving any Java object as an option to select columns. #1290

Open Peppe opened 5 years ago

Peppe commented 5 years ago

Today you can only give a list of Strings or an Enum to select columns. In many places, this is not enough. Let's say, you have a Users and Roles listed in your system. When modifying users, you can define the role they have in the system. It can't be an Enum because the roles are dynamic and you should be able to add and remove those. If you choose to go with Strings, then you have a lot of manual work ahead in front of you. You have to convert every Role object to a String, gather them up to a list and pass them to Grid Pro. Then, when the end user selects a role, you get the string back. At this point you have to go through your stored list of roles and find the one correct Role, so that you can set it to your User object. If there are two Roles with the same string representation, then you won't have a way to distinguish the two from each others.

A better way would be if you could give the Role objects in without any conversion. Vaadin Select component has good API for this.

Select<Locale> select = new Select<>();
select.setLabel("Select locale");
select.setTextRenderer(Locale::getDisplayLanguage);
select.setItems(locales);

In a similar way, I'd like to give them into Grid Pro

EditColumn<Role> column = grid.addEditColumn(Person::getEmail);
column.setHeader("Role");
column.setTextRenderer(Role::getName);
column.setItems(backend.getRoles())
Legioth commented 5 years ago

If there are two Roles with the same string representation, then you won't have a way to distinguish the two from each others.

Neither could the user who chooses rows from the dropdown, so I don't see how that would have any impact.

This means that we can basically use the same kind of approach that is currently used for enums, i.e. to directly use the displayed strings as the key that is sent over the wire, and then just throw an exception of the column is configured with combo of items and "renderer" that would lead to multiple entires with the same text.

johannesh2 commented 5 years ago

I don't think that this is about the ability to do something with the current API, but how cumbersome it feels to convert and compare Strings.

spikeon commented 5 years ago

As a customer, I would like to provide a couple of arguments in favor of this idea, as there seems to be some push-back in favor of using the strings.

The main issue at hand here is that the conversion to string leads to an unnecessary loss of data integrity that can be easily solved by using an object instead of a string, and then defining where the renderer gets it's string from.

  1. When the row in question is generated by user-submitted data, the developer loses control over what data is entered into the system; for example, If it were a list of users, there very well may be several users with the same exact first and last name combination, that correlate to very different entries. And while, yes, this instance does also mean that the developer should also make it so that the user can tell these two instances apart, it also shouldn't break anything when it's ran.
  2. Vaadin already has this functionality built into the ComboBox; there is existing code that, I'm assuming here, should be relatively easy to port over to the grid.
  3. Even HTML knows better than to just use the selection text in a select as the identifier, allowing you to have a different display text than the value. <option value="saab">Saab 95</option>. Even allowing us to use a map would be better than an array of strings, so we could pass the unique identifier of our object as well as it's display text.
Legioth commented 5 years ago

I think these are two different issues that can be addressed separately: 1) Provide a convenient high-level Java API for making a selection from an arbitrary list of item instances, regardless of how that API would deal with duplicates. This should be relatively straightforward and solve most but not all problems. 2) Provide a low-level mechanism that enables making a distinction between multiple items with the same string representation, regardless of how the high-level API is designed. This is a relatively complicated thing to implement and is only needed in a limited number of cases that would still be slightly confusing for the end user.

Let's not stall 1. just because 2. might require some further discussion about trade offs (i.e. what other feature to prioritize down instead).

Peppe commented 5 years ago

The duplicate -matter seems to have been taken as the main point in this discussion. It is a problem and burden, yes, but I don't see it as the main thing wrong here. I'm way more worried that:

1) we have a way already how to handle items in Vaadin. Select and ComboBox implements it. Grid Pro does not and invents a new way. Developers have to relearn to do the same thing in a new component.

2) A main paradigm of Vaadin is that you can use objects all the way. This gives a good developer experience and you can get a lot of done with a few rows of code. Now you have to write a lot of boiler to be able to achieve the same. It conflicts with the value prop of Vaadin.

Legioth commented 5 years ago

When it comes to API design, I strongly believe in the approach of making the common cases easy and all the other cases possible.

Grid Pro is currently making a small set of common cases easy, but it's not yet flexible enough to make all the other cases possible. By starting out in that way, we have been able to create an initial version with relatively little effort.

One particular limitation is that the dropdown functionality is designed for a limited number of hardcoded cases:

Enabling uses cases that need the feature set from ComboBox (or any other non-trivial field component) requires some serious thinking about the API design and probably also a non-trivial amount of code, even for reusing the current ComboBox implementation as-is.

I believe the best way of enabling such use cases would be to make it as easy as possible to directly embed existing components with their own API. This would enable doing things that we haven't even imagined, but any such case would probably require significantly more application code than what is enabled by the current limited API in Grid Pro.

Once we have an implementation that makes such things possible, we would be in a good position to continue pondering exactly which cases are so common that they would warrant a shorthand API in Grid Pro.

Legioth commented 5 years ago

Yesterday, I would have proposed adding a simple shorthand API on top of existing functionality as a really quick way of reaping most of the benefits. Something like this:

grid.addEditColumn(OrderLine::getProduct)
    .select(OrderLine::setProduct, service.getAllProducts(), Product::getName);

I've since then changed my mind. Support for a non-hardcoded list of options without a way of dealing with duplicate string representations would be a broken promise. It would lead developers into creating an application that works nicely in a development environment but then starts throwing quite nasty exceptions the moment someone inserts something into the production database that would lead to conflicting string representations. This could be "solved" with an API that forces the developer to take duplicates into account, similarly to the overloads of Collectors.toMap that accept a BinaryOperator that is invoked when there's a duplicate. I don't think such a solution would be satisfactory.

spikeon commented 5 years ago

Hey guys, I'm just checking in.

I just updated to 14.0.0.beta1

It looks like I'll be able to do most of the things I needed to do with grid pro! That's great work! This bug, however, is really holding back my project, and I need to get past it.

With the new .custom() field type and the ComponentRenderer<> additions, I can now achieve approximately 75% of the functionality needed to do this. We're so close.

                    ComboBox<DBObject> cb = new ComboBox<>();
                    try {
                        cb.setItems(getTable().getDefaultDBO().getForeignKeyTable((String) k).get().getDBOs());
                        cb.setItemLabelGenerator(DBObject::toString);
                    } catch (ForeignKeyNotFoundException e) {}

                    // Insert Row as dropdown of foreign keys
                    ComponentRenderer<Span,T> foreignKeyRenderer = new ComponentRenderer<>(item -> new Span(item.toString()));

                    column = grid
                            .addEditColumn(dbo -> dbo.getRow().get(k), foreignKeyRenderer)
                            .custom(cb, (dbo, newValue) -> {
                                dbo.getRow().put((String) k, newValue.getRow().get("id"));
                                dbo.rowChanged();
                                dbo.save();
                            });

I am able to create a combobox, fill it with all of the items, and add it to the grid pro. I am able to tell the updater which piece of the item should be used when updating the row. This is great progress.

I am missing one thing: The ability to tell the combobox which dbo should be displayed when it's passed an integer. Is this in there somewhere and I just don't know where to look?

spikeon commented 5 years ago

Sorry, I appear to have missed it, it's the .addEditColumn(dbo -> {}) that needs to return a dbo instead of an integer. My bad!

spikeon commented 5 years ago

Ok, there was some trial and error getting this to work.

I implemented it in the code and it appeared to work, before I compiled.

I then tried to run it and got a million errors about how it couldn't be serialized to json.

Here is my resulting code that finally worked, after a day of futzing around:

I was able to figure out how to do it, however, it took me an entire day to figure out that I had to make it so that I could convert my DBO classes to JreJsonObjects and how to do that. This should go into the documentation.

Here is the resulting code:

Defining the columns:

if (v instanceof Integer) {
    if (((String) k).endsWith("id")) {
        ComboBox<DBObject> cb = new ComboBox<>();
        ArrayList<DBObject> foreignKeyDBOs;
        try {
            foreignKeyDBOs = getTable().getDefaultDBO().getForeignKeyTable((String) k).get().getDBOs();
            cb.setItems(foreignKeyDBOs);
            cb.setItemLabelGenerator(DBObject::toString);
        } catch (ForeignKeyNotFoundException e) {}

        // Insert Row as dropdown of foreign keys
        // Insert row as password
        ComponentRenderer<Span,T> foreignKeyRenderer = new ComponentRenderer<>(item -> {
            String r = "None";
            try {
                DBObject o = getTable().getDefaultDBO().getForeignKeyTable((String) k).get(item.getRow().get(k)).getDBO();
                r = o.toString();
            } catch (DBONotFoundException | ForeignKeyNotFoundException e) {
            }
            return new Span(r);
        });

        column = grid
                .addEditColumn(dbo -> {
                    try {
                        return getTable()
                                .getDefaultDBO()
                                .getForeignKeyTable((String) k)
                                .get(dbo.getRow().get(k))
                                .getDBO();
                    } catch (DBONotFoundException | ForeignKeyNotFoundException e) {
                        return null;
                    }
                }, foreignKeyRenderer)
                .custom(cb, (dbo, newValue) -> {
                    dbo.getRow().put((String) k, newValue.getRow().get("id"));
                    dbo.rowChanged();
                    dbo.save();
                });

In my DBObject class:

public class DBObject implements Serializable, JsonSerializable {

and

@Override
public JsonObject toJson() {
    return row.getJson();
}

@Override
public JsonSerializable readJson(JsonObject value) {

    for(String k : value.keys()){
        row.put(k, value.get(k));
        ingest();
    }

    return this;
}

I had to create this method on my row:

public JsonDBO<resultType> getJson(){
    return new JsonDBO<>(this);
}

And then create this class:

package com.quintron.DBI2;

import com.google.gson.Gson;
import elemental.json.*;
import elemental.json.impl.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.util.List;

public class JsonDBO<DBO extends DBObject> extends JreJsonObject implements JsonObject {
    DBRow<DBO> row;
    public JsonDBO(DBRow<DBO> row){
        super(new JreJsonFactory());
        this.row = row;
    }

    @Override
    public JsonValue get(String key) {
        JsonValue v;
        Object o = row.get(key);
        if(o instanceof String){
            v = new JreJsonString((String) o);
        }
        else if(o instanceof Integer){
            v = new JreJsonNumber((Integer) o);
        }
        else if(o instanceof Double){
            v = new JreJsonNumber((Double) o);
        }
        else if(o instanceof Boolean){
            v = new JreJsonBoolean((Boolean) o);
        }
        else if(o instanceof JsonValue){
            v = (JsonValue) o;
        }
        else if(o == null){
            v = new JreJsonNull();
        }
        else {
             getLogger().error("Unhandled Type: " + o.getClass().getName());
             v = null;
        }
        return v;
    }

    @Override
    public JsonArray getArray(String key) {
        return (JsonArray) row.get(key);
    }

    @Override
    public boolean getBoolean(String key) {
        return (boolean) row.get(key);
    }

    @Override
    public double getNumber(String key) {
        return (double) row.get(key);
    }

    @Override
    public JsonObject getObject(String key) {
        return (JsonObject) row.get(key);
    }

    @Override
    public String getString(String key) {
        return (String) row.get(key);
    }

    @Override
    public String[] keys() {
        return row.keySet().toArray(new String[0]);
    }

    @Override
    public void put(String key, JsonValue value) {
        row.put(key, value);
    }

    @Override
    public void put(String key, String value) {
        row.put(key, value);
    }

    @Override
    public void put(String key, double value) {
        row.put(key, value);
    }

    @Override
    public void put(String key, boolean bool) {
        row.put(key, bool);
    }

    @Override
    public boolean hasKey(String key) {
        return row.containsKey(key);
    }

    @Override
    public void remove(String key) {
        row.remove(key);
    }

    @Override
    public boolean asBoolean() {
        return true;
    }

    @Override
    public double asNumber() {
        return getNumber("id");
    }

    @Override
    public String asString() {
        return hasKey("name") ? getString("name") : "";
    }

    @Override
    public JsonType getType() {
        return JsonType.OBJECT;
    }

    @Override
    public String toJson() {
        return (new Gson()).toJson(row);
    }

    @Override
    public boolean jsEquals(JsonValue value) {
        return asNumber() == value.asNumber();
    }

    @Override
    public Object toNative() {
        return row;
    }
    Logger logger;

    private Logger getLogger() {
        if (logger == null) logger = LogManager.getLogger(DBI2.class);
        return logger;
    }

}

But it finally works!

1 2 3
pekam commented 5 years ago

Hey @spikeon!

Sorry but I had trouble following your example, as it's quite complex. I don't really understand how the custom editor component doesn't solve your problems. If you are able to set and read the value with a normal ComboBox, it should work also as a custom editor.

For example, consider a Person class, with each person having a City bean as a property:

public class Person {
    private City city;
    public Person(City city) {
        this.city = city;
    }
    // getter & setter omitted
}
public class City {
    private String name;
    public City(String name) {
        this.name = name;
    }
    // getter & setter omitted
}

I created a GridPro which contains Persons and allows editing their City with a ComboBox:

// Options for city:
City london = new City("London");
City paris = new City("Paris");

// Create a ComboBox for selecting the city:
ComboBox<City> comboBox = new ComboBox<>();
comboBox.setItems(london, paris);
comboBox.setItemLabelGenerator(City::getName);

// Create a GridPro with persons whose city we can change:
GridPro<Person> grid = new GridPro<>();
grid.setItems(new Person(london), new Person(paris));

// Define what to render when not in edit-mode:
ComponentRenderer<Span, Person> renderer = new ComponentRenderer<>(
        person -> new Span(person.getCity().getName()));

// Configure the edit column to sync the value between the bean and the ComboBox:
grid.addEditColumn(Person::getCity, renderer).custom(comboBox,
        (person, city) -> {
            person.setCity(city);
            Notification.show(
                    "Updated city to: " + person.getCity().getName());
        });
add(grid);

This seems to work perfectly. I can edit the bean property with a ComboBox with the items rendered the way I've configured it. I'd consider everything outside the scope of this example to be application logic.

Do you think I'm missing some crucial aspect from this example?

spikeon commented 5 years ago

I took another look at this and I figured out the issue:

My objects use methods like: AdminPrivDBO::getAdminDBO to go and get another table's database object.

This appears to conflict with your system's JsonSerializer, which causes an infinite loop by attempting to traverse every get it finds recursively, finding objects that contain references to each other.

By defining my own serializer, I inadvertently solved this issue by not including these methods in the serialized version.

Here's the error that eventually gets thrown: `Caused by: java.lang.IllegalArgumentException: Could not serialize object of type class com.quintron.DBI2.objects.AdminDBO to JsonValue at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:97) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential (ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential (ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEachOrdered (ReferencePipeline.java:423) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:120) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:67) at com.vaadin.flow.internal.JsonSerializer.toJson (JsonSerializer.java:90) at com.vaadin.flow.component.grid.ColumnPathRenderer$SingleValueProviderRendering.lambda$getDataGenerator$26f92027$1 (ColumnPathRenderer.java:98) at com.vaadin.flow.data.provider.CompositeDataGenerator.lambda$generateData$0 (CompositeDataGenerator.java:47) at java.lang.Iterable.forEach (Iterable.java:75) at com.vaadin.flow.data.provider.CompositeDataGenerator.generateData (CompositeDataGenerator.java:47) at com.vaadin.flow.data.provider.CompositeDataGenerator.lambda$generateData$0 (CompositeDataGenerator.java:47) at java.lang.Iterable.forEach (Iterable.java:75) at com.vaadin.flow.data.provider.CompositeDataGenerator.generateData (CompositeDataGenerator.java:47) at com.vaadin.flow.data.provider.DataCommunicator.generateJson (DataCommunicator.java:656) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.stream.ReferencePipeline$3$1.accept (ReferencePipeline.java:193) at java.util.stream.IntPipeline$4$1.accept (IntPipeline.java:250) at java.util.stream.Streams$RangeIntSpliterator.forEachRemaining (Streams.java:110) at java.util.Spliterator$OfInt.forEachRemaining (Spliterator.java:693) at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto (AbstractPipeline.java:471) at java.util.stream.ReduceOps$ReduceOp.evaluateSequential (ReduceOps.java:708) at java.util.stream.AbstractPipeline.evaluate (AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.collect (ReferencePipeline.java:499) at com.vaadin.flow.data.provider.DataCommunicator.getJsonItems (DataCommunicator.java:613) at com.vaadin.flow.data.provider.DataCommunicator.collectChangesToSend (DataCommunicator.java:556) at com.vaadin.flow.data.provider.DataCommunicator.flush (DataCommunicator.java:473) at com.vaadin.flow.data.provider.DataCommunicator.lambda$requestFlush$2f364bb9$1 (DataCommunicator.java:421) at com.vaadin.flow.internal.StateTree.lambda$runExecutionsBeforeClientResponse$1 (StateTree.java:350) at java.util.ArrayList.forEach (ArrayList.java:1257) at com.vaadin.flow.internal.StateTree.runExecutionsBeforeClientResponse (StateTree.java:347) at com.vaadin.flow.server.communication.UidlWriter.encodeChanges (UidlWriter.java:392) at com.vaadin.flow.server.communication.UidlWriter.createUidl (UidlWriter.java:182) at com.vaadin.flow.server.BootstrapHandler.getInitialUidl (BootstrapHandler.java:1220) at com.vaadin.flow.server.BootstrapHandler.setupDocumentHead (BootstrapHandler.java:617) at com.vaadin.flow.server.BootstrapHandler.getBootstrapPage (BootstrapHandler.java:435) at com.vaadin.flow.server.BootstrapHandler.synchronizedHandleRequest (BootstrapHandler.java:417) at com.vaadin.flow.server.SynchronizedRequestHandler.handleRequest (SynchronizedRequestHandler.java:40) at com.vaadin.flow.server.VaadinService.handleRequest (VaadinService.java:1522) at com.vaadin.flow.server.VaadinServlet.service (VaadinServlet.java:246) at javax.servlet.http.HttpServlet.service (HttpServlet.java:790) at org.eclipse.jetty.servlet.ServletHolder.handle (ServletHolder.java:865) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter (ServletHandler.java:1655) at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter (WebSocketUpgradeFilter.java:215) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter (ServletHandler.java:1642) at org.eclipse.jetty.servlet.ServletHandler.doHandle (ServletHandler.java:533) at org.eclipse.jetty.server.handler.ScopedHandler.handle (ScopedHandler.java:146) at org.eclipse.jetty.security.SecurityHandler.handle (SecurityHandler.java:548) at org.eclipse.jetty.server.handler.HandlerWrapper.handle (HandlerWrapper.java:132) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle (ScopedHandler.java:257) at org.eclipse.jetty.server.session.SessionHandler.doHandle (SessionHandler.java:1595) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle (ScopedHandler.java:255) at org.eclipse.jetty.server.handler.ContextHandler.doHandle (ContextHandler.java:1317) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope (ScopedHandler.java:203) at org.eclipse.jetty.servlet.ServletHandler.doScope (ServletHandler.java:473) at org.eclipse.jetty.server.session.SessionHandler.doScope (SessionHandler.java:1564) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope (ScopedHandler.java:201) at org.eclipse.jetty.server.handler.ContextHandler.doScope (ContextHandler.java:1219) at org.eclipse.jetty.server.handler.ScopedHandler.handle (ScopedHandler.java:144) at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle (ContextHandlerCollection.java:219) at org.eclipse.jetty.server.handler.HandlerCollection.handle (HandlerCollection.java:126) at org.eclipse.jetty.server.handler.HandlerWrapper.handle (HandlerWrapper.java:132) at org.eclipse.jetty.server.Server.handle (Server.java:531) at org.eclipse.jetty.server.HttpChannel.handle (HttpChannel.java:352) at org.eclipse.jetty.server.HttpConnection.onFillable (HttpConnection.java:260) at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded (AbstractConnection.java:281) at org.eclipse.jetty.io.FillInterest.fillable (FillInterest.java:102) at org.eclipse.jetty.io.ChannelEndPoint$2.run (ChannelEndPoint.java:118) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob (QueuedThreadPool.java:762) at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run (QueuedThreadPool.java:680) at java.lang.Thread.run (Thread.java:748) `
spikeon commented 5 years ago

If we were to make your example function throw the same error mine does, give the city a method called .getPeople() that returns an array list of all of the Person objects that live in that city.

pekam commented 5 years ago

Ok, thanks. I got a stack overflow from JsonSerializer for adding a circular reference in my data. I don't see why fully serializing the objects would be required in the component implementation, and this full serialization should be probably avoided in the first place. I created a new issue for this vaadin/vaadin-grid-pro-flow#56, as the problem is not really related to this issue.

spikeon commented 5 years ago

I think that this is complete now, Thanks!