protected void processFirstExchange()

in engines/servicemix-bean/src/main/java/org/apache/servicemix/bean/support/TransformBeanSupport.java [135:209]


    protected void processFirstExchange(MessageExchange exchange) {
        try {
            MessageExchange outExchange = null;
            NormalizedMessage in = getInMessage(exchange);
            NormalizedMessage out;
            if (isInAndOut(exchange)) {
                out = exchange.createMessage();
            } else {
                URI pattern = exchange.getPattern();
                if (target == null) {
                    throw new IllegalStateException("A TransformBean with MEP " + pattern + " has no Target specified");
                }
                outExchange = getExchangeFactory().createExchange(pattern);
                target.configureTarget(outExchange, getContext());
                outExchange.setProperty(JbiConstants.SENDER_ENDPOINT, getService() + ":" + getEndpoint());
                // Set correlations
                outExchange.setProperty(correlation, exchange.getExchangeId());
                exchange.setProperty(correlation, outExchange.getExchangeId());
                String processCorrelationId = (String)exchange.getProperty(JbiConstants.CORRELATION_ID);
                if (processCorrelationId != null) {
                    outExchange.setProperty(JbiConstants.CORRELATION_ID, processCorrelationId);
                }
                out = outExchange.createMessage();
            }
            boolean txSync = exchange.isTransacted() && Boolean.TRUE.equals(exchange.getProperty(JbiConstants.SEND_SYNC));
            copyPropertiesAndAttachments(exchange, in, out);
            if (transform(exchange, in, out)) {
                if (isInAndOut(exchange)) {
                    exchange.setMessage(out, "out");
                    if (txSync) {
                        sendSync(exchange);
                    } else {
                        send(exchange);
                    }
                } else {
                    outExchange.setMessage(out, "in");
                    if (txSync) {
                        sendSync(outExchange);
                        if (outExchange.getStatus() == ExchangeStatus.DONE) {
                            done(exchange);
                        } else if (outExchange.getStatus() == ExchangeStatus.ERROR) {
                            fail(exchange, outExchange.getError());
                        } else if (outExchange.getFault() != null) {
                            Fault fault = MessageUtil.copyFault(outExchange);
                            done(outExchange);
                            MessageUtil.transferToFault(fault, exchange);
                            sendSync(exchange);
                        } else {
                            done(outExchange);
                            throw new IllegalStateException("Exchange status is " + ExchangeStatus.ACTIVE
                                    + " but has no Out nor Fault message");
                        }
                    } else {
                        store.store(exchange.getExchangeId(), exchange);
                        try {
                            send(outExchange);
                        } catch (Exception e) {
                            store.load(exchange.getExchangeId());
                            throw e;
                        }
                    }
                }
            } else {
                exchange.setStatus(ExchangeStatus.DONE);
                send(exchange);
            }
        } catch (Exception e) {
            try {
                fail(exchange, e);
            } catch (Exception e2) {
                logger.warn("Unable to handle error: {}", e2, e2);
                logger.debug("Original error: {}", e, e);
            }
        }
    }