/* * 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.hadoop.metrics2.lib; import java.util.Map; import com.google.common.base.Joiner; import com.google.common.collect.Maps; import org.apache.hadoop.classification.InterfaceAudience; /** * Generates predictable and user-friendly unique names */ @InterfaceAudience.Private public class UniqueNames { static class Count { final String baseName; int value; Count(String name, int value) { baseName = name; this.value = value; } } static final Joiner joiner = Joiner.on('-'); final Map<String, Count> map = Maps.newHashMap(); public synchronized String uniqueName(String name) { Count c = map.get(name); if (c == null) { c = new Count(name, 0); map.put(name, c); return name; } if (!c.baseName.equals(name)) c = new Count(name, 0); do { String newName = joiner.join(name, ++c.value); Count c2 = map.get(newName); if (c2 == null) { map.put(newName, c); return newName; } // handle collisons, assume to be rare cases, // eg: people explicitly passed in name-\d+ names. } while (true); } }