/*
* Copyright 2012 The Solmix Project
*
* 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 may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.gnu.org/licenses/
* or see the FSF site: http://www.fsf.org.
*/
package org.solmix.fmk.engine.internal;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Collections;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Set;
import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceRegistration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.solmix.fmk.engine.MainServlet;
import org.solmix.fmk.engine.internal.helper.ExternalServletContextWrapper;
import org.solmix.fmk.engine.internal.request.SlxRequestDispatcher;
/**
*
* @author Administrator
* @version 110035 2012-4-16
*/
@SuppressWarnings("rawtypes")
public class SlxServletContext implements ServletContext
{
/** default log */
private final Logger log = LoggerFactory.getLogger(getClass());
/**
* The service registration of this service as ServletContext
*
* @see #dispose()
*/
private final ServiceRegistration registration;
private final MainServlet mainServlet;
public SlxServletContext(final BundleContext bundleContext, MainServlet servlet)
{
this.mainServlet = servlet;
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(Constants.SERVICE_PID, getClass().getName());
props.put(Constants.SERVICE_DESCRIPTION, "Solmix ServletContext");
registration = bundleContext.registerService(ServletContext.class.getName(), this, props);
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#getContext(java.lang.String)
*/
@Override
public ServletContext getContext(String uripath) {
ServletContext delegatee = getServletContext();
if (delegatee != null) {
ServletContext otherContext = delegatee.getContext(uripath);
if (otherContext != null && otherContext != delegatee) {
return new ExternalServletContextWrapper(otherContext);
}
}
return null;
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#getContextPath()
*/
@Override
public String getContextPath() {
ServletContext delegatee = getServletContext();
if (delegatee != null) {
try {
return (String) delegatee.getClass().getMethod("getContextPath", (Class<?>[]) null).invoke(getServletContext(), (Object[]) null);
} catch (Throwable ignore) {
}
}
return null;
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#getMajorVersion()
*/
@Override
public int getMajorVersion() {
ServletContext delegatee = getServletContext();
if (delegatee != null) {
return delegatee.getMajorVersion();
}
return 2; // hard coded major version as fall back
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#getMinorVersion()
*/
@Override
public int getMinorVersion() {
ServletContext delegatee = getServletContext();
if (delegatee != null) {
return delegatee.getMinorVersion();
}
return 4; // hard coded minor version as fall back
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#getMimeType(java.lang.String)
*/
@Override
public String getMimeType(String file) {
ServletContext delegatee = getServletContext();
if (delegatee != null) {
return delegatee.getMimeType(file);
}
return null;
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#getResourcePaths(java.lang.String)
*/
@Override
public Set getResourcePaths(String path) {
ServletContext delegatee = getServletContext();
if (delegatee != null) {
return delegatee.getResourcePaths(path);
}
return null;
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#getResource(java.lang.String)
*/
@Override
public URL getResource(String path) throws MalformedURLException {
ServletContext delegatee = getServletContext();
if (delegatee != null) {
return delegatee.getResource(path);
}
return null;
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#getResourceAsStream(java.lang.String)
*/
@Override
public InputStream getResourceAsStream(String path) {
ServletContext delegatee = getServletContext();
if (delegatee != null) {
return delegatee.getResourceAsStream(path);
}
return null;
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#getRequestDispatcher(java.lang.String)
*/
@Override
public RequestDispatcher getRequestDispatcher(String path) {
if (path == null) {
log.error("getRequestDispatcher: No path, cannot create request dispatcher");
return null;
}
return new SlxRequestDispatcher(path);
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#getNamedDispatcher(java.lang.String)
*/
@Override
public RequestDispatcher getNamedDispatcher(String name) {
ServletContext delegatee = getServletContext();
if (delegatee != null) {
return delegatee.getNamedDispatcher(name);
}
return null;
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#getServlet(java.lang.String)
*/
@Deprecated
@Override
public Servlet getServlet(String name) throws ServletException {
return null;
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#getServlets()
*/
@Deprecated
@Override
public Enumeration getServlets() {
return Collections.enumeration(Collections.emptyList());
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#getServletNames()
*/
@Deprecated
@Override
public Enumeration getServletNames() {
return Collections.enumeration(Collections.emptyList());
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#log(java.lang.String)
*/
@Override
public void log(String msg) {
log.info(msg);
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#log(java.lang.Exception, java.lang.String)
*/
@Deprecated
@Override
public void log(Exception exception, String msg) {
log(msg, exception);
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#log(java.lang.String, java.lang.Throwable)
*/
@Override
public void log(String message, Throwable throwable) {
log.error(message, throwable);
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#getRealPath(java.lang.String)
*/
@Override
public String getRealPath(String path) {
ServletContext delegatee = getServletContext();
if (delegatee != null) {
return delegatee.getRealPath(path);
}
return null;
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#getServerInfo()
*/
@Override
public String getServerInfo() {
return mainServlet.getServerInfo();
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#getInitParameter(java.lang.String)
*/
@Override
public String getInitParameter(String name) {
ServletContext delegatee = getServletContext();
if (delegatee != null) {
return delegatee.getInitParameter(name);
}
return null;
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#getInitParameterNames()
*/
@SuppressWarnings("unchecked")
@Override
public Enumeration<String> getInitParameterNames() {
ServletContext delegatee = getServletContext();
if (delegatee != null) {
return delegatee.getInitParameterNames();
}
return null;
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#getAttribute(java.lang.String)
*/
@Override
public Object getAttribute(String name) {
ServletContext delegatee = getServletContext();
if (delegatee != null) {
return delegatee.getAttribute(name);
}
return null;
}
@SuppressWarnings("unchecked")
@Override
public Enumeration<String> getAttributeNames() {
ServletContext delegatee = getServletContext();
if (delegatee != null) {
return delegatee.getAttributeNames();
}
return Collections.enumeration(Collections.<String> emptyList());
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#setAttribute(java.lang.String, java.lang.Object)
*/
@Override
public void setAttribute(String name, Object object) {
ServletContext delegatee = getServletContext();
if (delegatee != null) {
delegatee.setAttribute(name, object);
}
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#removeAttribute(java.lang.String)
*/
@Override
public void removeAttribute(String name) {
ServletContext delegatee = getServletContext();
if (delegatee != null) {
delegatee.removeAttribute(name);
}
}
/**
* {@inheritDoc}
*
* @see javax.servlet.ServletContext#getServletContextName()
*/
@Override
public String getServletContextName() {
ServletContext delegatee = getServletContext();
if (delegatee != null) {
return delegatee.getServletContextName();
}
return null;
}
/**
* unregister registed service.
*/
public void dispose() {
if (registration != null) {
registration.unregister();
}
}
// ---------- internal -----------------------------------------------------
/**
* Returns the real servlet context of the servlet container in which the Sling Servlet is running.
*/
private ServletContext getServletContext() {
return mainServlet.getServletContext();
}
}