package com.epam.cisen.teamcity;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import com.epam.cisen.core.api.dto.CIInitializer;
import com.epam.cisen.core.api.dto.CiReport;
import com.epam.cisen.teamcity.connectors.TeamCityConnection;
import com.epam.cisen.core.connector.BaseXMLParser;
public class TeamCityWorker {
private static final String LAST_BUILD_XPATH = "/builds/build[1]";
private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
public CiReport checkStatus(TeamCityConfig config) throws Exception {
TeamCityConnection connection = new TeamCityConnection(config);
String allBuildsXML = connection.readAllBuilds(config.getBuildTypeId());
BaseXMLParser allBuildsParser = new BaseXMLParser(allBuildsXML);
String lastBuildId = allBuildsParser.getAttribute(LAST_BUILD_XPATH, "id");
String lastBuildXML = connection.readBuildInfo(lastBuildId);
BaseXMLParser lastBuildParser = new BaseXMLParser(lastBuildXML);
return toReport(lastBuildParser);
}
private CiReport toReport(BaseXMLParser build) throws Exception {
CiReport report = new CiReport();
report.setSystemId(build.getAttribute("/build", "buildTypeId"));
report.setBuildId(build.getAttribute("/build", "id"));
report.setBuildNumber(build.getAttribute("/build", "number"));
report.setStatus(toStatus(build.getAttribute("/build", "status")));
report.setUrl(build.getAttribute("/build", "webUrl"));
report.setTextStatus(build.get("/build/statusText"));
report.setStartTime(toDate(build.get("/build/startDate")).getTime());
long duration = toDate(build.get("/build/finishDate")).getTime() - report.getStartTime();
report.setDuration(duration);
if ("user".equals(build.getAttribute("/build/triggered", "type"))) {
CIInitializer runner = new CIInitializer();
runner.setAction(CIInitializer.Action.RUN);
runner.setUserId(build.getAttribute("/build/triggered/user", "username"));
report.addInitializer(runner);
}
List<String> changes = build.getAttributeList("/build/lastChanges//change", "username");
for (String change : changes) {
CIInitializer changer = new CIInitializer();
changer.setAction(CIInitializer.Action.PUSH);
changer.setUserId(change);
report.addInitializer(changer);
}
return report;
}
private CiReport.Status toStatus(String teamcityStatus) {
if ("SUCCESS".equals(teamcityStatus)) {
return CiReport.Status.GREEN;
}
return CiReport.Status.RED;
}
private Date toDate(String teamcityDate) throws Exception {
return simpleDateFormat.parse(teamcityDate);
}
}