Skip to content
This repository has been archived by the owner on May 28, 2018. It is now read-only.

Some Web containers don't support context.getRealPath #304

Closed
glassfishrobot opened this issue Jan 22, 2008 · 8 comments
Closed

Some Web containers don't support context.getRealPath #304

glassfishrobot opened this issue Jan 22, 2008 · 8 comments

Comments

@glassfishrobot
Copy link

Some Web containers, like Weblogic, do not support ServletContext.getRealPath
for deployed web applications, null values are returned. So the default
configuration for scanning class files in /WEB-INF/classes and /WEB-INF/lib does
not work.

However, Servlet.getResource(), returns file-based URLs, at least for Weblogic,
from which the resolved paths for /WEB-INF/classes and /WEB-INF/lib can be obtained.

See the email here for more details:

https://jersey.dev.java.net/servlets/ReadMsg?list=users&msgNo=508

If the getRealPath("/WEB-INF/classes") returns null then try the
getResource("/WEB-INF/classes) and if it returns a file-based URL then extract
the path. Otherwise thrown an exception saying the the default servlet
configuration cannot be supported.

Environment

Operating System: All
Platform: Sun

@glassfishrobot
Copy link
Author

Reported by sandoz@java.net

@glassfishrobot
Copy link
Author

Was assigned to jersey-issues

@glassfishrobot
Copy link
Author

gdavison@java.net said:
It might be possible to fix this by using getResourcePaths instead. As long as
the server implements a sensible URL scheme for the mapped paths, with folders
ending in "/", it should be easy to iterate over the classpath.

Consider the following resource:

@path("/context")
public class ServletContextDumper {

@get
public String dumpLocations(@context
ServletContext sc) throws MalformedURLException

{ StringBuilder sb = new StringBuilder(); // sb.append("classes\n"); String startPath = "/WEB-INF/classes"; iterate(sc, sb, startPath); sb.append("lib\n"); startPath = "/WEB-INF/lib"; iterate(sc, sb, startPath); // return sb.toString(); }

private void iterate(ServletContext sc, StringBuilder sb,
String startPath) throws MalformedURLException {
Set paths = sc.getResourcePaths(startPath);
for (String path : paths) {
sb.append(path);
sb.append(" = ");
sb.append(sc.getResource(path));
sb.append("\n");

//

if (path.endsWith("/"))

{ iterate(sc, sb, path); }

else {
try {
InputStream inputStream = sc.getResourceAsStream(path);
try {
if (path.endsWith(".class"))

{ sb.append("First few bytes as hex are are "); sb.append(Integer.toString(inputStream.read(), 16)); sb.append(Integer.toString(inputStream.read(), 16)); sb.append(Integer.toString(inputStream.read(), 16)); sb.append(Integer.toString(inputStream.read(), 16)); }

else

{ sb.append("First few charaters are "); sb.append(Character.toString((char)inputStream.read())); sb.append(Character.toString((char)inputStream.read())); sb.append(Character.toString((char)inputStream.read())); sb.append(Character.toString((char)inputStream.read())); }

sb.append(" \n");
} finally

{ inputStream.close(); }

} catch (IOException ioe)

{ ioe.printStackTrace(); }

}
}
}

public static class ExampleInnerClass {

}
}

This will list all the classes in nested directories and any jar under the lib
directory. Experimentation by Paul S shows this should work under glassfish.
Need to be tested under JBoss etc.

When run on weblogic the output for this application looks like:

classes
/WEB-INF/classes/project1/ = zip:C:/Documents and
Settings/gdavison.EDC/Application
Data/JDeveloper/system11.1.1.2.35.54.57/DefaultDomain/servers/DefaultServer/tmp/_WL_user/jersey/gsvl5q/war/WEB-INF/lib/_wl_cls_gen.jar!/project1/
/WEB-INF/classes/project1/ServletContextDumper.class = zip:C:/Documents and
Settings/gdavison.EDC/Application
Data/JDeveloper/system11.1.1.2.35.54.57/DefaultDomain/servers/DefaultServer/tmp/_WL_user/jersey/gsvl5q/war/WEB-INF/lib/_wl_cls_gen.jar!/project1/ServletContextDumper.class
First few bytes as hex are are cafebabe
/WEB-INF/classes/project1/ServletContextDumper$ExampleInnerClass.class =
zip:C:/Documents and Settings/gdavison.EDC/Application
Data/JDeveloper/system11.1.1.2.35.54.57/DefaultDomain/servers/DefaultServer/tmp/_WL_user/jersey/gsvl5q/war/WEB-INF/lib/_wl_cls_gen.jar!/project1/ServletContextDumper$ExampleInnerClass.class
First few bytes as hex are are cafebabe
lib
/WEB-INF/lib/jsr311-api-1.0.jar = file:/C:/Documents and
Settings/gdavison.EDC/Application
Data/JDeveloper/system11.1.1.2.35.54.57/DefaultDomain/servers/DefaultServer/tmp/_WL_user/jersey/gsvl5q/war/WEB-INF/lib/jsr311-api-1.0.jar
First few charaters are PK��
/WEB-INF/lib/jersey-server-1.0.3.jar = file:/C:/Documents and
Settings/gdavison.EDC/Application
Data/JDeveloper/system11.1.1.2.35.54.57/DefaultDomain/servers/DefaultServer/tmp/_WL_user/jersey/gsvl5q/war/WEB-INF/lib/jersey-server-1.0.3.jar
First few charaters are PK��
/WEB-INF/lib/jettison-1.0.1.jar = file:/C:/Documents and
Settings/gdavison.EDC/Application
Data/JDeveloper/system11.1.1.2.35.54.57/DefaultDomain/servers/DefaultServer/tmp/_WL_user/jersey/gsvl5q/war/WEB-INF/lib/jettison-1.0.1.jar
First few charaters are PK��
/WEB-INF/lib/_wl_cls_gen.jar = file:/C:/Documents and
Settings/gdavison.EDC/Application
Data/JDeveloper/system11.1.1.2.35.54.57/DefaultDomain/servers/DefaultServer/tmp/_WL_user/jersey/gsvl5q/war/WEB-INF/lib/_wl_cls_gen.jar
First few charaters are PK��
/WEB-INF/lib/jackson-lgpl-0.9.4.jar = file:/C:/Documents and
Settings/gdavison.EDC/Application
Data/JDeveloper/system11.1.1.2.35.54.57/DefaultDomain/servers/DefaultServer/tmp/_WL_user/jersey/gsvl5q/war/WEB-INF/lib/jackson-lgpl-0.9.4.jar
First few charaters are PK��
/WEB-INF/lib/asm-3.1.jar = file:/C:/Documents and
Settings/gdavison.EDC/Application
Data/JDeveloper/system11.1.1.2.35.54.57/DefaultDomain/servers/DefaultServer/tmp/_WL_user/jersey/gsvl5q/war/WEB-INF/lib/asm-3.1.jar
First few charaters are PK��
/WEB-INF/lib/jersey-json-1.0.3.jar = file:/C:/Documents and
Settings/gdavison.EDC/Application
Data/JDeveloper/system11.1.1.2.35.54.57/DefaultDomain/servers/DefaultServer/tmp/_WL_user/jersey/gsvl5q/war/WEB-INF/lib/jersey-json-1.0.3.jar
First few charaters are PK��
/WEB-INF/lib/jersey-client-1.0.3.jar = file:/C:/Documents and
Settings/gdavison.EDC/Application
Data/JDeveloper/system11.1.1.2.35.54.57/DefaultDomain/servers/DefaultServer/tmp/_WL_user/jersey/gsvl5q/war/WEB-INF/lib/jersey-client-1.0.3.jar
First few charaters are PK��
/WEB-INF/lib/jersey-core-1.0.3.jar = file:/C:/Documents and
Settings/gdavison.EDC/Application
Data/JDeveloper/system11.1.1.2.35.54.57/DefaultDomain/servers/DefaultServer/tmp/_WL_user/jersey/gsvl5q/war/WEB-INF/lib/jersey-core-1.0.3.jar
First few charaters are PK��

Note that cafebabe and PK are the magic properties for .class files and
.zip/.jar file respectively.

@glassfishrobot
Copy link
Author

gdavison@java.net said:
Workaround for weblogic 10.X

You can configure weblogic to return a non-null value for getRealPath with the
following entry in WEB-INF/weblogic.xml

<weblogic-web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-web-app
http://www.bea.com/ns/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd"
xmlns="http://www.bea.com/ns/weblogic/weblogic-web-app">

true

See specificaly CR CR299135 in
http://edocs.bea.com/wls/docs100/issues/known_resolved.html

@glassfishrobot
Copy link
Author

sandoz@java.net said:
Fixed in the trunk.

@glassfishrobot
Copy link
Author

gdavison@java.net said:
Verified against Weblogic R11 PS1, problem no longer reproduces.

@glassfishrobot
Copy link
Author

Marked as fixed on Tuesday, December 1st 2009, 9:21:10 pm

@glassfishrobot
Copy link
Author

This issue was imported from java.net JIRA JERSEY-32

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

2 participants