package com.fitbank.uci.webservice.client;

import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.rpc.Call;
import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceFactory;
import org.apache.commons.lang.StringUtils;

/**
 * Cliente para envio de mensajes a un WebService via SOAP
 *
 * @author SoftwareHouse S.A.
 */
public class SoapClientBasic {

    private String wsUrl;

    private String wsNamespace;

    private String wsServiceName;

    private String wsOperationName;

    private String message;

    public String getWsUrl() {
        return wsUrl;
    }

    public void setWsUrl(String wsUrl) {
        this.wsUrl = wsUrl;
    }

    public String getWsNamespace() {
        return wsNamespace;
    }

    public void setWsNamespace(String wsNamespace) {
        this.wsNamespace = wsNamespace;
    }

    public String getWsServiceName() {
        return wsServiceName;
    }

    public void setWsServiceName(String wsServiceName) {
        this.wsServiceName = wsServiceName;
    }

    public String getWsOperationName() {
        return wsOperationName;
    }

    public void setWsOperationName(String wsOperationName) {
        this.wsOperationName = wsOperationName;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String process() {
        if (StringUtils.isBlank(this.wsUrl) || StringUtils.isBlank(this.wsNamespace) ||
                        StringUtils.isBlank(this.wsOperationName) || StringUtils.isBlank(this.wsServiceName)) {
            return "PARAMETROS REQUERIDOS PARA EL WEBSERVICE NO ENVIADOS";
        }

        try {
            QName serviceQN = new QName(this.wsNamespace, this.wsServiceName);
            ServiceFactory serviceFactory = ServiceFactory.newInstance();
            Service service = serviceFactory.createService(new URL(this.wsUrl), serviceQN);
            Call call = service.createCall();

            call.setPortTypeName(serviceQN);
            call.setOperationName(new QName(this.wsNamespace, this.wsOperationName));
            call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY, "");
            call.addParameter("pParam", serviceQN, javax.xml.rpc.ParameterMode.IN);
            call.setReturnType(serviceQN);

            Object[] inParams = new Object[] { this.message };

            return (String) call.invoke(inParams);
        } catch (Exception ex) {
            ex.printStackTrace();
            return ex.getMessage();
        }
    }

    public static void main(String[] args) {
        SoapClientBasic scb = new SoapClientBasic();

        scb.setWsUrl("http://127.0.0.1:8180/UCIWS/services/UCIWSBean?wsdl");
        scb.setWsNamespace("http://ws.uci.fitbank.com");
        scb.setWsServiceName("UCIWS");
        scb.setWsOperationName("processXML");
        scb.setMessage(args[0]);
        System.out.println("Enviando peticion al WS...");

        String respuesta = scb.process();

        System.out.println("Respuesta del WS: " + respuesta);
    }
}
