Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Scout/Tutorial/3.9/webservices/DatabaseLogHandler
< Scout | Tutorial | 3.9 | webservices
The Scout documentation has been moved to https://eclipsescout.github.io/.
package org.eclipse.scout.tutorial.jaxws.server.services.ws.handler; import java.io.ByteArrayOutputStream; import java.util.Date; import java.util.UUID; import javax.xml.ws.handler.soap.SOAPMessageContext; import org.eclipse.scout.commons.StringUtility; import org.eclipse.scout.commons.exception.ProcessingException; import org.eclipse.scout.commons.holders.NVPair; import org.eclipse.scout.commons.logger.IScoutLogger; import org.eclipse.scout.commons.logger.ScoutLogManager; import org.eclipse.scout.commons.xmlparser.ScoutXmlDocument; import org.eclipse.scout.jaxws.annotation.ScoutTransaction; import org.eclipse.scout.jaxws.handler.LogHandler; import org.eclipse.scout.rt.server.services.common.jdbc.SQL; @ScoutTransaction public class DatabaseLogHandler extends LogHandler { private static final IScoutLogger LOG = ScoutLogManager.getLogger(DatabaseLogHandler.class); /** * Property to access the primary key of the log entry in the message context. */ public static final String PROP_WS_LOG_NR = UUID.randomUUID().toString(); @Override protected void handleLogMessage(DirectionType directionType, String soapMessage, SOAPMessageContext context) { try { /* * If this handler is invoked to post-process the SOAP-response, the SOAP-request was already logged and * the log's primary key put into the message context. In consequence, the log entry is updated with the SOAP response. */ Long wsLogNr = (Long) context.get(PROP_WS_LOG_NR); if (wsLogNr == null) { // SOAP request wsLogNr = SQL.getSequenceNextval("GLOBAL_SEQ"); context.put(PROP_WS_LOG_NR, wsLogNr); SQL.insert("" + "INSERT INTO WS_LOG " + " (WS_LOG_NR, " + " EVT_DATE, " + " SERVICE, " + " PORT, " + " OPERATION, " + " REQUEST) " + "VALUES (:wsLogNr, " + " :evtDate, " + " :service, " + " :port, " + " :operation, " + " :request)" , new NVPair("wsLogNr", wsLogNr) , new NVPair("service", StringUtility.nvl(context.get(SOAPMessageContext.WSDL_SERVICE), "?")) , new NVPair("port", StringUtility.nvl(context.get(SOAPMessageContext.WSDL_PORT), "?")) , new NVPair("operation", StringUtility.nvl(context.get(SOAPMessageContext.WSDL_OPERATION), "?")) , new NVPair("request", wellformXml(soapMessage)) , new NVPair("evtDate", new Date()) ); } else { // SOAP response SQL.update("" + "UPDATE WS_LOG " + "SET RESPONSE = :response " + "WHERE WS_LOG_NR = :wsLogNr" , new NVPair("wsLogNr", wsLogNr) , new NVPair("response", wellformXml(soapMessage)) ); } } catch (ProcessingException e) { LOG.error("failed to persist webservice-log", e); } } private String wellformXml(String rawXml) { try { ScoutXmlDocument doc = new ScoutXmlDocument(rawXml); doc.setPrettyPrint(true); ByteArrayOutputStream os = new ByteArrayOutputStream(); doc.write(os); return new String(os.toByteArray(), doc.getXmlEncoding()); } catch (Exception e) { LOG.warn("failed to wellform XML", e); } return rawXml; } }