📄 servletholder.java
字号:
// ========================================================================// Copyright 199-2004 Mort Bay Consulting Pty. Ltd.// ------------------------------------------------------------------------// 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.mortbay.jetty.servlet;import java.io.IOException;import java.security.Principal;import java.util.Enumeration;import java.util.HashMap;import java.util.Map;import java.util.Stack;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.SingleThreadModel;import javax.servlet.UnavailableException;import org.mortbay.jetty.HttpConnection;import org.mortbay.jetty.Request;import org.mortbay.jetty.handler.ContextHandler;import org.mortbay.jetty.security.SecurityHandler;import org.mortbay.jetty.security.UserRealm;import org.mortbay.log.Log;/* --------------------------------------------------------------------- *//** Servlet Instance and Context Holder. * Holds the name, params and some state of a javax.servlet.Servlet * instance. It implements the ServletConfig interface. * This class will organise the loading of the servlet when needed or * requested. * * @author Greg Wilkins */public class ServletHolder extends Holder implements Comparable{ /* ---------------------------------------------------------------- */ private int _initOrder; private boolean _initOnStartup=false; private Map _roleMap; private String _forcedPath; private String _runAs; private UserRealm _realm; private transient Servlet _servlet; private transient Config _config; private transient long _unavailable; private transient UnavailableException _unavailableEx; /* ---------------------------------------------------------------- */ /** Constructor . */ public ServletHolder() {} /* ---------------------------------------------------------------- */ /** Constructor for existing servlet. */ public ServletHolder(Servlet servlet) { setServlet(servlet); } /* ---------------------------------------------------------------- */ /** Constructor for existing servlet. */ public ServletHolder(Class servlet) { super(servlet); } /* ---------------------------------------------------------------- */ /** * @return The unavailable exception or null if not unavailable */ public UnavailableException getUnavailableException() { return _unavailableEx; } /* ------------------------------------------------------------ */ public synchronized void setServlet(Servlet servlet) { if (servlet==null || servlet instanceof SingleThreadModel) throw new IllegalArgumentException(); _extInstance=true; _servlet=servlet; setHeldClass(servlet.getClass()); if (getName()==null) setName(servlet.getClass().getName()+"-"+super.hashCode()); } /* ------------------------------------------------------------ */ public int getInitOrder() { return _initOrder; } /* ------------------------------------------------------------ */ /** Set the initialize order. * Holders with order<0, are initialized on use. Those with * order>=0 are initialized in increasing order when the handler * is started. */ public void setInitOrder(int order) { _initOnStartup=true; _initOrder = order; } /* ------------------------------------------------------------ */ /** Comparitor by init order. */ public int compareTo(Object o) { if (o instanceof ServletHolder) { ServletHolder sh= (ServletHolder)o; if (sh==this) return 0; if (sh._initOrder<_initOrder) return 1; if (sh._initOrder>_initOrder) return -1; int c=(_className!=null && sh._className!=null)?_className.compareTo(sh._className):0; if (c==0) c=_name.compareTo(sh._name); if (c==0) c=this.hashCode()>o.hashCode()?1:-1; return c; } return 1; } /* ------------------------------------------------------------ */ public boolean equals(Object o) { return compareTo(o)==0; } /* ------------------------------------------------------------ */ public int hashCode() { return _name==null?System.identityHashCode(this):_name.hashCode(); } /* ------------------------------------------------------------ */ /** Link a user role. * Translate the role name used by a servlet, to the link name * used by the container. * @param name The role name as used by the servlet * @param link The role name as used by the container. */ public synchronized void setUserRoleLink(String name,String link) { if (_roleMap==null) _roleMap=new HashMap(); _roleMap.put(name,link); } /* ------------------------------------------------------------ */ /** get a user role link. * @param name The name of the role * @return The name as translated by the link. If no link exists, * the name is returned. */ public String getUserRoleLink(String name) { if (_roleMap==null) return name; String link=(String)_roleMap.get(name); return (link==null)?name:link; } /* ------------------------------------------------------------ */ public Map getRoleMap() { return _roleMap; } /* ------------------------------------------------------------ */ /** * @param role Role name that is added to UserPrincipal when this servlet * is called. */ public void setRunAs(String role) { _runAs=role; } /* ------------------------------------------------------------ */ public String getRunAs() { return _runAs; } /* ------------------------------------------------------------ */ /** * @return Returns the forcedPath. */ public String getForcedPath() { return _forcedPath; } /* ------------------------------------------------------------ */ /** * @param forcedPath The forcedPath to set. */ public void setForcedPath(String forcedPath) { _forcedPath = forcedPath; } /* ------------------------------------------------------------ */ public void doStart() throws Exception { _unavailable=0; try { super.doStart(); checkServletType(); } catch (UnavailableException ue) { makeUnavailable(ue); } _config=new Config(); if (_runAs!=null) _realm=((SecurityHandler)(ContextHandler.getCurrentContext() .getContextHandler().getChildHandlerByClass(SecurityHandler.class))).getUserRealm(); if (javax.servlet.SingleThreadModel.class.isAssignableFrom(_class)) _servlet = new SingleThreadedWrapper(); if (_extInstance || _initOnStartup) { try { initServlet(); } catch(Exception e) { if (_servletHandler.isStartWithUnavailable()) Log.ignore(e); else throw e; } } } /* ------------------------------------------------------------ */ public void doStop() { Principal user=null; try { // Handle run as if (_runAs!=null && _realm!=null) user=_realm.pushRole(null,_runAs); if (_servlet!=null) { try { destroyInstance(_servlet); } catch (Exception e) { Log.warn(e); } } if (!_extInstance) _servlet=null; _config=null; } finally { super.doStop(); // pop run-as role if (_runAs!=null && _realm!=null && user!=null) _realm.popRole(user); } } /* ------------------------------------------------------------ */ public void destroyInstance (Object o) throws Exception { if (o==null) return; Servlet servlet = ((Servlet)o); servlet.destroy(); getServletHandler().customizeServletDestroy(servlet); } /* ------------------------------------------------------------ */ /** Get the servlet. * @return The servlet */ public synchronized Servlet getServlet() throws ServletException { // Handle previous unavailability
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -