Class AbstractProperty

java.lang.Object
org.nuxeo.ecm.core.api.model.impl.AbstractProperty
All Implemented Interfaces:
Serializable, Cloneable, Iterable<Property>, Property
Direct Known Subclasses:
ComplexProperty, ListProperty, RemovedProperty, ScalarProperty

public abstract class AbstractProperty extends Object implements Property
See Also:
  • Field Details

    • NON_CANON_INDEX

      protected static final Pattern NON_CANON_INDEX
    • IS_READONLY

      public static final int IS_READONLY
      Whether or not this property is read only.
      See Also:
    • IS_SECURED

      public static final int IS_SECURED
      Whether or not this property is secured from edition.
      Since:
      11.1
      See Also:
    • IS_DEPRECATED

      public static final int IS_DEPRECATED
      Whether or not this property is deprecated.
      Since:
      11.1
      See Also:
    • parent

      public final Property parent
    • forceDirty

      public boolean forceDirty
      for SimpleDocumentModel uses
    • flags

      protected int flags
  • Constructor Details

    • AbstractProperty

      protected AbstractProperty(Property parent)
    • AbstractProperty

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

    • internalSetValue

      public abstract void internalSetValue(Serializable value) throws PropertyException
      Sets the given normalized value.

      This applies only for nodes that physically store a value (that means non container nodes). Container nodes does nothing.

      Throws:
      PropertyException
    • internalGetValue

      public abstract Serializable internalGetValue() throws PropertyException
      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
      Parameters:
      value - the normalized value to set
      Throws:
      PropertyException
    • removePhantomFlag

      public void removePhantomFlag()
    • setValue

      public void setValue(int index, Object value) throws PropertyException
      Description copied from interface: Property
      Sets a child property value given its index. This method is required only for List properties.

      If this method is not supported, an UnsupportedOperationException must be thrown.

      This method will mark the child value as dirty for existing values and in the case of map properties it will mark phantom properties as new properties.

      Specified by:
      setValue in interface Property
      value - the new value
      Throws:
      PropertyNotFoundException - if the child property is not found in the type definition
      PropertyException
    • size

      public int size()
      Description copied from interface: Property
      Get the count of the children properties. This includes phantom properties. So the returned size will be equal to the one returned by the property ComplexType.getFieldsCount().
      Specified by:
      size in interface Property
      Returns:
      the children properties count
    • iterator

      public Iterator<Property> iterator()
      Specified by:
      iterator in interface Iterable<Property>
    • remove

      public Serializable remove() throws PropertyException
      Description copied from interface: Property
      Removes this property from the tree.

      This method marks the property as dirty and sets its value to null.

      Specified by:
      remove in interface Property
      Returns:
      the old property value
      Throws:
      PropertyException
    • getParent

      public Property getParent()
      Description copied from interface: Property
      Gets the property parent.
      Specified by:
      getParent in interface Property
      Returns:
      the property parent for sub properties or null for top level properties
    • getXPath

      public String getXPath()
      Description copied from interface: Property
      Gets the xpath of this property.

      The xpath is of the form pref:foo/mylist/123/elem, of note:

      • there is no initial /
      • the schema prefix is only present if a prefix is configured for the base property's schema
      • list elements indexes start at 0
      • list elements aren't using the old syntax foo/bar[123]/baz but the new syntax foo/123/baz
      Specified by:
      getXPath in interface Property
      Returns:
      the xpath
    • getXPath

      protected void getXPath(StringBuilder sb)
    • collectPath

      protected Path collectPath(Path path)
    • getSchema

      public Schema getSchema()
      Description copied from interface: Property
      Gets the document schema defining the property tree from which the property belongs.
      Specified by:
      getSchema in interface Property
      Returns:
      the document schema owning the field corresponding to the property
    • isList

      public boolean isList()
      Description copied from interface: Property
      Tests whether this property is of a list type.
      Specified by:
      isList in interface Property
      Returns:
      true if the property is of list type, false otherwise
    • isComplex

      public boolean isComplex()
      Description copied from interface: Property
      Tests whether this property is of a map (complex) type.
      Specified by:
      isComplex in interface Property
      Returns:
      true if the property is of map type, false otherwise
    • isScalar

      public boolean isScalar()
      Description copied from interface: Property
      Tests whether this property is of a scalar type.
      Specified by:
      isScalar in interface Property
      Returns:
      true if the property is of a scalar type, false otherwise
    • isNew

      public boolean isNew()
      Description copied from interface: Property
      Tests if this property is new (just created but not yet stored).

      A property is new when added to a collection. This is the typical state for a new property added to a list

      Specified by:
      isNew in interface Property
      Returns:
      true if this property is new, false otherwise
    • isRemoved

      public boolean isRemoved()
      Description copied from interface: Property
      Tests if a property is flagged as removed. Removed properties are child property that were removed from their container.
      Specified by:
      isRemoved in interface Property
      Returns:
      if the property was removed, false otherwise
    • isMoved

      public boolean isMoved()
      Description copied from interface: Property
      Tests if a property value was moved to another index in the parent list if any.
      Specified by:
      isMoved in interface Property
      Returns:
      if the property was removed, false otherwise
    • isModified

      public boolean isModified()
      Description copied from interface: Property
      Tests if a property value was modified.
      Specified by:
      isModified in interface Property
      Returns:
      if the property was removed, false otherwise
    • isPhantom

      public boolean isPhantom()
      Description copied from interface: Property
      Tests if the property is a phantom. This means it doesn't exists yet in the storage and it is not a new property. This is a placeholder for a property that is defined by the schema but was not yet set.
      Specified by:
      isPhantom in interface Property
      Returns:
      true if a phantom false otherwise
    • isDirty

      public final boolean isDirty()
      Description copied from interface: Property
      Tests whether a property is dirty.

      This tests whether or not a dirty flag is set on the property.

      Specified by:
      isDirty in interface Property
      Returns:
      true if the property changed or is new
    • setDirtyFlags

      protected final void setDirtyFlags(int dirtyFlags)
    • appendDirtyFlags

      protected final void appendDirtyFlags(int dirtyFlags)
    • isReadOnly

      public boolean isReadOnly()
      Description copied from interface: Property
      Whether the property is read only.
      Specified by:
      isReadOnly in interface Property
      Returns:
      true if read only false otherwise
    • setReadOnly

      public void setReadOnly(boolean value)
      Description copied from interface: Property
      Sets the read only flag.
      Specified by:
      setReadOnly in interface Property
      Parameters:
      value - true to set this property read only false otherwise
    • areFlagsSet

      public final boolean areFlagsSet(long flags)
    • setFlags

      public final void setFlags(long flags)
    • clearFlags

      public final void clearFlags(long flags)
    • getDirtyFlags

      public int getDirtyFlags()
      Description copied from interface: Property
      Get the dirty flags that are set on this property.
      Specified by:
      getDirtyFlags in interface Property
      Returns:
      the dirty flags mask
    • 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
    • hasDefaultValue

      public boolean hasDefaultValue()
      Description copied from interface: Property
      Whether or not this property has a default value. For complex property, this method will lookup in its children.
      Specified by:
      hasDefaultValue in interface Property
      Returns:
      true if property has a default value
    • setIsModified

      public void setIsModified()
      This method is public because of DataModelImpl which use it.

      TODO after removing DataModelImpl make it protected.

    • setIsNew

      protected void setIsNew()
    • setIsRemoved

      protected void setIsRemoved()
    • setIsMoved

      protected void setIsMoved()
    • isDeprecated

      protected boolean isDeprecated()
    • getDeprecatedFallback

      protected Optional<Property> getDeprecatedFallback()
      Returns the Property fallback to use if the current property is deprecated.
      Returns:
      the fallback as Property if exist
    • isSecuredForContext

      protected boolean isSecuredForContext()
      Returns whether or not current user can edit this property.
      Since:
      11.1
    • isSecured

      public boolean isSecured()
      Returns true if this property is flagged as secured in system.
      Specified by:
      isSecured in interface Property
    • getValue

      public <T> T getValue(Class<T> type) throws PropertyException
      Description copied from interface: Property
      Gets the property value as the given type.

      The value is converted using the registered converter to the given type.

      If conversion is not supported a runtime exception will be triggered.

      Specified by:
      getValue in interface Property
      Returns:
      the property value, which may be null
      Throws:
      PropertyException
    • 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
      Parameters:
      value - the value to set
      Throws:
      InvalidPropertyValueException - if the given value type is not compatible with the expected value type
      PropertyException
    • setValueDeprecation

      protected void setValueDeprecation(Object value, boolean setFallback) throws PropertyException
      If this property is deprecated and has a fallback, set value to fallback.
      Throws:
      PropertyException
    • isSameValue

      protected boolean isSameValue(Serializable value1, Serializable value2)
    • setValue

      public void setValue(String path, Object value) throws PropertyException
      Description copied from interface: Property
      Sets the value of the property resolved using the given path.

      This method is a shortcut for: resolvePath(path).setValue(value).

      Specified by:
      setValue in interface Property
      Parameters:
      path - the property path
      value - the value
      Throws:
      PropertyException
    • getValue

      public <T> T getValue(Class<T> type, String path) throws PropertyException
      Description copied from interface: Property
      Gets the value of the property resolved using the given path.

      The value will be converted to the given type if possible, otherwise an exception will be thrown.

      This method is a shortcut for: resolvePath(path).getValue(type).

      Specified by:
      getValue in interface Property
      Type Parameters:
      T - The type of the value to return
      Parameters:
      type - the class of the value
      path - the java path of the property value
      Returns:
      the value
      Throws:
      PropertyException
    • getValue

      public Serializable getValue(String path) throws PropertyException
      Description copied from interface: Property
      Gets the value of the property resolved using the given path.

      This method is a shortcut for: resolvePath(path).getValue().

      Specified by:
      getValue in interface Property
      Parameters:
      path - the path to the property
      Returns:
      the property value
      Throws:
      PropertyException
    • getValue

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

      Normalized values are of the java type that correspond to the field type.

      Specified by:
      getValue in interface Property
      Returns:
      the property value, which may be null
      Throws:
      PropertyException
    • getValueDeprecation

      protected Serializable getValueDeprecation()
      Returns:
      the fallback value if this property is deprecated and has a fallback, otherwise return null
    • newDeprecatedMessage

      protected StringBuilder newDeprecatedMessage()
    • getDeprecatedParent

      protected AbstractProperty getDeprecatedParent()
      Returns:
      the higher deprecated parent.
    • 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
      Returns:
      the property value to use for write, which may be null
      Throws:
      PropertyException
    • getDefaultValue

      protected Serializable getDefaultValue()
    • moveTo

      public void moveTo(int index)
      Description copied from interface: Property
      Moves a property position into the parent container list.

      This method applies only for list item properties. The given index includes removed properties.

      Specified by:
      moveTo in interface Property
      Parameters:
      index - the position in the parent container to move this property
    • getRoot

      public DocumentPart getRoot()
      Description copied from interface: Property
      Gets the root property.
      Specified by:
      getRoot in interface Property
      Returns:
      the root property
    • resolvePath

      public Property resolvePath(String path) throws PropertyNotFoundException
      Description copied from interface: Property
      Same as Property.resolvePath(Path) but with a string path as argument. This is the same as calling resolvePath(new Path(path)).
      Specified by:
      resolvePath in interface Property
      Parameters:
      path - the string path to resolve.
      Returns:
      the resolved property
      Throws:
      PropertyNotFoundException - if the path cannot be resolved
    • resolvePath

      public Property resolvePath(Path path) throws PropertyNotFoundException
      Description copied from interface: Property
      Resolves the given path relative to the current property and return the property if any is found otherwise throws an exception.

      The path format is a subset of XPath. Thus, / is used as path element separator, [n] for list element indexes. Attribute separator '@' are not supported since all properties are assumed to be elements. Also you .. and . can be used as element names.

      Example of paths:

      • dc:title
      • attachments/item[2]/mimeType
      • ../dc:title
      Specified by:
      resolvePath in interface Property
      Parameters:
      path - the path to resolve.
      Returns:
      the resolved property
      Throws:
      PropertyNotFoundException - if the path cannot be resolved
    • computeRemovedProperty

      protected Property computeRemovedProperty(String name)
      Returns the RemovedProperty if it is a removed property or null otherwise.
      Since:
      9.2
    • 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
      Parameters:
      value - the value to normalize according to the property type
      Returns:
      the normalized value
      Throws:
      PropertyConversionException
    • 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
      Parameters:
      value - the value to check
      Returns:
      true if the value is normalized false otherwise
    • convertTo

      public <T> T convertTo(Serializable value, Class<T> toType) throws PropertyConversionException
      Description copied from interface: Property
      Converts the given normalized value to the given type.

      If the value has already the given type it will be returned back.

      Specified by:
      convertTo in interface Property
      Parameters:
      value - the normalized value to convert
      toType - the conversion type
      Returns:
      the converted value, which may be null
      Throws:
      PropertyConversionException - if the conversion cannot be made because of type incompatibilities
    • validateType

      public boolean validateType(Class<?> type)
      Description copied from interface: Property
      Validates the given value type.

      Tests if the given value type can be converted to a normalized type and thus a value of this type can be set to that property.

      Specified by:
      validateType in interface Property
      Parameters:
      type - the type to validate
      Returns:
      true if the type is valid, false otherwise
    • newInstance

      public Object newInstance()
      Description copied from interface: Property
      Creates a new and empty instance of a normalized value.

      Empty is used in the sense of a value that has not been initialized or can be considered as an empty value. For example for the String type the empty value will be the empty string ""

      Specified by:
      newInstance in interface Property
      Returns:
      the empty instance the empty instance, or null for some implementations
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • getObjectResolver

      public PropertyObjectResolver getObjectResolver()
      Specified by:
      getObjectResolver in interface Property
      Returns:
      A PropertyObjectResolver to manage this property reference to external entities, null if this property's type has no resolver.
    • isForceDirty

      public boolean isForceDirty()
      Description copied from interface: Property
      only for SimpleDocumentModel
      Specified by:
      isForceDirty in interface Property
    • setForceDirty

      public void setForceDirty(boolean forceDirty)
      Description copied from interface: Property
      only for SimpleDocumentModel
      Specified by:
      setForceDirty in interface Property