// 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.project; import com.google.common.base.Strings; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import com.google.gerrit.extensions.common.ActionInfo; import com.google.gerrit.extensions.common.InheritableBoolean; import com.google.gerrit.extensions.common.SubmitType; import com.google.gerrit.extensions.registration.DynamicMap; import com.google.gerrit.extensions.registration.DynamicMap.Entry; import com.google.gerrit.extensions.restapi.RestView; import com.google.gerrit.extensions.webui.UiAction; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.config.AllProjectsNameProvider; 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.git.TransferConfig; import com.google.inject.util.Providers; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.TreeMap; public class ConfigInfo { public String description; public InheritedBooleanInfo useContributorAgreements; public InheritedBooleanInfo useContentMerge; public InheritedBooleanInfo useSignedOffBy; public InheritedBooleanInfo requireChangeId; public MaxObjectSizeLimitInfo maxObjectSizeLimit; public SubmitType submitType; public com.google.gerrit.extensions.api.projects.ProjectState state; public Map<String, Map<String, ConfigParameterInfo>> pluginConfig; public Map<String, ActionInfo> actions; public Map<String, CommentLinkInfo> commentlinks; public ThemeInfo theme; public ConfigInfo(ProjectControl control, TransferConfig config, DynamicMap<ProjectConfigEntry> pluginConfigEntries, PluginConfigFactory cfgFactory, AllProjectsNameProvider allProjects, DynamicMap<RestView<ProjectResource>> views) { ProjectState projectState = control.getProjectState(); Project p = control.getProject(); this.description = Strings.emptyToNull(p.getDescription()); InheritedBooleanInfo useContributorAgreements = new InheritedBooleanInfo(); InheritedBooleanInfo useSignedOffBy = new InheritedBooleanInfo(); InheritedBooleanInfo useContentMerge = new InheritedBooleanInfo(); InheritedBooleanInfo requireChangeId = new InheritedBooleanInfo(); useContributorAgreements.value = projectState.isUseContributorAgreements(); useSignedOffBy.value = projectState.isUseSignedOffBy(); useContentMerge.value = projectState.isUseContentMerge(); requireChangeId.value = projectState.isRequireChangeID(); useContributorAgreements.configuredValue = p.getUseContributorAgreements(); useSignedOffBy.configuredValue = p.getUseSignedOffBy(); useContentMerge.configuredValue = p.getUseContentMerge(); requireChangeId.configuredValue = p.getRequireChangeID(); ProjectState parentState = Iterables.getFirst(projectState .parents(), null); if (parentState != null) { useContributorAgreements.inheritedValue = parentState.isUseContributorAgreements(); useSignedOffBy.inheritedValue = parentState.isUseSignedOffBy(); useContentMerge.inheritedValue = parentState.isUseContentMerge(); requireChangeId.inheritedValue = parentState.isRequireChangeID(); } this.useContributorAgreements = useContributorAgreements; this.useSignedOffBy = useSignedOffBy; this.useContentMerge = useContentMerge; this.requireChangeId = requireChangeId; MaxObjectSizeLimitInfo maxObjectSizeLimit = new MaxObjectSizeLimitInfo(); maxObjectSizeLimit.value = config.getEffectiveMaxObjectSizeLimit(projectState) == config .getMaxObjectSizeLimit() ? config .getFormattedMaxObjectSizeLimit() : p.getMaxObjectSizeLimit(); maxObjectSizeLimit.configuredValue = p.getMaxObjectSizeLimit(); maxObjectSizeLimit.inheritedValue = config.getFormattedMaxObjectSizeLimit(); this.maxObjectSizeLimit = maxObjectSizeLimit; this.submitType = p.getSubmitType(); this.state = p.getState() != com.google.gerrit.extensions.api.projects.ProjectState.ACTIVE ? p.getState() : null; this.commentlinks = Maps.newLinkedHashMap(); for (CommentLinkInfo cl : projectState.getCommentLinks()) { this.commentlinks.put(cl.name, cl); } pluginConfig = getPluginConfig(control.getProjectState(), pluginConfigEntries, cfgFactory, allProjects); actions = Maps.newTreeMap(); for (UiAction.Description d : UiActions.from( views, new ProjectResource(control), Providers.of(control.getCurrentUser()))) { actions.put(d.getId(), new ActionInfo(d)); } this.theme = projectState.getTheme(); } private Map<String, Map<String, ConfigParameterInfo>> getPluginConfig( ProjectState project, DynamicMap<ProjectConfigEntry> pluginConfigEntries, PluginConfigFactory cfgFactory, AllProjectsNameProvider allProjects) { TreeMap<String, Map<String, ConfigParameterInfo>> pluginConfig = new TreeMap<>(); for (Entry<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.get().equals(project.getProject().getNameKey())) { PluginConfig cfgWithInheritance = cfgFactory.getFromProjectConfigWithInheritance(project, e.getPluginName()); p.inheritable = true; p.value = cfgWithInheritance.getString(e.getExportName(), configEntry.getDefaultValue()); p.configuredValue = configuredValue; p.inheritedValue = getInheritedValue(project, cfgFactory, e); } else { if (configEntry.getType() == ProjectConfigEntry.Type.ARRAY) { p.values = Arrays.asList(cfg.getStringList(e.getExportName())); } else { p.value = 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 String getInheritedValue(ProjectState project, PluginConfigFactory cfgFactory, Entry<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; } public static class InheritedBooleanInfo { public Boolean value; public InheritableBoolean configuredValue; public Boolean inheritedValue; } public static class MaxObjectSizeLimitInfo { public String value; public String configuredValue; public String inheritedValue; } public static class ConfigParameterInfo { public String displayName; public String description; public String warning; public ProjectConfigEntry.Type type; public String value; public Boolean editable; public Boolean inheritable; public String configuredValue; public String inheritedValue; public List<String> permittedValues; public List<String> values; } }