/* * JBoss, Home of Professional Open Source. * Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.cache; import org.jboss.cache.mvcc.ReadCommittedNode; import org.jboss.cache.optimistic.TransactionWorkspace; import org.jboss.cache.optimistic.WorkspaceNode; import java.util.Map; /** * An interface for a factory that creates nodes. This used to be a concrete class prior to 3.0.0. Made into an * interface to simplify logic of different locking schemes and node types. * * @author Manik Surtani (manik AT jboss DOT org) * @since 3.0 */ public interface NodeFactory { ReadCommittedNode createWrappedNode(InternalNode node, InternalNode parent); ReadCommittedNode createWrappedNodeForRemoval(Fqn fqn, InternalNode node, InternalNode parent); WorkspaceNode createWrappedNode(NodeSPI dataNode, TransactionWorkspace workspace); /** * Creates a new node and populates its attributes. *

* Note that the data map passed in must not be null, and must not be referenced anywhere else as a defensive copy * is NOT made when injecting it into the node. * * @param fqn * @param parent * @param data * @return a new node */ NodeSPI createNode(Fqn fqn, NodeSPI parent, Map data); /** * Creates a new node and populates its attributes. *

* Note that the data map passed in must not be null, and must not be referenced anywhere else as a defensive copy * is NOT made when injecting it into the node. * * @param childName * @param parent * @param data * @return a new node */ NodeSPI createNode(Object childName, NodeSPI parent, Map data); /** * Creates a new, empty node. * * @param fqn * @param parent * @return a new node */ NodeSPI createNode(Fqn fqn, NodeSPI parent); /** * Creates a new, empty node. * * @param childName * @param parent * @return a new node */ NodeSPI createNode(Object childName, NodeSPI parent); /** * Creates a new node, and optionally attaches the node to its parent. *

* The assumption here is that any locks are acquired to prevent concurrent creation of the same node. Implementations * of the NodeFactory should not attempt to synchronize or guard against concurrent creation. *

* * @param fqn fqn of node to create. Must not be null or root. * @param parent parent to attach to. Must not be null, even if attachToParent is false. * @param ctx invocation context to register with. Must not be null. * @param attachToParent if true, the node is registered in the parent's child map. If false, it is not. * @return a new node, or the existing node if one existed. */ InternalNode createChildNode(Fqn fqn, InternalNode parent, InvocationContext ctx, boolean attachToParent); NodeSPI createRootNode(); /** * Creates an internal node. Similar to {@link #createNode(Fqn, NodeSPI)} except that the resultant node is not wrapped * in a {@link org.jboss.cache.invocation.NodeInvocationDelegate}. * * @param childFqn * @return a new node */ InternalNode createInternalNode(Fqn childFqn); }