docs: private DestinationHandler getDestinationInternal(
                                                        String destinationName,
                                                        String busName,
                                                        AliasChainValidator validator,
                                                        boolean includeInvisible,
                                                        boolean create)
  
                      throws SIResourceException, SITemporaryDestinationNotFoundException, SINotPossibleInCurrentConfigurationException, SIIncorrectCallException
      {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.entry(
                          tc,
                          "getDestinationInternal",
                          new Object[] { destinationName, busName, validator, new Boolean(includeInvisible) });
  
          /* Check that the destination name is not null. */
          checkDestinationHandlerExists(
                                        destinationName != null,
                                        destinationName,
                                        messageProcessor.getMessagingEngineName());
  
          boolean remoteTemporaryOrSystem = false;
          boolean system = false;
          boolean temporary = (destinationName.startsWith(SIMPConstants.TEMPORARY_QUEUE_DESTINATION_PREFIX) ||
                          destinationName.startsWith(SIMPConstants.TEMPORARY_PUBSUB_DESTINATION_PREFIX));
          if (!temporary)
              system = destinationName.startsWith(SIMPConstants.SYSTEM_DESTINATION_PREFIX);
  
          SIBUuid8 parsedME = null;
  
          DestinationHandler destination = null;
  
          //if it is a temporary or system destination then it won't have been defined
          //in WCCM. Therefore we need to try and work out where it is localized from
          //the destination name we have been given. The name should include the uuid
          //of the localizing ME.
          if (temporary || system)
          {
              if ((busName == null) ||
                  (busName.equals(messageProcessor.getMessagingEngineBus())))
              {
                  //get the ME uuid from the destination name
                  parsedME = SIMPUtils.parseME(destinationName);
                  if (parsedME != null)
                  {
                      //work out if it is a local or remote destination
                      remoteTemporaryOrSystem = !parsedME.equals(messageProcessor.getMessagingEngineUuid());
  
                      //if it is remote then we may need to dynamically create the remote representation
                      //of that destination
                      if (remoteTemporaryOrSystem)
                      {
                          if (temporary)
                          {
                              //if this is a remote temporary destination then we will actually be
                              //using a specialized pt-pt system destination - a TDRECEIVER.
                              //There will be one of these per remote ME.
                              // System queues use their own streams.
                              JsDestinationAddress actualDestinationAddr =
                                              SIMPUtils.createJsSystemDestinationAddress(SIMPConstants.TDRECEIVER_SYSTEM_DESTINATION_PREFIX, parsedME);
                              destinationName = actualDestinationAddr.getDestinationName();
                              busName = actualDestinationAddr.getBusName();
                          }
                      }
                  }
                  else //couldn't parse the destination name, throw an excption
                  {
                      SIMPErrorException e =
                                      new SIMPErrorException(
                                                      nls.getFormattedMessage(
                                                                              "INTERNAL_MESSAGING_ERROR_CWSIP0001",
                                                                              new Object[] { "com.ibm.ws.sib.processor.impl.DestinationManager", "1:1092:1.487" },
                                                                              null));
  
                      e.setExceptionReason(SIRCConstants.SIRC0900_INTERNAL_MESSAGING_ERROR);
                      e.setExceptionInserts(new String[] { "com.ibm.ws.sib.processor.impl.DestinationManager",
                                                          "1:1097:1.487" });
  
                      // This exception should not be thrown so FFDC
                      FFDCFilter.processException(
                                                  e,
                                                  "com.ibm.ws.sib.processor.impl.DestinationManager.getDestinationInternal",
                                                  "1:1103:1.487",
                                                  this);
  
                      SibTr.exception(tc, e);
  
                      SibTr.error(tc, "INTERNAL_MESSAGING_ERROR_CWSIP0001",
                                  new Object[] { "com.ibm.ws.sib.processor.impl.DestinationManager", "1:1109:1.487" });
  
                      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                          SibTr.exit(tc, "getDestinationInternal", e);
  
                      // This should never be thrown
                      throw e;
                  }
              }
          }
  
          // Before we do checks which might involve non local bus destinations,
          // make sure the bus name reflects the local bus if not otherwise
          // specified.
          if (busName == null || busName.equals(""))
              busName = messageProcessor.getMessagingEngineBus();
  
          // See if we already have the destination loaded
          destination = getDestinationInternal(destinationName, busName, includeInvisible);
  
          // If the destination is not in memory (if, for instance,
          // it's an unloaded alias destination), then look it up in admin and create
          // if appropriate (we don't bother for foreign system or temporary destinations
          // as they cannot be configured)
          if ((destination == null) && !(temporary || system))
          {
              destination = loadDestination(destinationName, busName, validator, true);
          }
  
          // If the destination is on another bus, it isn't in memory and it doesn't
          // have a specific foreign destination definition in admin, then try to
          // get the default foreign destination for that bus.
          if (destination == null && !busName.equals(messageProcessor.getMessagingEngineBus()))
          {
              destination = findBus(busName);
          }
  
          // If this is a remote temporary or system queue there is no Admin config for it
          // to use as an identity understood across all MEs in the bus. So instead we use
          // a special catch-all 'queue' to allow us to send messages from this ME to another
          // one in the bus and for the other ME to understand what's happening.
          else if ((destination == null) && remoteTemporaryOrSystem && create)
          {
              //Lookup a system destination or a temporary destination.  These are always on the local
              //bus
              destination = createRemoteSystemDestination(destinationName, parsedME);
          }
  
          /*
           * If we've found the destination but it's corrupt, do not permit the
           * requester to receive it.
           */
          if (destination != null && destination.isCorruptOrIndoubt())
          {
              String message =
                              nls_cwsik.getFormattedMessage(
                                                            "DELIVERY_ERROR_SIRC_27", // DESTINATION_CORRUPT_ERROR_CWSIP0058
                                                            new Object[] { destinationName }, null);
  
              SIMPDestinationCorruptException e = new SIMPDestinationCorruptException(message);
  
              e.setExceptionReason(SIRCConstants.SIRC0027_DESTINATION_CORRUPT_ERROR);
              e.setExceptionInserts(new String[] { destinationName });
  
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                  SibTr.exception(tc, e);
  
              if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                  SibTr.exit(tc, "getDestinationInternal", e);
  
              throw e;
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.exit(tc, "getDestinationInternal", destination);
  
          return destination;
      }