/* * ModeShape (http://www.modeshape.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.modeshape.jcr; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import javax.jcr.NamespaceRegistry; import javax.jcr.Node; import javax.jcr.PropertyType; import javax.jcr.RepositoryException; import javax.jcr.nodetype.NodeType; import javax.jcr.nodetype.NodeTypeManager; import javax.jcr.nodetype.PropertyDefinition; import org.junit.Test; import org.modeshape.common.FixFor; import org.modeshape.jcr.api.Namespaced; /** * Unit test for the node-types feature, which allows initial cnd files to be pre-configured in a repository * * @author Horia Chiorean (hchiorea@redhat.com) */ public class JcrNodeTypesTest extends SingleUseAbstractTest { @Test public void shouldRegisterCustomNodeTypeAtStartup() throws Exception { startRepositoryWithConfigurationFrom("config/repo-config-node-types.json"); validateNodesWithCustomTypes(); } @Test public void shouldRegisterValidNodeTypesOnly() throws Exception { startRepositoryWithConfigurationFrom("config/repo-config-invalid-node-types.json"); validateNodesWithCustomTypes(); } @Test @FixFor( "MODE-1687" ) public void shouldRegisterBothUsedAndUnusedNamespacesFromCNDFile() throws Exception { startRepositoryWithConfigurationFrom("config/repo-config-node-types.json"); NamespaceRegistry namespaceRegistry = session.getWorkspace().getNamespaceRegistry(); assertEquals("http://www.modeshape.org/examples/cars/1.0", namespaceRegistry.getURI("car")); assertEquals("http://www.modeshape.org/examples/aircraft/1.0", namespaceRegistry.getURI("air")); assertEquals("http://www.test1.com", namespaceRegistry.getURI("test1")); assertEquals("http://www.test2.com", namespaceRegistry.getURI("test2")); } @Test @FixFor( "MODE-1722" ) public void shouldRegisterNodeTypeWithUriPropertyType() throws Exception { startRepository(); registerNodeTypes("cnd/nodetype-with-uri-property.cnd"); NodeTypeManager ntmgr = session.getWorkspace().getNodeTypeManager(); NodeType nt = ntmgr.getNodeType("ex:myNodeType"); PropertyDefinition uriPropDefn = nt.getDeclaredPropertyDefinitions()[0]; assertLocalNameAndNamespace(nt, "myNodeType", "ex"); assertThat(uriPropDefn.getName(), is("ex:path")); assertThat(uriPropDefn.getRequiredType(), is(PropertyType.URI)); } @Test @FixFor( "MODE-1878" ) public void shouldRegisterNodeTypesWithSnsAndCreateChildren() throws Exception { startRepository(); registerNodeTypes("cnd/nodetypes-with-sns.cnd"); NodeTypeManager ntmgr = session.getWorkspace().getNodeTypeManager(); NodeType nt = ntmgr.getNodeType("inf:patient"); PropertyDefinition uriPropDefn = nt.getDeclaredPropertyDefinitions()[0]; assertThat(uriPropDefn.getName(), is("inf:masterId")); assertThat(uriPropDefn.getRequiredType(), is(PropertyType.STRING)); Node top = session.getRootNode().addNode("top"); Node patient = top.addNode("patient", "inf:patient"); patient.setProperty("inf:masterId", "id1"); patient.setProperty("inf:masterNs", "ns1"); Node section1 = patient.addNode("section", "inf:section"); section1.setProperty("inf:name", "sectionA"); assertThat(section1.getIndex(), is(1)); assertThat(section1.getPath(), is("/top/patient/section")); Node section2 = patient.addNode("section", "inf:section"); section2.setProperty("inf:name", "sectionA"); assertThat(section2.getIndex(), is(2)); assertThat(section2.getPath(), is("/top/patient/section[2]")); assertThat(section2.getDefinition().allowsSameNameSiblings(), is(true)); assertThat(section2.getDefinition().getName(), is("*")); session.save(); Node section3 = patient.addNode("section", "inf:section"); section3.setProperty("inf:name", "sectionA"); assertThat(section3.getIndex(), is(3)); assertThat(section3.getPath(), is("/top/patient/section[3]")); session.save(); Node section4 = patient.addNode("section", "inf:section"); section4.setProperty("inf:name", "sectionA"); assertThat(section4.getIndex(), is(4)); assertThat(section4.getPath(), is("/top/patient/section[4]")); Node section5 = patient.addNode("section", "inf:section"); section5.setProperty("inf:name", "sectionA"); assertThat(section5.getIndex(), is(5)); assertThat(section5.getPath(), is("/top/patient/section[5]")); section2.remove(); session.save(); } @Test @FixFor( "MODE-1878" ) public void shouldRegisterNodeTypesWithSnsAndCreateChildrenAlternative2() throws Exception { startRepository(); registerNodeTypes("cnd/nodetypes-with-sns.cnd"); NodeTypeManager ntmgr = session.getWorkspace().getNodeTypeManager(); NodeType nt = ntmgr.getNodeType("inf:patient"); PropertyDefinition uriPropDefn = nt.getDeclaredPropertyDefinitions()[0]; assertThat(uriPropDefn.getName(), is("inf:masterId")); assertThat(uriPropDefn.getRequiredType(), is(PropertyType.STRING)); Node top = session.getRootNode().addNode("top"); Node patient = top.addNode("patient", "inf:patient"); patient.setProperty("inf:masterId", "id1"); patient.setProperty("inf:masterNs", "ns1"); Node section1 = patient.addNode("section", "inf:section"); section1.setProperty("inf:name", "sectionA"); assertThat(section1.getIndex(), is(1)); assertThat(section1.getPath(), is("/top/patient/section")); session.save(); Node section2 = patient.addNode("section", "inf:section"); section2.setProperty("inf:name", "sectionA"); assertThat(section2.getIndex(), is(2)); assertThat(section2.getPath(), is("/top/patient/section[2]")); assertThat(section2.getDefinition().allowsSameNameSiblings(), is(true)); assertThat(section2.getDefinition().getName(), is("*")); session.save(); Node section3 = patient.addNode("section", "inf:section"); section3.setProperty("inf:name", "sectionA"); assertThat(section3.getIndex(), is(3)); assertThat(section3.getPath(), is("/top/patient/section[3]")); session.save(); Node section4 = patient.addNode("section", "inf:section"); section4.setProperty("inf:name", "sectionA"); assertThat(section4.getIndex(), is(4)); assertThat(section4.getPath(), is("/top/patient/section[4]")); Node section5 = patient.addNode("section", "inf:section"); section5.setProperty("inf:name", "sectionA"); assertThat(section5.getIndex(), is(5)); assertThat(section5.getPath(), is("/top/patient/section[5]")); section2.remove(); session.save(); } @Override protected boolean startRepositoryAutomatically() { return false; } private void validateNodesWithCustomTypes() throws RepositoryException { JcrRootNode rootNode = session.getRootNode(); rootNode.addNode("car", "car:Car"); rootNode.addNode("aircraft", "air:Aircraft"); session.save(); assertEquals("car:Car", session.getNode("/car").getPrimaryNodeType().getName()); assertEquals("air:Aircraft", session.getNode("/aircraft").getPrimaryNodeType().getName()); } private void assertLocalNameAndNamespace( NodeType nodeType, String expectedLocalName, String namespacePrefix ) throws RepositoryException { Namespaced nsed = (Namespaced)nodeType; assertThat(nsed.getLocalName(), is(expectedLocalName)); assertThat(nsed.getNamespaceURI(), is(session.getNamespaceURI(namespacePrefix))); } }