Author: markt Date: Thu May 10 12:46:44 2018 New Revision: 1831333 URL: http://svn.apache.org/viewvc?rev=1831333&view=rev Log: Partial fix for BZ 50019 Add lookup-name support to env-entry
Added: tomcat/trunk/test/org/apache/naming/TestEnvEntry.java (with props) tomcat/trunk/test/org/apache/naming/TesterEnvEntry.java (with props) tomcat/trunk/test/org/apache/naming/TesterInjectionServlet.java (with props) tomcat/trunk/test/webapp-fragments/jndi.jsp (with props) Modified: tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties tomcat/trunk/java/org/apache/catalina/core/NamingContextListener.java tomcat/trunk/java/org/apache/catalina/deploy/LocalStrings.properties tomcat/trunk/java/org/apache/catalina/deploy/NamingResourcesImpl.java tomcat/trunk/test/webapp-fragments/WEB-INF/web.xml tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties?rev=1831333&r1=1831332&r2=1831333&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties Thu May 10 12:46:44 2018 @@ -105,6 +105,9 @@ jreLeakListener.xmlParseFail=Error whils jreLeakListener.authPolicyFail=Error whilst attempting to prevent memory leak in javax.security.auth.Policy class jreLeakListener.ldapPoolManagerFail=Failed to trigger creation of the com.sun.jndi.ldap.LdapPoolManager class during Tomcat start to prevent possible memory leaks. This is expected on non-Sun JVMs. jreLeakListener.classToInitializeFail=Failed to load class [{0}] during Tomcat start to prevent possible memory leaks. + +naming.addEnvEntry=Adding environment entry [{0}] +naming.addResourceEnvRef=Adding resource env ref [{0}] naming.wsdlFailed=Failed to find wsdl file: [{0}] naming.bindFailed=Failed to bind object: [{0}] naming.jmxRegistrationFailed=Failed to register in JMX: [{0}] Modified: tomcat/trunk/java/org/apache/catalina/core/NamingContextListener.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/NamingContextListener.java?rev=1831333&r1=1831332&r2=1831333&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/NamingContextListener.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/NamingContextListener.java Thu May 10 12:46:44 2018 @@ -53,6 +53,7 @@ import org.apache.naming.ContextAccessCo import org.apache.naming.ContextBindings; import org.apache.naming.EjbRef; import org.apache.naming.HandlerRef; +import org.apache.naming.LookupRef; import org.apache.naming.NamingContext; import org.apache.naming.ResourceEnvRef; import org.apache.naming.ResourceLinkRef; @@ -69,6 +70,7 @@ import org.apache.tomcat.util.descriptor import org.apache.tomcat.util.descriptor.web.ContextResourceLink; import org.apache.tomcat.util.descriptor.web.ContextService; import org.apache.tomcat.util.descriptor.web.ContextTransaction; +import org.apache.tomcat.util.descriptor.web.ResourceBase; import org.apache.tomcat.util.modeler.Registry; import org.apache.tomcat.util.res.StringManager; @@ -680,86 +682,89 @@ public class NamingContextListener */ public void addEnvironment(ContextEnvironment env) { - Object value = null; - // Instantiating a new instance of the correct object type, and - // initializing it. - String type = env.getType(); - try { - if (type.equals("java.lang.String")) { - value = env.getValue(); - } else if (type.equals("java.lang.Byte")) { - if (env.getValue() == null) { - value = Byte.valueOf((byte) 0); - } else { - value = Byte.decode(env.getValue()); - } - } else if (type.equals("java.lang.Short")) { - if (env.getValue() == null) { - value = Short.valueOf((short) 0); - } else { - value = Short.decode(env.getValue()); - } - } else if (type.equals("java.lang.Integer")) { - if (env.getValue() == null) { - value = Integer.valueOf(0); - } else { - value = Integer.decode(env.getValue()); - } - } else if (type.equals("java.lang.Long")) { - if (env.getValue() == null) { - value = Long.valueOf(0); - } else { - value = Long.decode(env.getValue()); - } - } else if (type.equals("java.lang.Boolean")) { - value = Boolean.valueOf(env.getValue()); - } else if (type.equals("java.lang.Double")) { - if (env.getValue() == null) { - value = Double.valueOf(0); - } else { - value = Double.valueOf(env.getValue()); - } - } else if (type.equals("java.lang.Float")) { - if (env.getValue() == null) { - value = Float.valueOf(0); - } else { - value = Float.valueOf(env.getValue()); - } - } else if (type.equals("java.lang.Character")) { - if (env.getValue() == null) { - value = Character.valueOf((char) 0); - } else { - if (env.getValue().length() == 1) { - value = Character.valueOf(env.getValue().charAt(0)); + Object value = lookForLookupRef(env); + + if (value == null) { + // Instantiating a new instance of the correct object type, and + // initializing it. + String type = env.getType(); + try { + if (type.equals("java.lang.String")) { + value = env.getValue(); + } else if (type.equals("java.lang.Byte")) { + if (env.getValue() == null) { + value = Byte.valueOf((byte) 0); } else { - throw new IllegalArgumentException(); + value = Byte.decode(env.getValue()); + } + } else if (type.equals("java.lang.Short")) { + if (env.getValue() == null) { + value = Short.valueOf((short) 0); + } else { + value = Short.decode(env.getValue()); + } + } else if (type.equals("java.lang.Integer")) { + if (env.getValue() == null) { + value = Integer.valueOf(0); + } else { + value = Integer.decode(env.getValue()); + } + } else if (type.equals("java.lang.Long")) { + if (env.getValue() == null) { + value = Long.valueOf(0); + } else { + value = Long.decode(env.getValue()); + } + } else if (type.equals("java.lang.Boolean")) { + value = Boolean.valueOf(env.getValue()); + } else if (type.equals("java.lang.Double")) { + if (env.getValue() == null) { + value = Double.valueOf(0); + } else { + value = Double.valueOf(env.getValue()); + } + } else if (type.equals("java.lang.Float")) { + if (env.getValue() == null) { + value = Float.valueOf(0); + } else { + value = Float.valueOf(env.getValue()); + } + } else if (type.equals("java.lang.Character")) { + if (env.getValue() == null) { + value = Character.valueOf((char) 0); + } else { + if (env.getValue().length() == 1) { + value = Character.valueOf(env.getValue().charAt(0)); + } else { + throw new IllegalArgumentException(); + } + } + } else { + value = constructEnvEntry(env.getType(), env.getValue()); + if (value == null) { + log.error(sm.getString( + "naming.invalidEnvEntryType", env.getName())); } } - } else { - value = constructEnvEntry(env.getType(), env.getValue()); - if (value == null) { - log.error(sm.getString( - "naming.invalidEnvEntryType", env.getName())); - } + } catch (NumberFormatException e) { + log.error(sm.getString("naming.invalidEnvEntryValue", env.getName())); + } catch (IllegalArgumentException e) { + log.error(sm.getString("naming.invalidEnvEntryValue", env.getName())); } - } catch (NumberFormatException e) { - log.error(sm.getString("naming.invalidEnvEntryValue", env.getName())); - } catch (IllegalArgumentException e) { - log.error(sm.getString("naming.invalidEnvEntryValue", env.getName())); } // Binding the object to the appropriate name if (value != null) { try { - if (log.isDebugEnabled()) - log.debug(" Adding environment entry " + env.getName()); + if (log.isDebugEnabled()) { + log.debug(sm.getString("naming.addEnvEntry", env.getName())); + } createSubcontexts(envCtx, env.getName()); envCtx.bind(env.getName(), value); } catch (NamingException e) { log.error(sm.getString("naming.invalidEnvEntryValue", e)); } } - } @@ -996,15 +1001,16 @@ public class NamingContextListener StringRefAddr refAddr = new StringRefAddr(paramName, paramValue); ref.add(refAddr); } + try { - if (log.isDebugEnabled()) - log.debug(" Adding resource env ref " + resourceEnvRef.getName()); + if (log.isDebugEnabled()) { + log.debug(sm.getString("naming.addResourceEnvRef", resourceEnvRef.getName())); + } createSubcontexts(envCtx, resourceEnvRef.getName()); envCtx.bind(resourceEnvRef.getName(), ref); } catch (NamingException e) { log.error(sm.getString("naming.bindFailed", e)); } - } @@ -1194,4 +1200,17 @@ public class NamingContextListener } + /** + * Gets look up reference from resource if exist. + * + * @param resourceBase resource base object + * @return lookup ref + */ + private LookupRef lookForLookupRef(ResourceBase resourceBase) { + String lookupName = resourceBase.getLookupName(); + if ((lookupName != null && !lookupName.equals(""))) { + return new LookupRef(resourceBase.getType(), lookupName); + } + return null; + } } Modified: tomcat/trunk/java/org/apache/catalina/deploy/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/deploy/LocalStrings.properties?rev=1831333&r1=1831332&r2=1831333&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/deploy/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/catalina/deploy/LocalStrings.properties Thu May 10 12:46:44 2018 @@ -18,6 +18,7 @@ namingResources.cleanupCloseSecurity=Una namingResources.cleanupNoClose=Resource [{0}] in container [{1}] does not have a [{2}] method so no cleanup was performed for that resource namingResources.cleanupNoContext=Failed to retrieve JNDI naming context for container [{0}] so no cleanup was performed for that container namingResources.cleanupNoResource=Failed to retrieve JNDI resource [{0}] for container [{1}] so no cleanup was performed for that resource +namingResources.envEntryLookupValue=The environment entry [{0}] specifies both a lookup-name and a value namingResources.mbeanCreateFail=Failed to create MBean for naming resource [{0}] namingResources.mbeanDestroyFail=Failed to destroy MBean for naming resource [{0}] namingResources.resourceTypeFail=The JNDI resource named [{0}] is of type [{1}] but the type is inconsistent with the type(s) of the injection target(s) configured for that resource Modified: tomcat/trunk/java/org/apache/catalina/deploy/NamingResourcesImpl.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/deploy/NamingResourcesImpl.java?rev=1831333&r1=1831332&r2=1831333&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/deploy/NamingResourcesImpl.java (original) +++ tomcat/trunk/java/org/apache/catalina/deploy/NamingResourcesImpl.java Thu May 10 12:46:44 2018 @@ -24,6 +24,7 @@ import java.lang.reflect.InvocationTarge import java.lang.reflect.Method; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; @@ -262,12 +263,22 @@ public class NamingResourcesImpl extends } } + List<InjectionTarget> injectionTargets = environment.getInjectionTargets(); + String value = environment.getValue(); + String lookupName = environment.getLookupName(); + // Entries with injection targets but no value are effectively ignored - if (environment.getInjectionTargets() != null && environment.getInjectionTargets().size() > 0 && - (environment.getValue() == null || environment.getValue().length() == 0)) { + if (injectionTargets != null && injectionTargets.size() > 0 && + (value == null || value.length() == 0)) { return; } + // Entries with lookup-name and value are an error (EE.5.4.1.3) + if (value != null && value.length() > 0 && lookupName != null && lookupName.length() > 0) { + throw new IllegalArgumentException( + sm.getString("namingResources.envEntryLookupValue", environment.getName())); + } + if (!checkResourceType(environment)) { throw new IllegalArgumentException(sm.getString( "namingResources.resourceTypeFail", environment.getName(), Added: tomcat/trunk/test/org/apache/naming/TestEnvEntry.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/naming/TestEnvEntry.java?rev=1831333&view=auto ============================================================================== --- tomcat/trunk/test/org/apache/naming/TestEnvEntry.java (added) +++ tomcat/trunk/test/org/apache/naming/TestEnvEntry.java Thu May 10 12:46:44 2018 @@ -0,0 +1,136 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.naming; + +import java.io.File; + +import javax.servlet.http.HttpServletResponse; + +import org.junit.Assert; +import org.junit.Test; + +import org.apache.catalina.Context; +import org.apache.catalina.startup.Tomcat; +import org.apache.catalina.startup.TomcatBaseTest; +import org.apache.tomcat.util.buf.ByteChunk; + +public class TestEnvEntry extends TomcatBaseTest { + + @Test + public void testEnvEntryBasic() throws Exception { + doTestJndiLookup("env-entry/basic", "basic-value"); + } + + + @Test + public void testEnvEntryValid() throws Exception { + doTestJndiLookup("env-entry/valid", "valid"); + } + + + @Test + public void testEnvEntryInvalid() throws Exception { + doTestJndiLookup("env-entry/invalid", "Not Found"); + } + + + @Test + public void testEnvEntryInjectField() throws Exception { + doTestJndiInjection("property1", "inject-value-1"); + } + + + @Test + public void testEnvEntryInjectProperty() throws Exception { + doTestJndiInjection("property2", "inject-value-2"); + } + + + @Test + public void testEnvEntryInjectFieldNoType() throws Exception { + doTestJndiInjection("property3", "inject-value-3"); + } + + + @Test + public void testEnvEntryInjectionNoValue() throws Exception { + doTestJndiLookup("env-entry/injectNoValue", "Not Found"); + } + + + @Test + public void testEnvEntryLookup() throws Exception { + doTestJndiLookup("env-entry/lookup", "basic-value"); + } + + + @Test + public void testEnvEntryLookupCircular() throws Exception { + doTestJndiLookup("env-entry/circular1", "Naming Error"); + } + + + @Test + public void testEnvEntryLookupInvalid() throws Exception { + doTestJndiLookup("env-entry/lookup-invalid", "Naming Error"); + } + + + private void doTestJndiLookup(String jndiName, String expected) throws Exception { + Tomcat tomcat = getTomcatInstance(); + + File appDir = new File("test/webapp-fragments"); + tomcat.addWebapp(null, "/test", appDir.getAbsolutePath()); + + tomcat.enableNaming(); + tomcat.start(); + + ByteChunk out = new ByteChunk(); + + int rc = getUrl("http://localhost:" + getPort() + "/test/jndi.jsp?jndiName=" + + jndiName, out, null); + Assert.assertEquals(HttpServletResponse.SC_OK, rc); + + // JSP has leading and trailing white-space + String result = out.toString().trim(); + Assert.assertEquals(expected, result); + } + + + private void doTestJndiInjection(String injectionName, String expected) throws Exception { + Tomcat tomcat = getTomcatInstance(); + + File appDir = new File("test/webapp-fragments"); + Context context = tomcat.addWebapp(null, "/test", appDir.getAbsolutePath()); + + Tomcat.addServlet(context, "InjectionServlet", "org.apache.naming.TesterInjectionServlet"); + context.addServletMappingDecoded("/injection", "InjectionServlet"); + + tomcat.enableNaming(); + tomcat.start(); + + ByteChunk out = new ByteChunk(); + + int rc = getUrl("http://localhost:" + getPort() + "/test/injection?injectionName=" + + injectionName, out, null); + Assert.assertEquals(HttpServletResponse.SC_OK, rc); + + // JSP has leading and trailing white-space + String result = out.toString().trim(); + Assert.assertEquals(expected, result); + } +} Propchange: tomcat/trunk/test/org/apache/naming/TestEnvEntry.java ------------------------------------------------------------------------------ svn:eol-style = native Added: tomcat/trunk/test/org/apache/naming/TesterEnvEntry.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/naming/TesterEnvEntry.java?rev=1831333&view=auto ============================================================================== --- tomcat/trunk/test/org/apache/naming/TesterEnvEntry.java (added) +++ tomcat/trunk/test/org/apache/naming/TesterEnvEntry.java Thu May 10 12:46:44 2018 @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.naming; + +public class TesterEnvEntry { + + private static final String VALID = "valid"; + + public TesterEnvEntry(String value) { + if (!VALID.equals(value)) { + throw new IllegalArgumentException(); + } + } + + @Override + public String toString() { + return VALID; + } +} Propchange: tomcat/trunk/test/org/apache/naming/TesterEnvEntry.java ------------------------------------------------------------------------------ svn:eol-style = native Added: tomcat/trunk/test/org/apache/naming/TesterInjectionServlet.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/naming/TesterInjectionServlet.java?rev=1831333&view=auto ============================================================================== --- tomcat/trunk/test/org/apache/naming/TesterInjectionServlet.java (added) +++ tomcat/trunk/test/org/apache/naming/TesterInjectionServlet.java Thu May 10 12:46:44 2018 @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.naming; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.tomcat.util.IntrospectionUtils; + +public class TesterInjectionServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + private String property1 = null; + public String getProperty1() { return property1; } + + // Not used directly. + // Here to ensure properties are injected in preference to fields + private String property2 = null; + public void setProperty2a(String property2) { this.property2 = property2; } + public String getProperty2a() { return property2; } + + private String property2a = null; + public void setProperty2(String property2) { this.property2a = property2; } + public String getProperty2() { return property2a; } + + private String property3 = null; + public String getProperty3() { return property3; } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + + resp.setContentType("text/plain"); + resp.setCharacterEncoding("UTF-8"); + + String injectionName = req.getParameter("injectionName"); + + PrintWriter pw = resp.getWriter(); + pw.print(IntrospectionUtils.getProperty(this, injectionName)); + + // The property should tyake precedence over the field and this should + // be null + if (getProperty2a() != null) { + pw.println(); + pw.print(getProperty2a()); + } + } +} Propchange: tomcat/trunk/test/org/apache/naming/TesterInjectionServlet.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: tomcat/trunk/test/webapp-fragments/WEB-INF/web.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/test/webapp-fragments/WEB-INF/web.xml?rev=1831333&r1=1831332&r2=1831333&view=diff ============================================================================== --- tomcat/trunk/test/webapp-fragments/WEB-INF/web.xml (original) +++ tomcat/trunk/test/webapp-fragments/WEB-INF/web.xml Thu May 10 12:46:44 2018 @@ -86,4 +86,94 @@ <env-entry-type>java.lang.Integer</env-entry-type> <env-entry-value>66</env-entry-value> </env-entry> + + <servlet> + <servlet-name>injection</servlet-name> + <servlet-class>org.apache.naming.TesterInjectionServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>injection</servlet-name> + <url-pattern>/injection</url-pattern> + </servlet-mapping> + + <env-entry> + <env-entry-name>env-entry/basic</env-entry-name> + <env-entry-type>java.lang.String</env-entry-type> + <env-entry-value>basic-value</env-entry-value> + </env-entry> + + <env-entry> + <env-entry-name>env-entry/valid</env-entry-name> + <env-entry-type>org.apache.naming.TesterEnvEntry</env-entry-type> + <env-entry-value>valid</env-entry-value> + </env-entry> + + <env-entry> + <env-entry-name>env-entry/invalid</env-entry-name> + <env-entry-type>org.apache.naming.TesterEnvEntry</env-entry-type> + <env-entry-value>invalid</env-entry-value> + </env-entry> + + <env-entry> + <env-entry-name>env-entry/injectField</env-entry-name> + <env-entry-type>java.lang.String</env-entry-type> + <env-entry-value>inject-value-1</env-entry-value> + <injection-target> + <injection-target-class>org.apache.naming.TesterInjectionServlet</injection-target-class> + <injection-target-name>property1</injection-target-name> + </injection-target> + </env-entry> + + <env-entry> + <env-entry-name>env-entry/injectProperty</env-entry-name> + <env-entry-type>java.lang.String</env-entry-type> + <env-entry-value>inject-value-2</env-entry-value> + <injection-target> + <injection-target-class>org.apache.naming.TesterInjectionServlet</injection-target-class> + <injection-target-name>property2</injection-target-name> + </injection-target> + </env-entry> + + <env-entry> + <env-entry-name>env-entry/injectFieldNoType</env-entry-name> + <env-entry-value>inject-value-3</env-entry-value> + <injection-target> + <injection-target-class>org.apache.naming.TesterInjectionServlet</injection-target-class> + <injection-target-name>property3</injection-target-name> + </injection-target> + </env-entry> + + <env-entry> + <env-entry-name>env-entry/injectNoValue</env-entry-name> + <env-entry-type>java.lang.String</env-entry-type> + <injection-target> + <injection-target-class>org.apache.naming.TesterInjectionServlet</injection-target-class> + <injection-target-name>property4</injection-target-name> + </injection-target> + </env-entry> + + <env-entry> + <env-entry-name>env-entry/lookup</env-entry-name> + <env-entry-type>java.lang.String</env-entry-type> + <lookup-name>java:comp/env/env-entry/basic</lookup-name> + </env-entry> + + <env-entry> + <env-entry-name>env-entry/circular1</env-entry-name> + <env-entry-type>java.lang.String</env-entry-type> + <lookup-name>java:comp/env/env-entry/circular2</lookup-name> + </env-entry> + + <env-entry> + <env-entry-name>env-entry/circular2</env-entry-name> + <env-entry-type>java.lang.String</env-entry-type> + <lookup-name>java:comp/env/env-entry/circular1</lookup-name> + </env-entry> + + <env-entry> + <env-entry-name>env-entry/lookup-invalid</env-entry-name> + <env-entry-type>java.lang.Integer</env-entry-type> + <lookup-name>java:comp/env/env-entry/basic</lookup-name> + </env-entry> + </web-app> \ No newline at end of file Added: tomcat/trunk/test/webapp-fragments/jndi.jsp URL: http://svn.apache.org/viewvc/tomcat/trunk/test/webapp-fragments/jndi.jsp?rev=1831333&view=auto ============================================================================== --- tomcat/trunk/test/webapp-fragments/jndi.jsp (added) +++ tomcat/trunk/test/webapp-fragments/jndi.jsp Thu May 10 12:46:44 2018 @@ -0,0 +1,31 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. +--%> +<%@page contentType="text/plain" pageEncoding="UTF-8"%><% + String jndiName = request.getParameter("jndiName"); + + javax.naming.Context initCtx = new javax.naming.InitialContext(); + javax.naming.Context envCtx = (javax.naming.Context) initCtx.lookup("java:comp/env"); + + try { + Object obj = envCtx.lookup(jndiName); + out.println(obj.toString()); + } catch (javax.naming.NameNotFoundException e) { + out.println("Not Found"); + } catch (javax.naming.NamingException e) { + out.println("Naming Error"); + } +%> \ No newline at end of file Propchange: tomcat/trunk/test/webapp-fragments/jndi.jsp ------------------------------------------------------------------------------ svn:eol-style = native Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1831333&r1=1831332&r2=1831333&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Thu May 10 12:46:44 2018 @@ -77,6 +77,10 @@ <code>@Resource</code> annotations specify a name with an explicit <code>java:</code> namespace. (markt) </fix> + <fix> + Partial fix for <bug>50019</bug>: Add support for + <code><lookup-name></code> with environment entries. (markt) + </fix> </changelog> </subsection> <subsection name="Coyote"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org