/* * Copyright 2017 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.server.service.materials; import com.thoughtworks.go.config.commands.EntityConfigUpdateCommand; import com.thoughtworks.go.config.update.CreateSCMConfigCommand; import com.thoughtworks.go.config.update.UpdateSCMConfigCommand; import com.thoughtworks.go.domain.config.ConfigurationProperty; import com.thoughtworks.go.domain.scm.SCM; import com.thoughtworks.go.i18n.LocalizedMessage; import com.thoughtworks.go.i18n.Localizer; import com.thoughtworks.go.plugin.access.scm.*; import com.thoughtworks.go.plugin.api.config.Property; import com.thoughtworks.go.plugin.api.response.Result; import com.thoughtworks.go.plugin.api.response.validation.ValidationError; import com.thoughtworks.go.plugin.api.response.validation.ValidationResult; 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.result.LocalizedOperationResult; import com.thoughtworks.go.util.StringUtil; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; @Service public class PluggableScmService { private SCMExtension scmExtension; private Localizer localizer; private GoConfigService goConfigService; private org.slf4j.Logger LOGGER = LoggerFactory.getLogger(PluggableScmService.class); private EntityHashingService entityHashingService; @Autowired public PluggableScmService(SCMExtension scmExtension, Localizer localizer, GoConfigService goConfigService, EntityHashingService entityHashingService) { this.scmExtension = scmExtension; this.localizer = localizer; this.goConfigService = goConfigService; this.entityHashingService = entityHashingService; } public void validate(final SCM scmConfig) { final String pluginId = scmConfig.getPluginConfiguration().getId(); final SCMPropertyConfiguration configuration = getScmPropertyConfiguration(scmConfig); ValidationResult validationResult = scmExtension.isSCMConfigurationValid(pluginId, configuration); if (SCMMetadataStore.getInstance().hasPreferenceFor(pluginId)) { SCMConfigurations configurationMetadata = SCMMetadataStore.getInstance().getConfigurationMetadata(pluginId); for (SCMConfiguration scmConfiguration : configurationMetadata.list()) { String key = scmConfiguration.getKey(); boolean isRequired = SCMMetadataStore.getInstance().hasOption(pluginId, key, Property.REQUIRED); ConfigurationProperty property = scmConfig.getConfiguration().getProperty(key); String configValue = property == null ? null : property.getValue(); if (isRequired && StringUtil.isBlank(configValue)) { validationResult.addError(new ValidationError(key, localizer.localize("MANDATORY_CONFIGURATION_FIELD"))); } } } for (ValidationError validationError : validationResult.getErrors()) { ConfigurationProperty property = scmConfig.getConfiguration().getProperty(validationError.getKey()); if (property != null) { property.addError(validationError.getKey(), validationError.getMessage()); } } } public boolean isValid(final SCM scmConfig) { if (!scmConfig.doesPluginExist()) { throw new RuntimeException(String.format("Plugin with id '%s' is not found.", scmConfig.getPluginConfiguration().getId())); } ValidationResult validationResult = scmExtension.isSCMConfigurationValid(scmConfig.getPluginConfiguration().getId(), getScmPropertyConfiguration(scmConfig)); addErrorsToConfiguration(validationResult, scmConfig); return validationResult.isSuccessful(); } private void addErrorsToConfiguration(ValidationResult validationResult, SCM scmConfig) { for (ValidationError validationError : validationResult.getErrors()) { ConfigurationProperty property = scmConfig.getConfiguration().getProperty(validationError.getKey()); if (property != null) { property.addError(validationError.getKey(), validationError.getMessage()); } else { scmConfig.addError(validationError.getKey(), validationError.getMessage()); } } } public ArrayList<SCM> listAllScms() { return goConfigService.getSCMs(); } public SCM findPluggableScmMaterial(String materialName) { ArrayList<SCM> scms = listAllScms(); for(SCM scm : scms){ if(materialName.equals(scm.getName())) { return scm; } } return null; } public Result checkConnection(final SCM scmConfig) { final String pluginId = scmConfig.getPluginConfiguration().getId(); final SCMPropertyConfiguration configuration = getScmPropertyConfiguration(scmConfig); return scmExtension.checkConnectionToSCM(pluginId, configuration); } public void createPluggableScmMaterial(final Username currentUser, final SCM globalScmConfig, final LocalizedOperationResult result) { CreateSCMConfigCommand command = new CreateSCMConfigCommand(globalScmConfig, this, result, currentUser, goConfigService); update(currentUser, result, command); } public void updatePluggableScmMaterial(final Username currentUser, final SCM globalScmConfig, final LocalizedOperationResult result, String md5) { UpdateSCMConfigCommand command = new UpdateSCMConfigCommand(globalScmConfig, this, goConfigService, currentUser, result, md5, entityHashingService); update(currentUser, result, command); } private void update(Username currentUser, LocalizedOperationResult result, EntityConfigUpdateCommand command) { try { goConfigService.updateConfig(command, currentUser); } catch (Exception e) { if (!result.hasMessage()) { result.internalServerError(LocalizedMessage.string("SAVE_FAILED_WITH_REASON", "An error occurred while saving the template config. Please check the logs for more information.")); LOGGER.error(e.getMessage(), e); } } } private SCMPropertyConfiguration getScmPropertyConfiguration(SCM scmConfig) { final SCMPropertyConfiguration configuration = new SCMPropertyConfiguration(); for (ConfigurationProperty configurationProperty : scmConfig.getConfiguration()) { configuration.add(new SCMProperty(configurationProperty.getConfigurationKey().getName(), configurationProperty.getValue())); } return configuration; } }