0 Replies Latest reply: Sep 13, 2010 11:42 PM by Flavia Rainone RSS

AbstractStructureDeployer.getRelativePath fails to handle unrelated paths

Flavia Rainone Master

 

For the weld-int tests I've been working on, I ended up finding a problem involving the case where a classpath entry in the manifest file generates a faulty classpath entry in the deployment context.

 

In the test I'm performing, I deploy a file named weld-translator.jar that lacks a class. The class needed for the deployment to be successful is in weld-translator-lib.jar, located in $JBOSS_HOME/server/all (or anywhere you name in the filesystem, except in the deploy dir). This jar is referenced by a relative classpath entry in the weld-translator.jar manifest file.

 

The problem is noticed when WeldFilesDeployer checks on whether the file weld-translator-lib.jar/META-INF/beans.xml exists. The exists method returns false when it should return true.

 

What I discovered is that:

  1. VFSUtils.addManifestLocations      transforms the relative Classpath entry found in the manifest file      (../weld-translator-lib.jar) into an absolute path      ($JBOSS_HOME/server/all/weld-translator-lib.jar)
  2. AbstractStructureDeployer.getRelativePath      was supposed to revert it to a relative path, but fails to do so,      instead, it returns the absolute path      $JBOSS_HOME/server/all/weld-translator/lib.jar
  3. VFSStructureBuilder      assumes that the path is relative, and, for that reason, it assembles the following classpath with the goal of getting the absolute classpath: $JBOSS_HOME/server/all/deploy/weld-translator.jar/$JBOSS_HOME/server/all/weld-translator-lib.jar
  4. WeldFilesDeployers uses the path generated in the step above to append the suffix META-INF/beans.xml. That's why it fails to find it.

 

I created a Jira to fix AbstractStructureDeployer.getRelativePath, and I wrote a fix for it as well.

 

         // Assuming that child and parent don't have a parent -> child relationship
         // but instead, have a common path with different suffixes
         VirtualFile tempFile = parent;
         StringBuilder relativePath = new StringBuilder();
         // find the prefix that child shares with parent (in tempFile)
         while(!childPath.startsWith(tempFile.getPathName()))
         {
            relativePath.append("/.."); // for every level we need to go up in the file system 
            tempFile = tempFile.getParent();
         }
         relativePath.append(childPath.substring(tempFile.getPathName().length()));
         childPath = relativePath.toString().substring(1);

 

Ales, can you please let me know if everything is ok? I couldn't find tests for getRelativePath... should I write one for JBDEPLOY-265? Where should that test be added to?