Class ComplexProperty

java.lang.Object
org.nuxeo.ecm.core.api.model.impl.AbstractProperty
org.nuxeo.ecm.core.api.model.impl.ComplexProperty
All Implemented Interfaces:
Serializable, Cloneable, Iterable<Property>, Map<String,Property>, Property
Direct Known Subclasses:
DocumentPartImpl, MapProperty

public abstract class ComplexProperty extends AbstractProperty implements Map<String,Property>
A scalar property that is linked to a schema field
Author:
Bogdan Stefanescu
See Also:
  • Field Details

  • Constructor Details

    • ComplexProperty

      protected ComplexProperty(Property parent)
    • ComplexProperty

      protected ComplexProperty(Property parent, int flags)
  • Method Details

    • internalGetChild

      protected Property internalGetChild(Field field)
      Gets the property given its name. If the property was not set, returns null.

      This method will always be called using a valid property name (a property specified by the schema). The returned property will be cached by its parent so the next time it is needed, it will be reused from the cache. That means this method servers as a initializer for properties - usually you create a new property and return it - you don't need to cache created properties.

      If you want to change the way a property is fetched / stored, you must override this method.

      Returns:
      the child. Cannot return null
    • getType

      public abstract ComplexType getType()
      Description copied from interface: Property
      Get the type of the field corresponding to this property.
      Specified by:
      getType in interface Property
      Returns:
      the property type
    • isNormalized

      public boolean isNormalized(Object value)
      Description copied from interface: Property
      Checks if the given value is a normalized one. This means the value has a type that is normalized.

      Null values are considered as normalized.

      Specified by:
      isNormalized in interface Property
      Overrides:
      isNormalized in class AbstractProperty
      Parameters:
      value - the value to check
      Returns:
      true if the value is normalized false otherwise
    • normalize

      public Serializable normalize(Object value) throws PropertyConversionException
      Description copied from interface: Property
      Normalizes the given value as dictated by the property type.

      Normalized values are the ones that are used for transportation over the net and that are given to the storage implementation to be stored in the repository

      Normalized values must be Serializable

      If the given value is already normalized it will be returned back.

      Specified by:
      normalize in interface Property
      Overrides:
      normalize in class AbstractProperty
      Parameters:
      value - the value to normalize according to the property type
      Returns:
      the normalized value
      Throws:
      PropertyConversionException
    • get

      public Property get(int index)
      Description copied from interface: Property
      Get the child property given it's index. This operation is mandatory for List properties.

      If this method is not supported an UnsupportedOperationException must be thrown

      Relative paths are not resolved. THis method is intended to lookup direct chilren. For path lookups, use Property.resolvePath(String) instead.

      Specified by:
      get in interface Property
      Returns:
      the child property if any null if no child property with that name is found or if the property is a scalar
    • getNonPhantomChild

      public final Property getNonPhantomChild(Field field)
    • getChild

      public final Property getChild(Field field)
    • getNonPhantomChildren

      public final Collection<Property> getNonPhantomChildren()
    • getChildren

      public Collection<Property> getChildren()
      Description copied from interface: Property
      Get a collection over the children properties. This includes all children including phantom ones (those who are not yet set by the user).

      The returned collection is ordered for list properties, and unordered for complex properties

      Be aware that this method is creating phantom child properties for all schema fields that are not yet set.

      Specified by:
      getChildren in interface Property
      Returns:
      the children properties
    • get

      public Property get(String name) throws PropertyNotFoundException
      Description copied from interface: Property
      Gets the child property having the given name.

      If the property is a scalar, this will return always null.

      The given name should be the full name (i.e. prefixed name if any prefix exists).

      If a non prefixed name is given, the first child property having the given local name will be returned.

      Relative paths are not resolved. THis method is intended to lookup direct children. For path lookups use Property.resolvePath(String) instead.

      Specified by:
      get in interface Property
      Parameters:
      name - the child property name (the full name including the prefix if any)
      Returns:
      the child property if any null if no child property with that name is found or if the property is a scalar
      Throws:
      PropertyNotFoundException - if the child property is not found in the type definition
    • set

      public void set(String name, Property property) throws PropertyNotFoundException
      Description copied from interface: Property
      Sets the child property having the given name.

      The given name should be the full name (i.e. prefixed name if any prefix exists).

      If a non prefixed name is given, the first child property having the given local name will be returned.

      Relative paths are not resolved. This method is intended to lookup direct children. For path lookups use Property.resolvePath(String) instead.

      Specified by:
      set in interface Property
      Parameters:
      name - the child property name (the full name including the prefix if any)
      property - the child property to set
      Throws:
      PropertyNotFoundException - if the child property is not found in the type definition
    • internalGetValue

      public Serializable internalGetValue() throws PropertyException
      Specified by:
      internalGetValue in class AbstractProperty
      Throws:
      PropertyException
    • getValueForWrite

      public Serializable getValueForWrite() throws PropertyException
      Description copied from interface: Property
      Gets the property normalized value for write.

      Can be different fropm Property.getValue() in cases where the property adapts the value it is given to store.

      Specified by:
      getValueForWrite in interface Property
      Overrides:
      getValueForWrite in class AbstractProperty
      Returns:
      the property value to use for write, which may be null
      Throws:
      PropertyException
    • init

      public void init(Serializable value) throws PropertyException
      Description copied from interface: Property
      Initializes the property with the given normalized value.

      The given value must be normalized - note that no check is done on that.

      The phantom flag is unset by this operation.

      This method should be used to initialize properties.

      Specified by:
      init in interface Property
      Overrides:
      init in class AbstractProperty
      Parameters:
      value - the normalized value to set
      Throws:
      PropertyException
    • getDefaultValue

      protected Serializable getDefaultValue()
      Overrides:
      getDefaultValue in class AbstractProperty
    • setValue

      public void setValue(Object value) throws PropertyException
      Description copied from interface: Property
      Sets this property value. The value will be first normalized and then set.

      For complex or list properties the value will be set recursively (as a map or list value).

      Specified by:
      setValue in interface Property
      Overrides:
      setValue in class AbstractProperty
      Parameters:
      value - the value to set
      Throws:
      InvalidPropertyValueException - if the given value type is not compatible with the expected value type
      PropertyException
    • addValue

      public Property addValue(Object value)
      Description copied from interface: Property
      Appends a new value to the list. A new property will be created to store the given value and appended to the children list.

      The created property will be marked as Property.isNew().

      Specified by:
      addValue in interface Property
      Returns:
      the added property
    • addValue

      public Property addValue(int index, Object value)
      Description copied from interface: Property
      Inserts at the given position a new value to the list. A new property will be created to store the given value and appended to the children list.

      The created property will be marked as Property.isNew().

      Specified by:
      addValue in interface Property
      Parameters:
      index - the position to insert the value
      Returns:
      the added property
    • addEmpty

      public Property addEmpty()
      Description copied from interface: Property
      Creates an empty child property and adds it as a property to the list container.

      This method is useful to construct lists.

      Specified by:
      addEmpty in interface Property
      Returns:
      the created property
    • visitChildren

      public void visitChildren(PropertyVisitor visitor, Object arg) throws PropertyException
      Throws:
      PropertyException
    • isSameAs

      public boolean isSameAs(Property property) throws PropertyException
      Should be used by container properties. Non container props must overwrite this.
      Specified by:
      isSameAs in interface Property
      Returns:
      true If the properties have a similar content, otherwise false
      Throws:
      PropertyException
    • getDirtyChildren

      public Iterator<Property> getDirtyChildren()
      Description copied from interface: Property
      Gets an iterator over the dirty children properties.
      Specified by:
      getDirtyChildren in interface Property
      Returns:
      the iterator
    • clear

      public void clear()
      Throws UnsupportedOperationException, added to implement Map<String, Property> interface.
      Specified by:
      clear in interface Map<String,Property>
    • containsKey

      public boolean containsKey(Object key)
      Throws UnsupportedOperationException, added to implement Map<String, Property> interface.
      Specified by:
      containsKey in interface Map<String,Property>
    • containsValue

      public boolean containsValue(Object value)
      Throws UnsupportedOperationException, added to implement Map<String, Property> interface.
      Specified by:
      containsValue in interface Map<String,Property>
    • entrySet

      public Set<Map.Entry<String,Property>> entrySet()
      Specified by:
      entrySet in interface Map<String,Property>
    • get

      public Property get(Object key)
      Specified by:
      get in interface Map<String,Property>
    • isEmpty

      public boolean isEmpty()
      Specified by:
      isEmpty in interface Map<String,Property>
    • keySet

      public Set<String> keySet()
      Specified by:
      keySet in interface Map<String,Property>
    • put

      public Property put(String key, Property value)
      Throws UnsupportedOperationException, added to implement Map<String, Property> interface.
      Specified by:
      put in interface Map<String,Property>
    • putAll

      public void putAll(Map<? extends String,? extends Property> t)
      Throws UnsupportedOperationException, added to implement Map<String, Property> interface.
      Specified by:
      putAll in interface Map<String,Property>
    • remove

      public Property remove(Object key)
      Throws UnsupportedOperationException, added to implement Map<String, Property> interface.
      Specified by:
      remove in interface Map<String,Property>
    • values

      public Collection<Property> values()
      Specified by:
      values in interface Map<String,Property>
    • clearDirtyFlags

      public void clearDirtyFlags()
      Description copied from interface: Property
      Notify the property that its changes was stored so it can safely remove dirty flags.

      Dirty flags are removed according to the type of the modifications. This way if the property was REMOVED it becomes a PHANTOM otherwise all dirty flags are cleared.

      This method should be used by storage implementors to notify the property it should reset its dirty flags. Note that clearing dirty flags is not propagated to the parent property or to children. You need to clear dirty flags explicitly for each property.

      Specified by:
      clearDirtyFlags in interface Property
      Overrides:
      clearDirtyFlags in class AbstractProperty