blob: bca431a168782589b9b4d5fb08db09ddf0257640 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005-2007 Cognos Incorporated, IBM Corporation and others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Cognos Incorporated - initial API and implementation
* IBM Corporation - bug fixes and enhancements
*******************************************************************************/
package org.eclipse.equinox.http.servlet.internal;
import java.io.*;
import java.lang.reflect.Method;
import java.net.URL;
import java.security.*;
import java.util.*;
import javax.servlet.*;
import org.osgi.service.http.HttpContext;
public class ServletContextAdaptor implements ServletContext {
private ServletContext servletContext;
HttpContext httpContext;
private AccessControlContext acc;
private ProxyContext proxyContext;
public ServletContextAdaptor(ProxyContext proxyContext, ServletContext servletContext, HttpContext httpContext, AccessControlContext acc) {
this.servletContext = servletContext;
this.httpContext = httpContext;
this.acc = acc;
this.proxyContext = proxyContext;
}
/**
* @see javax.servlet.ServletContext#getResourcePaths(java.lang.String)
*
* This method was added in the Servlet 2.3 API however the OSGi HttpService currently does not provide
* support for this method in the HttpContext interface. To support "getResourcePaths(...) this
* implementation uses reflection to check for and then call the associated HttpContext.getResourcePaths(...)
* method opportunistically. Null is returned if the method is not present or fails.
*/
public Set getResourcePaths(String name) {
if (name == null || !name.startsWith("/")) //$NON-NLS-1$
return null;
try {
Method getResourcePathsMethod = httpContext.getClass().getMethod("getResourcePaths", new Class[] {String.class}); //$NON-NLS-1$
if (!getResourcePathsMethod.isAccessible())
getResourcePathsMethod.setAccessible(true);
return (Set) getResourcePathsMethod.invoke(httpContext, new Object[] {name});
} catch (Exception e) {
// ignore
}
return null;
}
public Object getAttribute(String attributeName) {
Dictionary attributes = proxyContext.getContextAttributes(httpContext);
return attributes.get(attributeName);
}
public Enumeration getAttributeNames() {
Dictionary attributes = proxyContext.getContextAttributes(httpContext);
return attributes.keys();
}
public void setAttribute(String attributeName, Object attributeValue) {
Dictionary attributes = proxyContext.getContextAttributes(httpContext);
attributes.put(attributeName, attributeValue);
}
public void removeAttribute(String attributeName) {
Dictionary attributes = proxyContext.getContextAttributes(httpContext);
attributes.remove(attributeName);
}
public String getMimeType(String name) {
String mimeType = httpContext.getMimeType(name);
return (mimeType != null) ? mimeType : servletContext.getMimeType(name);
}
public URL getResource(final String name) {
try {
return (URL) AccessController.doPrivileged(new PrivilegedExceptionAction() {
public Object run() throws Exception {
return httpContext.getResource(name);
}
}, acc);
} catch (PrivilegedActionException e) {
log(e.getException().getMessage(), e.getException());
}
return null;
}
public InputStream getResourceAsStream(String name) {
URL url = getResource(name);
if (url != null) {
try {
return url.openStream();
} catch (IOException e) {
log("Error opening stream for resource '" + name + "'", e); //$NON-NLS-1$ //$NON-NLS-2$
}
}
return null;
}
public ServletContext getContext(String arg0) {
return servletContext.getContext(arg0);
}
public String getInitParameter(String arg0) {
return servletContext.getInitParameter(arg0);
}
public Enumeration getInitParameterNames() {
return servletContext.getInitParameterNames();
}
public int getMajorVersion() {
return servletContext.getMajorVersion();
}
public int getMinorVersion() {
return servletContext.getMinorVersion();
}
public RequestDispatcher getNamedDispatcher(String arg0) {
return new RequestDispatcherAdaptor(servletContext.getNamedDispatcher(arg0));
}
public String getRealPath(String arg0) {
return servletContext.getRealPath(arg0);
}
public RequestDispatcher getRequestDispatcher(String arg0) {
return new RequestDispatcherAdaptor(servletContext.getRequestDispatcher(proxyContext.getServletPath() + arg0));
}
public String getServerInfo() {
return servletContext.getServerInfo();
}
/**@deprecated*/
public Servlet getServlet(String arg0) throws ServletException {
return servletContext.getServlet(arg0);
}
public String getServletContextName() {
return servletContext.getServletContextName();
}
/**@deprecated*/
public Enumeration getServletNames() {
return servletContext.getServletNames();
}
/**@deprecated*/
public Enumeration getServlets() {
return servletContext.getServlets();
}
/**@deprecated*/
public void log(Exception arg0, String arg1) {
servletContext.log(arg0, arg1);
}
public void log(String arg0, Throwable arg1) {
servletContext.log(arg0, arg1);
}
public void log(String arg0) {
servletContext.log(arg0);
}
// Added in Servlet 2.5
public String getContextPath() {
try {
Method getContextPathMethod = servletContext.getClass().getMethod("getContextPath", null); //$NON-NLS-1$
return (String) getContextPathMethod.invoke(servletContext, null) + proxyContext.getServletPath();
} catch (Exception e) {
// ignore
}
return null;
}
}