/* * 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.core; import javax.jcr.NamespaceException; import javax.jcr.NamespaceRegistry; import javax.jcr.Node; import javax.jcr.PathNotFoundException; import javax.jcr.Property; import javax.jcr.RepositoryException; import javax.jcr.Workspace; import javax.jcr.nodetype.NodeTypeManager; import org.apache.jackrabbit.core.nodetype.InvalidNodeTypeDefException; import org.apache.jackrabbit.core.nodetype.NodeTypeManagerImpl; import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry; import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.QNodeDefinition; import org.apache.jackrabbit.spi.QNodeTypeDefinition; import org.apache.jackrabbit.spi.QPropertyDefinition; import org.apache.jackrabbit.spi.commons.QNodeTypeDefinitionImpl; import org.apache.jackrabbit.test.AbstractJCRTest; public class LostFromCacheIssueTest extends AbstractJCRTest { private static final String NAMESPACE_PREFIX = "LostFromCacheIssueTestNamespacePrefix"; private static final String NAMESPACE_URI = "http://www.onehippo.org/test/1.0"; private static final String TESTNODE_PATH = "/LostFromCacheIssueTest/node"; private static final String NODETYPE_1 = NAMESPACE_PREFIX + ":mixin"; private static final String NODETYPE_2 = NAMESPACE_PREFIX + ":mxn"; public Property mixinTypes; public void setUp() throws Exception { super.setUp(); Workspace workspace = superuser.getWorkspace(); NamespaceRegistry namespaceRegistry = workspace.getNamespaceRegistry(); NodeTypeManager ntmgr = workspace.getNodeTypeManager(); NodeTypeRegistry nodetypeRegistry = ((NodeTypeManagerImpl)ntmgr).getNodeTypeRegistry(); try { namespaceRegistry.registerNamespace(NAMESPACE_PREFIX, NAMESPACE_URI); } catch (NamespaceException ignore) { //already exists } QNodeTypeDefinition nodeTypeDefinition = new QNodeTypeDefinitionImpl( ((SessionImpl)superuser).getQName(NODETYPE_1), Name.EMPTY_ARRAY, Name.EMPTY_ARRAY, true, false, true, false, null, QPropertyDefinition.EMPTY_ARRAY, QNodeDefinition.EMPTY_ARRAY ); try { nodetypeRegistry.registerNodeType(nodeTypeDefinition); } catch (InvalidNodeTypeDefException ignore) { //already exists } nodeTypeDefinition = new QNodeTypeDefinitionImpl( ((SessionImpl)superuser).getQName(NODETYPE_2), Name.EMPTY_ARRAY, Name.EMPTY_ARRAY, true, false, true, false, null, QPropertyDefinition.EMPTY_ARRAY, QNodeDefinition.EMPTY_ARRAY ); try { nodetypeRegistry.registerNodeType(nodeTypeDefinition); } catch (InvalidNodeTypeDefException ignore) { //already exists } getOrCreate(superuser.getRootNode(), TESTNODE_PATH); superuser.save(); } private static Node getOrCreate(Node parent, String path) throws RepositoryException { if (parent == null || path == null || path.trim().isEmpty()) { throw new IllegalArgumentException("Missing `parent` or `path`"); } String p = path; if (path.startsWith("/")) { p = path.substring(1); } Node node = null; try { node = parent.getNode(p); } catch (PathNotFoundException e) { // swallowing exception } if (node == null) { // if null is not there and therefore creating it for (String n : p.split("/")) { if (node == null) { node = parent.addNode(n); } else { node = node.addNode(n); } } } return node; } public void testIssue() throws Exception { Node node = superuser.getRootNode().getNode(TESTNODE_PATH.substring(1)); node.addMixin(NODETYPE_2); mixinTypes = node.getProperty("jcr:mixinTypes"); superuser.save(); node.addMixin(NODETYPE_1); superuser.save(); node.removeMixin(NODETYPE_2); node.removeMixin(NODETYPE_1); superuser.save(); node.addMixin(NODETYPE_1); superuser.save(); } }