docs: private DestinationHandler createAliasDestination(DestinationAliasDefinition add, AliasChainValidator validator, DestinationHandler baseDest) throws SINotPossibleInCurrentConfigurationException, SIMPDestinationCorruptException, SIResourceException
      {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.entry(tc, "createAliasDestination", new Object[] { add, validator, baseDest });
  
          String destinationName = add.getName();
          String busName = add.getBus();
  
          // Through the admin panels it is possible for an empty string to be specified.
          // An empty string means use the local bus name.
          if (busName == null || busName.equals(""))
              busName = messageProcessor.getMessagingEngineBus();
  
          // If the validator is null, we must be at the top of any alias chain.
          if (null == validator)
          {
              validator = new AliasChainValidator();
          }
  
          // Check that we are not going around in a loop with alias validation.
          validator.validate(destinationName, busName);
  
          AliasDestinationHandler aliasDestinationHandler = null;
  
          try
          {
              boolean aliasChainError = false;
  
              // If we are trying to plug in a destination handler rather than look it up then we need
              // to check that we are not an alias chain. If we are we recursively call into the chain
              // handing the plugin destination to the last one.
              if (baseDest != null)
              {
                  String targetBus = add.getTargetBus();
                  if (targetBus == null || targetBus.equals(""))
                      targetBus = messageProcessor.getMessagingEngineBus();
  
                  // If the name of the current alias target is not the same as the plugin basedest, then
                  // we are an alias chaing and we create the next part of the chain passing in the basedest
                  if (!add.getTargetName().equals(baseDest.getName()) || !targetBus.equals(baseDest.getBus()))
                  {
                      baseDest = getAliasDestinationInternal(add.getTargetName(), targetBus, validator, baseDest, false);
                      if (baseDest == null)
                          aliasChainError = true;
                  }
              }
  
              //The lock on the destinationManager is taken to stop 2 threads creating the same
              //destination and also to synchronize dynamic deletes with the
              //creation of aliases.  This stops an alias destination being created that targets a
              //destination in the process of being deleted.
              synchronized (this)
              {
                  DestinationHandler targetDH = baseDest;
  
                  if (targetDH == null && !aliasChainError)
                  {
  
                      targetDH =
                                      getDestinationInternal(
                                                             add.getTargetName(),
                                                             add.getTargetBus(),
                                                             validator,
                                                             false,
                                                             false);
  
                  }
  
                  if (targetDH == null)
                  {
                      // Throw out exception detailing chain
                      // Add the destination name which has triggered the exception to the end
                      // of the list, making the problem obvious.
                      String chainText = validator.toStringPlus(add.getTargetName(), busName);
  
                      String targetName = add.getTargetName();
                      AliasChainValidator.CompoundName firstInChain = validator.getFirstInChain();
  
                      SIMPNotPossibleInCurrentConfigurationException e =
                                      new SIMPNotPossibleInCurrentConfigurationException(
                                                      nls_cwsik.getFormattedMessage(
                                                                                    "DELIVERY_ERROR_SIRC_45", // ALIAS_TARGET_DESTINATION_NOT_FOUND_EXCEPTION_CWSIP0057
                                                                                    new Object[]
                                                                                    { firstInChain.getDestName(), targetName },
                                                                                    null)
                                      );
  
                      e.setExceptionReason(SIRCConstants.SIRC0028_ALIAS_TARGET_DESTINATION_NOT_FOUND_EXCEPTION);
                      e.setExceptionInserts(new String[] { firstInChain.getDestName(), targetName });
  
                      SibTr.exception(tc, e);
  
                      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                          SibTr.exit(tc, "createAliasDestination", e);
                      throw e;
                  }
                  else if (targetDH.getDestinationType().equals(DestinationType.SERVICE))
                  {
                      // Throw out exception detailing chain
                      // Add the destination name which has triggered the exception to the end
                      // of the list, making the problem obvious.
                      String chainText = validator.toStringPlus(targetDH.getName(), targetDH.getBus());
  
                      AliasChainValidator.CompoundName firstInChain = validator.getFirstInChain();
  
                      String nlsMessage =
                                      nls_cwsik.getFormattedMessage(
                                                                    "DELIVERY_ERROR_SIRC_29", // ALIAS_TARGETS_SERVICE_DESTINATION_ERROR_CWSIP0622
                                                                    new Object[]
                                                                    { firstInChain.getDestName(), targetDH.getName(), chainText, busName },
                                                                    null);
  
                      SIMPNotPossibleInCurrentConfigurationException e = new SIMPNotPossibleInCurrentConfigurationException(nlsMessage);
  
                      e.setExceptionReason(SIRCConstants.SIRC0029_ALIAS_TARGETS_SERVICE_DESTINATION_ERROR);
                      e.setExceptionInserts(new String[] { firstInChain.getDestName(), targetDH.getName(), chainText, busName });
  
                      SibTr.exception(tc, e);
  
                      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                          SibTr.exit(tc, "createAliasDestination", e);
                      throw e;
                  }
  
                  // Create a new DestinationHandler, which is created locked
                  aliasDestinationHandler = new AliasDestinationHandler(add, messageProcessor, this, targetDH, busName);
  
                  DestinationIndex.Type type = new DestinationIndex.Type();
                  type.alias = Boolean.TRUE;
                  type.foreignDestination = Boolean.FALSE;
                  type.local = Boolean.FALSE;
                  type.remote = Boolean.FALSE;
                  type.queue = new Boolean(!aliasDestinationHandler.isPubSub());
                  type.state = State.ACTIVE;
                  destinationIndex.put(aliasDestinationHandler, type);
              }
          } catch (SITemporaryDestinationNotFoundException e)
          {
              // FFDC
              FFDCFilter.processException(
                                          e,
                                          "com.ibm.ws.sib.processor.impl.DestinationManager.createAliasDestination",
                                          "1:6701:1.508.1.7",
                                          this);
  
              if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                  SibTr.exit(tc, "createAliasDestination", "SIErrorException");
  
              SIMPErrorException ee = new SIMPErrorException(
                              nls_cwsik.getFormattedMessage(
                                                            "DELIVERY_ERROR_SIRC_901",
                                                            new Object[] { "com.ibm.ws.sib.processor.impl.DestinationManager", "1:6710:1.508.1.7", e, destinationName },
                                                            null),
                              e);
  
              ee.setExceptionReason(SIRCConstants.SIRC0901_INTERNAL_MESSAGING_ERROR);
              ee.setExceptionInserts(new String[] { "com.ibm.ws.sib.processor.impl.DestinationManager",
                                                   "1:6716:1.508.1.7",
                                                   SIMPUtils.getStackTrace(e) });
              throw ee;
          } catch (SIIncorrectCallException e)
          {
              // FFDC
              FFDCFilter.processException(
                                          e,
                                          "com.ibm.ws.sib.processor.impl.DestinationManager.createAliasDestination",
                                          "1:6166:1.487",
                                          this);
  
              if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                  SibTr.exit(tc, "createAliasDestination", "SIErrorException");
  
              SIMPErrorException ee = new SIMPErrorException(
                              nls_cwsik.getFormattedMessage(
                                                            "DELIVERY_ERROR_SIRC_901",
                                                            new Object[] { "com.ibm.ws.sib.processor.impl.DestinationManager", "1:6175:1.487", e, destinationName },
                                                            null),
                              e);
  
              ee.setExceptionReason(SIRCConstants.SIRC0901_INTERNAL_MESSAGING_ERROR);
              ee.setExceptionInserts(new String[] { "com.ibm.ws.sib.processor.impl.DestinationManager",
                                                   "1:6181:1.487",
                                                   SIMPUtils.getStackTrace(e) });
              throw ee;
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.exit(tc, "createAliasDestination", aliasDestinationHandler);
  
          return aliasDestinationHandler;
      }