You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2019/06/11 17:50:44 UTC
[tomcat] 04/04: Back-port varargs handling improvements to 7.0.x
This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch 7.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit d208fa862d68c11b6b12e22d582367c73f7b0df8
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Tue Jun 11 18:49:48 2019 +0100
Back-port varargs handling improvements to 7.0.x
---
java/javax/el/Util.java | 59 ++++-
test/javax/el/TestBeanELResolver.java | 481 ++++++++++++++++++++++++++++++++++
test/javax/el/TesterBean.java | 9 +
3 files changed, 535 insertions(+), 14 deletions(-)
diff --git a/java/javax/el/Util.java b/java/javax/el/Util.java
index af428ab..172c83c 100644
--- a/java/javax/el/Util.java
+++ b/java/javax/el/Util.java
@@ -40,6 +40,8 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
class Util {
+ private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];
+
/**
* Checks whether the supplied Throwable is one that needs to be
* rethrown and swallows all others.
@@ -248,11 +250,29 @@ class Util {
}
// Check the number of parameters
- if (!(paramCount == mParamCount ||
- (w.isVarArgs() && paramCount >= mParamCount))) {
+ // Multiple tests to improve readability
+ if (!w.isVarArgs() && paramCount != mParamCount) {
// Method has wrong number of parameters
continue;
}
+ if (w.isVarArgs() && paramCount < mParamCount -1) {
+ // Method has wrong number of parameters
+ continue;
+ }
+ if (w.isVarArgs() && paramCount == mParamCount && paramValues != null &&
+ paramValues.length > paramCount && !paramTypes[mParamCount -1].isArray()) {
+ // Method arguments don't match
+ continue;
+ }
+ if (w.isVarArgs() && paramCount > mParamCount && paramValues != null &&
+ paramValues.length != paramCount) {
+ // Might match a different varargs method
+ continue;
+ }
+ if (!w.isVarArgs() && paramValues != null && paramCount != paramValues.length) {
+ // Might match a different varargs method
+ continue;
+ }
// Check the parameters match
int exactMatch = 0;
@@ -261,9 +281,12 @@ class Util {
boolean noMatch = false;
for (int i = 0; i < mParamCount; i++) {
// Can't be null
- if (mParamTypes[i].equals(paramTypes[i])) {
- exactMatch++;
- } else if (i == (mParamCount - 1) && w.isVarArgs()) {
+ if (w.isVarArgs() && i == (mParamCount - 1)) {
+ if (i == paramCount || (paramValues != null && paramValues.length == i)) {
+ // Nothing is passed as varargs
+ assignableMatch++;
+ break;
+ }
Class<?> varType = mParamTypes[i].getComponentType();
for (int j = i; j < paramCount; j++) {
if (isAssignableFrom(paramTypes[j], varType)) {
@@ -285,18 +308,22 @@ class Util {
// lead to a varArgs method matching when the result
// should be ambiguous
}
- } else if (isAssignableFrom(paramTypes[i], mParamTypes[i])) {
- assignableMatch++;
} else {
- if (paramValues == null) {
- noMatch = true;
- break;
+ if (mParamTypes[i].equals(paramTypes[i])) {
+ exactMatch++;
+ } else if (paramTypes[i] != null && isAssignableFrom(paramTypes[i], mParamTypes[i])) {
+ assignableMatch++;
} else {
- if (isCoercibleFrom(paramValues[i], mParamTypes[i])) {
- coercibleMatch++;
- } else {
+ if (paramValues == null) {
noMatch = true;
break;
+ } else {
+ if (isCoercibleFrom(paramValues[i], mParamTypes[i])) {
+ coercibleMatch++;
+ } else {
+ noMatch = true;
+ break;
+ }
}
}
}
@@ -609,7 +636,11 @@ class Util {
Object[] parameters = null;
if (parameterTypes.length > 0) {
parameters = new Object[parameterTypes.length];
- int paramCount = params.length;
+ int paramCount;
+ if (params == null) {
+ params = EMPTY_OBJECT_ARRAY;
+ }
+ paramCount = params.length;
if (isVarArgs) {
int varArgIndex = parameterTypes.length - 1;
// First argCount-1 parameters are standard
diff --git a/test/javax/el/TestBeanELResolver.java b/test/javax/el/TestBeanELResolver.java
index 2a399cf..31b4c5b 100644
--- a/test/javax/el/TestBeanELResolver.java
+++ b/test/javax/el/TestBeanELResolver.java
@@ -18,6 +18,7 @@ package javax.el;
import java.beans.FeatureDescriptor;
import java.beans.PropertyDescriptor;
+import java.util.ArrayList;
import java.util.Iterator;
import org.junit.Assert;
@@ -457,6 +458,486 @@ public class TestBeanELResolver {
new Object[] {});
}
+ @Test
+ public void testInvokeVarargsCoerce01() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] {}, new String[] {});
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargsCoerce02() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ null, null);
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargsCoerce03() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ null, new String[] {});
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargsCoerce04() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] {}, null);
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargsCoerce05() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { null }, new String[] { null });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargsCoerce06() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ null, new String[] { null });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargsCoerce07() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { null }, null);
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargsCoerce08() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { String.class }, new String[] { "true" });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargsCoerce09() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { String.class, String.class }, new Object[] { "true", null });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargsCoerce10() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { String.class, String[].class }, new Object[] { "true", null });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargsCoerce11() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { String.class }, new Object[] { "10" });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargsCoerce12() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { String[].class }, new String[] { "10" });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ // Ambiguous because the Strings coerce to both Boolean and Integer hence
+ // both varargs methods match.
+ @Test(expected=MethodNotFoundException.class)
+ public void testInvokeVarargsCoerce13() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { String.class, String.class }, new String[] { "10", "11" });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargsCoerce14() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { String.class, String.class }, new String[] { "true", null });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test(expected=MethodNotFoundException.class)
+ public void testInvokeVarargsCoerce15() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { String.class, String.class }, new Object[] { "true", new ArrayList<Object>() });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ // Ambiguous because the Strings coerce to both Boolean and Integer hence
+ // both varargs methods match.
+ @Test(expected=MethodNotFoundException.class)
+ public void testInvokeVarargsCoerce16() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { String.class, String.class, String.class },
+ new Object[] { "10", "11", "12" });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test(expected=MethodNotFoundException.class)
+ public void testInvokeVarargsCoerce17() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { String.class, String.class },
+ new Object[] { "10", "11", "12" });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test(expected=MethodNotFoundException.class)
+ public void testInvokeVarargsCoerce18() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { String.class, String.class, String.class, String.class },
+ new Object[] { "10", "11", "12" });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargsCoerce19() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { String.class, String.class, String.class, String.class },
+ new Object[] { "true", "10", "11", "12" });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test(expected=MethodNotFoundException.class)
+ public void testInvokeVarargsCoerce20() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { String.class, String.class, String.class },
+ new Object[] { "true", "10", "11", "12" });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test(expected=MethodNotFoundException.class)
+ public void testInvokeVarargsCoerce21() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { String.class, String.class, String.class, String.class, String.class },
+ new Object[] { "true", "10", "11", "12" });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargs01() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] {}, new Object[] {});
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargs02() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ null, null);
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargs03() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ null, new Object[] {});
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargs04() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] {}, null);
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargs05() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { null }, new Object[] { null });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargs06() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ null, new Object[] { null });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargs07() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { null }, null);
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargs08() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { Boolean.class }, new Object[] { Boolean.TRUE });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargs09() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { Boolean.class, Integer.class }, new Object[] { Boolean.TRUE, null });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargs10() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { Boolean.class, Integer[].class }, new Object[] { Boolean.TRUE, null });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargs11() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { Integer.class }, new Object[] { Integer.valueOf(10) });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargs12() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { Integer[].class }, new Object[] { Integer.valueOf(10) });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargs13() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { Integer.class, Integer.class }, new Object[] { Integer.valueOf(10), Integer.valueOf(11) });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ // Note: The coercion rules are that a null of any type can be coerced to a
+ // null of *any* other type so this works.
+ @Test
+ public void testInvokeVarargs14() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { Boolean.class, ArrayList.class }, new Object[] { Boolean.TRUE, null });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test(expected=MethodNotFoundException.class)
+ public void testInvokeVarargs15() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { Boolean.class, ArrayList.class }, new Object[] { Boolean.TRUE, new ArrayList<Object>() });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargs16() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { Integer.class, Integer.class, Integer.class },
+ new Object[] { Integer.valueOf(10), Integer.valueOf(11), Integer.valueOf(12) });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test(expected=MethodNotFoundException.class)
+ public void testInvokeVarargs17() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { Integer.class, Integer.class },
+ new Object[] { Integer.valueOf(10), Integer.valueOf(11), Integer.valueOf(12) });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test(expected=MethodNotFoundException.class)
+ public void testInvokeVarargs18() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { Integer.class, Integer.class, Integer.class, Integer.class },
+ new Object[] { Integer.valueOf(10), Integer.valueOf(11), Integer.valueOf(12) });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test
+ public void testInvokeVarargs19() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { Boolean.class, Integer.class, Integer.class, Integer.class },
+ new Object[] { Boolean.TRUE, Integer.valueOf(10), Integer.valueOf(11), Integer.valueOf(12) });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test(expected=MethodNotFoundException.class)
+ public void testInvokeVarargs20() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { Boolean.class, Integer.class, Integer.class },
+ new Object[] { Boolean.TRUE, Integer.valueOf(10), Integer.valueOf(11), Integer.valueOf(12) });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
+ @Test(expected=MethodNotFoundException.class)
+ public void testInvokeVarargs21() {
+ BeanELResolver resolver = new BeanELResolver();
+ ELContext context = new ELContextImpl();
+
+ Object result = resolver.invoke(context, new TesterBean(BEAN_NAME), "getNameVarargs",
+ new Class<?>[] { Boolean.class, Integer.class, Integer.class, Integer.class, Integer.class },
+ new Object[] { Boolean.TRUE, Integer.valueOf(10), Integer.valueOf(11), Integer.valueOf(12) });
+
+ Assert.assertEquals(BEAN_NAME, result);
+ }
+
private static class Bean {
@SuppressWarnings("unused")
diff --git a/test/javax/el/TesterBean.java b/test/javax/el/TesterBean.java
index 2169d59..6a4abd0 100644
--- a/test/javax/el/TesterBean.java
+++ b/test/javax/el/TesterBean.java
@@ -28,6 +28,15 @@ public class TesterBean {
return name;
}
+ public String getNameVarargs(@SuppressWarnings("unused") Integer... someNumbers) {
+ return name;
+ }
+
+ public String getNameVarargs(@SuppressWarnings("unused") Boolean someBoolean,
+ @SuppressWarnings("unused") Integer... someNumbers) {
+ return name;
+ }
+
public void setName(String name) {
this.name = name;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org