virtualnodetypestatemanager.java

来自「jsr170接口的java实现。是个apache的开源项目。」· Java 代码 · 共 261 行

JAVA
261
字号
/* * 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.nodetype.virtual;import org.apache.jackrabbit.core.NodeId;import org.apache.jackrabbit.core.NodeImpl;import org.apache.jackrabbit.core.PropertyImpl;import org.apache.jackrabbit.core.SessionImpl;import org.apache.jackrabbit.core.nodetype.NodeTypeImpl;import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;import org.apache.jackrabbit.core.nodetype.NodeTypeRegistryListener;import org.apache.jackrabbit.core.observation.DelegatingObservationDispatcher;import org.apache.jackrabbit.core.observation.EventState;import org.apache.jackrabbit.core.virtual.VirtualItemStateProvider;import org.apache.jackrabbit.name.QName;import org.apache.jackrabbit.name.Path;import org.apache.jackrabbit.name.MalformedPathException;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.jcr.NodeIterator;import javax.jcr.PropertyIterator;import javax.jcr.RepositoryException;import java.util.ArrayList;import java.util.List;/** * This Class implements a workaround helper for populating observation * events for the virtual node states of the jcr:nodeTypes upon nodetype * registry changes. */public class VirtualNodeTypeStateManager implements NodeTypeRegistryListener {    /**     * the default logger     */    private static Logger log = LoggerFactory.getLogger(VirtualNodeTypeStateManager.class);    /**     * Path: /jcr:system/jcr:nodeTypes     */    private static final Path NODE_TYPES_PATH;    static {        try {            Path.PathBuilder builder = new Path.PathBuilder();            builder.addRoot();            builder.addLast(QName.JCR_SYSTEM);            builder.addLast(QName.JCR_NODETYPES);            NODE_TYPES_PATH = builder.getPath();        } catch (MalformedPathException e) {            // will not happen. path is always valid            throw new InternalError("Cannot initialize path");        }    }    /**     * an item state provider for the virtual nodetype states     */    private VirtualNodeTypeStateProvider virtProvider;    /**     * the node type registry     */    private final NodeTypeRegistry ntReg;    /**     * the root node id (usually the id of /jcr:system/jcr:nodeTypes)     */    private final NodeId rootNodeId;    /**     * the id of the roots parent (usually id of /jcr:system)     */    private final NodeId parentId;    /**     * the system session to generate the observation events     */    private SessionImpl systemSession;    /**     * the delegtating observation manager, that dispatches the events to     * all underlying ones.     */    private DelegatingObservationDispatcher obsDispatcher;    /**     * Creates a new virtual node type state manager     *     * @param ntReg     * @param obs     * @param rootNodeId     * @param parentId     */    public VirtualNodeTypeStateManager(            NodeTypeRegistry ntReg, DelegatingObservationDispatcher obs,            NodeId rootNodeId, NodeId parentId) {        this.ntReg = ntReg;        this.obsDispatcher = obs;        this.rootNodeId = rootNodeId;        this.parentId = parentId;        ntReg.addListener(this);    }    /**     * returns the virtual node state provider for the node type states.     * @return the virtual item state provider     */    public synchronized VirtualItemStateProvider getVirtualItemStateProvider() {        if (virtProvider == null) {            virtProvider = new VirtualNodeTypeStateProvider(ntReg, rootNodeId, parentId);        }        return virtProvider;    }    /**     * Sets the system session. This is needed, since the session should be     * set, after the workspaces are initialzed.     *     * @param systemSession     */    public void setSession(SessionImpl systemSession) {        this.systemSession = systemSession;    }    /**     * {@inheritDoc}     */    public void nodeTypeRegistered(QName ntName) {        try {            if (virtProvider != null) {                // allow provider to update                virtProvider.onNodeTypeAdded(ntName);            }            if (systemSession != null) {                // generate observation events                NodeImpl root = (NodeImpl) systemSession.getItemManager().getItem(rootNodeId);                NodeImpl child = root.getNode(ntName);                List events = new ArrayList();                recursiveAdd(events, root, child);                obsDispatcher.dispatch(events, systemSession, NODE_TYPES_PATH);            }        } catch (RepositoryException e) {            log.error("Unable to index new nodetype: " + e.toString());        }    }    /**     * {@inheritDoc}     */    public void nodeTypeReRegistered(QName ntName) {        // lazy implementation        nodeTypeUnregistered(ntName);        nodeTypeRegistered(ntName);    }    /**     * {@inheritDoc}     */    public void nodeTypeUnregistered(QName ntName) {        try {            if (systemSession != null) {                // generated observation events                NodeImpl root = (NodeImpl) systemSession.getItemManager().getItem(rootNodeId);                NodeImpl child = root.getNode(ntName);                List events = new ArrayList();                recursiveRemove(events, root, child);                obsDispatcher.dispatch(events, systemSession, NODE_TYPES_PATH);            }            if (virtProvider != null) {                // allow provider to update                virtProvider.onNodeTypeRemoved(ntName);            }        } catch (RepositoryException e) {            log.error("Unable to index removed nodetype: " + e.toString());        }    }    /**     * Adds a subtree of itemstates as 'added' to a list of events     *     * @param events     * @param parent     * @param node     * @throws RepositoryException     */    private void recursiveAdd(List events, NodeImpl parent, NodeImpl node)            throws RepositoryException {        events.add(EventState.childNodeAdded(                parent.getNodeId(),                parent.getPrimaryPath(),                node.getNodeId(),                node.getPrimaryPath().getNameElement(),                ((NodeTypeImpl) parent.getPrimaryNodeType()).getQName(),                parent.getMixinTypeNames(),                node.getSession()        ));        PropertyIterator iter = node.getProperties();        while (iter.hasNext()) {            PropertyImpl prop = (PropertyImpl) iter.nextProperty();            events.add(EventState.propertyAdded(                    (NodeId) node.getId(),                    node.getPrimaryPath(),                    prop.getPrimaryPath().getNameElement(),                    ((NodeTypeImpl) node.getPrimaryNodeType()).getQName(),                    node.getMixinTypeNames(),                    node.getSession()            ));        }        NodeIterator niter = node.getNodes();        while (niter.hasNext()) {            NodeImpl n = (NodeImpl) niter.nextNode();            recursiveAdd(events, node, n);        }    }    /**     * Adds a subtree of itemstates as 'removed' to a list of events     *     * @param events     * @param parent     * @param node     * @throws RepositoryException     */    private void recursiveRemove(List events, NodeImpl parent, NodeImpl node)            throws RepositoryException {        events.add(EventState.childNodeRemoved(                parent.getNodeId(),                parent.getPrimaryPath(),                node.getNodeId(),                node.getPrimaryPath().getNameElement(),                ((NodeTypeImpl) parent.getPrimaryNodeType()).getQName(),                parent.getMixinTypeNames(),                node.getSession()        ));        NodeIterator niter = node.getNodes();        while (niter.hasNext()) {            NodeImpl n = (NodeImpl) niter.nextNode();            recursiveRemove(events, node, n);        }    }}

⌨️ 快捷键说明

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