docs: public SOAPMessage onMessage(SOAPMessage message)
      {
          Utility.getLogger().info("onMessage called in receiving servlet");
          SOAPMessageTransport soapMessageTransport = null;
          ServletTask servletTask = null;
          BaseMessage msgReplyInternal = null;
          Map<String,Object> properties = m_initProperties;
          try {
          	if (message.getMimeHeaders() != null)
          	{
          		String[] rgstrTargetHost = message.getMimeHeaders().getHeader("host");
          		if (rgstrTargetHost != null)
          			if (rgstrTargetHost.length >= 1)
          			{
          		        properties = new HashMap<String,Object>();
          		        if (m_initProperties != null)
          		        	properties.putAll(m_initProperties);
          				properties.put(DBParams.DOMAIN, rgstrTargetHost[0]);
          				
          			}
          	}
              servletTask = new ServletTask(this, BasicServlet.SERVLET_TYPE.MESSAGE);
              servletTask.setProperties(properties);
              Environment env = null;
              if (servletTask.getApplication() != null)
                  env = ((BaseApplication)servletTask.getApplication()).getEnvironment();
              if (env == null)
                  env = Environment.getEnvironment(null);
              App app = env.getMessageApplication(true, properties);
              servletTask.setApplication(app);
  
              soapMessageTransport = new SOAPMessageTransport(servletTask);
              
              BaseMessage messageIn = new TreeMessage(null, null);
              new SoapTrxMessageIn(messageIn, message);
  
              msgReplyInternal = soapMessageTransport.processIncomingMessage(messageIn, null);
              Utility.getLogger().info("msgReplyInternal: " + msgReplyInternal);
  
              int iErrorCode = soapMessageTransport.convertToExternal(msgReplyInternal, null);
              Utility.getLogger().info("externalMessageReply: " + msgReplyInternal);
              SOAPMessage msg = null;//fac.createMessage();
  
              if (iErrorCode == DBConstants.NORMAL_RETURN)
              {
  //?             Document doc = ((JAXBTrxMessageOut)msgReplyInternal.getExternalMessage()).getScratchDocument(); 
                  msg = soapMessageTransport.setSOAPBody(msg, msgReplyInternal);
                  String strTrxID = (String)msgReplyInternal.getMessageHeader().get(TrxMessageHeader.LOG_TRX_ID);
                  soapMessageTransport.logMessage(strTrxID, msgReplyInternal, MessageInfoTypeModel.REPLY, MessageTypeModel.MESSAGE_OUT, MessageStatusModel.SENTOK, null, null);    // Sent (no reply required)
              }
  
              return msg;
          } catch (Throwable ex)  {
              ex.printStackTrace();
              String strError = "Error in processing or replying to a message";
              Utility.getLogger().warning(strError);
              if ((msgReplyInternal != null) && (soapMessageTransport != null))
              {
                  String strTrxID = (String)msgReplyInternal.getMessageHeader().get(TrxMessageHeader.LOG_TRX_ID);
                  soapMessageTransport.logMessage(strTrxID, msgReplyInternal, MessageInfoTypeModel.REPLY, MessageTypeModel.MESSAGE_OUT, MessageStatusModel.ERROR, strError, null);
              }
              return null;
          } finally   {
              if (soapMessageTransport != null)
              {
                  soapMessageTransport.free();
                  soapMessageTransport = null;
              }
              if (servletTask != null)
                  servletTask.free();
          }
      }