Russell Butek
[EMAIL PROTECTED]
---------------------- Forwarded by Russell Butek/Austin/IBM on 06/05/2002 09:05 AM ---------------------------
To: Sandeep Lakshmipathy/India/IBM@IBMIN
cc:
From: Russell Butek/Austin/IBM@IBMUS
Subject: Re: query regarding org.apache.axis.wsdl.toJava.Emitter class
Importance: Normal
Sorry, the color was lost when the note got to me. I'm assuming you want to find the name of "getStockQuoteServicePort"?
You can get this, but it's not simple. First you need the symbol table:
SymbolTable st = emitter.getSymbolTable();
Now you have to find the ServiceEntry for "StockQuoteServiceName". This is rather tough. You've got the package name, but the symbol table is organized by QName. You could do one of two things:
1. search through the symbol table looking for an entry whose getName() method (which contains the Java name) equals your fully qualified class name, or
2. Get the namespaces class (emitter.getNamespaces()) which contains mappings from XML namespaces to package names. But since you have to do the reverse mapping, it would mean searching the values of this map until you found your package, then finding this value's key. This is a much smaller map than the symbol table.
Once you've got the QName you can call:
ServiceEntry se = st.getServiceEntry(qname);
javax.wsdl.Service service = se.getService();
Map ports = service.getPorts();
Note that a service can have any number of ports, so there's no way to get any single one. But in most cases there IS only one, so the Map returned by getPorts will only have one element. In that case...
Port port = (Ports) ports.values().iterator().next();
String portName = org.apache.axis.wsdl.toJava.Utils.xmlNameToJavaClass(p.getName());
portName will be the name of the method.
HOWEVER! Since this is all rather messy, you may be better off simply extending the emitter framework. Here's a quick program I wrote which does what I think you want: (See attached file: MyMain.java)(See attached file: PortNamesGenerator.java). It was rather fun to write this, it tested the extensibility of the framework.
Russell Butek
[EMAIL PROTECTED]
To: Russell Butek/Austin/IBM@IBMUS
cc:
Subject: query regarding org.apache.axis.wsdl.toJava.Emitter class
Dear Russell,
I have been using the Emitter class to generate the stubs for the
given WSDL URI. I am using the getGeneratedFileInfo() method and the
returned GeneratedFileInfo object to retrieve information about the
generated classes. Now I want to find out the name of the method(i.e. the
Port for the service, see code in BLUE) that i want to invoke. Can I get
this info from using the Emitter class or any other related class?
public interface StockQuoteServiceName extends javax.xml.rpc.Service {
public String getStockQuoteServicePortAddress();
public localhost.StockQuoteServicePortType getStockQuoteServicePort()
throws javax.xml.rpc.ServiceException;
public localhost.StockQuoteServicePortType
getStockQuoteServicePort(java.net.URL portAddress) throws
javax.xml.rpc.ServiceException;
}
Sandeep L
IBM Global Services
Bangalore
MyMain.java
Description: Binary data
PortNamesGenerator.java
Description: Binary data