/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.jackrabbit.jcr2spi.nodetype; import javax.jcr.Node; import javax.jcr.Property; import javax.jcr.RepositoryException; import javax.jcr.nodetype.ConstraintViolationException; import javax.jcr.nodetype.NodeDefinition; import javax.jcr.nodetype.NodeType; import javax.jcr.nodetype.PropertyDefinition; import org.apache.jackrabbit.test.AbstractJCRTest; import org.apache.jackrabbit.test.NotExecutableException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** <code>MandatoryItemTest</code>... */ public class MandatoryItemTest extends AbstractJCRTest { private static Logger log = LoggerFactory.getLogger(MandatoryItemTest.class); private NodeDefinition childNodeDef; private PropertyDefinition childPropDef; @Override protected void setUp() throws Exception { super.setUp(); NodeType nt = superuser.getWorkspace().getNodeTypeManager().getNodeType(testNodeType); NodeDefinition[] ndefs = nt.getChildNodeDefinitions(); for (int i = 0; i < ndefs.length; i++) { if (ndefs[i].isMandatory() && !ndefs[i].isProtected() && !ndefs[i].isAutoCreated()) { childNodeDef = ndefs[i]; break; } } PropertyDefinition[] pdefs = nt.getPropertyDefinitions(); for (int i = 0; i < pdefs.length; i++) { if (pdefs[i].isMandatory() && !pdefs[i].isProtected() && !pdefs[i].isAutoCreated()) { childPropDef = pdefs[i]; break; } } if (childPropDef == null && childNodeDef == null) { cleanUp(); throw new NotExecutableException(); } } public void testCreation() throws NotExecutableException, RepositoryException { Node n; try { n = testRootNode.addNode(nodeName1, testNodeType); } catch (RepositoryException e) { throw new NotExecutableException(); } try { testRootNode.save(); fail("Saving without having added the mandatory child items must fail."); } catch (ConstraintViolationException e) { // success } if (childNodeDef != null) { n.addNode(childNodeDef.getName(), childNodeDef.getDefaultPrimaryType().getName()); } if (childPropDef != null) { // TODO: check if definition defines default values n.setProperty(childPropDef.getName(), "any value"); } // now save must succeed. testRootNode.save(); } public void testRemoval() throws NotExecutableException, RepositoryException { Node n; Node childN = null; Property childP = null; try { n = testRootNode.addNode(nodeName1, testNodeType); if (childNodeDef != null) { childN = n.addNode(childNodeDef.getName(), childNodeDef.getDefaultPrimaryType().getName()); } if (childPropDef != null) { // TODO: check if definition defines default values childP = n.setProperty(childPropDef.getName(), "any value"); } testRootNode.save(); } catch (RepositoryException e) { throw new NotExecutableException(); } // remove the mandatory items ((must succeed)) if (childN != null) { childN.remove(); } if (childP != null) { childP.remove(); } // ... however, saving must not be allowed. try { testRootNode.save(); fail("removing mandatory child items without re-adding them must fail."); } catch (ConstraintViolationException e) { // success. } // re-add the mandatory items if (childNodeDef != null) { childN = n.addNode(childNodeDef.getName(), childNodeDef.getDefaultPrimaryType().getName()); } if (childPropDef != null) { // TODO: check if definition defines default values childP = n.setProperty(childPropDef.getName(), "any value"); } // save must succeed now. testRootNode.save(); } }