use of jetbrains.buildServer.server.rest.errors.OperationException in project teamcity-rest by JetBrains.
the class Group method setGroupParents.
public static void setGroupParents(@NotNull final SUserGroup group, @NotNull final Set<SUserGroup> newParents, final boolean revertOnError, @NotNull final ServiceLocator serviceLocator) {
// workaround for TW-52253
serviceLocator.getSingletonService(PermissionChecker.class).getServerActionChecker().checkCanEditUserGroup(group);
Set<SUserGroup> currentParents = group.getParentGroups().stream().map(userGroup -> (SUserGroup) userGroup).collect(Collectors.toSet());
currentParents.stream().filter(userGroup -> !newParents.contains(userGroup)).forEach(userGroup -> userGroup.removeSubgroup(group));
try {
newParents.stream().filter(userGroup -> !currentParents.contains(userGroup)).forEach(userGroup -> userGroup.addSubgroup(group));
} catch (CycleDetectedException e) {
if (revertOnError)
setGroupParents(group, currentParents, false, serviceLocator);
throw new BadRequestException("Error encountered while trying to set new parent groups", e);
} catch (AccessDeniedException e) {
if (revertOnError)
setGroupParents(group, currentParents, false, serviceLocator);
throw e;
} catch (Exception e) {
if (revertOnError)
setGroupParents(group, currentParents, false, serviceLocator);
throw new OperationException("Error encountered while trying to set new parent groups", e);
}
}
use of jetbrains.buildServer.server.rest.errors.OperationException in project teamcity-rest by JetBrains.
the class FilesSubResource method getStreamingOutput.
private static StreamingOutput getStreamingOutput(@NotNull final Element element, @Nullable final Long startOffset, @Nullable final Long length) {
return new StreamingOutput() {
@Override
public void write(final OutputStream output) throws WebApplicationException {
InputStream inputStream = null;
Stopwatch action = Stopwatch.createStarted();
try {
inputStream = element.getInputStream();
if (startOffset != null || length != null) {
TCStreamUtil.skip(inputStream, startOffset != null ? startOffset : 0);
TCStreamUtil.writeBinary(inputStream, length != null ? length : element.getSize(), output);
} else {
TCStreamUtil.writeBinary(inputStream, output);
}
} catch (IOException e) {
// todo add better processing
throw new OperationException("Error while processing file '" + element.getFullName() + "': " + e.toString(), e);
} finally {
FileUtil.close(inputStream);
if (LOG.isDebugEnabled()) {
LOG.debug("Finished processing download of file \"" + element.getFullName() + "\" (" + StringUtil.formatFileSize(element.getSize()) + ")" + " in " + TimePrinter.createMillisecondsFormatter().formatTime(action.elapsed(TimeUnit.MILLISECONDS)) + " for a REST request");
}
}
}
};
}
use of jetbrains.buildServer.server.rest.errors.OperationException in project teamcity-rest by JetBrains.
the class Build method getBuildToTrigger.
private BuildPromotion getBuildToTrigger(@Nullable final SUser user, @NotNull final ServiceLocator serviceLocator, @NotNull final Map<Long, Long> buildPromotionIdReplacements) {
SVcsModification changeToUse = null;
SVcsModification personalChangeToUse = null;
if (submittedLastChanges != null) {
List<SVcsModification> lastChanges = submittedLastChanges.getChangesFromPosted(serviceLocator.getSingletonService(ChangeFinder.class));
if (lastChanges.size() > 0) {
boolean changeProcessed = false;
boolean personalChangeProcessed = false;
for (SVcsModification change : lastChanges) {
if (!change.isPersonal()) {
if (!changeProcessed) {
changeToUse = change;
changeProcessed = true;
} else {
throw new BadRequestException("Several non-personal changes are submitted, only one can be present");
}
} else {
if (!personalChangeProcessed) {
personalChangeToUse = change;
personalChangeProcessed = true;
} else {
throw new BadRequestException("Several personal changes are submitted, only one can be present");
}
}
}
}
}
final SBuildType submittedBuildType = getSubmittedBuildType(serviceLocator, personalChangeToUse, user);
final BuildCustomizer customizer = serviceLocator.getSingletonService(BuildCustomizerFactory.class).createBuildCustomizer(submittedBuildType, user);
if (changeToUse != null) {
// might need to rework after comparison to code in jetbrains.buildServer.controllers.RunBuildBean.setupBuildCustomizer: customizer.setNodeRevisions, etc.
customizer.setChangesUpTo(changeToUse);
}
if (submittedComment != null) {
if (submittedComment.text != null) {
customizer.setBuildComment(submittedComment.text);
} else {
throw new BadRequestException("Submitted comment does not have 'text' set.");
}
}
if (submittedProperties != null) {
customizer.setParameters(submittedProperties.getMap());
}
// this should ideally be used only when defaultBranc flag is not set. If set to false, should use customizer.setDesiredBranchName(submittedBranchName, false)
if (submittedBranchName != null)
customizer.setDesiredBranchName(submittedBranchName);
if (submittedPersonal != null)
customizer.setPersonal(submittedPersonal);
if (submittedBuildDependencies != null) {
try {
customizer.setSnapshotDependencyNodes(submittedBuildDependencies.getFromPosted(serviceLocator, buildPromotionIdReplacements));
} catch (IllegalArgumentException e) {
throw new BadRequestException("Error trying to use specified snapshot dependencies" + getRelatedBuildDescription() + ":" + e.getMessage());
} catch (NotFoundException e) {
throw new BadRequestException("Error searching for snapshot dependency" + getRelatedBuildDescription() + ": " + e.getMessage(), e);
}
}
if (submittedTriggeringOptions != null) {
if (submittedTriggeringOptions.cleanSources != null) {
customizer.setCleanSources(submittedTriggeringOptions.cleanSources);
}
if (submittedTriggeringOptions.cleanSourcesInAllDependencies != null) {
((BuildCustomizerEx) customizer).setApplyCleanSourcesToDependencies(submittedTriggeringOptions.cleanSourcesInAllDependencies);
}
if (submittedTriggeringOptions.freezeSettings != null) {
((BuildCustomizerEx) customizer).setFreezeSettings(submittedTriggeringOptions.freezeSettings);
}
if (submittedTriggeringOptions.tagDependencies != null) {
((BuildCustomizerEx) customizer).setApplyTagsToDependencies(submittedTriggeringOptions.tagDependencies);
}
if (submittedTriggeringOptions.rebuildAllDependencies != null) {
customizer.setRebuildDependencies(submittedTriggeringOptions.rebuildAllDependencies);
}
if (submittedTriggeringOptions.rebuildFailedOrIncompleteDependencies != null && submittedTriggeringOptions.rebuildFailedOrIncompleteDependencies) {
((BuildCustomizerEx) customizer).setRebuildDependencies(BuildCustomizerEx.RebuildDependenciesMode.FAILED_OR_INCOMPLETE);
}
if (submittedTriggeringOptions.rebuildDependencies != null) {
customizer.setRebuildDependencies(CollectionsUtil.convertCollection(submittedTriggeringOptions.rebuildDependencies.getFromPosted(serviceLocator.getSingletonService(BuildTypeFinder.class)), new Converter<String, BuildTypeOrTemplate>() {
public String createFrom(@NotNull final BuildTypeOrTemplate source) {
if (source.getBuildType() == null) {
// noinspection ConstantConditions
throw new BadRequestException("Template is specified instead of a build type. Template id: '" + source.getTemplate().getExternalId() + "'");
}
return source.getBuildType().getInternalId();
}
}));
}
}
List<BuildPromotion> artifactDepsBuildsPosted = null;
try {
artifactDepsBuildsPosted = submittedBuildArtifactDependencies == null ? null : submittedBuildArtifactDependencies.getFromPosted(serviceLocator, buildPromotionIdReplacements);
} catch (NotFoundException e) {
throw new BadRequestException("Error searching for artifact dependency" + getRelatedBuildDescription() + ": " + e.getMessage(), e);
}
if (submittedCustomBuildArtifactDependencies != null) {
// todo: investigate if OK: here new dependencies are created and set into the build. Custom run build dialog onthe contrary, sets artifact deps with the same IDs into the build
final List<SArtifactDependency> customDeps = submittedCustomBuildArtifactDependencies.getFromPosted(submittedBuildType.getArtifactDependencies(), serviceLocator);
if (artifactDepsBuildsPosted == null) {
setDepsWithNullCheck(customizer, customDeps);
} else {
// patch with "artifact-dependencies"
setDepsWithNullCheck(customizer, getBuildPatchedDeps(customDeps, true, serviceLocator, artifactDepsBuildsPosted));
}
} else {
if (artifactDepsBuildsPosted != null) {
// use "artifact-dependencies" as the only dependencies as this allows to repeat a build
setDepsWithNullCheck(customizer, getBuildPatchedDeps(submittedBuildType.getArtifactDependencies(), false, serviceLocator, artifactDepsBuildsPosted));
} else {
// no artifact dependencies customizations necessary
}
}
if (submittedTags != null) {
customizer.setTagDatas(new HashSet<TagData>(submittedTags.getFromPosted(serviceLocator.getSingletonService(UserFinder.class))));
}
if (submittedAttributes != null) {
customizer.setAttributes(submittedAttributes.getMap());
}
final BuildPromotion result;
try {
result = customizer.createPromotion();
} catch (IllegalStateException e) {
// IllegalStateException is thrown e.g. when we try to create a personal build in a build type which does not allow this
throw new BadRequestException("Cannot trigger build: " + e.getMessage());
} catch (RevisionsNotFoundException e) {
throw new BadRequestException("Cannot trigger build, if the changes are specified, they should be visible on the build configuration Change Log under the requested branch. Original error: " + e.getMessage());
}
BuildTypeEx modifiedBuildType = getCustomizedSubmittedBuildType(serviceLocator);
if (modifiedBuildType != null) {
// it's core's responsibility to check permissions here
try {
((BuildPromotionEx) result).freezeSettings(modifiedBuildType, "rest");
} catch (IOException e) {
// include nested erorr or it can expose too much data?
throw new OperationException("Error while freezing promotion settings", e);
}
}
return result;
}
use of jetbrains.buildServer.server.rest.errors.OperationException in project teamcity-rest by JetBrains.
the class PropEntityAgentRequirement method addToMain.
@NotNull
public Requirement addToMain(@NotNull final BuildTypeSettingsEx buildType, @NotNull final ServiceLocator serviceLocator) {
final Map<String, String> propertiesMap = properties == null ? Collections.emptyMap() : properties.getMap();
String propertyName = propertiesMap.get(NAME_PROPERTY_NAME);
if (StringUtil.isEmpty(propertyName)) {
throw new BadRequestException("No name is specified. Make sure '" + NAME_PROPERTY_NAME + "' property is present and has not empty value");
}
Requirement similar = getInheritedOrSameIdSimilar(buildType, serviceLocator);
if (inherited != null && inherited && similar != null) {
return similar;
}
if (similar != null && id != null && id.equals(similar.getId())) {
// todo
return similar;
}
@NotNull final RequirementFactory factory = serviceLocator.getSingletonService(RequirementFactory.class);
String forcedId = null;
// special case for "overriden" entities
if (id != null) {
for (Requirement item : buildType.getRequirements()) {
if (id.equals(item.getId())) {
forcedId = id;
break;
}
}
}
Requirement requirementToAdd;
if (forcedId != null) {
requirementToAdd = factory.createRequirement(forcedId, propertyName, propertiesMap.get(NAME_PROPERTY_VALUE), getSubmittedType());
} else {
requirementToAdd = factory.createRequirement(propertyName, propertiesMap.get(NAME_PROPERTY_VALUE), getSubmittedType());
}
String requirementId = requirementToAdd.getId();
if (requirementId == null && disabled != null) {
// throw exception before adding requirement to the model
throw new OperationException("Cannot set disabled state for an entity without id");
}
buildType.addRequirement(requirementToAdd);
if (disabled != null) {
buildType.setEnabled(requirementId, !disabled);
}
return requirementToAdd;
}
use of jetbrains.buildServer.server.rest.errors.OperationException in project teamcity-rest by JetBrains.
the class Build method getArtifactDependencyChanges.
@NotNull
private static List<BuildChangeData> getArtifactDependencyChanges(@NotNull final BuildPromotion build, @NotNull final ServiceLocator serviceLocator) {
// see also jetbrains.buildServer.server.rest.data.ChangeFinder.getBuildChanges
ArtifactDependencyChangesProvider changesProvider = new ArtifactDependencyChangesProvider(build, ChangeFinder.getBuildChangesPolicy(), serviceLocator.getSingletonService(BuildsManager.class), serviceLocator.getSingletonService(DownloadedArtifactsLoggerImpl.class));
List<ChangeDescriptor> detectedChanges = changesProvider.getDetectedChanges();
if (detectedChanges.isEmpty()) {
return Collections.emptyList();
}
if (detectedChanges.size() > 1) {
throw new OperationException("Unexpected state: more than one (" + detectedChanges.size() + ") artifact changes found");
}
ChangeDescriptor changeDescriptor = detectedChanges.get(0);
if (!ChangeDescriptorConstants.ARTIFACT_DEPENDENCY_CHANGE.equals(changeDescriptor.getType())) {
throw new OperationException("Unexpected state: unknown type of artifact dependency change: '" + changeDescriptor.getType() + "'");
}
try {
Object o = changeDescriptor.getAssociatedData().get(ArtifactDependencyChangesProvider.CHANGED_DEPENDENCIES_ATTR);
// Actually result is List<ArtifactDependencyChangesProvider.ArtifactsChangeDescriptor>
if (o == null) {
return Collections.emptyList();
} else {
// noinspection unchecked
return ((List<ChangeDescriptor>) o).stream().map(descr -> {
Map<String, Object> associatedData = descr.getAssociatedData();
SBuild prevBuild = (SBuild) associatedData.get(ArtifactDependencyChangesProvider.OLD_BUILD_ATTR);
SBuild nextBuild = (SBuild) associatedData.get(ArtifactDependencyChangesProvider.NEW_BUILD_ATTR);
if (prevBuild == null && nextBuild == null)
return null;
return new BuildChangeData(Util.resolveNull(prevBuild, (b) -> b.getBuildPromotion()), Util.resolveNull(nextBuild, (b) -> b.getBuildPromotion()));
}).filter(Objects::nonNull).collect(Collectors.toList());
}
} catch (Exception e) {
throw new OperationException("Unexpected state while getting artifact dependency details: " + e.toString(), e);
}
}
Aggregations