/* * 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.spi.commons.nodetype; import junit.framework.TestCase; import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.NameFactory; import org.apache.jackrabbit.spi.QNodeDefinition; import org.apache.jackrabbit.spi.QPropertyDefinition; import org.apache.jackrabbit.spi.commons.name.NameConstants; import org.apache.jackrabbit.spi.commons.name.NameFactoryImpl; import javax.jcr.PropertyType; public class NodeTypeDefDiffTest extends TestCase { private static final NameFactory FACTORY = NameFactoryImpl.getInstance(); private static final Name NODE_TYPE1 = FACTORY.create("{}nodeType1"); private static final Name PROP_NAME = FACTORY.create("{}prop"); private static final Name CHILD_NAME = FACTORY.create("{}child"); public void testChangedPropertyDefinition() throws Exception { // old node type definition QNodeTypeDefinitionBuilder oldDef = new QNodeTypeDefinitionBuilder(); oldDef.setName(NODE_TYPE1); oldDef.setSupertypes(new Name[] { NameConstants.NT_BASE }); QPropertyDefinitionBuilder oldPropDef = new QPropertyDefinitionBuilder(); oldPropDef.setDeclaringNodeType(NODE_TYPE1); oldPropDef.setName(PROP_NAME); oldPropDef.setRequiredType(PropertyType.STRING); oldPropDef.setMultiple(false); oldDef.setPropertyDefs(new QPropertyDefinition[]{oldPropDef.build()}); QNodeDefinitionBuilder oldChildDef = new QNodeDefinitionBuilder(); oldChildDef.setRequiredPrimaryTypes(new Name[]{ NODE_TYPE1, NameConstants.NT_FOLDER }); oldChildDef.setName(CHILD_NAME); oldChildDef.setDeclaringNodeType(oldDef.getName()); oldDef.setChildNodeDefs(new QNodeDefinition[] { oldChildDef.build() }); // new node type definition QNodeTypeDefinitionBuilder newDef = new QNodeTypeDefinitionBuilder(); newDef.setName(NODE_TYPE1); newDef.setSupertypes(new Name[] { NameConstants.NT_BASE }); QPropertyDefinitionBuilder newPropDef = new QPropertyDefinitionBuilder(); newPropDef.setDeclaringNodeType(NODE_TYPE1); newPropDef.setName(PROP_NAME); newPropDef.setRequiredType(PropertyType.UNDEFINED); newPropDef.setMultiple(true); newDef.setPropertyDefs(new QPropertyDefinition[]{newPropDef.build()}); QNodeDefinitionBuilder newChildDef = new QNodeDefinitionBuilder(); newChildDef.setRequiredPrimaryTypes(new Name[]{ NODE_TYPE1, NameConstants.NT_BASE }); newChildDef.setName(CHILD_NAME); newChildDef.setDeclaringNodeType(oldDef.getName()); newDef.setChildNodeDefs(new QNodeDefinition[] { newChildDef.build() }); // change a property def isMultiple from false to true and requiredType STRING to UNDEFINED // remove nt:folder from a node def's requiredPrimaryType constraint NodeTypeDefDiff nodeTypeDefDiff = NodeTypeDefDiff.create(oldDef.build(), newDef.build()); assertTrue(nodeTypeDefDiff.isTrivial()); // change a property def isMultiple from true to false and requiredType UNDEFINED to STRING // add nt:folder to a node def's requiredPrimaryType constraint nodeTypeDefDiff = NodeTypeDefDiff.create(newDef.build(), oldDef.build()); assertTrue(nodeTypeDefDiff.isMajor()); } /** * If we add a residual property definition of a different type, it should be recognized as * a new definition not as a change in definition */ public void testMultipleResidualPropertyDefinitions() throws Exception { // old node type definition QNodeTypeDefinitionBuilder oldDef = new QNodeTypeDefinitionBuilder(); oldDef.setName(NODE_TYPE1); oldDef.setSupertypes(new Name[] { NameConstants.NT_BASE }); QPropertyDefinitionBuilder oldPropDef = new QPropertyDefinitionBuilder(); oldPropDef.setDeclaringNodeType(NODE_TYPE1); oldPropDef.setName(PROP_NAME); oldPropDef.setRequiredType(PropertyType.STRING); oldPropDef.setMultiple(false); oldDef.setPropertyDefs(new QPropertyDefinition[]{ oldPropDef.build() }); // new node type definition QNodeTypeDefinitionBuilder newDef = new QNodeTypeDefinitionBuilder(); newDef.setName(NODE_TYPE1); newDef.setSupertypes(new Name[] { NameConstants.NT_BASE }); QPropertyDefinitionBuilder newPropDef1 = oldPropDef; QPropertyDefinitionBuilder newPropDef2 = new QPropertyDefinitionBuilder(); newPropDef2.setDeclaringNodeType(NODE_TYPE1); newPropDef2.setName(PROP_NAME); newPropDef2.setRequiredType(PropertyType.BOOLEAN); newPropDef2.setMultiple(false); newDef.setPropertyDefs(new QPropertyDefinition[]{ newPropDef1.build(), newPropDef2.build() }); NodeTypeDefDiff nodeTypeDefDiff = NodeTypeDefDiff.create(oldDef.build(), newDef.build()); assertTrue(nodeTypeDefDiff.isTrivial()); } public void testChangedSameNameChildNodeDefinition() throws Exception { // old node type definition QNodeTypeDefinitionBuilder oldDef = new QNodeTypeDefinitionBuilder(); oldDef.setName(NODE_TYPE1); oldDef.setSupertypes(new Name[] { NameConstants.NT_BASE }); QNodeDefinitionBuilder oldChildDef1 = new QNodeDefinitionBuilder(); oldChildDef1.setRequiredPrimaryTypes(new Name[]{ NameConstants.NT_FOLDER }); oldChildDef1.setName(CHILD_NAME); oldChildDef1.setDeclaringNodeType(oldDef.getName()); QNodeDefinitionBuilder oldChildDef2 = new QNodeDefinitionBuilder(); oldChildDef2.setRequiredPrimaryTypes(new Name[]{ NameConstants.NT_FILE }); oldChildDef2.setName(CHILD_NAME); oldChildDef2.setDeclaringNodeType(oldDef.getName()); oldDef.setChildNodeDefs(new QNodeDefinition[] { oldChildDef1.build(), oldChildDef2.build() }); // new node type definition QNodeTypeDefinitionBuilder newDef = new QNodeTypeDefinitionBuilder(); newDef.setName(NODE_TYPE1); newDef.setSupertypes(new Name[] { NameConstants.NT_BASE }); QNodeDefinitionBuilder newChildDef1 = new QNodeDefinitionBuilder(); newChildDef1.setRequiredPrimaryTypes(new Name[]{ NameConstants.NT_FOLDER }); newChildDef1.setName(CHILD_NAME); newChildDef1.setDeclaringNodeType(oldDef.getName()); QNodeDefinitionBuilder newChildDef2 = new QNodeDefinitionBuilder(); newChildDef2.setRequiredPrimaryTypes(new Name[]{ NameConstants.NT_FILE }); newChildDef2.setName(CHILD_NAME); newChildDef2.setDeclaringNodeType(oldDef.getName()); QNodeDefinitionBuilder newChildDef3 = new QNodeDefinitionBuilder(); newChildDef3.setRequiredPrimaryTypes(new Name[]{ NameConstants.NT_RESOURCE }); newChildDef3.setName(CHILD_NAME); newChildDef3.setDeclaringNodeType(oldDef.getName()); newDef.setChildNodeDefs(new QNodeDefinition[] { newChildDef1.build(), newChildDef2.build(), newChildDef3.build() }); // from old to new is trivial NodeTypeDefDiff nodeTypeDefDiff = NodeTypeDefDiff.create(oldDef.build(), newDef.build()); assertTrue(nodeTypeDefDiff.isTrivial()); // .. but the reverse is not nodeTypeDefDiff = NodeTypeDefDiff.create(newDef.build(), oldDef.build()); assertTrue(nodeTypeDefDiff.isMajor()); } }