package org.jboss.axis.wsdl.toJava;
import org.jboss.axis.utils.JavaUtils;
import org.jboss.axis.utils.Messages;
import org.jboss.axis.wsdl.symbolTable.BindingEntry;
import org.jboss.axis.wsdl.symbolTable.Parameter;
import org.jboss.axis.wsdl.symbolTable.Parameters;
import org.jboss.axis.wsdl.symbolTable.ServiceEntry;
import org.jboss.axis.wsdl.symbolTable.SymbolTable;
import org.jboss.axis.wsdl.symbolTable.TypeEntry;
import javax.wsdl.Binding;
import javax.wsdl.Fault;
import javax.wsdl.Operation;
import javax.wsdl.OperationType;
import javax.wsdl.Port;
import javax.wsdl.PortType;
import javax.xml.rpc.holders.BooleanHolder;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.Map;
public class JavaTestCaseWriter extends JavaClassWriter
{
private ServiceEntry sEntry;
private SymbolTable symbolTable;
protected JavaTestCaseWriter(Emitter emitter,
ServiceEntry sEntry,
SymbolTable symbolTable)
{
super(emitter, sEntry.getName() + "TestCase", "testCase");
this.sEntry = sEntry;
this.symbolTable = symbolTable;
}
protected String getExtendsText()
{
return "extends junit.framework.TestCase ";
}
protected void writeFileBody(PrintWriter pw) throws IOException
{
pw.print(" public ");
pw.print(getClassName());
pw.println("(java.lang.String name) {");
pw.println(" super(name);");
pw.println(" }");
Map portMap = sEntry.getService().getPorts();
Iterator portIterator = portMap.values().iterator();
while (portIterator.hasNext())
{
Port p = (Port)portIterator.next();
Binding binding = p.getBinding();
BindingEntry bEntry =
symbolTable.getBindingEntry(binding.getQName());
if (bEntry.getBindingType() != BindingEntry.TYPE_SOAP)
{
continue;
}
String portName = p.getName();
if (!JavaUtils.isJavaId(portName))
{
portName = Utils.xmlNameToJavaClass(portName);
}
PortType portType = binding.getPortType();
writeComment(pw, p.getDocumentationElement());
writeServiceTestCode(pw, portName, portType, bEntry);
}
}
private int counter = 1;
private final void writeServiceTestCode(PrintWriter pw,
String portName, PortType portType,
BindingEntry bEntry) throws IOException
{
Iterator ops = portType.getOperations().iterator();
while (ops.hasNext())
{
Operation op = (Operation)ops.next();
OperationType type = op.getStyle();
Parameters params = bEntry.getParameters(op);
BooleanHolder bThrow = new BooleanHolder(false);
if (type == OperationType.NOTIFICATION
|| type == OperationType.SOLICIT_RESPONSE)
{
pw.println(" " + params.signature);
continue;
}
String javaOpName = Utils.xmlNameToJavaClass(op.getName());
String testMethodName = "test" + counter++ + portName + javaOpName;
pw.println(" public void " + testMethodName + "() throws Exception {");
String bindingType = bEntry.getName() + "Stub";
writeBindingAssignment(pw, bindingType, portName);
pw.println(" // Test operation");
String indent = "";
Map faultMap = op.getFaults();
if (faultMap != null && faultMap.size() > 0)
{
pw.println(" try {");
indent = " ";
}
if (params.returnParam != null)
{
TypeEntry returnType = params.returnParam.getType();
pw.print(" " + indent);
pw.print(Utils.getParameterTypeName(params.returnParam));
pw.print(" value = ");
if (params.returnParam.getMIMEInfo() == null &&
Utils.isPrimitiveType(returnType))
{
if ("boolean".equals(returnType.getName()))
{
pw.println("false;");
}
else
{
pw.println("-3;");
}
}
else
{
pw.println("null;");
}
}
pw.print(" " + indent);
if (params.returnParam != null)
{
pw.print("value = ");
}
pw.print("binding.");
pw.print(Utils.xmlNameToJava(op.getName()));
pw.print("(");
Iterator iparam = params.list.iterator();
boolean isFirst = true;
while (iparam.hasNext())
{
if (isFirst)
{
isFirst = false;
}
else
{
pw.print(", ");
}
Parameter param = (Parameter)iparam.next();
String suffix = "";
if (param.getMode() != Parameter.IN)
{
pw.print("new " + Utils.holder(param.getMIMEInfo(), param.getType(), emitter)
+ "(");
suffix = ")";
}
if (param.getMode() != Parameter.OUT)
{
String constructorString = Utils.getConstructorForParam(param, symbolTable, bThrow);
pw.print(constructorString);
}
pw.print(suffix);
}
pw.println(");");
if (faultMap != null && faultMap.size() > 0)
{
pw.println(" }");
}
if (faultMap != null)
{
Iterator i = faultMap.values().iterator();
int count = 0;
while (i.hasNext())
{
count++;
Fault f = (Fault)i.next();
pw.print(" catch (");
pw.print(Utils.getFullExceptionName(f.getMessage(), symbolTable));
pw.println(" e" + count + ") {");
pw.print(" ");
pw.println("throw new junit.framework.AssertionFailedError(\"" + f.getName() + " Exception caught: \" + e" + count + ");");
pw.println(" }");
}
}
pw.println(" " + indent + "// TBD - validate results");
pw.println(" }");
pw.println();
}
}
public final void writeBindingAssignment(PrintWriter pw,
String bindingType, String portName) throws IOException
{
pw.println(" " + bindingType + " binding;");
pw.println(" try {");
pw.println(" binding = (" + bindingType + ")");
pw.print(" new " + sEntry.getName());
pw.println("Locator" + "().get" + portName + "();");
pw.println(" }");
pw.println(" catch (" + javax.xml.rpc.ServiceException.class.getName() + " jre) {");
pw.println(" if(jre.getLinkedCause()!=null)");
pw.println(" jre.getLinkedCause().printStackTrace();");
pw.println(" throw new junit.framework.AssertionFailedError(\"JAX-RPC ServiceException caught: \" + jre);");
pw.println(" }");
pw.println(" assertNotNull(\"" +
Messages.getMessage("null00", "binding") +
"\", binding);");
pw.println();
pw.println(" // Time out after a minute");
pw.println(" binding.setTimeout(60000);");
pw.println();
}
}