nodetypemanagerimpl.java

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

JAVA
500
字号
/* * 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;import org.apache.commons.collections.map.ReferenceMap;import org.apache.jackrabbit.name.NameException;import org.apache.jackrabbit.name.NamespaceResolver;import org.apache.jackrabbit.name.QName;import org.apache.jackrabbit.name.NameFormat;import org.apache.jackrabbit.util.IteratorHelper;import org.apache.jackrabbit.util.name.NamespaceMapping;import org.apache.jackrabbit.api.JackrabbitNodeTypeManager;import org.apache.jackrabbit.core.NamespaceRegistryImpl;import org.apache.jackrabbit.core.nodetype.compact.CompactNodeTypeDefReader;import org.apache.jackrabbit.core.nodetype.compact.ParseException;import org.apache.jackrabbit.core.nodetype.xml.NodeTypeReader;import org.apache.jackrabbit.core.util.Dumpable;import org.xml.sax.InputSource;import org.xml.sax.SAXException;import javax.jcr.RepositoryException;import javax.jcr.UnsupportedRepositoryOperationException;import javax.jcr.nodetype.NoSuchNodeTypeException;import javax.jcr.nodetype.NodeType;import javax.jcr.nodetype.NodeTypeIterator;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintStream;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.Enumeration;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Properties;import java.util.Set;/** * A <code>NodeTypeManagerImpl</code> implements a session dependant * NodeTypeManager. */public class NodeTypeManagerImpl implements JackrabbitNodeTypeManager,        Dumpable, NodeTypeRegistryListener {    /**     * The wrapped node type registry.     */    private final NodeTypeRegistry ntReg;    /**     * The persistent namespace registry where any new namespaces are     * automatically registered when new node type definition files are     * read.     */    private final NamespaceRegistryImpl nsReg;    /**     * The root node definition.     */    private final NodeDefinitionImpl rootNodeDef;    /**     * The namespace resolver used to translate qualified names to JCR names.     */    private final NamespaceResolver nsResolver;    /**     * A cache for <code>NodeType</code> instances created by this     * <code>NodeTypeManager</code>     */    private final Map ntCache;    /**     * A cache for <code>PropertyDefinition</code> instances created by this     * <code>NodeTypeManager</code>     */    private final Map pdCache;    /**     * A cache for <code>NodeDefinition</code> instances created by this     * <code>NodeTypeManager</code>     */    private final Map ndCache;    /**     * Creates a new <code>NodeTypeManagerImpl</code> instance.     *     * @param ntReg      node type registry     * @param nsReg      namespace registry     * @param nsResolver namespace resolver     */    public NodeTypeManagerImpl(            NodeTypeRegistry ntReg, NamespaceRegistryImpl nsReg,            NamespaceResolver nsResolver) {        this.nsResolver = nsResolver;        this.ntReg = ntReg;        this.nsReg = nsReg;        this.ntReg.addListener(this);        // setup caches with soft references to node type        // & item definition instances        ntCache = new ReferenceMap(ReferenceMap.HARD, ReferenceMap.SOFT);        pdCache = new ReferenceMap(ReferenceMap.HARD, ReferenceMap.SOFT);        ndCache = new ReferenceMap(ReferenceMap.HARD, ReferenceMap.SOFT);        rootNodeDef = new NodeDefinitionImpl(ntReg.getRootNodeDef(), this,                nsResolver);        ndCache.put(rootNodeDef.unwrap().getId(), rootNodeDef);    }    /**     * @return the root node definition     */    public NodeDefinitionImpl getRootNodeDefinition() {        return rootNodeDef;    }    /**     * @param id     * @return the node definition     */    public NodeDefinitionImpl getNodeDefinition(NodeDefId id) {        synchronized (ndCache) {            NodeDefinitionImpl ndi = (NodeDefinitionImpl) ndCache.get(id);            if (ndi == null) {                NodeDef nd = ntReg.getNodeDef(id);                if (nd != null) {                    ndi = new NodeDefinitionImpl(nd, this, nsResolver);                    ndCache.put(id, ndi);                }            }            return ndi;        }    }    /**     * @param id     * @return the property definition     */    public PropertyDefinitionImpl getPropertyDefinition(PropDefId id) {        synchronized (pdCache) {            PropertyDefinitionImpl pdi = (PropertyDefinitionImpl) pdCache.get(id);            if (pdi == null) {                PropDef pd = ntReg.getPropDef(id);                if (pd != null) {                    pdi = new PropertyDefinitionImpl(pd, this, nsResolver);                    pdCache.put(id, pdi);                }            }            return pdi;        }    }    /**     * @param name     * @return     * @throws NoSuchNodeTypeException     */    public NodeTypeImpl getNodeType(QName name) throws NoSuchNodeTypeException {        synchronized (ntCache) {            NodeTypeImpl nt = (NodeTypeImpl) ntCache.get(name);            if (nt == null) {                EffectiveNodeType ent = ntReg.getEffectiveNodeType(name);                NodeTypeDef def = ntReg.getNodeTypeDef(name);                nt = new NodeTypeImpl(ent, def, this, nsResolver);                ntCache.put(name, nt);            }            return nt;        }    }    /**     * @return the node type registry     */    public NodeTypeRegistry getNodeTypeRegistry() {        return ntReg;    }    /**     * Registers the node types defined in the given input stream depending     * on the content type specified for the stream. This will also register     * any namespaces identified in the input stream if they have not already     * been registered.     *     * @param in node type XML stream     * @param contentType type of the input stream     * @param reregisterExisting flag indicating whether node types should be     *                           reregistered if they already exist     * @return registered node types     * @throws IOException if the input stream could not be read or parsed     * @throws RepositoryException if the node types are invalid or another     *                             repository error occurs     */    public NodeType[] registerNodeTypes(InputStream in, String contentType,            boolean reregisterExisting)            throws IOException, RepositoryException {        try {            Map namespaceMap = new HashMap();            List nodeTypeDefs = new ArrayList();            if (contentType.equalsIgnoreCase(TEXT_XML)                    || contentType.equalsIgnoreCase(APPLICATION_XML)) {                try {                    NodeTypeReader ntr = new NodeTypeReader(in);                    Properties namespaces = ntr.getNamespaces();                    if (namespaces != null) {                        Enumeration prefixes = namespaces.propertyNames();                        while (prefixes.hasMoreElements()) {                            String prefix = (String) prefixes.nextElement();                            String uri = namespaces.getProperty(prefix);                            namespaceMap.put(prefix, uri);                        }                    }                    NodeTypeDef[] defs = ntr.getNodeTypeDefs();                    nodeTypeDefs.addAll(Arrays.asList(defs));                } catch (NameException e) {                    throw new RepositoryException("Illegal JCR name", e);                }            } else if (contentType.equalsIgnoreCase(TEXT_X_JCR_CND)) {                try {                    NamespaceMapping mapping = new NamespaceMapping(nsResolver);                    CompactNodeTypeDefReader reader = new CompactNodeTypeDefReader(                            new InputStreamReader(in), "cnd input stream", mapping);                    namespaceMap.putAll(mapping.getPrefixToURIMapping());                    nodeTypeDefs.addAll(reader.getNodeTypeDefs());                } catch (ParseException e) {

⌨️ 快捷键说明

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