/**
 * PointsCalculatorStub.java This file was auto-generated from WSDL by the
 * Apache Axis2 version: SNAPSHOT Jun 23, 2006 (08:21:19 GMT+00:00)
 */
package testexamples.types;


/*
*  PointsCalculatorStub java implementation
*/
public class PointsCalculatorStub extends org.apache.axis2.client.Stub
    implements PointsCalculator {
    //default axis home being null forces the system to pick up the mars from the axis2 library
    public static final java.lang.String AXIS2_HOME = null;
    protected static org.apache.axis2.description.AxisOperation[] _operations;

    //c:/Java/projects2/axis2-std-1.0testbed/build/wsdlPointsCalculator
    private static javax.xml.namespace.QName[] qNameArray = {  };

    //hashmaps to keep the fault mapping
    private java.util.HashMap faultExeptionNameMap = new java.util.HashMap();
    private java.util.HashMap faultExeptionClassNameMap = new java.util.HashMap();
    private java.util.HashMap faultMessageMap = new java.util.HashMap();
    private javax.xml.namespace.QName[] opNameArray = null;

    /**
     * Constructor that takes in a configContext
     */
    public PointsCalculatorStub(
        org.apache.axis2.context.ConfigurationContext configurationContext,
        java.lang.String targetEndpoint) throws java.lang.Exception {
        //To populate AxisService
        populateAxisService();
        populateFaults();

        _serviceClient = new org.apache.axis2.client.ServiceClient(configurationContext,
                _service);
        configurationContext = _serviceClient.getServiceContext()
                                             .getConfigurationContext();

        _serviceClient.getOptions().setTo(new org.apache.axis2.addressing.EndpointReference(
                targetEndpoint));

        //Set the soap version
        _serviceClient.getOptions().setSoapVersionURI(org.apache.axiom.soap.SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
    }

    /**
     * Default Constructor
     */
    public PointsCalculatorStub() throws java.lang.Exception {
        this(
            "c:/Java/projects2/axis2-std-1.0testbed/build/wsdlPointsCalculator");
    }

    /**
     * Constructor taking the target endpoint
     */
    public PointsCalculatorStub(java.lang.String targetEndpoint)
        throws java.lang.Exception {
        this(null, targetEndpoint);
    }

    private void populateAxisService() {
        //creating the Service with a unique name
        _service = new org.apache.axis2.description.AxisService(
                "PointsCalculator" + this.hashCode());

        //creating the operations
        org.apache.axis2.description.AxisOperation __operation;

        _operations = new org.apache.axis2.description.AxisOperation[1];

        __operation = new org.apache.axis2.description.OutInAxisOperation();

        __operation.setName(new javax.xml.namespace.QName("", "calculatePoints"));

        _operations[0] = __operation;
        _service.addOperation(__operation);
    }

    //populates the faults
    private void populateFaults() {
    }

    /**
     * Auto generated method signature
     *
     * @param param16
     *
     * @see testexamples.types.PointsCalculator#calculatePoints
     */
    public testexamples.xsd.CalculatePointsResponseDocument calculatePoints(
        testexamples.xsd.CalculatePointsDocument param16)
        throws java.rmi.RemoteException {
        try {
            org.apache.axis2.client.OperationClient _operationClient = _serviceClient.createClient(_operations[0].getName());
            _operationClient.getOptions().setAction("urn:calculatePoints");
            _operationClient.getOptions().setExceptionToBeThrownOnSOAPFault(true);

            // create SOAP envelope with that payload
            org.apache.axiom.soap.SOAPEnvelope env = null;

            //Style is Doc.
            env = toEnvelope(getFactory(_operationClient.getOptions()
                                                        .getSoapVersionURI()),
                    param16,
                    optimizeContent(
                        new javax.xml.namespace.QName("", "calculatePoints")));

            // create message context with that soap envelope
            org.apache.axis2.context.MessageContext _messageContext = new org.apache.axis2.context.MessageContext();
            _messageContext.setEnvelope(env);

            // add the message contxt to the operation client
            _operationClient.addMessageContext(_messageContext);

            //execute the operation client
            _operationClient.execute(true);

            org.apache.axis2.context.MessageContext _returnMessageContext = _operationClient.getMessageContext(org.apache.axis2.wsdl.WSDLConstants.MESSAGE_LABEL_IN_VALUE);
            org.apache.axiom.soap.SOAPEnvelope _returnEnv = _returnMessageContext.getEnvelope();

            java.lang.Object object = fromOM(getElement(_returnEnv, "document"),
                    testexamples.xsd.CalculatePointsResponseDocument.class,
                    getEnvelopeNamespaces(_returnEnv));
            _messageContext.getTransportOut().getSender().cleanup(_messageContext);

            return (testexamples.xsd.CalculatePointsResponseDocument) object;
        } catch (org.apache.axis2.AxisFault f) {
            org.apache.axiom.om.OMElement faultElt = f.getDetail();

            if (faultElt != null) {
                if (faultExeptionNameMap.containsKey(faultElt.getQName())) {
                    //make the fault by reflection
                    try {
                        java.lang.String exceptionClassName = (java.lang.String) faultExeptionClassNameMap.get(faultElt.getQName());
                        java.lang.Class exceptionClass = java.lang.Class.forName(exceptionClassName);
                        java.rmi.RemoteException ex = (java.rmi.RemoteException) exceptionClass.newInstance();

                        //message class
                        java.lang.String messageClassName = (java.lang.String) faultMessageMap.get(faultElt.getQName());
                        java.lang.Class messageClass = java.lang.Class.forName(messageClassName);
                        java.lang.Object messageObject = fromOM(faultElt,
                                messageClass, null);
                        java.lang.reflect.Method m = exceptionClass.getMethod("setFaultMessage",
                                new java.lang.Class[] { messageClass });
                        m.invoke(ex, new java.lang.Object[] { messageObject });

                        throw ex;
                    } catch (java.lang.ClassCastException e) {
                        // we cannot intantiate the class - throw the original Axis fault
                        throw f;
                    } catch (java.lang.ClassNotFoundException e) {
                        // we cannot intantiate the class - throw the original Axis fault
                        throw f;
                    } catch (java.lang.NoSuchMethodException e) {
                        // we cannot intantiate the class - throw the original Axis fault
                        throw f;
                    } catch (java.lang.reflect.InvocationTargetException e) {
                        // we cannot intantiate the class - throw the original Axis fault
                        throw f;
                    } catch (java.lang.IllegalAccessException e) {
                        // we cannot intantiate the class - throw the original Axis fault
                        throw f;
                    } catch (java.lang.InstantiationException e) {
                        // we cannot intantiate the class - throw the original Axis fault
                        throw f;
                    }
                } else {
                    throw f;
                }
            } else {
                throw f;
            }
        }
    }

    /**
     * A utility method that copies the namepaces from the SOAPEnvelope
     */
    private java.util.Map getEnvelopeNamespaces(
        org.apache.axiom.soap.SOAPEnvelope env) {
        java.util.Map returnMap = new java.util.HashMap();
        java.util.Iterator namespaceIterator = env.getAllDeclaredNamespaces();

        while (namespaceIterator.hasNext()) {
            org.apache.axiom.om.OMNamespace ns = (org.apache.axiom.om.OMNamespace) namespaceIterator.next();
            returnMap.put(ns.getPrefix(), ns.getName());
        }

        return returnMap;
    }

    private boolean optimizeContent(javax.xml.namespace.QName opName) {
        if (opNameArray == null) {
            return false;
        }

        for (int i = 0; i < opNameArray.length; i++) {
            if (opName.equals(opNameArray[i])) {
                return true;
            }
        }

        return false;
    }

    private org.apache.axiom.om.OMElement toOM(
        testexamples.xsd.CalculatePointsDocument param, boolean optimizeContent) {
        org.apache.axiom.om.impl.builder.StAXOMBuilder builder = new org.apache.axiom.om.impl.builder.StAXOMBuilder(org.apache.axiom.om.OMAbstractFactory.getOMFactory(),
                new org.apache.axis2.util.StreamWrapper(param.newXMLStreamReader()));
        org.apache.axiom.om.OMElement documentElement = builder.getDocumentElement();

        if (optimizeContent) {
            optimizeContent(documentElement, qNameArray);
        }

        ((org.apache.axiom.om.impl.OMNodeEx) documentElement).setParent(null);

        return documentElement;
    }

    private org.apache.axiom.soap.SOAPEnvelope toEnvelope(
        org.apache.axiom.soap.SOAPFactory factory,
        testexamples.xsd.CalculatePointsDocument param, boolean optimizeContent) {
        org.apache.axiom.soap.SOAPEnvelope envelope = factory.getDefaultEnvelope();

        if (param != null) {
            envelope.getBody().addChild(toOM(param, optimizeContent));
        }

        return envelope;
    }

    private org.apache.axiom.om.OMElement toOM(
        testexamples.xsd.CalculatePointsResponseDocument param,
        boolean optimizeContent) {
        org.apache.axiom.om.impl.builder.StAXOMBuilder builder = new org.apache.axiom.om.impl.builder.StAXOMBuilder(org.apache.axiom.om.OMAbstractFactory.getOMFactory(),
                new org.apache.axis2.util.StreamWrapper(param.newXMLStreamReader()));
        org.apache.axiom.om.OMElement documentElement = builder.getDocumentElement();

        if (optimizeContent) {
            optimizeContent(documentElement, qNameArray);
        }

        ((org.apache.axiom.om.impl.OMNodeEx) documentElement).setParent(null);

        return documentElement;
    }

    private org.apache.axiom.soap.SOAPEnvelope toEnvelope(
        org.apache.axiom.soap.SOAPFactory factory,
        testexamples.xsd.CalculatePointsResponseDocument param,
        boolean optimizeContent) {
        org.apache.axiom.soap.SOAPEnvelope envelope = factory.getDefaultEnvelope();

        if (param != null) {
            envelope.getBody().addChild(toOM(param, optimizeContent));
        }

        return envelope;
    }

    /**
     * get the default envelope
     */
    private org.apache.axiom.soap.SOAPEnvelope toEnvelope(
        org.apache.axiom.soap.SOAPFactory factory) {
        return factory.getDefaultEnvelope();
    }

    public org.apache.xmlbeans.XmlObject fromOM(
        org.apache.axiom.om.OMElement param, java.lang.Class type,
        java.util.Map extraNamespaces) {
        try {
            if (testexamples.xsd.CalculatePointsDocument.class.equals(type)) {
                if (extraNamespaces != null) {
                    return testexamples.xsd.CalculatePointsDocument.Factory.parse(param.getXMLStreamReaderWithoutCaching(),
                        new org.apache.xmlbeans.XmlOptions().setLoadAdditionalNamespaces(
                            extraNamespaces));
                } else {
                    return testexamples.xsd.CalculatePointsDocument.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                }
            }

            if (testexamples.xsd.CalculatePointsResponseDocument.class.equals(
                        type)) {
                if (extraNamespaces != null) {
                    return testexamples.xsd.CalculatePointsResponseDocument.Factory.parse(param.getXMLStreamReaderWithoutCaching(),
                        new org.apache.xmlbeans.XmlOptions().setLoadAdditionalNamespaces(
                            extraNamespaces));
                } else {
                    return testexamples.xsd.CalculatePointsResponseDocument.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                }
            }
        } catch (java.lang.Exception e) {
            throw new RuntimeException("Data binding error", e);
        }

        return null;
    }

    private void optimizeContent(org.apache.axiom.om.OMElement element,
        javax.xml.namespace.QName[] qNames) {
        for (int i = 0; i < qNames.length; i++) {
            markElementsAsOptimized(qNames[i], element);
        }
    }

    private void markElementsAsOptimized(javax.xml.namespace.QName qName,
        org.apache.axiom.om.OMElement rootElt) {
        if (rootElt.getQName().equals(qName)) {
            //get the text node and mark it
            org.apache.axiom.om.OMNode node = rootElt.getFirstOMChild();

            if (node.getType() == org.apache.axiom.om.OMNode.TEXT_NODE) {
                ((org.apache.axiom.om.OMText) node).setOptimize(true);
            }
        }

        java.util.Iterator childElements = rootElt.getChildElements();

        while (childElements.hasNext()) {
            markElementsAsOptimized(qName,
                (org.apache.axiom.om.OMElement) childElements.next());
        }
    }

    private void setOpNameArray() {
        opNameArray = new javax.xml.namespace.QName[] {  };
    }
}
