@Override public int getValidationRunsCountForBuild(Build build) { return getNamedParameterJdbcTemplate().queryForObject( "SELECT COUNT(ID) FROM VALIDATION_RUNS WHERE BUILDID = :buildId", params("buildId", build.id()), Integer.class ); }
@Override public List<PromotionRun> getPromotionRunsForBuild(Build build) { return getNamedParameterJdbcTemplate().query( "SELECT * FROM PROMOTION_RUNS WHERE BUILDID = :buildId ORDER BY CREATION DESC", params("buildId", build.id()), (rs, rowNum) -> toPromotionRun(rs, (id) -> build, this::getPromotionLevel ) ); }
@Override public List<Build> getBuildsUsing(Build build) { return getNamedParameterJdbcTemplate().query( "SELECT F.* FROM BUILDS F " + "INNER JOIN BUILD_LINKS BL ON BL.BUILDID = F.ID " + "WHERE BL.TARGETBUILDID = :buildId " + "ORDER BY F.ID DESC ", params("buildId", build.id()), (rs, num) -> toBuild(rs, this::getBranch) ); }
@Override public Optional<PromotionRun> getLastPromotionRun(Build build, PromotionLevel promotionLevel) { return Optional.ofNullable( getFirstItem( "SELECT * FROM PROMOTION_RUNS " + "WHERE BUILDID = :buildId " + "AND PROMOTIONLEVELID = :promotionLevelId " + "ORDER BY CREATION DESC, ID DESC LIMIT 1", params("buildId", build.id()).addValue("promotionLevelId", promotionLevel.id()), (rs, rowNum) -> toPromotionRun(rs, (id) -> build, (id) -> promotionLevel ) ) ); }
@Override public List<ValidationRun> getValidationRunsForBuild(Build build, Function<String, ValidationRunStatusID> validationRunStatusService) { return getNamedParameterJdbcTemplate().query( "SELECT VR.*, VDR.DATA_TYPE_ID, VDR.DATA " + "FROM VALIDATION_RUNS VR " + "LEFT JOIN VALIDATION_RUN_DATA VDR ON VDR.VALIDATION_RUN = VR.ID " + "WHERE VR.BUILDID = :buildId " + "ORDER BY VR.ID", params("buildId", build.id()), (rs, rowNum) -> toValidationRun( rs, id -> build, this::getValidationStamp, validationRunStatusService ) ); }
@Override public Optional<PromotionRun> getEarliestPromotionRunAfterBuild(PromotionLevel promotionLevel, Build build) { return getOptional( "SELECT * FROM PROMOTION_RUNS WHERE PROMOTIONLEVELID = :promotionLevelId AND BUILDID >= :buildId ORDER BY CREATION ASC, ID ASC LIMIT 1", params("promotionLevelId", promotionLevel.id()) .addValue("buildId", build.id()), (rs, num) -> toPromotionRun( rs, this::getBuild, (x) -> promotionLevel ) ); }
@Override public Optional<Build> getPreviousBuild(Build build) { return getOptional( "SELECT * FROM BUILDS WHERE BRANCHID = :branch AND ID < :id ORDER BY ID DESC LIMIT 1", params("branch", build.getBranch().id()).addValue("id", build.id()), (rs, rowNum) -> toBuild(rs, this::getBranch) ); }
@Override public Optional<Build> getNextBuild(Build build) { return getOptional( "SELECT * FROM BUILDS WHERE BRANCHID = :branch AND ID > :id ORDER BY ID ASC LIMIT 1", params("branch", build.getBranch().id()).addValue("id", build.id()), (rs, rowNum) -> toBuild(rs, this::getBranch) ); }
@Override public List<PromotionRun> getPromotionRunsForBuildAndPromotionLevel(Build build, PromotionLevel promotionLevel) { return getNamedParameterJdbcTemplate().query( "SELECT * FROM PROMOTION_RUNS " + "WHERE BUILDID = :buildId " + "AND PROMOTIONLEVELID = :promotionLevelId " + "ORDER BY CREATION DESC, ID DESC", params("buildId", build.id()).addValue("promotionLevelId", promotionLevel.id()), (rs, rowNum) -> toPromotionRun(rs, (id) -> build, (id) -> promotionLevel ) ); }
@Override public List<ValidationRun> getValidationRunsForBuildAndValidationStamp(Build build, ValidationStamp validationStamp, Function<String, ValidationRunStatusID> validationRunStatusService) { return getNamedParameterJdbcTemplate().query( "SELECT VR.*, VDR.DATA_TYPE_ID, VDR.DATA " + "FROM VALIDATION_RUNS VR " + "LEFT JOIN VALIDATION_RUN_DATA VDR ON VDR.VALIDATION_RUN = VR.ID " + "WHERE VR.BUILDID = :buildId " + "AND VR.VALIDATIONSTAMPID = :validationStampId " + "ORDER BY VR.ID DESC ", params("buildId", build.id()).addValue("validationStampId", validationStamp.id()), (rs, rowNum) -> toValidationRun( rs, id -> build, id -> validationStamp, validationRunStatusService ) ); }
@Override @Transactional public SVNChangeLog changeLog(BuildDiffRequest request) { try (Transaction ignored = transactionService.start()) { // Gets the two builds Build buildFrom = structureService.getBuild(request.getFrom()); Build buildTo = structureService.getBuild(request.getTo()); // Ordering of builds if (buildFrom.id() > buildTo.id()) { Build t = buildFrom; buildFrom = buildTo; buildTo = t; } // Gets the two branches, for each build Branch branchFrom = buildFrom.getBranch(); Branch branchTo = buildTo.getBranch(); // Checks the branch is the same if (branchFrom.id() != branchTo.id()) { throw new SVNChangeLogDifferentBranchException(); } SVNRepository svnRepository = getSVNRepository(branchFrom); return new SVNChangeLog( UUID.randomUUID().toString(), branchFrom.getProject(), svnRepository, getSCMBuildView(svnRepository, buildFrom.getId()), getSCMBuildView(svnRepository, buildTo.getId()) ); } }
@Override public List<ValidationRun> getValidationRunsForBuild(Build build, int offset, int count, Function<String, ValidationRunStatusID> validationRunStatusService) { return getNamedParameterJdbcTemplate().query( "SELECT VR.*, VDR.DATA_TYPE_ID, VDR.DATA " + "FROM VALIDATION_RUNS VR " + "LEFT JOIN VALIDATION_RUN_DATA VDR ON VDR.VALIDATION_RUN = VR.ID " + "WHERE VR.BUILDID = :buildId " + "ORDER BY VR.ID DESC " + "LIMIT :limit OFFSET :offset", params("buildId", build.id()) .addValue("offset", offset) .addValue("limit", count), (rs, rowNum) -> toValidationRun( rs, id -> build, this::getValidationStamp, validationRunStatusService ) ); }
@Override public List<ValidationRun> getValidationRunsForBuildAndValidationStamp(Build build, ValidationStamp validationStamp, int offset, int count, Function<String, ValidationRunStatusID> validationRunStatusService) { return getNamedParameterJdbcTemplate().query( "SELECT VR.*, VDR.DATA_TYPE_ID, VDR.DATA " + "FROM VALIDATION_RUNS VR " + "LEFT JOIN VALIDATION_RUN_DATA VDR ON VDR.VALIDATION_RUN = VR.ID " + "WHERE VR.BUILDID = :buildId " + "AND VR.VALIDATIONSTAMPID = :validationStampId " + "ORDER BY VR.ID DESC " + "LIMIT :limit OFFSET :offset", params("buildId", build.id()).addValue("validationStampId", validationStamp.id()) .addValue("limit", count) .addValue("offset", offset), (rs, rowNum) -> toValidationRun( rs, id -> build, id -> validationStamp, validationRunStatusService ) ); }
@Override public Build saveBuild(Build build) { // Update try { getNamedParameterJdbcTemplate().update( "UPDATE BUILDS SET NAME = :name, DESCRIPTION = :description, CREATION = :creation, CREATOR = :creator WHERE ID = :id", params("name", build.getName()) .addValue("description", build.getDescription()) .addValue("creation", dateTimeForDB(build.getSignature().getTime())) .addValue("creator", build.getSignature().getUser().getName()) .addValue("id", build.id()) ); return build; } catch (DuplicateKeyException ex) { throw new BuildNameAlreadyDefinedException(build.getName()); } }
@Override public ValidationRun newValidationRun(ValidationRun validationRun, Function<String, ValidationRunStatusID> validationRunStatusService) { // Validation run itself (parent) int id = dbCreate( "INSERT INTO VALIDATION_RUNS(BUILDID, VALIDATIONSTAMPID) VALUES (:buildId, :validationStampId)", params("buildId", validationRun.getBuild().id()) .addValue("validationStampId", validationRun.getValidationStamp().id()) ); // Data if (validationRun.getData() != null) { getNamedParameterJdbcTemplate().update( "INSERT INTO VALIDATION_RUN_DATA(VALIDATION_RUN, DATA_TYPE_ID, DATA) VALUES (:validationRunId, :dataTypeId, CAST(:data AS JSONB))", params("validationRunId", id) .addValue("dataTypeId", validationRun.getData().getDescriptor().getId()) .addValue("data", writeJson(validationRun.getData().getData())) ); } // Statuses validationRun.getValidationRunStatuses() .forEach(validationRunStatus -> newValidationRunStatus(id, validationRunStatus)); // Reloads the run return getValidationRun(ID.of(id), validationRunStatusService); }
@Override public PromotionRun newPromotionRun(PromotionRun promotionRun) { return promotionRun.withId( id( dbCreate( "INSERT INTO PROMOTION_RUNS(BUILDID, PROMOTIONLEVELID, CREATION, CREATOR, DESCRIPTION) VALUES (:buildId, :promotionLevelId, :creation, :creator, :description)", params("buildId", promotionRun.getBuild().id()) .addValue("promotionLevelId", promotionRun.getPromotionLevel().id()) .addValue("description", promotionRun.getDescription()) .addValue("creation", dateTimeForDB(promotionRun.getSignature().getTime())) .addValue("creator", promotionRun.getSignature().getUser().getName()) ) ) ); }
@Override public List<Link> links(SVNChangeLog changeLog, ResourceContext resourceContext) { return resourceContext.links() .link("_revisions", on(SVNController.class).changeLogRevisions(changeLog.getUuid())) .link("_issues", on(SVNController.class).changeLogIssues(changeLog.getUuid()), changeLog.getRepository().getConfiguredIssueService() != null) .link("_files", on(SVNController.class).changeLogFiles(changeLog.getUuid())) .link("_changeLogFileFilters", on(SCMController.class).getChangeLogFileFilters(changeLog.getProject().getId())) .link("_diff", on(SVNController.class).diff(null)) .link("_exportFormats", on(SVNController.class).changeLogExportFormats(changeLog.getBranch().getId())) .link("_exportIssues", on(SVNController.class).changeLog(new IssueChangeLogExportRequest())) .page( "_page", "extension/svn/changelog?from=%d&to=%d", changeLog.getFrom().getBuild().id(), changeLog.getTo().getBuild().id() ) .build(); }