/**
 * 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 com.twitter.distributedlog.service.streamset;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

/**
 * A stream-to-partition converter that caches the mapping between stream and partitions.
 */
public abstract class CacheableStreamPartitionConverter implements StreamPartitionConverter {

    private final ConcurrentMap<String, Partition> partitions;

    protected CacheableStreamPartitionConverter() {
        this.partitions = new ConcurrentHashMap<String, Partition>();
    }

    @Override
    public Partition convert(String streamName) {
        Partition p = partitions.get(streamName);
        if (null != p) {
            return p;
        }
        // not found
        Partition newPartition = newPartition(streamName);
        Partition oldPartition = partitions.putIfAbsent(streamName, newPartition);
        if (null == oldPartition) {
            return newPartition;
        } else {
            return oldPartition;
        }
    }

    /**
     * Create the partition from <code>streamName</code>.
     *
     * @param streamName
     *          stream name
     * @return partition id of the stream
     */
    protected abstract Partition newPartition(String streamName);
}
