@SuppressWarnings("unchecked") @Test public void shouldAllowUnregisteringUnusedTypesWithMutualDependencies() throws Exception { ntTemplate.setName(TEST_TYPE_NAME); JcrNodeDefinitionTemplate childNode = new JcrNodeDefinitionTemplate(this.context); childNode.setDefaultPrimaryTypeName(TEST_TYPE_NAME2); ntTemplate.getNodeDefinitionTemplates().add(childNode); NodeTypeTemplate ntTemplate2 = new JcrNodeTypeTemplate(this.context); ntTemplate2.setName(TEST_TYPE_NAME2); JcrNodeDefinitionTemplate childNode2 = new JcrNodeDefinitionTemplate(this.context); childNode2.setDefaultPrimaryTypeName(TEST_TYPE_NAME); ntTemplate2.getNodeDefinitionTemplates().add(childNode2); try { repoTypeManager.registerNodeTypes( Arrays.asList(new NodeTypeDefinition[] {ntTemplate, ntTemplate2})); } catch (Exception ex) { fail(ex.getMessage()); } Name typeNameAsName = nameFactory.create(TEST_TYPE_NAME); Name type2NameAsName = nameFactory.create(TEST_TYPE_NAME2); int nodeTypeCount = nodeTypes().getAllNodeTypes().size(); repoTypeManager.unregisterNodeType( Arrays.asList(new Name[] {typeNameAsName, type2NameAsName}), true); assertThat(nodeTypes().getAllNodeTypes().size(), is(nodeTypeCount - 2)); assertThat(nodeTypes().getNodeType(typeNameAsName), is(nullValue())); assertThat(nodeTypes().getNodeType(type2NameAsName), is(nullValue())); }
@Test(expected = NodeTypeExistsException.class) public void shouldNotAllowRedefinitionOfNewTypeIfAllowUpdatesIsFalse() throws Exception { Name testTypeName = nameFactory.create(TEST_TYPE_NAME); ntTemplate.setName(TEST_TYPE_NAME); ntTemplate.setDeclaredSuperTypeNames(new String[] {"nt:base"}); JcrNodeType testNodeType = repoTypeManager.registerNodeType(ntTemplate); assertThat(testNodeType.getName(), is(TEST_TYPE_NAME)); JcrNodeType nodeTypeFromRepo = nodeTypes().getNodeType(testTypeName); assertThat(nodeTypeFromRepo, is(notNullValue())); assertThat(nodeTypeFromRepo.getName(), is(TEST_TYPE_NAME)); testNodeType = repoTypeManager.registerNodeType(ntTemplate); }
Schemata schemata() { if (schemata == null) { schemata = repositoryTypeManager.getRepositorySchemata().getSchemataForSession(session); assert schemata != null; } return schemata; }
RepositoryNodeTypeManager with( JcrRepository.RunningState repository, boolean includeColumnsForInheritedProperties, boolean includePseudoColumnsInSelectStar) { assert this.systemWorkspaceName.equals(repository.repositoryCache().getSystemWorkspaceName()); PathFactory pathFactory = repository.context().getValueFactories().getPathFactory(); Path nodeTypesPath = pathFactory.createAbsolutePath(JcrLexicon.SYSTEM, JcrLexicon.NODE_TYPES); assert this.nodeTypesPath.equals(nodeTypesPath); RepositoryNodeTypeManager result = new RepositoryNodeTypeManager( repository, includeColumnsForInheritedProperties, includePseudoColumnsInSelectStar); // Now copy the node types from this cache into the new manager's cache ... // (If we didn't do this, we'd have to refresh from the system storage) result.nodeTypesCache = result.nodeTypesCache.with(this.nodeTypesCache.getAllNodeTypes()); return result; }
@Test(expected = InvalidNodeTypeDefinitionException.class) public void shouldNotAllowOverridingPropertyIfTypeDoesNotNarrow() throws Exception { /* * testNode declares SV property testProperty of type BOOLEAN * testNodeB extends testNode with SV property testProperty of type DOUBLE -> ILLEGAL */ ntTemplate.setName(TEST_TYPE_NAME); ntTemplate.setDeclaredSuperTypeNames( new String[] { "nt:base", }); JcrPropertyDefinitionTemplate prop = new JcrPropertyDefinitionTemplate(this.context); prop.setName(TEST_PROPERTY_NAME); prop.setRequiredType(PropertyType.BOOLEAN); prop.setMultiple(false); ntTemplate.getPropertyDefinitionTemplates().add(prop); JcrNodeTypeTemplate nodeBTemplate = new JcrNodeTypeTemplate(this.context); nodeBTemplate.setName(TEST_TYPE_NAME + "B"); nodeBTemplate.setDeclaredSuperTypeNames(new String[] {TEST_TYPE_NAME}); prop = new JcrPropertyDefinitionTemplate(this.context); prop.setName(TEST_PROPERTY_NAME); prop.setRequiredType(PropertyType.DOUBLE); prop.setMultiple(false); nodeBTemplate.getPropertyDefinitionTemplates().add(prop); List<NodeTypeDefinition> templates = Arrays.asList(new NodeTypeDefinition[] {ntTemplate, nodeBTemplate}); compareTemplatesToNodeTypes(templates, repoTypeManager.registerNodeTypes(templates)); }
@Test public void shouldAllowTypeWithMultipleChildNodes() throws Exception { ntTemplate.setName(TEST_TYPE_NAME); ntTemplate.setDeclaredSuperTypeNames(new String[] {"nt:base", "mix:referenceable"}); JcrNodeDefinitionTemplate child = new JcrNodeDefinitionTemplate(this.context); child.setName(TEST_CHILD_NODE_NAME); child.setRequiredPrimaryTypeNames(new String[] {"nt:base"}); child.setSameNameSiblings(true); ntTemplate.getNodeDefinitionTemplates().add(child); child = new JcrNodeDefinitionTemplate(this.context); child.setName(TEST_CHILD_NODE_NAME); child.setRequiredPrimaryTypeNames(new String[] {"nt:unstructured"}); child.setSameNameSiblings(false); ntTemplate.getNodeDefinitionTemplates().add(child); child = new JcrNodeDefinitionTemplate(this.context); child.setName(TEST_CHILD_NODE_NAME + "2"); child.setRequiredPrimaryTypeNames(new String[] {"nt:base"}); child.setSameNameSiblings(true); ntTemplate.getNodeDefinitionTemplates().add(child); List<NodeTypeDefinition> templates = Arrays.asList(new NodeTypeDefinition[] {ntTemplate}); compareTemplatesToNodeTypes(templates, repoTypeManager.registerNodeTypes(templates)); }
@Test(expected = InvalidNodeTypeDefinitionException.class) public void shouldNotAllowOverridingChildNodeIfRequiredTypesDoNotNarrow() throws Exception { /* * testNode declares No-SNS childNode testChildNode requiring type nt:hierarchy * testNodeB extends testNode with No-SNS childNode testChildNode requiring type nt:base -> ILLEGAL */ ntTemplate.setName(TEST_TYPE_NAME); ntTemplate.setDeclaredSuperTypeNames( new String[] { "nt:base", }); JcrNodeDefinitionTemplate child = new JcrNodeDefinitionTemplate(this.context); child.setName(TEST_CHILD_NODE_NAME); child.setRequiredPrimaryTypeNames(new String[] {"nt:hierarchyNode"}); child.setSameNameSiblings(false); ntTemplate.getNodeDefinitionTemplates().add(child); JcrNodeTypeTemplate nodeBTemplate = new JcrNodeTypeTemplate(this.context); nodeBTemplate.setName(TEST_TYPE_NAME + "B"); nodeBTemplate.setDeclaredSuperTypeNames(new String[] {TEST_TYPE_NAME}); child = new JcrNodeDefinitionTemplate(this.context); child.setName(TEST_CHILD_NODE_NAME); child.setRequiredPrimaryTypeNames(new String[] {"nt:base"}); child.setSameNameSiblings(false); nodeBTemplate.getNodeDefinitionTemplates().add(child); List<NodeTypeDefinition> templates = Arrays.asList(new NodeTypeDefinition[] {ntTemplate, nodeBTemplate}); compareTemplatesToNodeTypes(templates, repoTypeManager.registerNodeTypes(templates)); }
@Test public void shouldAllowOverridingPropertyIfTypeNarrows() throws Exception { /* * testNode declares SV property testProperty of type UNDEFINED * testNodeB extends testNode with SV property testProperty of type STRING -> LEGAL */ ntTemplate.setName(TEST_TYPE_NAME); ntTemplate.setDeclaredSuperTypeNames( new String[] { "nt:base", }); JcrPropertyDefinitionTemplate prop = new JcrPropertyDefinitionTemplate(this.context); prop.setName(TEST_PROPERTY_NAME); prop.setRequiredType(PropertyType.UNDEFINED); prop.setMultiple(false); ntTemplate.getPropertyDefinitionTemplates().add(prop); JcrNodeTypeTemplate nodeBTemplate = new JcrNodeTypeTemplate(this.context); nodeBTemplate.setName(TEST_TYPE_NAME + "B"); nodeBTemplate.setDeclaredSuperTypeNames(new String[] {TEST_TYPE_NAME}); prop = new JcrPropertyDefinitionTemplate(this.context); prop.setName(TEST_PROPERTY_NAME); prop.setRequiredType(PropertyType.STRING); prop.setMultiple(false); nodeBTemplate.getPropertyDefinitionTemplates().add(prop); List<NodeTypeDefinition> templates = Arrays.asList(new NodeTypeDefinition[] {ntTemplate, nodeBTemplate}); compareTemplatesToNodeTypes(templates, repoTypeManager.registerNodeTypes(templates)); }
@Test(expected = InvalidNodeTypeDefinitionException.class) public void shouldNotAllowUnregisteringRequiredPrimaryType() throws Exception { repoTypeManager.unregisterNodeType( Arrays.asList( new Name[] { JcrNtLexicon.FROZEN_NODE, }), true); }
@Test(expected = InvalidNodeTypeDefinitionException.class) public void shouldNotAllowUnregisteringSupertype() throws Exception { repoTypeManager.unregisterNodeType( Arrays.asList( new Name[] { JcrNtLexicon.HIERARCHY_NODE, }), true); }
@Test public void shouldAllowUnregisteringUnusedType() throws Exception { ntTemplate.setName(TEST_TYPE_NAME); JcrNodeDefinitionTemplate childNode = new JcrNodeDefinitionTemplate(this.context); childNode.setDefaultPrimaryTypeName(JcrNtLexicon.FILE.getString(this.registry)); ntTemplate.getNodeDefinitionTemplates().add(childNode); try { repoTypeManager.registerNodeType(ntTemplate); } catch (Exception ex) { fail(ex.getMessage()); } Name typeNameAsName = nameFactory.create(TEST_TYPE_NAME); int nodeTypeCount = nodeTypes().getAllNodeTypes().size(); repoTypeManager.unregisterNodeType(Arrays.asList(new Name[] {typeNameAsName}), true); assertThat(nodeTypes().getAllNodeTypes().size(), is(nodeTypeCount - 1)); assertThat(nodeTypes().getNodeType(typeNameAsName), is(nullValue())); }
@Test(expected = InvalidNodeTypeDefinitionException.class) public void shouldNotAllowUnregisteringDefaultPrimaryType() throws Exception { ntTemplate.setName(TEST_TYPE_NAME); JcrNodeDefinitionTemplate childNode = new JcrNodeDefinitionTemplate(this.context); childNode.setDefaultPrimaryTypeName(JcrNtLexicon.FILE.getString(this.registry)); ntTemplate.getNodeDefinitionTemplates().add(childNode); try { repoTypeManager.registerNodeType(ntTemplate); } catch (Exception ex) { fail(ex.getMessage()); } repoTypeManager.unregisterNodeType( Arrays.asList( new Name[] { JcrNtLexicon.FILE, }), true); }
@Test(expected = InvalidNodeTypeDefinitionException.class) public void shouldNotAllowOverridingProtectedChildNode() throws Exception { ntTemplate.setName(TEST_TYPE_NAME); ntTemplate.setDeclaredSuperTypeNames(new String[] {"mode:root", "mix:referenceable"}); JcrNodeDefinitionTemplate child = new JcrNodeDefinitionTemplate(this.context); child.setName(JcrLexicon.SYSTEM.getString(registry)); child.setRequiredPrimaryTypeNames(new String[] {"nt:base"}); ntTemplate.getNodeDefinitionTemplates().add(child); List<NodeTypeDefinition> templates = Arrays.asList(new NodeTypeDefinition[] {ntTemplate}); compareTemplatesToNodeTypes(templates, repoTypeManager.registerNodeTypes(templates)); }
@Test public void shouldAllowDefinitionWithExistingSupertypes() throws Exception { Name testTypeName = nameFactory.create(TEST_TYPE_NAME); ntTemplate.setName(TEST_TYPE_NAME); ntTemplate.setDeclaredSuperTypeNames(new String[] {"nt:base", "mix:referenceable"}); JcrNodeType testNodeType = repoTypeManager.registerNodeType(ntTemplate); assertThat(testNodeType.getName(), is(TEST_TYPE_NAME)); JcrNodeType nodeTypeFromRepo = nodeTypes().getNodeType(testTypeName); assertThat(nodeTypeFromRepo, is(notNullValue())); assertThat(nodeTypeFromRepo.getName(), is(TEST_TYPE_NAME)); }
@Test public void shouldAllowDefinitionWithAProperty() throws Exception { ntTemplate.setName(TEST_TYPE_NAME); ntTemplate.setDeclaredSuperTypeNames(new String[] {"nt:base", "mix:referenceable"}); JcrPropertyDefinitionTemplate prop = new JcrPropertyDefinitionTemplate(this.context); prop.setRequiredType(PropertyType.LONG); ntTemplate.getPropertyDefinitionTemplates().add(prop); List<NodeTypeDefinition> templates = Arrays.asList(new NodeTypeDefinition[] {ntTemplate}); compareTemplatesToNodeTypes(templates, repoTypeManager.registerNodeTypes(templates)); }
@Test public void shouldAllowDefinitionWithSupertypesFromTypesRegisteredInSameCall() throws Exception { ntTemplate.setName(TEST_TYPE_NAME); ntTemplate.setDeclaredSuperTypeNames(new String[] {"nt:base", "mix:referenceable"}); JcrNodeTypeTemplate ntTemplate2 = new JcrNodeTypeTemplate(context); ntTemplate2.setName(TEST_TYPE_NAME2); ntTemplate2.setDeclaredSuperTypeNames(new String[] {TEST_TYPE_NAME}); List<NodeTypeDefinition> templates = Arrays.asList(new NodeTypeDefinition[] {ntTemplate, ntTemplate2}); compareTemplatesToNodeTypes(templates, repoTypeManager.registerNodeTypes(templates)); }
@Test(expected = InvalidNodeTypeDefinitionException.class) public void shouldNotAllowOverridingProtectedProperty() throws Exception { ntTemplate.setName(TEST_TYPE_NAME); ntTemplate.setDeclaredSuperTypeNames(new String[] {"nt:base", "mix:referenceable"}); JcrPropertyDefinitionTemplate prop = new JcrPropertyDefinitionTemplate(this.context); prop.setName(JcrLexicon.PRIMARY_TYPE.getString(registry)); prop.setRequiredType(PropertyType.NAME); ntTemplate.getPropertyDefinitionTemplates().add(prop); List<NodeTypeDefinition> templates = Arrays.asList(new NodeTypeDefinition[] {ntTemplate}); compareTemplatesToNodeTypes(templates, repoTypeManager.registerNodeTypes(templates)); }
@Test(expected = InvalidNodeTypeDefinitionException.class) public void shouldNotAllowAutocreatedResidualProperty() throws Exception { ntTemplate.setName(TEST_TYPE_NAME); ntTemplate.setDeclaredSuperTypeNames(new String[] {"nt:base", "mix:referenceable"}); JcrPropertyDefinitionTemplate prop = new JcrPropertyDefinitionTemplate(this.context); prop.setName(JcrNodeType.RESIDUAL_ITEM_NAME); prop.setRequiredType(PropertyType.UNDEFINED); prop.setAutoCreated(true); ntTemplate.getPropertyDefinitionTemplates().add(prop); List<NodeTypeDefinition> templates = Arrays.asList(new NodeTypeDefinition[] {ntTemplate}); compareTemplatesToNodeTypes(templates, repoTypeManager.registerNodeTypes(templates)); }
/** * Registers or updates the specified Collection of {@code NodeTypeDefinition} objects. This * method is used to register or update a set of node types with mutual dependencies. Returns an * iterator over the resulting {@code NodeType} objects. * * <p>The effect of the method is "all or nothing"; if an error occurs, no node types are * registered or updated. * * @param templates the new node types to register * @param allowUpdates this flag is not used * @return the {@code newly created node types} * @throws InvalidNodeTypeDefinitionException if a {@code NodeTypeDefinition} within the * collection is invalid * @throws NodeTypeExistsException if {@code allowUpdate} is false and a {@code * NodeTypeDefinition} within the collection specifies a node type name that already exists * @throws UnsupportedRepositoryOperationException if {@code allowUpdate} is true; ModeShape does * not allow updating node types at this time. * @throws AccessDeniedException if the current session does not have the {@link * ModeShapePermissions#REGISTER_TYPE register type permission}. * @throws RepositoryException if another error occurs */ public NodeTypeIterator registerNodeTypes( Collection<NodeTypeDefinition> templates, boolean allowUpdates) throws InvalidNodeTypeDefinitionException, NodeTypeExistsException, UnsupportedRepositoryOperationException, AccessDeniedException, RepositoryException { session.checkLive(); try { session.checkPermission((Path) null, ModeShapePermissions.REGISTER_TYPE); } catch (AccessControlException ace) { throw new AccessDeniedException(ace); } return new JcrNodeTypeIterator( repositoryTypeManager.registerNodeTypes(templates, !allowUpdates, false, true)); }
@Test(expected = InvalidNodeTypeDefinitionException.class) public void shouldNotAllowMandatoryResidualChildNode() throws Exception { ntTemplate.setName(TEST_TYPE_NAME); ntTemplate.setDeclaredSuperTypeNames(new String[] {"nt:base", "mix:referenceable"}); JcrNodeDefinitionTemplate child = new JcrNodeDefinitionTemplate(this.context); child.setName(JcrNodeType.RESIDUAL_ITEM_NAME); child.setRequiredPrimaryTypeNames(new String[] {"nt:base"}); child.setMandatory(true); ntTemplate.getNodeDefinitionTemplates().add(child); List<NodeTypeDefinition> templates = Arrays.asList(new NodeTypeDefinition[] {ntTemplate}); compareTemplatesToNodeTypes(templates, repoTypeManager.registerNodeTypes(templates)); }
@Test(expected = InvalidNodeTypeDefinitionException.class) public void shouldNotAllowAutocreatedChildNodeWithNoDefaultPrimaryType() throws Exception { ntTemplate.setName(TEST_TYPE_NAME); ntTemplate.setDeclaredSuperTypeNames(new String[] {"nt:base", "mix:referenceable"}); JcrNodeDefinitionTemplate child = new JcrNodeDefinitionTemplate(this.context); child.setName(TEST_CHILD_NODE_NAME); child.setRequiredPrimaryTypeNames(new String[] {"nt:base"}); child.setAutoCreated(true); ntTemplate.getNodeDefinitionTemplates().add(child); List<NodeTypeDefinition> templates = Arrays.asList(new NodeTypeDefinition[] {ntTemplate}); compareTemplatesToNodeTypes(templates, repoTypeManager.registerNodeTypes(templates)); }
@Test(expected = InvalidNodeTypeDefinitionException.class) public void shouldNotAllowDefinitionWithSupertypesFromTypesRegisteredInSameCallInWrongOrder() throws Exception { // Try to register the supertype AFTER the class that registers it ntTemplate.setName(TEST_TYPE_NAME); ntTemplate.setDeclaredSuperTypeNames(new String[] {"nt:base", "mix:referenceable"}); JcrNodeTypeTemplate ntTemplate2 = new JcrNodeTypeTemplate(context); ntTemplate2.setName(TEST_TYPE_NAME2); ntTemplate2.setDeclaredSuperTypeNames(new String[] {TEST_TYPE_NAME}); repoTypeManager.registerNodeTypes( Arrays.asList(new NodeTypeDefinition[] {ntTemplate2, ntTemplate})); }
@FixFor("MODE-826") @Test public void shouldAllowRegisteringNodeTypeWithOnlyResidualChildNodeDefinition() throws Exception { ntTemplate.setName(TEST_TYPE_NAME); // Create the residual child node definition ... JcrNodeDefinitionTemplate childNode = new JcrNodeDefinitionTemplate(this.context); childNode.setDefaultPrimaryTypeName(TEST_TYPE_NAME2); childNode.setName("*"); ntTemplate.getNodeDefinitionTemplates().add(childNode); // And register it ... repoTypeManager.registerNodeTypes(Arrays.asList(new NodeTypeDefinition[] {ntTemplate})); }
@Test(expected = InvalidNodeTypeDefinitionException.class) public void shouldNotAllowSingleValuedPropertyWithMultipleDefaults() throws Exception { ntTemplate.setName(TEST_TYPE_NAME); ntTemplate.setDeclaredSuperTypeNames(new String[] {"nt:base", "mix:referenceable"}); JcrPropertyDefinitionTemplate prop = new JcrPropertyDefinitionTemplate(this.context); prop.setName(TEST_PROPERTY_NAME); prop.setRequiredType(PropertyType.STRING); prop.setAutoCreated(true); prop.setDefaultValues(valuesFrom("<default>", "too many values")); ntTemplate.getPropertyDefinitionTemplates().add(prop); List<NodeTypeDefinition> templates = Arrays.asList(new NodeTypeDefinition[] {ntTemplate}); compareTemplatesToNodeTypes(templates, repoTypeManager.registerNodeTypes(templates)); }
@FixFor("MODE-826") @Test public void shouldAllowRegisteringNodeTypeWithPrimaryItemNameAndOnlyNonResidualChildNodeDefinition() throws Exception { ntTemplate.setName(TEST_TYPE_NAME); // Set the primary item name to be a name that DOES match the child node definition ... ntTemplate.setPrimaryItemName(TEST_CHILD_NODE_NAME); // Create the residual child node definition ... JcrNodeDefinitionTemplate childNode = new JcrNodeDefinitionTemplate(this.context); childNode.setDefaultPrimaryTypeName(TEST_TYPE_NAME2); childNode.setName(TEST_CHILD_NODE_NAME); ntTemplate.getNodeDefinitionTemplates().add(childNode); // And register it ... repoTypeManager.registerNodeTypes(Arrays.asList(new NodeTypeDefinition[] {ntTemplate})); }
@FixFor("MODE-826") @Test public void shouldAllowRegisteringNodeTypeWithPrimaryItemNameAndOnlyNonResidualPropertyNodeDefinition() throws Exception { ntTemplate.setName(TEST_TYPE_NAME); // Set the primary item name to be a name that DOES match the property definition ... ntTemplate.setPrimaryItemName(TEST_PROPERTY_NAME); // Create the residual property definition ... JcrPropertyDefinitionTemplate propertyDefn = new JcrPropertyDefinitionTemplate(this.context); propertyDefn.setRequiredType(PropertyType.STRING); propertyDefn.setName(TEST_PROPERTY_NAME); ntTemplate.getPropertyDefinitionTemplates().add(propertyDefn); // And register it ... repoTypeManager.registerNodeTypes(Arrays.asList(new NodeTypeDefinition[] {ntTemplate})); }
@Test(expected = InvalidNodeTypeDefinitionException.class) public void shouldNotAllowOverridingChildNodeFromDifferentAncestors() throws Exception { /* * testNode * testNodeB extends testNode and declares node testChildNode * testNodeC extends testNode and declares node testChildNode * testNodeD extends testNodeB and testNodeC and overrides testChildNode --> ILLEGAL */ ntTemplate.setName(TEST_TYPE_NAME); ntTemplate.setDeclaredSuperTypeNames( new String[] { "nt:base", }); JcrNodeTypeTemplate nodeBTemplate = new JcrNodeTypeTemplate(this.context); nodeBTemplate.setName(TEST_TYPE_NAME + "B"); nodeBTemplate.setDeclaredSuperTypeNames(new String[] {TEST_TYPE_NAME}); JcrNodeDefinitionTemplate child = new JcrNodeDefinitionTemplate(this.context); child.setName(JcrLexicon.SYSTEM.getString(registry)); child.setRequiredPrimaryTypeNames(new String[] {"nt:base"}); nodeBTemplate.getNodeDefinitionTemplates().add(child); JcrNodeTypeTemplate nodeCTemplate = new JcrNodeTypeTemplate(this.context); nodeCTemplate.setName(TEST_TYPE_NAME + "C"); nodeCTemplate.setDeclaredSuperTypeNames(new String[] {TEST_TYPE_NAME}); child = new JcrNodeDefinitionTemplate(this.context); child.setName(JcrLexicon.SYSTEM.getString(registry)); child.setRequiredPrimaryTypeNames(new String[] {"nt:base"}); nodeCTemplate.getNodeDefinitionTemplates().add(child); JcrNodeTypeTemplate nodeDTemplate = new JcrNodeTypeTemplate(this.context); nodeDTemplate.setName(TEST_TYPE_NAME + "D"); nodeDTemplate.setDeclaredSuperTypeNames( new String[] {nodeBTemplate.getName(), nodeCTemplate.getName()}); List<NodeTypeDefinition> templates = Arrays.asList( new NodeTypeDefinition[] {ntTemplate, nodeBTemplate, nodeCTemplate, nodeDTemplate}); compareTemplatesToNodeTypes(templates, repoTypeManager.registerNodeTypes(templates)); }
@Test(expected = InvalidNodeTypeDefinitionException.class) public void shouldNotAllowOverridingPropertyFromDifferentAncestors() throws Exception { /* * testNode * testNodeB extends testNode and declares prop testProperty * testNodeC extends testNode and declares prop testProperty * testNodeD extends testNodeB and testNodeC and overrides testProperty --> ILLEGAL */ ntTemplate.setName(TEST_TYPE_NAME); ntTemplate.setDeclaredSuperTypeNames( new String[] { "nt:base", }); JcrNodeTypeTemplate nodeBTemplate = new JcrNodeTypeTemplate(this.context); nodeBTemplate.setName(TEST_TYPE_NAME + "B"); nodeBTemplate.setDeclaredSuperTypeNames(new String[] {TEST_TYPE_NAME}); JcrPropertyDefinitionTemplate prop = new JcrPropertyDefinitionTemplate(this.context); prop.setName(TEST_PROPERTY_NAME); prop.setRequiredType(PropertyType.UNDEFINED); nodeBTemplate.getPropertyDefinitionTemplates().add(prop); JcrNodeTypeTemplate nodeCTemplate = new JcrNodeTypeTemplate(this.context); nodeCTemplate.setName(TEST_TYPE_NAME + "C"); nodeCTemplate.setDeclaredSuperTypeNames(new String[] {TEST_TYPE_NAME}); prop = new JcrPropertyDefinitionTemplate(this.context); prop.setName(TEST_PROPERTY_NAME); prop.setRequiredType(PropertyType.UNDEFINED); nodeCTemplate.getPropertyDefinitionTemplates().add(prop); JcrNodeTypeTemplate nodeDTemplate = new JcrNodeTypeTemplate(this.context); nodeDTemplate.setName(TEST_TYPE_NAME + "D"); nodeDTemplate.setDeclaredSuperTypeNames( new String[] {nodeBTemplate.getName(), nodeCTemplate.getName()}); List<NodeTypeDefinition> templates = Arrays.asList( new NodeTypeDefinition[] {ntTemplate, nodeBTemplate, nodeCTemplate, nodeDTemplate}); compareTemplatesToNodeTypes(templates, repoTypeManager.registerNodeTypes(templates)); }
/** * Allows the collection of node types to be unregistered if they are not referenced by other node * types as supertypes, default primary types of child nodes, or required primary types of child * nodes. * * @param nodeTypeNames the names of the node types to be unregistered * @throws NoSuchNodeTypeException if any of the node type names do not correspond to a registered * node type * @throws InvalidNodeTypeDefinitionException if any of the node types with the given names cannot * be unregistered because they are the supertype, one of the required primary types, or a * default primary type of a node type that is not being unregistered. * @throws AccessDeniedException if the current session does not have the {@link * ModeShapePermissions#REGISTER_TYPE register type permission}. * @throws RepositoryException if any other error occurs */ public void unregisterNodeTypes(Collection<String> nodeTypeNames) throws NoSuchNodeTypeException, InvalidNodeTypeDefinitionException, RepositoryException { NameFactory nameFactory = context().getValueFactories().getNameFactory(); try { session.checkPermission((Path) null, ModeShapePermissions.REGISTER_TYPE); } catch (AccessControlException ace) { throw new AccessDeniedException(ace); } Collection<Name> names = new ArrayList<Name>(nodeTypeNames.size()); for (String name : nodeTypeNames) { names.add(nameFactory.create(name)); } // Unregister the node types, but perform a check to see if any of the node types are currently // being used. // Unregistering a node type that is being used will likely cause the system to become unstable. boolean failIfNodeTypesAreUsed = true; repositoryTypeManager.unregisterNodeType(names, failIfNodeTypesAreUsed); }
@Test public void shouldAllowExtendingPropertyIfMultipleChanges() throws Exception { /* * testNode declares SV property testProperty * testNodeB extends testNode with MV property testProperty with incompatible type -> LEGAL * testNodeC extends testNode, testNodeB -> LEGAL */ ntTemplate.setName(TEST_TYPE_NAME); ntTemplate.setDeclaredSuperTypeNames( new String[] { "nt:base", }); JcrPropertyDefinitionTemplate prop = new JcrPropertyDefinitionTemplate(this.context); prop.setName(TEST_PROPERTY_NAME); prop.setRequiredType(PropertyType.DOUBLE); prop.setMultiple(false); ntTemplate.getPropertyDefinitionTemplates().add(prop); JcrNodeTypeTemplate nodeBTemplate = new JcrNodeTypeTemplate(this.context); nodeBTemplate.setName(TEST_TYPE_NAME + "B"); nodeBTemplate.setDeclaredSuperTypeNames(new String[] {TEST_TYPE_NAME}); prop = new JcrPropertyDefinitionTemplate(this.context); prop.setName(TEST_PROPERTY_NAME); prop.setRequiredType(PropertyType.BOOLEAN); prop.setMultiple(true); nodeBTemplate.getPropertyDefinitionTemplates().add(prop); JcrNodeTypeTemplate nodeCTemplate = new JcrNodeTypeTemplate(this.context); nodeCTemplate.setName(TEST_TYPE_NAME + "C"); nodeCTemplate.setDeclaredSuperTypeNames(new String[] {TEST_TYPE_NAME, nodeBTemplate.getName()}); List<NodeTypeDefinition> templates = Arrays.asList(new NodeTypeDefinition[] {ntTemplate, nodeBTemplate, nodeCTemplate}); compareTemplatesToNodeTypes(templates, repoTypeManager.registerNodeTypes(templates)); }