Modifying existing content definitions
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)