IGNITE-11688: Default tracked branch name is now overridable in server config (aliased servers supported)
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ITcServerConfig.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ITcServerConfig.java
index 7c5185f..5a415b4 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ITcServerConfig.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/conf/ITcServerConfig.java
@@ -40,4 +40,5 @@
      * @return
      */
     @NotNull public String defaultTrackedBranch();
+
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
index 658efed..89c0241 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
@@ -82,7 +82,6 @@
 import static org.apache.ignite.ci.observer.BuildsInfo.FINISHED_STATUS;
 import static org.apache.ignite.ci.observer.BuildsInfo.RUNNING_STATUS;
 import static org.apache.ignite.ci.util.XmlUtil.xmlEscapeText;
-import static org.apache.ignite.ci.tcbot.conf.TcServerConfig.DEFAULT_TRACKED_BRANCH_NAME;
 
 /**
  * TC Bot Visa Facade. Provides method for TC Bot Visa obtaining. Contains features for adding comment to the ticket
@@ -364,14 +363,14 @@
     }
 
     /**
-     * @param srvId Server id.
+     * @param srvIdOrAlias Server id.
      * @param credsProv Credentials
      */
-    public List<ContributionToCheck> getContributionsToCheck(String srvId,
+    public List<ContributionToCheck> getContributionsToCheck(String srvIdOrAlias,
         ICredentialsProv credsProv) {
-        IJiraIgnited jiraIntegration = jiraIgnProv.server(srvId);
+        IJiraIgnited jiraIntegration = jiraIgnProv.server(srvIdOrAlias);
 
-        IGitHubConnIgnited gitHubConnIgnited = gitHubConnIgnitedProvider.server(srvId);
+        IGitHubConnIgnited gitHubConnIgnited = gitHubConnIgnitedProvider.server(srvIdOrAlias);
         List<PullRequest> requests = gitHubConnIgnited.getPullRequests();
         if (requests == null)
             return null;
@@ -409,7 +408,7 @@
             return check;
         }).collect(Collectors.toList());
 
-        ITeamcityIgnited tcIgn = tcIgnitedProv.server(srvId, credsProv);
+        ITeamcityIgnited tcIgn = tcIgnitedProv.server(srvIdOrAlias, credsProv);
 
         paTickets.forEach(ticket -> {
             String branch = ticketMatcher.resolveTcBranchForPrLess(ticket,
@@ -419,7 +418,7 @@
             if (Strings.isNullOrEmpty(branch))
                 return; // nothing to do if branch was not resolved
 
-            String defBtForMaster = findDefaultBranchBuildType(tcIgn.serverId());
+            String defBtForMaster = findDefaultBuildType(srvIdOrAlias);
 
             if (tcIgn.getAllBuildsCompacted(defBtForMaster, branch).isEmpty())
                 return; //Skipping contributions without builds
@@ -534,7 +533,27 @@
 
         IGitHubConnIgnited ghConn = gitHubConnIgnitedProvider.server(srvId);
 
-        String defBtForMaster = findDefaultBranchBuildType(teamcity.serverId());
+        List<String> compositeBuildTypeIds = findApplicableBuildTypes(srvId, teamcity);
+
+        for (String btId : compositeBuildTypeIds) {
+            List<BuildRefCompacted> compBuilds = findBuildsForPr(btId, prId, ghConn, teamcity);
+
+            statuses.add(compBuilds.isEmpty()
+                ? new ContributionCheckStatus(btId, branchForTcDefault(prId, ghConn))
+                : contributionStatus(srvId, btId, compBuilds, teamcity, ghConn, prId));
+        }
+
+        return statuses;
+    }
+
+    /**
+     *
+     * @param srvIdOrAlias TC server ID or reference to it.
+     * @param teamcity Teamcity.
+     * @return list of build types which may be taken for
+     */
+    public List<String> findApplicableBuildTypes(String srvIdOrAlias, ITeamcityIgnited teamcity) {
+        String defBtForMaster = findDefaultBuildType(srvIdOrAlias);
 
         BuildTypeCompacted buildType = Strings.isNullOrEmpty(defBtForMaster)
             ? null
@@ -558,29 +577,26 @@
             if (!Strings.isNullOrEmpty(defBtForMaster))
                 compositeBuildTypeIds.add(defBtForMaster);
         }
-
-        for (String btId : compositeBuildTypeIds) {
-            List<BuildRefCompacted> compBuilds = findBuildsForPr(btId, prId, ghConn, teamcity);
-
-            statuses.add(compBuilds.isEmpty()
-                ? new ContributionCheckStatus(btId, branchForTcDefault(prId, ghConn))
-                : contributionStatus(srvId, btId, compBuilds, teamcity, ghConn, prId));
-        }
-
-        return statuses;
+        return compositeBuildTypeIds;
     }
 
-    @NotNull public String findDefaultBranchBuildType(String srvId) {
+    /**
+     * @param srvIdOrAlias Server id. May be weak reference to TC
+     * @return Some build type included into tracked branches with default branch.
+     */
+    @NotNull public String findDefaultBuildType(String srvIdOrAlias) {
         StringBuilder buildTypeId = new StringBuilder();
 
-        ITcServerConfig tcCfg = cfg.getTeamcityConfig(srvId);
+        ITcServerConfig tcCfg = cfg.getTeamcityConfig(srvIdOrAlias);
         String trBranch = tcCfg.defaultTrackedBranch();
 
+        String realTcId = Strings.isNullOrEmpty(tcCfg.reference()) ? srvIdOrAlias : tcCfg.reference();
+
         cfg.getTrackedBranches()
             .get(trBranch)
             .ifPresent(
                 b -> b.getChainsStream()
-                    .filter(c -> Objects.equals(srvId, c.serverId))
+                    .filter(c -> Objects.equals(realTcId, c.serverId))
                     .filter(c -> c.branchForRest.equals(ITeamcity.DEFAULT))
                     .findFirst()
                     .ifPresent(ch -> buildTypeId.append(ch.suiteId)));