All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hazelcast.internal.partition.ChunkSuppliers Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2008-2024, Hazelcast, Inc. All Rights Reserved.
 *
 * 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.hazelcast.internal.partition;

import com.hazelcast.internal.nio.BufferObjectDataOutput;
import com.hazelcast.internal.util.CollectionUtil;
import com.hazelcast.spi.impl.operationservice.Operation;

import javax.annotation.Nullable;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.function.Predicate;
import java.util.function.Supplier;

import static com.hazelcast.internal.util.Preconditions.checkNoNullInside;
import static com.hazelcast.internal.util.Preconditions.checkTrue;
import static com.hazelcast.internal.util.Preconditions.isNotNull;

/**
 * Helper methods to create various {@link ChunkSupplier} objects
 */
public final class ChunkSuppliers {

    private ChunkSuppliers() {
    }

    /**
     * Intended use cases:
     * 
    *
  • When migration data fits in one single chunk
  • *
  • When a service doesn't support data migration in chunks
  • *
*/ public static ChunkSupplier newSingleChunkSupplier(Supplier operationSupplier) { isNotNull(operationSupplier, "operationSupplier"); return new SingleChunkSupplier(operationSupplier); } private static final class SingleChunkSupplier implements ChunkSupplier { private final Supplier operationSupplier; private boolean hasMoreChunks = true; private SingleChunkSupplier(Supplier operationSupplier) { this.operationSupplier = operationSupplier; } /** * One usage of this method is by legacy migration * operations which don't support chunked migrations. * Since those migration operations can return null, their * operationSupplier function can also return null. * * @return null or migration operation. */ @Nullable @Override public Operation next() { if (!hasMoreChunks) { throw new NoSuchElementException(); } Operation operation = operationSupplier.get(); hasMoreChunks = false; return operation; } @Override public boolean hasNext() { return hasMoreChunks; } @Override public String toString() { return "SingleChunkSupplier{" + "operationSupplier=" + operationSupplier + ", hasMoreChunks=" + hasMoreChunks + '}'; } } /** * @param chain chain of {@link ChunkSupplier} * @return wrapper {@link ChunkSupplier} */ public static ChunkSupplier newChainedChunkSupplier(List chain) { isNotNull(chain, "chain"); checkTrue(CollectionUtil.isNotEmpty(chain), "chain cannot be an empty list"); checkNoNullInside(chain, "chain cannot have null value inside"); return new ChainedChunkSupplier(chain); } private static final class ChainedChunkSupplier implements ChunkSupplier { private final List chain; private ChainedChunkSupplier(List chain) { this.chain = chain; } @Override public void signalEndOfChunkWith(Predicate isEndOfChunk) { for (int i = 0; i < chain.size(); i++) { chain.get(i).signalEndOfChunkWith(isEndOfChunk); } } @Override public boolean hasNext() { for (int i = 0; i < chain.size(); i++) { if (chain.get(i).hasNext()) { return true; } } return false; } @Nullable @Override public Operation next() { for (int i = 0; i < chain.size(); i++) { ChunkSupplier chunkSupplier = chain.get(i); if (chunkSupplier.hasNext()) { return chunkSupplier.next(); } } throw new NoSuchElementException(); } @Override public String toString() { return "ChunkSupplierChain{" + "length=" + chain.size() + ", chain=" + chain + '}'; } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy