docs: final protected void eventPrecommitAdd(MessageItem msg, final TransactionCommon transaction) throws SIDiscriminatorSyntaxException, SIResourceException
      {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.entry(tc, "eventPrecommitAdd", new Object[] { msg, transaction });
  
          if (!(_destination.isToBeDeleted()))
          {
              if (msg.isTransacted() && (!(msg.isToBeStoredAtSendTime())))
              {
                  // LockR the destination to prevent reallocation from occurring on the chosen localisation
                  LockManager reallocationLock = _destination.getReallocationLockManager();
                  reallocationLock.lock();
                  try
                  {
                      // If we fixed the ME it'll be in the routing address in the message
                      SIBUuid8 fixedME = null;
                      JsDestinationAddress routingAddr = msg.getMessage().getRoutingDestination();
                      if (routingAddr != null)
                          fixedME = routingAddr.getME();
  
                      // If the sender prefers any local ME over others then we'll give it a go
                      SIBUuid8 preferredME = null;
                      if (msg.preferLocal())
                      {
                          if (_destination.hasLocal())
                              preferredME = _messageProcessor.getMessagingEngineUuid();
                      }
                      // 176658.3.5
                      OutputHandler handler = _destination.choosePtoPOutputHandler(fixedME,
                                                                                   preferredME,
                                                                                   !msg.isFromRemoteME(),
                                                                                   msg.isForcePut(),
                                                                                   null);
  
                      if (handler == null)
                      {
                          // 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)
  
                          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                          {
                              SibTr.debug(tc, "No suitable OutputHandler found for " + _destination.getName() + " (" + fixedME + ")");
                          }
  
                          //Put the message to the exception destination.
                          handleUndeliverableMessage(_destination
                                                     , null // null LinkHandler
                                                     , msg
                                                     , SIRCConstants.SIRC0026_NO_LOCALISATIONS_FOUND_ERROR
                                                     , new String[] { _destination.getName() }
                                                     , transaction);
                      }
                      else
                      {
                          //Indicate in the message if this was a guess
                          msg.setStreamIsGuess(handler.isWLMGuess());
  
                          // put the message to the output handler
                          handler.put(msg, transaction, null, true);
                      }
                  } finally
                  {
                      // unlock the reallocation lock
                      reallocationLock.unlock();
                  }
              }
          }
          else
          {
              //The destination has been deleted.  Put the message to the exception destination#
              ExceptionDestinationHandlerImpl exceptionDestinationHandlerImpl =
                              (ExceptionDestinationHandlerImpl) _messageProcessor.createExceptionDestinationHandler(null);
  
              //Set indicator to send the message to the exception destination immediately,
              //rather than registering it for pre-prepare of the transaction, as this is
              //pre-prepare of the transaction!
              msg.setStoreAtSendTime(true);
  
              String destName = _destination.getName();
              if (_destination.isLink())
                  destName = ((LinkHandler) _destination).getBusName();
  
              final UndeliverableReturnCode rc =
                              exceptionDestinationHandlerImpl.handleUndeliverableMessage(msg
                                                                                         , transaction
                                                                                         , SIRCConstants.SIRC0032_DESTINATION_DELETED_ERROR
                                                                                         , new String[] { destName,
                                                                                                         _messageProcessor.getMessagingEngineName() });
              if (rc != UndeliverableReturnCode.OK)
              {
                  if (rc == UndeliverableReturnCode.DISCARD)
                  {
                      //The message is to be discarded.  Do nothing and it will disappear.
                  }
                  else
                  {
                      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                          SibTr.exit(tc, "eventPrecommitAdd", "WsRuntimeException");
                      //We cannot put the message to the exception destination.  All we can
                      //do in this case is rollback the users transaction.  This is done by
                      //throwing an exception that is caught by the transaction manager.
                      throw new WsRuntimeException(
                                      nls.getFormattedMessage(
                                                              "DESTINATION_DELETED_ERROR_CWSIP0247",
                                                              new Object[] { _destination.getName(),
                                                                            rc },
                                                              null));
                  }
              }
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.exit(tc, "eventPrecommitAdd");
      }