List of usage examples for javax.xml.parsers SAXParser parse
public void parse(InputSource is, DefaultHandler dh) throws SAXException, IOException
From source file:net.stuxcrystal.simpledev.configuration.parser.generators.xml.XMLParser.java
/** * Parse the XML-File.//from w w w . j ava2 s .c om * @param stream The stream to use. * @return The Node-Tree. * @throws IOException if an I/O-Operation fails. */ public static Node<?> parse(InputStream stream) throws IOException { // Make sure empty files are supported... stream = new PushbackInputStream(stream, 1); if (XMLParser.isEmpty((PushbackInputStream) stream)) { // The node has no content. return new MapNode(new Node[0]); } SAXParser parser; try { parser = getParser(); } catch (ParserConfigurationException | SAXException e) { throw new IOException(e.getLocalizedMessage(), e); } XMLParser raw_parser = new XMLParser(); try { parser.parse(toSource(stream), raw_parser); } catch (SAXException e) { throw new IOException(e.getLocalizedMessage(), e); } return raw_parser.base; }
From source file:net.timewalker.ffmq4.utils.xml.XMLDescriptorReader.java
/** * Read and parse an XML descriptor file *///from www . j ava 2s . c om public AbstractDescriptor read(File descriptorFile, Class<? extends AbstractXMLDescriptorHandler> handlerClass) throws JMSException { if (!descriptorFile.canRead()) throw new FFMQException("Can't read descriptor file : " + descriptorFile.getAbsolutePath(), "FS_ERROR"); log.debug("Parsing descriptor : " + descriptorFile.getAbsolutePath()); AbstractXMLDescriptorHandler handler; try { // Create an handler instance handler = handlerClass.newInstance(); // Parse the descriptor file SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); FileInputStream in = new FileInputStream(descriptorFile); parser.parse(in, handler); in.close(); } catch (Exception e) { throw new FFMQException("Cannot parse descriptor file : " + descriptorFile.getAbsolutePath(), "PARSE_ERROR", e); } AbstractDescriptor descriptor = handler.getDescriptor(); descriptor.setDescriptorFile(descriptorFile); return descriptor; }
From source file:net.yacy.cora.document.feed.RSSReader.java
public RSSReader(final int maxsize, InputStream stream) throws IOException { this(maxsize); if (!(stream instanceof ByteArrayInputStream) && !(stream instanceof BufferedInputStream)) stream = new BufferedInputStream(stream); try {/*from ww w. ja va2 s . c o m*/ final SAXParser saxParser = getParser(); // do not look at external dtd - see: http://www.ibm.com/developerworks/xml/library/x-tipcfsx/index.html saxParser.getXMLReader().setEntityResolver(new EntityResolver() { @Override public InputSource resolveEntity(final String arg0, final String arg1) throws SAXException, IOException { return new InputSource(new StringReader("")); } }); saxParser.parse(stream, this); } catch (final SAXException e) { throw new IOException(e.getMessage()); } }
From source file:net.yacy.cora.document.feed.RSSReader.java
public RSSReader(final int maxsize, final long maxBytes, InputStream stream) throws IOException { this(maxsize); if (!(stream instanceof ByteArrayInputStream) && !(stream instanceof BufferedInputStream)) { stream = new BufferedInputStream(stream); }/* w w w. j a va 2 s . co m*/ StrictLimitInputStream limitedSource = new StrictLimitInputStream(stream, maxBytes); try { final SAXParser saxParser = getParser(); // do not look at external dtd - see: http://www.ibm.com/developerworks/xml/library/x-tipcfsx/index.html saxParser.getXMLReader().setEntityResolver(new EntityResolver() { @Override public InputSource resolveEntity(final String arg0, final String arg1) throws SAXException, IOException { return new InputSource(new StringReader("")); } }); saxParser.parse(limitedSource, this); } catch (final SAXException e) { throw new IOException(e.getMessage()); } catch (StreamLimitException e) { this.maxBytesExceeded = true; } }
From source file:net.yacy.document.parser.GenericXMLParser.java
@Override public Document[] parse(final DigestURL location, final String mimeType, final String charset, final VocabularyScraper scraper, final int timezoneOffset, final InputStream source) throws Failure { /* Limit the size of the in-memory buffer to at most 25% of the available memory : * because some room is needed, and before being garbage collected the buffer will be converted to a String, then to a byte array. * Eventual stricter limits should be handled by the caller (see for example crawler.[protocol].maxFileSize configuration setting). */ final long availableMemory = MemoryControl.available(); final long maxBytes = (long) (availableMemory * 0.25); final int maxChars; if ((maxBytes / Character.BYTES) > Integer.MAX_VALUE) { maxChars = Integer.MAX_VALUE; } else {/*w w w .j a va2 s . co m*/ maxChars = ((int) maxBytes) / Character.BYTES; } try (/* Automatically closed by this try-with-resources statement*/ CharBuffer writer = new CharBuffer( maxChars);) { /* Use commons-io XmlStreamReader advanced rules to help with charset detection when source contains no BOM or XML declaration * (detection algorithm notably also include ContentType transmitted by HTTP headers, here eventually present as mimeType and charset parameters), */ final XmlStreamReader reader = new XmlStreamReader(source, mimeType, true, charset); final InputSource saxSource = new InputSource(reader); final String detectedCharset = reader.getEncoding(); final List<AnchorURL> detectedURLs = new ArrayList<>(); final GenericXMLContentHandler saxHandler = new GenericXMLContentHandler(writer, detectedURLs); final SAXParser saxParser = getParser(); saxParser.parse(saxSource, saxHandler); if (writer.isOverflow()) { throw new Parser.Failure("Not enough Memory available for generic the XML parser : " + Formatter.bytesToString(availableMemory), location); } /* create the parsed document */ Document[] docs = null; final byte[] contentBytes = UTF8.getBytes(writer.toString()); docs = new Document[] { new Document(location, mimeType, detectedCharset, this, null, null, null, null, "", null, null, 0.0d, 0.0d, contentBytes, detectedURLs, null, null, false, new Date()) }; return docs; } catch (Parser.Failure e) { throw e; } catch (final Exception e) { throw new Parser.Failure("Unexpected error while parsing XML file. " + e.getMessage(), location); } }
From source file:net.yacy.document.parser.GenericXMLParser.java
/** * {@inheritDoc}/*from w w w . j av a 2 s . com*/ * @param maxBytes the maximum number of content bytes to process. Be careful with to small values : * a Failure exception can eventually be thrown when maxBytes value is so small that the parser can even not fill its buffers on input stream and parse the document declaration. */ @Override public Document[] parseWithLimits(DigestURL location, String mimeType, String charsetName, VocabularyScraper scraper, int timezoneOffset, InputStream source, int maxLinks, long maxBytes) throws Failure, InterruptedException, UnsupportedOperationException { /* Limit the size of the in-memory buffer to at most 25% of the available memory : * because some room is needed, and before being garbage collected the buffer will be converted to a String, then to a byte array. * Eventual stricter limits should be handled by the caller (see for example crawler.[protocol].maxFileSize configuration setting). */ final long availableMemory = MemoryControl.available(); final long maxTextBytes = (long) (availableMemory * 0.25); final int maxChars; if ((maxTextBytes / Character.BYTES) > Integer.MAX_VALUE) { maxChars = Integer.MAX_VALUE; } else { maxChars = ((int) maxTextBytes) / Character.BYTES; } try (/* Automatically closed by this try-with-resources statement*/ CharBuffer writer = new CharBuffer( maxChars);) { final Set<AnchorURL> detectedURLs = new HashSet<>(); final GenericXMLContentHandler saxHandler = new GenericXMLContentHandler(writer, detectedURLs, maxLinks); StrictLimitInputStream limitedSource = new StrictLimitInputStream(source, maxBytes); /* Use commons-io XmlStreamReader advanced rules to help with charset detection when source contains no BOM or XML declaration * (detection algorithm notably also include ContentType transmitted by HTTP headers, here eventually present as mimeType and charset parameters), */ final XmlStreamReader reader = new XmlStreamReader(limitedSource, mimeType, true, charsetName); final InputSource saxSource = new InputSource(reader); final String detectedCharset = reader.getEncoding(); final SAXParser saxParser = getParser(); boolean limitExceeded = false; try { saxParser.parse(saxSource, saxHandler); } catch (SAXException e) { if (!(e.getCause() instanceof SizeLimitExceededException)) { /* Only transmit to upper layer exceptions that are not caused by the maxLinks limit being reached */ throw e; } limitExceeded = true; } catch (StreamLimitException e) { limitExceeded = true; } if (writer.isOverflow()) { throw new Parser.Failure("Not enough Memory available for generic the XML parser : " + Formatter.bytesToString(availableMemory), location); } /* Create the parsed document with eventually only partial part of the text and links */ final byte[] contentBytes = UTF8.getBytes(writer.toString()); Document[] docs = new Document[] { new Document(location, mimeType, detectedCharset, this, null, null, null, null, "", null, null, 0.0d, 0.0d, contentBytes, detectedURLs, null, null, false, new Date()) }; docs[0].setPartiallyParsed(limitExceeded); return docs; } catch (final Exception e) { throw new Parser.Failure("Unexpected error while parsing XML file. " + e.getMessage(), location); } }
From source file:nl.coinsweb.sdk.FileManager.java
public static String getXmlBaseOrxmlns(File xmlFile) { final ArrayList<String> baseUriDropHere = new ArrayList<>(); final ArrayList<String> xmlnsDropHere = new ArrayList<>(); DefaultHandler handler = new DefaultHandler() { @Override/* ww w . j ava 2s . co m*/ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if ("rdf:RDF".equals(qName)) { for (int i = 0; i < attributes.getLength(); i++) { if ("xml:base".equals(attributes.getQName(i))) { baseUriDropHere.add(attributes.getValue(i)); } if ("xmlns".equals(attributes.getQName(i))) { xmlnsDropHere.add(attributes.getValue(i)); } } return; } } }; try { SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setValidating(false); SAXParser parser = factory.newSAXParser(); parser.parse(xmlFile, handler); } catch (ParserConfigurationException e) { // do not print this, this is supposed to crash for non-xml files } catch (SAXException e) { // do not print this, this is supposed to crash for non-xml files } catch (IOException e) { log.error("problem reading xml file", e); } if (baseUriDropHere.isEmpty()) { if (xmlnsDropHere.isEmpty()) { return null; } else { return xmlnsDropHere.get(0); } } else { return baseUriDropHere.get(0); } }
From source file:nl.nn.adapterframework.pipes.XmlFileElementIteratorPipe.java
protected void iterateInput(Object input, IPipeLineSession session, String correlationID, Map threadContext, ItemCallback callback) throws SenderException, TimeOutException { InputStream xmlInput;//from w w w . j av a2s.c om try { xmlInput = new FileInputStream((String) input); } catch (FileNotFoundException e) { throw new SenderException("could not find file [" + input + "]", e); } ItemCallbackCallingHandler handler = new ItemCallbackCallingHandler(callback); log.debug("obtaining list of elements [" + getElementName() + "] using sax parser"); try { SAXParserFactory parserFactory = XmlUtils.getSAXParserFactory(); parserFactory.setNamespaceAware(true); SAXParser saxParser = parserFactory.newSAXParser(); saxParser.parse(xmlInput, handler); } catch (Exception e) { if (handler.getTimeOutException() != null) { throw handler.getTimeOutException(); } if (!handler.isStopRequested()) { throw new SenderException( "Could not extract list of elements [" + getElementName() + "] using sax parser", e); } } }
From source file:nl.nn.adapterframework.processors.InputOutputPipeProcessor.java
public PipeRunResult processPipe(PipeLine pipeLine, IPipe pipe, String messageId, Object message, IPipeLineSession pipeLineSession) throws PipeRunException { Object preservedObject = message; PipeRunResult pipeRunResult = null;//from www.j a v a 2 s . c o m INamedObject owner = pipeLine.getOwner(); IExtendedPipe pe = null; if (pipe instanceof IExtendedPipe) { pe = (IExtendedPipe) pipe; } if (pe != null) { if (StringUtils.isNotEmpty(pe.getGetInputFromSessionKey())) { if (log.isDebugEnabled()) log.debug("Pipeline of adapter [" + owner.getName() + "] replacing input for pipe [" + pe.getName() + "] with contents of sessionKey [" + pe.getGetInputFromSessionKey() + "]"); message = pipeLineSession.get(pe.getGetInputFromSessionKey()); } if (StringUtils.isNotEmpty(pe.getGetInputFromFixedValue())) { if (log.isDebugEnabled()) log.debug("Pipeline of adapter [" + owner.getName() + "] replacing input for pipe [" + pe.getName() + "] with fixed value [" + pe.getGetInputFromFixedValue() + "]"); message = pe.getGetInputFromFixedValue(); } if ((message == null || StringUtils.isEmpty(message.toString())) && StringUtils.isNotEmpty(pe.getEmptyInputReplacement())) { if (log.isDebugEnabled()) log.debug("Pipeline of adapter [" + owner.getName() + "] replacing empty input for pipe [" + pe.getName() + "] with fixed value [" + pe.getEmptyInputReplacement() + "]"); message = pe.getEmptyInputReplacement(); } } if (pipe instanceof FixedForwardPipe) { FixedForwardPipe ffPipe = (FixedForwardPipe) pipe; pipeRunResult = ffPipe.doInitialPipe(message, pipeLineSession); } if (pipeRunResult == null) { pipeRunResult = pipeProcessor.processPipe(pipeLine, pipe, messageId, message, pipeLineSession); } if (pipeRunResult == null) { throw new PipeRunException(pipe, "Pipeline of [" + pipeLine.getOwner().getName() + "] received null result from pipe [" + pipe.getName() + "]d"); } if (pe != null) { if (pe.isRestoreMovedElements()) { if (log.isDebugEnabled()) log.debug("Pipeline of adapter [" + owner.getName() + "] restoring from compacted result for pipe [" + pe.getName() + "]"); Object result = pipeRunResult.getResult(); if (result != null) { String resultString = (String) result; pipeRunResult.setResult(restoreMovedElements(resultString, pipeLineSession)); } } if (pe.getChompCharSize() != null || pe.getElementToMove() != null || pe.getElementToMoveChain() != null) { log.debug("Pipeline of adapter [" + owner.getName() + "] compact received message"); Object result = pipeRunResult.getResult(); if (result != null) { String resultString = (String) result; try { InputStream xmlInput = IOUtils.toInputStream(resultString, "UTF-8"); CompactSaxHandler handler = new CompactSaxHandler(); handler.setChompCharSize(pe.getChompCharSize()); handler.setElementToMove(pe.getElementToMove()); handler.setElementToMoveChain(pe.getElementToMoveChain()); handler.setElementToMoveSessionKey(pe.getElementToMoveSessionKey()); handler.setRemoveCompactMsgNamespaces(pe.isRemoveCompactMsgNamespaces()); handler.setContext(pipeLineSession); SAXParserFactory parserFactory = XmlUtils.getSAXParserFactory(); parserFactory.setNamespaceAware(true); SAXParser saxParser = parserFactory.newSAXParser(); try { saxParser.parse(xmlInput, handler); resultString = handler.getXmlString(); } catch (Exception e) { log.warn("Pipeline of adapter [" + owner.getName() + "] could not compact received message: " + e.getMessage()); } handler = null; } catch (Exception e) { throw new PipeRunException(pipe, "Pipeline of [" + pipeLine.getOwner().getName() + "] got error during compacting received message to more compact format: " + e.getMessage()); } pipeRunResult.setResult(resultString); } } if (StringUtils.isNotEmpty(pe.getStoreResultInSessionKey())) { if (log.isDebugEnabled()) log.debug("Pipeline of adapter [" + owner.getName() + "] storing result for pipe [" + pe.getName() + "] under sessionKey [" + pe.getStoreResultInSessionKey() + "]"); Object result = pipeRunResult.getResult(); pipeLineSession.put(pe.getStoreResultInSessionKey(), result); } if (pe.isPreserveInput()) { pipeRunResult.setResult(preservedObject); } } if (pe != null) { if (secLogEnabled && pe.isWriteToSecLog()) { String secLogMsg = "adapter [" + owner.getName() + "] pipe [" + pe.getName() + "]"; if (pe.getSecLogSessionKeys() != null) { String sk = ""; StringTokenizer st = new StringTokenizer(pe.getSecLogSessionKeys(), " ,;"); while (st.hasMoreTokens()) { if (sk.length() > 0) { sk = sk + ","; } String key = st.nextToken(); Object value = pipeLineSession.get(key); sk = sk + key + "=" + value; } secLogMsg = secLogMsg + " sessionKeys [" + sk + "]"; } secLog.info(secLogMsg); } } return pipeRunResult; }
From source file:nl.nn.adapterframework.receivers.ReceiverBase.java
private String processMessageInAdapter(IListener origin, Object rawMessage, String message, String messageId, String technicalCorrelationId, Map threadContext, long waitingDuration, boolean manualRetry) throws ListenerException { String result = null;/*from w w w. j a v a 2 s.co m*/ PipeLineResult pipeLineResult = null; long startProcessingTimestamp = System.currentTimeMillis(); // if (message==null) { // requestSizeStatistics.addValue(0); // } else { // requestSizeStatistics.addValue(message.length()); // } lastMessageDate = startProcessingTimestamp; log.debug(getLogPrefix() + "received message with messageId [" + messageId + "] (technical) correlationId [" + technicalCorrelationId + "]"); if (StringUtils.isEmpty(messageId)) { messageId = Misc.createSimpleUUID(); if (log.isDebugEnabled()) log.debug(getLogPrefix() + "generated messageId [" + messageId + "]"); } if (getChompCharSize() != null || getElementToMove() != null || getElementToMoveChain() != null) { log.debug(getLogPrefix() + "compact received message"); try { InputStream xmlInput = IOUtils.toInputStream(message, "UTF-8"); CompactSaxHandler handler = new CompactSaxHandler(); handler.setChompCharSize(getChompCharSize()); handler.setElementToMove(getElementToMove()); handler.setElementToMoveChain(getElementToMoveChain()); handler.setElementToMoveSessionKey(getElementToMoveSessionKey()); handler.setRemoveCompactMsgNamespaces(isRemoveCompactMsgNamespaces()); if (threadContext != null) { handler.setContext(threadContext); } SAXParserFactory parserFactory = XmlUtils.getSAXParserFactory(); parserFactory.setNamespaceAware(true); SAXParser saxParser = parserFactory.newSAXParser(); try { saxParser.parse(xmlInput, handler); message = handler.getXmlString(); } catch (Exception e) { warn("received message could not be compacted: " + e.getMessage()); } handler = null; } catch (Exception e) { throw new ListenerException( "error during compacting received message to more compact format: " + e.getMessage()); } } String businessCorrelationId = null; if (correlationIDTp != null) { try { businessCorrelationId = correlationIDTp.transform(message, null); } catch (Exception e) { //throw new ListenerException(getLogPrefix()+"could not extract businessCorrelationId",e); log.warn(getLogPrefix() + "could not extract businessCorrelationId"); } if (StringUtils.isEmpty(businessCorrelationId)) { String cidText; if (StringUtils.isNotEmpty(getCorrelationIDXPath())) { cidText = "xpathExpression [" + getCorrelationIDXPath() + "]"; } else { cidText = "styleSheet [" + getCorrelationIDStyleSheet() + "]"; } if (StringUtils.isNotEmpty(technicalCorrelationId)) { log.info(getLogPrefix() + "did not find correlationId using " + cidText + ", reverting to correlationId of transfer [" + technicalCorrelationId + "]"); businessCorrelationId = technicalCorrelationId; } } } else { businessCorrelationId = technicalCorrelationId; } if (StringUtils.isEmpty(businessCorrelationId)) { if (StringUtils.isNotEmpty(messageId)) { log.info(getLogPrefix() + "did not find (technical) correlationId, reverting to messageId [" + messageId + "]"); businessCorrelationId = messageId; } } log.info(getLogPrefix() + "messageId [" + messageId + "] technicalCorrelationId [" + technicalCorrelationId + "] businessCorrelationId [" + businessCorrelationId + "]"); threadContext.put(IPipeLineSession.businessCorrelationIdKey, businessCorrelationId); String label = null; if (labelTp != null) { try { label = labelTp.transform(message, null); } catch (Exception e) { //throw new ListenerException(getLogPrefix()+"could not extract label",e); log.warn(getLogPrefix() + "could not extract label: (" + ClassUtils.nameOf(e) + ") " + e.getMessage()); } } if (hasProblematicHistory(messageId, manualRetry, rawMessage, message, threadContext, businessCorrelationId)) { if (!isTransacted()) { log.warn(getLogPrefix() + "received message with messageId [" + messageId + "] which has a problematic history; aborting processing"); } numRejected.increase(); return result; } if (isDuplicateAndSkip(getMessageLog(), messageId, businessCorrelationId)) { numRejected.increase(); return result; } if (getCachedProcessResult(messageId) != null) { numRetried.increase(); } int txOption = this.getTransactionAttributeNum(); TransactionDefinition txDef = SpringTxManagerProxy.getTransactionDefinition(txOption, getTransactionTimeout()); //TransactionStatus txStatus = txManager.getTransaction(txDef); IbisTransaction itx = new IbisTransaction(txManager, txDef, "receiver [" + getName() + "]"); TransactionStatus txStatus = itx.getStatus(); // update processing statistics // count in processing statistics includes messages that are rolled back to input startProcessingMessage(waitingDuration); IPipeLineSession pipelineSession = null; String errorMessage = ""; boolean messageInError = false; try { String pipelineMessage; if (origin instanceof IBulkDataListener) { try { IBulkDataListener bdl = (IBulkDataListener) origin; pipelineMessage = bdl.retrieveBulkData(rawMessage, message, threadContext); } catch (Throwable t) { errorMessage = t.getMessage(); messageInError = true; ListenerException l = wrapExceptionAsListenerException(t); throw l; } } else { pipelineMessage = message; } numReceived.increase(); // Note: errorMessage is used to pass value from catch-clause to finally-clause! pipelineSession = createProcessingContext(businessCorrelationId, threadContext, messageId); // threadContext=pipelineSession; // this is to enable Listeners to use session variables, for instance in afterProcessMessage() try { if (getMessageLog() != null) { getMessageLog().storeMessage(messageId, businessCorrelationId, new Date(), RCV_MESSAGE_LOG_COMMENTS, label, pipelineMessage); } log.debug(getLogPrefix() + "preparing TimeoutGuard"); TimeoutGuard tg = new TimeoutGuard("Receiver " + getName()); try { if (log.isDebugEnabled()) log.debug(getLogPrefix() + "activating TimeoutGuard with transactionTimeout [" + transactionTimeout + "]s"); tg.activateGuard(getTransactionTimeout()); pipeLineResult = adapter.processMessageWithExceptions(businessCorrelationId, pipelineMessage, pipelineSession); pipelineSession.put("exitcode", "" + pipeLineResult.getExitCode()); result = pipeLineResult.getResult(); errorMessage = "exitState [" + pipeLineResult.getState() + "], result [" + result + "]"; if (log.isDebugEnabled()) { log.debug(getLogPrefix() + "received result: " + errorMessage); } messageInError = txStatus.isRollbackOnly(); } finally { log.debug(getLogPrefix() + "canceling TimeoutGuard, isInterrupted [" + Thread.currentThread().isInterrupted() + "]"); if (tg.cancel()) { errorMessage = "timeout exceeded"; if (StringUtils.isEmpty(result)) { result = "<timeout/>"; } messageInError = true; } } if (!messageInError && !isTransacted()) { String commitOnState = ((Adapter) adapter).getPipeLine().getCommitOnState(); if (StringUtils.isNotEmpty(commitOnState) && !commitOnState.equalsIgnoreCase(pipeLineResult.getState())) { messageInError = true; } } } catch (Throwable t) { if (TransactionSynchronizationManager.isActualTransactionActive()) { log.debug("<*>" + getLogPrefix() + "TX Update: Received failure, transaction " + (txStatus.isRollbackOnly() ? "already" : "not yet") + " marked for rollback-only"); } errorMessage = t.getMessage(); messageInError = true; if (pipeLineResult == null) { pipeLineResult = new PipeLineResult(); } if (StringUtils.isEmpty(pipeLineResult.getResult())) { String formattedErrorMessage = adapter.formatErrorMessage("exception caught", t, message, messageId, this, startProcessingTimestamp); pipeLineResult.setResult(formattedErrorMessage); } ListenerException l = wrapExceptionAsListenerException(t); throw l; } finally { putSessionKeysIntoThreadContext(threadContext, pipelineSession); } // if (result==null) { // responseSizeStatistics.addValue(0); // } else { // responseSizeStatistics.addValue(result.length()); // } if (getSender() != null) { String sendMsg = sendResultToSender(technicalCorrelationId, result); if (sendMsg != null) { errorMessage = sendMsg; } } } finally { cacheProcessResult(messageId, businessCorrelationId, errorMessage, new Date(startProcessingTimestamp)); if (!isTransacted() && messageInError) { if (!manualRetry) { moveInProcessToError(messageId, businessCorrelationId, message, new Date(startProcessingTimestamp), errorMessage, rawMessage, TXNEW_CTRL); } } try { Map afterMessageProcessedMap; if (threadContext != null) { afterMessageProcessedMap = threadContext; if (pipelineSession != null) { threadContext.putAll(pipelineSession); } } else { afterMessageProcessedMap = pipelineSession; } origin.afterMessageProcessed(pipeLineResult, rawMessage, afterMessageProcessedMap); } finally { long finishProcessingTimestamp = System.currentTimeMillis(); finishProcessingMessage(finishProcessingTimestamp - startProcessingTimestamp); if (!txStatus.isCompleted()) { // NB: Spring will take care of executing a commit or a rollback; // Spring will also ONLY commit the transaction if it was newly created // by the above call to txManager.getTransaction(). //txManager.commit(txStatus); itx.commit(); } else { throw new ListenerException( getLogPrefix() + "Transaction already completed; we didn't expect this"); } } } if (log.isDebugEnabled()) log.debug(getLogPrefix() + "messageId [" + messageId + "] correlationId [" + businessCorrelationId + "] returning result [" + result + "]"); return result; }