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 + -
显示快捷键?