repositoryimpl.java

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

JAVA
1,761
字号
/* * 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;import EDU.oswego.cs.dl.util.concurrent.Mutex;import EDU.oswego.cs.dl.util.concurrent.ReadWriteLock;import EDU.oswego.cs.dl.util.concurrent.ReentrantWriterPreferenceReadWriteLock;import EDU.oswego.cs.dl.util.concurrent.WriterPreferenceReadWriteLock;import org.apache.commons.collections.map.ReferenceMap;import org.apache.jackrabbit.api.JackrabbitRepository;import org.apache.jackrabbit.core.cluster.ClusterContext;import org.apache.jackrabbit.core.cluster.ClusterException;import org.apache.jackrabbit.core.cluster.ClusterNode;import org.apache.jackrabbit.core.cluster.LockEventChannel;import org.apache.jackrabbit.core.cluster.UpdateEventChannel;import org.apache.jackrabbit.core.cluster.UpdateEventListener;import org.apache.jackrabbit.core.config.ClusterConfig;import org.apache.jackrabbit.core.config.FileSystemConfig;import org.apache.jackrabbit.core.config.LoginModuleConfig;import org.apache.jackrabbit.core.config.PersistenceManagerConfig;import org.apache.jackrabbit.core.config.RepositoryConfig;import org.apache.jackrabbit.core.config.VersioningConfig;import org.apache.jackrabbit.core.config.WorkspaceConfig;import org.apache.jackrabbit.core.fs.BasedFileSystem;import org.apache.jackrabbit.core.fs.FileSystem;import org.apache.jackrabbit.core.fs.FileSystemException;import org.apache.jackrabbit.core.fs.FileSystemResource;import org.apache.jackrabbit.core.lock.LockManager;import org.apache.jackrabbit.core.lock.LockManagerImpl;import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;import org.apache.jackrabbit.core.nodetype.virtual.VirtualNodeTypeStateManager;import org.apache.jackrabbit.core.observation.DelegatingObservationDispatcher;import org.apache.jackrabbit.core.observation.EventStateCollection;import org.apache.jackrabbit.core.observation.ObservationDispatcher;import org.apache.jackrabbit.core.persistence.PMContext;import org.apache.jackrabbit.core.persistence.PersistenceManager;import org.apache.jackrabbit.core.security.AuthContext;import org.apache.jackrabbit.core.state.CacheManager;import org.apache.jackrabbit.core.state.ChangeLog;import org.apache.jackrabbit.core.state.ItemStateCacheFactory;import org.apache.jackrabbit.core.state.ItemStateException;import org.apache.jackrabbit.core.state.ManagedMLRUItemStateCacheFactory;import org.apache.jackrabbit.core.state.SharedItemStateManager;import org.apache.jackrabbit.core.util.RepositoryLock;import org.apache.jackrabbit.core.version.VersionManager;import org.apache.jackrabbit.core.version.VersionManagerImpl;import org.apache.jackrabbit.name.NamespaceResolver;import org.apache.jackrabbit.name.QName;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.xml.sax.InputSource;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.security.AccessControlContext;import java.security.AccessController;import java.util.Arrays;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.List;import java.util.Properties;import java.util.Set;import javax.jcr.AccessDeniedException;import javax.jcr.Credentials;import javax.jcr.LoginException;import javax.jcr.NamespaceRegistry;import javax.jcr.NoSuchWorkspaceException;import javax.jcr.RepositoryException;import javax.jcr.Session;import javax.jcr.observation.Event;import javax.jcr.observation.EventIterator;import javax.jcr.observation.EventListener;import javax.jcr.observation.ObservationManager;import javax.security.auth.Subject;/** * A <code>RepositoryImpl</code> ... */public class RepositoryImpl implements JackrabbitRepository, SessionListener,        EventListener {    private static Logger log = LoggerFactory.getLogger(RepositoryImpl.class);    /**     * hardcoded id of the repository root node     */    public static final NodeId ROOT_NODE_ID = NodeId.valueOf("cafebabe-cafe-babe-cafe-babecafebabe");    /**     * hardcoded id of the "/jcr:system" node     */    public static final NodeId SYSTEM_ROOT_NODE_ID = NodeId.valueOf("deadbeef-cafe-babe-cafe-babecafebabe");    /**     * hardcoded id of the "/jcr:system/jcr:versionStorage" node     */    public static final NodeId VERSION_STORAGE_NODE_ID = NodeId.valueOf("deadbeef-face-babe-cafe-babecafebabe");    /**     * hardcoded id of the "/jcr:system/jcr:nodeTypes" node     */    public static final NodeId NODETYPES_NODE_ID = NodeId.valueOf("deadbeef-cafe-cafe-cafe-babecafebabe");    /**     * the name of the file system resource containing the properties of the     * repository.     */    private static final String PROPERTIES_RESOURCE = "rep.properties";    /**     * the repository properties.     */    private final Properties repProps;    // names of well-known repository properties    public static final String STATS_NODE_COUNT_PROPERTY = "jcr.repository.stats.nodes.count";    public static final String STATS_PROP_COUNT_PROPERTY = "jcr.repository.stats.properties.count";    private NodeId rootNodeId;    private final NamespaceRegistryImpl nsReg;    private final NodeTypeRegistry ntReg;    private final VersionManagerImpl vMgr;    private final VirtualNodeTypeStateManager virtNTMgr;    /**     * Search manager for the jcr:system tree. May be <code>null</code> if     * none is configured.     */    private SearchManager systemSearchMgr;    // configuration of the repository    protected final RepositoryConfig repConfig;    // the virtual repository file system    private final FileSystem repStore;    // sub file system where the repository stores meta data such as uuid of root node, etc.    private final FileSystem metaDataStore;    /**     * the delegating observation dispatcher for all workspaces     */    private final DelegatingObservationDispatcher delegatingDispatcher =            new DelegatingObservationDispatcher();    /**     * map of workspace names and <code>WorkspaceInfo<code>s.     */    private final HashMap wspInfos = new HashMap();    /**     * active sessions (weak references)     */    private final ReferenceMap activeSessions =            new ReferenceMap(ReferenceMap.WEAK, ReferenceMap.WEAK);    // misc. statistics    private long nodesCount = 0;    private long propsCount = 0;    // flag indicating if respository has been shut down    private boolean disposed = false;    /**     * the lock that guards instantiation of multiple repositories.     */    private RepositoryLock repLock;    /**     * Clustered node used, <code>null</code> if clustering is not configured.     */    private ClusterNode clusterNode;    /**     * Shutdown lock for guaranteeing that no new sessions are started during     * repository shutdown and that a repository shutdown is not initiated     * during a login. Each session login acquires a read lock while the     * repository shutdown requires a write lock. This guarantees that there     * can be multiple concurrent logins when the repository is not shutting     * down, but that only a single shutdown and no concurrent logins can     * happen simultaneously.     */    private final ReadWriteLock shutdownLock = new WriterPreferenceReadWriteLock();    /**     * There is one cache manager per repository that manages the sizes of the caches used.     */    private final CacheManager cacheMgr = new CacheManager();    /**     * There is only one item state cache factory     */    private final ItemStateCacheFactory cacheFactory = new ManagedMLRUItemStateCacheFactory(cacheMgr);    /**     * private constructor     *     * @param repConfig     */    protected RepositoryImpl(RepositoryConfig repConfig) throws RepositoryException {        log.info("Starting repository...");        this.repConfig = repConfig;        // Acquire a lock on the repository home        repLock = new RepositoryLock(repConfig.getHomeDir());        repLock.acquire();        // setup file systems        repStore = repConfig.getFileSystemConfig().createFileSystem();        String fsRootPath = "/meta";        try {            if (!repStore.exists(fsRootPath) || !repStore.isFolder(fsRootPath)) {                repStore.createFolder(fsRootPath);            }        } catch (FileSystemException fse) {            String msg = "failed to create folder for repository meta data";            log.error(msg, fse);            throw new RepositoryException(msg, fse);        }        metaDataStore = new BasedFileSystem(repStore, fsRootPath);        // init root node uuid        rootNodeId = loadRootNodeId(metaDataStore);        // load repository properties        repProps = loadRepProps();        nodesCount = Long.parseLong(repProps.getProperty(STATS_NODE_COUNT_PROPERTY, "0"));        propsCount = Long.parseLong(repProps.getProperty(STATS_PROP_COUNT_PROPERTY, "0"));        // create registries        nsReg = createNamespaceRegistry(new BasedFileSystem(repStore, "/namespaces"));        ntReg = createNodeTypeRegistry(nsReg, new BasedFileSystem(repStore, "/nodetypes"));        // init workspace configs        Iterator iter = repConfig.getWorkspaceConfigs().iterator();        while (iter.hasNext()) {            WorkspaceConfig config = (WorkspaceConfig) iter.next();            WorkspaceInfo info = createWorkspaceInfo(config);            wspInfos.put(config.getName(), info);        }        // initialize optional clustering        // put here before setting up any other external event source that a cluster node        // will be interested in        if (repConfig.getClusterConfig() != null) {            clusterNode = createClusterNode();            nsReg.setEventChannel(clusterNode);            ntReg.setEventChannel(clusterNode);        }        // init version manager        vMgr = createVersionManager(repConfig.getVersioningConfig(),                delegatingDispatcher);        if (clusterNode != null) {            vMgr.setEventChannel(clusterNode.createUpdateChannel(null));        }        // init virtual node type manager        virtNTMgr = new VirtualNodeTypeStateManager(getNodeTypeRegistry(),                delegatingDispatcher, NODETYPES_NODE_ID, SYSTEM_ROOT_NODE_ID);        // initialize startup workspaces        initStartupWorkspaces();        // initialize system search manager        getSystemSearchManager(repConfig.getDefaultWorkspaceName());        // after the workspace is initialized we pass a system session to        // the virtual node type manager        // todo FIXME it  odd that the *global* virtual node type manager        // is using a session that is bound to a single specific workspace        virtNTMgr.setSession(getSystemSession(repConfig.getDefaultWorkspaceName()));        // now start cluster node as last step        if (clusterNode != null) {            try {                clusterNode.start();            } catch (ClusterException e) {                String msg = "Unable to start clustered node, forcing shutdown...";                log.error(msg, e);                shutdown();                throw new RepositoryException(msg, e);            }        }        // amount of time in seconds before an idle workspace is automatically        // shut down        int maxIdleTime = repConfig.getWorkspaceMaxIdleTime();        if (maxIdleTime != 0) {            // start workspace janitor thread            Thread wspJanitor = new Thread(new WorkspaceJanitor(maxIdleTime * 1000));            wspJanitor.setName("WorkspaceJanitor");            wspJanitor.setPriority(Thread.MIN_PRIORITY);            wspJanitor.setDaemon(true);            wspJanitor.start();        }        log.info("Repository started");    }    /**     * Get the cache manager of this repository, useful     * for setting its memory parameters.     *     * @return the cache manager     * @since 1.3     */    public CacheManager getCacheManager() {        return cacheMgr;    }    /**     * Get the item state cache factory of this repository.     *     * @return the cache factory     */    public ItemStateCacheFactory getItemStateCacheFactory() {        return cacheFactory;    }    /**     * Creates the version manager.     *     * @param vConfig the versioning config     * @return the newly created version manager     * @throws RepositoryException if an error occurrs     */    protected VersionManagerImpl createVersionManager(VersioningConfig vConfig,                                                      DelegatingObservationDispatcher delegatingDispatcher)

⌨️ 快捷键说明

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