Passthru Servlet w/ Tomcat

I’m trying to get the passthru servlet working w/ Tomcat, and am not having much luck. I’ve tried following the documentation, but the only docs I’ve found explain how to do it using Apache Jserv. I’ve looked at the forum, and found some useful stuff, but I’m having difficulty putting it all together.

I’m running on a Unix system: Tamino 3.1.1.1, Tomcat 4.0.1. (I know I need help w/ the files under tomcat that I need to modify - server.xml and web.xml, but I don’t know what else it entails.) Tamino is running on port 8070, and Tomcat is running on port 8090.

We wanted to demo this next week (July 9 or 10), but I’m really stuck.

Following is the most detailed list of what’s working and what’s not that I can come up with:

Any help would be greatly appreciated - thanks.


these work:
http://jefferson.village.virginia.edu:8070/tamino/cindy/whitman?_xql=//div1

http://jefferson.village.virginia.edu:8070/tamino/cindy/stylesheets?_xql=xsl:stylesheet


but this doesn’t work:
http://jefferson.village.virginia.edu:8070/tamino/cindy/whitman?_xql/stylesheets/test.xsl=//div1

gives this error:
The system cannot locate the object specified. Error processing resource ‘http://jefferson.village.virginia.edu:8070/tamino/cindy/stylesheets/test.xsl’.


this works:
http://jefferson.village.virginia.edu:8090/tamino/servlet/com.softwareag.tamino.api.servlet.TaminoTest


this doesn’t work:
http://jefferson.village.virginia.edu:8070/tamino/servlet/com.softwareag.tamino.api.servlet.TaminoFilter/tamino/cindy/whitman?_xql=//div1

gives the error:
Tamino database unknown: servlet

this doesn’t work:
http://jefferson.village.virginia.edu:8090/tamino/servlet/com.softwareag.tamino.api.servlet.TaminoFilter/tamino/cindy/whitman?_xql=//div1

gives the error:
javax.servlet.ServletException: Cannot allocate servlet instance for path /tamino/servlet/com.softwareag.tamino.api.servlet.TaminoFilter/tamino/cindy/whitman
at org.apache.catalina.servlets.InvokerServlet.serveRequest(InvokerServlet.java:415)
at org.apache.catalina.servlets.InvokerServlet.doGet(InvokerServlet.java:180)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2344)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:462)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:163)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1011)
at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1106)
at java.lang.Thread.run(Thread.java:484)


root cause

java.lang.NoClassDefFoundError: com/jclark/xsl/sax/Destination
at java.lang.Class.newInstance0(Native Method)
at java.lang.Class.newInstance(Class.java:237)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:820)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:615)
at org.apache.catalina.servlets.InvokerServlet.serveRequest(InvokerServlet.java:396)
at org.apache.catalina.servlets.InvokerServlet.doGet(InvokerServlet.java:180)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2344)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:462)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:163)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1011)
at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1106)
at java.lang.Thread.run(Thread.java:484)

The passthru servlet works by concatenating parts of the URL you supply to build a Tamino data query, and to build the location of a stylesheet. The result of the query is processed by the stylesheet and the result is presented to the client.

A typical passthru URL looks like this:

http://machinename/servlet/styler/tamino/mydb/mycollection?_xql=
mydoctype&_xslsrc=myxsldoctype/mystylesheet.xsl

The first part of the URL invokes the servlet using alias “styler” to represent com.softwareag.tamino.api.servlet.TaminoFilter.

The servlet then reads the rest of the URL as data :

tamino/mydb/mycollection?_xql=
mydoctype&_xslsrc=myxsldoctype/mystylesheet.xsl

It concatenates the first part with the machine name part of the original URL to give a complete Tamino query URL:

http://machinename/tamino/mydb/mycollection?_xql=mydoctype

and a complete stylesheet location:

http://machinename/tamino/mydb/mycollection/myxsldoctype/mystylesheet.xsl

In your case, this concatenation can’t work because the servlet runs on port 8090 but Tamino listens only (via Apache) on port 8070. So your Tamino request never hits Tamino, it hits Tomcat, who misinterprets it as a servlet name.

The standard (jserv) implementation maps servlet requests directly from Apache to Jserv so that no separate ports are needed. I think you need to do the same by installing MOD_JK so that servlet requests are passed directly by Apache to Tomcat and all URLS are directed at Apache’s port.

For more on mod_jk see: Mod_jk help page

Alternatively you could opt for the jserv solution in the short-term.

Apache Jserv would work from a different port?

Yes - but the default jserv installation installs a link to apache so the port difference is completely transparent. Tomcat is designed to be used stand-alone - jserv isn’t.

There is some useful info on integrating Tomcat and Apache, for various versions and platforms, at: Galatea’s FlashGuides site

HTH