Details
-
Bug
-
Status: Open
-
Blocker
-
Resolution: Unresolved
-
1.0.4
-
None
-
None
-
Windows Xp Sp2, Jdk 1.5, Tomcat 5.5, shale 1.0.4
-
Important
Description
The server is throwing nullpointer exception whenever it tries to load rules from custom rule xml file.
java.lang.NullPointerException
at org.apache.shale.validator.CommonsValidator.getValidatorAction(CommonsValidator.java:730)
at org.apache.shale.validator.faces.ValidatorScript.writeValidationFunctions(ValidatorScript.java:424)
at org.apache.shale.validator.faces.ValidatorScript.encodeBegin(ValidatorScript.java:652)
at javax.faces.webapp.UIComponentTag.encodeBegin(UIComponentTag.java:584)
at javax.faces.webapp.UIComponentTag.doStartTag(UIComponentTag.java:471)
at org.apache.jsp.greeting_jsp._jspx_meth_s_005fvalidatorScript_005f0(greeting_jsp.java:319)
at org.apache.jsp.greeting_jsp._jspx_meth_h_005fform_005f0(greeting_jsp.java:173)
at org.apache.jsp.greeting_jsp._jspx_meth_f_005fview_005f0(greeting_jsp.java:115)
at org.apache.jsp.greeting_jsp._jspService(greeting_jsp.java:80)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:469)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:403)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322)
at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:147)
at org.apache.shale.validator.faces.ValidatorViewHandler.renderView(ValidatorViewHandler.java:130)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87)
at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
at java.lang.Thread.run(Thread.java:595)
Jan 4, 2008 4:53:50 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet Faces Servlet threw exception
When I analyzed this issue, I found that there is a bit of code missing which was handling the null case and was loading the customer validation xml file from the web.xml of the application.
I am pasting the relevent function from the latest version ie 1.0.4
package org.apache.shale.validator;
/**
- <p>Return the validator resources that were configured and cached
- at application startup time.</p>
*/
private static ValidatorResources getValidatorResources() { FacesContext context = FacesContext.getCurrentInstance(); ExternalContext external = context.getExternalContext(); Map applicationMap = external.getApplicationMap(); return (ValidatorResources) applicationMap.get(Globals.VALIDATOR_RESOURCES); }
Now I am pasting the same function from the previous version. I noticed this on the http://shale.apache.org/shale-core/xref/org/apache/shale/validator/CommonsValidator.html url.
/***
461 * This method lazily configures validator resources by reading either
462 * the default <code>validalidator-rules.xml</code> file in
463 * shale-core.jar or the list of resources configured using the init
464 * param <code>org.apache.shale.validator.VALIDATOR_RULES</code>.
465 *
466 * @return validator resources loaded from the configuration file.
467 */
468 private static ValidatorResources getValidatorResources() {
469 final String VALIDATOR_RESOURCES_KEY =
470 "org.apache.shale.validator.resources";
471 FacesContext context = FacesContext.getCurrentInstance();
472 ExternalContext external = context.getExternalContext();
473 Map applicationMap = external.getApplicationMap();
474 ValidatorResources validatorResources
475 = (ValidatorResources) applicationMap.get(VALIDATOR_RESOURCES_KEY);
476 if (validatorResources == null) {
477 try {
478 String pathnames = external.getInitParameter(Globals.VALIDATOR_RULES);
479 if (pathnames == null || pathnames.length() <= 0)
482 StringTokenizer st = new StringTokenizer(pathnames, ",");
483 List urlList = new ArrayList();
484 while (st.hasMoreTokens()) {
485 String validatorRules = st.nextToken().trim();
486 logger.log(Level.INFO,
487 messages.getMessage("commonsValidator.loadresource",
488 new Object[]
489 URL input = external.getResource(validatorRules);
490 if (input == null) { 491 input = CommonsValidator.class.getResource(validatorRules); 492 }
493 if (input != null) { 494 urlList.add(input); 495 } else {
496 logger.log(Level.WARNING,
497 messages.getMessage("commonsValidator.skipresource",
498 new Object[] {validatorRules}
));
499 }
500 }
501 int urlSize = urlList.size();
502 String[] urlArray = new String[urlSize];
503 for (int urlIndex = 0; urlIndex < urlSize; urlIndex++)
507 validatorResources = new ValidatorResources(urlArray);
508 applicationMap.put(VALIDATOR_RESOURCES_KEY, validatorResources);
509 } catch (IOException ex)
catch (SAXException ex)
{ 513 logger.log(Level.SEVERE, messages.getMessage("commonsValidator.loaderror"), ex); 514 return null; 515 }516 }
517
518 return validatorResources;
519 }
You yourself can see here that validatorResources is checked for null in the second case but it has been returned directly from the latest version implementation.
Pls look into the same asap and if now there is some alternate way of doing this thing, then do let me know.
thanks and regards,
ankit kakkar