blob: 912abc4d86f9cc92363336db5f3d661f0ac5a372 [file] [log] [blame]
// Copyright (C) 2023 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.config;
import static com.google.common.collect.ImmutableList.toImmutableList;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.entities.converter.ProtoConverter;
import com.google.gerrit.extensions.client.DiffPreferencesInfo;
import com.google.gerrit.extensions.client.EditPreferencesInfo;
import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
import com.google.gerrit.extensions.client.MenuItem;
import com.google.gerrit.proto.Entities.UserPreferences;
import com.google.protobuf.Message;
import com.google.protobuf.Parser;
import com.google.protobuf.ProtocolMessageEnum;
import java.util.function.Function;
/**
* Converters for user preferences data classes
*
* <p>Upstream, we use java representations of the preference classes. Internally, we store proto
* equivalents in Spanner.
*/
public final class UserPreferencesConverter {
public enum GeneralPreferencesInfoConverter
implements ProtoConverter<UserPreferences.GeneralPreferencesInfo, GeneralPreferencesInfo> {
GENERAL_PREFERENCES_INFO_CONVERTER;
@Override
public UserPreferences.GeneralPreferencesInfo toProto(GeneralPreferencesInfo info) {
UserPreferences.GeneralPreferencesInfo.Builder builder =
UserPreferences.GeneralPreferencesInfo.newBuilder();
builder = setIfNotNull(builder, builder::setChangesPerPage, info.changesPerPage);
builder = setIfNotNull(builder, builder::setDownloadScheme, info.downloadScheme);
builder =
setEnumIfNotNull(
builder,
builder::setTheme,
UserPreferences.GeneralPreferencesInfo.Theme::valueOf,
info.theme);
builder =
setEnumIfNotNull(
builder,
builder::setDateFormat,
UserPreferences.GeneralPreferencesInfo.DateFormat::valueOf,
info.dateFormat);
builder =
setEnumIfNotNull(
builder,
builder::setTimeFormat,
UserPreferences.GeneralPreferencesInfo.TimeFormat::valueOf,
info.timeFormat);
builder = setIfNotNull(builder, builder::setExpandInlineDiffs, info.expandInlineDiffs);
builder =
setIfNotNull(
builder, builder::setRelativeDateInChangeTable, info.relativeDateInChangeTable);
builder =
setEnumIfNotNull(
builder,
builder::setDiffView,
UserPreferences.GeneralPreferencesInfo.DiffView::valueOf,
info.diffView);
builder = setIfNotNull(builder, builder::setSizeBarInChangeTable, info.sizeBarInChangeTable);
builder =
setIfNotNull(builder, builder::setLegacycidInChangeTable, info.legacycidInChangeTable);
builder =
setIfNotNull(builder, builder::setMuteCommonPathPrefixes, info.muteCommonPathPrefixes);
builder = setIfNotNull(builder, builder::setSignedOffBy, info.signedOffBy);
builder =
setEnumIfNotNull(
builder,
builder::setEmailStrategy,
UserPreferences.GeneralPreferencesInfo.EmailStrategy::valueOf,
info.emailStrategy);
builder =
setEnumIfNotNull(
builder,
builder::setEmailFormat,
UserPreferences.GeneralPreferencesInfo.EmailFormat::valueOf,
info.emailFormat);
builder =
setEnumIfNotNull(
builder,
builder::setDefaultBaseForMerges,
UserPreferences.GeneralPreferencesInfo.DefaultBase::valueOf,
info.defaultBaseForMerges);
builder =
setIfNotNull(builder, builder::setPublishCommentsOnPush, info.publishCommentsOnPush);
builder =
setIfNotNull(
builder, builder::setDisableKeyboardShortcuts, info.disableKeyboardShortcuts);
builder =
setIfNotNull(
builder, builder::setDisableTokenHighlighting, info.disableTokenHighlighting);
builder =
setIfNotNull(builder, builder::setWorkInProgressByDefault, info.workInProgressByDefault);
if (info.my != null) {
builder =
builder.addAllMyMenuItems(
info.my.stream().map(i -> menuItemToProto(i)).collect(toImmutableList()));
}
if (info.changeTable != null) {
builder = builder.addAllChangeTable(info.changeTable);
}
builder =
setIfNotNull(
builder, builder::setAllowBrowserNotifications, info.allowBrowserNotifications);
builder = setIfNotNull(builder, builder::setDiffPageSidebar, info.diffPageSidebar);
return builder.build();
}
@Override
public GeneralPreferencesInfo fromProto(UserPreferences.GeneralPreferencesInfo proto) {
GeneralPreferencesInfo res = new GeneralPreferencesInfo();
res.changesPerPage = proto.hasChangesPerPage() ? proto.getChangesPerPage() : null;
res.downloadScheme = proto.hasDownloadScheme() ? proto.getDownloadScheme() : null;
res.theme =
proto.hasTheme() ? GeneralPreferencesInfo.Theme.valueOf(proto.getTheme().name()) : null;
res.dateFormat =
proto.hasDateFormat()
? GeneralPreferencesInfo.DateFormat.valueOf(proto.getDateFormat().name())
: null;
res.timeFormat =
proto.hasTimeFormat()
? GeneralPreferencesInfo.TimeFormat.valueOf(proto.getTimeFormat().name())
: null;
res.expandInlineDiffs = proto.hasExpandInlineDiffs() ? proto.getExpandInlineDiffs() : null;
res.relativeDateInChangeTable =
proto.hasRelativeDateInChangeTable() ? proto.getRelativeDateInChangeTable() : null;
res.diffView =
proto.hasDiffView()
? GeneralPreferencesInfo.DiffView.valueOf(proto.getDiffView().name())
: null;
res.sizeBarInChangeTable =
proto.hasSizeBarInChangeTable() ? proto.getSizeBarInChangeTable() : null;
res.legacycidInChangeTable =
proto.hasLegacycidInChangeTable() ? proto.getLegacycidInChangeTable() : null;
res.muteCommonPathPrefixes =
proto.hasMuteCommonPathPrefixes() ? proto.getMuteCommonPathPrefixes() : null;
res.signedOffBy = proto.hasSignedOffBy() ? proto.getSignedOffBy() : null;
res.emailStrategy =
proto.hasEmailStrategy()
? GeneralPreferencesInfo.EmailStrategy.valueOf(proto.getEmailStrategy().name())
: null;
res.emailFormat =
proto.hasEmailFormat()
? GeneralPreferencesInfo.EmailFormat.valueOf(proto.getEmailFormat().name())
: null;
res.defaultBaseForMerges =
proto.hasDefaultBaseForMerges()
? GeneralPreferencesInfo.DefaultBase.valueOf(proto.getDefaultBaseForMerges().name())
: null;
res.publishCommentsOnPush =
proto.hasPublishCommentsOnPush() ? proto.getPublishCommentsOnPush() : null;
res.disableKeyboardShortcuts =
proto.hasDisableKeyboardShortcuts() ? proto.getDisableKeyboardShortcuts() : null;
res.disableTokenHighlighting =
proto.hasDisableTokenHighlighting() ? proto.getDisableTokenHighlighting() : null;
res.workInProgressByDefault =
proto.hasWorkInProgressByDefault() ? proto.getWorkInProgressByDefault() : null;
res.my =
proto.getMyMenuItemsCount() != 0
? proto.getMyMenuItemsList().stream()
.map(p -> menuItemFromProto(p))
.collect(toImmutableList())
: null;
res.changeTable = proto.getChangeTableCount() != 0 ? proto.getChangeTableList() : null;
res.allowBrowserNotifications =
proto.hasAllowBrowserNotifications() ? proto.getAllowBrowserNotifications() : null;
res.diffPageSidebar = proto.hasDiffPageSidebar() ? proto.getDiffPageSidebar() : null;
return res;
}
@Override
public Parser<UserPreferences.GeneralPreferencesInfo> getParser() {
return UserPreferences.GeneralPreferencesInfo.parser();
}
private static UserPreferences.GeneralPreferencesInfo.MenuItem menuItemToProto(
MenuItem javaItem) {
UserPreferences.GeneralPreferencesInfo.MenuItem.Builder builder =
UserPreferences.GeneralPreferencesInfo.MenuItem.newBuilder();
builder = setIfNotNull(builder, builder::setName, trimSafe(javaItem.name));
builder = setIfNotNull(builder, builder::setUrl, trimSafe(javaItem.url));
builder = setIfNotNull(builder, builder::setTarget, trimSafe(javaItem.target));
builder = setIfNotNull(builder, builder::setId, trimSafe(javaItem.id));
return builder.build();
}
private static @Nullable String trimSafe(@Nullable String s) {
return s == null ? s : s.trim();
}
private static MenuItem menuItemFromProto(
UserPreferences.GeneralPreferencesInfo.MenuItem proto) {
return new MenuItem(
proto.hasName() ? proto.getName().trim() : null,
proto.hasUrl() ? proto.getUrl().trim() : null,
proto.hasTarget() ? proto.getTarget().trim() : null,
proto.hasId() ? proto.getId().trim() : null);
}
}
public enum DiffPreferencesInfoConverter
implements ProtoConverter<UserPreferences.DiffPreferencesInfo, DiffPreferencesInfo> {
DIFF_PREFERENCES_INFO_CONVERTER;
@Override
public UserPreferences.DiffPreferencesInfo toProto(DiffPreferencesInfo info) {
UserPreferences.DiffPreferencesInfo.Builder builder =
UserPreferences.DiffPreferencesInfo.newBuilder();
builder = setIfNotNull(builder, builder::setContext, info.context);
builder = setIfNotNull(builder, builder::setTabSize, info.tabSize);
builder = setIfNotNull(builder, builder::setFontSize, info.fontSize);
builder = setIfNotNull(builder, builder::setLineLength, info.lineLength);
builder = setIfNotNull(builder, builder::setCursorBlinkRate, info.cursorBlinkRate);
builder = setIfNotNull(builder, builder::setExpandAllComments, info.expandAllComments);
builder = setIfNotNull(builder, builder::setIntralineDifference, info.intralineDifference);
builder = setIfNotNull(builder, builder::setManualReview, info.manualReview);
builder = setIfNotNull(builder, builder::setShowLineEndings, info.showLineEndings);
builder = setIfNotNull(builder, builder::setShowTabs, info.showTabs);
builder = setIfNotNull(builder, builder::setShowWhitespaceErrors, info.showWhitespaceErrors);
builder = setIfNotNull(builder, builder::setSyntaxHighlighting, info.syntaxHighlighting);
builder = setIfNotNull(builder, builder::setHideTopMenu, info.hideTopMenu);
builder =
setIfNotNull(builder, builder::setAutoHideDiffTableHeader, info.autoHideDiffTableHeader);
builder = setIfNotNull(builder, builder::setHideLineNumbers, info.hideLineNumbers);
builder = setIfNotNull(builder, builder::setRenderEntireFile, info.renderEntireFile);
builder = setIfNotNull(builder, builder::setHideEmptyPane, info.hideEmptyPane);
builder = setIfNotNull(builder, builder::setMatchBrackets, info.matchBrackets);
builder = setIfNotNull(builder, builder::setLineWrapping, info.lineWrapping);
builder =
setEnumIfNotNull(
builder,
builder::setIgnoreWhitespace,
UserPreferences.DiffPreferencesInfo.Whitespace::valueOf,
info.ignoreWhitespace);
builder = setIfNotNull(builder, builder::setRetainHeader, info.retainHeader);
builder = setIfNotNull(builder, builder::setSkipDeleted, info.skipDeleted);
builder = setIfNotNull(builder, builder::setSkipUnchanged, info.skipUnchanged);
builder = setIfNotNull(builder, builder::setSkipUncommented, info.skipUncommented);
return builder.build();
}
@Override
public DiffPreferencesInfo fromProto(UserPreferences.DiffPreferencesInfo proto) {
DiffPreferencesInfo res = new DiffPreferencesInfo();
res.context = proto.hasContext() ? proto.getContext() : null;
res.tabSize = proto.hasTabSize() ? proto.getTabSize() : null;
res.fontSize = proto.hasFontSize() ? proto.getFontSize() : null;
res.lineLength = proto.hasLineLength() ? proto.getLineLength() : null;
res.cursorBlinkRate = proto.hasCursorBlinkRate() ? proto.getCursorBlinkRate() : null;
res.expandAllComments = proto.hasExpandAllComments() ? proto.getExpandAllComments() : null;
res.intralineDifference =
proto.hasIntralineDifference() ? proto.getIntralineDifference() : null;
res.manualReview = proto.hasManualReview() ? proto.getManualReview() : null;
res.showLineEndings = proto.hasShowLineEndings() ? proto.getShowLineEndings() : null;
res.showTabs = proto.hasShowTabs() ? proto.getShowTabs() : null;
res.showWhitespaceErrors =
proto.hasShowWhitespaceErrors() ? proto.getShowWhitespaceErrors() : null;
res.syntaxHighlighting = proto.hasSyntaxHighlighting() ? proto.getSyntaxHighlighting() : null;
res.hideTopMenu = proto.hasHideTopMenu() ? proto.getHideTopMenu() : null;
res.autoHideDiffTableHeader =
proto.hasAutoHideDiffTableHeader() ? proto.getAutoHideDiffTableHeader() : null;
res.hideLineNumbers = proto.hasHideLineNumbers() ? proto.getHideLineNumbers() : null;
res.renderEntireFile = proto.hasRenderEntireFile() ? proto.getRenderEntireFile() : null;
res.hideEmptyPane = proto.hasHideEmptyPane() ? proto.getHideEmptyPane() : null;
res.matchBrackets = proto.hasMatchBrackets() ? proto.getMatchBrackets() : null;
res.lineWrapping = proto.hasLineWrapping() ? proto.getLineWrapping() : null;
res.ignoreWhitespace =
proto.hasIgnoreWhitespace()
? DiffPreferencesInfo.Whitespace.valueOf(proto.getIgnoreWhitespace().name())
: null;
res.retainHeader = proto.hasRetainHeader() ? proto.getRetainHeader() : null;
res.skipDeleted = proto.hasSkipDeleted() ? proto.getSkipDeleted() : null;
res.skipUnchanged = proto.hasSkipUnchanged() ? proto.getSkipUnchanged() : null;
res.skipUncommented = proto.hasSkipUncommented() ? proto.getSkipUncommented() : null;
return res;
}
@Override
public Parser<UserPreferences.DiffPreferencesInfo> getParser() {
return UserPreferences.DiffPreferencesInfo.parser();
}
}
public enum EditPreferencesInfoConverter
implements ProtoConverter<UserPreferences.EditPreferencesInfo, EditPreferencesInfo> {
EDIT_PREFERENCES_INFO_CONVERTER;
@Override
public UserPreferences.EditPreferencesInfo toProto(EditPreferencesInfo info) {
UserPreferences.EditPreferencesInfo.Builder builder =
UserPreferences.EditPreferencesInfo.newBuilder();
builder = setIfNotNull(builder, builder::setTabSize, info.tabSize);
builder = setIfNotNull(builder, builder::setLineLength, info.lineLength);
builder = setIfNotNull(builder, builder::setIndentUnit, info.indentUnit);
builder = setIfNotNull(builder, builder::setCursorBlinkRate, info.cursorBlinkRate);
builder = setIfNotNull(builder, builder::setHideTopMenu, info.hideTopMenu);
builder = setIfNotNull(builder, builder::setShowTabs, info.showTabs);
builder = setIfNotNull(builder, builder::setShowWhitespaceErrors, info.showWhitespaceErrors);
builder = setIfNotNull(builder, builder::setSyntaxHighlighting, info.syntaxHighlighting);
builder = setIfNotNull(builder, builder::setHideLineNumbers, info.hideLineNumbers);
builder = setIfNotNull(builder, builder::setMatchBrackets, info.matchBrackets);
builder = setIfNotNull(builder, builder::setLineWrapping, info.lineWrapping);
builder = setIfNotNull(builder, builder::setIndentWithTabs, info.indentWithTabs);
builder = setIfNotNull(builder, builder::setAutoCloseBrackets, info.autoCloseBrackets);
builder = setIfNotNull(builder, builder::setShowBase, info.showBase);
return builder.build();
}
@Override
public EditPreferencesInfo fromProto(UserPreferences.EditPreferencesInfo proto) {
EditPreferencesInfo res = new EditPreferencesInfo();
res.tabSize = proto.hasTabSize() ? proto.getTabSize() : null;
res.lineLength = proto.hasLineLength() ? proto.getLineLength() : null;
res.indentUnit = proto.hasIndentUnit() ? proto.getIndentUnit() : null;
res.cursorBlinkRate = proto.hasCursorBlinkRate() ? proto.getCursorBlinkRate() : null;
res.hideTopMenu = proto.hasHideTopMenu() ? proto.getHideTopMenu() : null;
res.showTabs = proto.hasShowTabs() ? proto.getShowTabs() : null;
res.showWhitespaceErrors =
proto.hasShowWhitespaceErrors() ? proto.getShowWhitespaceErrors() : null;
res.syntaxHighlighting = proto.hasSyntaxHighlighting() ? proto.getSyntaxHighlighting() : null;
res.hideLineNumbers = proto.hasHideLineNumbers() ? proto.getHideLineNumbers() : null;
res.matchBrackets = proto.hasMatchBrackets() ? proto.getMatchBrackets() : null;
res.lineWrapping = proto.hasLineWrapping() ? proto.getLineWrapping() : null;
res.indentWithTabs = proto.hasIndentWithTabs() ? proto.getIndentWithTabs() : null;
res.autoCloseBrackets = proto.hasAutoCloseBrackets() ? proto.getAutoCloseBrackets() : null;
res.showBase = proto.hasShowBase() ? proto.getShowBase() : null;
return res;
}
@Override
public Parser<UserPreferences.EditPreferencesInfo> getParser() {
return UserPreferences.EditPreferencesInfo.parser();
}
}
private static <ValueT, BuilderT extends Message.Builder> BuilderT setIfNotNull(
BuilderT builder, Function<ValueT, BuilderT> protoFieldSetterFn, ValueT javaField) {
if (javaField != null) {
return protoFieldSetterFn.apply(javaField);
}
return builder;
}
private static <
JavaEnumT extends Enum<?>,
ProtoEnumT extends ProtocolMessageEnum,
BuilderT extends Message.Builder>
BuilderT setEnumIfNotNull(
BuilderT builder,
Function<ProtoEnumT, BuilderT> protoFieldSetterFn,
Function<String, ProtoEnumT> protoEnumFromNameFn,
JavaEnumT javaEnum) {
if (javaEnum != null) {
return protoFieldSetterFn.apply(protoEnumFromNameFn.apply(javaEnum.name()));
}
return builder;
}
private UserPreferencesConverter() {}
}