/*
 * Copyright  2004 The Apache Software Foundation.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */
package org.apache.kandula.wscoor;

import org.apache.axis2.addressing.AnyContentType;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.clientapi.MessageSender;
import org.apache.axis2.om.OMAbstractFactory;
import org.apache.axis2.om.OMElement;
import org.apache.axis2.om.OMNamespace;
import org.apache.kandula.Constants;
import org.apache.kandula.utility.KandulaListener;

import javax.xml.namespace.QName;
import java.io.IOException;

/**
 * @author <a href="mailto:thilina@opensource.lk"> Thilina Gunarathne </a>
 */

public class ActivationCoordinatorPortTypeRawXMLStub extends
        org.apache.axis2.clientapi.Stub {

    public static final String AXIS2_HOME = ".";

    protected static org.apache.axis2.description.OperationDescription[] operations;

    static {

        //creating the Service
        _service = new org.apache.axis2.description.ServiceDescription(
                new javax.xml.namespace.QName(
                        "http://schemas.xmlsoap.org/ws/2003/09/wscoor",
                        "ActivationCoordinatorPortType"));

        //creating the operations
        org.apache.axis2.description.OperationDescription operationDesc;
        operations = new org.apache.axis2.description.OperationDescription[1];

        operationDesc = new org.apache.axis2.description.OperationDescription();
        operationDesc.setName(new javax.xml.namespace.QName(
                "http://schemas.xmlsoap.org/ws/2003/09/wscoor",
                "CreateCoordinationContextOperation"));
        operations[0] = operationDesc;
        _service.addOperation(operationDesc);

    }

    /**
     * Constructor
     */
    public ActivationCoordinatorPortTypeRawXMLStub(String axis2Home,
                                                   EndpointReference targetEndpoint) throws java.lang.Exception {
        this.toEPR = targetEndpoint;
        //creating the configuration
        _configurationContext = new org.apache.axis2.context.ConfigurationContextFactory()
                .buildClientConfigurationContext(axis2Home);

        _configurationContext.getAxisConfiguration().addService(_service);
        _serviceContext = _configurationContext.createServiceContext(_service
                .getName());

    }

    private org.apache.axis2.soap.SOAPEnvelope createSOAPEnvelope(
            String coordinationType) {
        org.apache.axis2.soap.SOAPEnvelope env = super.createEnvelope();
        org.apache.axis2.soap.SOAPFactory factory = OMAbstractFactory
                .getSOAP12Factory();
        OMNamespace wsCoor = factory.createOMNamespace(Constants.WS_COOR,
                "wscoor");
        OMElement request = factory.createOMElement(
                "CreateCoordinationContext", wsCoor);
        OMElement coorType = factory
                .createOMElement("CoordinationType", wsCoor);
        coorType.setText(coordinationType);
        request.addChild(coorType);
        env.getBody().addChild(request);
        return env;
    }

    public void createCoordinationContextOperation(String coordinationType,
                                                   String id) throws IOException {

        QName serviceName = new QName("ActivationRequesterPortType");
        QName operationName = new QName(Constants.WS_COOR,
                "CreateCoordinationContextOperation");
        KandulaListener listener = KandulaListener.getInstance();
        listener.addService(serviceName, operationName,
                ActivationRequesterPortTypeRawXMLSkeleton.class.getName());
        listener.start();

        MessageSender messageSender = new MessageSender(_serviceContext);
        org.apache.axis2.context.MessageContext messageContext = getMessageContext();
        EndpointReference replyToEpr = new EndpointReference(listener.getHost()
                + serviceName.getLocalPart());
        AnyContentType refProperties = new AnyContentType();
        refProperties.addReferenceValue(new QName(
                "http://ws.apache.org/kandula", "id"), id);
        replyToEpr.setReferenceParameters(refProperties);
        //  messageSender.
        messageSender.setReplyTo(replyToEpr);
        messageSender.setTo(this.toEPR);
        messageSender.setSoapAction("CreateCoordinationContextOperation");
        //_call.setWsaAction("CreateCoordinationContextOperation");
        org.apache.axis2.soap.SOAPEnvelope env = createSOAPEnvelope(coordinationType);
        messageContext.setEnvelope(env);
        messageSender
                .setSenderTransport(org.apache.axis2.Constants.TRANSPORT_HTTP);
        messageSender.send(operations[0], messageContext);

    }
}