Hi Jorge That sounds like a bug to me... after all you will not be able to set multiple properties that have exactly the same PropertyDefinition and as far as I remember it should not even be possible to create multiple properties with the same name.
Can you create a bug for this in JIRA? As usual detailed steps to reproduce, test cases or even a patch are very much welcome. Kind regards Angela ________________________________ From: jorgeeflorez . <[email protected]> Sent: Wednesday, March 18, 2020 3:57 PM To: [email protected] <[email protected]> Subject: Multiple property definition for same property Hi all, using the following code, I am able to update an existing node type by inserting a new property: NodeTypeManager nodeTypeManager = session.getWorkspace().getNodeTypeManager(); NodeType repositoryType = nodeTypeManager.getNodeType("testType"); NodeTypeTemplate repositoryTypeTemplate = nodeTypeManager.createNodeTypeTemplate(repositoryType); PropertyDefinitionTemplate testProperty = nodeTypeManager.createPropertyDefinitionTemplate(); testProperty.setName("testProperty"); testProperty.setRequiredType(PropertyType.STRING); testProperty.setMandatory(false); testProperty.setMultiple(false); testProperty.setDefaultValues(new Value[0]); testProperty.setValueConstraints(new String[0]); repositoryTypeTemplate.getPropertyDefinitionTemplates().add(testProperty); nodeTypeManager.registerNodeType(repositoryTypeTemplate, true); session.save(); I prefer this way, instead using CND <https://jackrabbit.apache.org/jcr/node-type-notation.html> because I understand it better and is cleaner, compared to having everything inside a String (am I doing it correctly?). Because of a bug I was tracking, I found out that, if you invoke this code several times, it will insert a new property definition each time, so in the repository you could end up with this (I removed a lot of stuff to keep it small): { "node": "testType", "path": "/jcr:system/jcr:nodeTypes/testType", "children": [ { "node": "jcr:propertyDefinition", "path": "/jcr:system/jcr:nodeTypes/testType/jcr:propertyDefinition", "properties": [ *"jcr:name = testProperty"* ] }, { "node": "jcr:propertyDefinition[10]", "path": "/jcr:system/jcr:nodeTypes/testType/jcr:propertyDefinition[10]", "mixins": [], "children": [], "properties": [ *"jcr:name = testProperty"* ] }, { "node": "jcr:propertyDefinition[2]", "path": "/jcr:system/jcr:nodeTypes/testType/jcr:propertyDefinition[2]", "mixins": [], "children": [], "properties": [ *"jcr:name = testProperty"* ] }, { "node": "jcr:propertyDefinition[3]", "path": "/jcr:system/jcr:nodeTypes/testType/jcr:propertyDefinition[3]", "mixins": [], "children": [], "properties": [ *"jcr:name = testProperty"* ] }, { "node": "jcr:propertyDefinition[4]", "path": "/jcr:system/jcr:nodeTypes/testType/jcr:propertyDefinition[4]", "mixins": [], "children": [], "properties": [ *"jcr:name = testProperty"* ] }, { "node": "jcr:propertyDefinition[5]", "path": "/jcr:system/jcr:nodeTypes/testType/jcr:propertyDefinition[5]", "mixins": [], "children": [], "properties": [ *"jcr:name = testProperty"* ] }, { "node": "jcr:propertyDefinition[6]", "path": "/jcr:system/jcr:nodeTypes/testType/jcr:propertyDefinition[6]", "mixins": [], "children": [], "properties": [ *"jcr:name = testProperty"* ] }, { "node": "jcr:propertyDefinition[7]", "path": "/jcr:system/jcr:nodeTypes/testType/jcr:propertyDefinition[7]", "mixins": [], "children": [], "properties": [ *"jcr:name = testProperty"* ] }, { "node": "jcr:propertyDefinition[8]", "path": "/jcr:system/jcr:nodeTypes/testType/jcr:propertyDefinition[8]", "mixins": [], "children": [], "properties": [ *"jcr:name = testProperty"* ] }, { "node": "jcr:propertyDefinition[9]", "path": "/jcr:system/jcr:nodeTypes/testType/jcr:propertyDefinition[9]", "mixins": [], "children": [], "properties": [ *"jcr:name = testProperty"* ] }, { "node": "rep:namedPropertyDefinitions", "path": "/jcr:system/jcr:nodeTypes/testType/rep:namedPropertyDefinitions", "children": [ { "node": "jcr:created", "path": "/jcr:system/jcr:nodeTypes/testType/rep:namedPropertyDefinitions/jcr:created", }, { "node": "jcr:createdBy", "path": "/jcr:system/jcr:nodeTypes/testType/rep:namedPropertyDefinitions/jcr:createdBy", }, { "node": "rep:mixinTypes", "path": "/jcr:system/jcr:nodeTypes/testType/rep:namedPropertyDefinitions/rep:mixinTypes", }, { "node": "rep:primaryType", "path": "/jcr:system/jcr:nodeTypes/testType/rep:namedPropertyDefinitions/rep:primaryType", }, { "node": "testProperty", "path": "/jcr:system/jcr:nodeTypes/testType/rep:namedPropertyDefinitions/testProperty", "properties": [ *"jcr:name = testProperty"* ] }], "properties": ["jcr:primaryType = rep:PropertyDefinitions"] } ], "properties": ["jcr:primaryType = rep:NamedPropertyDefinitions"] }, { "node": "rep:residualChildNodeDefinitions", "path": "/jcr:system/jcr:nodeTypes/testType/rep:residualChildNodeDefinitions", "children": [{ "node": "nt:hierarchyNode", "path": "/jcr:system/jcr:nodeTypes/testType/rep:residualChildNodeDefinitions/nt:hierarchyNode", }], "properties": ["jcr:primaryType = rep:ChildNodeDefinitions"] } ], "properties": [ "jcr:nodeTypeName = testType", "rep:hasProtectedResidualChildNodes = false", "jcr:isAbstract = false", "jcr:hasOrderableChildNodes = false", "rep:supertypes = nt:folder,nt:hierarchyNode,nt:base,mix:created", "jcr:isMixin = false", "rep:hasProtectedResidualProperties = false", "rep:primarySubtypes = ", "jcr:isQueryable = true", "rep:mandatoryProperties = jcr:primaryType", "rep:protectedChildNodes = ", "jcr:supertypes = nt:folder", "rep:mandatoryChildNodes = ", "rep:protectedProperties = jcr:primaryType,jcr:mixinTypes,jcr:created,jcr:createdBy", "jcr:primaryType = rep:NodeType", "rep:namedSingleValuedProperties = testProperty,jcr:primaryType,jcr:created,jcr:createdBy" ] } I am not sure if I am doing something wrong, or whether there should be a validation when inserting property definitions having a name that already exists... Any comment is appreciated as always :) Jorge
