/*
 * Copyright 2015 Open Networking Laboratory
 *
 * 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 org.onosproject.store.service;

import org.onosproject.core.ApplicationId;

/**
 * Builder for distributed set.
 *
 * @param <E> type set elements.
 */
public interface DistributedSetBuilder<E> {

    /**
     * Sets the name of the set.
     * <p>
     * Each set is identified by a unique name.
     * </p>
     * <p>
     * Note: This is a mandatory parameter.
     * </p>
     *
     * @param name name of the set
     * @return this DistributedSetBuilder
     */
    DistributedSetBuilder<E> withName(String name);

    /**
     * Sets the owner applicationId for the set.
     * <p>
     * Note: If {@code purgeOnUninstall} option is enabled, applicationId
     * must be specified.
     * </p>
     *
     * @param id applicationId owning the set
     * @return this DistributedSetBuilder
     */
    DistributedSetBuilder<E> withApplicationId(ApplicationId id);

    /**
     * Sets a serializer that can be used to serialize
     * the elements add to the set. The serializer
     * builder should be pre-populated with any classes that will be
     * put into the set.
     * <p>
     * Note: This is a mandatory parameter.
     * </p>
     *
     * @param serializer serializer
     * @return this DistributedSetBuilder
     */
    DistributedSetBuilder<E> withSerializer(Serializer serializer);

    /**
     * Disables set updates.
     * <p>
     * Attempt to update the built set will throw {@code UnsupportedOperationException}.
     *
     * @return this DistributedSetBuilder
     */
    DistributedSetBuilder<E> withUpdatesDisabled();

    /**
     * Disables distribution of set entries across multiple database partitions.
     * <p>
     * When partitioning is disabled, the returned set will have a single partition
     * that spans the entire cluster. Furthermore, the changes made to the set are
     * ephemeral and do not survive a full cluster restart.
     * </p>
     * <p>
     * Disabling partitions is more appropriate when the returned set is used for
     * simple coordination activities and not for long term data persistence.
     * </p>
     * <p>
     * Note: By default partitions are enabled and entries in the set are durable.
     * </p>
     * @return this DistributedSetBuilder
     */
    DistributedSetBuilder<E> withPartitionsDisabled();

    /**
     * Purges set contents when the application owning the set is uninstalled.
     * <p>
     * When this option is enabled, the caller must provide a applicationId via
     * the {@code withAppliationId} builder method.
     * <p>
     * By default set contents will NOT be purged when owning application is uninstalled.
     *
     * @return this DistributedSetBuilder
     */
    DistributedSetBuilder<E> withPurgeOnUninstall();

    /**
     * Builds an set based on the configuration options
     * supplied to this builder.
     *
     * @return new set
     * @throws java.lang.RuntimeException if a mandatory parameter is missing
     */
    DistributedSet<E> build();
}
