/*
* 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.session;
import javax.jcr.NamespaceException;
import javax.jcr.RepositoryException;
import javax.jcr.ValueFactory;
import org.apache.jackrabbit.core.HierarchyManager;
import org.apache.jackrabbit.core.ItemManager;
import org.apache.jackrabbit.core.ItemValidator;
import org.apache.jackrabbit.core.RepositoryContext;
import org.apache.jackrabbit.core.RepositoryImpl;
import org.apache.jackrabbit.core.SessionImpl;
import org.apache.jackrabbit.core.WorkspaceImpl;
import org.apache.jackrabbit.core.config.WorkspaceConfig;
import org.apache.jackrabbit.core.data.DataStore;
import org.apache.jackrabbit.core.id.NodeId;
import org.apache.jackrabbit.core.nodetype.NodeTypeManagerImpl;
import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
import org.apache.jackrabbit.core.observation.ObservationManagerImpl;
import org.apache.jackrabbit.core.security.AccessManager;
import org.apache.jackrabbit.core.security.JackrabbitSecurityManager;
import org.apache.jackrabbit.core.state.SessionItemStateManager;
import org.apache.jackrabbit.core.value.ValueFactoryImpl;
import org.apache.jackrabbit.spi.Name;
import org.apache.jackrabbit.spi.Path;
import org.apache.jackrabbit.spi.commons.conversion.IllegalNameException;
import org.apache.jackrabbit.spi.commons.conversion.MalformedPathException;
import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
/**
* Component context of a session. This class keeps track of the internal
* components associated with a session.
*/
public class SessionContext implements NamePathResolver {
/**
* The repository context of this session.
*/
private final RepositoryContext repositoryContext;
/**
* This session.
*/
private final SessionImpl session;
/**
* The state of this session.
*/
private final SessionState state;
/**
* The value factory of this session
*/
private final ValueFactory valueFactory;
/**
* The item validator of this session
*/
private final ItemValidator itemValidator;
/**
* Node type manager of this session
*/
private final NodeTypeManagerImpl nodeTypeManager;
/**
* The workspace of this session
*/
private final WorkspaceImpl workspace;
/**
* The item state manager of this session
*/
private volatile SessionItemStateManager itemStateManager;
/**
* The item manager of this session
*/
private volatile ItemManager itemManager;
/**
* The access manager of this session
*/
private volatile AccessManager accessManager;
/**
* The observation manager of this session.
*/
private volatile ObservationManagerImpl observationManager;
/**
* Creates a component context for the given session.
*
* @param repositoryContext repository context of the session
* @param session the session
* @param workspaceConfig workspace configuration
* @throws RepositoryException if the workspace can not be accessed
*/
public SessionContext(
RepositoryContext repositoryContext, SessionImpl session,
WorkspaceConfig workspaceConfig) throws RepositoryException {
assert repositoryContext != null;
assert session != null;
this.repositoryContext = repositoryContext;
this.session = session;
this.state = new SessionState(this);
this.valueFactory =
new ValueFactoryImpl(session, repositoryContext.getDataStore());
this.itemValidator = new ItemValidator(this);
this.nodeTypeManager = new NodeTypeManagerImpl(this);
this.workspace = new WorkspaceImpl(this, workspaceConfig);
}
//-------------------------------------------< per-repository components >
/**
* Returns the repository context of the session.
*
* @return repository context
*/
public RepositoryContext getRepositoryContext() {
return repositoryContext;
}
/**
* Returns this repository.
*
* @return repository
*/
public RepositoryImpl getRepository() {
return repositoryContext.getRepository();
}
/**
* Returns the root node identifier of the repository.
*
* @return root node identifier
*/
public NodeId getRootNodeId() {
return repositoryContext.getRootNodeId();
}
/**
* Returns the data store of this repository, or <code>null</code>
* if a data store is not configured.
*
* @return data store, or <code>null</code>
*/
public DataStore getDataStore() {
return repositoryContext.getDataStore();
}
/**
* Returns the node type registry of this repository.
*
* @return node type registry
*/
public NodeTypeRegistry getNodeTypeRegistry() {
return repositoryContext.getNodeTypeRegistry();
}
/**
* Returns the security manager of this repository.
*
* @return security manager
*/
public JackrabbitSecurityManager getSecurityManager() {
return repositoryContext.getSecurityManager();
}
//----------------------------------------------< per-session components >
/**
* Returns this session.
*
* @return session
*/
public SessionImpl getSessionImpl() {
return session;
}
/**
* Returns the state of this session.
*
* @return session state
*/
public SessionState getSessionState() {
return state;
}
/**
* Returns the value factory of this session.
*
* @return value factory
*/
public ValueFactory getValueFactory() {
return valueFactory;
}
/**
* Returns the item validator of this session.
*
* @return item validator
*/
public ItemValidator getItemValidator() {
return itemValidator;
}
/**
* Returns the node type manager of this session.
*
* @return node type manager
*/
public NodeTypeManagerImpl getNodeTypeManager() {
return nodeTypeManager;
}
/**
* Returns the workspace of this session.
*
* @return workspace
*/
public WorkspaceImpl getWorkspace() {
return workspace;
}
public SessionItemStateManager getItemStateManager() {
assert itemStateManager != null;
return itemStateManager;
}
public void setItemStateManager(SessionItemStateManager itemStateManager) {
assert itemStateManager != null;
this.itemStateManager = itemStateManager;
}
public HierarchyManager getHierarchyManager() {
assert itemStateManager != null;
return itemStateManager.getHierarchyMgr();
}
public ItemManager getItemManager() {
assert itemManager != null;
return itemManager;
}
public void setItemManager(ItemManager itemManager) {
assert itemManager != null;
this.itemManager = itemManager;
}
public AccessManager getAccessManager() {
assert accessManager != null;
return accessManager;
}
public void setAccessManager(AccessManager accessManager) {
assert accessManager != null;
this.accessManager = accessManager;
}
public ObservationManagerImpl getObservationManager() {
assert observationManager != null;
return observationManager;
}
public void setObservationManager(
ObservationManagerImpl observationManager) {
assert observationManager != null;
this.observationManager = observationManager;
}
//--------------------------------------------------------< NameResolver >
public Name getQName(String name)
throws IllegalNameException, NamespaceException {
return session.getQName(name);
}
public String getJCRName(Name name) throws NamespaceException {
return session.getJCRName(name);
}
//--------------------------------------------------------< PathResolver >
public Path getQPath(String path)
throws MalformedPathException, IllegalNameException,
NamespaceException {
return session.getQPath(path);
}
public Path getQPath(String path, boolean normalizeIdentifier)
throws MalformedPathException, IllegalNameException,
NamespaceException {
return session.getQPath(path, normalizeIdentifier);
}
public String getJCRPath(Path path) throws NamespaceException {
return session.getJCRPath(path);
}
//--------------------------------------------------------------< Object >
/**
* Dumps the session internals to a string.
*
* @return string representation of session internals
*/
@Override
public String toString() {
return session + ":\n" + itemManager + "\n" + itemStateManager;
}
}