docs: protected Neighbour addNeighbour(
      SIBUuid8 meUUID,
      String busId,
      Transaction transaction) 
      
      throws SIDiscriminatorSyntaxException, SISelectorSyntaxException, SIResourceException
    {
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        SibTr.entry(
          tc,
          "addNeighbour",
          new Object[] {
            meUUID,
            busId});
            
      Neighbour neighbour = null;
      
      // Does this Neighbour exist already.
      synchronized(_neighbours)
      {
        if (_neighbours.containsKey(meUUID))
        {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                SibTr.exit(
                  tc,
                  "addNeighbour","Neighbour already exists");
          return (Neighbour) _neighbours.get(meUUID);
        }
      }
  
      // Check that there isn't a matching Neighbour in the 
      // Recovered Neighbours list     
      synchronized(_recoveredNeighbours)
      {
        neighbour = (Neighbour)_recoveredNeighbours.get(meUUID);
      }
      
      if (neighbour!=null)
      {
        synchronized(_recoveredNeighbours)
        {
          _recoveredNeighbours.remove(meUUID);
        }
          
        // Iterate over the list of pubsub output handlers a
        // and add them back into the match space.
        HashSet handlers = neighbour.getPubSubOutputHandlers();
          
        if (handlers != null)
        {
          Iterator iter = handlers.iterator();
          
          while (iter.hasNext())
          {
            PubSubOutputHandler h = (PubSubOutputHandler)iter.next();
            String[] topics = h.getTopics();
            
            if (topics != null)
            {
              for (int i = 0; i<topics.length; i++)
              {
                MESubscription meSub = neighbour.getSubscription(h.getTopicSpaceUuid(), topics[i]);
                ControllableProxySubscription sub = 
                  _proxyHandler.
                  getMessageProcessor().
                    getMessageProcessorMatching().
                      addPubSubOutputHandlerMatchTarget(h, 
                                                        h.getTopicSpaceUuid(), 
                                                        h.getTopics()[i],
                                                        meSub.isForeignSecuredProxy(),
                                                        meSub.getMESubUserId());
                meSub.setMatchspaceSub(sub);
              }
            }
          }
        }
          
        if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) 
          SibTr.debug(tc, "Neighbour recovered " + neighbour);
      }
      else
      {     
        try
        {
          neighbour =
            new Neighbour(
              _proxyHandler,
              meUUID,
              busId,
              this);
            
          if (transaction == null)
            transaction = 
              _proxyHandler.getMessageProcessor().getTXManager().createAutoCommitTransaction();
                
          _proxyHandler.addItemStream(neighbour, transaction);
        }
        catch (MessageStoreException e)
        {
          // If the MessageStoreException is caught, then this is bad, log a FFDC
          FFDCFilter.processException(
            e,
            "com.ibm.ws.sib.processor.proxyhandler.Neighbours.addNeighbour",
            "1:755:1.113",
            this);
            
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) 
            SibTr.exit(tc, "addNeighbour", "SIResourceException");
              
          SibTr.error(tc, "INTERNAL_MESSAGING_ERROR_CWSIP0003",
            new Object[] {
              "com.ibm.ws.sib.processor.proxyhandler.Neighbours",
              "1:764:1.113",
              e,
              meUUID});
            
          throw new SIResourceException(
            nls.getFormattedMessage(
              "INTERNAL_MESSAGING_ERROR_CWSIP0003",
              new Object[] {
                "com.ibm.ws.sib.processor.proxyhandler.Neighbours",
                "1:773:1.113",
                e,
                meUUID},
              null), 
            e);
        }
      }
  
      // Add the Neighbour to the list of Neighbours
      synchronized(_neighbours)
      {
        _neighbours.put(meUUID, neighbour);
      }
      
      // Get the BusGroup that this Neighbour belongs to.
      BusGroup group = findBus(busId);
  
      // If no group is found then create one
      if (group == null)
        group = createBus(busId);
  
      // Add the neighbour to the group
      group.addNeighbour(neighbour);
  
      //Assign the BusGroup to the Neighbour
      neighbour.setBus(group);
      
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        SibTr.exit(tc, "addNeighbour", neighbour);
        
      return neighbour;
    }