versionmanagerimpl.java

来自「jsr170接口的java实现。是个apache的开源项目。」· Java 代码 · 共 575 行 · 第 1/2 页

JAVA
575
字号
/* * 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.version;import org.apache.commons.collections.map.ReferenceMap;import org.apache.jackrabbit.core.NodeId;import org.apache.jackrabbit.core.NodeImpl;import org.apache.jackrabbit.core.PropertyId;import org.apache.jackrabbit.core.SessionImpl;import org.apache.jackrabbit.core.cluster.UpdateEventChannel;import org.apache.jackrabbit.core.cluster.UpdateEventListener;import org.apache.jackrabbit.core.fs.FileSystem;import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;import org.apache.jackrabbit.core.observation.DelegatingObservationDispatcher;import org.apache.jackrabbit.core.observation.EventStateCollection;import org.apache.jackrabbit.core.observation.EventStateCollectionFactory;import org.apache.jackrabbit.core.persistence.PersistenceManager;import org.apache.jackrabbit.core.state.ChangeLog;import org.apache.jackrabbit.core.state.ItemState;import org.apache.jackrabbit.core.state.ItemStateCacheFactory;import org.apache.jackrabbit.core.state.ItemStateException;import org.apache.jackrabbit.core.state.ItemStateListener;import org.apache.jackrabbit.core.state.LocalItemStateManager;import org.apache.jackrabbit.core.state.NodeReferences;import org.apache.jackrabbit.core.state.NodeReferencesId;import org.apache.jackrabbit.core.state.NodeState;import org.apache.jackrabbit.core.state.PropertyState;import org.apache.jackrabbit.core.state.SharedItemStateManager;import org.apache.jackrabbit.core.value.InternalValue;import org.apache.jackrabbit.core.virtual.VirtualItemStateProvider;import org.apache.jackrabbit.name.MalformedPathException;import org.apache.jackrabbit.name.Path;import org.apache.jackrabbit.name.QName;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.Collection;import java.util.Collections;import java.util.Iterator;import java.util.List;import javax.jcr.PropertyType;import javax.jcr.RepositoryException;import javax.jcr.Session;import javax.jcr.version.Version;import javax.jcr.version.VersionException;import javax.jcr.version.VersionHistory;/** * This Class implements a VersionManager. */public class VersionManagerImpl extends AbstractVersionManager implements ItemStateListener, UpdateEventListener {    /**     * the default logger     */    private static Logger log = LoggerFactory.getLogger(VersionManager.class);    /**     * The path to the version storage: /jcr:system/jcr:versionStorage     */    private static final Path VERSION_STORAGE_PATH;    static {        try {            Path.PathBuilder builder = new Path.PathBuilder();            builder.addRoot();            builder.addLast(QName.JCR_SYSTEM);            builder.addLast(QName.JCR_VERSIONSTORAGE);            VERSION_STORAGE_PATH = builder.getPath();        } catch (MalformedPathException e) {            // will not happen. path is always valid            throw new InternalError("Cannot initialize path");        }    }    /**     * The persistence manager for the versions     */    private final PersistenceManager pMgr;    /**     * The file system for this version manager     */    private final FileSystem fs;    /**     * the version state manager for the version storage     */    private VersionItemStateManager sharedStateMgr;    /**     * the virtual item state provider that exposes the version storage     */    private final VersionItemStateProvider versProvider;    /**     * the node type manager     */    private NodeTypeRegistry ntReg;    /**     * the dynamic event state collection factory     */    private final DynamicESCFactory escFactory;    /**     * Map of returned items. this is kept for invalidating     */    private final ReferenceMap versionItems = new ReferenceMap(ReferenceMap.HARD, ReferenceMap.WEAK);    /**     * Creates a new version manager     *     */    public VersionManagerImpl(PersistenceManager pMgr, FileSystem fs,                              NodeTypeRegistry ntReg,                              DelegatingObservationDispatcher obsMgr, NodeId rootId,                              NodeId rootParentId,                              ItemStateCacheFactory cacheFactory) throws RepositoryException {        try {            this.pMgr = pMgr;            this.fs = fs;            this.ntReg = ntReg;            this.escFactory = new DynamicESCFactory(obsMgr);            // need to store the version storage root directly into the persistence manager            if (!pMgr.exists(rootId)) {                NodeState root = pMgr.createNew(rootId);                root.setParentId(rootParentId);                root.setDefinitionId(ntReg.getEffectiveNodeType(QName.REP_SYSTEM).getApplicableChildNodeDef(                        QName.JCR_VERSIONSTORAGE, QName.REP_VERSIONSTORAGE, ntReg).getId());                root.setNodeTypeName(QName.REP_VERSIONSTORAGE);                PropertyState pt = pMgr.createNew(new PropertyId(rootId, QName.JCR_PRIMARYTYPE));                pt.setDefinitionId(ntReg.getEffectiveNodeType(QName.REP_SYSTEM).getApplicablePropertyDef(                        QName.JCR_PRIMARYTYPE, PropertyType.NAME, false).getId());                pt.setMultiValued(false);                pt.setType(PropertyType.NAME);                pt.setValues(new InternalValue[]{InternalValue.create(QName.REP_VERSIONSTORAGE)});                root.addPropertyName(pt.getName());                ChangeLog cl = new ChangeLog();                cl.added(root);                cl.added(pt);                pMgr.store(cl);            }            sharedStateMgr = createItemStateManager(pMgr, rootId, ntReg, cacheFactory);            stateMgr = new LocalItemStateManager(sharedStateMgr, escFactory, cacheFactory);            stateMgr.addListener(this);            NodeState nodeState = (NodeState) stateMgr.getItemState(rootId);            historyRoot = new NodeStateEx(stateMgr, ntReg, nodeState, QName.JCR_VERSIONSTORAGE);            // create the virtual item state provider            versProvider = new VersionItemStateProvider(                    getHistoryRootId(), sharedStateMgr);        } catch (ItemStateException e) {            throw new RepositoryException(e);        }    }    /**     * {@inheritDoc}     */    public VirtualItemStateProvider getVirtualItemStateProvider() {        return versProvider;    }    /**     * {@inheritDoc}     */    public void close() throws Exception {        pMgr.close();        fs.close();    }    /**     * Returns the event state collection factory.     * @return the event state collection factory.     */    public DynamicESCFactory getEscFactory() {        return escFactory;    }    /**     * {@inheritDoc}     * <p/>     * This method must not be synchronized since it could cause deadlocks with     * item-reading listeners in the observation thread.     */    public VersionHistory createVersionHistory(Session session, final NodeState node)            throws RepositoryException {        InternalVersionHistory history = (InternalVersionHistory)                escFactory.doSourced((SessionImpl) session, new SourcedTarget(){            public Object run() throws RepositoryException {                return createVersionHistory(node);            }        });        if (history == null) {            throw new VersionException("History already exists for node " + node.getNodeId());        }        return (VersionHistory) ((SessionImpl) session).getNodeById(history.getId());    }    /**     * {@inheritDoc}     */    public boolean hasItem(NodeId id) {        acquireReadLock();        try {            return stateMgr.hasItemState(id);        } finally {            releaseReadLock();        }    }    /**     * {@inheritDoc}     */    protected InternalVersionItem getItem(NodeId id)            throws RepositoryException {        if (id.equals(getHistoryRootId())) {            return null;        }        acquireReadLock();        try {            synchronized (versionItems) {                InternalVersionItem item = (InternalVersionItem) versionItems.get(id);                if (item == null) {                    if (stateMgr.hasItemState(id)) {                        NodeState state = (NodeState) stateMgr.getItemState(id);                        NodeStateEx pNode = new NodeStateEx(stateMgr, ntReg, state, null);                        NodeId parentId = pNode.getParentId();                        InternalVersionItem parent = getItem(parentId);                        QName ntName = state.getNodeTypeName();                        if (ntName.equals(QName.NT_FROZENNODE)) {                            item = new InternalFrozenNodeImpl(this, pNode, parent);                        } else if (ntName.equals(QName.NT_VERSIONEDCHILD)) {                            item = new InternalFrozenVHImpl(this, pNode, parent);                        } else if (ntName.equals(QName.NT_VERSION)) {                            item = ((InternalVersionHistory) parent).getVersion(id);                        } else if (ntName.equals(QName.NT_VERSIONHISTORY)) {                            item = new InternalVersionHistoryImpl(this, pNode);                        } else {                            return null;                        }                    } else {                        return null;                    }                    versionItems.put(id, item);                }                return item;            }        } catch (ItemStateException e) {            throw new RepositoryException(e);        } finally {            releaseReadLock();        }    }    /**     * {@inheritDoc}     * <p/>     * This method must not be synchronized since it could cause deadlocks with     * item-reading listeners in the observation thread.     */    public Version checkin(final NodeImpl node) throws RepositoryException {        InternalVersion version = (InternalVersion)                escFactory.doSourced((SessionImpl) node.getSession(), new SourcedTarget(){            public Object run() throws RepositoryException {                String histUUID = node.getProperty(QName.JCR_VERSIONHISTORY).getString();

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?