package ch5.ex3;

import java.io.StringBufferInputStream;
import java.io.StringWriter;
import org.apache.axis.encoding.SerializationContext;
import org.apache.axis.message.SOAPEnvelope;
import org.apache.axis.message.SOAPBodyElement;
import org.apache.axis.client.ServiceClient;
import org.apache.axis.client.Transport;
import org.apache.axis.transport.http.HTTPTransport;
import org.apache.axis.Message;
import org.apache.axis.MessageContext;
import org.apache.axis.encoding.ServiceDescription;

final public class DoOrder {
  final String url;
  final String storetype;
  final String keystore;
  final String storepass;
  final String userid;
  final String password;

  public DoOrder(String url,
    String storetype,
    String keystore,
    String storepass,
    String uid,
    String password)
  {
    this.url = url;
    this.storetype = storetype;
    this.keystore = keystore;
    this.storepass = storepass;
    this.uid = uid;
    this.password = password;
  }

  public synchronized static String invoke(String xml) throws Exception {
    String[][] props = {
      { "javax.net.ssl.trustStore", keystore, },
      { "javax.net.ssl.keyStore", keystore, },
      { "javax.net.ssl.keyStorePassword", storepass, },
      { "javax.net.ssl.keyStoreType", storetype, },
    };
    for (int i=0; i < props.length; i++)
      System.getProperties().setProperty(props[i][0], props[i][1]);

    ServiceClient = new ServiceClient(new HTTPTransport(url, "PO"));
    client.set(MessageContext.USERID, uid);
    client.set(MessageContext.PASSWORD, password);
    client.setRequestMessage(new Message(new StringBufferInputStream(xml), true));
    client.invoke();

    Message outMsg = client.getMessageContext().getResponseMessage();
    ServiceDescription svc = new ServiceDescription("doOrder", false);
    client.getMessageContext().setServiceDescription(svc);

    SOAPEnvelope envelope = outMsg.getAsSOAPEnvelope();
    SOAPBodyElement body = envelope.getFirstBody();
    StringWriter writer = new StringWriter();
    SerializationContext ctx = new SerializationContext(writer, client.getMessageContext());
    body.output(ctx);
    return writer.toString();
  }
}
