You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by Glen Daniels <gd...@macromedia.com> on 2001/08/17 22:51:24 UTC
IMPORTANT!!! RE: cvs commit: xml-axis/java/test/utils TestXMLUti
ls.java
With this change, I have introduced a dependency on WSDL4J, which must be in
your classpath at compile time and on the server's classpath at runtime.
I'll tweak this to make it optional in a later version.
--Glen
> -----Original Message-----
> From: gdaniels@apache.org [mailto:gdaniels@apache.org]
> Sent: Friday, August 17, 2001 4:44 PM
> To: xml-axis-cvs@apache.org
> Subject: cvs commit: xml-axis/java/test/utils TestXMLUtils.java
>
>
> gdaniels 01/08/17 13:44:01
>
> Modified: java/src/org/apache/axis/handlers JWSProcessor.java
> java/src/org/apache/axis/transport/http
> AxisServlet.java
> java/src/org/apache/axis/utils XMLUtils.java
> java/test/utils TestXMLUtils.java
> Added: java/src/org/apache/axis/utils WSDLUtils.java
> Log:
> Enable auto-gen of WSDL (for JWS files only at the moment).
>
> Also revamp XMLUtils to enable sending documents to Writers
> as well as OutputStreams.
>
> Doing an HTTP GET on a JWS url will now return a little test page.
> Adding ?WSDL to the query string will cause the automatic
> generation of a WSDL file for the service, determined by
> introspection.
>
> This is a first cut, and I haven't tested the resultant WSDL against
> any clients yet. There's a lot left to do, I just want to
> get this version
> checked in so I can continue work from home.
>
> Obvious things which need doing:
>
> - Support for non-JWS services (via URLMapper)
> - A more general framework for generating this data, which will
> allow handlers in a service's deployed processing path to
> influence the WSDL, indicating headers, encoding styles,
> etc...
> - Support deployment info for methods - right now we assume
> all methods are available.
>
> Revision Changes Path
> 1.14 +6 -0
> xml-axis/java/src/org/apache/axis/handlers/JWSProcessor.java
>
> Index: JWSProcessor.java
> ===================================================================
> RCS file:
> /home/cvs/xml-axis/java/src/org/apache/axis/handlers/JWSProces
> sor.java,v
> retrieving revision 1.13
> retrieving revision 1.14
> diff -u -r1.13 -r1.14
> --- JWSProcessor.java 2001/07/12 15:03:45 1.13
> +++ JWSProcessor.java 2001/08/17 20:44:00 1.14
> @@ -178,6 +178,12 @@
> cl.registerClass( clsName, cFile );
> msgContext.setClassLoader( cl );
>
> + if (msgContext.getProperty("is-http-get") != null) {
> + Class c = cl.loadClass(clsName);
> + msgContext.setProperty("JWSClass", c);
> + return;
> + }
> +
> /* Create a new RPCProvider - this will be the
> "service" */
> /* that we invoke.
> */
>
> /******************************************************************/
>
>
>
> 1.35 +73 -4
> xml-axis/java/src/org/apache/axis/transport/http/AxisServlet.java
>
> Index: AxisServlet.java
> ===================================================================
> RCS file:
> /home/cvs/xml-axis/java/src/org/apache/axis/transport/http/Axi
> sServlet.java,v
> retrieving revision 1.34
> retrieving revision 1.35
> diff -u -r1.34 -r1.35
> --- AxisServlet.java 2001/08/15 21:30:17 1.34
> +++ AxisServlet.java 2001/08/17 20:44:00 1.35
> @@ -59,9 +59,11 @@
> import javax.servlet.* ;
> import javax.servlet.http.* ;
> import org.apache.axis.* ;
> +import org.apache.axis.registries.HandlerRegistry;
> import org.apache.axis.server.* ;
> -import org.apache.axis.utils.* ;
> +import org.apache.axis.utils.*;
> import org.apache.axis.message.*;
> +import org.w3c.dom.Document;
>
> /**
> *
> @@ -88,11 +90,78 @@
>
> public void doGet(HttpServletRequest req,
> HttpServletResponse res)
> throws ServletException, IOException {
> +
> + ServletContext context =
> getServletConfig().getServletContext();
> + MessageContext msgContext = new MessageContext(engine);
> + HandlerRegistry hr = engine.getHandlerRegistry();
> +
> + String realpath =
> context.getRealPath(req.getServletPath());
> + if (realpath != null)
> + msgContext.setProperty(Constants.MC_REALPATH,
> realpath);
> +
> + if ((realpath!=null) && (realpath.endsWith(".jws"))) {
> + try {
> + // !!! Kludge for right now to allow the
> JWSProcessor to
> + // get the class without actually invoking it.
> + msgContext.setProperty("is-http-get", "yes");
> +
> + Handler handler = hr.find("JWSProcessor");
> + if (handler != null) {
> + handler.invoke(msgContext);
> + Handler serviceHandler =
> msgContext.getServiceHandler();
> + if (serviceHandler != null) {
> + res.getWriter().println("Got service " +
> + serviceHandler);
> + }
> + Class cls =
> (Class)msgContext.getProperty("JWSClass");
> +
> + // !!! Need to make this an absolute URI
> + String url = req.getRequestURI();
> +
> + // !!! This should be something reasonable
> + String urn = "urn:service";
> +
> + // !!! This should come from the service itself
> + String description = "Some service";
> +
> + if (req.getParameter("WSDL") != null) {
> + res.setContentType("text/xml");
> + WSDLUtils.writeWSDLDoc(cls, url,
> urn, description,
> +
> msgContext.getTypeMappingRegistry(),
> + res.getWriter());
> + return;
> + } else {
> + res.setContentType("text/html");
> + res.getWriter().println("<h1>" +
> cls.getName() +
> + "</h1>");
> + res.getWriter().println(
> + "<p>Hi there, this is an
> Axis service!</p>");
> + res.getWriter().println(
> + "<i>Perhaps there'll be a form for invoking the
> service here...</i>");
> + res.getWriter().close();
> + return;
> + }
> + }
> + } catch (AxisFault fault) {
> + res.getWriter().println("<pre>Fault - " +
> fault + " </pre>");
> + } catch (Exception e) {
> + res.getWriter().println("<pre>Exception
> - " + e + "<br>");
> + e.printStackTrace(res.getWriter());
> + res.getWriter().println("</pre>");
> + }
> + }
> +
> res.setContentType("text/html");
> - res.getWriter().println( "In doGet<p>" );
> - res.getWriter().println(" TransportName = " +
> transportName);
> - }
> + res.getWriter().println( "<html><h1>Axis HTTP
> Servlet</h1>" );
> + res.getWriter().println( "Hi, you've reached the
> Axis HTTP servlet." +
> + "Normally you would be hitting this URL with a
> SOAP client " +
> + "rather than a browser.");
>
> + res.getWriter().println("<p>In case you're
> interested, my Axis " +
> + "transport name appears to be '<b>" +
> transportName + "</b>'");
> + res.getWriter().println("</html>");
> + }
> +
> public void doPost(HttpServletRequest req,
> HttpServletResponse res)
> throws ServletException, IOException {
> ServletConfig config = getServletConfig();
>
>
>
> 1.15 +9 -5
> xml-axis/java/src/org/apache/axis/utils/XMLUtils.java
>
> Index: XMLUtils.java
> ===================================================================
> RCS file:
> /home/cvs/xml-axis/java/src/org/apache/axis/utils/XMLUtils.java,v
> retrieving revision 1.14
> retrieving revision 1.15
> diff -u -r1.14 -r1.15
> --- XMLUtils.java 2001/07/19 16:20:42 1.14
> +++ XMLUtils.java 2001/08/17 20:44:01 1.15
> @@ -215,18 +215,22 @@
> return
> privateElementToString(doc.getDocumentElement(), false);
> }
>
> - public static void privateElementToStream(Element
> element, OutputStream out,
> + public static void privateElementToWriter(Element
> element, Writer writer,
> boolean
> omitXMLDecl) {
> - Writer writer = new OutputStreamWriter(out);
> DOM2Writer.serializeAsXML(element, writer, omitXMLDecl);
> }
>
> - public static void ElementToStream(Element element,
> OutputStream out) {
> - privateElementToStream(element, out, true);
> + public static void ElementToWriter(Element element,
> Writer writer) {
> + privateElementToWriter(element, writer, true);
> }
>
> public static void DocumentToStream(Document doc,
> OutputStream out) {
> - privateElementToStream(doc.getDocumentElement(),
> out, false);
> + Writer writer = new OutputStreamWriter(out);
> + privateElementToWriter(doc.getDocumentElement(),
> writer, false);
> + }
> +
> + public static void DocumentToWriter(Document doc,
> Writer writer) {
> + privateElementToWriter(doc.getDocumentElement(),
> writer, false);
> }
>
> public static String getInnerXMLString(Element element) {
>
>
>
> 1.1
> xml-axis/java/src/org/apache/axis/utils/WSDLUtils.java
>
> Index: WSDLUtils.java
> ===================================================================
>
> /*
> * The Apache Software License, Version 1.1
> *
> *
> * Copyright (c) 1999 The Apache Software Foundation. All rights
> * reserved.
> *
> * Redistribution and use in source and binary forms, with
> or without
> * modification, are permitted provided that the following
> conditions
> * are met:
> *
> * 1. Redistributions of source code must retain the above copyright
> * notice, this list of conditions and the following disclaimer.
> *
> * 2. Redistributions in binary form must reproduce the
> above copyright
> * notice, this list of conditions and the following
> disclaimer in
> * the documentation and/or other materials provided with the
> * distribution.
> *
> * 3. The end-user documentation included with the redistribution,
> * if any, must include the following acknowledgment:
> * "This product includes software developed by the
> * Apache Software Foundation (http://www.apache.org/)."
> * Alternately, this acknowledgment may appear in the
> software itself,
> * if and wherever such third-party acknowledgments
> normally appear.
> *
> * 4. The names "Axis" and "Apache Software Foundation" must
> * not be used to endorse or promote products derived from this
> * software without prior written permission. For written
> * permission, please contact apache@apache.org.
> *
> * 5. Products derived from this software may not be called
> "Apache",
> * nor may "Apache" appear in their name, without prior written
> * permission of the Apache Software Foundation.
> *
> * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
> * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
> * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
> * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
> CAUSED AND
> * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> LIABILITY,
> * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
> ANY WAY OUT
> * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> POSSIBILITY OF
> * SUCH DAMAGE.
> *
> ====================================================================
> *
> * This software consists of voluntary contributions made by many
> * individuals on behalf of the Apache Software Foundation.
> For more
> * information on the Apache Software Foundation, please see
> * <http://www.apache.org/>.
> */
>
> package org.apache.axis.utils ;
>
> import java.io.* ;
> import java.lang.reflect.*;
> import java.util.ArrayList;
> import javax.wsdl.*;
> import javax.wsdl.factory.DefinitionFactory;
> import org.apache.axis.Constants;
> import org.apache.axis.encoding.TypeMappingRegistry;
> import org.w3c.dom.*;
> import com.ibm.wsdl.extensions.soap.*;
>
> /**
> * WSDL utility class, 1st cut. Right now all the WSDL
> functionality for
> * dynamic Java->WSDL is in here - it probably wants to
> move elsewhere when
> * a more solid design stabilizes.
> *
> * @author Glen Daniels (gdaniels@macromedia.com)
> */
> public class WSDLUtils {
> public static TypeMappingRegistry reg;
>
> public static void writeWSDLDoc(Class cls,
> String url,
> String urn,
> String description,
> TypeMappingRegistry typeMap,
> Writer writer) throws Exception
> {
> reg = typeMap;
>
> String name = cls.getName();
>
> DefinitionFactory factory =
> DefinitionFactory.newInstance("com.ibm.wsdl.factory.Definition
> FactoryImpl");
> Definition def = factory.newDefinition();
> Binding binding = def.createBinding();
> Service service = def.createService();
>
> def.setTargetNamespace(url); // !!! Probably not...
>
> def.addNamespace("serviceNS", url);
> def.addNamespace("soap", "soapNS");
>
> service.setQName(new javax.wsdl.QName(urn, name));
> def.addService(service);
>
> PortType portType = def.createPortType();
> portType.setUndefined(false);
>
> portType.setQName(new javax.wsdl.QName(url, name +
> "PortType"));
>
> Method[] methods = cls.getDeclaredMethods();
> ArrayList encodingList = new ArrayList();
> encodingList.add(Constants.URI_SOAP_ENC);
>
> Message msg;
> for(int i = 0, j = methods.length; i < j; i++) {
> Operation oper = def.createOperation();
> oper.setName(methods[i].getName());
> oper.setUndefined(false);
>
> Input input = def.createInput();
>
> msg = getRequestMessage(def, methods[i]);
> input.setMessage(msg);
> oper.setInput(input);
>
> def.addMessage(msg);
>
> msg = getResponseMessage(def, methods[i]);
> Output output = def.createOutput();
> output.setMessage(msg);
> oper.setOutput(output);
>
> def.addMessage(msg);
>
> portType.addOperation(oper);
>
> BindingOperation bindingOper =
> def.createBindingOperation();
> BindingInput bindingInput = def.createBindingInput();
> BindingOutput bindingOutput = def.createBindingOutput();
>
> bindingOper.setName(oper.getName());
>
> SOAPBody soapBody = new SOAPBody();
> soapBody.setUse("encoded");
> soapBody.setEncodingStyles(encodingList);
>
> bindingInput.addExtensibilityElement(soapBody);
> bindingOutput.addExtensibilityElement(soapBody);
>
> bindingOper.setBindingInput(bindingInput);
> bindingOper.setBindingOutput(bindingOutput);
>
> binding.addBindingOperation(bindingOper);
> }
>
> def.addPortType(portType);
>
> binding.setPortType(portType);
> binding.setUndefined(false);
> binding.setQName(new javax.wsdl.QName(url, name +
> "SoapBinding"));
>
> SOAPBinding soapBinding = new SOAPBinding();
> soapBinding.setStyle("rpc");
>
> soapBinding.setTransportURI("http://schemas.xmlsoap.org/soap/http");
>
> binding.addExtensibilityElement(soapBinding);
>
> def.addBinding(binding);
>
> Port port = def.createPort();
>
> port.setBinding(binding);
> port.setName("foo");
>
> SOAPAddress addr = new SOAPAddress();
> addr.setLocationURI(url);
>
> port.addExtensibilityElement(addr);
>
> service.addPort(port);
>
> com.ibm.wsdl.xml.WSDLWriter.writeWSDL(def, writer);
> }
>
> public static Message getRequestMessage(Definition def,
> Method method)
> {
> Message msg = def.createMessage();
>
> javax.wsdl.QName qName = new javax.wsdl.QName("",
> method.getName().concat("Request"));
>
> msg.setQName(qName);
> msg.setUndefined(false);
>
> Class[] parameters = method.getParameterTypes();
> for(int i = 0, j = parameters.length; i < j; i++) {
> addPartToMessage(def, msg, "arg" + i, parameters[i]);
> }
>
> return msg;
> }
>
> public static Message getResponseMessage(Definition
> def, Method method)
> {
> Message msg = def.createMessage();
>
> javax.wsdl.QName qName = new javax.wsdl.QName("",
> method.getName().concat("Response"));
>
> msg.setQName(qName);
> msg.setUndefined(false);
>
> Class type = method.getReturnType();
> addPartToMessage(def, msg, "result", type);
>
> return msg;
> }
>
> public static int n = 1;
>
> public static void addPartToMessage(Definition def,
> Message msg, String name, Class param)
> {
> Part part = def.createPart();
> org.apache.axis.utils.QName qName = reg.getTypeQName(param);
> String pref = def.getPrefix(qName.getNamespaceURI());
> if (pref == null) {
> def.addNamespace("ns" + n++, qName.getNamespaceURI());
> }
>
> javax.wsdl.QName typeQName = new
> javax.wsdl.QName(qName.getNamespaceURI(),
>
> qName.getLocalPart());
>
> part.setTypeName(typeQName);
> part.setName(name);
>
> msg.addPart(part);
> }
> }
>
>
>
> 1.6 +4 -3 xml-axis/java/test/utils/TestXMLUtils.java
>
> Index: TestXMLUtils.java
> ===================================================================
> RCS file: /home/cvs/xml-axis/java/test/utils/TestXMLUtils.java,v
> retrieving revision 1.5
> retrieving revision 1.6
> diff -u -r1.5 -r1.6
> --- TestXMLUtils.java 2001/08/07 18:58:48 1.5
> +++ TestXMLUtils.java 2001/08/17 20:44:01 1.6
> @@ -76,10 +76,10 @@
> /**
> * This test method is somewhat complex, but it solves
> a problem people have
> * asked me about, which is how to unit test a method
> that has void return
> - * type but writes its output to an output stream. So
> half the reason for
> + * type but writes its output to a writer. So half the
> reason for
> * creating and using it here is as a reference point.
> */
> - public void testElementToStream() throws IOException
> + public void testElementToWriter() throws IOException
> {
> /* Get the Document and one of its elements. */
> Reader xmlReader = (Reader)this.getTestXml("reader");
> @@ -95,13 +95,14 @@
> * will create a PipedInputStream in a separate thread.
> */
> PipedOutputStream out = new PipedOutputStream();
> + OutputStreamWriter writer = new OutputStreamWriter(out);
> ConsumerPipe cpipe = new ConsumerPipe(out);
>
> /*
> * Call the method under test, passing the
> PipedOutStream to trap the
> * results.
> */
> - XMLUtils.ElementToStream(elem, out);
> + XMLUtils.ElementToWriter(elem, writer);
>
> /*
> * The output of the test will be piped to
> ConsumerPipe's PipedInputStream, which
>
>
>
>