public class Context implements ServletContext, ServletConfig
{
protected Hashtable MIME; //
MIME-Types
protected Hashtable Servlets; //
geladene Servlets nach Namen
protected Hashtable ServletParam; //
Init-Parameter der Servlets,
// noch nicht benutzt
protected String Docroot, Servletroot, Index;
protected static String ServletAlias = "/servlet";
public Context(Hashtable map, Hashtable mime,
String docroot, String index)
{
MIME = mime;
Servlets = new Hashtable();
ServletParam = new Hashtable(); //
bleibt leer
Docroot = docroot;
Servletroot = servletroot;
Index = index;
getServlet("DefaultServlet");
}
public String GetServletName(String uri)
{ // sucht den Namen des Servlet zu
einer URI
if (uri.startsWith(ServletAlias))
// ein Servlet
{
String servlet = uri.substring(
ServletAlias.length()+1, uri.length());
if (servlet.indexOf("/",1) > 0) //
mit PATH_INFO
return servlet.substring(0,servlet.indexOf("/",1));
else // ohne PATH_INFO
return servlet;
}
else return "DefaultServlet";
}
public Servlet GetServletForURI(String
uri) throws ServletException
{ // gibt das Servlet fuer eine URI
zurueck, nie null
return getServlet(GetServletName(uri));
}
public Servlet getServlet(String name) throws ServletException
{ // gibt das Servlet mit dem Namen
zurueck
Servlet serv = (Servlet)Servlets.get(name);
if (serv == null)
{ // wenn noetig Servlet laden und
initialisieren
Class c;
try
{
c = Class.forName(name); //
die Klassen holen
serv = (Servlet)c.newInstance();//
eine Instanz erzeugen
serv.init(this); //
Initialisieren
}
catch (Exception e)
{ // im Zweifel DefaultServlet
serv = (Servlet)Servlets.get("DefaultServlet");
if (serv == null)
throw new ServletException(name);
}
Servlets.put(name, serv); //
in den Hashtable einfuegen
}
return serv;
}
public Enumeration getServlets()
{ // wegen Interface ServletContext
return Servlets.elements();
}
public void log(String msg)
{ // wegen Interface ServletContext
System.out.println(msg);
}
public String getRealPath(String
path)
{ // gibt den absoluten Pfad zu dem
virtuellen path zurueck
String real = Docroot + "/" + Index;
if (path.indexOf("..") > -1 )
{ // Abwehren eines Angriffs
mittels ".."
log("Angriff: " + path);
}
else
{
if (path.startsWith(ServletAlias))
// ein Servlet
{
return Servletroot + "/" + GetServletName(path);
}
else // kein Servlet
{
if (path.endsWith("/")) //
evt. Indexfile anhaengen
real = Docroot + path + Index;
else
real = Docroot + path;
}
}
return real;
}
public String getMimeType(String
file)
{ // erraet den MIME-Type anhand der
Dateinamen-Endung
if (file.lastIndexOf(".") < 0) return "text/plain";
else
{
String mime = (String)MIME.get(
file.substring(file.lastIndexOf(".")+1, file.length()));
if (mime != null)
return mime;
else return "text/plain";
}
}
public String getServerInfo()
{ // wegen Interface ServletContext
return "ServletHttp/1.1";
}
public Object getAttribute(String name)
{ return null; } // wegen Interface
ServletConfig
public ServletContext getServletContext()
{ return this; } // wegen Interface
ServletConfig
public String getInitParameter(String name)
{ // wegen Interface ServletConfig
return (String) ServletParam.get(name);
}
public Enumeration getInitParameterNames()
{ // wegen Interface ServletConfig
return ServletParam.keys();
}
public String GetPathInfo(String path)
{ // gibt bei Servlets den Wert fuer
// PATH_INFO zurueck
if (path.startsWith(ServletAlias))
{
int i = ServletAlias.length()+2;
if (path.indexOf("/",i) > 0)
{
return path.substring(path.indexOf("/",i),
path.length());
}
else
return "";
}
return getRealPath(path);
}
public String GetServletPath(String path)
{ // gibt bei Servlets den Wert fuer
// PATH_INFO zurueck
if (path.startsWith(ServletAlias))
{
int i = ServletAlias.length()+2;
if (path.indexOf("/",i) > 0)
return path.substring(0, path.indexOf("/",i));
else
return path;
}
return path;
}
}