Class BeanPropertyMap

  • All Implemented Interfaces:
    java.io.Serializable, java.lang.Iterable<SettableBeanProperty>

    public class BeanPropertyMap
    extends java.lang.Object
    implements java.lang.Iterable<SettableBeanProperty>, java.io.Serializable
    Helper class used for storing mapping from property name to SettableBeanProperty instances.

    Note that this class is used instead of generic HashMap for bit of performance gain (and some memory savings): although default implementation is very good for generic use cases, it can be streamlined a bit for specific use case we have. Even relatively small improvements matter since this is directly on the critical path during deserialization, as it is done for each and every POJO property deserialized.

    See Also:
    Serialized Form
    • Field Detail

      • _caseInsensitive

        protected final boolean _caseInsensitive
        Since:
        2.5
      • _hashMask

        private int _hashMask
      • _size

        private int _size
        Number of entries stored in the hash area.
      • _spillCount

        private int _spillCount
      • _hashArea

        private java.lang.Object[] _hashArea
        Hash area that contains key/property pairs in adjacent elements.
      • _propsInOrder

        private final SettableBeanProperty[] _propsInOrder
        Array of properties in the exact order they were handed in. This is used by as-array serialization, deserialization.
      • _aliasDefs

        private final java.util.Map<java.lang.String,​java.util.List<PropertyName>> _aliasDefs
        Configuration of alias mappings, indexed by unmodified property name to unmodified aliases, if any; entries only included for properties that do have aliases. This is is used for constructing actual reverse lookup mapping, if needed, taking into account possible case-insensitivity, as well as possibility of name prefixes.
        Since:
        2.9
      • _aliasMapping

        private final java.util.Map<java.lang.String,​java.lang.String> _aliasMapping
        Mapping from secondary names (aliases) to primary names.
        Since:
        2.9
      • _locale

        private final java.util.Locale _locale
        We require Locale since case changes are locale-sensitive in certain cases (see Turkish I for example)
        Since:
        2.11
    • Constructor Detail

      • BeanPropertyMap

        public BeanPropertyMap​(boolean caseInsensitive,
                               java.util.Collection<SettableBeanProperty> props,
                               java.util.Map<java.lang.String,​java.util.List<PropertyName>> aliasDefs,
                               java.util.Locale locale)
        Since:
        2.11
      • BeanPropertyMap

        @Deprecated
        public BeanPropertyMap​(boolean caseInsensitive,
                               java.util.Collection<SettableBeanProperty> props,
                               java.util.Map<java.lang.String,​java.util.List<PropertyName>> aliasDefs)
        Deprecated.
        since 2.11
      • BeanPropertyMap

        @Deprecated
        public BeanPropertyMap​(boolean caseInsensitive,
                               java.util.Collection<SettableBeanProperty> props)
        Deprecated.
      • BeanPropertyMap

        protected BeanPropertyMap​(BeanPropertyMap base,
                                  boolean caseInsensitive)
        Since:
        2.8
    • Method Detail

      • withCaseInsensitivity

        public BeanPropertyMap withCaseInsensitivity​(boolean state)
        Mutant factory method that constructs a new instance if desired case-insensitivity state differs from the state of this instance; if states are the same, returns this.
        Since:
        2.8
      • findSize

        private static final int findSize​(int size)
      • construct

        @Deprecated
        public static BeanPropertyMap construct​(java.util.Collection<SettableBeanProperty> props,
                                                boolean caseInsensitive,
                                                java.util.Map<java.lang.String,​java.util.List<PropertyName>> aliasMapping)
        Deprecated.
        since 2.11
      • withProperty

        public BeanPropertyMap withProperty​(SettableBeanProperty newProp)
        Fluent copy method that creates a new instance that is a copy of this instance except for one additional property that is passed as the argument. Note that method does not modify this instance but constructs and returns a new one.
      • renameAll

        public BeanPropertyMap renameAll​(NameTransformer transformer)
        Mutant factory method for constructing a map where all entries use given prefix
      • withoutProperties

        public BeanPropertyMap withoutProperties​(java.util.Collection<java.lang.String> toExclude)
        Mutant factory method that will use this instance as the base, and construct an instance that is otherwise same except for excluding properties with specified names.
        Since:
        2.8
      • replace

        public void replace​(SettableBeanProperty origProp,
                            SettableBeanProperty newProp)
        Specialized method that can be used to replace an existing entry (note: entry MUST exist; otherwise exception is thrown) with specified replacement.
        Since:
        2.9.4
      • remove

        public void remove​(SettableBeanProperty propToRm)
        Specialized method for removing specified existing entry. NOTE: entry MUST exist, otherwise an exception is thrown.
      • size

        public int size()
      • isCaseInsensitive

        public boolean isCaseInsensitive()
        Since:
        2.9
      • hasAliases

        public boolean hasAliases()
        Since:
        2.9
      • iterator

        public java.util.Iterator<SettableBeanProperty> iterator()
        Accessor for traversing over all contained properties.
        Specified by:
        iterator in interface java.lang.Iterable<SettableBeanProperty>
      • getPropertiesInInsertionOrder

        public SettableBeanProperty[] getPropertiesInInsertionOrder()
        Method that will re-create initial insertion-ordering of properties contained in this map. Note that if properties have been removed, array may contain nulls; otherwise it should be consecutive.
        Since:
        2.1
      • _find2

        private final SettableBeanProperty _find2​(java.lang.String key,
                                                  int slot,
                                                  java.lang.Object match)
      • _find2ViaAlias

        private SettableBeanProperty _find2ViaAlias​(java.lang.String key,
                                                    int slot,
                                                    java.lang.Object match)
      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object
      • wrapAndThrow

        protected void wrapAndThrow​(java.lang.Throwable t,
                                    java.lang.Object bean,
                                    java.lang.String fieldName,
                                    DeserializationContext ctxt)
                             throws java.io.IOException
        Throws:
        java.io.IOException
      • _findIndexInHash

        private final int _findIndexInHash​(java.lang.String key)
        Helper method used to find exact location of a property with name given exactly, not subject to case changes, within hash area. Expectation is that such property SHOULD exist, although no exception is thrown.
        Since:
        2.7
      • _hashCode

        private final int _hashCode​(java.lang.String key)
      • _buildAliasMapping

        private java.util.Map<java.lang.String,​java.lang.String> _buildAliasMapping​(java.util.Map<java.lang.String,​java.util.List<PropertyName>> defs,
                                                                                          boolean caseInsensitive,
                                                                                          java.util.Locale loc)