/*
* 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.servlet;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletContext;
import org.apache.jackrabbit.commons.repository.RepositoryFactory;
/**
* Factory that looks up a repository from the context of a given servlet.
* <p>
* The default name of the repository attribute is
* "<code>javax.jcr.Repository</code>", but it can be changed by specifying
* an init parameter with the same name:
* <pre>
* <servlet>
* <init-param>
* <param-name>javax.jcr.Repository</param-name>
* <param-value>my.repository.attribute</param-value>
* <description>
* This init parameter causes the repository to be looked up from
* the "my.repository.attribute" attribute instead of the default
* "javax.jcr.Repository".
* </description>
* </init-param>
* </servlet>
* </pre>
*
* @since 1.4
*/
public class ServletRepositoryFactory implements RepositoryFactory {
/**
* The servlet whose context contains the repository.
*/
private final GenericServlet servlet;
/**
* Creates a factory for looking up a repository from the context of
* the given servlet.
*
* @param servlet servlet whose context contains the repository
*/
public ServletRepositoryFactory(GenericServlet servlet) {
this.servlet = servlet;
}
/**
* Looks up and returns a repository bound in the configured servlet
* context attribute.
*
* @return repository from servlet context
* @throws RepositoryException if the repository is not available
*/
public Repository getRepository() throws RepositoryException {
String name = servlet.getInitParameter(Repository.class.getName());
if (name == null) {
name = Repository.class.getName();
}
ServletContext context = servlet.getServletContext();
Object repository = context.getAttribute(name);
if (repository instanceof Repository) {
return (Repository) repository;
} else if (repository != null) {
throw new RepositoryException(
"Invalid repository: Attribute " + name
+ " in servlet context " + context.getServletContextName()
+ " is an instance of " + repository.getClass().getName());
} else {
throw new RepositoryException(
"Repository not found: Attribute " + name
+ " does not exist in servlet context "
+ context.getServletContextName());
}
}
}