|
What this is
Other links
The source code/* * Copyright 1999-2004 The Apache Sofware Foundation. * * Licensed 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.tomcat.core; import org.apache.tomcat.util.hooks.Hooks; import java.util.Hashtable; import java.util.Enumeration; // XXX better names: Location, URLPattern, /** * A group of resources, with some common properties. * Container is similar with Apache "dir_conf" structue. * * Each Context has a default Container and one container for * each URL property ( mapping handlers and security constraints ). * * The ContextManager has a defaultContainer containing global * properties. * * Each time a container is added to a Context, addContainer() hook is * called to notify all modules of a new URL property. * * Modules that implement contextMap/requestMap and security constraints * ( authenticate/authorize hooks ) will construct specialized data * structures. * You can associate trees, hashtables or other data types with the * context using notes - no application/module should assume any * particular structure is in used, the user can choose any mapper. * See SimpleMapper1 for an example of such structures. * * A container will be selected by best-matching a request using the * alghoritms described in the servlet API. */ public class Container implements Cloneable{ /* It is not yet finalized - it is possible to use more * "rules" for matching ( if future APIs will define that ). * You can use notes or attributes to extend the model - * the attributes that are defined and have get/set methods * are the one defined in the API and with wide use. */ // The "controler" private ContextManager contextM; // The webapp including this container, if any private Context context; // The type of the mapping public static final int UNKNOWN_MAP=0; public static final int PATH_MAP=1; public static final int PREFIX_MAP=2; public static final int EXTENSION_MAP=3; public static final int DEFAULT_MAP=4; private int mapType=0; // Common map parameters ( path prefix, ext, etc) private String transport; private String path; private String proto; private String vhosts[]; // Container attributes - it's better to use // notes, as the access time is much smaller private Hashtable attributes = new Hashtable(); /** The handler associated with this container. */ private Handler handler; private String handlerName; /** Security constraints associated with this Container */ private String roles[]=null; private String methods[]=null; private boolean special=false; public Container() { initHooks(); } /** Get the context manager */ public ContextManager getContextManager() { if( contextM==null && context==null ) { /* assert */ throw new RuntimeException( "Assert: container.contextM==null" ); } if( contextM==null ) contextM=context.getContextManager(); return contextM; } public void setContextManager(ContextManager cm) { contextM=cm; } /** Set the context, if this container is part of a web application. * Right now all container in use have a context. */ public void setContext( Context ctx ) { this.context=ctx; } /** The parent web application, if any. */ public Context getContext() { return context; } public void setSpecial( boolean b ) { special=b; } public boolean isSpecial() { return special; } // -------------------- Mapping LHS -------------------- /** Return the type of the mapping ( extension, prefix, default, etc) */ public int getMapType() { if( mapType!=0) return mapType; // What happens with "" or null ? // XXX Which one is default servlet ? API doesn't say, // but people expect it to work. if( path==null || path.equals("" ) || path.equals( "/")) { mapType=DEFAULT_MAP; } else if (path.startsWith("/") && path.endsWith("/*")) { mapType=PREFIX_MAP; } else if (path.startsWith("*.")) { mapType=EXTENSION_MAP; } else { mapType=PATH_MAP; } return mapType; } /** The mapping string that creates this Container. * Not that this is an un-parsed string, like a regexp. */ public void setPath( String path ) { // XXX use a better name - setMapping for example if( path==null) this.path=""; // default mapping else this.path=path.trim(); } /** Return the path */ public String getPath() { return path; } /** Set the protocol - if it's set it will be used * in mapping */ public void setProtocol( String protocol ) { this.proto=protocol; } /** Protocol matching. With Servlet 2.2 the protocol * can be used only with security mappings, not with * handler ( servlet ) maps */ public String getProtocol() { return proto; } /** The transport - another component of the matching. * Defined only for security mappings. */ public void setTransport(String transport ) { this.transport=transport; } /** The transport - another component of the matching. * Defined only for security mappings. */ public String getTransport() { return transport; } /** Any alias that can match a particular vhost */ public String[] getVhosts() { return vhosts; } /** Any alias that can match a particular vhost */ public void setVhosts(String vhosts[]) { this.vhosts=vhosts; } /** If not null, this container can only be accessed by users * in roles. */ public String []getMethods() { return methods; } /** If not null, this container can only be accessed by users in roles. */ public void setMethods( String m[] ) { this.methods=m; } // -------------------- Mapping RHS -------------------- public Handler getHandler() { return handler; } /** The handler ( servlet ) for this container */ public void setHandler(Handler h) { handler=h; } public void setHandlerName(String hn) { handlerName=hn; } /** The handler name for this container. * @return null if no handler is defined for this * container ( this container defines only * security or other type of properties, but * not a handler ) */ public String getHandlerName() { if( handlerName != null ) return handlerName; if( handler != null ) return handler.getName(); return null; } /** If not null, this container can only be accessed by users * in roles. */ public String []getRoles() { return roles; } /** If not null, this container can only be accessed by users in roles. */ public void setRoles( String roles[] ) { this.roles=roles; } /** Per container attributes. Not used - can be removed * ( it's here for analogy with the other components ) */ public Object getAttribute(String name) { return attributes.get(name); } /** Per container attributes. Not used - can be removed * ( it's here for analogy with the other components ) */ public Enumeration getAttributeNames() { return attributes.keys(); } /** Per container attributes. Not used - can be removed * ( it's here for analogy with the other components ) */ public void setAttribute(String name, Object object) { attributes.put(name, object); } /** Per container attributes. Not used - can be removed * ( it's here for analogy with the other components ) */ public void removeAttribute(String name) { attributes.remove(name); } // -------------------- Utils -------------------- /** Print a short string describing the mapping */ public String toString() { StringBuffer sb=new StringBuffer(); sb.append( "Ct (" ); sb.append(path ).append( " " ); if( handler!= null) sb.append( handler.toString() ); if( roles!=null) { sb.append(" Roles: "); for( int i=0; i< roles.length; i++ ) sb.append(" ").append( roles[i]); } sb.append( " )"); return sb.toString(); } public Container getClone() { try { return (Container)this.clone(); } catch( CloneNotSupportedException ex ) { return this; } } // -------------------- Per-Container "notes" Object notes[]=new Object[ContextManager.MAX_NOTES]; /** See ContextManager comments. */ public final void setNote( int pos, Object value ) { notes[pos]=value; } public final Object getNote( int pos ) { return notes[pos]; } public Object getNote( String name ) throws TomcatException { int id=getContextManager().getNoteId( ContextManager.CONTAINER_NOTE, name ); return getNote( id ); } public void setNote( String name, Object value ) throws TomcatException { int id=getContextManager().getNoteId( ContextManager.CONTAINER_NOTE, name ); setNote( id, value ); } // -------------------- Interceptors -------------------- public static final int H_postReadRequest=0; public static final int H_requestMap=1; public static final int H_contextMap=2; public static final int H_authenticate=3; public static final int H_authorize=4; public static final int H_preService=5; public static final int H_beforeBody=6; public static final int H_findSession=7; public static final int H_sessionState=8; public static final int H_beforeCommit=9; public static final int H_afterBody=10; public static final int H_postService=11; public static final int H_postRequest=12; public static final int H_handleError=13; public static final int H_getInfo=14; public static final int H_setInfo=15; public static final int H_engineInit=16; public static final int H_preInitCheck=17; public static final int H_postInitCheck=18; public static final int H_copyContext=19; public static final int H_COUNT=20; private Hooks hooks=new Hooks(); private BaseInterceptor hooksCache[][]=null; private BaseInterceptor allHooksCache[]=null; private void initHooks() { hooks.registerHook( "postReadRequest", H_postReadRequest ); hooks.registerHook( "requestMap", H_requestMap ); hooks.registerHook( "contextMap", H_contextMap ); hooks.registerHook( "authenticate", H_authenticate ); hooks.registerHook( "authorize", H_authorize ); hooks.registerHook( "preService", H_preService ); hooks.registerHook( "beforeBody", H_beforeBody ); hooks.registerHook( "findSession", H_findSession ); hooks.registerHook( "sessionState", H_sessionState ); hooks.registerHook( "beforeCommit", H_beforeCommit ); hooks.registerHook( "afterBody", H_afterBody ); hooks.registerHook( "postService", H_postService ); hooks.registerHook( "postRequest", H_postRequest ); hooks.registerHook( "handleError", H_handleError ); hooks.registerHook( "getInfo", H_getInfo ); hooks.registerHook( "setInfo", H_setInfo ); hooks.registerHook( "engineInit", H_engineInit ); hooks.registerHook( "preInitCheck", H_preInitCheck ); hooks.registerHook( "postInitCheck", H_postInitCheck ); hooks.registerHook( "copyContext", H_copyContext ); } public Hooks getHooks() { return hooks; } /** Add the interceptor to all the hook chains it's interested * in */ public void addInterceptor( BaseInterceptor bi ) { bi.setContext( getContext() ); int status=bi.registerHooks( hooks, contextM, context ); if( status!=BaseInterceptor.OK ) { hooks.addModule( bi ); } hooksCache=null; allHooksCache=null; } public void removeInterceptor( BaseInterceptor bi ) { hooks.removeModule( bi ); hooksCache=null; allHooksCache=null; } public BaseInterceptor[] getInterceptors( int type ) { if( hooksCache != null ) { if( hooksCache[type] == null ) { Container gContainer = getContextManager().getContainer(); Hooks gHooks = gContainer.getHooks(); if( this != gContainer ) { hooksCache[type] = mergeHooks(gHooks.getModules(type), getHooks().getModules(type)); } else { hooksCache[type] = mergeHooks(gHooks.getModules(type), null); } } return hooksCache[type]; } // load the cache with all the hooks Container globalIntContainer=getContextManager().getContainer(); Hooks globals=globalIntContainer.getHooks(); hooksCache=new BaseInterceptor[H_COUNT][]; for( int i=0; i |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.