/*
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.services.jcr.impl;
import org.exoplatform.commons.utils.ClassLoading;
import org.exoplatform.commons.utils.SecurityHelper;
import org.exoplatform.container.ExoContainer;
import org.exoplatform.container.component.ComponentPlugin;
import org.exoplatform.management.annotations.Managed;
import org.exoplatform.management.annotations.ManagedDescription;
import org.exoplatform.management.jmx.annotations.NameTemplate;
import org.exoplatform.management.jmx.annotations.NamingContext;
import org.exoplatform.management.jmx.annotations.Property;
import org.exoplatform.services.jcr.access.AccessControlPolicy;
import org.exoplatform.services.jcr.config.ExtendedMappedParametrizedObjectEntry;
import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
import org.exoplatform.services.jcr.config.RepositoryEntry;
import org.exoplatform.services.jcr.config.SystemParametersPersistenceConfigurator;
import org.exoplatform.services.jcr.config.ValueStorageEntry;
import org.exoplatform.services.jcr.config.WorkspaceEntry;
import org.exoplatform.services.jcr.core.ManageableRepository;
import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
import org.exoplatform.services.jcr.core.security.JCRRuntimePermissions;
import org.exoplatform.services.jcr.impl.checker.RepositoryCheckController;
import org.exoplatform.services.jcr.impl.core.AddNamespacePluginHolder;
import org.exoplatform.services.jcr.impl.core.LocationFactory;
import org.exoplatform.services.jcr.impl.core.NamespaceDataPersister;
import org.exoplatform.services.jcr.impl.core.NamespaceRegistryImpl;
import org.exoplatform.services.jcr.impl.core.RepositoryImpl;
import org.exoplatform.services.jcr.impl.core.ScratchWorkspaceInitializer;
import org.exoplatform.services.jcr.impl.core.SessionFactory;
import org.exoplatform.services.jcr.impl.core.SessionRegistry;
import org.exoplatform.services.jcr.impl.core.WorkspaceInitializer;
import org.exoplatform.services.jcr.impl.core.access.DefaultAccessManagerImpl;
import org.exoplatform.services.jcr.impl.core.lock.LockRemoverHolder;
import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeDataManagerImpl;
import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeManagerImpl;
import org.exoplatform.services.jcr.impl.core.nodetype.registration.JCRNodeTypeDataPersister;
import org.exoplatform.services.jcr.impl.core.observation.ObservationManagerRegistry;
import org.exoplatform.services.jcr.impl.core.query.QueryManagerFactory;
import org.exoplatform.services.jcr.impl.core.query.RepositoryIndexSearcherHolder;
import org.exoplatform.services.jcr.impl.core.query.SearchManager;
import org.exoplatform.services.jcr.impl.core.query.SystemSearchManager;
import org.exoplatform.services.jcr.impl.core.query.SystemSearchManagerHolder;
import org.exoplatform.services.jcr.impl.core.value.ValueFactoryImpl;
import org.exoplatform.services.jcr.impl.dataflow.persistent.CacheableWorkspaceDataManager;
import org.exoplatform.services.jcr.impl.dataflow.persistent.LinkedWorkspaceStorageCacheImpl;
import org.exoplatform.services.jcr.impl.dataflow.persistent.LocalWorkspaceDataManagerStub;
import org.exoplatform.services.jcr.impl.dataflow.session.TransactionableResourceManager;
import org.exoplatform.services.jcr.impl.quota.QuotaManager;
import org.exoplatform.services.jcr.impl.quota.RepositoryQuotaManager;
import org.exoplatform.services.jcr.impl.quota.WorkspaceQuotaManager;
import org.exoplatform.services.jcr.impl.storage.SystemDataContainerHolder;
import org.exoplatform.services.jcr.impl.storage.value.StandaloneStoragePluginProvider;
import org.exoplatform.services.jcr.impl.util.io.FileCleanerHolder;
import org.exoplatform.services.jcr.storage.WorkspaceDataContainer;
import org.exoplatform.services.jcr.util.IdGenerator;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.rpc.RPCService;
import java.security.PrivilegedAction;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.util.ArrayList;
import java.util.List;
import javax.jcr.NamespaceRegistry;
import javax.jcr.RepositoryException;
import javax.jcr.nodetype.NodeTypeManager;
import javax.jcr.query.QueryManager;
import javax.naming.NameNotFoundException;
/**
* Created by The eXo Platform SAS.
*
* @author Gennady Azarenkov
* @version $Id: RepositoryContainer.java 13986 2008-05-08 10:48:43Z pnedonosko $
*/
@Managed
@NameTemplate(@Property(key = "repository", value = "{Name}"))
@NamingContext(@Property(key = "repository", value = "{Name}"))
public class RepositoryContainer extends ExoContainer
{
/**
* The serial UID
*/
private static final long serialVersionUID = -8441933562276408877L;
/**
* Repository config.
*/
private final RepositoryEntry config;
/**
* Repository name.
*/
private final String name;
/**
* System workspace DataManager.
*/
private LocalWorkspaceDataManagerStub systemDataManager = null;
/**
* Logger.
*/
private final Log log = ExoLogger.getLogger("exo.jcr.component.core.RepositoryContainer");
/**
* List of AddNamespacePlugin.
*/
private List<ComponentPlugin> addNamespacePlugins;
/**
* RepositoryContainer constructor.
*
* @param parent
* container
* @param config
* Repository configuration
* @param addNamespacePlugins
* list of addNamespacePlugin
* @throws RepositoryException
* container initialization error
* @throws RepositoryConfigurationException
* configuration error
*/
public RepositoryContainer(final ExoContainer parent, RepositoryEntry config, List<ComponentPlugin> addNamespacePlugins)
throws RepositoryException, RepositoryConfigurationException
{
super(parent);
// Defaults:
if (config.getAccessControl() == null)
config.setAccessControl(AccessControlPolicy.OPTIONAL);
this.config = config;
this.addNamespacePlugins = addNamespacePlugins;
this.name = config.getName();
try
{
SecurityHelper.doPrivilegedExceptionAction(new PrivilegedExceptionAction<Void>()
{
public Void run() throws RepositoryConfigurationException
{
context.setName(parent.getContext().getName() + "-" + name);
try
{
parent.registerComponentInstance(name, RepositoryContainer.this);
initAllWorkspaceComponentEntries(parent);
registerComponents();
}
catch (Throwable t) // NOSONAR
{
unregisterAllComponents();
parent.unregisterComponent(name);
throw new RepositoryConfigurationException("Can not register repository container " + name
+ " in parent container.", t);
}
return null;
}
});
}
catch (PrivilegedActionException e)
{
Throwable ex = e.getCause();
if (ex instanceof RepositoryConfigurationException)
{
throw (RepositoryConfigurationException)ex;
}
else
{
throw new RepositoryConfigurationException(ex.getMessage(), ex);
}
}
}
private void initAllWorkspaceComponentEntries(ExoContainer parent)
{
SystemParametersPersistenceConfigurator sppc =
(SystemParametersPersistenceConfigurator)parent
.getComponentInstanceOfType(SystemParametersPersistenceConfigurator.class);
for (WorkspaceEntry workspaceEntry : config.getWorkspaceEntries())
{
initWorkspaceComponentEntries(sppc, workspaceEntry);
}
}
public void initWorkspaceComponentEntries(SystemParametersPersistenceConfigurator sppc, WorkspaceEntry workspaceEntry)
{
workspaceEntry.setUniqueName(getName() + "_" + workspaceEntry.getName());
if (sppc != null)
{
for (ExtendedMappedParametrizedObjectEntry entry : getWorkspaceComponentEntries(workspaceEntry))
{
entry.initSystemParameterUpdater(workspaceEntry, sppc);
}
}
}
private List<ExtendedMappedParametrizedObjectEntry> getWorkspaceComponentEntries(WorkspaceEntry workspaceEntry)
{
List<ExtendedMappedParametrizedObjectEntry> entries = new ArrayList<ExtendedMappedParametrizedObjectEntry>();
if (workspaceEntry.getAccessManager() != null)
{
entries.add(workspaceEntry.getAccessManager());
}
if (workspaceEntry.getCache() != null)
{
entries.add(workspaceEntry.getCache());
}
if (workspaceEntry.getInitializer() != null)
{
entries.add(workspaceEntry.getInitializer());
}
if (workspaceEntry.getLockManager() != null)
{
entries.add(workspaceEntry.getLockManager());
}
if (workspaceEntry.getQueryHandler() != null)
{
entries.add(workspaceEntry.getQueryHandler());
}
if (workspaceEntry.getContainer() != null)
{
entries.add(workspaceEntry.getContainer());
if (workspaceEntry.getContainer().getValueStorages() != null)
{
for (ValueStorageEntry valueStorageEntry : workspaceEntry.getContainer().getValueStorages())
{
entries.add(valueStorageEntry);
}
}
}
return entries;
}
/**
* RepositoryContainer constructor.
*
* @param parent
* container
* @param config
* Repository configuration
* @throws RepositoryException
* container initialization error
* @throws RepositoryConfigurationException
* configuration error
*/
public RepositoryContainer(final ExoContainer parent, RepositoryEntry config) throws RepositoryException,
RepositoryConfigurationException
{
this(parent, config, new ArrayList<ComponentPlugin>());
}
public LocationFactory getLocationFactory()
{
return (LocationFactory)getComponentInstanceOfType(LocationFactory.class);
}
/**
* @return Returns the name.
*/
@Managed
@ManagedDescription("The repository container name")
public String getName()
{
return name;
}
public NamespaceRegistry getNamespaceRegistry()
{
return (NamespaceRegistry)getComponentInstanceOfType(NamespaceRegistry.class);
}
public ExtendedNodeTypeManager getNodeTypeManager()
{
return (ExtendedNodeTypeManager)getComponentInstanceOfType(NodeTypeManager.class);
}
/**
* Get workspace Container by name.
*
* @param workspaceName
* name
* @return WorkspaceContainer
*/
public WorkspaceContainer getWorkspaceContainer(String workspaceName)
{
Object comp = getComponentInstance(workspaceName);
return comp != null && comp instanceof WorkspaceContainer ? (WorkspaceContainer)comp : null;
}
/**
* Get workspace configuration entry by name.
*
* @param wsName
* workspace name
* @return WorkspaceEntry
*/
public WorkspaceEntry getWorkspaceEntry(String wsName)
{
for (WorkspaceEntry entry : config.getWorkspaceEntries())
{
if (entry.getName().equals(wsName))
return entry;
}
return null;
}
/**
* Register workspace from configuration.
*
* @param wsConfig
* configuration
* @throws RepositoryException
* initialization error
* @throws RepositoryConfigurationException
* configuration error
*/
public void registerWorkspace(final WorkspaceEntry wsConfig) throws RepositoryException,
RepositoryConfigurationException
{
// Need privileges to manage repository.
SecurityManager security = System.getSecurityManager();
if (security != null)
{
security.checkPermission(JCRRuntimePermissions.MANAGE_REPOSITORY_PERMISSION);
}
try
{
SecurityHelper.doPrivilegedExceptionAction(new PrivilegedExceptionAction<Void>()
{
public Void run() throws RepositoryException, RepositoryConfigurationException
{
final boolean isSystem = config.getSystemWorkspaceName().equals(wsConfig.getName());
if (getWorkspaceContainer(wsConfig.getName()) != null)
throw new RepositoryException("Workspace " + wsConfig.getName() + " already registered");
final WorkspaceContainer workspaceContainer = new WorkspaceContainer(RepositoryContainer.this, wsConfig);
registerComponentInstance(wsConfig.getName(), workspaceContainer);
workspaceContainer.registerComponentInstance(wsConfig);
workspaceContainer.registerComponentImplementation(StandaloneStoragePluginProvider.class);
try
{
final Class<?> containerType =
ClassLoading.forName(wsConfig.getContainer().getType(), RepositoryContainer.class);
workspaceContainer.registerComponentImplementation(containerType);
if (isSystem)
{
registerComponentInstance(new SystemDataContainerHolder((WorkspaceDataContainer)workspaceContainer
.getComponentInstanceOfType(WorkspaceDataContainer.class)));
}
}
catch (ClassNotFoundException e)
{
throw new RepositoryConfigurationException("Class not found for workspace data container "
+ wsConfig.getUniqueName() + " : " + e, e);
}
// cache type
try
{
String className = wsConfig.getCache().getType();
if (className != null && className.length() > 0)
{
workspaceContainer.registerComponentImplementation(ClassLoading.forName(className,
RepositoryContainer.class));
}
else
workspaceContainer.registerComponentImplementation(LinkedWorkspaceStorageCacheImpl.class);
}
catch (ClassNotFoundException e)
{
log.warn("Workspace cache class not found " + wsConfig.getCache().getType()
+ ", will use default. Error : " + e.getMessage());
workspaceContainer.registerComponentImplementation(LinkedWorkspaceStorageCacheImpl.class);
}
if (workspaceContainer.getComponentInstanceOfType(RPCService.class) != null)
{
workspaceContainer.registerComponentImplementation(WorkspaceResumer.class);
}
if (workspaceContainer.getComponentInstanceOfType(QuotaManager.class) != null)
{
workspaceContainer.registerComponentImplementation(WorkspaceQuotaManager.class);
}
workspaceContainer.registerComponentImplementation(CacheableWorkspaceDataManager.class);
workspaceContainer.registerComponentImplementation(LocalWorkspaceDataManagerStub.class);
workspaceContainer.registerComponentImplementation(ObservationManagerRegistry.class);
if (wsConfig.getLockManager() != null && wsConfig.getLockManager().getType() != null)
{
try
{
final Class<?> lockManagerType =
ClassLoading.forName(wsConfig.getLockManager().getType(), RepositoryContainer.class);
workspaceContainer.registerComponentImplementation(lockManagerType);
}
catch (ClassNotFoundException e)
{
throw new RepositoryConfigurationException("Class not found for workspace lock manager "
+ wsConfig.getLockManager().getType() + ", container " + wsConfig.getUniqueName() + " : " + e,
e);
}
}
else
{
throw new RepositoryConfigurationException(
"The configuration of lock manager is expected in container " + wsConfig.getUniqueName());
}
// Query handler
if (wsConfig.getQueryHandler() != null)
{
workspaceContainer.registerComponentImplementation(SearchManager.class);
workspaceContainer.registerComponentImplementation(QueryManager.class);
workspaceContainer.registerComponentImplementation(QueryManagerFactory.class);
workspaceContainer.registerComponentInstance(wsConfig.getQueryHandler());
if (isSystem)
{
workspaceContainer.registerComponentImplementation(SystemSearchManager.class);
}
}
// access manager
if (wsConfig.getAccessManager() != null && wsConfig.getAccessManager().getType() != null)
{
try
{
final Class<?> am = ClassLoading.forName(wsConfig.getAccessManager().getType(), RepositoryContainer.class);
workspaceContainer.registerComponentImplementation(am);
}
catch (ClassNotFoundException e)
{
throw new RepositoryConfigurationException(
"Class not found for workspace access manager " + wsConfig.getAccessManager().getType()
+ ", container " + wsConfig.getUniqueName() + " : " + e, e);
}
}
// initializer
final Class<?> initilizerType;
if (wsConfig.getInitializer() != null && wsConfig.getInitializer().getType() != null)
{
// use user defined
try
{
initilizerType = ClassLoading.forName(wsConfig.getInitializer().getType(), RepositoryContainer.class);
}
catch (ClassNotFoundException e)
{
throw new RepositoryConfigurationException("Class not found for workspace initializer "
+ wsConfig.getInitializer().getType() + ", container " + wsConfig.getUniqueName() + " : " + e,
e);
}
}
else
{
// use default
initilizerType = ScratchWorkspaceInitializer.class;
}
workspaceContainer.registerComponentImplementation(initilizerType);
workspaceContainer.registerComponentImplementation(TransactionableResourceManager.class);
workspaceContainer.registerComponentImplementation(SessionFactory.class);
final LocalWorkspaceDataManagerStub wsDataManager =
(LocalWorkspaceDataManagerStub)workspaceContainer
.getComponentInstanceOfType(LocalWorkspaceDataManagerStub.class);
if (isSystem)
{
// system workspace
systemDataManager = wsDataManager;
registerComponentInstance(systemDataManager);
}
wsDataManager.setSystemDataManager(systemDataManager);
if (!config.getWorkspaceEntries().contains(wsConfig))
config.getWorkspaceEntries().add(wsConfig);
return null;
}
});
}
catch (PrivilegedActionException pae)
{
Throwable cause = pae.getCause();
if (cause instanceof RepositoryConfigurationException)
{
throw (RepositoryConfigurationException)cause;
}
else if (cause instanceof RepositoryException)
{
throw (RepositoryException)cause;
}
else if (cause instanceof RuntimeException)
{
RuntimeException e = (RuntimeException)cause;
int depth = 0;
Throwable retval = e;
while (retval.getCause() != null && depth < 100)
{
retval = retval.getCause();
if (retval instanceof RepositoryException)
{
throw new RepositoryException(retval.getMessage(), e);
}
else if (retval instanceof RepositoryConfigurationException)
{
throw new RepositoryConfigurationException(retval.getMessage(), e);
}
else if (retval instanceof NameNotFoundException)
{
throw new RepositoryException(retval.getMessage(), e);
}
depth++;
}
throw e;
}
else
{
throw new RepositoryException(cause);
}
}
}
// Components access methods -------
/**
* {@inheritDoc}
*/
@Override
public void start()
{
try
{
init();
load();
}
catch (RepositoryException e)
{
log.error("Repository error", e);
throw new RuntimeException(e);
}
catch (RepositoryConfigurationException e)
{
log.error("Configuration error", e);
throw new RuntimeException(e);
}
super.start();
}
/**
* {@inheritDoc}
*/
@Override
public synchronized void stop()
{
RepositoryImpl repository = (RepositoryImpl)getComponentInstanceOfType(RepositoryImpl.class);
try
{
repository.setState(ManageableRepository.OFFLINE);
}
catch (RepositoryException e)
{
log.error("Can not switch repository to OFFLINE", e);
}
super.stop();
super.unregisterAllComponents();
}
/**
* Initialize worspaces (root node and jcr:system for system workspace).
* <p>
* Runs on container start.
*
* @throws RepositoryException
* @throws RepositoryConfigurationException
*/
private void init() throws RepositoryException, RepositoryConfigurationException
{
List<WorkspaceEntry> wsEntries = config.getWorkspaceEntries();
NodeTypeDataManager typeManager = (NodeTypeDataManager)this.getComponentInstanceOfType(NodeTypeDataManager.class);
NamespaceRegistryImpl namespaceRegistry =
(NamespaceRegistryImpl)this.getComponentInstanceOfType(NamespaceRegistry.class);
for (WorkspaceEntry ws : wsEntries)
{
initWorkspace(ws);
WorkspaceContainer workspaceContainer = getWorkspaceContainer(ws.getName());
SearchManager searchManager =
(SearchManager)workspaceContainer.getComponentInstanceOfType(SearchManager.class);
// if (searchManager != null)
// {
// typeManager.addQueryHandler(searchManager.getHandler());
// namespaceRegistry.addQueryHandler(searchManager.getHandler());
// }
// else
// {
// log.warn("Search manager not configured for " + ws.getName());
// }
}
SystemSearchManagerHolder searchManager =
(SystemSearchManagerHolder)this.getComponentInstanceOfType(SystemSearchManagerHolder.class);
// if (searchManager != null)
// {
// typeManager.addQueryHandler(searchManager.get().getHandler());
// namespaceRegistry.addQueryHandler(searchManager.get().getHandler());
// }
// else
// {
// log.warn("System search manager not configured ");
// }
}
/**
* Init workspace root node. If it's the system workspace init jcr:system too.
*
* @param wsConfig
* @throws RepositoryException
*/
private void initWorkspace(WorkspaceEntry wsConfig) throws RepositoryException
{
WorkspaceContainer workspaceContainer = getWorkspaceContainer(wsConfig.getName());
// touch independent components
workspaceContainer.getComponentInstanceOfType(IdGenerator.class);
// Init Root and jcr:system if workspace is system workspace
WorkspaceInitializer wsInitializer =
(WorkspaceInitializer)workspaceContainer.getComponentInstanceOfType(WorkspaceInitializer.class);
RepositoryCreationSynchronizer synchronizer =
(RepositoryCreationSynchronizer)getComponentInstanceOfType(RepositoryCreationSynchronizer.class);
// The synchronizer will be used to synchronize all the cluster
// nodes to prevent any concurrent jcr initialization i.e. EXOJCR-887
synchronizer.waitForApproval(wsInitializer.isWorkspaceInitialized());
SystemParametersPersistenceConfigurator sppc =
(SystemParametersPersistenceConfigurator)parent
.getComponentInstanceOfType(SystemParametersPersistenceConfigurator.class);
if (sppc != null)
{
setInitializerAndValidateOverriddenParameters(wsConfig, wsInitializer);
}
wsInitializer.initWorkspace();
}
public void setInitializerAndValidateOverriddenParameters(WorkspaceEntry workspaceEntry,
WorkspaceInitializer workspaceInitializer)
{
setInitializerForWorkspaceComponents(workspaceEntry, workspaceInitializer);
validateOverriddenParametersOfWorkspaceComponents(workspaceEntry);
}
private void setInitializerForWorkspaceComponents(WorkspaceEntry workspaceEntry,
WorkspaceInitializer workspaceInitializer)
{
for (ExtendedMappedParametrizedObjectEntry entry : getWorkspaceComponentEntries(workspaceEntry))
{
entry.getSystemParameterUpdater().setWorkspaceInitializer(workspaceInitializer);
}
}
private void validateOverriddenParametersOfWorkspaceComponents(WorkspaceEntry workspaceEntry)
{
for (ExtendedMappedParametrizedObjectEntry entry : getWorkspaceComponentEntries(workspaceEntry))
{
entry.getSystemParameterUpdater().validateOverriddenParameters();
}
}
// ////// initialize --------------
private void registerComponents() throws RepositoryConfigurationException, RepositoryException
{
SecurityHelper.doPrivilegedAction(new PrivilegedAction<Void>()
{
public Void run()
{
registerComponentInstance(config);
registerComponentImplementation(FileCleanerHolder.class);
registerComponentImplementation(LockRemoverHolder.class);
return null;
}
});
registerWorkspacesComponents();
registerRepositoryComponents();
}
private void registerRepositoryComponents() throws RepositoryConfigurationException, RepositoryException
{
try
{
SecurityHelper.doPrivilegedExceptionAction(new PrivilegedExceptionAction<Void>()
{
public Void run() throws RepositoryConfigurationException, RepositoryException
{
if (getComponentInstanceOfType(QuotaManager.class) != null)
{
registerComponentImplementation(RepositoryQuotaManager.class);
}
registerComponentImplementation(RepositorySuspendController.class);
registerComponentImplementation(RepositoryCheckController.class);
registerComponentImplementation(IdGenerator.class);
registerComponentImplementation(RepositoryIndexSearcherHolder.class);
registerComponentImplementation(LocationFactory.class);
registerComponentImplementation(ValueFactoryImpl.class);
registerComponentInstance(new AddNamespacePluginHolder(addNamespacePlugins));
registerComponentImplementation(JCRNodeTypeDataPersister.class);
registerComponentImplementation(NamespaceDataPersister.class);
registerComponentImplementation(NamespaceRegistryImpl.class);
registerComponentImplementation(NodeTypeManagerImpl.class);
registerComponentImplementation(NodeTypeDataManagerImpl.class);
registerComponentImplementation(DefaultAccessManagerImpl.class);
registerComponentImplementation(SessionRegistry.class);
String systemWsname = config.getSystemWorkspaceName();
WorkspaceEntry systemWsEntry = getWorkspaceEntry(systemWsname);
if (systemWsEntry != null && systemWsEntry.getQueryHandler() != null)
{
SystemSearchManager systemSearchManager =
(SystemSearchManager)getWorkspaceContainer(systemWsname).getComponentInstanceOfType(
SystemSearchManager.class);
registerComponentInstance(new SystemSearchManagerHolder(systemSearchManager));
}
try
{
final Class<?> authenticationPolicyClass =
ClassLoading.forName(config.getAuthenticationPolicy(), RepositoryContainer.class);
registerComponentImplementation(authenticationPolicyClass);
}
catch (ClassNotFoundException e)
{
throw new RepositoryConfigurationException("Class not found for repository authentication policy: "
+ e, e);
}
// Repository
final RepositoryImpl repository = new RepositoryImpl(RepositoryContainer.this);
registerComponentInstance(repository);
return null;
}
});
}
catch (PrivilegedActionException pae)
{
Throwable cause = pae.getCause();
if (cause instanceof RepositoryConfigurationException)
{
throw (RepositoryConfigurationException)cause;
}
else if (cause instanceof RepositoryException)
{
throw (RepositoryException)cause;
}
else
{
throw new RepositoryException(cause);
}
}
}
private void registerWorkspacesComponents() throws RepositoryException, RepositoryConfigurationException
{
// System workspace should be first initialized.
for (WorkspaceEntry we : config.getWorkspaceEntries())
{
if (we.getName().equals(config.getSystemWorkspaceName()))
{
registerWorkspace(we);
}
}
// Initialize other (non system) workspaces.
for (WorkspaceEntry we : config.getWorkspaceEntries())
{
if (!we.getName().equals(config.getSystemWorkspaceName()))
{
registerWorkspace(we);
}
}
}
/**
* Load namespaces and nodetypes from persistent repository.
*
* <p>
* Runs on container start.
*
* @throws RepositoryException
*/
private void load() throws RepositoryException
{
//Namespaces first
NamespaceDataPersister namespacePersister =
(NamespaceDataPersister)this.getComponentInstanceOfType(NamespaceDataPersister.class);
NamespaceRegistryImpl nsRegistry = (NamespaceRegistryImpl)getNamespaceRegistry();
namespacePersister.start();
nsRegistry.start();
//Node types now.
JCRNodeTypeDataPersister nodeTypePersister =
(JCRNodeTypeDataPersister)this.getComponentInstanceOfType(JCRNodeTypeDataPersister.class);
NodeTypeDataManagerImpl ntManager =
(NodeTypeDataManagerImpl)this.getComponentInstanceOfType(NodeTypeDataManagerImpl.class);
nodeTypePersister.start();
ntManager.start();
}
}