blob: 81c787893e67ac57dbf6aa2ead0beebeef03993f [file] [log] [blame]
/*
* Copyright (C) 2024 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.entities.converter;
import com.google.errorprone.annotations.Immutable;
import com.google.gerrit.extensions.api.accounts.AccountInput;
import com.google.gerrit.extensions.api.changes.ApplyPatchInput;
import com.google.gerrit.extensions.api.changes.NotifyHandling;
import com.google.gerrit.extensions.api.changes.NotifyInfo;
import com.google.gerrit.extensions.api.changes.RecipientType;
import com.google.gerrit.extensions.client.ChangeStatus;
import com.google.gerrit.extensions.client.ListChangesOption;
import com.google.gerrit.extensions.common.ChangeInput;
import com.google.gerrit.extensions.common.MergeInput;
import com.google.gerrit.proto.Entities;
import com.google.protobuf.Parser;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Proto converter between {@link ChangeInput} and {@link
* com.google.gerrit.proto.Entities.ChangeInput}.
*/
@Immutable
public enum ChangeInputProtoConverter implements ProtoConverter<Entities.ChangeInput, ChangeInput> {
INSTANCE;
private final ProtoConverter<Entities.MergeInput, MergeInput> mergeInputConverter =
MergeInputProtoConverter.INSTANCE;
private final ProtoConverter<Entities.ApplyPatchInput, ApplyPatchInput> applyPatchInputConverter =
ApplyPatchInputProtoConverter.INSTANCE;
private final ProtoConverter<Entities.AccountInput, AccountInput> accountInputConverter =
AccountInputProtoConverter.INSTANCE;
private final ProtoConverter<Entities.NotifyInfo, NotifyInfo> notifyInfoConverter =
NotifyInfoProtoConverter.INSTANCE;
@Override
public Entities.ChangeInput toProto(ChangeInput changeInput) {
Entities.ChangeInput.Builder builder = Entities.ChangeInput.newBuilder();
if (changeInput.project != null) {
builder.setProject(changeInput.project);
}
if (changeInput.branch != null) {
builder.setBranch(changeInput.branch);
}
if (changeInput.subject != null) {
builder.setSubject(changeInput.subject);
}
if (changeInput.topic != null) {
builder.setTopic(changeInput.topic);
}
if (changeInput.status != null) {
builder.setStatus(Entities.ChangeStatus.forNumber(changeInput.status.getValue()));
}
if (changeInput.isPrivate != null) {
builder.setIsPrivate(changeInput.isPrivate);
}
if (changeInput.workInProgress != null) {
builder.setWorkInProgress(changeInput.workInProgress);
}
if (changeInput.baseChange != null) {
builder.setBaseChange(changeInput.baseChange);
}
if (changeInput.baseCommit != null) {
builder.setBaseCommit(changeInput.baseCommit);
}
if (changeInput.newBranch != null) {
builder.setNewBranch(changeInput.newBranch);
}
if (changeInput.validationOptions != null) {
builder.putAllValidationOptions(changeInput.validationOptions);
}
if (changeInput.customKeyedValues != null) {
builder.putAllCustomKeyedValues(changeInput.customKeyedValues);
}
if (changeInput.merge != null) {
builder.setMerge(mergeInputConverter.toProto(changeInput.merge));
}
if (changeInput.patch != null) {
builder.setPatch(applyPatchInputConverter.toProto(changeInput.patch));
}
if (changeInput.author != null) {
builder.setAuthor(accountInputConverter.toProto(changeInput.author));
}
builder.setNotify(Entities.NotifyHandling.forNumber(changeInput.notify.getValue()));
List<ListChangesOption> responseFormatOptions = changeInput.responseFormatOptions;
if (responseFormatOptions != null) {
for (ListChangesOption option : responseFormatOptions) {
builder.addResponseFormatOptions(Entities.ListChangesOption.forNumber(option.getValue()));
}
}
if (changeInput.notifyDetails != null) {
Map<RecipientType, NotifyInfo> notifyDetails = changeInput.notifyDetails;
for (Map.Entry<RecipientType, NotifyInfo> entry : notifyDetails.entrySet()) {
Entities.RecipientType recipientType =
Entities.RecipientType.forNumber(entry.getKey().getValue());
builder.putNotifyDetails(
recipientType.name(), notifyInfoConverter.toProto(entry.getValue()));
}
}
return builder.build();
}
@Override
public ChangeInput fromProto(Entities.ChangeInput proto) {
ChangeInput changeInput =
new ChangeInput(proto.getProject(), proto.getBranch(), proto.getSubject());
if (proto.hasTopic()) {
changeInput.topic = proto.getTopic();
}
if (proto.hasStatus()) {
changeInput.status = ChangeStatus.valueOf(proto.getStatus().name());
}
if (proto.hasIsPrivate()) {
changeInput.isPrivate = proto.getIsPrivate();
}
if (proto.hasWorkInProgress()) {
changeInput.workInProgress = proto.getWorkInProgress();
}
if (proto.hasBaseChange()) {
changeInput.baseChange = proto.getBaseChange();
}
if (proto.hasBaseCommit()) {
changeInput.baseCommit = proto.getBaseCommit();
}
if (proto.hasNewBranch()) {
changeInput.newBranch = proto.getNewBranch();
}
if (proto.getValidationOptionsCount() > 0) {
changeInput.validationOptions = proto.getValidationOptionsMap();
}
if (proto.getCustomKeyedValuesCount() > 0) {
changeInput.customKeyedValues = proto.getCustomKeyedValuesMap();
}
if (proto.hasMerge()) {
changeInput.merge = mergeInputConverter.fromProto(proto.getMerge());
}
if (proto.hasPatch()) {
changeInput.patch = applyPatchInputConverter.fromProto(proto.getPatch());
}
if (proto.hasAuthor()) {
changeInput.author = accountInputConverter.fromProto(proto.getAuthor());
}
if (proto.getResponseFormatOptionsCount() > 0) {
changeInput.responseFormatOptions = new ArrayList<ListChangesOption>();
for (Entities.ListChangesOption option : proto.getResponseFormatOptionsList()) {
changeInput.responseFormatOptions.add(ListChangesOption.valueOf(option.name()));
}
}
changeInput.notify = NotifyHandling.valueOf(proto.getNotify().name());
if (proto.getNotifyDetailsCount() > 0) {
changeInput.notifyDetails = new HashMap<RecipientType, NotifyInfo>();
for (Map.Entry<String, Entities.NotifyInfo> entry : proto.getNotifyDetailsMap().entrySet()) {
changeInput.notifyDetails.put(
RecipientType.valueOf(entry.getKey()), notifyInfoConverter.fromProto(entry.getValue()));
}
}
return changeInput;
}
@Override
public Parser<Entities.ChangeInput> getParser() {
return Entities.ChangeInput.parser();
}
}