You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2006/01/06 18:01:09 UTC
svn commit: r366532 - in
/incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core:
RepositoryImpl.java config/FileSystemConfig.java
security/SimpleAccessManager.java
Author: stefan
Date: Fri Jan 6 09:01:05 2006
New Revision: 366532
URL: http://svn.apache.org/viewcvs?rev=366532&view=rev
Log:
improving startup time: all workspaces (except the default workspace) are initialized lazily, i.e. on demand
Modified:
incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java
incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/config/FileSystemConfig.java
incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/security/SimpleAccessManager.java
Modified: incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java?rev=366532&r1=366531&r2=366532&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java (original)
+++ incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java Fri Jan 6 09:01:05 2006
@@ -222,26 +222,22 @@
virtNTMgr = new VirtualNodeTypeStateManager(getNodeTypeRegistry(),
delegatingDispatcher, NODETYPES_NODE_UUID, SYSTEM_ROOT_NODE_UUID);
- // initialize workspaces
- String wspName = "";
+ // initialize default workspace
+ String wspName = repConfig.getDefaultWorkspaceName();
try {
- iter = wspInfos.keySet().iterator();
- while (iter.hasNext()) {
- wspName = (String) iter.next();
- initWorkspace(wspName);
- }
+ initWorkspace((WorkspaceInfo) wspInfos.get(wspName));
} catch (RepositoryException e) {
- // if any workspace failed to initialize, shutdown again
+ // if default workspace failed to initialize, shutdown again
log.fatal("Failed to initialize workspace '" + wspName + "'", e);
log.fatal("Unable to start repository, forcing shutdown...");
shutdown();
throw e;
}
- // after the workspaces are initialized we pass a system session to
+ // after the workspace is initialized we pass a system session to
// the virtual node type manager
- // todo FIXME it seems odd that the *global* virtual node type manager
+ // todo FIXME it seems 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()));
}
@@ -451,15 +447,17 @@
}
}
- private void initWorkspace(String wspName) throws RepositoryException {
+ private void initWorkspace(WorkspaceInfo wspInfo) throws RepositoryException {
+ // first initialize workspace info
+ wspInfo.initialize();
// get system session and Workspace instance
- SessionImpl sysSession = getSystemSession(wspName);
+ SessionImpl sysSession = wspInfo.getSystemSession();
WorkspaceImpl wsp = (WorkspaceImpl) sysSession.getWorkspace();
/**
* todo implement 'System' workspace
* FIXME
- * - the should be one 'System' workspace per repositoy
+ * - the should be one 'System' workspace per repository
* - the 'System' workspace should have the /jcr:system node
* - versions, version history and node types should be reflected in
* this system workspace as content under /jcr:system
@@ -488,7 +486,7 @@
"/", true, null, null, false);
// register SearchManager as event listener
- SearchManager searchMgr = getSearchManager(wspName);
+ SearchManager searchMgr = wspInfo.getSearchManager();
if (searchMgr != null) {
wsp.getObservationManager().addEventListener(searchMgr,
Event.NODE_ADDED | Event.NODE_REMOVED
@@ -498,14 +496,15 @@
}
// register the observation factory of that workspace
- delegatingDispatcher.addDispatcher(getObservationManagerFactory(wspName));
+ delegatingDispatcher.addDispatcher(wspInfo.getObservationManagerFactory());
}
/**
* Returns the system search manager or <code>null</code> if none is
* configured.
*/
- private SearchManager getSystemSearchManager(String wspName) throws RepositoryException {
+ private SearchManager getSystemSearchManager(String wspName)
+ throws RepositoryException {
if (systemSearchMgr == null) {
try {
if (repConfig.getSearchConfig() != null) {
@@ -587,6 +586,16 @@
throw new NoSuchWorkspaceException(workspaceName);
}
+ synchronized (wspInfo) {
+ if (!wspInfo.isInitialized()) {
+ try {
+ initWorkspace(wspInfo);
+ } catch (RepositoryException e) {
+ log.error("Unable to initialize workspace '" + workspaceName + "'", e);
+ throw new NoSuchWorkspaceException(workspaceName);
+ }
+ }
+ }
return wspInfo;
}
@@ -609,9 +618,6 @@
WorkspaceConfig config = repConfig.createWorkspaceConfig(workspaceName);
WorkspaceInfo info = createWorkspaceInfo(config);
wspInfos.put(workspaceName, info);
-
- // setup/initialize new workspace
- initWorkspace(workspaceName);
}
SharedItemStateManager getWorkspaceStateManager(String workspaceName)
@@ -669,10 +675,13 @@
}
/**
- * @param workspaceName
- * @return
- * @throws NoSuchWorkspaceException
- * @throws RepositoryException
+ * Returns the {@link SystemSession} for the workspace with name
+ * <code>workspaceName</code>
+ *
+ * @param workspaceName workspace name
+ * @return system session of the specified workspace
+ * @throws NoSuchWorkspaceException if such a workspace does not exist
+ * @throws RepositoryException if some other error occurs
*/
SystemSession getSystemSession(String workspaceName)
throws NoSuchWorkspaceException, RepositoryException {
@@ -756,7 +765,11 @@
// shut down workspaces
for (Iterator it = wspInfos.values().iterator(); it.hasNext();) {
WorkspaceInfo wspInfo = (WorkspaceInfo) it.next();
- wspInfo.dispose();
+ synchronized(wspInfo) {
+ if (wspInfo.isInitialized()) {
+ wspInfo.dispose();
+ }
+ }
}
// shutdown system search manager if there is one
@@ -794,8 +807,8 @@
// make sure this instance is not used anymore
disposed = true;
- this.releaseRepositoryLock() ;
-
+ // finally release repository lock
+ releaseRepositoryLock();
}
/**
@@ -1138,41 +1151,46 @@
protected class WorkspaceInfo {
/**
- * workspace configuration
+ * workspace configuration (passed in constructor)
*/
private final WorkspaceConfig config;
/**
- * persistence manager
+ * persistence manager (instantiated on init)
*/
private PersistenceManager persistMgr;
/**
- * item state provider
+ * item state provider (instantiated on init)
*/
private SharedItemStateManager itemStateMgr;
/**
- * system session
+ * observation manager factory (instantiated on init)
*/
- private SystemSession systemSession;
+ private ObservationManagerFactory obsMgrFactory;
/**
- * observation manager factory
+ * system session (lazily instantiated)
*/
- private ObservationManagerFactory obsMgrFactory;
+ private SystemSession systemSession;
/**
- * search manager
+ * search manager (lazily instantiated)
*/
private SearchManager searchMgr;
/**
- * Lock manager
+ * lock manager (lazily instantiated)
*/
private LockManagerImpl lockMgr;
/**
+ * flag indicating whether this instance has been initialized.
+ */
+ private boolean initialized;
+
+ /**
* Creates a new <code>WorkspaceInfo</code> based on the given
* <code>config</code>.
*
@@ -1180,10 +1198,11 @@
*/
protected WorkspaceInfo(WorkspaceConfig config) {
this.config = config;
+ initialized = false;
}
/**
- * Returns the workspace name
+ * Returns the workspace name.
*
* @return the workspace name
*/
@@ -1192,7 +1211,7 @@
}
/**
- * Returns the workspace file system
+ * Returns the workspace file system.
*
* @return the workspace file system
*/
@@ -1201,7 +1220,7 @@
}
/**
- * Returns the workspace configuration
+ * Returns the workspace configuration.
*
* @return the workspace configuration
*/
@@ -1210,35 +1229,28 @@
}
/**
- * Returns the workspace persistence manager
+ * Returns <code>true</code> if this workspace info is initialized,
+ * otherwise returns <code>false</code>.
*
- * @return the workspace persistence manager
- * @throws RepositoryException if the persistence manager could not be instantiated/initialized
+ * @return <code>true</code> if this workspace info is initialized.
*/
- synchronized PersistenceManager getPersistenceManager(PersistenceManagerConfig pmConfig)
- throws RepositoryException {
- if (persistMgr == null) {
- persistMgr = createPersistenceManager(new File(config.getHomeDir()),
- config.getFileSystem(),
- pmConfig,
- rootNodeUUID,
- nsReg,
- ntReg);
- }
- return persistMgr;
+ synchronized boolean isInitialized() {
+ return initialized;
}
/**
- * Returns the system session for this workspace
+ * Returns the workspace persistence manager.
*
- * @return the system session for this workspace
- * @throws RepositoryException if the system session could not be created
+ * @return the workspace persistence manager
+ * @throws RepositoryException if the persistence manager could not be instantiated/initialized
*/
- synchronized SystemSession getSystemSession() throws RepositoryException {
- if (systemSession == null) {
- systemSession = SystemSession.create(RepositoryImpl.this, config);
+ synchronized PersistenceManager getPersistenceManager(PersistenceManagerConfig pmConfig)
+ throws RepositoryException {
+ if (!initialized) {
+ throw new IllegalStateException("not initialized");
}
- return systemSession;
+
+ return persistMgr;
}
/**
@@ -1250,24 +1262,10 @@
*/
synchronized SharedItemStateManager getItemStateProvider()
throws RepositoryException {
- if (itemStateMgr == null) {
- // create item state manager
- try {
- itemStateMgr = new SharedItemStateManager(
- getPersistenceManager(config.getPersistenceManagerConfig()),
- rootNodeUUID, ntReg);
- try {
- itemStateMgr.addVirtualItemStateProvider(vMgr.getVirtualItemStateProvider());
- itemStateMgr.addVirtualItemStateProvider(virtNTMgr.getVirtualItemStateProvider());
- } catch (Exception e) {
- log.error("Unable to add vmgr: " + e.toString(), e);
- }
- } catch (ItemStateException ise) {
- String msg = "failed to instantiate persistent item state manager";
- log.debug(msg);
- throw new RepositoryException(msg, ise);
- }
+ if (!initialized) {
+ throw new IllegalStateException("not initialized");
}
+
return itemStateMgr;
}
@@ -1277,29 +1275,36 @@
* @return the observation manager factory for this workspace
*/
synchronized ObservationManagerFactory getObservationManagerFactory() {
- if (obsMgrFactory == null) {
- obsMgrFactory = new ObservationManagerFactory();
+ if (!initialized) {
+ throw new IllegalStateException("not initialized");
}
+
return obsMgrFactory;
}
/**
- * Returns the search manager for this workspace
+ * Returns the search manager for this workspace.
*
* @return the search manager for this workspace, or <code>null</code>
* if no <code>SearchManager</code>
* @throws RepositoryException if the search manager could not be created
*/
synchronized SearchManager getSearchManager() throws RepositoryException {
+ if (!initialized) {
+ throw new IllegalStateException("not initialized");
+ }
+
if (searchMgr == null) {
if (config.getSearchConfig() == null) {
// no search index configured
return null;
}
+ // search manager is lazily instantiated in order to avoid
+ // 'chicken & egg' bootstrap problems
searchMgr = new SearchManager(config.getSearchConfig(),
nsReg,
ntReg,
- getItemStateProvider(),
+ itemStateMgr,
rootNodeUUID,
getSystemSearchManager(getName()),
SYSTEM_ROOT_NODE_UUID);
@@ -1308,12 +1313,18 @@
}
/**
- * Returns the lock manager for this workspace
+ * Returns the lock manager for this workspace.
*
* @return the lock manager for this workspace
* @throws RepositoryException if the lock manager could not be created
*/
synchronized LockManager getLockManager() throws RepositoryException {
+ if (!initialized) {
+ throw new IllegalStateException("not initialized");
+ }
+
+ // lock manager is lazily instantiated in order to avoid
+ // 'chicken & egg' bootstrap problems
if (lockMgr == null) {
lockMgr = new LockManagerImpl(getSystemSession(), config.getFileSystem());
}
@@ -1321,15 +1332,88 @@
}
/**
+ * Returns the system session for this workspace.
+ *
+ * @return the system session for this workspace
+ * @throws RepositoryException if the system session could not be created
+ */
+ synchronized SystemSession getSystemSession() throws RepositoryException {
+ if (!initialized) {
+ throw new IllegalStateException("not initialized");
+ }
+
+ // system session is lazily instantiated in order to avoid
+ // 'chicken & egg' bootstrap problems
+ if (systemSession == null) {
+ systemSession = SystemSession.create(RepositoryImpl.this, config);
+ }
+ return systemSession;
+ }
+
+ /**
+ * Initializes this workspace info. The following components are
+ * initialized immediately:
+ * <ul>
+ * <li>persistence manager</li>
+ * <li>shared item state manager</li>
+ * <li>observation manager factory</li>
+ * </ul>
+ * The following components are initialized lazily (i.e. on demand)
+ * in order to save resources and to avoid 'chicken & egg' bootstrap
+ * problems:
+ * <ul>
+ * <li>system session</li>
+ * <li>lock manager</li>
+ * <li>search manager</li>
+ * </ul>
+ */
+ synchronized void initialize() throws RepositoryException {
+ if (initialized) {
+ throw new IllegalStateException("already initialized");
+ }
+
+ persistMgr = createPersistenceManager(new File(config.getHomeDir()),
+ config.getFileSystem(),
+ config.getPersistenceManagerConfig(),
+ rootNodeUUID,
+ nsReg,
+ ntReg);
+
+ // create item state manager
+ try {
+ itemStateMgr =
+ new SharedItemStateManager(persistMgr, rootNodeUUID, ntReg);
+ try {
+ itemStateMgr.addVirtualItemStateProvider(
+ vMgr.getVirtualItemStateProvider());
+ itemStateMgr.addVirtualItemStateProvider(
+ virtNTMgr.getVirtualItemStateProvider());
+ } catch (Exception e) {
+ log.error("Unable to add vmgr: " + e.toString(), e);
+ }
+ } catch (ItemStateException ise) {
+ String msg = "failed to instantiate shared item state manager";
+ log.debug(msg);
+ throw new RepositoryException(msg, ise);
+ }
+
+ obsMgrFactory = new ObservationManagerFactory();
+
+ initialized = true;
+ }
+
+ /**
* Disposes all objects this <code>WorkspaceInfo</code> is holding.
*/
- void dispose() {
- // dispose observation manager factory
- if (obsMgrFactory != null) {
- obsMgrFactory.dispose();
- obsMgrFactory = null;
+ synchronized void dispose() {
+ if (!initialized) {
+ throw new IllegalStateException("not initialized");
}
+ // dispose observation manager factory
+ obsMgrFactory.dispose();
+ obsMgrFactory = null;
+
// shutdown search managers
if (searchMgr != null) {
searchMgr.close();
@@ -1343,25 +1427,23 @@
systemSession = null;
}
- // dispose persistent item state mgr
- if (itemStateMgr != null) {
- itemStateMgr.dispose();
- itemStateMgr = null;
- }
+ // dispose shared item state manager
+ itemStateMgr.dispose();
+ itemStateMgr = null;
// close persistence manager
- if (persistMgr != null) {
- try {
- persistMgr.close();
- } catch (Exception e) {
- log.error("error while closing persistence manager of workspace "
- + config.getName(), e);
- }
- persistMgr = null;
+ try {
+ persistMgr.close();
+ } catch (Exception e) {
+ log.error("error while closing persistence manager of workspace "
+ + config.getName(), e);
}
+ persistMgr = null;
+ // close lock manager
if (lockMgr != null) {
lockMgr.close();
+ lockMgr = null;
}
// close workspace file system
Modified: incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/config/FileSystemConfig.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/config/FileSystemConfig.java?rev=366532&r1=366531&r2=366532&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/config/FileSystemConfig.java (original)
+++ incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/config/FileSystemConfig.java Fri Jan 6 09:01:05 2006
@@ -82,5 +82,4 @@
"File system has not been initialized.");
}
}
-
}
Modified: incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/security/SimpleAccessManager.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/security/SimpleAccessManager.java?rev=366532&r1=366531&r2=366532&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/security/SimpleAccessManager.java (original)
+++ incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/security/SimpleAccessManager.java Fri Jan 6 09:01:05 2006
@@ -101,7 +101,7 @@
// system has always all permissions
return;
} else if (anonymous) {
- // anonymous is always denied WRITE & REMOVE premissions
+ // anonymous is always denied WRITE & REMOVE permissions
if ((permissions & WRITE) == WRITE
|| (permissions & REMOVE) == REMOVE) {
throw new AccessDeniedException();