/* * 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.persistence; import org.apache.jackrabbit.core.id.NodeId; import org.apache.jackrabbit.core.id.PropertyId; import org.apache.jackrabbit.core.state.NodeState; import org.apache.jackrabbit.core.state.PropertyState; import org.apache.jackrabbit.core.state.NoSuchItemStateException; import org.apache.jackrabbit.core.state.ItemStateException; import org.apache.jackrabbit.core.state.NodeReferences; import org.apache.jackrabbit.core.state.ChangeLog; /** * Persistence manager interface. Persistence managers are * internal Jackrabbit components that handle the persistent * storage of content nodes and properties. A persistence * manager knows how to retrieve the persistent states of * content items and how to atomically save a set of changes * to the persistent state. * <p> * Each workspace of a Jackrabbit content repository uses separate * persistence manager to store the content in that workspace. Also * the Jackrabbit version handler uses a separate persistence manager. * The persistence managers in use are configured in the Jackrabbit * XML configuration files. The configured persistence managers are * instantiated and initialized using the JavaBeans conventions. * * <h2>Persistence manager life cycle</h2> * <p> * The life cycle of a persistence manager instance contains four phases: * <ol> * <li>Instantiation, where the instance is created and possible * configuration properties are set using the JavaBean conventions. * During this phase the persistence manager should not attempt to * reference any external resources. * <li>Initialization, where the {@link #init(PMContext) init} method * is invoked to bind the persistence manager with a given * {@link PMContext context}. * <li>Normal usage, where the various create, load, exists, and store * methods of the persistence manager are used to manage the * persistent content items. * <li>Closing, where the {@link #close() close} method is invoked * to close the persistence manager and release all acquired * resources. * </ol> * * <h2>Concurrency</h2> * <p> * A persistence manager instance should be thread-safe and guarantee that * the {@link #store(ChangeLog)} method calls are atomic. Any load() or * exists() calls started after a store() call has returned must access * the updated content. The client accessing a persistence manager must * guarantee that no two concurrent {@link #store(ChangeLog)} calls will * modify the same items. */ public interface PersistenceManager { /** * Initializes the persistence manager. The persistence manager is * permanently bound to the given context, and any required external * resources are acquired. * <p> * An appropriate exception is thrown if the persistence manager * initialization fails for whatever reason. In this case the * state of the persistence manager is undefined and the instance * should be discarded. * * @param context persistence manager context * @throws Exception if the persistence manager initialization failed */ void init(PMContext context) throws Exception; /** * Closes the persistence manager. The consistency of the persistent * storage is guaranteed and all acquired resources are released. * It is an error to invoke any methods on a closed persistence manager, * and implementations are free to enforce this constraint by throwing * IllegalStateExceptions in such cases. * <p> * An appropriate exception is thrown if the persistence manager * could not be closed properly. In this case the state of the * persistence manager is undefined and the instance should be * discarded. * * @throws Exception if the persistence manager failed to close properly */ void close() throws Exception; /** * Creates a new node state instance with the given id. * * @param id node id * @return node state instance */ NodeState createNew(NodeId id); /** * Creates a new property state instance with the given id. * * @param id property id * @return property state instance */ PropertyState createNew(PropertyId id); /** * Load the persistent members of a node state. * * @param id node id * @return loaded node state * @throws NoSuchItemStateException if the node state does not exist * @throws ItemStateException if another error occurs */ NodeState load(NodeId id) throws NoSuchItemStateException, ItemStateException; /** * Load the persistent members of a property state. * * @param id property id * @return loaded property state * @throws NoSuchItemStateException if the property state does not exist * @throws ItemStateException if another error occurs */ PropertyState load(PropertyId id) throws NoSuchItemStateException, ItemStateException; /** * Load the persisted references to the node with the given identifier. * * @param id reference target node id * @throws NoSuchItemStateException if the target node does not exist * @throws ItemStateException if another error occurs */ NodeReferences loadReferencesTo(NodeId id) throws NoSuchItemStateException, ItemStateException; /** * Checks whether the identified node exists. * * @param id node id * @return <code>true</code> if the node exists, * <code>false</code> otherwise * @throws ItemStateException on persistence manager errors */ boolean exists(NodeId id) throws ItemStateException; /** * Checks whether the identified property exists. * * @param id property id * @return <code>true</code> if the property exists, * <code>false</code> otherwise * @throws ItemStateException on persistence manager errors */ boolean exists(PropertyId id) throws ItemStateException; /** * Checks whether references of the identified target node exist. * * @param targetId target node id * @return <code>true</code> if the references exist, * <code>false</code> otherwise * @throws ItemStateException on persistence manager errors */ boolean existsReferencesTo(NodeId targetId) throws ItemStateException; /** * Atomically saves the given set of changes. * * @param changeLog change log containing states that were changed * @throws ItemStateException if the changes could not be saved */ void store(ChangeLog changeLog) throws ItemStateException; /** * Perform a consistency check of the data. An example are non-existent * nodes referenced in a child node entry. The existence of this feature and * the scope of the implementation can vary in different PersistenceManager * implementations. * * @param uuids * list of UUIDs of nodes to be checked. if null, all nodes will * be checked * @param recursive * if true, the tree(s) below the given node(s) will be traversed * and checked as well * @param fix * if true, any problems found that can be repaired will be * repaired. if false, no data will be modified, instead all * inconsistencies will only get logged */ void checkConsistency(String[] uuids, boolean recursive, boolean fix); }