Modifying existing content definitions

October 8, 2024
It is strongly advised to keep the backward compatibility of definitions when updating them. This is essential in a production environment, especially when using remote publication. The documentation provided below has to be used with caution, but should be a good help during the development phase of a project.

Modifications of definitions need to be made with caution.  If content exists for node type definitions, certain modifications can lead to integrity issues.

Backward compatibility of definitions is a huge aspect of Jackrabbit. It needs to be enforced by module developers.

If a definition modification breaks the backward compatibility rule, module deployment, content creation, site imports or publications might fail. This document explains what are the limitations and what can be done to do some changes.

Namespace, nodetype and property name

Add

Any operation that adds type of content is allowed:

  • Add new namespaces
  • Add new nodetypes
  • Add new mixin
  • Add new properties

For properties, as long as the property has no constraint, you can add it.

If a property is added with a default value, only new content will have this value.
Any other operation will not work without risk.

Rename

You cannot rename a namespace, nodetype or property name. Renaming is like deleting it and creating a new one.

A script can be used to do such change, it will copy the content with the new definition. Note that such script have to be executed when both, old and new, definition are available. As the content will be considered as new content, all the reference will have to be handle by the script.

Delete

When a content is created, it is linked to its definition. If the definition or one of its property is removed, you will not be able to get the content anymore. Once a part of the definition is missing, the content will not be editable, removable and, most of the time, readable.

Nevertheless you can delete a nodetype, or remove a property ensuring before that any content that has been created with them are deleted.
The best way to do it is to perform a query on the nodetype, removing each result, (property or node) on both workspaces. And before changing the definition, execute the query again to ensure that no content left or has been updated correctly. You can find more information on this here.
Also Versions of the deleted content have to be removed. For mixin, it can be complicated : if a version of a content contains a removed mixin, the content cannot be restored.
Notes :

  • for mixin with i18n properties you have to explicitly remove the properties on the node, because the values may remain on the translated node if you only removes the mixin from  the node.
  • If the property or the node definition you want to remove is defined as not indexed, it is not possible to get the content it defines by a query, meaning that you have to browse or know the path of the content to access them.

For such modifications, the best way to keep content integrity is to:

  • Set the property as hidden, taking care of
    • setting a default value if a constraint cannot be removed on a property.
    • Set indexed=no to the property or definition to not index the content.
  • export the content, change the definition, edit the export file to match the new definition and then reimport it.

Modifiers

You can edit / add / remove the following modifiers on a definition :

  • extends
  • itemType

You can change a nodetype to be orderable.

Editing properties

The same way it is not possible to edit properties directly, most of the time, some modification on the content will have to be done before deploying the new definitions.

One available option is also to move a property to a mixin / nodetype and change the original nodetype definition to extends / inherits from it.

For example the following definition

[jnt:test] > jnt:content
- prop (text)

Can be changed to:

[jmix:textMix] mixin
- prop (text)

[jnt:test] > jnt:content, jmix:textMix

Property type cast

Modification is not supported. Changing the nodetype will generate casting errors. You have to create a new property and use a script to copy the content from a property to the new one.

This can be done using the same mechanism as property renaming.

Property selector

Any modification is allowed.

Property options

  • I18n
  • Multiple

These modifications are not directly possible. A way to make it work is to create a new property and a script can populate it.

  • indexed=no
  • nofulltext

Indexation options can be changed, but a re indexation has to be done next.

Property constraints

You can add constraints to an existing property only if you ensure that all the existing content match this constraint. This can be done the same way as deleting content, a script that find the content (or browse the JCR tree) to check all properties before.

Note that if a default value is added to a property, only new content will get it, existing contents value will not be updated.

Child node definition

Modifying the required types of the child nodes is only possible when you add/change-to an existing supertype of the currently specified nodetype. If you already have child data created of that type, it is not currently possible to change it to an unrelated nodetype nor to a new nodetype, which has the current one as supertype.

Versions

As soon as a content is published, a version is created, meaning a reference to the definition. Once a modification is done on the definition, it is not possible to restore a content. 

Summary of modification of definitions and their consequences

For every scenario listed below, we present the operations that can be done on a node after a modification of its definition. For the operations that cannot be done, you will find either the exception raised or an explanation regarding the expected vs actual result.

"True" means the operation can be done

"False" means that an exception will be raised or the returned value is not the expected one.

=== remove property from nodetype ===

GET_NODE: true

EXPORT_NODE: true

COPY_NODE: true

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: false (javax.jcr.PathNotFoundException: test)

READ_MULTIPLE_PROPERTY_VALUE: false (javax.jcr.PathNotFoundException: test_multiple)

READ_I18N_PROPERTY_VALUE: false (javax.jcr.PathNotFoundException: test_i18n)

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

EDIT_PROPERTY: true

EDIT_CHANGED_PROPERTY: false (javax.jcr.nodetype.ConstraintViolationException: Couldn't find definition for property test)

REMOVE_PROPERTY: true

REMOVE_CHANGED_PROPERTY: false (javax.jcr.PathNotFoundException: test)

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

READ_CHANGED_RESTORED_PROPERTY_VALUE: false (javax.jcr.PathNotFoundException: test)

REMOVE_NODE: true

IMPORT_NODE: true

READ_IMPORTED_PROPERTY_VALUE: true

READ_CHANGED_IMPORTED_PROPERTY_VALUE: false (javax.jcr.PathNotFoundException: test)

 

=== remove nodetype from definition ===

GET_NODE: true

EXPORT_NODE: true

COPY_NODE: true

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: true

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: true

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

EDIT_PROPERTY: true

REMOVE_PROPERTY: true

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

REMOVE_NODE: true

IMPORT_NODE: true

READ_IMPORTED_PROPERTY_VALUE: true

 

=== switch a property from non-i18n to i18n ===

GET_NODE: true

EXPORT_NODE: true

COPY_NODE: true

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: false (javax.jcr.PathNotFoundException: test)

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: true

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

EDIT_PROPERTY: true

EDIT_CHANGED_PROPERTY: true

REMOVE_PROPERTY: true

REMOVE_CHANGED_PROPERTY: true

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

READ_CHANGED_RESTORED_PROPERTY_VALUE: false (javax.jcr.PathNotFoundException: test)

REMOVE_NODE: true

IMPORT_NODE: true

READ_IMPORTED_PROPERTY_VALUE: true

READ_CHANGED_IMPORTED_PROPERTY_VALUE: false (javax.jcr.PathNotFoundException: test)

 

=== switch a property from i18n to non-i18n ===

GET_NODE: true

EXPORT_NODE: true

COPY_NODE: true

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: true

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: false (javax.jcr.PathNotFoundException: test_i18n)

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

EDIT_PROPERTY: true

EDIT_CHANGED_PROPERTY: true

REMOVE_PROPERTY: true

REMOVE_CHANGED_PROPERTY: true

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

READ_CHANGED_RESTORED_PROPERTY_VALUE: false (javax.jcr.PathNotFoundException: test_i18n)

REMOVE_NODE: true

IMPORT_NODE: true

READ_IMPORTED_PROPERTY_VALUE: true

READ_CHANGED_IMPORTED_PROPERTY_VALUE: false (javax.jcr.PathNotFoundException: test_i18n)

 

=== switch a property from single to multiple ===

GET_NODE: true

EXPORT_NODE: true

COPY_NODE: true

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: true

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: true

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

EDIT_PROPERTY: true

EDIT_CHANGED_PROPERTY: false (javax.jcr.ValueFormatException: Single-valued property can not be set to an array of values:property /nodeTypeChanges[2]/test/test)

REMOVE_PROPERTY: true

REMOVE_CHANGED_PROPERTY: false (javax.jcr.nodetype.ConstraintViolationException: no matching property definition found for {}test)

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

READ_CHANGED_RESTORED_PROPERTY_VALUE: false (javax.jcr.nodetype.ConstraintViolationException: no matching property definition found for {}test)

REMOVE_NODE: true

IMPORT_NODE: true

READ_IMPORTED_PROPERTY_VALUE: true

READ_CHANGED_IMPORTED_PROPERTY_VALUE: false (javax.jcr.PathNotFoundException: test)

 

=== switch a property from multiple to single ===

GET_NODE: true

EXPORT_NODE: true

COPY_NODE: true

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: true

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: true

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

EDIT_PROPERTY: true

EDIT_CHANGED_PROPERTY: false (javax.jcr.ValueFormatException: Multivalued property can not be set to a single value (an array of length one is OK): property /nodeTypeChanges[17]/test/test_multiple)

REMOVE_PROPERTY: true

REMOVE_CHANGED_PROPERTY: false (javax.jcr.nodetype.ConstraintViolationException: no matching property definition found for {}test_multiple)

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

READ_CHANGED_RESTORED_PROPERTY_VALUE: false (javax.jcr.ValueFormatException: property /nodeTypeChanges[17]/test/test_multiple is a multi-valued property, so it's values can only be retrieved as an array)

REMOVE_NODE: true

IMPORT_NODE: true

READ_IMPORTED_PROPERTY_VALUE: true

READ_CHANGED_IMPORTED_PROPERTY_VALUE: false (javax.jcr.PathNotFoundException: test_multiple)

 

=== add new property definition with mandatory constraint ===

GET_NODE: true

EXPORT_NODE: true

COPY_NODE: true

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: true

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: true

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

EDIT_PROPERTY: false (org.jahia.services.content.CompositeConstraintViolationException: /nodeTypeChanges[22]/test newTestMandatory: Field is mandatory)

REMOVE_PROPERTY: false (org.jahia.services.content.CompositeConstraintViolationException: /nodeTypeChanges[22]/test newTestMandatory: Field is mandatory)

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

REMOVE_NODE: true

IMPORT_NODE: false (org.jahia.services.content.CompositeConstraintViolationException: /nodeTypesImported[22]/nodeTypeChanges/test newTestMandatory: Field is mandatory)

 

=== change allowed reference type ===

GET_NODE: true

EXPORT_NODE: true

COPY_NODE: true

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: true

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: true

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

EDIT_PROPERTY: true

EDIT_CHANGED_PROPERTY: true

REMOVE_PROPERTY: true

REMOVE_CHANGED_PROPERTY: true

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

READ_CHANGED_RESTORED_PROPERTY_VALUE: false

REMOVE_NODE: true

IMPORT_NODE: true

READ_IMPORTED_PROPERTY_VALUE: true

READ_CHANGED_IMPORTED_PROPERTY_VALUE: false (javax.jcr.PathNotFoundException: reference)

 

=== hide previous mandatory property ===

GET_NODE: true

EXPORT_NODE: true

COPY_NODE: true

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: true

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: true

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

EDIT_PROPERTY: true

EDIT_CHANGED_PROPERTY: true

REMOVE_PROPERTY: true

REMOVE_CHANGED_PROPERTY: true

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

READ_CHANGED_RESTORED_PROPERTY_VALUE: true

REMOVE_NODE: true

IMPORT_NODE: true

READ_IMPORTED_PROPERTY_VALUE: true

READ_CHANGED_IMPORTED_PROPERTY_VALUE: true

 

=== add new mixin with default valued property to existing nodetype ===

GET_NODE: true

GET_CHILD_NODES: true

EXPORT_NODE: true

COPY_NODE: true

CHECK_COPIED_CHILD_NODES: true

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: true

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: true

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

READ_CHILD_PROPERTIES: false (javax.jcr.PathNotFoundException: autocreatedProperty)

EDIT_PROPERTY: true

REMOVE_PROPERTY: true

ADD_CHILD_NODE: true

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

REMOVE_CHILD_NODE: true

REMOVE_NODE: true

IMPORT_NODE: true

READ_IMPORTED_PROPERTY_VALUE: true

READ_IMPORTED_CHILD_NODES: true

 

=== add range constraint to existing property definition ===

GET_NODE: true

EXPORT_NODE: true

COPY_NODE: true

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: true

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: true

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

EDIT_PROPERTY: true

EDIT_CHANGED_PROPERTY: true

REMOVE_PROPERTY: true

REMOVE_CHANGED_PROPERTY: true

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

READ_CHANGED_RESTORED_PROPERTY_VALUE: false

REMOVE_NODE: true

IMPORT_NODE: false (javax.jcr.nodetype.ConstraintViolationException: /nodeTypesImported[5]/nodeTypeChanges/test/integer: 10.0 does not satisfy the constraint '[100,500]')

 

=== move definitions to supertype ===

GET_NODE: true

EXPORT_NODE: true

COPY_NODE: true

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: true

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: true

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

EDIT_PROPERTY: true

EDIT_CHANGED_PROPERTY: true

REMOVE_PROPERTY: true

REMOVE_CHANGED_PROPERTY: true

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

READ_CHANGED_RESTORED_PROPERTY_VALUE: true

REMOVE_NODE: true

IMPORT_NODE: true

READ_IMPORTED_PROPERTY_VALUE: true

READ_CHANGED_IMPORTED_PROPERTY_VALUE: true

 

=== add new mixin to existing nodetype ===

GET_NODE: true

GET_CHILD_NODES: true

EXPORT_NODE: true

COPY_NODE: true

CHECK_COPIED_CHILD_NODES: true

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: true

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: true

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

READ_CHILD_PROPERTIES: true

EDIT_PROPERTY: true

REMOVE_PROPERTY: true

ADD_CHILD_NODE: true

CHECK_MIXIN: true

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

REMOVE_CHILD_NODE: true

REMOVE_NODE: true

IMPORT_NODE: true

READ_IMPORTED_PROPERTY_VALUE: true

READ_IMPORTED_CHILD_NODES: true

 

=== switch a property from double to decimal ===

GET_NODE: true

EXPORT_NODE: true

COPY_NODE: true

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: true

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: true

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

EDIT_PROPERTY: true

EDIT_CHANGED_PROPERTY: false (javax.jcr.nodetype.ConstraintViolationException: no matching property definition found for {}decimalNumber)

REMOVE_PROPERTY: true

REMOVE_CHANGED_PROPERTY: false (javax.jcr.nodetype.ConstraintViolationException: no matching property definition found for {}decimalNumber)

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

READ_CHANGED_RESTORED_PROPERTY_VALUE: false

REMOVE_NODE: true

IMPORT_NODE: true

READ_IMPORTED_PROPERTY_VALUE: true

READ_CHANGED_IMPORTED_PROPERTY_VALUE: false (javax.jcr.PathNotFoundException: decimalNumber)

 

=== switch a property from long to string ===

GET_NODE: true

EXPORT_NODE: true

COPY_NODE: true

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: true

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: true

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

EDIT_PROPERTY: true

EDIT_CHANGED_PROPERTY: false (javax.jcr.nodetype.ConstraintViolationException: no matching property definition found for {}integer)

REMOVE_PROPERTY: true

REMOVE_CHANGED_PROPERTY: false (javax.jcr.nodetype.ConstraintViolationException: no matching property definition found for {}integer)

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

READ_CHANGED_RESTORED_PROPERTY_VALUE: false

REMOVE_NODE: true

IMPORT_NODE: true

READ_IMPORTED_PROPERTY_VALUE: true

READ_CHANGED_IMPORTED_PROPERTY_VALUE: false (javax.jcr.PathNotFoundException: integer)

 

=== switch a property from string to long ===

GET_NODE: true

EXPORT_NODE: true

COPY_NODE: true

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: true

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: true

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

EDIT_PROPERTY: true

EDIT_CHANGED_PROPERTY: false (javax.jcr.nodetype.ConstraintViolationException: no matching property definition found for {}integerAsString)

REMOVE_PROPERTY: true

REMOVE_CHANGED_PROPERTY: false (javax.jcr.nodetype.ConstraintViolationException: no matching property definition found for {}integerAsString)

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

READ_CHANGED_RESTORED_PROPERTY_VALUE: false

REMOVE_NODE: true

IMPORT_NODE: true

READ_IMPORTED_PROPERTY_VALUE: true

READ_CHANGED_IMPORTED_PROPERTY_VALUE: false (javax.jcr.PathNotFoundException: integerAsString)

 

=== switch a property from long to decimal ===

GET_NODE: true

EXPORT_NODE: true

COPY_NODE: true

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: true

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: true

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

EDIT_PROPERTY: true

EDIT_CHANGED_PROPERTY: false (javax.jcr.nodetype.ConstraintViolationException: no matching property definition found for {}integer)

REMOVE_PROPERTY: true

REMOVE_CHANGED_PROPERTY: false (javax.jcr.nodetype.ConstraintViolationException: no matching property definition found for {}integer)

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

READ_CHANGED_RESTORED_PROPERTY_VALUE: false

REMOVE_NODE: true

IMPORT_NODE: true

READ_IMPORTED_PROPERTY_VALUE: true

READ_CHANGED_IMPORTED_PROPERTY_VALUE: false (javax.jcr.PathNotFoundException: integer)

 

=== make allowed child node type orderable ===

GET_NODE: true

GET_CHILD_NODES: true

EXPORT_NODE: true

COPY_NODE: true

CHECK_COPIED_CHILD_NODES: true

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: true

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: true

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

READ_CHILD_PROPERTIES: true

EDIT_PROPERTY: true

REMOVE_PROPERTY: true

ADD_CHILD_NODE: true

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

REMOVE_CHILD_NODE: true

REMOVE_NODE: true

IMPORT_NODE: true

READ_IMPORTED_PROPERTY_VALUE: true

READ_IMPORTED_CHILD_NODES: true

 

=== change allowed child node type ===

GET_NODE: true

GET_CHILD_NODES: true

EXPORT_NODE: true

COPY_NODE: true

CHECK_COPIED_CHILD_NODES: false (Copied child nodes are missing)

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: true

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: true

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

READ_CHILD_PROPERTIES: true

EDIT_PROPERTY: true

REMOVE_PROPERTY: true

ADD_CHILD_NODE: true

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

REMOVE_CHILD_NODE: true

REMOVE_NODE: true

IMPORT_NODE: true

READ_IMPORTED_PROPERTY_VALUE: true

READ_IMPORTED_CHILD_NODES: false (Unexpected number of imported child nodes: 0)

 

=== change allowed child node type using previous as supertype ===

GET_NODE: true

GET_CHILD_NODES: true

EXPORT_NODE: true

COPY_NODE: true

CHECK_COPIED_CHILD_NODES: false (Copied child nodes are missing)

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: true

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: true

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

READ_CHILD_PROPERTIES: true

EDIT_PROPERTY: true

REMOVE_PROPERTY: true

ADD_CHILD_NODE: true

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

REMOVE_CHILD_NODE: true

REMOVE_NODE: true

IMPORT_NODE: true

READ_IMPORTED_PROPERTY_VALUE: true

READ_IMPORTED_CHILD_NODES: false (Unexpected number of imported child nodes: 0)

 

=== change allowed child node type using supertype ===

GET_NODE: true

GET_CHILD_NODES: true

EXPORT_NODE: true

COPY_NODE: true

CHECK_COPIED_CHILD_NODES: true

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: true

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: true

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

READ_CHILD_PROPERTIES: true

EDIT_PROPERTY: true

REMOVE_PROPERTY: true

ADD_CHILD_NODE: true

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

REMOVE_CHILD_NODE: true

REMOVE_NODE: true

IMPORT_NODE: true

READ_IMPORTED_PROPERTY_VALUE: true

READ_IMPORTED_CHILD_NODES: true

 

=== remove allowed child node type ===

GET_NODE: true

GET_CHILD_NODES: true

EXPORT_NODE: true

COPY_NODE: true

CHECK_COPIED_CHILD_NODES: true

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: true

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: true

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

READ_CHILD_PROPERTIES: true

EDIT_PROPERTY: true

REMOVE_PROPERTY: true

ADD_CHILD_NODE: true

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

REMOVE_CHILD_NODE: true

REMOVE_NODE: true

IMPORT_NODE: true

READ_IMPORTED_PROPERTY_VALUE: true

READ_IMPORTED_CHILD_NODES: true

 

=== add allowed child node type ===

GET_NODE: true

GET_CHILD_NODES: true

EXPORT_NODE: true

COPY_NODE: true

CHECK_COPIED_CHILD_NODES: false (Copied child nodes are missing)

READ_STABLE_PROPERTY_VALUE: true

READ_STRING_PROPERTY_VALUE: true

READ_MULTIPLE_PROPERTY_VALUE: true

READ_I18N_PROPERTY_VALUE: true

READ_DECIMAL_PROPERTY_VALUE: true

READ_INTEGER_PROPERTY_VALUE: true

READ_REFERENCE_PROPERTY_VALUE: true

READ_CHILD_PROPERTIES: true

EDIT_PROPERTY: true

REMOVE_PROPERTY: true

ADD_CHILD_NODE: true

RESTORE_VERSION: true

READ_RESTORED_PROPERTY_VALUE: true

REMOVE_CHILD_NODE: true

REMOVE_NODE: true

IMPORT_NODE: true

READ_IMPORTED_PROPERTY_VALUE: true

READ_IMPORTED_CHILD_NODES: false (Unexpected number of imported child nodes: 0)