/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.apache.pulsar.compaction;

import java.util.concurrent.CompletableFuture;
import javax.annotation.Nonnull;
import org.apache.pulsar.broker.PulsarService;
import org.apache.pulsar.common.classification.InterfaceAudience;
import org.apache.pulsar.common.classification.InterfaceStability;

@InterfaceAudience.Public
@InterfaceStability.Evolving
public interface CompactionServiceFactory extends AutoCloseable {

    /**
     * Initialize the compaction service factory.
     *
     * @param pulsarService
     *            the pulsar service instance
     * @return a future represents the initialization result
     */
    CompletableFuture<Void> initialize(@Nonnull PulsarService pulsarService);

    /**
     * Create a new topic compaction service for topic.
     *
     * @param topic
     *            the topic name
     * @return a future represents the topic compaction service
     */
    CompletableFuture<TopicCompactionService> newTopicCompactionService(@Nonnull String topic);
}
