BVal
  1. BVal
  2. BVAL-97

More than one META-INF/validation.xml in tomcat webapp

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 0.3-incubating
    • Fix Version/s: 0.4
    • Component/s: None
    • Labels:
      None
    • Environment:

      Tomcat 7.0.16 + OpenEJB 4.0.0-SNAPSHOT

      Description

      To be spec compliant bval check there is only one validation.xml in the classloader.

      However in tomcat WEB-INF/classes/META-INF/validation.xml is returned twice so it fails because of the following code in ValidationParser:

                 if ( path.equals("META-INF/validation.xml") ) {
                      Enumeration<URL> urls = loader.getResources(path);
                      if ( urls.hasMoreElements() && (urls.nextElement() != null) && urls.hasMoreElements() ) {
                          throw new ValidationException("More than one " + path + " is found in the classpath");
                      }
                  }
      

      To fix it urls should be check to see if they are all equals or loader.findResources(path) could be used instead of loader.getResources(path).

        Activity

        Hide
        Romain Manni-Bucau added a comment -

        perfect, thanks

        Show
        Romain Manni-Bucau added a comment - perfect, thanks
        Hide
        Roman Stumm added a comment - - edited

        This is the version I committed:

        protected InputStream getInputStream(String path) throws IOException {
        ClassLoader loader = PrivilegedActions.getClassLoader(getClass());
        InputStream inputStream = loader.getResourceAsStream(path);

        if (inputStream != null) {
        // spec says: If more than one META-INF/validation.xml file
        // is found in the classpath, a ValidationException is raised.
        Enumeration<URL> urls = loader.getResources(path);
        if (urls.hasMoreElements()) {
        String url = urls.nextElement().toString();
        while (urls.hasMoreElements()) {
        if (!url.equals(urls.nextElement().toString()))

        { // complain when first duplicate found throw new ValidationException("More than one " + path + " is found in the classpath"); }

        }
        }
        }

        return inputStream;
        }

        Show
        Roman Stumm added a comment - - edited This is the version I committed: protected InputStream getInputStream(String path) throws IOException { ClassLoader loader = PrivilegedActions.getClassLoader(getClass()); InputStream inputStream = loader.getResourceAsStream(path); if (inputStream != null) { // spec says: If more than one META-INF/validation.xml file // is found in the classpath, a ValidationException is raised. Enumeration<URL> urls = loader.getResources(path); if (urls.hasMoreElements()) { String url = urls.nextElement().toString(); while (urls.hasMoreElements()) { if (!url.equals(urls.nextElement().toString())) { // complain when first duplicate found throw new ValidationException("More than one " + path + " is found in the classpath"); } } } } return inputStream; }
        Hide
        Roman Stumm added a comment -

        used the patch in a slightly modified form in 0.4-incubating-SNAPSHOT:

        Revision #1161606 Committed by romanstumm at 25.08.11 17:35:57

        Changed the duplication-check for "More than one META-INF/validation.xml in tomcat webapp" based on the patch from Romain Manni-Bucau, but removed the hard-coded resource name "META-INF/validation.xml", because I think the spec means that the validationXmlFile must be a unique resource, regardless of its concrete name.

        Show
        Roman Stumm added a comment - used the patch in a slightly modified form in 0.4-incubating-SNAPSHOT: Revision #1161606 Committed by romanstumm at 25.08.11 17:35:57 Changed the duplication-check for "More than one META-INF/validation.xml in tomcat webapp" based on the patch from Romain Manni-Bucau, but removed the hard-coded resource name "META-INF/validation.xml", because I think the spec means that the validationXmlFile must be a unique resource, regardless of its concrete name.
        Hide
        Romain Manni-Bucau added a comment -

        replacing ValidationParser.getInputStream() with:

        private InputStream getInputStream(String path) throws IOException {
                ClassLoader loader = PrivilegedActions.getClassLoader(getClass());
                InputStream inputStream = loader.getResourceAsStream( path );
        
                if ( inputStream != null ) {
                    // spec says: If more than one META-INF/validation.xml file
                    // is found in the classpath, a ValidationException is raised.
                    if ( path.equals("META-INF/validation.xml") ) {
                        Enumeration<URL> urls = loader.getResources(path);
                        Set<String> uniqueUrls = new HashSet<String>();
                        while (urls.hasMoreElements()) {
                            uniqueUrls.add(urls.nextElement().toString());
                        }
                        if (uniqueUrls.size() > 1) {
                            throw new ValidationException("More than one " + path + " is found in the classpath"
                                    + uniqueUrls);
                        }
                    }
                }
        
                return inputStream;
            }
        

        works.

        Show
        Romain Manni-Bucau added a comment - replacing ValidationParser.getInputStream() with: private InputStream getInputStream( String path) throws IOException { ClassLoader loader = PrivilegedActions.getClassLoader(getClass()); InputStream inputStream = loader.getResourceAsStream( path ); if ( inputStream != null ) { // spec says: If more than one META-INF/validation.xml file // is found in the classpath, a ValidationException is raised. if ( path.equals( "META-INF/validation.xml" ) ) { Enumeration<URL> urls = loader.getResources(path); Set< String > uniqueUrls = new HashSet< String >(); while (urls.hasMoreElements()) { uniqueUrls.add(urls.nextElement().toString()); } if (uniqueUrls.size() > 1) { throw new ValidationException( "More than one " + path + " is found in the classpath" + uniqueUrls); } } } return inputStream; } works.

          People

          • Assignee:
            Roman Stumm
            Reporter:
            Romain Manni-Bucau
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development