public void handleMessage()

in engines/servicemix-cxf-se/src/main/java/org/apache/servicemix/cxf/binding/jbi/interceptor/JBIWrapperInInterceptor.java [65:192]


    public void handleMessage(Message message) throws Fault {
        if (isGET(message)) {
            LOG.fine("JbiMessageInInterceptor skipped in HTTP GET method");
            return;
        }
        XMLStreamReader xsr = message.getContent(XMLStreamReader.class);

        DepthXMLStreamReader reader = new DepthXMLStreamReader(xsr);

        Endpoint ep = message.getExchange().get(Endpoint.class);
        BindingInfo binding = ep.getEndpointInfo().getBinding();
        if (!(binding instanceof JBIBindingInfo)) {
            throw new IllegalStateException(
                    new org.apache.cxf.common.i18n.Message("NEED_JBIBINDING",
                            BUNDLE).toString());
        }

        if (!StaxUtils.toNextElement(reader)) {
            throw new Fault(new org.apache.cxf.common.i18n.Message(
                    "NO_OPERATION_ELEMENT", BUNDLE));
        }

        Exchange ex = message.getExchange();
        QName startQName = reader.getName();

        // handling jbi fault message
        if (startQName.getLocalPart().equals(JBIFault.JBI_FAULT_ROOT)) {
            message.getInterceptorChain().abort();

            if (ep.getInFaultObserver() != null) {
                ep.getInFaultObserver().onMessage(message);
                return;
            }
        }

        // handling xml normal inbound message
        if (!startQName.equals(JBIConstants.JBI_WRAPPER_MESSAGE)) {
            throw new Fault(new org.apache.cxf.common.i18n.Message(
                    "NO_JBI_MESSAGE_ELEMENT", BUNDLE));
        }
        
        try {
            
            BindingOperationInfo bop = ex.get(BindingOperationInfo.class);
            DataReader<XMLStreamReader> dr = getDataReader(message);
            boolean requestor = isRequestor(message);
            MessageContentsList parameters = new MessageContentsList();
            reader.next();
            ServiceInfo si = bop.getBinding().getService();
            MessageInfo msgInfo = setMessage(message, bop, requestor, si);

            message.put(MessageInfo.class, msgInfo);
            if (!bop.isUnwrappedCapable()) {
                for (MessagePartInfo part : msgInfo.getMessageParts()) {
                    readJBIWrapper(reader);
                    if (part.isElement()) {
                        reader.next();
                        if (!StaxUtils.toNextElement(reader)) {
                            throw new Fault(
                                    new org.apache.cxf.common.i18n.Message(
                                            "EXPECTED_ELEMENT_IN_PART", BUNDLE));
                        }
                    }
                    parameters.put(part, dr.read(part, reader));
                    // skip end element
                    if (part.isElement()) {
                        reader.next();
                    }
                }
                int ev = reader.getEventType();
                while (ev != XMLStreamConstants.END_ELEMENT
                        && ev != XMLStreamConstants.START_ELEMENT
                        && ev != XMLStreamConstants.END_DOCUMENT) {
                    ev = reader.next();
                }
            } else if (bop.isUnwrappedCapable()
                    && msgInfo.getMessageParts().get(0).getTypeClass() != null) {
                readJBIWrapper(reader);
                if (msgInfo.getMessageParts().get(0).isElement()) {
                    reader.next();
                    if (!StaxUtils.toNextElement(reader)) {
                        throw new Fault(
                                new org.apache.cxf.common.i18n.Message(
                                        "EXPECTED_ELEMENT_IN_PART", BUNDLE));
                    }
                }
                Object wrappedObject = dr.read(
                        msgInfo.getMessageParts().get(0), xsr);
                parameters.put(msgInfo.getMessageParts().get(0), wrappedObject);

            } else {
                if (bop.isUnwrappedCapable()) {
                    bop = bop.getUnwrappedOperation();
                }

                msgInfo = setMessage(message, bop, requestor, si);
                message.put(MessageInfo.class, msgInfo);
                for (MessagePartInfo part : msgInfo.getMessageParts()) {
                    readJBIWrapper(reader);
                    if (part.isElement()) {
                        reader.next();
                        reader.next();
                        if (!StaxUtils.toNextElement(reader)) {
                            throw new Fault(
                                    new org.apache.cxf.common.i18n.Message(
                                            "EXPECTED_ELEMENT_IN_PART", BUNDLE));
                        }
                    }
                    parameters.put(part, dr.read(part, reader));
                    // skip end element
                    if (part.isElement()) {
                        reader.next();
                    }
                }
                int ev = reader.getEventType();
                while (ev != XMLStreamConstants.END_ELEMENT
                        && ev != XMLStreamConstants.START_ELEMENT
                        && ev != XMLStreamConstants.END_DOCUMENT) {
                    ev = reader.next();
                }
            }
            message.setContent(List.class, parameters);
        } catch (XMLStreamException e) {
            throw new Fault(new org.apache.cxf.common.i18n.Message(
                    "STAX_READ_EXC", BUNDLE), e);
        }
        
    }