/* * Copyright 2016 ThoughtWorks, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.thoughtworks.go.config.update; import com.thoughtworks.go.config.CruiseConfig; import com.thoughtworks.go.domain.packagerepository.PackageDefinition; import com.thoughtworks.go.domain.packagerepository.PackageRepositories; import com.thoughtworks.go.domain.packagerepository.PackageRepository; import com.thoughtworks.go.i18n.LocalizedMessage; import com.thoughtworks.go.server.domain.Username; import com.thoughtworks.go.server.service.EntityHashingService; import com.thoughtworks.go.server.service.GoConfigService; import com.thoughtworks.go.server.service.materials.PackageDefinitionService; import com.thoughtworks.go.server.service.result.HttpLocalizedOperationResult; public class UpdatePackageConfigCommand extends PackageConfigCommand { private final GoConfigService goConfigService; private final String oldPackageId; private final PackageDefinition newPackage; private String md5; private EntityHashingService entityHashingService; private final HttpLocalizedOperationResult result; public UpdatePackageConfigCommand(GoConfigService goConfigService, String oldPackageId, PackageDefinition newPackage, Username username, String md5, EntityHashingService entityHashingService, HttpLocalizedOperationResult result, PackageDefinitionService packageDefinitionService) { super(newPackage, result, packageDefinitionService, goConfigService, username); this.goConfigService = goConfigService; this.oldPackageId = oldPackageId; this.newPackage = newPackage; this.md5 = md5; this.entityHashingService = entityHashingService; this.result = result; } @Override public void update(CruiseConfig modifiedConfig) throws Exception { PackageRepositories packageRepositories = modifiedConfig.getPackageRepositories(); PackageRepository repository = packageRepositories.findPackageRepositoryHaving(oldPackageId); int index = packageRepositories.indexOf(repository); newPackage.setRepository(repository); repository.removePackage(oldPackageId); repository.addPackage(this.newPackage); packageRepositories.replace(index, repository); modifiedConfig.setPackageRepositories(packageRepositories); } @Override public boolean isValid(CruiseConfig preprocessedConfig) { return isValid(preprocessedConfig, newPackage.getRepository().getId()); } @Override public boolean canContinue(CruiseConfig cruiseConfig) { return isAuthorized() && isRepositoryPresent(cruiseConfig) && isIdSame() && isRequestFresh(); } private boolean isRepositoryPresent(CruiseConfig cruiseConfig) { String repoId = newPackage.getRepository().getRepoId(); if (cruiseConfig.getPackageRepositories().find(repoId) == null) { result.unprocessableEntity(LocalizedMessage.string("PACKAGE_REPOSITORY_NOT_FOUND", repoId)); return false; } return true; } private boolean isIdSame() { boolean isPackageIdSame = newPackage.getId().equals(oldPackageId); if (!isPackageIdSame) { result.unprocessableEntity(LocalizedMessage.string("PACKAGE_REPOSITORY_ID_CHANGED", "package")); } return isPackageIdSame; } private boolean isRequestFresh() { PackageDefinition oldPackage = goConfigService.getConfigForEditing().getPackageRepositories().findPackageDefinitionWith(oldPackageId); boolean freshRequest = entityHashingService.md5ForEntity(oldPackage).equals(md5); if (!freshRequest) { result.stale(LocalizedMessage.string("STALE_RESOURCE_CONFIG", "package", oldPackage.getId())); } return freshRequest; } }