Author: markt Date: Mon Jan 12 06:16:19 2009 New Revision: 733768 URL: http://svn.apache.org/viewvc?rev=733768&view=rev Log: Apply generics to javax.servlet.* on the basis that the EG is in the process of accepting a patch to do this.
Modified: tomcat/trunk/java/javax/servlet/FilterConfig.java tomcat/trunk/java/javax/servlet/GenericServlet.java tomcat/trunk/java/javax/servlet/ServletConfig.java tomcat/trunk/java/javax/servlet/ServletContext.java tomcat/trunk/java/javax/servlet/ServletRequest.java tomcat/trunk/java/javax/servlet/ServletRequestWrapper.java tomcat/trunk/java/javax/servlet/http/HttpServletRequest.java tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java tomcat/trunk/java/javax/servlet/http/HttpSession.java tomcat/trunk/java/javax/servlet/http/HttpSessionContext.java tomcat/trunk/java/javax/servlet/http/HttpUtils.java tomcat/trunk/java/javax/servlet/jsp/el/ExpressionEvaluator.java tomcat/trunk/java/javax/servlet/jsp/el/ImplicitObjectELResolver.java tomcat/trunk/java/javax/servlet/jsp/el/ScopedAttributeELResolver.java tomcat/trunk/java/javax/servlet/jsp/tagext/TagSupport.java Modified: tomcat/trunk/java/javax/servlet/FilterConfig.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/FilterConfig.java?rev=733768&r1=733767&r2=733768&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/FilterConfig.java (original) +++ tomcat/trunk/java/javax/servlet/FilterConfig.java Mon Jan 12 06:16:19 2009 @@ -84,7 +84,7 @@ * */ - public Enumeration getInitParameterNames(); + public Enumeration<String> getInitParameterNames(); Modified: tomcat/trunk/java/javax/servlet/GenericServlet.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/GenericServlet.java?rev=733768&r1=733767&r2=733768&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/GenericServlet.java (original) +++ tomcat/trunk/java/javax/servlet/GenericServlet.java Mon Jan 12 06:16:19 2009 @@ -119,7 +119,7 @@ * */ - public Enumeration getInitParameterNames() { + public Enumeration<String> getInitParameterNames() { return getServletConfig().getInitParameterNames(); } Modified: tomcat/trunk/java/javax/servlet/ServletConfig.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/ServletConfig.java?rev=733768&r1=733767&r2=733768&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/ServletConfig.java (original) +++ tomcat/trunk/java/javax/servlet/ServletConfig.java Mon Jan 12 06:16:19 2009 @@ -89,7 +89,7 @@ * */ - public Enumeration getInitParameterNames(); + public Enumeration<String> getInitParameterNames(); } Modified: tomcat/trunk/java/javax/servlet/ServletContext.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/ServletContext.java?rev=733768&r1=733767&r2=733768&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/ServletContext.java (original) +++ tomcat/trunk/java/javax/servlet/ServletContext.java Mon Jan 12 06:16:19 2009 @@ -162,7 +162,7 @@ * @since Servlet 2.3 */ - public Set getResourcePaths(String path); + public Set<String> getResourcePaths(String path); @@ -352,7 +352,7 @@ * */ - public Enumeration getServlets(); + public Enumeration<Servlet> getServlets(); @@ -371,7 +371,7 @@ * */ - public Enumeration getServletNames(); + public Enumeration<String> getServletNames(); @@ -524,7 +524,7 @@ * @see ServletConfig#getInitParameter */ - public Enumeration getInitParameterNames(); + public Enumeration<String> getInitParameterNames(); @@ -577,7 +577,7 @@ * */ - public Enumeration getAttributeNames(); + public Enumeration<String> getAttributeNames(); Modified: tomcat/trunk/java/javax/servlet/ServletRequest.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/ServletRequest.java?rev=733768&r1=733767&r2=733768&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/ServletRequest.java (original) +++ tomcat/trunk/java/javax/servlet/ServletRequest.java Mon Jan 12 06:16:19 2009 @@ -91,7 +91,7 @@ * */ - public Enumeration getAttributeNames(); + public Enumeration<String> getAttributeNames(); @@ -229,7 +229,7 @@ * */ - public Enumeration getParameterNames(); + public Enumeration<String> getParameterNames(); @@ -266,7 +266,7 @@ * */ - public Map getParameterMap(); + public Map<String,String[]> getParameterMap(); @@ -480,7 +480,7 @@ * */ - public Enumeration getLocales(); + public Enumeration<Locale> getLocales(); Modified: tomcat/trunk/java/javax/servlet/ServletRequestWrapper.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/ServletRequestWrapper.java?rev=733768&r1=733767&r2=733768&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/ServletRequestWrapper.java (original) +++ tomcat/trunk/java/javax/servlet/ServletRequestWrapper.java Mon Jan 12 06:16:19 2009 @@ -89,7 +89,7 @@ * on the wrapped request object. */ - public Enumeration getAttributeNames() { + public Enumeration<String> getAttributeNames() { return this.request.getAttributeNames(); } @@ -162,7 +162,7 @@ * The default behavior of this method is to return getParameterMap() * on the wrapped request object. */ - public Map getParameterMap() { + public Map<String,String[]> getParameterMap() { return this.request.getParameterMap(); } @@ -174,7 +174,7 @@ * on the wrapped request object. */ - public Enumeration getParameterNames() { + public Enumeration<String> getParameterNames() { return this.request.getParameterNames(); } @@ -315,7 +315,7 @@ * on the wrapped request object. */ - public Enumeration getLocales() { + public Enumeration<Locale> getLocales() { return this.request.getLocales(); } Modified: tomcat/trunk/java/javax/servlet/http/HttpServletRequest.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/http/HttpServletRequest.java?rev=733768&r1=733767&r2=733768&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/http/HttpServletRequest.java (original) +++ tomcat/trunk/java/javax/servlet/http/HttpServletRequest.java Mon Jan 12 06:16:19 2009 @@ -192,7 +192,7 @@ * */ - public Enumeration getHeaders(String name); + public Enumeration<String> getHeaders(String name); @@ -219,7 +219,7 @@ * */ - public Enumeration getHeaderNames(); + public Enumeration<String> getHeaderNames(); Modified: tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java?rev=733768&r1=733767&r2=733768&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java (original) +++ tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java Mon Jan 12 06:16:19 2009 @@ -84,7 +84,7 @@ * The default behavior of this method is to return getHeaders(String name) * on the wrapped request object. */ - public Enumeration getHeaders(String name) { + public Enumeration<String> getHeaders(String name) { return this._getHttpServletRequest().getHeaders(name); } @@ -93,7 +93,7 @@ * on the wrapped request object. */ - public Enumeration getHeaderNames() { + public Enumeration<String> getHeaderNames() { return this._getHttpServletRequest().getHeaderNames(); } Modified: tomcat/trunk/java/javax/servlet/http/HttpSession.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/http/HttpSession.java?rev=733768&r1=733767&r2=733768&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/http/HttpSession.java (original) +++ tomcat/trunk/java/javax/servlet/http/HttpSession.java Mon Jan 12 06:16:19 2009 @@ -257,7 +257,7 @@ * */ - public Enumeration getAttributeNames(); + public Enumeration<String> getAttributeNames(); Modified: tomcat/trunk/java/javax/servlet/http/HttpSessionContext.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/http/HttpSessionContext.java?rev=733768&r1=733767&r2=733768&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/http/HttpSessionContext.java (original) +++ tomcat/trunk/java/javax/servlet/http/HttpSessionContext.java Mon Jan 12 06:16:19 2009 @@ -62,7 +62,7 @@ * */ - public Enumeration getIds(); + public Enumeration<String> getIds(); } Modified: tomcat/trunk/java/javax/servlet/http/HttpUtils.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/http/HttpUtils.java?rev=733768&r1=733767&r2=733768&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/http/HttpUtils.java (original) +++ tomcat/trunk/java/javax/servlet/http/HttpUtils.java Mon Jan 12 06:16:19 2009 @@ -84,14 +84,14 @@ * */ - static public Hashtable parseQueryString(String s) { + static public Hashtable<String,String[]> parseQueryString(String s) { String valArray[] = null; if (s == null) { throw new IllegalArgumentException(); } - Hashtable ht = new Hashtable(); + Hashtable<String,String[]> ht = new Hashtable<String,String[]>(); StringBuffer sb = new StringBuffer(); StringTokenizer st = new StringTokenizer(s, "&"); while (st.hasMoreTokens()) { @@ -105,7 +105,7 @@ String key = parseName(pair.substring(0, pos), sb); String val = parseName(pair.substring(pos+1, pair.length()), sb); if (ht.containsKey(key)) { - String oldVals[] = (String []) ht.get(key); + String oldVals[] = ht.get(key); valArray = new String[oldVals.length + 1]; for (int i = 0; i < oldVals.length; i++) valArray[i] = oldVals[i]; @@ -163,14 +163,16 @@ */ - static public Hashtable parsePostData(int len, + static public Hashtable<String,String[]> parsePostData(int len, ServletInputStream in) { // XXX // should a length of 0 be an IllegalArgumentException - if (len <=0) - return new Hashtable(); // cheap hack to return an empty hash + // cheap hack to return an empty hash + if (len <=0) + return new Hashtable<String,String[]>(); + if (in == null) { throw new IllegalArgumentException(); Modified: tomcat/trunk/java/javax/servlet/jsp/el/ExpressionEvaluator.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/jsp/el/ExpressionEvaluator.java?rev=733768&r1=733767&r2=733768&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/jsp/el/ExpressionEvaluator.java (original) +++ tomcat/trunk/java/javax/servlet/jsp/el/ExpressionEvaluator.java Mon Jan 12 06:16:19 2009 @@ -77,7 +77,7 @@ * @exception ELException Thrown if parsing errors were found. */ public abstract Expression parseExpression( String expression, - Class expectedType, + Class<?> expectedType, FunctionMapper fMapper ) throws ELException; @@ -100,7 +100,7 @@ * @exception ELException Thrown if the expression evaluation failed. */ public abstract Object evaluate( String expression, - Class expectedType, + Class<?> expectedType, VariableResolver vResolver, FunctionMapper fMapper ) throws ELException; Modified: tomcat/trunk/java/javax/servlet/jsp/el/ImplicitObjectELResolver.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/jsp/el/ImplicitObjectELResolver.java?rev=733768&r1=733767&r2=733768&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/jsp/el/ImplicitObjectELResolver.java (original) +++ tomcat/trunk/java/javax/servlet/jsp/el/ImplicitObjectELResolver.java Mon Jan 12 06:16:19 2009 @@ -119,7 +119,7 @@ return null; } - public Class getType(ELContext context, Object base, Object property) + public Class<?> getType(ELContext context, Object base, Object property) throws NullPointerException, PropertyNotFoundException, ELException { if (context == null) { throw new NullPointerException(); @@ -197,25 +197,25 @@ private final PageContext page; - private Map applicationScope; + private Map<String,Object> applicationScope; - private Map cookie; + private Map<String,Cookie> cookie; - private Map header; + private Map<String,String> header; - private Map headerValues; + private Map<String,String[]> headerValues; - private Map initParam; + private Map<String,String> initParam; - private Map pageScope; + private Map<String,Object> pageScope; - private Map param; + private Map<String,String> param; - private Map paramValues; + private Map<String,String[]> paramValues; - private Map requestScope; + private Map<String,Object> requestScope; - private Map sessionScope; + private Map<String,Object> sessionScope; public ScopeManager(PageContext page) { this.page = page; @@ -230,9 +230,9 @@ return mngr; } - public Map getApplicationScope() { + public Map<String,Object> getApplicationScope() { if (this.applicationScope == null) { - this.applicationScope = new ScopeMap() { + this.applicationScope = new ScopeMap<Object>() { protected void setAttribute(String name, Object value) { page.getServletContext().setAttribute(name, value); } @@ -241,7 +241,7 @@ page.getServletContext().removeAttribute(name); } - protected Enumeration getAttributeNames() { + protected Enumeration<String> getAttributeNames() { return page.getServletContext().getAttributeNames(); } @@ -253,14 +253,14 @@ return this.applicationScope; } - public Map getCookie() { + public Map<String,Cookie> getCookie() { if (this.cookie == null) { - this.cookie = new ScopeMap() { - protected Enumeration getAttributeNames() { + this.cookie = new ScopeMap<Cookie>() { + protected Enumeration<String> getAttributeNames() { Cookie[] c = ((HttpServletRequest) page.getRequest()) .getCookies(); if (c != null) { - Vector v = new Vector(); + Vector<String> v = new Vector<String>(); for (int i = 0; i < c.length; i++) { v.add(c[i].getName()); } @@ -269,7 +269,7 @@ return null; } - protected Object getAttribute(String name) { + protected Cookie getAttribute(String name) { Cookie[] c = ((HttpServletRequest) page.getRequest()) .getCookies(); if (c != null) { @@ -287,15 +287,15 @@ return this.cookie; } - public Map getHeader() { + public Map<String,String> getHeader() { if (this.header == null) { - this.header = new ScopeMap() { - protected Enumeration getAttributeNames() { + this.header = new ScopeMap<String>() { + protected Enumeration<String> getAttributeNames() { return ((HttpServletRequest) page.getRequest()) .getHeaderNames(); } - protected Object getAttribute(String name) { + protected String getAttribute(String name) { return ((HttpServletRequest) page.getRequest()) .getHeader(name); } @@ -304,21 +304,22 @@ return this.header; } - public Map getHeaderValues() { + public Map<String,String[]> getHeaderValues() { if (this.headerValues == null) { - this.headerValues = new ScopeMap() { - protected Enumeration getAttributeNames() { + this.headerValues = new ScopeMap<String[]>() { + protected Enumeration<String> getAttributeNames() { return ((HttpServletRequest) page.getRequest()) .getHeaderNames(); } - protected Object getAttribute(String name) { - Enumeration e = ((HttpServletRequest) page.getRequest()) - .getHeaders(name); + protected String[] getAttribute(String name) { + Enumeration<String> e = + ((HttpServletRequest) page.getRequest()) + .getHeaders(name); if (e != null) { - List list = new ArrayList(); + List<String> list = new ArrayList<String>(); while (e.hasMoreElements()) { - list.add(e.nextElement().toString()); + list.add(e.nextElement()); } return list.toArray(new String[list.size()]); } @@ -330,14 +331,14 @@ return this.headerValues; } - public Map getInitParam() { + public Map<String,String> getInitParam() { if (this.initParam == null) { - this.initParam = new ScopeMap() { - protected Enumeration getAttributeNames() { + this.initParam = new ScopeMap<String>() { + protected Enumeration<String> getAttributeNames() { return page.getServletContext().getInitParameterNames(); } - protected Object getAttribute(String name) { + protected String getAttribute(String name) { return page.getServletContext().getInitParameter(name); } }; @@ -349,9 +350,9 @@ return this.page; } - public Map getPageScope() { + public Map<String,Object> getPageScope() { if (this.pageScope == null) { - this.pageScope = new ScopeMap() { + this.pageScope = new ScopeMap<Object>() { protected void setAttribute(String name, Object value) { page.setAttribute(name, value); } @@ -360,9 +361,9 @@ page.removeAttribute(name); } - protected Enumeration getAttributeNames() { - return page - .getAttributeNamesInScope(PageContext.PAGE_SCOPE); + protected Enumeration<String> getAttributeNames() { + return page.getAttributeNamesInScope( + PageContext.PAGE_SCOPE); } protected Object getAttribute(String name) { @@ -373,14 +374,14 @@ return this.pageScope; } - public Map getParam() { + public Map<String,String> getParam() { if (this.param == null) { - this.param = new ScopeMap() { - protected Enumeration getAttributeNames() { + this.param = new ScopeMap<String>() { + protected Enumeration<String> getAttributeNames() { return page.getRequest().getParameterNames(); } - protected Object getAttribute(String name) { + protected String getAttribute(String name) { return page.getRequest().getParameter(name); } }; @@ -388,14 +389,14 @@ return this.param; } - public Map getParamValues() { + public Map<String,String[]> getParamValues() { if (this.paramValues == null) { - this.paramValues = new ScopeMap() { - protected Object getAttribute(String name) { + this.paramValues = new ScopeMap<String[]>() { + protected String[] getAttribute(String name) { return page.getRequest().getParameterValues(name); } - protected Enumeration getAttributeNames() { + protected Enumeration<String> getAttributeNames() { return page.getRequest().getParameterNames(); } }; @@ -403,9 +404,9 @@ return this.paramValues; } - public Map getRequestScope() { + public Map<String,Object> getRequestScope() { if (this.requestScope == null) { - this.requestScope = new ScopeMap() { + this.requestScope = new ScopeMap<Object>() { protected void setAttribute(String name, Object value) { page.getRequest().setAttribute(name, value); } @@ -414,7 +415,7 @@ page.getRequest().removeAttribute(name); } - protected Enumeration getAttributeNames() { + protected Enumeration<String> getAttributeNames() { return page.getRequest().getAttributeNames(); } @@ -426,9 +427,9 @@ return this.requestScope; } - public Map getSessionScope() { + public Map<String,Object> getSessionScope() { if (this.sessionScope == null) { - this.sessionScope = new ScopeMap() { + this.sessionScope = new ScopeMap<Object>() { protected void setAttribute(String name, Object value) { ((HttpServletRequest) page.getRequest()).getSession() .setAttribute(name, value); @@ -441,7 +442,7 @@ } } - protected Enumeration getAttributeNames() { + protected Enumeration<String> getAttributeNames() { HttpSession session = page.getSession(); if (session != null) { return session.getAttributeNames(); @@ -462,11 +463,11 @@ } } - private abstract static class ScopeMap extends AbstractMap { + private abstract static class ScopeMap<V> extends AbstractMap<String,V> { - protected abstract Enumeration getAttributeNames(); + protected abstract Enumeration<String> getAttributeNames(); - protected abstract Object getAttribute(String name); + protected abstract V getAttribute(String name); protected void removeAttribute(String name) { throw new UnsupportedOperationException(); @@ -476,18 +477,18 @@ throw new UnsupportedOperationException(); } - public final Set entrySet() { - Enumeration e = getAttributeNames(); - Set set = new HashSet(); + public final Set<Map.Entry<String,V>> entrySet() { + Enumeration<String> e = getAttributeNames(); + Set<Map.Entry<String, V>> set = new HashSet<Map.Entry<String, V>>(); if (e != null) { while (e.hasMoreElements()) { - set.add(new ScopeEntry((String) e.nextElement())); + set.add(new ScopeEntry(e.nextElement())); } } return set; } - private class ScopeEntry implements Map.Entry { + private class ScopeEntry implements Map.Entry<String,V> { private final String key; @@ -495,15 +496,15 @@ this.key = key; } - public Object getKey() { + public String getKey() { return this.key; } - public Object getValue() { + public V getValue() { return getAttribute(this.key); } - public Object setValue(Object value) { + public V setValue(Object value) { if (value == null) { removeAttribute(this.key); } else { @@ -522,14 +523,14 @@ } - public final Object get(Object key) { + public final V get(String key) { if (key != null) { - return getAttribute(key.toString()); + return getAttribute(key); } return null; } - public final Object put(Object key, Object value) { + public final V put(String key, V value) { if (key == null) { throw new NullPointerException(); } @@ -541,7 +542,7 @@ return null; } - public final Object remove(Object key) { + public final V remove(String key) { if (key == null) { throw new NullPointerException(); } Modified: tomcat/trunk/java/javax/servlet/jsp/el/ScopedAttributeELResolver.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/jsp/el/ScopedAttributeELResolver.java?rev=733768&r1=733767&r2=733768&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/jsp/el/ScopedAttributeELResolver.java (original) +++ tomcat/trunk/java/javax/servlet/jsp/el/ScopedAttributeELResolver.java Mon Jan 12 06:16:19 2009 @@ -111,13 +111,13 @@ PageContext ctxt = (PageContext) context.getContext(JspContext.class); List<FeatureDescriptor> list = new ArrayList<FeatureDescriptor>(); - Enumeration e; + Enumeration<String> e; Object value; String name; e = ctxt.getAttributeNamesInScope(PageContext.PAGE_SCOPE); while (e.hasMoreElements()) { - name = (String) e.nextElement(); + name = e.nextElement(); value = ctxt.getAttribute(name, PageContext.PAGE_SCOPE); FeatureDescriptor descriptor = new FeatureDescriptor(); descriptor.setName(name); @@ -133,7 +133,7 @@ e = ctxt.getAttributeNamesInScope(PageContext.REQUEST_SCOPE); while (e.hasMoreElements()) { - name = (String) e.nextElement(); + name = e.nextElement(); value = ctxt.getAttribute(name, PageContext.REQUEST_SCOPE); FeatureDescriptor descriptor = new FeatureDescriptor(); descriptor.setName(name); @@ -150,7 +150,7 @@ if (ctxt.getSession() != null) { e = ctxt.getAttributeNamesInScope(PageContext.SESSION_SCOPE); while (e.hasMoreElements()) { - name = (String) e.nextElement(); + name = e.nextElement(); value = ctxt.getAttribute(name, PageContext.SESSION_SCOPE); FeatureDescriptor descriptor = new FeatureDescriptor(); descriptor.setName(name); @@ -167,7 +167,7 @@ e = ctxt.getAttributeNamesInScope(PageContext.APPLICATION_SCOPE); while (e.hasMoreElements()) { - name = (String) e.nextElement(); + name = e.nextElement(); value = ctxt.getAttribute(name, PageContext.APPLICATION_SCOPE); FeatureDescriptor descriptor = new FeatureDescriptor(); descriptor.setName(name); Modified: tomcat/trunk/java/javax/servlet/jsp/tagext/TagSupport.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/jsp/tagext/TagSupport.java?rev=733768&r1=733767&r2=733768&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/jsp/tagext/TagSupport.java (original) +++ tomcat/trunk/java/javax/servlet/jsp/tagext/TagSupport.java Mon Jan 12 06:16:19 2009 @@ -73,7 +73,7 @@ * or is an instance of the class specified */ - public static final Tag findAncestorWithClass(Tag from, Class klass) { + public static final Tag findAncestorWithClass(Tag from, Class<?> klass) { boolean isInterface = false; if (from == null || --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org