| // Copyright (C) 2013 The Android Open Source Project |
| // |
| // 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.google.gerrit.server.restapi.project; |
| |
| import com.google.common.base.MoreObjects; |
| import com.google.common.base.Strings; |
| import com.google.common.collect.Iterables; |
| import com.google.gerrit.entities.BooleanProjectConfig; |
| import com.google.gerrit.entities.Project; |
| import com.google.gerrit.extensions.api.projects.CommentLinkInfo; |
| import com.google.gerrit.extensions.api.projects.ConfigInfo; |
| import com.google.gerrit.extensions.api.projects.ConfigInfo.ConfigParameterInfo; |
| import com.google.gerrit.extensions.api.projects.ConfigInfo.InheritedBooleanInfo; |
| import com.google.gerrit.extensions.api.projects.ConfigInfo.MaxObjectSizeLimitInfo; |
| import com.google.gerrit.extensions.api.projects.ConfigInfo.SubmitTypeInfo; |
| import com.google.gerrit.extensions.api.projects.ProjectConfigEntryType; |
| import com.google.gerrit.extensions.common.ActionInfo; |
| import com.google.gerrit.extensions.registration.DynamicMap; |
| import com.google.gerrit.extensions.registration.Extension; |
| import com.google.gerrit.extensions.restapi.RestView; |
| import com.google.gerrit.extensions.webui.UiAction; |
| import com.google.gerrit.server.CurrentUser; |
| import com.google.gerrit.server.config.AllProjectsName; |
| import com.google.gerrit.server.config.PluginConfig; |
| import com.google.gerrit.server.config.PluginConfigFactory; |
| import com.google.gerrit.server.config.ProjectConfigEntry; |
| import com.google.gerrit.server.extensions.webui.UiActions; |
| import com.google.gerrit.server.project.BooleanProjectConfigTransformations; |
| import com.google.gerrit.server.project.ProjectResource; |
| import com.google.gerrit.server.project.ProjectState; |
| import com.google.gerrit.server.project.ProjectState.EffectiveMaxObjectSizeLimit; |
| import java.util.Arrays; |
| import java.util.LinkedHashMap; |
| import java.util.Map; |
| import java.util.TreeMap; |
| |
| public class ConfigInfoCreator { |
| /** do not instantiate this class. */ |
| private ConfigInfoCreator() {} |
| |
| @SuppressWarnings("deprecation") |
| public static ConfigInfo constructInfo( |
| boolean serverEnableSignedPush, |
| ProjectState projectState, |
| CurrentUser user, |
| DynamicMap<ProjectConfigEntry> pluginConfigEntries, |
| PluginConfigFactory cfgFactory, |
| AllProjectsName allProjects, |
| UiActions uiActions, |
| DynamicMap<RestView<ProjectResource>> views) { |
| ConfigInfo configInfo = new ConfigInfo(); |
| Project p = projectState.getProject(); |
| configInfo.description = Strings.emptyToNull(p.getDescription()); |
| |
| ProjectState parentState = Iterables.getFirst(projectState.parents(), null); |
| for (BooleanProjectConfig cfg : BooleanProjectConfig.values()) { |
| InheritedBooleanInfo info = new InheritedBooleanInfo(); |
| info.configuredValue = p.getBooleanConfig(cfg); |
| if (parentState != null) { |
| info.inheritedValue = parentState.is(cfg); |
| } |
| BooleanProjectConfigTransformations.set(cfg, configInfo, info); |
| } |
| |
| if (!serverEnableSignedPush) { |
| configInfo.enableSignedPush = null; |
| configInfo.requireSignedPush = null; |
| } |
| |
| configInfo.maxObjectSizeLimit = getMaxObjectSizeLimit(projectState, p); |
| |
| configInfo.defaultSubmitType = new SubmitTypeInfo(); |
| configInfo.defaultSubmitType.value = projectState.getSubmitType(); |
| configInfo.defaultSubmitType.configuredValue = |
| MoreObjects.firstNonNull( |
| projectState.getConfig().getProject().getSubmitType(), Project.DEFAULT_SUBMIT_TYPE); |
| ProjectState parent = |
| projectState.isAllProjects() ? projectState : projectState.parents().get(0); |
| configInfo.defaultSubmitType.inheritedValue = parent.getSubmitType(); |
| |
| configInfo.submitType = configInfo.defaultSubmitType.value; |
| |
| configInfo.state = |
| p.getState() != com.google.gerrit.extensions.client.ProjectState.ACTIVE |
| ? p.getState() |
| : null; |
| |
| configInfo.commentlinks = new LinkedHashMap<>(); |
| for (CommentLinkInfo cl : projectState.getCommentLinks()) { |
| configInfo.commentlinks.put(cl.name, cl); |
| } |
| |
| configInfo.pluginConfig = |
| getPluginConfig(projectState, pluginConfigEntries, cfgFactory, allProjects); |
| |
| configInfo.actions = new TreeMap<>(); |
| for (UiAction.Description d : uiActions.from(views, new ProjectResource(projectState, user))) { |
| configInfo.actions.put(d.getId(), new ActionInfo(d)); |
| } |
| |
| configInfo.extensionPanelNames = projectState.getConfig().getExtensionPanelSections(); |
| return configInfo; |
| } |
| |
| private static MaxObjectSizeLimitInfo getMaxObjectSizeLimit( |
| ProjectState projectState, Project p) { |
| MaxObjectSizeLimitInfo info = new MaxObjectSizeLimitInfo(); |
| EffectiveMaxObjectSizeLimit limit = projectState.getEffectiveMaxObjectSizeLimit(); |
| long value = limit.value; |
| info.value = value == 0 ? null : String.valueOf(value); |
| info.configuredValue = p.getMaxObjectSizeLimit(); |
| info.summary = limit.summary; |
| return info; |
| } |
| |
| private static Map<String, Map<String, ConfigParameterInfo>> getPluginConfig( |
| ProjectState project, |
| DynamicMap<ProjectConfigEntry> pluginConfigEntries, |
| PluginConfigFactory cfgFactory, |
| AllProjectsName allProjects) { |
| TreeMap<String, Map<String, ConfigParameterInfo>> pluginConfig = new TreeMap<>(); |
| for (Extension<ProjectConfigEntry> e : pluginConfigEntries) { |
| ProjectConfigEntry configEntry = e.getProvider().get(); |
| PluginConfig cfg = cfgFactory.getFromProjectConfig(project, e.getPluginName()); |
| String configuredValue = cfg.getString(e.getExportName()); |
| ConfigParameterInfo p = new ConfigParameterInfo(); |
| p.displayName = configEntry.getDisplayName(); |
| p.description = configEntry.getDescription(); |
| p.warning = configEntry.getWarning(project); |
| p.type = configEntry.getType(); |
| p.permittedValues = configEntry.getPermittedValues(); |
| p.editable = configEntry.isEditable(project) ? true : null; |
| if (configEntry.isInheritable() && !allProjects.equals(project.getNameKey())) { |
| PluginConfig cfgWithInheritance = |
| cfgFactory.getFromProjectConfigWithInheritance(project, e.getPluginName()); |
| p.inheritable = true; |
| p.value = |
| configEntry.onRead( |
| project, |
| cfgWithInheritance.getString(e.getExportName(), configEntry.getDefaultValue())); |
| p.configuredValue = configuredValue; |
| p.inheritedValue = getInheritedValue(project, cfgFactory, e); |
| } else { |
| if (configEntry.getType() == ProjectConfigEntryType.ARRAY) { |
| p.values = |
| configEntry.onRead(project, Arrays.asList(cfg.getStringList(e.getExportName()))); |
| } else { |
| p.value = |
| configEntry.onRead( |
| project, |
| configuredValue != null ? configuredValue : configEntry.getDefaultValue()); |
| } |
| } |
| Map<String, ConfigParameterInfo> pc = pluginConfig.get(e.getPluginName()); |
| if (pc == null) { |
| pc = new TreeMap<>(); |
| pluginConfig.put(e.getPluginName(), pc); |
| } |
| pc.put(e.getExportName(), p); |
| } |
| return !pluginConfig.isEmpty() ? pluginConfig : null; |
| } |
| |
| private static String getInheritedValue( |
| ProjectState project, PluginConfigFactory cfgFactory, Extension<ProjectConfigEntry> e) { |
| ProjectConfigEntry configEntry = e.getProvider().get(); |
| ProjectState parent = Iterables.getFirst(project.parents(), null); |
| String inheritedValue = configEntry.getDefaultValue(); |
| if (parent != null) { |
| PluginConfig parentCfgWithInheritance = |
| cfgFactory.getFromProjectConfigWithInheritance(parent, e.getPluginName()); |
| inheritedValue = |
| parentCfgWithInheritance.getString(e.getExportName(), configEntry.getDefaultValue()); |
| } |
| return inheritedValue; |
| } |
| } |