Move {Journal,ByteBuf}Reader.firstIndex()
[controller.git] / atomix-storage / src / main / java / io / atomix / storage / journal / SegmentedJournalReader.java
1 /*
2  * Copyright 2017-2022 Open Networking Foundation and others.  All rights reserved.
3  * Copyright (c) 2024 PANTHEON.tech, s.r.o. and others.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 package io.atomix.storage.journal;
18
19 import static java.util.Objects.requireNonNull;
20
21 import org.eclipse.jdt.annotation.NonNullByDefault;
22 import org.eclipse.jdt.annotation.Nullable;
23
24 /**
25  * A {@link JournalReader} backed by a {@link ByteBufReader}.
26  */
27 @NonNullByDefault
28 final class SegmentedJournalReader<E> implements JournalReader<E> {
29     private final ByteBufMapper<E> mapper;
30     private final ByteBufReader reader;
31
32     SegmentedJournalReader(final ByteBufReader reader, final ByteBufMapper<E> mapper) {
33         this.reader = requireNonNull(reader);
34         this.mapper = requireNonNull(mapper);
35     }
36
37     @Override
38     public long getNextIndex() {
39         return reader.nextIndex();
40     }
41
42     @Override
43     public void reset() {
44         reader.reset();
45     }
46
47     @Override
48     public void reset(final long index) {
49         reader.reset(index);
50     }
51
52     @Override
53     public <T> @Nullable T tryNext(final EntryMapper<E, T> entryMapper) {
54         return reader.tryNext((index, buf) -> {
55             final var size = buf.readableBytes();
56             return requireNonNull(entryMapper.mapEntry(index, mapper.bytesToObject(index, buf), size));
57         });
58     }
59
60     @Override
61     public void close() {
62         reader.close();
63     }
64 }