Search in sources :

Example 1 with PetalsFlowableAsyncContext

use of org.ow2.petals.flowable.outgoing.PetalsFlowableAsyncContext in project petals-se-flowable by petalslink.

the class NormalizedMessageOutputStream method close.

@Override
public void close() throws IOException {
    super.close();
    // needed so that logs are put in the right flow instance folder
    PetalsExecutionContext.putFlowAttributes(this.flowAttributes);
    final Exchange cxfExchange = this.cxfMessage.getExchange();
    final EndpointInfo endpointInfo = cxfExchange.getEndpoint().getEndpointInfo();
    final QName interfaceName = endpointInfo.getInterface().getName();
    final QName serviceName = endpointInfo.getService().getName();
    final OperationInfo operationInfo = cxfExchange.getBindingOperationInfo().getOperationInfo();
    final QName operationName = operationInfo.getName();
    try {
        Consumes consume = this.sender.getComponent().getServiceUnitManager().getConsumesFromDestination(null, serviceName, interfaceName, operationName);
        final MEPPatternConstants mep = getMEP(operationInfo, consume);
        if (consume == null) {
            this.sender.getLogger().log(Level.WARNING, String.format("No Consumes declared in the JBI descriptor for the request to send, using informations from the process and default timeout: interface=%s, serviceName=%s, operation=%s, mep=%s", interfaceName, serviceName, operationName, mep));
            consume = new Consumes();
            // TODO: Create a unit test where the interface name is missing
            consume.setInterfaceName(interfaceName);
            // TODO: Create a unit test where the service name is missing
            consume.setServiceName(serviceName);
        } else {
            if (interfaceName != null && !consume.getInterfaceName().equals(interfaceName)) {
                this.sender.getLogger().log(Level.WARNING, "Mismatch between JBI Consumes interface name and process information (" + consume.getInterfaceName() + " vs " + interfaceName + "), using Consumes information.");
            }
            if (serviceName != null && !serviceName.equals(consume.getServiceName())) {
                this.sender.getLogger().log(Level.WARNING, "Mismatch between JBI Consumes service name and process information (" + consume.getServiceName() + " vs " + serviceName + "), using Consumes information.");
            }
        }
        // TODO: Find a way to define the endpoint name to use: maybe the address could contain it in endpointInfo?
        // TODO: Create a unit test where the endpoint name is missing
        // TODO: Create a unit test where the operation name is missing
        final org.ow2.petals.component.framework.api.message.Exchange jbiExchange = this.sender.createExchange(consume, mep, this.extFlowTracingActivated);
        // We always use the operation from the process (the JBI Consumes defines the service used, not the
        // operation)
        jbiExchange.setOperation(operationName);
        // Set timeout at CXF level. It must be upper than the timeout defined into SU JBI descriptor level)
        final long timeout = this.sender.getTimeout(consume);
        if (timeout > 0) {
            cxfExchange.getOutMessage().put(ClientImpl.SYNC_TIMEOUT, timeout + CXF_SYNC_TIMEOUT_INTERNAL_PART);
        }
        // TODO: Add support for attachments
        // TODO: MUST be optimized generating directly an XML message by CXF or Flowable
        // The buffer contains a SOAP message, we just remove the SOAP envelope
        final DocumentBuilder docBuilder = DocumentBuilders.takeDocumentBuilder();
        try {
            if (this.sender.getLogger().isLoggable(Level.FINE)) {
                this.sender.getLogger().fine("Request to send: " + new String(buf));
            }
            final Document doc = docBuilder.parse(new ByteArrayInputStream(buf));
            final NodeList soapBodies = doc.getElementsByTagNameNS("http://schemas.xmlsoap.org/soap/envelope/", "Body");
            if (soapBodies.item(0).hasChildNodes()) {
                final Node xmlPayload = soapBodies.item(0).getFirstChild();
                jbiExchange.setInMessageContent(new DOMSource(xmlPayload));
            } else {
                throw new IOException("Empty service task request");
            }
        } catch (final SAXException e) {
            throw new IOException(e);
        } finally {
            DocumentBuilders.releaseDocumentBuilder(docBuilder);
        }
        // TODO: Try to find a way to send exchange asynchronously
        if (cxfExchange.isOneWay()) {
            if (this.sender.sendSync(jbiExchange)) {
                if (jbiExchange.isErrorStatus()) {
                    // An error was returned
                    throw jbiExchange.getError();
                } else if (jbiExchange.isDoneStatus()) {
                // Status DONE returned
                } else {
                    // A fault was returned
                    final Message cxfInMessage = new MessageImpl();
                    cxfInMessage.setExchange(cxfExchange);
                    final Document faultReceived = PetalsConduit.wrapAsSoapFault(jbiExchange.getFault());
                    final EasyByteArrayOutputStream ebaos = new EasyByteArrayOutputStream();
                    DOMHelper.prettyPrint(faultReceived, ebaos);
                    if (LOG.isLoggable(Level.FINE)) {
                        LOG.fine("Fault XML payload received: " + ebaos.toString());
                    }
                    cxfInMessage.setContent(InputStream.class, ebaos.toByteArrayInputStream());
                    this.conduit.getMessageObserver().onMessage(cxfInMessage);
                    jbiExchange.setDoneStatus();
                    this.sender.send(jbiExchange);
                }
            } else {
                // A timeout occurs
                throw new MessagingException("A timeout occurs invoking service.");
            }
        } else {
            this.sender.sendAsync(jbiExchange, new PetalsFlowableAsyncContext(cxfExchange, this.asyncCallback));
        }
    } catch (final IOException e) {
        throw e;
    } catch (final Exception e) {
        throw new RuntimeException(e);
    }
}
Also used : OperationInfo(org.apache.cxf.service.model.OperationInfo) DOMSource(javax.xml.transform.dom.DOMSource) Message(org.apache.cxf.message.Message) Node(org.w3c.dom.Node) Document(org.w3c.dom.Document) SAXException(org.xml.sax.SAXException) EndpointInfo(org.apache.cxf.service.model.EndpointInfo) Consumes(org.ow2.petals.component.framework.jbidescriptor.generated.Consumes) PetalsFlowableAsyncContext(org.ow2.petals.flowable.outgoing.PetalsFlowableAsyncContext) EasyByteArrayOutputStream(com.ebmwebsourcing.easycommons.stream.EasyByteArrayOutputStream) MessagingException(javax.jbi.messaging.MessagingException) QName(javax.xml.namespace.QName) ByteArrayInputStream(java.io.ByteArrayInputStream) InputStream(java.io.InputStream) NodeList(org.w3c.dom.NodeList) IOException(java.io.IOException) IOException(java.io.IOException) SAXException(org.xml.sax.SAXException) MessagingException(javax.jbi.messaging.MessagingException) Exchange(org.apache.cxf.message.Exchange) MessageExchange(javax.jbi.messaging.MessageExchange) DocumentBuilder(javax.xml.parsers.DocumentBuilder) ByteArrayInputStream(java.io.ByteArrayInputStream) MEPPatternConstants(org.ow2.easywsdl.wsdl.api.abstractItf.AbsItfOperation.MEPPatternConstants) MessageImpl(org.apache.cxf.message.MessageImpl)

Example 2 with PetalsFlowableAsyncContext

use of org.ow2.petals.flowable.outgoing.PetalsFlowableAsyncContext in project petals-se-flowable by petalslink.

the class FlowableJBIListener method onExpiredAsyncJBIMessage.

@Override
public void onExpiredAsyncJBIMessage(final Exchange asyncExchange, final AsyncContext asyncContext) {
    // TODO: Add MONIT trace
    if (asyncContext instanceof PetalsFlowableAsyncContext) {
        final PetalsFlowableAsyncContext petalsFlowableAsyncContext = (PetalsFlowableAsyncContext) asyncContext;
        petalsFlowableAsyncContext.getAsyncCallback().onExpiredMessage(asyncExchange, petalsFlowableAsyncContext.getCxfExchange());
    } else {
        this.getLogger().warning("Unexpected expired asynchronous context received: " + asyncContext.getClass().getName());
    }
}
Also used : PetalsFlowableAsyncContext(org.ow2.petals.flowable.outgoing.PetalsFlowableAsyncContext)

Example 3 with PetalsFlowableAsyncContext

use of org.ow2.petals.flowable.outgoing.PetalsFlowableAsyncContext in project petals-se-flowable by petalslink.

the class FlowableJBIListener method onAsyncJBIMessage.

@Override
public boolean onAsyncJBIMessage(final Exchange asyncExchange, final AsyncContext asyncContext) {
    // TODO: Add MONIT trace
    if (asyncContext instanceof PetalsFlowableAsyncContext) {
        final PetalsFlowableAsyncContext petalsFlowableAsyncContext = (PetalsFlowableAsyncContext) asyncContext;
        petalsFlowableAsyncContext.getAsyncCallback().onMessage(asyncExchange, petalsFlowableAsyncContext.getCxfExchange());
    } else {
        this.getLogger().warning("Unexpected asynchronous context received: " + asyncContext.getClass().getName());
    }
    return true;
}
Also used : PetalsFlowableAsyncContext(org.ow2.petals.flowable.outgoing.PetalsFlowableAsyncContext)

Aggregations

PetalsFlowableAsyncContext (org.ow2.petals.flowable.outgoing.PetalsFlowableAsyncContext)3 EasyByteArrayOutputStream (com.ebmwebsourcing.easycommons.stream.EasyByteArrayOutputStream)1 ByteArrayInputStream (java.io.ByteArrayInputStream)1 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 MessageExchange (javax.jbi.messaging.MessageExchange)1 MessagingException (javax.jbi.messaging.MessagingException)1 QName (javax.xml.namespace.QName)1 DocumentBuilder (javax.xml.parsers.DocumentBuilder)1 DOMSource (javax.xml.transform.dom.DOMSource)1 Exchange (org.apache.cxf.message.Exchange)1 Message (org.apache.cxf.message.Message)1 MessageImpl (org.apache.cxf.message.MessageImpl)1 EndpointInfo (org.apache.cxf.service.model.EndpointInfo)1 OperationInfo (org.apache.cxf.service.model.OperationInfo)1 MEPPatternConstants (org.ow2.easywsdl.wsdl.api.abstractItf.AbsItfOperation.MEPPatternConstants)1 Consumes (org.ow2.petals.component.framework.jbidescriptor.generated.Consumes)1 Document (org.w3c.dom.Document)1 Node (org.w3c.dom.Node)1 NodeList (org.w3c.dom.NodeList)1