Class CollaborationBinder<BEAN>

  • Type Parameters:
    BEAN - the bean type
    All Implemented Interfaces:
    HasExpirationTimeout, java.io.Serializable

    public class CollaborationBinder<BEAN>
    extends com.vaadin.flow.data.binder.Binder<BEAN>
    implements HasExpirationTimeout
    Extension of Binder for creating collaborative forms with CollaborationEngine. In addition to Binder's data binding mechanism, CollaborationBinder synchronizes the field values between clients which are connected to the same topic via TopicConnection.
    Since:
    1.0
    Author:
    Vaadin Ltd
    See Also:
    Serialized Form
    • Nested Class Summary

      Nested Classes 
      Modifier and Type Class Description
      protected static class  CollaborationBinder.CollaborationBindingBuilderImpl<BEAN,​FIELDVALUE,​TARGET>  
      • Nested classes/interfaces inherited from class com.vaadin.flow.data.binder.Binder

        com.vaadin.flow.data.binder.Binder.Binding<BEAN extends java.lang.Object,​TARGET extends java.lang.Object>, com.vaadin.flow.data.binder.Binder.BindingBuilder<BEAN extends java.lang.Object,​TARGET extends java.lang.Object>, com.vaadin.flow.data.binder.Binder.BindingBuilderImpl<BEAN extends java.lang.Object,​FIELDVALUE extends java.lang.Object,​TARGET extends java.lang.Object>, com.vaadin.flow.data.binder.Binder.BindingImpl<BEAN extends java.lang.Object,​FIELDVALUE extends java.lang.Object,​TARGET extends java.lang.Object>
    • Constructor Summary

      Constructors 
      Constructor Description
      CollaborationBinder​(java.lang.Class<BEAN> beanType, UserInfo localUser)
      Creates a new collaboration binder.
    • Method Summary

      All Methods Instance Methods Concrete Methods Deprecated Methods 
      Modifier and Type Method Description
      <FIELDVALUE>
      com.vaadin.flow.data.binder.Binder.Binding<BEAN,​FIELDVALUE>
      bind​(com.vaadin.flow.component.HasValue<?,​FIELDVALUE> field, com.vaadin.flow.function.ValueProvider<BEAN,​FIELDVALUE> getter, com.vaadin.flow.data.binder.Setter<BEAN,​FIELDVALUE> setter)
      Deprecated.
      The method does not work with the collaboration binder.
      <FIELDVALUE>
      com.vaadin.flow.data.binder.Binder.Binding<BEAN,​FIELDVALUE>
      bind​(com.vaadin.flow.component.HasValue<?,​FIELDVALUE> field, java.lang.String propertyName)
      Binds the given field to the property with the given name, as described in Binder.bind(HasValue, String).
      void bindInstanceFields​(java.lang.Object objectWithMemberFields)
      Binds the member fields found in the given object, as described in Binder.bindInstanceFields(Object).
      protected com.vaadin.flow.data.binder.Binder.BindingBuilder<BEAN,​?> configureBinding​(com.vaadin.flow.data.binder.Binder.BindingBuilder<BEAN,​?> baseBinding, com.vaadin.flow.data.binder.PropertyDefinition<BEAN,​?> definition)  
      protected <FIELDVALUE,​TARGET>
      com.vaadin.flow.data.binder.Binder.BindingBuilder<BEAN,​TARGET>
      doCreateBinding​(com.vaadin.flow.component.HasValue<?,​FIELDVALUE> field, com.vaadin.flow.data.converter.Converter<FIELDVALUE,​TARGET> converter, com.vaadin.flow.data.binder.BindingValidationStatusHandler handler)  
      <FIELDVALUE>
      com.vaadin.flow.data.binder.Binder.BindingBuilder<BEAN,​FIELDVALUE>
      forField​(com.vaadin.flow.component.HasValue<?,​FIELDVALUE> field)
      <FIELDVALUE extends java.util.Collection<ELEMENT>,​ELEMENT>
      com.vaadin.flow.data.binder.Binder.BindingBuilder<BEAN,​FIELDVALUE>
      forField​(com.vaadin.flow.component.HasValue<?,​FIELDVALUE> field, java.lang.Class<? super FIELDVALUE> collectionType, java.lang.Class<ELEMENT> elementType)
      Creates a new binding for the given (multi select) field whose value type is a collection.
      <FIELDVALUE>
      com.vaadin.flow.data.binder.Binder.BindingBuilder<BEAN,​FIELDVALUE>
      forField​(com.vaadin.flow.component.HasValue<?,​FIELDVALUE> field, java.lang.Class<FIELDVALUE> fieldType)
      Creates a new binding for the given field and type.
      <FIELDVALUE>
      com.vaadin.flow.data.binder.Binder.BindingBuilder<BEAN,​FIELDVALUE>
      forMemberField​(com.vaadin.flow.component.HasValue<?,​FIELDVALUE> field)
      <FIELDVALUE extends java.util.Collection<ELEMENT>,​ELEMENT>
      com.vaadin.flow.data.binder.Binder.BindingBuilder<BEAN,​FIELDVALUE>
      forMemberField​(com.vaadin.flow.component.HasValue<?,​FIELDVALUE> field, java.lang.Class<? super FIELDVALUE> collectionType, java.lang.Class<ELEMENT> elementType)
      Creates a new binding for the given (multi select) field whose value type is a collection.
      <FIELDVALUE>
      com.vaadin.flow.data.binder.Binder.BindingBuilder<BEAN,​FIELDVALUE>
      forMemberField​(com.vaadin.flow.component.HasValue<?,​FIELDVALUE> field, java.lang.Class<FIELDVALUE> fieldType)
      Creates a new binding for the given field and type.
      BEAN getBean()
      Deprecated.
      This operation, along with setBean(Object), is not supported by the collaboration binder.
      java.util.Optional<java.time.Duration> getExpirationTimeout()
      Gets the optional expiration timeout of this binder.
      void readBean​(BEAN bean)
      Deprecated.
      This operation is not supported by the collaboration binder.
      protected void removeBindingInternal​(com.vaadin.flow.data.binder.Binder.Binding<BEAN,​?> binding)  
      void reset​(BEAN bean)
      Resets collaborative fields with values from the bound properties of the given bean.
      void setBean​(BEAN bean)
      Deprecated.
      This operation is not supported by the collaboration binder.
      void setExpirationTimeout​(java.time.Duration expirationTimeout)
      Sets the expiration timeout of this binder.
      <T> void setSerializer​(java.lang.Class<T> type, com.vaadin.flow.function.SerializableFunction<T,​java.lang.String> serializer, com.vaadin.flow.function.SerializableFunction<java.lang.String,​T> deserializer)
      Sets a custom serializer and deserializer to use for a specific value type.
      void setTopic​(java.lang.String topicId, com.vaadin.flow.function.SerializableSupplier<BEAN> initialBeanSupplier)
      Sets the topic to use with this binder and initializes the topic contents if not already set.
      • Methods inherited from class com.vaadin.flow.data.binder.Binder

        addListener, addStatusChangeListener, addValueChangeListener, bindReadOnly, bindReadOnly, clearError, createBinding, getBeanState, getBinding, getBindingExceptionHandler, getBindings, getConverterFactory, getFields, getStatusLabel, getValidationErrorHandler, getValidationStatusHandler, handleBinderValidationStatus, handleError, handleFieldValueChange, handleValidationStatus, hasChanges, isFieldsValidationStatusChangeListenerEnabled, isValid, isValidatorsDisabled, refreshFields, removeBean, removeBinding, removeBinding, removeBinding, restoreBeanState, setBindingExceptionHandler, setFieldsValidationStatusChangeListenerEnabled, setReadOnly, setStatusLabel, setValidationErrorHandler, setValidationStatusHandler, setValidatorsDisabled, validate, validate, withPropertySet, withValidator, withValidator, withValidator, writeBean, writeBeanAsDraft, writeBeanAsDraft, writeBeanIfValid
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Constructor Detail

      • CollaborationBinder

        public CollaborationBinder​(java.lang.Class<BEAN> beanType,
                                   UserInfo localUser)
        Creates a new collaboration binder. It uses reflection based on the provided bean type to resolve bean properties.

        The provided user information is used in the field editing indicators. The name of the user will be displayed to other users when editing a field, and the user's color index will be used to set the field's highlight color.

        Parameters:
        beanType - the bean type to use, not null
        localUser - the information of the local user, not null
        Since:
        1.0
    • Method Detail

      • configureBinding

        protected com.vaadin.flow.data.binder.Binder.BindingBuilder<BEAN,​?> configureBinding​(com.vaadin.flow.data.binder.Binder.BindingBuilder<BEAN,​?> baseBinding,
                                                                                                   com.vaadin.flow.data.binder.PropertyDefinition<BEAN,​?> definition)
        Overrides:
        configureBinding in class com.vaadin.flow.data.binder.Binder<BEAN>
      • removeBindingInternal

        protected void removeBindingInternal​(com.vaadin.flow.data.binder.Binder.Binding<BEAN,​?> binding)
        Overrides:
        removeBindingInternal in class com.vaadin.flow.data.binder.Binder<BEAN>
      • doCreateBinding

        protected <FIELDVALUE,​TARGET> com.vaadin.flow.data.binder.Binder.BindingBuilder<BEAN,​TARGET> doCreateBinding​(com.vaadin.flow.component.HasValue<?,​FIELDVALUE> field,
                                                                                                                                 com.vaadin.flow.data.converter.Converter<FIELDVALUE,​TARGET> converter,
                                                                                                                                 com.vaadin.flow.data.binder.BindingValidationStatusHandler handler)
        Overrides:
        doCreateBinding in class com.vaadin.flow.data.binder.Binder<BEAN>
      • bind

        @Deprecated
        public <FIELDVALUE> com.vaadin.flow.data.binder.Binder.Binding<BEAN,​FIELDVALUE> bind​(com.vaadin.flow.component.HasValue<?,​FIELDVALUE> field,
                                                                                                   com.vaadin.flow.function.ValueProvider<BEAN,​FIELDVALUE> getter,
                                                                                                   com.vaadin.flow.data.binder.Setter<BEAN,​FIELDVALUE> setter)
        Deprecated.
        The method does not work with the collaboration binder. Use bind(HasValue, String) instead.
        Not supported by the collaboration binder! It requires a property name for binding, so the other overload bind(HasValue, String) should be used instead.

        See Binder.bind(HasValue, ValueProvider, Setter) to learn how to use the method with the regular (non-collaboration) binder.

        Overrides:
        bind in class com.vaadin.flow.data.binder.Binder<BEAN>
        Type Parameters:
        FIELDVALUE - the value type of the field
        Parameters:
        field - the field to bind, not null
        getter - the function to get the value of the property to the field, not null
        setter - the function to write the field value to the property or null if read-only
        Returns:
        the newly created binding
        Throws:
        java.lang.UnsupportedOperationException - as the method is not supported by the collaboration binder
      • bind

        public <FIELDVALUE> com.vaadin.flow.data.binder.Binder.Binding<BEAN,​FIELDVALUE> bind​(com.vaadin.flow.component.HasValue<?,​FIELDVALUE> field,
                                                                                                   java.lang.String propertyName)
        Binds the given field to the property with the given name, as described in Binder.bind(HasValue, String).

        In addition, synchronizes the values with other collaboration binder instances which are connected to the same topic.

        Overrides:
        bind in class com.vaadin.flow.data.binder.Binder<BEAN>
        Type Parameters:
        FIELDVALUE - the value type of the field to bind
        Parameters:
        field - the field to bind, not null
        propertyName - the name of the property to bind, not null
        Returns:
        the newly created binding
        Throws:
        java.lang.IllegalArgumentException - if the property name is invalid
        java.lang.IllegalArgumentException - if the property has no accessible getter
      • bindInstanceFields

        public void bindInstanceFields​(java.lang.Object objectWithMemberFields)
        Binds the member fields found in the given object, as described in Binder.bindInstanceFields(Object).

        In addition, synchronizes the values with other collaboration binder instances which are connected to the same topic.

        Overrides:
        bindInstanceFields in class com.vaadin.flow.data.binder.Binder<BEAN>
        Parameters:
        objectWithMemberFields - the object that contains (Java) member fields to bind
        Throws:
        java.lang.IllegalStateException - if there are incompatible HasValue<T> and property types
      • readBean

        @Deprecated
        public void readBean​(BEAN bean)
        Deprecated.
        This operation is not supported by the collaboration binder. You can instead provide the bean for populating the fields using setTopic(java.lang.String, com.vaadin.flow.function.SerializableSupplier<BEAN>) to avoid overriding currently edited values. If you explicitly want to reset the field values for every user currently editing the fields, you can use reset(BEAN).
        Overrides:
        readBean in class com.vaadin.flow.data.binder.Binder<BEAN>
      • reset

        public void reset​(BEAN bean)
        Resets collaborative fields with values from the bound properties of the given bean. The values will be propagated to all collaborating users.
        Parameters:
        bean - the bean whose property values to read or null to clear bound fields
        Since:
        1.0
      • setTopic

        public void setTopic​(java.lang.String topicId,
                             com.vaadin.flow.function.SerializableSupplier<BEAN> initialBeanSupplier)
        Sets the topic to use with this binder and initializes the topic contents if not already set. Setting a topic removes the connection to the previous topic (if any) and resets all bindings based on values in the new topic. The bean supplier is used to provide initial values for bindings in case the topic doesn't yet contain any values.
        Parameters:
        topicId - the topic id to use, or null to not use any topic
        initialBeanSupplier - a supplier that is invoked to get a bean from which to read initial values. Only invoked if there are no property values in the topic, or if the topic id is null.
        Since:
        1.0
      • forField

        public <FIELDVALUE> com.vaadin.flow.data.binder.Binder.BindingBuilder<BEAN,​FIELDVALUE> forField​(com.vaadin.flow.component.HasValue<?,​FIELDVALUE> field)

        The field value will be sent over the network to synchronize the value with other users also editing the same field. The value type to use for deserializing the value is automatically determined based on the bean property type. The type must be defined separately using another overload of this method in case a converter is used or if the property type is parameterized.

        Overrides:
        forField in class com.vaadin.flow.data.binder.Binder<BEAN>
        See Also:
        forField(HasValue, Class), forField(HasValue, Class, Class)
      • forField

        public <FIELDVALUE> com.vaadin.flow.data.binder.Binder.BindingBuilder<BEAN,​FIELDVALUE> forField​(com.vaadin.flow.component.HasValue<?,​FIELDVALUE> field,
                                                                                                              java.lang.Class<FIELDVALUE> fieldType)
        Creates a new binding for the given field and type. The returned builder may be further configured before invoking Binder.BindingBuilder.bind(String) which completes the binding. Until Binding.bind is called, the binding has no effect.

        The field value will be sent over the network to synchronize the value with other users also editing the same field. This method allows explicitly defining the type to use. This is necessary when a converter is used since it's then not possible to derive the type from the bean property.

        Type Parameters:
        FIELDVALUE - the value type of the field
        Parameters:
        field - the field to be bound, not null
        fieldType - the type of the field value, not null
        Returns:
        the new binding builder
        See Also:
        forField(HasValue), forField(HasValue, Class, Class), setSerializer(Class, SerializableFunction, SerializableFunction)
      • forField

        public <FIELDVALUE extends java.util.Collection<ELEMENT>,​ELEMENT> com.vaadin.flow.data.binder.Binder.BindingBuilder<BEAN,​FIELDVALUE> forField​(com.vaadin.flow.component.HasValue<?,​FIELDVALUE> field,
                                                                                                                                                                  java.lang.Class<? super FIELDVALUE> collectionType,
                                                                                                                                                                  java.lang.Class<ELEMENT> elementType)
        Creates a new binding for the given (multi select) field whose value type is a collection. The returned builder may be further configured before invoking Binder.BindingBuilder.bind(String) which completes the binding. Until Binding.bind is called, the binding has no effect.

        The field value will be sent over the network to synchronize the value with other users also editing the same field. This method allows explicitly defining the collection type and element type to use.

        Type Parameters:
        FIELDVALUE - the base type of the collection, e.g. Set for CheckboxGroup<String>
        ELEMENT - the type of the elements in the collection, e.g. String for CheckboxGroup<String>
        Parameters:
        field - the field to be bound, not null
        collectionType - the base type of the collection, e.g. Set.class for CheckboxGroup<String>, not null
        elementType - the type of the elements in the collection, e.g. String.class for CheckboxGroup<String>, not null
        Returns:
        the new binding builder
        See Also:
        forField(HasValue), forField(HasValue, Class), setSerializer(Class, SerializableFunction, SerializableFunction)
      • forMemberField

        public <FIELDVALUE> com.vaadin.flow.data.binder.Binder.BindingBuilder<BEAN,​FIELDVALUE> forMemberField​(com.vaadin.flow.component.HasValue<?,​FIELDVALUE> field)

        The field value will be sent over the network to synchronize the value with other users also editing the same field. The value type to use for deserializing the value is automatically determined based on the bean property type. The type must be defined separately using another overload of this method in case a converter is used or if the property type is parameterized.

        Overrides:
        forMemberField in class com.vaadin.flow.data.binder.Binder<BEAN>
        See Also:
        forMemberField(HasValue, Class), forMemberField(HasValue, Class, Class)
      • forMemberField

        public <FIELDVALUE> com.vaadin.flow.data.binder.Binder.BindingBuilder<BEAN,​FIELDVALUE> forMemberField​(com.vaadin.flow.component.HasValue<?,​FIELDVALUE> field,
                                                                                                                    java.lang.Class<FIELDVALUE> fieldType)
        Creates a new binding for the given field and type. The returned builder may be further configured before invoking bindInstanceFields(Object). Unlike with the forField(HasValue) method, no explicit call to Binder.BindingBuilder.bind(String) is needed to complete this binding in the case that the name of the field matches a field name found in the bean.

        The field value will be sent over the network to synchronize the value with other users also editing the same field. This method allows explicitly defining the type to use. This is necessary when a converter is used since it's then not possible to derive the type from the bean property.

        Type Parameters:
        FIELDVALUE - the value type of the field
        Parameters:
        field - the field to be bound, not null
        fieldType -
        Returns:
        the new binding builder
        Since:
        1.0
        See Also:
        forMemberField(HasValue), forMemberField(HasValue, Class, Class), setSerializer(Class, SerializableFunction, SerializableFunction)
      • forMemberField

        public <FIELDVALUE extends java.util.Collection<ELEMENT>,​ELEMENT> com.vaadin.flow.data.binder.Binder.BindingBuilder<BEAN,​FIELDVALUE> forMemberField​(com.vaadin.flow.component.HasValue<?,​FIELDVALUE> field,
                                                                                                                                                                        java.lang.Class<? super FIELDVALUE> collectionType,
                                                                                                                                                                        java.lang.Class<ELEMENT> elementType)
        Creates a new binding for the given (multi select) field whose value type is a collection. The returned builder may be further configured before invoking bindInstanceFields(Object). Unlike with the forField(HasValue) method, no explicit call to Binder.BindingBuilder.bind(String) is needed to complete this binding in the case that the name of the field matches a field name found in the bean.

        The field value will be sent over the network to synchronize the value with other users also editing the same field. This method allows explicitly defining the collection type and element type to use.

        Type Parameters:
        FIELDVALUE - the base type of the collection, e.g. Set for CheckboxGroup<String>
        ELEMENT - the type of the elements in the collection, e.g. String for CheckboxGroup<String>
        Parameters:
        field - the field to be bound, not null
        collectionType - the base type of the collection, e.g. Set.class for CheckboxGroup<String>, not null
        elementType - the type of the elements in the collection, e.g. String.class for CheckboxGroup<String>, not null
        Returns:
        the new binding builder
        Since:
        1.0
        See Also:
        forMemberField(HasValue), forMemberField(HasValue, Class), setSerializer(Class, SerializableFunction, SerializableFunction)
      • setSerializer

        public <T> void setSerializer​(java.lang.Class<T> type,
                                      com.vaadin.flow.function.SerializableFunction<T,​java.lang.String> serializer,
                                      com.vaadin.flow.function.SerializableFunction<java.lang.String,​T> deserializer)
        Sets a custom serializer and deserializer to use for a specific value type. The serializer and deserializer will be used for all field bindings that implicitly or explicitly use that type either as the field type or as the collection element type in case of multi select fields. It is not allowed to reconfigure the serializer and deserializer for a previously configued type nor for any of the basic types that are supported without custom logic.

        Field values will be sent over the network to synchronize the value with other users also editing the same field. This method allows defining callbacks to convert between the field value and the value that is sent over the network. This is necessary when using complex objects that are not suitable to be sent as-is over the network.

        Type Parameters:
        T - the type handled by the serializer
        Parameters:
        type - the type for which to set a serializer and deserializer, not null
        serializer - a callback that receives a non-empty field value and returns the value to send over the network (not null). The callback cannot be null.
        deserializer - a callback that receives a value produced by the serializer callback (not null) and returns the field value to use. The callback cannot be null.
        Since:
        1.0
      • getExpirationTimeout

        public java.util.Optional<java.time.Duration> getExpirationTimeout()
        Gets the optional expiration timeout of this binder. An empty Optional is returned if no timeout is set, which means the binder is not cleared when there are no connected users to the related topic (this is the default).
        Specified by:
        getExpirationTimeout in interface HasExpirationTimeout
        Returns:
        the expiration timeout
        Since:
        3.1
      • setExpirationTimeout

        public void setExpirationTimeout​(java.time.Duration expirationTimeout)
        Sets the expiration timeout of this binder. If set, this binder data is cleared when expirationTimeout has passed after the last connection to the related topic is closed. If set to null, the timeout is cancelled.
        Specified by:
        setExpirationTimeout in interface HasExpirationTimeout
        Parameters:
        expirationTimeout - the expiration timeout
        Since:
        3.1