com.ibm.og.test.SimpleRequestManager.java Source code

Java tutorial

Introduction

Here is the source code for com.ibm.og.test.SimpleRequestManager.java

Source

/* Copyright (c) IBM Corporation 2016. All Rights Reserved.
 * Project name: Object Generator
 * This project is licensed under the Apache License 2.0, see LICENSE.
 */

package com.ibm.og.test;

import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;

import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ibm.og.api.Request;
import com.ibm.og.supplier.RandomSupplier;
import com.ibm.og.supplier.Suppliers;
import com.google.common.base.Supplier;
import com.google.common.collect.Range;
import com.google.common.math.DoubleMath;

/**
 * A request manager which provides basic write/read/delete capability
 * 
 * @since 1.0
 */
public class SimpleRequestManager implements RequestManager {
    private static final Logger _logger = LoggerFactory.getLogger(SimpleRequestManager.class);
    private static final Range<Double> PERCENTAGE = Range.closed(0.0, 100.0);
    private static final double ERR = Math.pow(0.1, 6);
    private final Supplier<Supplier<Request>> requestSupplier;

    /**
     * Creates an instance. This manager determines which type of request to generate based on the
     * provided weights for each request type.
     * 
     * @param write a supplier of write requests
     * @param writeWeight percentage of the time that a write request should be generated
     * @param read a supplier of read requests
     * @param readWeight percentage of the time that a read request should be generated
     * @param delete a supplier of delete requests
     * @param deleteWeight percentage of the time that a delete request should be generated
     * @param metadata a supplier of metadata (HEAD) requests
     * @param metadataWeight percentage of the time that a metadata (HEAD) request should be generated
     * @throws NullPointerException if write, read, or delete are null
     * @throws IllegalArgumentException if writeWeight, readWeight, or deleteWeight are not in the
     *         range [0.0, 100.0], or if the sum of the individual weights is not 100.0
     */
    @Inject
    @Singleton
    public SimpleRequestManager(@Named("write") final Supplier<Request> write,
            @Named("write.weight") final double writeWeight, @Named("overwrite") final Supplier<Request> overwrite,
            @Named("overwrite.weight") final double overwriteWeight, @Named("read.weight") final double readWeight,
            @Named("read") final Supplier<Request> read, @Named("metadata") final Supplier<Request> metadata,
            @Named("metadata.weight") final double metadataWeight, @Named("delete") final Supplier<Request> delete,
            @Named("delete.weight") final double deleteWeight, @Named("list") final Supplier<Request> list,
            @Named("list.weight") final double listWeight,
            @Named("containerList") final Supplier<Request> containerList,
            @Named("containerList.weight") final double containerListWeight,
            @Named("containerCreate") final Supplier<Request> containerCreate,
            @Named("containerCreate.weight") final double containerCreateWeight,
            @Named("multipartWrite") final Supplier<Request> writeMultipart,
            @Named("multipartWrite.weight") final double writeMultipartWeight) {

        checkNotNull(write);
        checkNotNull(overwrite);
        checkNotNull(read);
        checkNotNull(metadata);
        checkNotNull(delete);
        checkNotNull(list);
        checkNotNull(containerList);
        checkNotNull(containerCreate);
        checkNotNull(writeMultipart);

        checkArgument(PERCENTAGE.contains(writeWeight), "write weight must be in range [0.0, 100.0] [%s]",
                writeWeight);
        checkArgument(PERCENTAGE.contains(overwriteWeight), "overwrite weight must be in range [0.0, 100.0] [%s]",
                overwriteWeight);
        checkArgument(PERCENTAGE.contains(readWeight), "read weight must be in range [0.0, 100.0] [%s]",
                readWeight);
        checkArgument(PERCENTAGE.contains(metadataWeight), "delete weight must be in range [0.0, 100.0] [%s]",
                metadataWeight);
        checkArgument(PERCENTAGE.contains(deleteWeight), "delete weight must be in range [0.0, 100.0] [%s]",
                deleteWeight);
        checkArgument(PERCENTAGE.contains(listWeight), "list weight must be in range [0.0, 100.0] [%s]",
                listWeight);
        checkArgument(PERCENTAGE.contains(containerListWeight),
                "containerList weight must be in range [0.0, 100.0] [%s]", containerListWeight);
        checkArgument(PERCENTAGE.contains(containerCreateWeight),
                "containerCreate weight must be in range [0.0, 100.0] [%s]", containerCreateWeight);
        checkArgument(PERCENTAGE.contains(writeMultipartWeight),
                "writeMultipart weight must be in range [0.0, 100.0] [%s]", writeMultipartWeight);
        final double sum = writeWeight + readWeight + deleteWeight + metadataWeight + overwriteWeight + listWeight
                + containerListWeight + containerCreateWeight + writeMultipartWeight;
        checkArgument(DoubleMath.fuzzyEquals(sum, 100.0, ERR), "sum of weights must be 100.0 [%s]", sum);

        final RandomSupplier.Builder<Supplier<Request>> wrc = Suppliers.random();
        if (writeWeight > 0.0) {
            wrc.withChoice(write, writeWeight);
        }
        if (overwriteWeight > 0.0) {
            wrc.withChoice(overwrite, overwriteWeight);
        }
        if (readWeight > 0.0) {
            wrc.withChoice(read, readWeight);
        }
        if (metadataWeight > 0.0) {
            wrc.withChoice(metadata, metadataWeight);
        }
        if (deleteWeight > 0.0) {
            wrc.withChoice(delete, deleteWeight);
        }
        if (listWeight > 0.0) {
            wrc.withChoice(list, listWeight);
        }
        if (containerListWeight > 0.0) {
            wrc.withChoice(containerList, containerListWeight);
        }
        if (containerCreateWeight > 0.0) {
            wrc.withChoice(containerCreate, containerCreateWeight);
        }
        if (writeMultipartWeight > 0.0) {
            wrc.withChoice(writeMultipart, writeMultipartWeight);
        }
        this.requestSupplier = wrc.build();
    }

    @Override
    public Request get() {
        final Request request = this.requestSupplier.get().get();
        return request;
    }

    @Override
    public String toString() {
        return String.format("SimpleRequestManager [%n" + "requestSupplier=%s%n" + "]", this.requestSupplier);
    }
}