Nullpointer exception when validator resources loaded from the custom 
configuration file in 1.0.4
-------------------------------------------------------------------------------------------------

                 Key: SHALE-481
                 URL: https://issues.apache.org/struts/browse/SHALE-481
             Project: Shale
          Issue Type: Bug
          Components: Validator
    Affects Versions: 1.0.4
         Environment: Windows Xp Sp2, Jdk 1.5, Tomcat 5.5, shale 1.0.4
            Reporter: ankit kakkar


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) {
480                 pathnames = Globals.DEFAULT_VALIDATOR_RULES;
481              }
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[] {validatorRules}));
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++) {
504                 URL url = (URL) urlList.get(urlIndex);
505                 urlArray[urlIndex] = url.toExternalForm();
506              }
507              validatorResources = new ValidatorResources(urlArray);
508              applicationMap.put(VALIDATOR_RESOURCES_KEY, 
validatorResources);
509           } catch (IOException ex) {
510              logger.log(Level.SEVERE, 
messages.getMessage("commonsValidator.loaderror"), ex);
511              return null;
512           } 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

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to