docs: public void handleMessage(
                                SIMPMessage msg,
                                TransactionCommon tran,
                                Integer reportType) throws SIIncorrectCallException, SITemporaryDestinationNotFoundException, SIResourceException, SINotPossibleInCurrentConfigurationException
      {
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.entry(tc, "handleMessage",
                          new Object[] { msg,
                                        tran,
                                        reportType });
  
          // Get copy of message
          JsMessage message = null;
          try
          {
              message = msg.getMessage().getReceived();
          } catch (MessageCopyFailedException e)
          {
              FFDCFilter.processException(
                                          e,
                                          "com.ibm.ws.sib.processor.impl.ReportHandler.handleMessage",
                                          "1:139:1.40",
                                          this);
  
              SibTr.exception(tc, e);
  
              if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                  SibTr.exit(tc, "handleMessage", "SIErrorException");
  
              throw new SIErrorException(e);
          }
  
          // Check the body content requested for the report
          Byte reportContent = null;
          if (reportType == SIApiConstants.REPORT_COA)
              reportContent = message.getReportCOA();
          else if (reportType == SIApiConstants.REPORT_COD)
              reportContent = msg.getReportCOD();
          else if (reportType == SIApiConstants.REPORT_EXCEPTION)
              reportContent = message.getReportException();
          else if (reportType == SIApiConstants.REPORT_EXPIRY)
              reportContent = message.getReportExpiry();
  
          // reportContent will not be null, need to use equals() comparison
          // since the Byte has been flowed in the message
          if (reportContent.equals(SIApiConstants.REPORT_NO_DATA))
          {
              message.clearMessagePayload();
              message.clearMessageProperties();
          }
  
          // Set the feedback field of the report message
          message.setReportFeedback(reportType);
  
          // Nullify remaining report options so the report itself does not request a report
          message.setReportCOA(null);
          message.setReportCOD(null);
          message.setReportException(null);
          message.setReportExpiry(null);
          message.setReportNAN(null);
          message.setReportPAN(null);
  
          // The original message's discard option does not apply to its report message
          message.setReportDiscardMsg(Boolean.FALSE);
  
          // Neither does its expiry
          message.setTimeToLive(0);
          message.setRemainingTimeToLive(-1);
          message.setMessageWaitTime(0);
  
          // Set the time that this message was created
          message.setTimestamp(System.currentTimeMillis());
  
          // Reset the redelivery count
          message.setRedeliveredCount(0);
  
          message.setMediated(false);
  
          message.setDeliveryDelay(0);
  
          // Copy reply fields to reply message
          if (msg.getMessage().getReplyPriority() != null)
              message.setPriority(msg.getMessage().getReplyPriority().intValue());
          if (msg.getMessage().getReplyReliability() != null)
              message.setReliability(msg.getMessage().getReplyReliability());
          if (msg.getMessage().getReplyTimeToLive() != null)
              message.setTimeToLive(msg.getMessage().getReplyTimeToLive().longValue());
          else
              message.setTimeToLive(0);
          if (msg.getMessage().getReplyDiscriminator() != null)
              message.setDiscriminator(msg.getMessage().getReplyDiscriminator());
          else
              message.setDiscriminator(null);
  
          // Set msgId/correlId fields
          if (Boolean.FALSE.equals(msg.getMessage().getReportPassCorrelId()))
              message.setCorrelationIdAsBytes(message.getApiMessageIdAsBytes());
  
          if (Boolean.FALSE.equals(msg.getMessage().getReportPassMsgId()))
          {
              // Set the new msgId to be the old one plus the report type byte
              byte[] oldId = message.getApiMessageIdAsBytes();
              byte[] newId;
              if (oldId != null)
              {
                  newId = new byte[oldId.length + 1];
                  for (int i = 0; i < oldId.length; i++)
                      newId[i] = oldId[i];
                  newId[oldId.length] = reportType.byteValue();
              }
              else
                  newId = new byte[] { reportType.byteValue() };
  
              message.setApiMessageIdAsBytes(newId);
          }
  
          // Get the reverse routing path
          if (!msg.getMessage().isReverseRoutingPathEmpty())
          {
              List<SIDestinationAddress> rrp = msg.getMessage().getReverseRoutingPath();
              JsDestinationAddress destinationAddress = null;
  
              Iterator it = rrp.iterator();
              destinationAddress = (JsDestinationAddress) it.next();
  
              // Remove first element of RRP
              rrp.remove(destinationAddress);
              message.setForwardRoutingPath(rrp);
              message.setRoutingDestination(destinationAddress);
  
              //Get the named destination from the destination manager
              DestinationHandler destination =
                              _messageProcessor.getDestinationManager().
                                              getDestination(destinationAddress, true);
  
              // Get the inputhandler associated with it        
              InputHandler inputHandler = destination.getInputHandler();
  
              // Send the report message
              try
              {
                  inputHandler.handleMessage(
                                             new MessageItem(message),
                                             tran,
                                             _messageProcessor.getMessagingEngineUuid());
              } catch (SIMPNoLocalisationsException e)
              {
                  // No FFDC code needed
  
                  // We can't find a suitable localisation.
                  // Although a queue must have at least one localisation this is
                  // possible if the sender restricted the potential localisations
                  // using a fixed ME or a scoping alias (to an out-of-date set of
                  // localisation)
  
                  //Put the message to the exception destination
                  destination.handleUndeliverableMessage(msg
                                                         , SIRCConstants.SIRC0026_NO_LOCALISATIONS_FOUND_ERROR
                                                         , new String[] { destination.getName() },
                                                         null);
              }
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.exit(tc, "handleMessage");
      }