docs: private void eventPostCommit(SIMPMessage msg) throws SIResourceException
      {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.entry(tc, "eventPostCommit", msg);
  
          MessageItem msgItem = (MessageItem) msg;
          JsMessage jsMsg = msgItem.getMessage();
  
          // If we need to send the message out we will create copies,
          // as we cannot initialize the message post-commit - consumer threads
          // might already be taking copies of the message to delivery to consumers.
          MessageItem msgItemCopy = null;
          JsMessage jsMsgCopy = null;
  
          //get the list of matching output handlers for this message
          MessageProcessorSearchResults searchResults = msgItem.getSearchResults();
  
          //Although there may be matching neighbours, some of them
          //may be upstream, and so shouldn't count as matches.
          //Therefore we can only tell if we actually have to initialize msg fields
          //once we start enumerating the output handlers.
          boolean sourceStreamUpdated = false;
  
          //don't give a monkeys what the topic was, just want the results back!
          List matchingPubsubOutputHandlers = searchResults.getPubSubOutputHandlers(null);
  
          ArrayList<SIBUuid8> fromTo = new ArrayList<SIBUuid8>(matchingPubsubOutputHandlers.size()); //see defect 285784: 
          //we should not use array as we might end up with null elements (if there
          //are upstream MEs). The NPE that results causes localPut to bomb-out 
          //before msg is delivered to local ConsumerDispatchers. 
          //We use the match list size as an initial capacity as it is 
          //probably quite a good guess.
  
          Iterator itr = matchingPubsubOutputHandlers.iterator();
          int i = 0;
          while (itr.hasNext())
          {
              //get the next output handler
              PubSubOutputHandler outputHandler = (PubSubOutputHandler) itr.next();
  
              if (outputHandler.okToForward(msgItem))
              {
                  if (TraceComponent.isAnyTracingEnabled() && UserTrace.tc_mt.isDebugEnabled())
                      UserTrace.traceOutboundSend(jsMsg,
                                                  outputHandler.getTargetMEUuid(),
                                                  _destination.getName(),
                                                  _destination.isForeignBus() || _destination.isLink(),
                                                  _destination.isMQLink(),
                                                  _destination.isTemporary());
  
                  if (!sourceStreamUpdated)
                  {
                      // Create a copy of the message
                      try
                      {
                          jsMsgCopy = jsMsg.getReceived();
                          msgItemCopy = new MessageItem(jsMsgCopy);
                      } catch (MessageCopyFailedException e)
                      {
                          // FFDC
                          FFDCFilter.processException(
                                                      e,
                                                      "com.ibm.ws.sib.processor.impl.PubSubInputHandler.eventPostCommit",
                                                      "1:3562:1.329.1.1",
                                                      this);
  
                          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                          {
                              SibTr.exception(tc, e);
                              SibTr.exit(tc, "eventPostCommit", e);
                          }
  
                          SibTr.error(tc, "INTERNAL_MESSAGING_ERROR_CWSIP0002",
                                      new Object[] {
                                                    "com.ibm.ws.sib.processor.impl.PubSubInputHandler",
                                                    "1:3574:1.329.1.1",
                                                    e });
  
                          throw new SIResourceException(
                                          nls.getFormattedMessage(
                                                                  "INTERNAL_MESSAGING_ERROR_CWSIP0002",
                                                                  new Object[] {
                                                                                "com.ibm.ws.sib.processor.impl.PubSubInputHandler",
                                                                                "1:3582:1.329.1.1",
                                                                                e },
                                                                  null),
                                          e);
                      }
  
                      //set the necessary msg properties 
                      setPropertiesInMessage(jsMsgCopy,
                                             _destination.getUuid(),
                                             msgItemCopy.getProducerConnectionUuid());
                      //and the 'bus' field
                      jsMsgCopy.setBus(_messageProcessor.getMessagingEngineBus());
  
                      // This allocates the tick and adds to stream atomically
                      _sourceStreamManager.addMessage(msgItemCopy);
  
                      sourceStreamUpdated = true;
                  }
                  // Unfortunately each individual InternalOutputStream StreamSet must be initialised.
                  // Otherwise the areYouFlushed query sent from each target will fail to realise the
                  // 'stream' (not that there really is one in this case) is not flushed. In which case
                  // a flushed message will be sent to the target and the message ignored.
                  // The cheapest (from a code point of view, not performance) and safest mechanism to
                  // ensure the StreamSet is there is to drive PSOH.put() which drives
                  // InternalOutputStreamManager.addMessage() which lazily instantiates the StreamSet.
                  // We could improve performance later by reducing the amount of work performed in
                  // the IOSM.addMessage() method for best_effort messages (e.g. just call
                  // IOSM.getStreamSet()).
                  outputHandler.put(msgItemCopy, null, null, false);
  
                  //add a target cellule to the array for sending
                  //or send the message directly from the outputHandler
                  //if this is a Link 
                  if (outputHandler.isLink())
                  {
                      outputHandler.sendLinkMessage(msgItemCopy, false);
                  }
                  else
                  {
                      SIBUuid8 targetMEUuid = outputHandler.getTargetMEUuid();
                      fromTo.add(targetMEUuid); //see defect 285784
                      i++;
                  }
              }//end ok to forward
  
          }
  
          // call MPIO to finally send the message to the matching remote MEs
          if (i > 0)
          {
              //Now that we have a list of fromTo pairs we can obtain an array representation 
              //see defect 285784
              SIBUuid8[] fromToArray =
                              fromTo.toArray(new SIBUuid8[fromTo.size()]);
  
              _mpio.sendDownTree(fromToArray, //the list of source target pairs
                                 msgItemCopy.getPriority(), //priority
                                 jsMsgCopy); //the copy the JsMessage we created
          }
  
          //just to be safe, nullify the reference's reference to the results object...
          msgItem.setSearchResults(null);
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.exit(tc, "eventPostCommit");
      }