| // Copyright (C) 2020 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.comment; | |
| import com.google.auto.value.AutoValue; | |
| import com.google.gerrit.entities.Change; | |
| import com.google.gerrit.entities.Project; | |
| import com.google.gerrit.proto.Protos; | |
| import com.google.gerrit.server.cache.proto.Cache; | |
| import com.google.gerrit.server.cache.serialize.CacheSerializer; | |
| /** | |
| * An identifier of a comment that should be used to load the comment context using {@link | |
| * CommentContextCache#get(CommentContextKey)}, or {@link CommentContextCache#getAll(Iterable)}. | |
| * | |
| * <p>The {@link CommentContextCacheImpl} implementation uses this class as the cache key, while | |
| * replacing the {@link #path()} field with the hashed path. | |
| */ | |
| @AutoValue | |
| public abstract class CommentContextKey { | |
| abstract Project.NameKey project(); | |
| abstract Change.Id changeId(); | |
| /** The unique comment ID. */ | |
| abstract String id(); | |
| /** File path at which the comment was written. */ | |
| abstract String path(); | |
| abstract Integer patchset(); | |
| /** Number of extra lines of context that should be added before and after the comment range. */ | |
| abstract int contextPadding(); | |
| abstract Builder toBuilder(); | |
| public static Builder builder() { | |
| return new AutoValue_CommentContextKey.Builder(); | |
| } | |
| @AutoValue.Builder | |
| public abstract static class Builder { | |
| public abstract Builder project(Project.NameKey nameKey); | |
| public abstract Builder changeId(Change.Id changeId); | |
| public abstract Builder id(String id); | |
| public abstract Builder path(String path); | |
| public abstract Builder patchset(Integer patchset); | |
| public abstract Builder contextPadding(Integer numLines); | |
| public abstract CommentContextKey build(); | |
| } | |
| public enum Serializer implements CacheSerializer<CommentContextKey> { | |
| INSTANCE; | |
| @Override | |
| public byte[] serialize(CommentContextKey key) { | |
| return Protos.toByteArray( | |
| Cache.CommentContextKeyProto.newBuilder() | |
| .setProject(key.project().get()) | |
| .setChangeId(key.changeId().toString()) | |
| .setPatchset(key.patchset()) | |
| .setPathHash(key.path()) | |
| .setCommentId(key.id()) | |
| .setContextPadding(key.contextPadding()) | |
| .build()); | |
| } | |
| @Override | |
| public CommentContextKey deserialize(byte[] in) { | |
| Cache.CommentContextKeyProto proto = | |
| Protos.parseUnchecked(Cache.CommentContextKeyProto.parser(), in); | |
| return CommentContextKey.builder() | |
| .project(Project.NameKey.parse(proto.getProject())) | |
| .changeId(Change.Id.tryParse(proto.getChangeId()).get()) | |
| .patchset(proto.getPatchset()) | |
| .id(proto.getCommentId()) | |
| .path(proto.getPathHash()) | |
| .contextPadding(proto.getContextPadding()) | |
| .build(); | |
| } | |
| } | |
| } |