// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.debug.core.util; /** * A utility class that is used to generate a unique key according to a proposed key and * taking alternative keys if that one is already taken. */ public class UniqueKeyGenerator { /** * A general purpose algorithm that creates a unique key in an abstract storage and returns * a corresponding element (of type E). It simply tries various keys that start with proposed * string until succeeds or gives up. */ public static <E> E createUniqueKey(String proposedKey, int tryLimit, Factory<E> factory) { String nextKey = proposedKey; for (int i = 1; i < tryLimit; ++i) { E element = factory.tryCreate(nextKey); if (element != null) { return element; } nextKey = proposedKey + " (" + i + ')'; //$NON-NLS-1$ } throw new RuntimeException("Failed to find a unique key"); } /** * A factory for an abstract storage used in {@link #createElementWithUniqueName} method. */ public interface Factory<E> { /** * @return created element or null if element with such name cannot be created */ E tryCreate(String name); } }