/*
* 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.FilterConfig;
import javax.servlet.ServletContext;
import org.apache.jackrabbit.commons.repository.RepositoryFactory;
/**
* Factory that looks up a repository from the context of a given filter.
* <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>
* <filter>
* <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>
* </filter>
* </pre>
*
* @since Apache Jackrabbit 1.6
*/
public class FilterRepositoryFactory implements RepositoryFactory {
/**
* Configuration of the filter whose context contains the repository.
*/
private final FilterConfig config;
/**
* Creates a factory for looking up a repository from the context
* associated with the given filter configuration.
*
* @param config filter configuration
*/
public FilterRepositoryFactory(FilterConfig config) {
this.config = config;
}
/**
* Looks up and returns a repository bound in the servlet context of
* the given filter.
*
* @return repository from servlet context
* @throws RepositoryException if the repository is not available
*/
public Repository getRepository() throws RepositoryException {
String name = config.getInitParameter(Repository.class.getName());
if (name == null) {
name = Repository.class.getName();
}
ServletContext context = config.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());
}
}
}