/*
*/
/*
* This is a Java servlet that allows you to transform
* a WSDL file using XSL. In a general sense, it will
* actually allow you to transform any file using XSL,
* as long as both the source file and the XSL file are
* available via HTTP. Just compile it and add it to
* the servlet directory on your server.
*
* MAKE SURE you either modify the defaultXslFile variable
* to make it point to a valid file on your server, or
* provide an initialization parameter to override it
* with a valid file (see the code for details).
*
* I've compiled and tested this on an R5 Domino server,
* using the Domino Servlet Manager. To compile and run it
* properly, you should have the following in your classpath
* (these files should already be in your Domino data directory,
* as they come with R5.03+ by default):
* jsdk.jar (servlet stuff)
* LotusXSL.jar (XSL stuff)
* XML4j.jar (the Node class)
*
* Naturally, this should also work with other servers that
* support servlets.
*
* version 1.0
* Julian Robichaux -- http://www.nsftools.com
*/
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import org.w3c.dom.Node;
import com.lotus.xsl.XSLTInputSource;
import com.lotus.xsl.XSLTResultTarget;
import com.lotus.xsl.XSLProcessor;
import org.xml.sax.SAXException;
public class TransformWSDL extends HttpServlet {
// these are the parameter names we're looking for
// (remember that they're case-sensitive, in case
// you want to pass them with the Query String of
// the URL)
private static String wsdlParam = "wsdlfile";
private static String xslParam = "xslfile";
// this is the default XSL file we'll use for
// transformation, which I got from:
// http://community.jedit.org/modules.php?op=modload&name=news&file=article&sid=202
// there's also an interesting one at:
// http://www.capescience.com/simplifiedwsdl.xslt
// MAKE SURE YOU CHANGE THIS TO A VALID PATH/FILE
// ON YOUR SERVER, OR SET IT USING THE servlets.properties
// FILE ON THE DOMINO SERVER!
private static String defaultXslFile = "d:\\notes5\\data\\domino\\servlet\\Soap.xsl";
// this is the name of the initialization parameter
// you can use to override the defaultXslFile setting
private static String defaultXslParam = "xslParam";
/*
* In case anyone asks, here's a short description of
* our servlet (not a necessary method, but nice to
* include).
*/
public String getServletInfo() {
return "A servlet that transforms WSDL files based on a given XSL file.";
}
/*
* The init method runs once, when the servlet starts.
* It's not necessary to override this method, but you'll
* need it if you're going to read in any initialization
* parameters on startup (like to initialize your global
* variables). It's used here so you can optionally
* override the default XSL file. On R5 Domino servers,
* the initialization parameters can normally be set in
* the servlets.properties file (see the Notes Designer Help
* for more information).
*/
public void init(ServletConfig config) throws ServletException
{
// do the standard initialization routines first
super.init(config);
// Get initialization parameters, if any
String xslParam = getInitParameter(defaultXslParam);
if ((xslParam != null) && (xslParam.length() > 0))
defaultXslFile = xslParam;
// If we end up with no defaultXslFile for some reason,
// don't run the servlet, and say why
if ((defaultXslFile == null) || (defaultXslFile.length() == 0)) {
Enumeration initParams = getInitParameterNames();
StringBuffer sb = new StringBuffer("The parameters that were used were:\n");
while (initParams.hasMoreElements()) {
String param = (String)initParams.nextElement();
sb.append(param + "=" + getInitParameter(param) + "\n");
}
// write all the parameters we did find to the servlet log
config.getServletContext().log(sb.toString());
// the UnavailableException should keep the servlet from running
throw new UnavailableException (this,
"Servlet Initialization Error: Required parameter " +
xslParam + " was not available on servlet startup.");
}
}
/*
* Here's where we process the HTTP GET request. For this
* servlet, we're doing two things: first we check to see if
* there's a query string that we recognize, in which case
* we can just send the request to the doPost method for
* processing (this way you can use this servlet as a link,
* for automation). If the query string doesn't exist or
* doesn't have parameters we're interested in, we display
* an HTML form to the user to get some input.
*/
public void doGet (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
// if someone sent this request with a query string
// that we recognize, send it to the doPost method
// for processing (for example:
// http://thisserver/servlet/TransformWSDL?wsdlfile=http://someserver/somefile.wsdl)
if (request.getParameter(wsdlParam) != null) {
doPost(request, response);
return;
}
// construct the HTML form we'll use for input
StringBuffer sb = new StringBuffer("");
sb.append("\n");
sb.append("Transform WSDL \n");
sb.append("\n");
sb.append("Transform a WSDL file using XSLT
\n");
sb.append("");
// remember to set the response headers BEFORE
// you get the output stream
response.setContentType("text/html");
response.setContentLength(sb.length());
ServletOutputStream out = response.getOutputStream();
// and send the HTML to the browser
out.print(sb.toString());
// it's always polite to close your output stream
// when you're done writing...
out.close();
}
/*
* This is where we process the HTTP POST request. Just to
* mix things up a little, we'll send the output information
* through a PrintWriter instead of a ServletOutputStream.
* We're taking the WSDL file that the user entered (probably
* a URL, although it could also be a file that's local to
* the server if the user knows the path), and either an XSL
* file path that the user entered or the default one we're
* using for this servlet. We then do an XSL transformation
* with the XSLProcessor class that's in the LotusXSL jar that
* ships with Domino, and send the output to the client.
*/
public void doPost (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// set the response headers before you get the writer
// (in this case we're not going to know the Content-length
// of the response, but that's not stricly necessary)
response.setContentType("text/html");
PrintWriter out = response.getWriter();
try {
/*
// do this if you want to get the whole request,
// but keep in mind that after you call a getInputStream
// you can't use the getParameterXXX calls -- it's
// either one or the other (you could also use getReader
// to use a BufferedReader, if that's easier)
int bytesin;
byte[] buf = new byte[1024];
ServletInputStream sis = request.getInputStream();
while ((bytesin = sis.read(buf)) >= 0)
out.print(new String(buf, 0, bytesin));
*/
// for debugging, display the parameters we have available
Enumeration enum = request.getParameterNames();
out.println("Request Parameters were: